improved request caching, new C4 statics, landing page carousel,

This commit is contained in:
exodus4d
2015-07-06 20:39:36 +02:00
parent d223ac6555
commit 075d2330bd
34 changed files with 1333 additions and 1062 deletions

View File

@@ -2,6 +2,7 @@
<dictionary name="exodus4d">
<words>
<w>addclass</w>
<w>blueimp</w>
<w>bootbox</w>
<w>cacheable</w>
<w>contextmenu</w>
@@ -25,6 +26,7 @@
<w>minify</w>
<w>mouseover</w>
<w>navbar</w>
<w>neocom</w>
<w>nonblock</w>
<w>onerror</w>
<w>orderable</w>
@@ -44,6 +46,7 @@
<w>timelimit</w>
<w>viewport</w>
<w>waypoint</w>
<w>webserver</w>
</words>
</dictionary>
</component>

1363
.idea/workspace.xml generated

File diff suppressed because it is too large Load Diff

View File

@@ -18,9 +18,9 @@
* https://github.com/ikkez/F3-Sugar/
*
* @package DB
* @version 1.3.1-dev
* @version 1.4.0
* @since 24.04.2012
* @date 19.01.2015
* @date 04.06.2015
*/
namespace DB;
@@ -1182,8 +1182,8 @@ class Cortex extends Cursor {
$crit = array_shift($filter);
if (count($filter)>0)
$this->preBinds+=$filter;
$this->set('count_'.$key,'(select count('.$relConf['relField'].') from '.$from.' where '.
$crit.' group by '.$mmTable.'.'.$relConf['relField'].')');
$this->set('count_'.$key,'(select count('.$mmTable.'.'.$relConf['relField'].') from '.$from.
' where '.$crit.' group by '.$mmTable.'.'.$relConf['relField'].')');
} else {
// count rel
$this->countFields[]=$key;

View File

@@ -20,42 +20,23 @@ class AccessController extends Controller {
*/
function beforeroute() {
$accessRoute = $this->_isLoggedIn();
$loginCheck = $this->_checkLogIn();
if(
!$this->f3->get('AJAX') &&
!$accessRoute
){
$this->f3->reroute('@landing');
if( !$loginCheck ){
// no user found or LogIn timer expired
$this->logOut();
}
parent::beforeroute();
}
/**
* stores a new user in database
* @param $username
* @param $password
* @return null
*/
private function _registerUser($username, $password){
$user = Model\BasicModel::getNew('UserModel');
$user->name = $username;
$user->password = $password;
$user->save();
return $user;
}
/**
* checks weather a user is currently logged in
* @return bool
*/
private function _isLoggedIn(){
private function _checkLogIn(){
$loggedIn = false;
$loginCheck = false;
if($this->f3->get('SESSION.user.time') > 0){
// check logIn time
@@ -70,32 +51,11 @@ class AccessController extends Controller {
$minutes += $timeDiff->i;
if($minutes <= $this->f3->get('PATHFINDER.TIMER.LOGGED')){
$loggedIn = true;
}else{
// log out
// get user model
$user = Model\BasicModel::getNew('UserModel');
$user->getById($this->f3->get('SESSION.user.id'));
if(! $user->dry()){
$this->logOut();
}
$loginCheck = true;
}
}
return $loggedIn;
}
/**
* get error object is a user is not found/logged of
* @return object
*/
protected function getUserLoggedOffError(){
$userError = (object) [];
$userError->type = 'error';
$userError->message = 'User not found';
return $userError;
return $loginCheck;
}
}

View File

@@ -186,29 +186,6 @@ class Controller {
return $validUser;
}
/**
* @param $user
* @return bool
*/
protected function _logIn($user){
$loginSuccess = false;
if(! $user->dry() ){
// set Session login
$dateTime = new \DateTime();
$this->f3->set('SESSION.user.time', $dateTime->getTimestamp());
$this->f3->set('SESSION.user.name', $user->name);
$this->f3->set('SESSION.user.id', $user->id);
// update/check api data
// $this->_updateCharacterData();
$loginSuccess = true;
}
return $loginSuccess;
}
/**
* logout function
*/
@@ -223,10 +200,25 @@ class Controller {
}else{
$return = (object) [];
$return->reroute = $this->f3->get('BASE') . $this->f3->alias('landing');
$return->error[] = $this->getUserLoggedOffError();
echo json_encode($return);
die();
}
}
/**
* get error object is a user is not found/logged of
* @return object
*/
protected function getUserLoggedOffError(){
$userError = (object) [];
$userError->type = 'error';
$userError->message = 'User not found';
return $userError;
}
/**
* get a log controller e.g. "debug"
* @param $loggerType

View File

@@ -24,6 +24,7 @@ class Connection extends \Controller\AccessController{
/**
* save a new connection or updates an existing (drag/drop) between two systems
* if a connection is changed (drag&drop) to another system. -> this function is called for update
* @param $f3
*/
public function save($f3){
@@ -40,40 +41,32 @@ class Connection extends \Controller\AccessController{
$user = $this->_getUser();
if($user){
// get map model
// get map model and check map access
$map = Model\BasicModel::getNew('MapModel');
$map->getById( (int)$mapData['id'] );
// get source model (system)
$source = Model\BasicModel::getNew('SystemModel');
$source->getById( (int)$connectionData['source'] );
// get target model (system)
$target = Model\BasicModel::getNew('SystemModel');
$target->getById( (int)$connectionData['target'] );
// map model and systeme are required for a new connection!
if(
!$map->dry() &&
!$source->dry() &&
!$target->dry()
){
$connection = Model\BasicModel::getNew('ConnectionModel');
$connection->getById( (int)$connectionData['id'] );
$connection->mapId = $map;
$connection->source = $source;
$connection->target = $target;
if( $map->hasAccess($user) ){
$source = $map->getSystem( (int)$connectionData['source'] );
$target = $map->getSystem( (int)$connectionData['target'] );
if(
$connection->isValid() &&
$connection->hasAccess($user)
!is_null($source) &&
!is_null($target)
){
$connection->save();
$newConnectionData = $connection->getData();
$connection = Model\BasicModel::getNew('ConnectionModel');
$connection->getById( (int)$connectionData['id'] );
$connectionData['mapId'] = $map;
$connection->setData($connectionData);
if( $connection->isValid() ){
$connection->save();
$newConnectionData = $connection->getData();
}
}
}
}
}

View File

@@ -157,12 +157,8 @@ class Map extends \Controller\AccessController {
$map->getById( (int)$formData['id'] );
// check if the user has access to this map
$mapAccess = true;
if(! $map->dry() ){
$mapAccess = $map->hasAccess($user);
}
if( $map->hasAccess($user) ){
if($mapAccess){
$map->setData($formData);
$map = $map->save();
@@ -316,10 +312,13 @@ class Map extends \Controller\AccessController {
if($f3->exists($cacheKey) === false ){
$mapData = (array)$f3->get('POST.mapData');
// get current map data ========================================================
$maps = $user->getMaps();
// loop all submitted map data that should be saved
// -> currently there will only be ONE map data change submitted -> single loop
foreach($mapData as $data){
$config = $data['config'];
$systems = [];
$connections = [];
@@ -339,76 +338,73 @@ class Map extends \Controller\AccessController {
count($connections) > 0
){
$map = Model\BasicModel::getNew('MapModel');
$map->getById( (int)$config['id'] );
// map changes expected =============================================
// -> get active user object
$activeCharacter = $user->getActiveUserCharacter();
if( $map->hasAccess($user) ){
// map changes expected =============================================
// -> get active user object
$activeCharacter = $user->getActiveUserCharacter();
// empty system model for changes
$system = Model\BasicModel::getNew('SystemModel');
// empty connection model for changes
$connection = Model\BasicModel::getNew('ConnectionModel');
// clear map cache on change
$clearMapCache = false;
// loop current user maps and check for changes
foreach($maps as $map){
// update system data -----------------------------------------------
foreach($systems as $systemData){
foreach($systems as $i => $systemData){
// get object
$system->getById($systemData['id']);
// check if current system belongs to the current map
$map->filter('systems', array('id = ?', $systemData['id'] ));
$filteredMap = $map->find(
array('id = ?', $map->id ),
array('limit' => 1)
);
// check if system exists and is part of the current map (security)
if( $system->mapId->id === $map->id ){
// update
$system->setData($systemData);
$system->updatedCharacterId = $activeCharacter->characterId;
$system->save();
// this should never fail
if(is_object($filteredMap)){
$filteredMap = $filteredMap->current();
$clearMapCache = true;
// system belongs to the current map
if(is_object($filteredMap->systems)){
// update
$system = $filteredMap->systems->current();
$system->setData($systemData);
$system->updatedCharacterId = $activeCharacter->characterId;
$system->save();
// a system belongs to ONE map -> speed up for multiple maps
unset($systemData[$i]);
}
}
$system->reset();
}
// update connection data -------------------------------------------
foreach($connections as $connectionData){
// get object
$connection->getById($connectionData['id']);
foreach($connections as $i => $connectionData){
// check if object exists
if( $connection->mapId->id === $map->id ){
// update
$connectionData['mapId'] = $map;
$connection->setData($connectionData);
$connection->save($user);
// check if the current connection belongs to the current map
$map->filter('connections', array('id = ?', $connectionData['id'] ));
$filteredMap = $map->find(
array('id = ?', $map->id ),
array('limit' => 1)
);
$clearMapCache = true;
// this should never fail
if(is_object($filteredMap)){
$filteredMap = $filteredMap->current();
// connection belongs to the current map
if(is_object($filteredMap->connections)){
// update
$connection = $filteredMap->connections->current();
$connection->setData($connectionData);
$connection->save($user);
// a connection belongs to ONE map -> speed up for multiple maps
unset($connectionData[$i]);
}
}
$connection->reset();
}
}
// map data has changed -> clear map cache
if($clearMapCache){
$map->clearCacheData();
}
$map->reset();
}
}
// get map data ======================================================
$activeMaps = $user->getMaps($responseTTL);
// format map Data for return
$return->mapData = self::getFormattedMapData($activeMaps);
$return->mapData = self::getFormattedMapData($maps);
$f3->set($cacheKey, $return, $responseTTL);
}else{
@@ -432,6 +428,8 @@ class Map extends \Controller\AccessController {
$mapData = [];
foreach($mapModels as $mapModel){
//$mapModel->update();
//$mapModel->cast();
$allMapData = $mapModel->getData();
$mapData[] = [

View File

@@ -58,7 +58,16 @@ class User extends Controller\Controller{
if($user !== false){
// user is verified -> ready for login
$loginSuccess = $this->_logIn($user);
// set Session login
$dateTime = new \DateTime();
$this->f3->set('SESSION.user.time', $dateTime->getTimestamp());
$this->f3->set('SESSION.user.name', $user->name);
$this->f3->set('SESSION.user.id', $user->id);
// update/check api data
// $this->_updateCharacterData();
$loginSuccess = true;
}
return $loginSuccess;

View File

@@ -21,7 +21,7 @@ class BasicModel extends \DB\Cortex {
* -> leave this at a higher value
* @var int
*/
protected $ttl = 86400;
//protected $ttl = 86400;
/**
* caching for relational data
@@ -212,8 +212,8 @@ class BasicModel extends \DB\Cortex {
* @param int $ttl
* @return \DB\Cortex
*/
public function getById($id, $ttl = 0) {
$ttl = $ttl ? : $this->ttl;
public function getById($id, $ttl = 3) {
return $this->getByForeignKey('id', (int)$id, array('limit' => 1), $ttl);
}
@@ -248,7 +248,7 @@ class BasicModel extends \DB\Cortex {
* @param int $ttl
* @return \DB\Cortex
*/
public function getByForeignKey($key, $id, $options = array(), $ttl = 0){
public function getByForeignKey($key, $id, $options = array(), $ttl = 60){
$querySet = [];
$query = [];
@@ -265,29 +265,9 @@ class BasicModel extends \DB\Cortex {
array_unshift($querySet, implode(' AND ', $query));
$ttl = $ttl ? : $this->ttl;
return $this->load( $querySet, $options, $ttl );
}
/**
* get multiple model obj that have an 1->m relation to this model
* @param $model
* @param $foreignKey
* @param null $options
* @param int $ttl
* @return mixed
*/
public function getRelatedModels($model, $foreignKey, $options = null, $ttl = 0){
$ttl = $ttl ? : $this->ttl;
$model = self::getNew($model, $ttl);
$relatedModels = $model->find(array($foreignKey . ' = ? AND active = 1', $this->id), $options, $ttl);
return $relatedModels;
}
/**
* function should be overwritten in child classes with access restriction
* @param $accessObject

View File

@@ -13,6 +13,7 @@ class ConnectionModel extends BasicModel{
protected $table = 'connection';
protected $fieldConf = array(
'mapId' => array(
'belongs-to-one' => 'Model\MapModel'

View File

@@ -162,7 +162,6 @@ class MapModel extends BasicModel {
$mapDataAll->connections = $this->getConnectionData();
$this->updateCacheData($mapDataAll);
}
return $mapDataAll;
@@ -232,7 +231,6 @@ class MapModel extends BasicModel {
return $connections;
}
/**
* get all connection data in this map
* @return array

View File

@@ -247,7 +247,6 @@ class SystemModel extends BasicModel {
// clear map cache as well
$this->mapId->clearCacheData();
}
}

View File

@@ -148,12 +148,12 @@ class UserModel extends BasicModel {
* get all accessible map models for this user
* @return array
*/
public function getMaps($map_ttl = 0){
$maps = [];
$userMaps = $this->getRelatedModels('UserMapModel', 'userId', null, $map_ttl);
public function getMaps(){
$this->filter('userMaps', array('active = ?', 1));
if(is_object($userMaps)){
foreach($userMaps as $userMap){
$maps = [];
if($this->userMaps){
foreach($this->userMaps as $userMap){
if($userMap->mapId->isActive()){
$maps[] = $userMap->mapId;
}

View File

@@ -29,7 +29,7 @@ define(['jquery'], function($) {
deleteSystem: 'api/system/delete', // ajax URL - delete system from map
getSystemGraphData: 'api/system/graphData', // ajax URL - get all system graph data
// connection API
saveConnection: 'api/connection/save', // ajax URL - save new connection to map
saveConnection: 'api/connection/save', // ajax URL - save new connection to map
deleteConnection: 'api/connection/delete', // ajax URL - delete connection from map
// signature API
getSignatures: 'api/signature/getAll', // ajax URL - get all signature data for system

View File

@@ -27,6 +27,12 @@ define([
logoContainerId: 'pf-logo-container', // id for main header logo container
headHeaderMapId: 'pf-header-map', // id for header image (svg animation)
// map bg
headMapBgId: 'pf-header-map-bg', // id for header background container
mapNeocomId: 'pf-map-neocom', // id for map "neocom" image
mapBrowserId: 'pf-map-browser', // id for "browser" image
mapBgImageId: 'pf-map-bg-image', // id for "background" map image
// navigation
navigationElementId: 'pf-navbar', // id for navbar element
navigationLinkManualClass: 'pf-navbar-manual', // class for the "manual" trigger link
@@ -136,7 +142,8 @@ define([
// extent "blueimp" gallery for a textFactory method to show HTML templates
Gallery.prototype.textFactory = function (obj, callback) {
var newSlideContent = $('<div>')
.addClass('text-content');
.addClass('text-content')
.attr('title', obj.title);
var moduleConfig = {
name: obj.href, // template name
@@ -154,7 +161,11 @@ define([
// render HTML file (template)
var moduleData = {
id: config.headHeaderMapId
id: config.headHeaderMapId,
bgId: config.headMapBgId,
neocomId: config.mapNeocomId,
browserId: config.mapBrowserId,
mapBgImageId: config.mapBgImageId
};
Render.showModule(moduleConfig, moduleData);
@@ -165,30 +176,25 @@ define([
// initialize carousel ------------------------------------------
var carousel = Gallery([
{
title: 'Map',
title: '',
href: 'ui/map',
type: 'text/html'
},
{
href: 'public/img/landing/responsive.jpg',
title: 'Image 1',
title: 'Responsive layout',
type: 'image/jpg',
thumbnail: ''
},
{
href: 'public/img/landing/pathfinder_1.jpg',
title: 'Image 1',
title: 'Map view',
type: 'image/jpg',
thumbnail: ''
},
{
href: 'public/img/landing/pathfinder_2.jpg',
title: 'Image 1',
type: 'image/jpg',
thumbnail: ''
}, {
href: 'http://img5.fotos-hochladen.net/uploads/s51600x1200a2j7rqp4ig.jpg',
title: 'Image 2',
title: 'System information',
type: 'image/jpg',
thumbnail: ''
}
@@ -196,7 +202,7 @@ define([
container: '#' + config.galleryCarouselId,
carousel: true,
startSlideshow: false,
titleProperty: 'img-title', // attr renamed to prevent bootstrap tooltips for images
titleProperty: 'title',
transitionSpeed: 400,
slideshowInterval: 5000,
onopened: function () {
@@ -205,8 +211,42 @@ define([
// -> show "demo" map
$('#' + config.headHeaderMapId).drawDemoMap(function(){
// when map is shown -> start carousel looping
carousel.play();
// zoom map SVGs
$('#' + config.headHeaderMapId + ' svg').velocity({
scaleX: 0.66,
scaleY: 0.66
}, {
duration: 360
});
// position map container
$('#' + config.headHeaderMapId).velocity({
marginTop: '130px',
marginLeft: '-50px'
}, {
duration: 360,
complete: function(){
// show browser
$('#' + config.mapBrowserId).velocity('transition.slideUpIn', {
duration: 360,
complete: function(){
// show neocom
$('#' + config.mapNeocomId).velocity('transition.slideLeftIn', {
duration: 180
});
// show background
$('#' + config.mapBgImageId).velocity('fadeIn', {
duration: 300
});
// when map is shown -> start carousel looping
carousel.play();
}
});
}
});
});
}
@@ -220,7 +260,7 @@ define([
requirejs(['blueImpGalleryBootstrap'], function() {
// thumb links
var thumbLinks = $('#' + config.galleryThumbContainerId + ' a');
var thumbLinks = $('a[data-gallery="#pf-gallery"]');
var borderless = false;
@@ -340,7 +380,9 @@ define([
$('#' + config.logoContainerId).drawLogo(function(){
// init header animation
$('#' + config.headerContainerId).initHeader();
$('#' + config.headerContainerId).initHeader(function(){
});
}, false);
}

View File

@@ -203,7 +203,7 @@ define([
// start user update trigger after map loaded
setTimeout(function(){
triggerUserUpdatePing();
// triggerUserUpdatePing();
}, 3000);
};

View File

@@ -1044,11 +1044,6 @@ define([
removeSystem(map, system );
}
// trigger "system deleted" on Tab Content Element
var tabContentElement = getTabContentElementByMapElement( mapContainer );
$(tabContentElement).trigger('pf:deleteSystemData', [triggerData]);
callback();
}).fail(function( jqXHR, status, error) {
var reason = status + ' ' + error;
@@ -1065,8 +1060,17 @@ define([
var removeSystem = function(map, system){
system = $(system);
// check if system is "active"
if( system.hasClass(config.systemActiveClass) ){
// get parent Tab Content and fire clear modules event
var tabContentElement = getTabContentElementByMapElement( system );
$(tabContentElement).trigger('pf:removeSystemModules');
}
// remove endpoints and their connections
map.removeAllEndpoints (system);
// do not fire a "connectionDetached" event
map.detachAllConnections(system, {fireEvent: false});
// hide tooltip
system.toggleSystemTooltip('destroy', {});
@@ -1599,8 +1603,9 @@ define([
map.draggable(system, {
containment: 'parent',
constrain: true,
//scroll: true, not working because of customized scrollbar
filter: '.' + config.systemHeadNameClass, // disable drag on "system name"
scope: 'wh',
// scope: 'wh',
start: function(params){
var dragSystem = $(params.el);
@@ -1642,7 +1647,7 @@ define([
setTimeout(function(){
dragSystem.removeClass('no-click');
}, Init.timer['DBL_CLICK'] + 50);
}, Init.timer.DBL_CLICK + 50);
// show tooltip
dragSystem.toggleSystemTooltip('show', {show: true});
@@ -1800,6 +1805,7 @@ define([
case 'set_rally':
// set rally point
if( ! currentSystem.data( 'rally' ) ){
// show confirm dialog
var rallyDialog = bootbox.dialog({
message: 'Do you want to poke active pilots?',
@@ -1814,15 +1820,15 @@ define([
},
setRallyPoke: {
label: '<i class="fa fa-fw fa-bullhorn"></i> Set rally and poke',
className: 'btn-info',
className: 'btn-primary',
callback: function() {
currentSystem.toggleRallyPoint(true, {});
currentSystem.markAsChanged();
}
},
setRallay: {
label: '<i class="fa fa-fw fa-users"></i> Set rally',
className: 'btn-primary',
success: {
label: '<i class="fa fa-fw fa-check"></i> save',
className: 'btn-success',
callback: function() {
currentSystem.toggleRallyPoint(false, {});
currentSystem.markAsChanged();
@@ -1901,7 +1907,7 @@ define([
var single = function(e){
// check if click was performed on "popover" (x-editable
// check if click was performed on "popover" (x-editable)
var popoverClick = false;
if( $(e.target).parents('.popover').length ){
popoverClick = true;
@@ -1911,14 +1917,17 @@ define([
if( !popoverClick ){
var system = $(this);
// left mouse button
if(e.which === 1){
if(! system.hasClass('no-click')){
if(e.ctrlKey === true){
// select system
system.toggleSelectSystem(map);
}else{
system.showSystemInfo(map);
// check if system is locked for "click" events
if( !system.hasClass('no-click') ){
// left mouse button
if(e.which === 1){
if(! system.hasClass('no-click')){
if(e.ctrlKey === true){
// select system
system.toggleSelectSystem(map);
}else{
system.showSystemInfo(map);
}
}
}
}
@@ -2058,7 +2067,7 @@ define([
map.setDraggable(system, true);
if(! hideNotification){
Util.showNotify({title: 'System lock removed', text: 'System: ' + systemName, type: 'success'});
Util.showNotify({title: 'System unlocked', text: systemName, type: 'unlock'});
}
}else{
system.data('locked', true);
@@ -2068,7 +2077,7 @@ define([
map.setDraggable(system, false);
if(! hideNotification){
Util.showNotify({title: 'System is locked', text: 'System: ' + systemName, type: 'success'});
Util.showNotify({title: 'System locked', text: systemName, type: 'lock'});
}
}
@@ -2687,8 +2696,8 @@ define([
}
},
success: {
label: '<i class="fa fa-fw fa-sun-o"></i> add system',
className: 'btn-primary',
label: '<i class="fa fa-fw fa-check"></i> save',
className: 'btn-success',
callback: function (e) {
// get form Values
var form = $('#' + config.systemDialogId).find('form');
@@ -2785,9 +2794,9 @@ define([
var modalContent = $('#' + config.systemDialogId);
// init system select live search
// init system select live search - some delay until modal transition has finished
var selectElement = modalContent.find('.' + config.systemDialogSelectClass);
selectElement.initSystemSelect({
selectElement.delay(200).initSystemSelect({
key: 'systemId',
disabledOptions: mapSystemIds
});
@@ -2805,10 +2814,7 @@ define([
value: defaultSystemStatus,
inputclass: config.systemDialogSelectClass
});
});
};
/**
@@ -3074,6 +3080,10 @@ define([
var id = connection.getParameter('connectionId');
var updated = connection.getParameter('updated');
var connectionTypes = connection.getType();
// normalize connection array
connectionTypes = $.grep(connectionTypes, function(n){ return(n); });
var data = {
id: id ? id : 0,
source: parseInt( source.data('id') ),
@@ -3081,7 +3091,7 @@ define([
target: parseInt( target.data('id') ),
targetName: target.data('name'),
scope: connection.scope,
type: connection.getType(),
type: connectionTypes,
updated: updated ? updated : 0
};
@@ -3104,7 +3114,7 @@ define([
outlineWidth: 2 // width of the outline for an Endpoint or Connector. An integer.
},
Connector:[ 'Bezier', { curviness: 40 /*, cssClass: 'pf-map-connection-wh-fresh'*/ } ],
Endpoint : ['Dot', {radius: 6}],
Endpoints : [ [ 'Dot', { radius: 6 } ], [ 'Dot', { radius: 6 } ] ],
// Endpoint: 'Blank', // does not work... :(
ReattachConnections: false, // re-attach connection if dragged with mouse to "nowhere"
Scope: Init.defaultMapScope, // default map scope for connections
@@ -3128,6 +3138,18 @@ define([
newJsPlumbInstance.bind('beforeDrop', function(info) {
var connection = info.connection;
// lock the target system for "click" events
// to prevent loading system information
var sourceSystem = $('#' + info.sourceId);
var targetSystem = $('#' + info.targetId);
sourceSystem.addClass('no-click');
targetSystem.addClass('no-click');
setTimeout(function(){
sourceSystem.removeClass('no-click');
targetSystem.removeClass('no-click');
}, Init.timer.DBL_CLICK + 50);
// set "default" connection status only for NEW connections
if(!connection.suspendedElement){
setConnectionWHStatus(connection, 'wh_fresh');
@@ -3163,6 +3185,12 @@ define([
deleteConnections([connection], true);
});
newJsPlumbInstance.bind('checkDropAllowed', function(params){
// connections can not be attached to foreign endpoints
// the only endpoint available is endpoint from where the connection was dragged away (re-attach)
return true;
});
activeInstances[mapId] = newJsPlumbInstance;
}

View File

@@ -9,7 +9,7 @@ define([
'app/ui/system_killboard',
'datatablesTableTools',
'app/map/map'
], function($, Config, Util) {
], function($, Init, Util) {
'use strict';
@@ -90,6 +90,27 @@ define([
drawSystemModules($( e.target ));
});
$(this).on('pf:removeSystemModules', function(e){
removeSystemModules($( e.target ));
});
});
};
/**
* clear all system info modules and remove them
* @param tabContentElement
*/
var removeSystemModules = function(tabContentElement, callback){
tabContentElement.find('.' + config.moduleClass).velocity('transition.slideDownOut', {
duration: Init.animationSpeed.mapModule,
complete: function(tempElement){
$(tempElement).remove();
if(callback){
callback();
}
}
});
};

View File

@@ -148,6 +148,14 @@ define([
case 'error':
customConfig.icon = 'fa fa-close fa-fw fa-lg';
break;
case 'lock':
customConfig.icon = 'fa fa-lock fa-fw fa-lg';
customConfig.type = 'success';
break;
case 'unlock':
customConfig.icon = 'fa fa-unlock fa-fw fa-lg';
customConfig.type = 'info';
break;
default:
customConfig.icon = false;
}

View File

@@ -100,6 +100,7 @@ define([
}
},
dropdownParent: 'body',
theme: 'pathfinder',
minimumInputLength: 2,
templateResult: formatResultData,
@@ -111,9 +112,6 @@ define([
}
}).on('change', function(e){
// select changed
console.log(e);
console.log(selectElement.val())
})
).done(function(){
// open select
@@ -222,6 +220,7 @@ define([
}
},
dropdownParent: 'body',
theme: 'pathfinder',
minimumInputLength: 3,
placeholder: '',

View File

@@ -540,7 +540,7 @@ define([
doubleClickCallback.call(self, e);
}
clicks = 0;
}, timeout || Init.timer['DBL_CLICK']);
}, timeout || Init.timer.DBL_CLICK);
}
});
});

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 917 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,3 +1,4 @@
<div id="{{id}}">
<div id="pf-header-systems" class="pf-header-svg-layer"></div>
<div id="pf-header-connectors" class="pf-header-svg-layer"></div>
@@ -89,4 +90,13 @@
</g>
</svg>
</div>
</div>
</div>
<!-- map background -->
<div id="{{bgId}}">
<img id="{{mapBgImageId}}" src="public/img/landing/map/bg.jpg">
<img id="{{neocomId}}" src="public/img/landing/map/neocom.jpg">
<img id="{{browserId}}" src="public/img/landing/map/browser.jpg">
</div>

View File

@@ -33,7 +33,7 @@
<li> <a class="page-scroll" data-anchor="#pf-landing-gallery" href="#">Features</a></li>
<li> <a class="page-scroll" data-anchor="#pf-landing-pricing" href="#">Pricing</a></li>
<li> <a class="page-scroll" data-anchor="#pf-landing-about" href="#">About</a></li>
<li> <a class="page-scroll" data-anchor="#pf-landing-documentation" href="#">Documentation</a></li>
<li> <a class="page-scroll" data-anchor="#pf-landing-faq" href="#">FAQ</a></li>
</ul>
</div>
</div>
@@ -166,20 +166,20 @@
<div class="row">
<div class="col-xs-3 col-lg-2">
<div class="col-xs-12 col-sm-3 col-lg-2">
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/settings_2.jpg" data-description="Account settings" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/settings_2.jpg" alt="Account settings">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/settings_2.jpg" alt="Account settings">
</a>
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/settings_1.jpg" data-description="Map access" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/settings_1.jpg" alt="Map access">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/settings_1.jpg" alt="Map access">
</a>
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/taskmanager_1.jpg" data-description="Task-Manager" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/taskmanager_1.jpg" alt="Task-Manager">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/taskmanager_1.jpg" alt="Task-Manager">
</a>
</div>
<div class="col-xs-9 col-lg-4">
<div class="col-xs-12 col-sm-9 col-lg-4">
<h4><i class="fa fa-fw fa-angle-double-right"></i>Pathfinder</h4>
<ul class="fa-ul">
<ul class="fa-ul pf-landing-list">
<li><i></i>Support for IGB ond OGB</li>
<li><i></i>Open Source Project</li>
<li>
@@ -226,24 +226,25 @@
<div class="clearfix visible-xs visible-sm visible-md"></div>
<div class="col-xs-3 col-lg-2">
<div class="col-xs-12 col-sm-3 col-lg-2">
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/map_2.jpg" data-description="Map selection" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/map_2.jpg" alt="Map selection">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/map_2.jpg" alt="Map selection">
</a>
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/map_3.jpg" data-description="Context menu" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/map_3.jpg" alt="Context menu">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/map_3.jpg" alt="Context menu">
</a>
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/map_1.jpg" data-description="Map information dialog" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/map_1.jpg" alt="Map information dialog">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/map_1.jpg" alt="Map information dialog">
</a>
</div>
<div class="col-xs-9 col-lg-4">
<div class="col-xs-12 col-sm-9 col-lg-4">
<h4><i class="fa fa-fw fa-angle-double-right"></i>Map module</h4>
<ul class="fa-ul">
<ul class="fa-ul pf-landing-list">
<li><i></i>Live synchronisation between all clients</li>
<li><i></i>Watch multiple maps at once</li>
<li><i></i>Share maps with other players or groups</li>
<li><i></i>Invite other players to your maps</li>
<li><i></i>Advanced drag &amp; drop support</li>
<li>
<ul class="fa-ul">
@@ -308,18 +309,18 @@
<div class="row">
<div class="col-xs-3 col-lg-2">
<div class="col-xs-12 col-sm-3 col-lg-2">
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/system_1.jpg" data-description="System description" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/system_1.jpg" alt="System description">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/system_1.jpg" alt="System description">
</a>
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/system_2.jpg" data-description="System information" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/system_2.jpg" alt="System information">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/system_2.jpg" alt="System information">
</a>
</div>
<div class="col-xs-9 col-lg-4">
<div class="col-xs-12 col-sm-9 col-lg-4">
<h4><i class="fa fa-fw fa-angle-double-right"></i>System module</h4>
<ul class="fa-ul">
<ul class="fa-ul pf-landing-list">
<li><i></i>Quick access to all relevant information</li>
<li>
<ul class="fa-ul">
@@ -354,18 +355,18 @@
<div class="clearfix visible-xs visible-sm visible-md"></div>
<div class="col-xs-3 col-lg-2">
<div class="col-xs-12 col-sm-3 col-lg-2">
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/signatures_1.jpg" data-description="Signature table" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/signatures_1.jpg" alt="Signature table">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/signatures_1.jpg" alt="Signature table">
</a>
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/signatures_2.jpg" data-description="Signature reader dialog" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/signatures_2.jpg" alt="Signature reader dialog">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/signatures_2.jpg" alt="Signature reader dialog">
</a>
</div>
<div class="col-xs-9 col-lg-4">
<div class="col-xs-12 col-sm-9 col-lg-4">
<h4><i class="fa fa-fw fa-angle-double-right"></i>Signature module</h4>
<ul class="fa-ul">
<ul class="fa-ul pf-landing-list">
<li><i></i>Share system signature information</li>
<li><i></i>Add multiple signatures at once <kbd>ctrl</kbd> + <kbd>c</kbd> from the scanning window</li>
<li><i></i>Check for new signatures within a second</li>
@@ -388,18 +389,18 @@
</div>
<div class="row">
<div class="col-xs-3 col-lg-2">
<div class="col-xs-12 col-sm-3 col-lg-2">
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/kb_1.jpg" data-description="Killboard diagram" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/kb_1.jpg" alt="Killboard diagram">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/kb_1.jpg" alt="Killboard diagram">
</a>
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/kb_2.jpg" data-description="Killboard" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/kb_2.jpg" alt="Killboard">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/kb_2.jpg" alt="Killboard">
</a>
</div>
<div class="col-xs-9 col-lg-4">
<div class="col-xs-12 col-sm-9 col-lg-4">
<h4><i class="fa fa-fw fa-angle-double-right"></i>Killboard module</h4>
<ul class="fa-ul">
<ul class="fa-ul pf-landing-list">
<li><i></i><em>zkillboard.com</em> API integration</li>
<li><i></i>Get additional, more detailed information about all recent activities in a system</li>
<li><i></i>Visual graph with recent kills and timestamp</li>
@@ -428,18 +429,18 @@
<div class="clearfix visible-xs visible-sm visible-md"></div>
<div class="col-xs-3 col-lg-2">
<div class="col-xs-12 col-sm-3 col-lg-2">
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/route_1.jpg" data-description="Routes" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/route_1.jpg" alt="Routes">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/route_1.jpg" alt="Routes">
</a>
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/route_2.jpg" data-description="Add Route" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/route_2.jpg" alt="Add Route">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/route_2.jpg" alt="Add Route">
</a>
</div>
<div class="col-xs-9 col-lg-4">
<div class="col-xs-12 col-sm-9 col-lg-4">
<h4><i class="fa fa-fw fa-angle-double-right"></i>Route module</h4>
<ul class="fa-ul">
<ul class="fa-ul pf-landing-list">
<li><i></i>Search for routes between systems</li>
<li><i></i>Predefined routes to trade hubs</li>
<li><i></i>Add additional routes</li>
@@ -458,15 +459,15 @@
</div>
<div class="row">
<div class="col-xs-3 col-lg-2">
<div class="col-xs-12 col-sm-3 col-lg-2">
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/statistics_1.jpg" data-description="Statistics" data-gallery="#pf-gallery">
<img src="public/img/landing/thumbs/statistics_1.jpg" alt="Statistics">
<img class="pf-landing-image-preview pf-landing-image-preview-small" src="public/img/landing/thumbs/statistics_1.jpg" alt="Statistics">
</a>
</div>
<div class="col-xs-9 col-lg-4">
<div class="col-xs-12 col-sm-9 col-lg-4">
<h4><i class="fa fa-fw fa-angle-double-right"></i>Statistics module</h4>
<ul class="fa-ul">
<ul class="fa-ul pf-landing-list">
<li><i></i>Integrated live data for all systems</li>
<li>
<ul class="fa-ul">
@@ -481,8 +482,6 @@
<div class="clearfix visible-xs visible-sm visible-md"></div>
</div>
@@ -495,7 +494,7 @@
<div class="row text-center">
<div class="col-md-6 col-md-offset-3">
<h2><span class="text-primary">Pricing</span> and Bundles</h2>
<p>
<p class="lead">
Choose the bundle that meets the requirements you need. If you just want to try out <em>PATHFINDER</em>, start with the <em>Private</em> bundle.
This bundle will always be free of charge and is the most suitable for solo players or smaller groups.
</p>
@@ -589,7 +588,6 @@
<span class="txt-color txt-color-info">Hint</span>
<small> During beta testing, all bundles are activated for any pilot! Enjoy testing and don´t forget to give feedback.</small>
</div>
</div>
</section>
@@ -599,27 +597,167 @@
<div class="row text-center">
<div class="col-md-6 col-md-offset-3">
<h2><span class="text-primary">About</span> this Application</h2>
<p>
Choose the bundle that meets the requirements you need. If you just want to try out <em>PATHFINDER</em>, start with the <em>Private</em> bundle.
This bundle will always be free of charge and is the most suitable for solo players or smaller groups.
<p class="lead">
<em>PATHFINDER</em> in an <em>open source</em> mapping tool for <em>EVE Online</em>. This application was primarily developed to enrich the gameplay of smaller groups.
</p>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 col-sm-offset-1 col-md-offset-1 col-lg-offset-1">
<h4><i class="fa fa-fw fa-angle-double-right"></i>About Me</h4>
<p>
I am playing <em><a target="_blank" href="https://www.eveonline.com/">EVE Online</a></em> since almost 4 years.
The majority of time (3+ years), my characters were a part of the <em><a target="_blank" href="https://www.themittani.com/news/j150020-three-alliances-enter-none-leave">"No Holes Barred"</a></em> alliance.
,one of the oldest and best known wormhole entities that existed in <em>"New Eden"</em> (R.I.P).
The <em>Pathfinder</em> project was started just a few weeks before the failed invasion of <em>"Polaris"</em> took place.
The intention behind this project was not to create another mapping tool that already exist.
I wanted to develop the easiest to use and most powerful 3rd party system mapper, build with the newest web technology, out there.
</p>
<p>
I am currently working as a professional software developer for one of larges German web pages.
The main focus of my daily work is based on large scale frontend applications.
</p>
<p>
I decided to make this project <a target="_blank" href="https://github.com/exodus4d/pathfinder">"Open Source"</a> once the testing is finished.
It would be a great pleasure to me if you would help me to improve this project by submitting <a target="_blank" href="https://github.com/exodus4d/pathfinder/issues">bug reports</a>
or any kind of security issues.
</p>
</div>
<div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 text-center">
<img class="pf-landing-image-preview pf-landing-image-preview-small pf-landing-about-me" alt="" src="http://image.eveonline.com/Character/1946320202_256.jpg">
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 text-center col-sm-offset-1 col-md-offset-1 col-lg-offset-1">
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/development_1.jpg" data-description="PhpStorm on 4k resolution" data-gallery="#pf-gallery">
<img class="pf-landing-image-preview pf-landing-image-preview-medium" src="public/img/landing/thumbs/development_1.jpg" alt="PhpStorm on 4k resolution">
</a>
<a class="pf-animate-on-visible pf-animate" href="public/img/landing/development_2.jpg" data-description="Database diagram on 4k resolution" data-gallery="#pf-gallery">
<img class="pf-landing-image-preview pf-landing-image-preview-medium" src="public/img/landing/thumbs/development_2.jpg" alt="Database diagram on 4k resolution">
</a>
</div>
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6">
<h4><i class="fa fa-fw fa-angle-double-right"></i>Technology stack</h4>
<p>
If you are planning to get deeper into the project or even think about hosting it on your own webserver, you should be aware of some important key points.
<em>Pathfinder</em> is not comparable with any "out of the box" web applications or common CMS systems that come along with an auto-install feature.
If you don´t have any experience with the following technologies, stop thinking about your own hosted <em>Pathfinder</em> app.
Unfortunately the IGB is required for some features, which are currently not supported by the official <em>EVE Online</em> API.
</p>
<h3>Frontend</h3>
<ul class="fa-ul pf-landing-list">
<li><i></i><em><a target="_blank" href="http://getbootstrap.com/">Bootstrap</a></em> as a HTML, CSS framework</li>
<li><i></i><em><a target="_blank" href="http://sass-lang.com/">SASS</a></em> and <em><a target="_blank" href="http://compass-style.org/">Compass</a></em> as a CSS preprocessor</li>
<li><i></i><em><a target="_blank" href="http://requirejs.org/">RequireJs</a></em> as an AMD loader and builder for Javascript</li>
<li><i></i><em><a target="_blank" href="https://jquery.com/">jQuery</a></em> as the main Javascript library</li>
<li><i></i><em><a target="_blank" href="https://nodejs.org/">Node.js</a></em> and <em><a target="_blank" href="http://gulpjs.com/">Gulp</a></em> as js task runner and CI-build environment</li>
<li><i></i>Currently i have written more than 50 jQuery plugins and made use of about 40 open source plugins</li>
<li><i></i>You should know about some HTML5 APIs</li>
<li>
<ul class="fa-ul">
<li><i></i><em><a target="_blank" href="http://www.w3.org/TR/webstorage/">Local Storage</a></em></li>
<li><i></i><em><a target="_blank" href="http://www.w3.org/TR/page-visibility/">Page Visibility</a></em></li>
<li><i></i><em><a target="_blank" href="http://www.w3.org/TR/notifications/">Web Notifications</a></em></li>
<li><i></i><em><a target="_blank" href="http://www.w3.org/TR/fullscreen/">Fullscreen</a></em></li>
</ul>
</li>
</ul>
<h3>Backend</h3>
<ul class="fa-ul pf-landing-list">
<li><i></i><em><a target="_blank" href="http://fatfreeframework.com/">Fat-Free Framework</a></em> as a lightweight PHP framework and ORM mapper</li>
<li><i></i><em><a target="_blank" href="https://www.mysql.de/">MySQL</a>, <a target="_blank" href="https://www.sqlite.org/">SQLite</a> or <a target="_blank" href="http://www.postgresql.org/">PostgreSQL</a></em> as databases</li>
<li><i></i><em><a target="_blank" href="http://memcached.org/">Memcache</a>, <a target="_blank" href="http://php.net/manual/de/book.apc.php">APC</a> or <a target="_blank" href="http://xcache.lighttpd.net/">XCache </a></em> as a 2nd level cache engine</li>
<li><i></i>You should know about relational databases, MVC pattern and ORM strategies</li>
<li><i></i>If you have experiences in developing a Single-Page-Application, that would not hurt :)</li>
</ul>
</div>
</div>
</div>
</section>
{* documentation *}
<section id="pf-landing-documentation">
<section id="pf-landing-faq">
<div class="container">
<div class="row text-center">
<div class="col-md-6 col-md-offset-3">
<h2><span class="text-primary">Documentation</span> and Information</h2>
<p>
Choose the bundle that meets the requirements you need. If you just want to try out <em>PATHFINDER</em>, start with the <em>Private</em> bundle.
This bundle will always be free of charge and is the most suitable for solo players or smaller groups.
<h2><span class="text-primary">Frequently</span> Asked Questions</h2>
<p class="lead">
For any question, here is the place to look for an answer
</p>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-10 col-md-10 col-lg-10 col-sm-offset-1 col-md-offset-1 col-lg-offset-1">
<h3>Can you give me an introduction into <em>Pathfinder</em> ?</h3>
<p>
Unfortunately not. I will probably not have the time to answer any question personally.
Make sure you have read the <span class="pf-navbar-manual"><a href="javascript:void(0);">manual</a></span>.
If there are still some open questions, please ask in the <a target="_blank" href="https://forums.eveonline.com/">official forums</a> thread for help.
</p>
<h3>Which browsers are compatible with <em>Pathfinder</em>?</h3>
<p>
You will get the best user experience with the latest version <em>Google Chrome</em> or <em>Firefox</em>.
<em>Pathfinder</em> uses some "bloody edge" web technologies like SVG graphics, Canvas drawing, CSS3, JS (ECMA 5.0) that are not yet fully supported by any other browser like IE or Safari.
Some features require the IGB-Header information (e.g. tracking live data for a pilot). Some other features require some HTML5 API´s which are not supported by the IGB.
You can even use the IGB and an OGB if you have a multiple screen setup for more usability.
</p>
<h3>Can i use multiple Accounts/APIs?</h3>
<p>
Yes. When you create an new account or update your existing account, you have the opportunity to enter multiple API keys.
When you use the IGB, <em>Pathfinder</em> automatically detects the active pilot and you will see all available maps for this pilot.
When you use the OGB, <em>Pathfinder</em> uses your "main character" as the current active one, which has to be set/update in course of the registration process.
You can change/add/delete API information at any time.
Take in mind:
</p>
<ul class="fa-ul pf-landing-list">
<li><i></i> "Personal"-maps are bound to a user (not character). Each of your characters should be able to see your "personal"-maps</li>
<li><i></i> "Corporation/Alliance"-maps are bound to characters (not user). If you have multiple characters in different groups, only those maps should be visible that belong to your current active character</li>
</ul>
<h3>Are my data save?</h3>
<p>
Whoever said, his program is "bullet proof", is lying! But I promise to give my very best to protect any personal or map data that is stored on my server.
User data is encoded by a strong <a target="_blank" href="https://en.wikipedia.org/wiki/Bcrypt">Blowfish-based Bcrypt</a> hashing algorithm.
If you are familiar with the process of software development, feel free to check the source code and report any kind of security leak.
<br>
There are some points to minimize the risk:
</p>
<ul class="fa-ul pf-landing-list">
<li><i></i> Make sure not to use your <em>EVE Online</em> log in data at any point</li>
<li><i></i> Never share your account with anyone else</li>
<li><i></i> Change your password once in a while</li>
</ul>
<h3>Can i report bugs or security issues?</h3>
<p>
Good work! I am very happy for any technical feedback and improvements.
Feel free to contact me with your problem, either by submitting a <a target="_blank" href="https://github.com/exodus4d/pathfinder/issues">bug report</a> or contact me in game.
I´ll give my best to find a solution for your problem or path <em>Pathfinder</em>.
</p>
<h3>I don´t trust you, can i host <em>Pathfinder</em> on my own webserver?</h3>
<p>
Yes you can! I developed this application for the great community of <em>EVE Online</em>.
The program code is open source and can be used by anyone who have the required software skills.
Please make sure to keep all 3rd party plugin licence and respect them.
At the moment there is no developer guide available. But one the beta phase is finished, i will probably write a short technical documentation.
Do not expect any "out of the boy" install routine ot this point.
<br>
Server requirements:
</p>
<ul class="fa-ul pf-landing-list">
<li><i></i> A webserver with a <em><a target="_blank" href="https://en.wikipedia.org/wiki/LAMP_(software_bundle)">LAMP</a></em> environment</li>
<li><i></i> PHP 5.3+</li>
<li><i></i> PHP framework <a target="_blank" href="http://fatfreeframework.com/system-requirements">requirements</a> </li>
<li><i></i> MySQL 5.x+ </li>
<li><i></i> Some kind of server side caching technology (Memcache,APC,xCache) file caching will also work</li>
</ul>
</div>
</div>
</div>
</section>

View File

@@ -58,6 +58,10 @@
border-bottom: 1px solid $gray-darker;
}
.row{
margin-bottom: 30px;
}
.alert {
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.4);
}
@@ -69,6 +73,82 @@
border-bottom: 1px solid $gray-darker;
line-height: 34px;
}
// images for gallery
a[data-gallery] {
position: relative;
&:before{
content: '\f002';
font-family: 'FontAwesome';
font-size: 20px;
line-height: 20px;
color: $orange;
position: absolute;
top: 9px;
left: 8px;
height: 100%;
width: 100%;
padding-top: calc(50% - 10px);
z-index: 10;
text-align: center;
@include transition(transform 0.1s 0.06s ease-in, opacity 0.1s ease-out);
will-change: transform, opacity;
transform: scale(0,0);
opacity: 0;
}
&:hover{
img{
border-color: $teal-lightest;
@include filter(brightness( 50% ));
}
&:before{
@include transition-delay( 0.1s );
transform: scale(1,1);
opacity: 1;
}
}
.pf-landing-image-preview{
border: {
width: 1px;
style: solid;
color: $gray-darkest
}
margin: 5px 0 15px 0;
display: inline-block;
will-change: all;
@include filter(brightness( 100% ));
@include transition(all 0.2s ease-out);
@include box-shadow(0 4px 10px rgba(0,0,0, 0.4));
&.pf-landing-image-preview-small{
height: 160px;
}
&.pf-landing-image-preview-medium{
height: 256px;
}
}
}
// lists
.pf-landing-list{
li i{
@extend .fa-li;
@extend .fa;
@extend .fa-fw;
@extend .fa-angle-right;
@extend .txt-color;
@extend .txt-color-tealLighter;
}
}
}
// header --------------------------------------------------------------------
#pf-landing-top{
@@ -122,7 +202,6 @@
height: 155px;
width: 180px;
padding: 7px;
display: none;
opacity: 0;
will-change: opacity, transform;
@include border-radius(5px);
@@ -196,6 +275,10 @@
// login ----------------------------------------------------------------------
#pf-landing-login{
padding-top: 40px;
.row{
margin-bottom: 0px;
}
}
// demo map -------------------------------------------------------------------
@@ -205,6 +288,7 @@
margin: 0 auto;
height: 380px;
width: 600px;
pointer-events: none;
.pf-header-svg-layer{
position: absolute;
@@ -239,6 +323,44 @@
}
}
// map bg
#pf-header-map-bg{
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
pointer-events: none;
img{
pointer-events: none;
}
#pf-map-bg-image{
opacity: 0; // triggered by js
position: absolute;
bottom: 0;
right: 0;
width: 100%;
height: 100%;
}
#pf-map-neocom{
opacity: 0; // triggered by js
height: 665px;
width: 21px;
}
#pf-map-browser{
opacity: 0; // triggered by js
position: absolute;
top: 110px;
left: 21px;
height: 560px;
width: 515px;
}
}
// carousel -------------------------------------------------------------------
#pf-landing-gallery-carousel{
background-image: url("#{$base-url}/pf-header-bg.jpg");
@@ -246,83 +368,19 @@
.slide-content{
border-radius: 5px;
}
// title style
h3{
width: 100%;
text-align: left;
}
}
// gallery --------------------------------------------------------------------
#pf-landing-gallery{
#pf-landing-gallery-thumb-container{
.row{
margin-bottom: 30px;
}
}
a[data-gallery] {
position: relative;
img{
border: {
width: 1px;
style: solid;
color: $gray-darker
}
margin: 5px;
display: inline-block;
height: 160px;
will-change: all;
@include border-radius(5px);
@include filter(brightness( 100% ));
@include transition(all 0.2s ease-out);
}
&:before{
content: '\f002';
font-family: 'FontAwesome';
font-size: 20px;
line-height: 20px;
color: $orange;
position: absolute;
top: 9px;
left: 8px;
height: 20px;
width: 154px;
margin-top: 70px;
z-index: 10;
text-align: center;
@include transition(transform 0.1s 0.06s ease-in, opacity 0.1s ease-out);
will-change: transform, opacity;
transform: scale(0,0);
opacity: 0;
}
&:hover{
img{
border-color: $teal-lightest;
@include filter(brightness( 50% ));
@include box-shadow(0 6px 12px rgba(0,0,0, 0.3));
}
&:before{
@include transition-delay( 0.1s );
transform: scale(1,1);
opacity: 1;
}
}
}
// feature list points
li i{
@extend .fa-li;
@extend .fa;
@extend .fa-fw;
@extend .fa-angle-right;
@extend .txt-color;
@extend .txt-color-tealLighter;
}
}
// pricing --------------------------------------------------------------------
.pf-landing-pricing-panel{
margin-top: 20px;
@@ -354,6 +412,16 @@
}
}
// about ----------------------------------------------------------------------
#pf-landing-about{
.pf-landing-about-me{
width: 256px;
height: 256px;
border: none;
@include box-shadow(0 4px 10px rgba(0,0,0, 0.4));
}
}
// footer ---------------------------------------------------------------------
.pf-landing-footer{

View File

@@ -127,6 +127,11 @@ $mapWidth: 2500px ;
@include transition( opacity 0.18s ease-out);
}
// system that is currently dragged
.jsPlumb_dragged{
@extend .pf-system-selected;
}
// hover effects ===================================================
._jsPlumb_hover{
@@ -292,14 +297,12 @@ $mapWidth: 2500px ;
// Endpoints =======================================================
.pf-map-endpoint-source, .pf-map-endpoint-target{
z-index: 50;
svg {
width: 10;
height: 10;
circle{
@include transition( stroke 0.2s ease-out);
@include transition( stroke 0.18s ease-out, fill 0.18s ease-out);
}
*{
@@ -318,10 +321,30 @@ $mapWidth: 2500px ;
// hover effect for Endpoints
&:hover{
circle{
stroke: $gray-lightest !important;
stroke: $orange !important;
}
}
// while dragging
&._jsPlumb_dragging{
circle {
stroke: $orange;
}
}
}
._jsPlumb_endpoint_drop_allowed{
circle {
stroke: $green !important;
fill: $green !important;
}
}
._jsPlumb_endpoint_drop_forbidden{
circle {
stroke: $red-darker !important;
fill: $red-darker !important;
}
}
// Connections =====================================================
@@ -329,10 +352,11 @@ $mapWidth: 2500px ;
svg._jsPlumb_connector{
cursor: pointer;
stroke-linecap: round; // line endings
@include transition( stroke 0.18s ease-out) ;
will-change: all;
path{
@include transition( stroke 0.2s ease-out) ;
@include transition( stroke 0.18s ease-out) ;
}
path:not(:first-child){
@@ -348,6 +372,11 @@ $mapWidth: 2500px ;
stroke: $gray-lightest; // hover style
}
}
&._jsPlumb_dragging{
@include transition( opacity 0.18s ease-out) ;
opacity: 0.4;
}
}
svg.pf-map-connection-stargate {
@@ -424,7 +453,7 @@ $mapWidth: 2500px ;
padding: 1px 4px;
font-size: 11px;
z-index: 1020;
@include border-radius(3px);
@include border-radius(8px);
@include box-shadow(0 6px 12px rgba(0,0,0,.4));
}

View File

@@ -247,7 +247,7 @@ body:last-child .blueimp-gallery-playing > .play-pause {
// text content
.blueimp-gallery > .slides > .slide > .text-content {
overflow: auto;
margin: 20px auto;
padding: 0 20px;
margin: 0 auto;
overflow: hidden;
text-align: left;
}