improved request caching, new C4 statics, landing page carousel,
3
.idea/dictionaries/exodus4d.xml
generated
@@ -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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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[] = [
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -13,6 +13,7 @@ class ConnectionModel extends BasicModel{
|
||||
|
||||
protected $table = 'connection';
|
||||
|
||||
|
||||
protected $fieldConf = array(
|
||||
'mapId' => array(
|
||||
'belongs-to-one' => 'Model\MapModel'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -247,7 +247,6 @@ class SystemModel extends BasicModel {
|
||||
|
||||
// clear map cache as well
|
||||
$this->mapId->clearCacheData();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -203,7 +203,7 @@ define([
|
||||
|
||||
// start user update trigger after map loaded
|
||||
setTimeout(function(){
|
||||
triggerUserUpdatePing();
|
||||
// triggerUserUpdatePing();
|
||||
}, 3000);
|
||||
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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: '',
|
||||
|
||||
@@ -540,7 +540,7 @@ define([
|
||||
doubleClickCallback.call(self, e);
|
||||
}
|
||||
clicks = 0;
|
||||
}, timeout || Init.timer['DBL_CLICK']);
|
||||
}, timeout || Init.timer.DBL_CLICK);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
BIN
public/img/landing/development_1.jpg
Normal file
|
After Width: | Height: | Size: 917 KiB |
BIN
public/img/landing/development_2.jpg
Normal file
|
After Width: | Height: | Size: 409 KiB |
BIN
public/img/landing/map/bg.jpg
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
public/img/landing/map/browser.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
public/img/landing/map/neocom.jpg
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
public/img/landing/thumbs/development_1.jpg
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
public/img/landing/thumbs/development_2.jpg
Normal file
|
After Width: | Height: | Size: 12 KiB |
@@ -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>
|
||||
|
||||
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||