Merge pull request #388 from exodus4d/develop

v1.1.7
This commit is contained in:
Mark Friedrich
2016-11-22 19:07:28 +01:00
committed by GitHub
110 changed files with 16351 additions and 1460 deletions

View File

@@ -1,5 +1,8 @@
; Global Framework Config
[SERVER]
SERVER_NAME = PATHFINDER
[globals]
; Default Verbosity level of the stack trace.
; Assign values between 0 to 3 for increasing verbosity levels. Check (environment.ini) config for overwriting

View File

@@ -5,20 +5,26 @@ web = TRUE
[CRON.presets]
; run every minute
instant = * * * * *
instant = * * * * *
; run on EVE downtime 11:00 GMT/UTC
downtime = 0 11 * * *
; 12 times per hour (each 5min)
fiveMinutes = */5 * * * *
; 6 times per hour (each 10min)
sixthHour = */10 * * * *
tenMinutes = */10 * * * *
; 2 times per hour (each 30min)
halfHour = */30 * * * *
halfHour = */30 * * * *
; run on EVE downtime 11:00 GMT/UTC
downtime = 0 11 * * *
[CRON.jobs]
; delete expired connections (e.g. EOL)
deleteConnections = Cron\MapUpdate->deleteConnections, @fiveMinutes
; delete character log data
deleteLogData = Cron\CharacterUpdate->deleteLogData, @sixthHour
deleteLogData = Cron\CharacterUpdate->deleteLogData, @tenMinutes
; delete expired signatures
deleteSignatures = Cron\MapUpdate->deleteSignatures, @halfHour

View File

@@ -1074,11 +1074,16 @@ class Cortex extends Cursor {
if ($this->emit('beforeerase')===false)
return false;
if ($this->fieldConf) {
foreach($this->fieldConf as $field => $conf)
if (isset($conf['has-many']) &&
$conf['has-many']['hasRel']=='has-many')
$this->set($field,null);
$this->save();
$changed = false;
foreach($this->fieldConf as $field => $conf){
if (isset($conf['has-many']) && $conf['has-many']['hasRel']=='has-many'){
$this->set($field,null);
$changed = true;
}
}
if($changed){
$this->save();
}
}
$this->mapper->erase();
$this->emit('aftererase');

View File

@@ -168,20 +168,27 @@ class Map extends Controller\AccessController {
// get max number of shared entities per map ------------------------------------------------------------------
$maxSharedCount = [
'character' => $f3->get('PATHFINDER.MAP.PRIVATE.MAX_SHARED'),
'corporation' => $f3->get('PATHFINDER.MAP.CORPORATION.MAX_SHARED'),
'alliance' => $f3->get('PATHFINDER.MAP.ALLIANCE.MAX_SHARED'),
'character' => $f3->get('PATHFINDER.MAP.PRIVATE.MAX_SHARED'),
'corporation' => $f3->get('PATHFINDER.MAP.CORPORATION.MAX_SHARED'),
'alliance' => $f3->get('PATHFINDER.MAP.ALLIANCE.MAX_SHARED'),
];
$return->maxSharedCount = $maxSharedCount;
// get activity log options per map ---------------------------------------------------------------------------
$activityLogging = [
'character' => $f3->get('PATHFINDER.MAP.PRIVATE.ACTIVITY_LOGGING'),
'corporation' => $f3->get('PATHFINDER.MAP.CORPORATION.ACTIVITY_LOGGING'),
'alliance' => $f3->get('PATHFINDER.MAP.ALLIANCE.ACTIVITY_LOGGING'),
'character' => $f3->get('PATHFINDER.MAP.PRIVATE.ACTIVITY_LOGGING'),
'corporation' => $f3->get('PATHFINDER.MAP.CORPORATION.ACTIVITY_LOGGING'),
'alliance' => $f3->get('PATHFINDER.MAP.ALLIANCE.ACTIVITY_LOGGING'),
];
$return->activityLogging = $activityLogging;
// route search config ----------------------------------------------------------------------------------------
$return->routeSearch = [
'defaultCount' => $this->getF3()->get('PATHFINDER.ROUTE.SEARCH_DEFAULT_COUNT'),
'maxDefaultCount' => $this->getF3()->get('PATHFINDER.ROUTE.MAX_Default_COUNT'),
'limit' => $this->getF3()->get('PATHFINDER.ROUTE.LIMIT'),
];
// get program routes -----------------------------------------------------------------------------------------
$return->routes = [
'ssoLogin' => $this->getF3()->alias( 'sso', ['action' => 'requestAuthorization'] )
@@ -374,28 +381,34 @@ class Map extends Controller\AccessController {
// share map between characters -> set access
if(isset($formData['mapCharacters'])){
// remove character corporation (re-add later)
$accessCharacters = array_diff($formData['mapCharacters'], [$activeCharacter->_id]);
// avoid abuse -> respect share limits
$accessCharacters = array_slice( $formData['mapCharacters'], 0, $f3->get('PATHFINDER.MAP.PRIVATE.MAX_SHARED') );
$maxShared = max($f3->get('PATHFINDER.MAP.PRIVATE.MAX_SHARED') - 1, 0);
$accessCharacters = array_slice($accessCharacters, 0, $maxShared);
// clear map access. In case something has removed from access list
$map->clearAccess();
if($accessCharacters){
// clear map access. In case something has removed from access list
$map->clearAccess();
/**
* @var $tempCharacter Model\CharacterModel
*/
$tempCharacter = Model\BasicModel::getNew('CharacterModel');
/**
* @var $tempCharacter Model\CharacterModel
*/
$tempCharacter = Model\BasicModel::getNew('CharacterModel');
foreach($accessCharacters as $characterId){
$tempCharacter->getById( (int)$characterId );
foreach($accessCharacters as $characterId){
$tempCharacter->getById( (int)$characterId );
if(
!$tempCharacter->dry() &&
$tempCharacter->shared == 1 // check if map shared is enabled
){
$map->setAccess($tempCharacter);
if(
!$tempCharacter->dry() &&
$tempCharacter->shared == 1 // check if map shared is enabled
){
$map->setAccess($tempCharacter);
}
$tempCharacter->reset();
}
$tempCharacter->reset();
}
}
@@ -411,28 +424,34 @@ class Map extends Controller\AccessController {
// share map between corporations -> set access
if(isset($formData['mapCorporations'])){
// remove character corporation (re-add later)
$accessCorporations = array_diff($formData['mapCorporations'], [$corporation->_id]);
// avoid abuse -> respect share limits
$accessCorporations = array_slice( $formData['mapCorporations'], 0, $f3->get('PATHFINDER.MAP.CORPORATION.MAX_SHARED') );
$maxShared = max($f3->get('PATHFINDER.MAP.CORPORATION.MAX_SHARED') - 1, 0);
$accessCorporations = array_slice($accessCorporations, 0, $maxShared);
// clear map access. In case something has removed from access list
$map->clearAccess();
if($accessCorporations){
// clear map access. In case something has removed from access list
$map->clearAccess();
/**
* @var $tempCorporation Model\CorporationModel
*/
$tempCorporation = Model\BasicModel::getNew('CorporationModel');
/**
* @var $tempCorporation Model\CorporationModel
*/
$tempCorporation = Model\BasicModel::getNew('CorporationModel');
foreach($accessCorporations as $corporationId){
$tempCorporation->getById( (int)$corporationId );
foreach($accessCorporations as $corporationId){
$tempCorporation->getById( (int)$corporationId );
if(
!$tempCorporation->dry() &&
$tempCorporation->shared == 1 // check if map shared is enabled
){
$map->setAccess($tempCorporation);
if(
!$tempCorporation->dry() &&
$tempCorporation->shared == 1 // check if map shared is enabled
){
$map->setAccess($tempCorporation);
}
$tempCorporation->reset();
}
$tempCorporation->reset();
}
}
@@ -448,30 +467,35 @@ class Map extends Controller\AccessController {
// share map between alliances -> set access
if(isset($formData['mapAlliances'])){
// remove character alliance (re-add later)
$accessAlliances = array_diff($formData['mapAlliances'], [$alliance->_id]);
// avoid abuse -> respect share limits
$accessAlliances = array_slice( $formData['mapAlliances'], 0, $f3->get('PATHFINDER.MAP.ALLIANCE.MAX_SHARED') );
$maxShared = max($f3->get('PATHFINDER.MAP.ALLIANCE.MAX_SHARED') - 1, 0);
$accessAlliances = array_slice($accessAlliances, 0, $maxShared);
// clear map access. In case something has removed from access list
$map->clearAccess();
if($accessAlliances){
// clear map access. In case something has removed from access list
$map->clearAccess();
/**
* @var $tempAlliance Model\AllianceModel
*/
$tempAlliance = Model\BasicModel::getNew('AllianceModel');
/**
* @var $tempAlliance Model\AllianceModel
*/
$tempAlliance = Model\BasicModel::getNew('AllianceModel');
foreach($accessAlliances as $allianceId){
$tempAlliance->getById( (int)$allianceId );
foreach($accessAlliances as $allianceId){
$tempAlliance->getById( (int)$allianceId );
if(
!$tempAlliance->dry() &&
$tempAlliance->shared == 1 // check if map shared is enabled
){
$map->setAccess($tempAlliance);
if(
!$tempAlliance->dry() &&
$tempAlliance->shared == 1 // check if map shared is enabled
){
$map->setAccess($tempAlliance);
}
$tempAlliance->reset();
}
$tempAlliance->reset();
}
}
// the alliance of the current user should always have access

View File

@@ -491,6 +491,9 @@ class Route extends Controller\AccessController {
*/
$map = Model\BasicModel::getNew('MapModel');
// limit max search routes to max limit
array_splice($routesData, $f3->get('PATHFINDER.ROUTE.LIMIT'));
foreach($routesData as $key => $routeData){
// mapIds are optional. If mapIds is empty or not set
// route search is limited to CCPs static data
@@ -537,6 +540,7 @@ class Route extends Controller\AccessController {
$returnRoutData = [
'systemFromData' => $routeData['systemFromData'],
'systemToData' => $routeData['systemToData'],
'skipSearch' => (bool) $routeData['skipSearch'],
'maps' => $mapData,
'mapIds' => $mapIds
];
@@ -544,7 +548,10 @@ class Route extends Controller\AccessController {
// add filter options for each route as well
$returnRoutData += $filterData;
if(count($mapIds) > 0){
if(
!$returnRoutData['skipSearch'] &&
count($mapIds) > 0
){
$systemFrom = $routeData['systemFromData']['name'];
$systemTo = $routeData['systemToData']['name'];

View File

@@ -97,7 +97,7 @@ class Signature extends Controller\AccessController {
// this key should not be saved (it is an obj)
unset($data['updated']);
$system->getById( (int)$data['systemId']);
$system->getById( (int)$data['systemId'], 0);
if( !$system->dry() ){
// update/save signature

View File

@@ -264,21 +264,9 @@ class User extends Controller\Controller{
// sharing config -------------------------------------------------------------
if(isset($formData['share'])){
$privateSharing = 0;
$corporationSharing = 0;
$allianceSharing = 0;
if(isset($formData['privateSharing'])){
$privateSharing = 1;
}
if(isset($formData['corporationSharing'])){
$corporationSharing = 1;
}
if(isset($formData['allianceSharing'])){
$allianceSharing = 1;
}
$privateSharing = (int)$formData['privateSharing'];
$corporationSharing = (int)$formData['corporationSharing'];
$allianceSharing = (int)$formData['allianceSharing'];
// update private/corp/ally
$corporation = $activeCharacter->getCorporation();
@@ -298,6 +286,13 @@ class User extends Controller\Controller{
$activeCharacter->save();
}
// character config -----------------------------------------------------------
if(isset($formData['character'])){
$activeCharacter->logLocation = (int)$formData['logLocation'];
$activeCharacter->save();
}
// get fresh updated user object
$newUserData = $user->getData();
}

View File

@@ -8,6 +8,7 @@
namespace cron;
use DB;
use Model;
class MapUpdate {
@@ -62,6 +63,48 @@ class MapUpdate {
$log->write( sprintf(self::LOG_TEXT_MAPS, __FUNCTION__, $deletedMapsCount) );
}
/**
* delete expired connections (EOL connections)
* >> php index.php "/cron/deleteConnections"
* @param \Base $f3
*/
function deleteConnections(\Base $f3){
$eolExpire = (int)$f3->get('PATHFINDER.CACHE.EXPIRE_CONNECTIONS_EOL');
if($eolExpire > 0){
$pfDB = DB\Database::instance()->getDB('PF');
$sql = "SELECT
`con`.`id`
FROM
`connection` `con` INNER JOIN
`map` ON
`map`.`id` = `con`.`mapId`
WHERE
`map`.`deleteExpiredConnections` = :deleteExpiredConnections AND
TIMESTAMPDIFF(SECOND, `con`.`eolUpdated`, NOW() ) > :expire_time
";
$connectionsData = $pfDB->exec($sql, [
'deleteExpiredConnections' => 1,
'expire_time' => $eolExpire
]);
if($connectionsData){
/**
* @var $connection Model\ConnectionModel
*/
$connection = Model\BasicModel::getNew('ConnectionModel');
foreach($connectionsData as $data){
$connection->getById( (int)$data['id'] );
if( !$connection->dry() ){
$connection->erase();
}
}
}
}
}
/**
* delete all expired signatures on "inactive" systems
* >> php index.php "/cron/deleteSignatures"
@@ -84,7 +127,6 @@ class MapUpdate {
$pfDB->exec($sqlDeleteExpiredSignatures, ['lifetime' => $signatureExpire]);
}
}
}

View File

@@ -49,9 +49,7 @@ class AllianceMapModel extends BasicModel {
* see parent
*/
public function clearCacheData(){
parent::clearCacheData();
// clear map cache as well
// clear map cache
$this->mapId->clearCacheData();
}

View File

@@ -41,7 +41,7 @@ class AllianceModel extends BasicModel {
/**
* get all alliance data
* @return array
* @return \stdClass
*/
public function getData(){
$allianceData = (object) [];

View File

@@ -92,6 +92,11 @@ abstract class BasicModel extends \DB\Cortex {
*/
protected $fieldChanges = [];
/**
* default TTL for getData(); cache
*/
const DEFAULT_CACHE_TTL = 120;
public function __construct($db = NULL, $table = NULL, $fluid = NULL, $ttl = 0){
$this->addStaticFieldConfig();
@@ -105,7 +110,6 @@ abstract class BasicModel extends \DB\Cortex {
$this->afterinsert(function($self, $pkeys){
$self->afterInsertEvent($self, $pkeys);
$self->clearCacheData();
});
// update events ------------------------------------------------------------------------------------
@@ -115,7 +119,6 @@ abstract class BasicModel extends \DB\Cortex {
$this->afterupdate( function($self, $pkeys){
$self->afterUpdateEvent($self, $pkeys);
$self->clearCacheData();
});
// erase events -------------------------------------------------------------------------------------
@@ -318,6 +321,14 @@ abstract class BasicModel extends \DB\Cortex {
return $valid;
}
/**
* get key for for all objects in this table
* @return string
*/
private function getTableCacheKey(){
return $this->dataCacheKeyPrefix .'.' . strtoupper($this->table);
}
/**
* get the cache key for this model
* ->do not set a key if the model is not saved!
@@ -329,14 +340,12 @@ abstract class BasicModel extends \DB\Cortex {
// set a model unique cache key if the model is saved
if( $this->id > 0){
$cacheKey = $this->getTableCacheKey();
// check if there is a given key prefix
// -> if not, use the standard key.
// this is useful for caching multiple data sets according to one row entry
$cacheKey = $this->dataCacheKeyPrefix;
$cacheKey .= '.' . strtoupper($this->table);
if($dataCacheTableKeyPrefix){
if( !empty($dataCacheTableKeyPrefix) ){
$cacheKey .= '.' . $dataCacheTableKeyPrefix . '_';
}else{
$cacheKey .= '.ID_';
@@ -353,13 +362,14 @@ abstract class BasicModel extends \DB\Cortex {
* @return \stdClass|null
*/
protected function getCacheData($dataCacheKeyPrefix = ''){
$cacheKey = $this->getCacheKey($dataCacheKeyPrefix);
$cacheData = null;
// table cache exists
// -> check cache for this row data
$cacheKey = $this->getCacheKey($dataCacheKeyPrefix);
if( !is_null($cacheKey) ){
$f3 = self::getF3();
if( $f3->exists($cacheKey) ){
$cacheData = $f3->get( $cacheKey );
}
@@ -374,15 +384,14 @@ abstract class BasicModel extends \DB\Cortex {
* @param string $dataCacheKeyPrefix
* @param int $data_ttl
*/
public function updateCacheData($cacheData, $dataCacheKeyPrefix = '', $data_ttl = 300){
public function updateCacheData($cacheData, $dataCacheKeyPrefix = '', $data_ttl = self::DEFAULT_CACHE_TTL){
$cacheDataTmp = (array)$cacheData;
// check if data should be cached
// and cacheData is not empty
if(
$data_ttl > 0 &&
!empty( $cacheDataTmp )
!empty($cacheDataTmp)
){
$cacheKey = $this->getCacheKey($dataCacheKeyPrefix);
@@ -394,13 +403,30 @@ abstract class BasicModel extends \DB\Cortex {
/**
* unset the getData() cache for this object
* -> see also clearCacheDataWithPrefix(), for more information
*/
public function clearCacheData(){
$cacheKey = $this->getCacheKey();
$this->clearCache($cacheKey);
}
if( !is_null($cacheKey) ){
/**
* unset object cached data by prefix
* -> primarily used by object cache with multiple data caches
* @param string $dataCacheKeyPrefix
*/
public function clearCacheDataWithPrefix($dataCacheKeyPrefix = ''){
$cacheKey = $this->getCacheKey($dataCacheKeyPrefix);
$this->clearCache($cacheKey);
}
/**
* unset object cached data (if exists)
* @param $cacheKey
*/
private function clearCache($cacheKey){
if( !empty($cacheKey) ){
$f3 = self::getF3();
if( $f3->exists($cacheKey) ){
$f3->clear($cacheKey);
}

View File

@@ -16,14 +16,6 @@ class CharacterLogModel extends BasicModel {
protected $table = 'character_log';
/**
* caching for relational data
* -> 5s matches REST API - Expire: Header-Data
* for "Location" calls
* @var int
*/
protected $rel_ttl = 5;
protected $fieldConf = [
'active' => [
'type' => Schema::DT_BOOL,
@@ -203,6 +195,45 @@ class CharacterLogModel extends BasicModel {
return $systemId;
}
/**
* Event "Hook" function
* return false will stop any further action
* @param self $self
* @param $pkeys
*/
public function afterInsertEvent($self, $pkeys){
$self->clearCacheData();
}
/**
* Event "Hook" function
* return false will stop any further action
* @param self $self
* @param $pkeys
*/
public function afterUpdateEvent($self, $pkeys){
$self->clearCacheData();
}
/**
* Event "Hook" function
* can be overwritten
* @param self $self
* @param $pkeys
*/
public function afterEraseEvent($self, $pkeys){
$self->clearCacheData();
}
/**
* see parent
*/
public function clearCacheData(){
// clear character "LOG" cache
// -> character data without "LOG" has not changed!
$this->characterId->clearCacheDataWithPrefix(CharacterModel::DATA_CACHE_KEY_LOG);
}
/**
* update session data for active character
* @param int $systemId

View File

@@ -49,9 +49,7 @@ class CharacterMapModel extends BasicModel {
* see parent
*/
public function clearCacheData(){
parent::clearCacheData();
// clear map cache as well
// clear map cache
$this->mapId->clearCacheData();
}

View File

@@ -16,6 +16,11 @@ class CharacterModel extends BasicModel {
protected $table = 'character';
/**
* cache key prefix for getData(); result WITH log data
*/
const DATA_CACHE_KEY_LOG = 'LOG';
protected $fieldConf = [
'lastLogin' => [
'type' => Schema::DT_TIMESTAMP,
@@ -84,6 +89,11 @@ class CharacterModel extends BasicModel {
'nullable' => false,
'default' => 0
],
'logLocation' => [
'type' => Schema::DT_BOOL,
'nullable' => false,
'default' => 1
],
'userCharacter' => [
'has-one' => ['Model\UserCharacterModel', 'characterId']
],
@@ -107,19 +117,20 @@ class CharacterModel extends BasicModel {
$cacheKeyModifier = '';
// check if there is cached data
// -> IMPORTANT: $addCharacterLogData is optional! -> therefore we need 2 cache keys!
if($addCharacterLogData){
$cacheKeyModifier = strtoupper($this->table) . '_LOG';
$cacheKeyModifier = self::DATA_CACHE_KEY_LOG;
}
$characterData = $this->getCacheData($cacheKeyModifier);
if(is_null($characterData)){
// no cached character data found
$characterData = (object) [];
$characterData->id = $this->id;
$characterData->name = $this->name;
$characterData->shared = $this->shared;
$characterData->logLocation = $this->logLocation;
if($addCharacterLogData){
if($logModel = $this->getLog()){
@@ -140,7 +151,7 @@ class CharacterModel extends BasicModel {
// max caching time for a system
// the cached date has to be cleared manually on any change
// this includes system, connection,... changes (all dependencies)
$this->updateCacheData($characterData, $cacheKeyModifier, 10);
$this->updateCacheData($characterData, $cacheKeyModifier);
}
return $characterData;
@@ -180,6 +191,56 @@ class CharacterModel extends BasicModel {
return $accessToken;
}
public function set_logLocation($logLocation){
$logLocation = (bool)$logLocation;
if(
!$logLocation &&
$logLocation !== $this->logLocation &&
$this->hasLog()
){
$this->getLog()->erase();
}
return $logLocation;
}
/**
* Event "Hook" function
* @param self $self
* @param $pkeys
*/
public function afterInsertEvent($self, $pkeys){
$self->clearCacheData();
}
/**
* Event "Hook" function
* @param self $self
* @param $pkeys
*/
public function afterUpdateEvent($self, $pkeys){
$self->clearCacheData();
}
/**
* Event "Hook" function
* @param self $self
* @param $pkeys
*/
public function afterEraseEvent($self, $pkeys){
$self->clearCacheData();
}
/**
* see parent
*/
public function clearCacheData(){
parent::clearCacheData();
// clear data with "log" as well!
parent::clearCacheDataWithPrefix(self::DATA_CACHE_KEY_LOG);
}
/**
* check whether this character has already a user assigned to it
* @return bool
@@ -188,6 +249,14 @@ class CharacterModel extends BasicModel {
return is_object($this->userCharacter);
}
/**
* check whether this character has an active location log
* @return bool
*/
public function hasLog(){
return is_object($this->characterLog);
}
/**
* check whether this character has a corporation
* @return bool
@@ -341,29 +410,32 @@ class CharacterModel extends BasicModel {
* @return $this
*/
public function updateLog($additionalOptions = []){
// Try to pull data from CREST
$ssoController = new Sso();
$logData = $ssoController->getCharacterLocationData($this->getAccessToken(), $additionalOptions);
//check if log update is enabled for this user
if( $this->logLocation ){
// Try to pull data from CREST
$ssoController = new Sso();
$logData = $ssoController->getCharacterLocationData($this->getAccessToken(), $additionalOptions);
if($logData['timeout'] === false){
if( empty($logData['system']) ){
// character is not in-game
if(is_object($this->characterLog)){
// delete existing log
$this->characterLog->erase();
$this->save();
}
}else{
// character is currently in-game
if( !$characterLog = $this->getLog() ){
// create new log
$characterLog = $this->rel('characterLog');
$characterLog->characterId = $this->_id;
}
$characterLog->setData($logData);
$characterLog->save();
if($logData['timeout'] === false){
if( empty($logData['system']) ){
// character is not in-game
if( $this->hasLog() ){
// delete existing log
$this->characterLog->erase();
$this->save();
}
}else{
// character is currently in-game
if( !$characterLog = $this->getLog() ){
// create new log
$characterLog = $this->rel('characterLog');
$characterLog->characterId = $this->_id;
}
$characterLog->setData($logData);
$characterLog->save();
$this->characterLog = $characterLog;
$this->characterLog = $characterLog;
}
}
}
@@ -445,7 +517,7 @@ class CharacterModel extends BasicModel {
public function getLog(){
$characterLog = false;
if(
is_object($this->characterLog) &&
$this->hasLog() &&
!$this->characterLog->dry()
){
$characterLog = &$this->characterLog;

View File

@@ -224,8 +224,7 @@ class ConnectionModel extends BasicModel{
* @param $pkeys
*/
public function afterInsertEvent($self, $pkeys){
parent::afterInsertEvent($self, $pkeys);
$self->clearCacheData();
$self->logActivity('connectionCreate');
}
@@ -236,8 +235,7 @@ class ConnectionModel extends BasicModel{
* @param $pkeys
*/
public function afterUpdateEvent($self, $pkeys){
parent::afterUpdateEvent($self, $pkeys);
$self->clearCacheData();
$self->logActivity('connectionUpdate');
}
@@ -248,8 +246,7 @@ class ConnectionModel extends BasicModel{
* @param $pkeys
*/
public function afterEraseEvent($self, $pkeys){
parent::afterUpdateEvent($self, $pkeys);
$self->clearCacheData();
$self->logActivity('connectionDelete');
}
@@ -302,9 +299,6 @@ class ConnectionModel extends BasicModel{
* see parent
*/
public function clearCacheData(){
parent::clearCacheData();
// clear map cache as well
$this->mapId->clearCacheData();
}

View File

@@ -49,9 +49,7 @@ class CorporationMapModel extends BasicModel {
* see parent
*/
public function clearCacheData(){
parent::clearCacheData();
// clear map cache as well
// clear map cache
$this->mapId->clearCacheData();
}

View File

@@ -46,7 +46,7 @@ class CorporationModel extends BasicModel {
/**
* get all cooperation data
* @return array
* @return \stdClass
*/
public function getData(){
$cooperationData = (object) [];

View File

@@ -55,6 +55,11 @@ class MapModel extends BasicModel {
'nullable' => false,
'default' => ''
],
'deleteExpiredConnections' => [
'type' => Schema::DT_BOOL,
'nullable' => false,
'default' => 1
],
'systems' => [
'has-many' => ['Model\SystemModel', 'mapId']
],
@@ -134,6 +139,7 @@ class MapModel extends BasicModel {
$mapData->id = $this->id;
$mapData->name = $this->name;
$mapData->icon = $this->icon;
$mapData->deleteExpiredConnections = $this->deleteExpiredConnections;
$mapData->created = strtotime($this->created);
$mapData->updated = strtotime($this->updated);
@@ -194,12 +200,39 @@ class MapModel extends BasicModel {
// max caching time for a map
// the cached date has to be cleared manually on any change
// this includes system, connection,... changes (all dependencies)
$this->updateCacheData($mapDataAll, '', 300);
$this->updateCacheData($mapDataAll);
}
return $mapDataAll;
}
/**
* Event "Hook" function
* @param self $self
* @param $pkeys
*/
public function afterInsertEvent($self, $pkeys){
$self->clearCacheData();
}
/**
* Event "Hook" function
* @param self $self
* @param $pkeys
*/
public function afterUpdateEvent($self, $pkeys){
$self->clearCacheData();
}
/**
* Event "Hook" function
* @param self $self
* @param $pkeys
*/
public function afterEraseEvent($self, $pkeys){
$self->clearCacheData();
}
/**
* get blank system model pre-filled with default SDE data
* -> check for "inactive" systems on this map first!
@@ -401,7 +434,7 @@ class MapModel extends BasicModel {
}
} elseif($obj instanceof AllianceModel){
// check whether the corporation already has map access
// check whether the alliance already has map access
$this->has('mapAlliances', ['active = 1 AND allianceId = :allianceId', ':allianceId' => $obj->id]);
$result = $this->findone(['id = :id', ':id' => $this->id]);
@@ -531,7 +564,7 @@ class MapModel extends BasicModel {
/**
* get data for all characters that are currently online "viewing" this map
* -> the result of this function is cached!
* -> The result of this function is cached!
* @return \stdClass[]
*/
private function getCharactersData(){
@@ -639,13 +672,7 @@ class MapModel extends BasicModel {
* @return bool
*/
public function isPrivate(){
$isPrivate = false;
if($this->typeId->id == 2){
$isPrivate = true;
}
return $isPrivate;
return ($this->typeId->id === 2);
}
/**
@@ -653,13 +680,7 @@ class MapModel extends BasicModel {
* @return bool
*/
public function isCorporation(){
$isCorporation = false;
if($this->typeId->id == 3){
$isCorporation = true;
}
return $isCorporation;
return ($this->typeId->id === 3);
}
/**
@@ -667,13 +688,7 @@ class MapModel extends BasicModel {
* @return bool
*/
public function isAlliance(){
$isAlliance = false;
if($this->typeId->id == 4){
$isAlliance = true;
}
return $isAlliance;
return ($this->typeId->id === 4);
}
/**

View File

@@ -277,7 +277,7 @@ class SystemModel extends BasicModel {
// max caching time for a system
// the cached date has to be cleared manually on any change
// this includes system, connection,... changes (all dependencies)
$this->updateCacheData($systemData, '', 300);
$this->updateCacheData($systemData);
}
return $systemData;
@@ -358,19 +358,16 @@ class SystemModel extends BasicModel {
/**
* Event "Hook" function
* return false will stop any further action
* @param self $self
* @param $pkeys
*/
public function afterInsertEvent($self, $pkeys){
parent::afterInsertEvent($self, $pkeys);
$self->clearCacheData();
$self->logActivity('systemCreate');
}
/**
* Event "Hook" function
* can be overwritten
* return false will stop any further action
* @param self $self
* @param $pkeys
@@ -397,12 +394,11 @@ class SystemModel extends BasicModel {
/**
* Event "Hook" function
* return false will stop any further action
* @param self $self
* @param $pkeys
*/
public function afterUpdateEvent($self, $pkeys){
parent::afterUpdateEvent($self, $pkeys);
$self->clearCacheData();
// check if rally point mail should be send
if(
@@ -418,13 +414,11 @@ class SystemModel extends BasicModel {
/**
* Event "Hook" function
* can be overwritten
* @param self $self
* @param $pkeys
*/
public function afterEraseEvent($self, $pkeys){
parent::afterUpdateEvent($self, $pkeys);
$self->clearCacheData();
$self->logActivity('systemDelete');
}

View File

@@ -183,8 +183,6 @@ class SystemSignatureModel extends BasicModel {
* @param $pkeys
*/
public function afterInsertEvent($self, $pkeys){
parent::afterInsertEvent($self, $pkeys);
$self->logActivity('signatureCreate');
}
@@ -195,8 +193,6 @@ class SystemSignatureModel extends BasicModel {
* @param $pkeys
*/
public function afterUpdateEvent($self, $pkeys){
parent::afterUpdateEvent($self, $pkeys);
$self->logActivity('signatureUpdate');
}
@@ -207,8 +203,6 @@ class SystemSignatureModel extends BasicModel {
* @param $pkeys
*/
public function afterEraseEvent($self, $pkeys){
parent::afterUpdateEvent($self, $pkeys);
$self->logActivity('signatureDelete');
}

View File

@@ -3,7 +3,7 @@
[PATHFINDER]
NAME = Pathfinder
; installed version (used for CSS/JS cache busting)
VERSION = v1.1.6
VERSION = v1.1.7
; contact information [optional]
CONTACT = https://github.com/exodus4d
; public contact email [optional]
@@ -77,6 +77,12 @@ ACTIVITY_LOGGING = 0
; max recursive search depth for routes (default: 7000)
; decrease it on performance problems
SEARCH_DEPTH = 7000
; default count of routes that will be checked (initial) when a system is selected (default: 2)
SEARCH_DEFAULT_COUNT = 2
; max count of routes that can be selected in "route settings" dialog (default: 4)
MAX_Default_COUNT = 4
; max count of routes that will be checked (MAX_COUNT + custom routes ) (default: 6)
LIMIT = 6
; Email notifications =============================================================================
; Requires SMTP configuration (see environment.ini)
@@ -119,6 +125,8 @@ CHARACTER_LOG = 300
CONSTELLATION_SYSTEMS = 1728000
; max expire time. Expired cache files will be deleted by cronjob (seconds) (default: 10d)
EXPIRE_MAX = 864000
; expire time for EOL (end of life) connections (seconds) (default: 4h + 15min)
EXPIRE_CONNECTIONS_EOL = 15300
; expire time for signatures (inactive systems) (seconds) (default 3d)
EXPIRE_SIGNATURES = 259200

View File

@@ -81,7 +81,7 @@
"80";"2016-07-16 13:53:20";"2016-07-16 13:53:20";"31002550";"68";
"81";"2016-07-16 13:53:20";"2016-07-16 13:53:20";"31002516";"6";
"82";"2016-07-16 13:53:20";"2016-07-16 13:53:20";"31002516";"21";
"83";"2016-07-16 13:53:20";"2016-07-16 13:53:20";"31002534";"18";
"83";"2016-07-16 13:53:20";"2016-07-16 13:53:20";"31002534";"30";
"84";"2016-07-16 13:53:20";"2016-07-16 13:53:20";"31002534";"59";
"85";"2016-07-16 13:53:20";"2016-07-16 13:53:20";"31002508";"39";
"86";"2016-07-16 13:53:20";"2016-07-16 13:53:20";"31002508";"28";
1 Id Created Updated SystemId WormholeId
81 80 2016-07-16 13:53:20 2016-07-16 13:53:20 31002550 68
82 81 2016-07-16 13:53:20 2016-07-16 13:53:20 31002516 6
83 82 2016-07-16 13:53:20 2016-07-16 13:53:20 31002516 21
84 83 2016-07-16 13:53:20 2016-07-16 13:53:20 31002534 18 30
85 84 2016-07-16 13:53:20 2016-07-16 13:53:20 31002534 59
86 85 2016-07-16 13:53:20 2016-07-16 13:53:20 31002508 39
87 86 2016-07-16 13:53:20 2016-07-16 13:53:20 31002508 28

View File

@@ -204,7 +204,7 @@ INSERT INTO `system_wormhole` (`id`, `created`, `updated`, `systemId`, `wormhole
(80, '2016-07-16 13:53:20', '2016-07-16 13:53:20', 31002550, 68),
(81, '2016-07-16 13:53:20', '2016-07-16 13:53:20', 31002516, 6),
(82, '2016-07-16 13:53:20', '2016-07-16 13:53:20', 31002516, 21),
(83, '2016-07-16 13:53:20', '2016-07-16 13:53:20', 31002534, 18),
(83, '2016-07-16 13:53:20', '2016-07-16 13:53:20', 31002534, 30),
(84, '2016-07-16 13:53:20', '2016-07-16 13:53:20', 31002534, 59),
(85, '2016-07-16 13:53:20', '2016-07-16 13:53:20', 31002508, 39),
(86, '2016-07-16 13:53:20', '2016-07-16 13:53:20', 31002508, 28),

View File

@@ -320,7 +320,7 @@ define(['jquery'], function($) {
5: { // Wormhole
1: 'D792 - HS',
2: 'C391 - LS',
3: 'Z142 - 0.0',
3: 'C248 - 0.0',
4: 'F135 - Thera'
},
6: { // ORE
@@ -418,4 +418,4 @@ define(['jquery'], function($) {
};
return signatureTypes;
});
});

View File

@@ -58,7 +58,7 @@ define([
var tableHeadline = $('<h4>', {
text: ' Processes'
}).prepend( $('<i>', {
class: ['fa', 'fa-fw', 'fa-lg', 'fa-list-alt'].join(' ')
class: ['fa', 'fa-fw', 'fa-lg', 'fa-microchip'].join(' ')
}));
// add content Structure to dome before table initialization

View File

@@ -464,10 +464,12 @@ define([
*/
var initNotificationPanel = function(){
var storageKey = 'notification_panel';
var currentVersion = $('body').data('version');
var currentVersion = Util.getVersion();
var showNotificationPanel = function(){
var data = {};
var data = {
version: Util.getVersion()
};
requirejs(['text!templates/ui/notice.html', 'mustache'], function(template, Mustache) {
var content = Mustache.render(template, data);
@@ -514,11 +516,10 @@ define([
*/
var initCharacterAnimation = function(imageWrapperElement){
imageWrapperElement.velocity('stop').delay(300).velocity('transition.flipBounceXIn', {
imageWrapperElement.velocity('stop').velocity('transition.flipBounceXIn', {
display: 'inline-block',
stagger: 60,
drag: true,
duration: 600
duration: 500
});
// Hover effect for character info layer
@@ -528,7 +529,7 @@ define([
characterInfoElement.velocity('finish').velocity({
width: ['100%', [ 400, 15 ] ]
},{
easing: 'easeInSine'
easing: 'easeOutSine'
});
}, function(e){
var characterInfoElement = $(this).find('.' + config.characterImageInfoClass);
@@ -537,7 +538,7 @@ define([
width: 0
},{
duration: 150,
easing: 'easeInOutSine'
easing: 'easeOutSine'
});
});
};

View File

@@ -1067,6 +1067,16 @@ define([
// system alias changed -> mark system as updated
system.markAsChanged();
});
headElement.on('shown', function(e, editable) {
var inputElement = editable.input.$input.select();
// "fake" timeout until dom rendered
setTimeout(function(input){
// pre-select value
input.select();
}, 0, inputElement);
});
};
/**
@@ -1406,7 +1416,7 @@ define([
var moduleData = {
id: config.mapContextMenuId,
items: [
{icon: 'fa-info', action: 'info', text: 'info'},
{icon: 'fa-street-view', action: 'info', text: 'information'},
{icon: 'fa-plus', action: 'add_system', text: 'add system'},
{icon: 'fa-object-ungroup', action: 'select_all', text: 'select all'},
{icon: 'fa-filter', action: 'filter_scope', text: 'filter scope', subitems: [
@@ -2703,6 +2713,7 @@ define([
mapElement = $(mapElement);
// get current character log data
var characterLogExists = false;
var currentCharacterLog = Util.getCurrentCharacterLog();
// check if map is frozen
@@ -2716,6 +2727,14 @@ define([
userCount: 0 // active user in a map
};
if(
currentCharacterLog &&
currentCharacterLog.system
){
characterLogExists = true;
headerUpdateData.currentSystemName = currentCharacterLog.system.name;
}
// check if current user was found on the map
var currentUserOnMap = false;
@@ -2753,20 +2772,17 @@ define([
}
// the current user can only be in a single system ------------------------------------------
if( !currentUserOnMap){
if(
characterLogExists &&
!currentUserOnMap &&
currentCharacterLog.system.id === systemId
){
currentUserIsHere = true;
currentUserOnMap = true;
if(
currentCharacterLog &&
currentCharacterLog.system &&
currentCharacterLog.system.id === systemId
){
currentUserIsHere = true;
currentUserOnMap = true;
// set current location data for header update
headerUpdateData.currentSystemId = $(system).data('id');
headerUpdateData.currentSystemName = currentCharacterLog.system.name;
}
// set current location data for header update
headerUpdateData.currentSystemId = $(system).data('id');
//headerUpdateData.currentSystemName = currentCharacterLog.system.name;
}
system.updateSystemUserData(map, tempUserData, currentUserIsHere);

View File

@@ -86,7 +86,13 @@ define([
if(validDeleteSystems.length){
var msg = '';
if(validDeleteSystems.length === 1){
msg = 'Delete system "' + $(validDeleteSystems[0]).data('name') + '" and all its connections?';
var deleteSystem = $(validDeleteSystems[0]);
var systemName = deleteSystem.data('name');
var systemAlias = deleteSystem.getSystemInfo( ['alias'] );
var systemNameStr = (systemName === systemAlias) ? '"' + systemName + '"' : '"' + systemAlias + '" (' + systemName + ')';
systemNameStr = '<span class="txt-color txt-color-warning">' + systemNameStr + '</span>';
msg = 'Delete system ' + systemNameStr + ' and all its connections?';
}else{
msg = 'Delete ' + validDeleteSystems.length + ' selected systems and their connections?';
}

View File

@@ -63,6 +63,7 @@ define([
Init.routes = initData.routes;
Init.notificationStatus = initData.notificationStatus;
Init.activityLogging = initData.activityLogging;
Init.routeSearch = initData.routeSearch;
// init tab change observer, Once the timers are available
Page.initTabChangeObserver();

View File

@@ -164,7 +164,7 @@ define([
height: [ moduleHeight + 'px', [ 400, 15 ] ]
},{
duration: 400,
easing: 'easeInSine',
easing: 'easeOutSine',
complete: function(){
moduleElement.removeClass( config.moduleClosedClass );
moduleElement.removeData();
@@ -172,10 +172,10 @@ define([
});
}else{
moduleElement.velocity('finish').velocity({
height: [ '36px', [ 400, 15 ] ]
height: [ '35px', [ 400, 15 ] ]
},{
duration: 400,
easing: 'easeInSine',
easing: 'easeOutSine',
complete: function(){
moduleElement.addClass( config.moduleClosedClass );
}

View File

@@ -51,9 +51,7 @@ define([
headUserShipClass: 'pf-head-user-ship', // class for "user settings" link
userShipImageClass: 'pf-head-user-ship-image', // class for "current user ship image"
headActiveUserClass: 'pf-head-active-user', // class for "active user" link
headCurrentLocationClass: 'pf-head-current-location', // class for "show current location" link
headProgramStatusClass: 'pf-head-program-status', // class for "program status" notification
headMapTrackingId: 'pf-head-map-tracking', // id for "map tracking" toggle (checkbox)
// footer
pageFooterId: 'pf-footer', // id for page footer
@@ -197,7 +195,7 @@ define([
href: '#'
}).html('&nbsp;&nbsp;Account').prepend(
$('<i>',{
class: 'fa fa-sliders fa-fw'
class: 'fa fa-user fa-fw'
})
).on('click', function(){
$(document).triggerMenuEvent('ShowSettingsDialog');
@@ -279,9 +277,9 @@ define([
$('<a>', {
class: 'list-group-item',
href: '#'
}).html('&nbsp;&nbsp;Status').prepend(
}).html('&nbsp;&nbsp;Information').prepend(
$('<i>',{
class: 'fa fa-info fa-fw'
class: 'fa fa-street-view fa-fw'
})
).on('click', function(){
$(document).triggerMenuEvent('ShowMapInfo');
@@ -292,7 +290,7 @@ define([
$('<a>', {
class: 'list-group-item',
href: '#'
}).html('&nbsp;&nbsp;Map config').prepend(
}).html('&nbsp;&nbsp;Configuration').prepend(
$('<i>',{
class: 'fa fa-gears fa-fw'
})
@@ -402,7 +400,7 @@ define([
userCharacterImageClass: config.userCharacterImageClass,
userShipClass: config.headUserShipClass,
userShipImageClass: config.userShipImageClass,
mapTrackingId: config.headMapTrackingId
mapTrackingId: Util.config.headMapTrackingId
};
var headRendered = Mustache.render(TplHead, moduleData);
@@ -431,7 +429,7 @@ define([
});
// current location
$('.' + config.headCurrentLocationClass).find('a').on('click', function(){
$('#' + Util.config.headCurrentLocationId).find('a').on('click', function(){
Util.getMapModule().getActiveMap().triggerMenuEvent('SelectSystem', {systemId: $(this).data('systemId') });
});
@@ -447,7 +445,7 @@ define([
});
// tracking toggle
var mapTrackingCheckbox = $('#' + config.headMapTrackingId);
var mapTrackingCheckbox = $('#' + Util.config.headMapTrackingId);
mapTrackingCheckbox.bootstrapToggle({
size: 'mini',
on: 'on',
@@ -494,7 +492,6 @@ define([
* load page footer
*/
$.fn.loadFooter = function(){
var pageElement = $(this);
var moduleData = {
@@ -727,7 +724,6 @@ define([
* updates the header with current user data
*/
$.fn.updateHeaderUserData = function(){
var userData = Util.getCurrentUserData();
var userInfoElement = $('.' + config.headUserCharacterClass);
@@ -771,7 +767,7 @@ define([
};
// check for changes
// check for character/ship changes ---------------------------------------------
if(
userData &&
userData.character
@@ -783,6 +779,9 @@ define([
newShipId = userData.character.log.ship.typeId;
newShipName = userData.character.log.ship.typeName;
}
// en/disable "map tracking" toggle
updateMapTrackingToggle(userData.character.logLocation);
}
var newCharactersOptionIds = userData.characters.map(function(data){
@@ -831,6 +830,19 @@ define([
}
};
/**
* update "map tracking" toggle in header
* @param status
*/
var updateMapTrackingToggle = function(status){
var mapTrackingCheckbox = $('#' + Util.config.headMapTrackingId);
if(status === true){
mapTrackingCheckbox.bootstrapToggle('enable');
}else{
mapTrackingCheckbox.bootstrapToggle('off').bootstrapToggle('disable');
}
};
/**
* delete active character log for the current user
*/
@@ -873,29 +885,22 @@ define([
* @param locationData
*/
var updateHeaderCurrentLocation = function(locationData){
var currentLocationElement = $('.' + config.headCurrentLocationClass);
var currentLocationElement = $('#' + Util.config.headCurrentLocationId);
var linkElement = currentLocationElement.find('a');
var textElement = linkElement.find('span');
if( linkElement.data('systemName') !== locationData.currentSystemName ){
var tempSystemName = locationData.currentSystemName;
var tempSystemId = locationData.currentSystemId;
if(
tempSystemName === undefined ||
tempSystemId === undefined
){
tempSystemName = false;
tempSystemId = false;
}
var tempSystemName = (locationData.currentSystemName) ? locationData.currentSystemName : false;
var tempSystemId = (locationData.currentSystemId) ? locationData.currentSystemId : 0;
if(
linkElement.data('systemName') !== tempSystemName ||
linkElement.data('systemId') !== tempSystemId
){
linkElement.data('systemName', tempSystemName);
linkElement.data('systemId', tempSystemId);
linkElement.toggleClass('disabled', !tempSystemId);
if(
tempSystemName !== false &&
tempSystemId !== false
){
if(tempSystemName !== false){
textElement.text(locationData.currentSystemName);
currentLocationElement.velocity('fadeIn', {duration: Init.animationSpeed.headerLink});
}else{

View File

@@ -16,6 +16,7 @@ define([
settingsDialogId: 'pf-settings-dialog', // id for "settings" dialog
settingsAccountContainerId: 'pf-settings-dialog-account', // id for the "account" container
settingsShareContainerId: 'pf-settings-dialog-share', // id for the "share" container
settingsCharacterContainerId: 'pf-settings-dialog-character', // id for the "character" container
// captcha
captchaKeyUpdateAccount: 'SESSION.CAPTCHA.ACCOUNT.UPDATE', // key for captcha reason
@@ -47,6 +48,7 @@ define([
id: config.settingsDialogId,
settingsAccountContainerId: config.settingsAccountContainerId,
settingsShareContainerId: config.settingsShareContainerId,
settingsCharacterContainerId: config.settingsCharacterContainerId,
userData: Init.currentUserData,
captchaImageWrapperId: config.captchaImageWrapperId,
captchaImageId: config.captchaImageId,
@@ -193,7 +195,7 @@ define([
accountSettingsDialog.find('.navbar a').on('shown.bs.tab', function(e){
// init "toggle" switches on current active tab
accountSettingsDialog.find( $(this).attr('href') ).find('input[type="checkbox"]').bootstrapToggle({
accountSettingsDialog.find( $(this).attr('href') ).find('input[data-toggle="toggle"][type="checkbox"]').bootstrapToggle({
on: '<i class="fa fa-fw fa-check"></i>&nbsp;Enable',
off: 'Disable&nbsp;<i class="fa fa-fw fa-ban"></i>',
onstyle: 'success',

View File

@@ -27,7 +27,7 @@ define([
var data = {
logoContainerId: config.creditsDialogLogoContainerId,
version: $('body').data('version')
version: Util.getVersion()
};
var content = Mustache.render(template, data);

View File

@@ -211,6 +211,9 @@ define([
// name
tempData.name = tempSystemData.name;
// alias
tempData.alias = (tempSystemData.alias === tempSystemData.name) ? '' : tempSystemData.alias;
// region
tempData.region = tempSystemData.region.name;
@@ -339,6 +342,9 @@ define([
},{
title: 'system',
data: 'name'
},{
title: 'alias',
data: 'alias'
},{
title: 'region',
data: 'region'

View File

@@ -20,6 +20,8 @@ define([
dialogMapSettingsContainerId: 'pf-map-dialog-settings', // id for the "settings" container
dialogMapDownloadContainerId: 'pf-map-dialog-download', // id for the "download" container
deleteExpiredConnectionsId: 'pf-map-dialog-delete-connections', // id for "deleteExpiredConnections" checkbox
characterSelectId: 'pf-map-dialog-character-select', // id for "character" select
corporationSelectId: 'pf-map-dialog-corporation-select', // id for "corporation" select
allianceSelectId: 'pf-map-dialog-alliance-select', // id for "alliance" select
@@ -103,6 +105,7 @@ define([
var accessCharacter = [];
var accessCorporation = [];
var accessAlliance = [];
var deleteExpiredConnections = true;
if(mapData !== false){
// set current map information
@@ -115,6 +118,8 @@ define([
accessCharacter = mapData.config.access.character;
accessCorporation = mapData.config.access.corporation;
accessAlliance = mapData.config.access.alliance;
deleteExpiredConnections = mapData.config.deleteExpiredConnections;
}
// render main dialog -----------------------------------------------------
@@ -144,6 +149,9 @@ define([
hideDownloadTab: hideDownloadTab,
// settings tab --------------
deleteExpiredConnectionsId : config.deleteExpiredConnectionsId,
deleteExpiredConnections: deleteExpiredConnections,
characterSelectId: config.characterSelectId,
corporationSelectId: config.corporationSelectId,
allianceSelectId: config.allianceSelectId,
@@ -207,10 +215,10 @@ define([
var selectField = $(this);
var selectValues = selectField.val();
if(selectValues === null){
selectField.parents('.form-group').addClass('has-error');
}else{
if(selectValues.length > 0){
selectField.parents('.form-group').removeClass('has-error');
}else{
selectField.parents('.form-group').addClass('has-error');
}
});
@@ -223,12 +231,20 @@ define([
var dialogContent = mapInfoDialog.find('.modal-content');
dialogContent.showLoadingAnimation();
var newMapData = {formData: form.getFormValues()};
// get form data
var formData = form.getFormValues();
// checkbox fix -> settings tab
if( form.find('#' + config.deleteExpiredConnectionsId).length ){
formData.deleteExpiredConnections = formData.hasOwnProperty('deleteExpiredConnections') ? parseInt( formData.deleteExpiredConnections ) : 0;
}
var requestData = {formData: formData};
$.ajax({
type: 'POST',
url: Init.path.saveMap,
data: newMapData,
data: requestData,
dataType: 'json'
}).done(function(responseData){

View File

@@ -165,7 +165,7 @@ define([
title: 'Σ&nbsp;&nbsp;',
searchable: false,
width: 20,
className: ['text-right', 'hidden-xs', 'hidden-sm', 'separator-right'].join(' '),
className: ['text-right', 'separator-right'].join(' ') ,
data: 'systemSum',
render: {
_: renderNumericColumn
@@ -208,7 +208,7 @@ define([
title: 'Σ&nbsp;&nbsp;',
searchable: false,
width: 20,
className: ['text-right', 'hidden-xs', 'hidden-sm', 'separator-right'].join(' '),
className: ['text-right', 'separator-right'].join(' '),
data: 'connectionSum',
render: {
_: renderNumericColumn
@@ -251,7 +251,7 @@ define([
title: 'Σ&nbsp;&nbsp;',
searchable: false,
width: 20,
className: ['text-right', 'hidden-xs', 'hidden-sm', 'separator-right'].join(' '),
className: ['text-right', 'separator-right'].join(' '),
data: 'signatureSum',
render: {
_: renderNumericColumn

View File

@@ -139,7 +139,7 @@ define([
placeholder: 'System name',
allowClear: true,
maximumSelectionLength: options.maxSelectionLength,
escapeMarkup: function (markup) {
escapeMarkup: function(markup){
// let our custom formatter work
return markup;
}
@@ -257,12 +257,12 @@ define([
dropdownParent: selectElement.parents('.modal-body'),
theme: 'pathfinder',
minimumInputLength: 3,
placeholder: '',
placeholder: options.type + ' names',
allowClear: false,
maximumSelectionLength: options.maxSelectionLength,
templateResult: formatResultData,
templateSelection: formatSelectionData,
escapeMarkup: function (markup) {
escapeMarkup: function(markup){
// let our custom formatter work
return markup;
}

View File

@@ -37,7 +37,7 @@ define([
moduleElementToolbarClass: 'pf-table-tools', // class for "module toolbar" element
moduleToolbarActionId: 'pf-system-info-collapse-container', // id for "module toolbar action" element
descriptionTextareaElementClass: 'pf-system-info-description', // class for "description" textarea element (xEditable)
descriptionTextareaTooltipClass: 'pf-system-info-description-tooltip' // class for "description" tooltip
descriptionTextareaCharCounter: 'pf-form-field-char-count' // class for "character counter" element for form field
};
// disable Module update temporary (until. some requests/animations) are finished
@@ -46,6 +46,9 @@ define([
// animation speed values
var animationSpeedToolbarAction = 200;
// max character length for system description
var maxDescriptionLength = 512;
/**
* set module observer and look for relevant system data to update
*/
@@ -69,7 +72,7 @@ define([
toolsActionElement.velocity('stop').velocity({
opacity: 1,
height: '75px'
height: '100%'
},{
duration: animationSpeedToolbarAction,
display: 'block',
@@ -176,6 +179,33 @@ define([
$('.' + config.descriptionArea).hideLoadingAnimation();
};
/**
* update a character counter field with current value length - maxCharLength
* @param field
* @param charCounterElement
* @param maxCharLength
*/
var updateCounter = function(field, charCounterElement, maxCharLength){
var value = field.val();
var inputLength = value.length;
// line breaks are 2 characters!
var newLines = value.match(/(\r\n|\n|\r)/g);
var addition = 0;
if (newLines != null) {
addition = newLines.length;
}
inputLength += addition;
charCounterElement.text(maxCharLength - inputLength);
if(maxCharLength <= inputLength){
charCounterElement.toggleClass('txt-color-red', true);
}else{
charCounterElement.toggleClass('txt-color-red', false);
}
};
/**
*
* @param parentElement
@@ -247,6 +277,7 @@ define([
rows: 5,
name: 'description',
inputclass: config.descriptionTextareaElementClass,
tpl: '<textarea maxlength="' + maxDescriptionLength + '"></textarea>',
params: function(params){
params.mapData = {
@@ -292,12 +323,24 @@ define([
});
// on xEditable open -------------------------------------------------------------------------
descriptionTextareaElement.on('shown', function(e){
descriptionTextareaElement.on('shown', function(e, editable){
var textarea = editable.input.$input;
// disable module update until description field is open
disableModuleUpdate = true;
// disable tooltip
tempModuleElement.find('.' + config.descriptionTextareaTooltipClass).tooltip('disable');
// create character counter
var charCounter = $('<kbd>', {
class: [config.descriptionTextareaCharCounter, 'txt-color', 'text-right'].join(' ')
});
textarea.parent().next().append(charCounter);
// update character counter
updateCounter(textarea, charCounter, maxDescriptionLength);
textarea.on('keyup', function(){
updateCounter($(this), charCounter, maxDescriptionLength);
});
});
// on xEditable close ------------------------------------------------------------------------
@@ -305,14 +348,9 @@ define([
var value = $(this).editable('getValue', true);
if(value.length === 0){
// show button if value is empty
hideToolsActionElement();
descriptionButton.show();
}else{
// enable tooltip
tempModuleElement.find('.' + config.descriptionTextareaTooltipClass).tooltip('enable');
}
// enable module update
@@ -338,23 +376,29 @@ define([
tooltipElements.tooltip();
// init system effect popover ----------------------------------------------------------------
var systemEffectData = Util.getSystemEffectData( systemData.security, systemData.effect);
var infoEffectElement = $(moduleElement).find('.' + config.systemInfoEffectInfoClass);
if(systemEffectData !== false){
var infoEffectElement = $(moduleElement).find('.' + config.systemInfoEffectInfoClass);
if(infoEffectElement.length){
// effect row exists -> get effect data
var systemEffectData = Util.getSystemEffectData( systemData.security, systemData.effect);
// transform data into table
var systemEffectTable = Util.getSystemEffectTable( systemEffectData );
if(systemEffectData !== false){
// transform data into table
var systemEffectTable = Util.getSystemEffectTable( systemEffectData );
infoEffectElement.popover({
html: true,
trigger: 'hover',
placement: 'top',
delay: 200,
title: 'System effects',
container: 'body',
content: systemEffectTable
});
infoEffectElement.popover({
html: true,
trigger: 'hover',
placement: 'top',
delay: 200,
title: 'System effects',
container: 'body',
content: systemEffectTable
});
}else{
// effect data not found (e.g. !unknown! shattered system) -> hide "popover" icon icon
infoEffectElement.children().hide();
}
}
// init static wormhole information ----------------------------------------------------------
@@ -421,7 +465,6 @@ define([
descriptionButtonClass: config.addDescriptionButtonClass,
moduleToolbarActionId: config.moduleToolbarActionId,
descriptionTextareaClass: config.descriptionTextareaElementClass,
descriptionTooltipClass: config.descriptionTextareaTooltipClass,
shatteredWormholeInfo: shatteredWormholeInfo,

View File

@@ -93,9 +93,9 @@ define([
var animationStatus = 'changed';
// search for an existing row (e.g. on mass "table refresh" [all routes])
// get rowIndex where column 0 (equals to "systemToData.name") matches rowData.systemToData.name
// get rowIndex where column 1 (equals to "systemToData.name") matches rowData.systemToData.name
var indexes = dataTable.rows().eq(0).filter( function (rowIdx) {
return (dataTable.cell(rowIdx, 0 ).data().name === rowData.systemToData.name);
return (dataTable.cell(rowIdx, 1 ).data().name === rowData.systemToData.name);
});
if(indexes.length > 0){
@@ -151,6 +151,7 @@ define([
mapIds: (rowData.hasOwnProperty('mapIds')) ? rowData.mapIds : [],
systemFromData: (rowData.hasOwnProperty('systemFromData')) ? rowData.systemFromData : {},
systemToData: (rowData.hasOwnProperty('systemToData')) ? rowData.systemToData : {},
skipSearch: (rowData.hasOwnProperty('skipSearch')) ? rowData.skipSearch | 0 : 0,
stargates: (rowData.hasOwnProperty('stargates')) ? rowData.stargates | 0 : 1,
jumpbridges: (rowData.hasOwnProperty('jumpbridges')) ? rowData.jumpbridges | 0 : 1,
wormholes: (rowData.hasOwnProperty('wormholes')) ? rowData.wormholes | 0 : 1,
@@ -301,7 +302,8 @@ define([
systemSelectOptions = dataStore.routes;
}
var maxSelectionLength = 4;
// max count of "default" target systems
var maxSelectionLength = Init.routeSearch.maxDefaultCount;
var data = {
id: config.routeSettingsDialogId,
@@ -459,7 +461,36 @@ define([
*/
var formatRouteData = function(routeData){
/**
* get status icon for route
* @param status
* @returns {string}
*/
let getStatusIcon= function(status){
let color = 'txt-color-danger';
let title = 'route not found';
switch(status){
case 1:
color = 'txt-color-success';
title = 'route exists';
break;
case 2:
color = 'txt-color-warning';
title = 'not search performed';
break;
}
return '<i class="fa fa-fw fa-circle txt-color ' + color + '" title="' + title + '"></i>';
};
// route status:
// 0: not found
// 1: round (OK)
// 2: not searched
var routeStatus = routeData.skipSearch ? 2 : 0;
var reloadButton = '<i class="fa ' + ['fa-refresh'].join(' ') + '"></i>';
var searchButton = '<i class="fa ' + ['fa-search-plus '].join(' ') + '"></i>';
var deleteButton = '<i class="fa ' + ['fa-close', 'txt-color', 'txt-color-redDarker'].join(' ') + '"></i>';
// default row data (e.g. no route found)
@@ -467,14 +498,14 @@ define([
systemFromData: routeData.systemFromData,
systemToData: routeData.systemToData,
jumps: {
value: 0,
formatted: '---'
value: 9999, // for sorting
formatted: ''
},
avgTrueSec: {
value: '',
formatted: ''
},
route: 'not found',
route: routeStatus === 2 ? 'search now' : 'not found',
stargates: routeData.stargates,
jumpbridges: routeData.jumpbridges,
wormholes: routeData.wormholes,
@@ -482,7 +513,7 @@ define([
wormholesCritical: routeData.wormholesCritical,
wormholesEOL: routeData.wormholesEOL,
reload: {
button: reloadButton
button: routeData.skipSearch ? searchButton : reloadButton
},
clear: {
button: deleteButton
@@ -496,6 +527,7 @@ define([
routeData.route.length > 0
){
// route data available
routeStatus = 1;
// add route Data
var jumpData = [];
@@ -503,20 +535,26 @@ define([
// loop all systems on this route
for(var i = 0; i < routeData.route.length; i++){
var routeNodeData = routeData.route[i];
let routeNodeData = routeData.route[i];
// format system name (camelCase)
var systemName = routeNodeData.system.charAt(0).toUpperCase() + routeNodeData.system.slice(1).toLowerCase();
let systemName = routeNodeData.system.charAt(0).toUpperCase() + routeNodeData.system.slice(1).toLowerCase();
var systemSec = Number(routeNodeData.security).toFixed(1).toString();
var tempSystemSec = systemSec;
let systemSec = Number(routeNodeData.security).toFixed(1).toString();
let tempSystemSec = systemSec;
if(tempSystemSec <= 0){
tempSystemSec = '0-0';
}
var systemSecClass = config.systemSecurityClassPrefix + tempSystemSec.replace('.', '-');
let systemSecClass = config.systemSecurityClassPrefix + tempSystemSec.replace('.', '-');
var system = '<i class="fa fa-square ' + systemSecClass + '" ';
// check for wormhole
let icon = 'fa-square';
if( /^J\d+$/.test(systemName) ){
icon = 'fa-dot-circle-o';
}
let system = '<i class="fa ' + icon + ' ' + systemSecClass + '" ';
system += 'data-toggle="tooltip" data-placement="bottom" data-container="body" ';
system += 'title="' + systemName + ' [' + systemSec + '] "></i>';
jumpData.push( system );
@@ -548,6 +586,12 @@ define([
tableRowData.route = jumpData.join(' ');
}
// route status data ----------------------------------------------------------------------
tableRowData.status = {
value: routeStatus,
formatted: getStatusIcon(routeStatus)
};
return tableRowData;
};
@@ -601,7 +645,7 @@ define([
var routesTable = table.DataTable( {
paging: false,
ordering: true,
order: [ 1, 'asc' ],
order: [[ 2, 'asc' ], [ 0, 'asc' ]],
info: false,
searching: false,
hover: false,
@@ -614,6 +658,17 @@ define([
{
targets: 0,
orderable: true,
title: '',
width: '10px',
class: ['text-center'].join(' '),
data: 'status',
render: {
_: 'formatted',
sort: 'value'
}
},{
targets: 1,
orderable: true,
title: 'system&nbsp;&nbsp;&nbsp;',
class: Util.config.popoverTriggerClass,
data: 'systemToData',
@@ -628,7 +683,7 @@ define([
});
}
},{
targets: 1,
targets: 2,
orderable: true,
title: '<span title="jumps" data-toggle="tooltip"><i class="fa fa-arrows-h"></i>&nbsp;&nbsp;</span>',
width: '18px',
@@ -639,7 +694,7 @@ define([
sort: 'value'
}
},{
targets: 2,
targets: 3,
orderable: true,
title: '<span title="average security" data-toggle="tooltip">&#216;&nbsp;&nbsp;</span>',
width: '15px',
@@ -650,12 +705,12 @@ define([
sort: 'value'
}
},{
targets: 3,
targets: 4,
orderable: false,
title: 'route',
data: 'route'
},{
targets: 4,
targets: 5,
title: '',
orderable: false,
searchable: false,
@@ -683,6 +738,7 @@ define([
mapIds: rowData.mapIds,
systemFromData: rowData.systemFromData,
systemToData: rowData.systemToData,
skipSearch: 0,
stargates: rowData.stargates ? 1 : 0,
jumpbridges: rowData.jumpbridges ? 1 : 0,
wormholes: rowData.wormholes ? 1 : 0,
@@ -696,7 +752,7 @@ define([
});
}
},{
targets: 5,
targets: 6,
title: '',
orderable: false,
searchable: false,
@@ -845,15 +901,24 @@ define([
// init search routes dialog --------------------------------------------------------------
moduleElement.find('.' + config.systemModuleHeadlineIconSearch).on('click', function(e){
var dialogData = {
moduleElement: moduleElement,
mapId: mapId,
systemFromData: systemFromData,
dataTable: routesTable
};
let maxRouteSearchLimit = this.Init.routeSearch.limit;
showFindRouteDialog(dialogData);
});
if(routesTable.rows().count() >= maxRouteSearchLimit){
// max routes limit reached -> show warning
Util.showNotify({title: 'Route limit reached', text: 'Serch is limited by ' + maxRouteSearchLimit, type: 'warning'});
}else{
var dialogData = {
moduleElement: moduleElement,
mapId: mapId,
systemFromData: systemFromData,
dataTable: routesTable
};
showFindRouteDialog(dialogData);
}
}.bind({
Init: Init
}));
// init settings dialog -------------------------------------------------------------------
moduleElement.find('.' + config.systemModuleHeadlineIconSettings).on('click', function(e){
@@ -897,6 +962,10 @@ define([
var requestRouteData = [];
var currentTimestamp = Util.getServerTime().getTime();
// Skip some routes from search
// -> this should help to throttle requests (heavy CPU load for route calculation)
var defaultRoutesCount = Init.routeSearch.defaultCount;
for(var i = 0; i < systemsTo.length; i++){
var systemToData = systemsTo[i];
@@ -920,7 +989,8 @@ define([
var searchData = {
mapIds: [mapId],
systemFromData: systemFromData,
systemToData: systemToData
systemToData: systemToData,
skipSearch: requestRouteData.length >= defaultRoutesCount
};
requestRouteData.push( getRouteRequestDataFromRowData( searchData ));

View File

@@ -50,7 +50,8 @@ define([
// xEditable
moduleIcon: 'pf-module-icon-button', // class for "filter" - icons
editableDescriptionInputClass: 'pf-editable-description', // class for "description" textarea
editableFilterInputClass: 'pf-editable-filter' // class for "filter" selects
editableFilterElementClass: 'pf-editable-filter', // class for "filter" selects (not active)
editableFilterSelectPopoverClass: 'pf-editable-filter-active' // class for active "filter" selects (popover)
};
// lock Signature Table update temporary (until. some requests/animations) are finished
@@ -106,13 +107,10 @@ define([
* @returns {Array}
*/
var getSignatureTableData = function(){
var signatureTableApi = signatureTable.api();
var tableData = [];
signatureTableApi.rows().eq(0).each(function(idx){
var row = signatureTableApi.row(idx);
// default row data
var defaultRowData = row.data();
@@ -125,22 +123,23 @@ define([
if(editableFields.length > 0){
var values = $(editableFields).editable('getValue');
// convert to lower for better compare options
values.name = values.name.toLowerCase();
if(values.name){
// convert to lower for better compare options
values.name = values.name.toLowerCase();
// add pk for this row
values.id = defaultRowData.id;
// add pk for this row
values.id = defaultRowData.id;
// add updated for this row
values.updated = defaultRowData.updated;
// add updated for this row
values.updated = defaultRowData.updated;
// add row index
values.index = idx;
// add row index
values.index = idx;
tableData.push( values );
tableData.push( values );
}
}
}
});
return tableData;
@@ -456,6 +455,39 @@ define([
*/
$.fn.updateSignatureTableByClipboard = function(systemData, clipboard, options){
var requestData = function(){
// lock update function until request is finished
lockSignatureTable();
// lock copy during request (prevent spamming (ctrl + c )
disableCopyFromClipboard = true;
var requestData = {
signatures: signatureData,
deleteOld: (options.deleteOld) ? 1 : 0,
systemId: parseInt(systemData.id)
};
$.ajax({
type: 'POST',
url: Init.path.saveSignatureData,
data: requestData,
dataType: 'json'
}).done(function(responseData){
unlockSignatureTable(true);
// updates table with new/updated signature information
moduleElement.updateSignatureTable(responseData.signatures, false);
}).fail(function( jqXHR, status, error) {
var reason = status + ' ' + error;
Util.showNotify({title: jqXHR.status + ': Update signatures', text: reason, type: 'warning'});
$(document).setProgramStatus('problem');
}).always(function() {
unlockSignatureTable(true);
disableCopyFromClipboard = false;
});
};
// check if copy&paste is enabled
if( !disableCopyFromClipboard ){
var moduleElement = $(this);
@@ -464,38 +496,30 @@ define([
var signatureData = parseSignatureString(systemData, clipboard);
if(signatureData.length > 0){
// save signature data
// valid signature data parsed
// lock update function until request is finished
lockSignatureTable();
// check if signatures will be added to a system where character is currently in
// if user is not in any system -> id === undefined -> no "confirmation required
var currentLocationData = Util.getCurrentLocationData();
if(
currentLocationData.id &&
currentLocationData.id !== systemData.id
){
// lock copy during request (prevent spamming (ctrl + c )
disableCopyFromClipboard = true;
var systemNameStr = (systemData.name === systemData.alias) ? '"' + systemData.name + '"' : '"' + systemData.alias + '" (' + systemData.name + ')';
systemNameStr = '<span class="txt-color txt-color-warning">' + systemNameStr + '</span>';
var requestData = {
signatures: signatureData,
deleteOld: (options.deleteOld) ? 1 : 0,
systemId: parseInt(systemData.id)
};
$.ajax({
type: 'POST',
url: Init.path.saveSignatureData,
data: requestData,
dataType: 'json'
}).done(function(responseData){
unlockSignatureTable(true);
// updates table with new/updated signature information
moduleElement.updateSignatureTable(responseData.signatures, false);
}).fail(function( jqXHR, status, error) {
var reason = status + ' ' + error;
Util.showNotify({title: jqXHR.status + ': Update signatures', text: reason, type: 'warning'});
$(document).setProgramStatus('problem');
}).always(function() {
unlockSignatureTable(true);
disableCopyFromClipboard = false;
});
var msg = '';
msg += 'Update signatures in ' + systemNameStr + ' ? This not your current location, "' + currentLocationData.name + '" !';
bootbox.confirm(msg, function(result) {
if(result){
requestData();
}
});
}else{
// current system selected -> no "confirmation" required
requestData();
}
}
}
};
@@ -762,19 +786,6 @@ define([
};
Render.showModule(moduleConfig, moduleData);
// event listener for global "paste" signatures into the page -------------------------------------------------
$(document).off('paste').on('paste', function(e){
// do not read clipboard if pasting into form elements
if(
$(e.target).prop('tagName').toLowerCase() !== 'input' &&
$(e.target).prop('tagName').toLowerCase() !== 'textarea'
){
var clipboard = (e.originalEvent || e).clipboardData.getData('text/plain');
moduleElement.updateSignatureTableByClipboard(systemData, clipboard, {});
}
});
};
/**
@@ -1387,9 +1398,12 @@ define([
* @returns {*}
*/
$.fn.drawSignatureTable = function(signatureData, systemData){
var moduleElement = $(this);
// setup filter select in footer
// column indexes that need a filter select
var filterColumnIndexes = [2];
// create new signature table ---------------------------------------------------------------------------------
var table = $('<table>', {
class: ['display', 'compact', 'nowrap', config.sigTableClass, config.sigTablePrimaryClass].join(' ')
@@ -1409,38 +1423,26 @@ define([
var dataTableOptions = {
data: signatureData,
drawCallback: function(settings){
this.api().columns(filterColumnIndexes).every(function(){
var column = this;
var footerColumnElement = $(column.footer());
var filterSelect = footerColumnElement.find('.editable');
// update select values
filterSelect.editable('option', 'source', getColumnTableDataForFilter(column));
});
},
initComplete: function (settings, json){
// setup filter select in footer
// column indexes that need a filter select
var filterColumnIndexes = [2];
this.api().columns(filterColumnIndexes).every(function(){
var column = this;
var headerLabel = $(column.header()).text();
var selectField = $('<a class="pf-editable ' +
config.moduleIcon + ' ' +
config.editableFilterInputClass +
config.editableFilterElementClass +
'" href="#" data-type="select" data-name="' + headerLabel + '"></a>');
// get all available options from column
var source = {};
column.data().unique().sort(function(a,b){
// sort alphabetically
var valA = a.filter.toLowerCase();
var valB = b.filter.toLowerCase();
if(valA < valB) return -1;
if(valA > valB) return 1;
return 0;
}).each(function(callData){
if(callData.filter){
source[callData.filter] = callData.filter;
}
});
// add empty option
source[0] = '';
// add field to footer
selectField.appendTo( $(column.footer()).empty() );
@@ -1449,8 +1451,8 @@ define([
onblur: 'submit',
title: 'filter',
showbuttons: false,
source: source,
value: 0
source: getColumnTableDataForFilter(column),
inputclass: config.editableFilterSelectPopoverClass
});
selectField.on('save', { column: column }, function(e, params) {
@@ -1472,6 +1474,34 @@ define([
return signatureTable;
};
/**
* get unique column data from column object for select filter options
* @param column
* @returns {{}}
*/
var getColumnTableDataForFilter = function(column){
// get all available options from column
var source = {};
column.data().unique().sort(function(a,b){
// sort alphabetically
var valA = a.filter.toLowerCase();
var valB = b.filter.toLowerCase();
if(valA < valB) return -1;
if(valA > valB) return 1;
return 0;
}).each(function(callData){
if(callData.filter){
source[callData.filter] = callData.filter;
}
});
// add empty option
source[0] = '';
return source;
};
/**
* format signature data array into dataTable structure
* @param systemData
@@ -1831,8 +1861,9 @@ define([
/**
* set module observer and look for relevant signature data to update
* @param moduleElement
* @param systemData
*/
var setModuleObserver = function(moduleElement){
var setModuleObserver = function(moduleElement, systemData){
var tablePrimaryElement = $('.' + config.sigTablePrimaryClass);
var dataTablePrimary = signatureTable.DataTable();
var signatureTableApi = signatureTable.api();
@@ -1859,6 +1890,20 @@ define([
// check delete button
checkDeleteSignaturesButton();
});
// event listener for global "paste" signatures into the page -------------------------------------------------
$(document).off('paste').on('paste', function(e){
// do not read clipboard if pasting into form elements
if(
$(e.target).prop('tagName').toLowerCase() !== 'input' &&
$(e.target).prop('tagName').toLowerCase() !== 'textarea'
){
var clipboard = (e.originalEvent || e).clipboardData.getData('text/plain');
moduleElement.updateSignatureTableByClipboard(systemData, clipboard, {});
}
});
};
/**
@@ -1967,16 +2012,19 @@ define([
type: 'POST',
url: Init.path.getSignatures,
data: requestData,
dataType: 'json'
dataType: 'json',
context: {
systemData: systemData
}
}).done(function(signatureData){
var signatureTableData = formatSignatureData(systemData, signatureData, fullSignatureOptions);
var signatureTableData = formatSignatureData(this.systemData, signatureData, fullSignatureOptions);
// draw signature table
moduleElement.drawSignatureTable(signatureTableData, systemData);
moduleElement.drawSignatureTable(signatureTableData, this.systemData);
// set module observer
setModuleObserver(moduleElement);
setModuleObserver(moduleElement, this.systemData);
}).fail(function( jqXHR, status, error) {
var reason = status + ' ' + error;
Util.showNotify({title: jqXHR.status + ': Get signatures', text: reason, type: 'warning'});
@@ -1991,7 +2039,6 @@ define([
* @param systemData
*/
$.fn.drawSignatureTableModule = function(systemData){
var parentElement = $(this);
// show module
@@ -2004,7 +2051,6 @@ define([
unlockSignatureTable(true);
}
});
}
};

View File

@@ -34,6 +34,7 @@ define([
// head
headMapTrackingId: 'pf-head-map-tracking', // id for "map tracking" toggle (checkbox)
headCharacterSwitchId: 'pf-head-character-switch', // id for "character switch" popover
headCurrentLocationId: 'pf-head-current-location', // id for "show current location" element
// menu
menuButtonFullScreenId: 'pf-menu-button-fullscreen', // id for menu button "fullscreen"
@@ -393,22 +394,33 @@ define([
*/
$.fn.getFormValues = function(){
var form = $(this);
var formData = {};
var values = form.serializeArray();
// add "unchecked" checkboxes as well
values = values.concat(
form.find('input[type=checkbox]:not(:checked)').map(
function() {
return {name: this.name, value: 0};
}).get()
);
for(let field of values){
// check for numeric values -> convert to Int
let value = ( /^\d+$/.test(field.value) ) ? parseInt(field.value) : field.value;
$.each(form.serializeArray(), function(i, field) {
if(field.name.indexOf('[]') !== -1){
// array field
var key = field.name.replace('[]', '');
if(! $.isArray(formData[key]) ){
if( !$.isArray(formData[key]) ){
formData[key] = [];
}
formData[key].push( field.value);
formData[key].push( value);
}else{
formData[field.name] = field.value;
formData[field.name] = value;
}
});
}
// get xEditable values
var editableValues = form.find('.' + config.formEditableFieldClass).editable('getValue');
@@ -841,12 +853,19 @@ define([
* ==========================================================================================================
*/
/**
* get current Pathfinder version number
* @returns {*|jQuery}
*/
var getVersion = function(){
return $('body').data('version');
};
/**
* show current program version information in browser console
*/
var showVersionInfo = function(){
var versionNumber = $('body').data('version');
console.info('PATHFINDER ' + versionNumber);
console.info('PATHFINDER ' + getVersion());
};
/**
@@ -1469,7 +1488,10 @@ define([
var currentMapUserData = false;
if( mapId === parseInt(mapId, 10) ){
if(
mapId === parseInt(mapId, 10) &&
Init.currentMapUserData
){
// search for a specific map
for(var i = 0; i < Init.currentMapUserData.length; i++){
if(Init.currentMapUserData[i].config.id === mapId){
@@ -1703,6 +1725,18 @@ define([
return Init.currentSystemData;
};
/**
* get current location data
* -> system data where current user is located
* @returns {{id: *, name: *}}
*/
var getCurrentLocationData = function(){
var currentLocationLink = $('#' + config.headCurrentLocationId).find('a');
return {
id: currentLocationLink.data('systemId'),
name: currentLocationLink.data('systemName')
};
};
/**
* get all "open" dialog elements
@@ -1831,6 +1865,7 @@ define([
return {
config: config,
getVersion: getVersion,
showVersionInfo: showVersionInfo,
initPrototypes: initPrototypes,
initDefaultBootboxConfig: initDefaultBootboxConfig,
@@ -1867,6 +1902,7 @@ define([
getCurrentUserData: getCurrentUserData,
setCurrentSystemData: setCurrentSystemData,
getCurrentSystemData: getCurrentSystemData,
getCurrentLocationData: getCurrentLocationData,
getCurrentUserInfo: getCurrentUserInfo,
getCurrentCharacterLog: getCurrentCharacterLog,
setDestination: setDestination,

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 382 KiB

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

View File

@@ -1 +0,0 @@
{"version":3,"sources":["app.js.src.js"],"names":["mainScriptPath","document","body","getAttribute","jsBaseUrl","requirejs","config","baseUrl","paths","layout","dialog","templates","img","login","mappage","setup","jquery","bootstrap","text","mustache","localForage","velocity","velocityUI","slidebars","jsPlumb","farahey","customScrollbar","mousewheel","xEditable","morris","raphael","bootbox","easyPieChart","peityInlineChart","dragToSelect","hoverIntent","fullScreen","select2","validator","lazylinepainter","blueImpGallery","blueImpGalleryHelper","blueImpGalleryBootstrap","bootstrapConfirmation","bootstrapToggle","lazyload","easePack","tweenLite","datatables.net","datatables.net-buttons","datatables.net-buttons-html","datatables.net-responsive","datatables.net-select","pnotify","pnotify.buttons","pnotify.confirm","pnotify.nonblock","pnotify.desktop","pnotify.history","pnotify.callbacks","pnotify.reference","shim","deps","exports","require"],"mappings":"AACA,GAAIA,gBAAiBC,SAASC,KAAKC,aAAa,eAI5CC,UAAYH,SAASC,KAAKC,aAAa,eAG3CE,WAAUC,QACNC,QAAS,KAETC,OACIC,OAAQ,SACRH,OAAQ,aACRI,OAAQ,gBACRC,UAAW,kBACXC,IAAK,YAGLC,MAAO,cACPC,QAAS,gBACTC,MAAO,cAEPC,OAAQ,uBACRC,UAAW,oBACXC,KAAM,qBACNC,SAAU,mBACVC,YAAa,sBACbC,SAAU,mBACVC,WAAY,sBACZC,UAAW,gBACXC,QAAS,wBACTC,QAAS,kBACTC,gBAAiB,kCACjBC,WAAY,4BACZC,UAAW,6BACXC,OAAQ,iBACRC,QAAS,kBACTC,QAAS,kBACTC,aAAc,8BACdC,iBAAkB,uBAClBC,aAAc,0BACdC,YAAa,kCACbC,WAAY,4BACZC,QAAS,kBACTC,UAAW,oBACXC,gBAAiB,uCACjBC,eAAgB,sBAChBC,qBAAsB,qBACtBC,wBAAyB,8BACzBC,sBAAuB,6BACvBC,gBAAiB,4BACjBC,SAAU,0BAGVC,SAAU,mBACVC,UAAW,oBAGXC,iBAAkB,6DAClBC,yBAA0B,yDAC1BC,8BAA+B,oDAC/BC,4BAA6B,+DAC7BC,wBAAyB,uDAGzBC,QAAS,sBACTC,kBAAmB,8BACnBC,kBAAmB,8BACnBC,mBAAoB,+BACpBC,kBAAmB,8BACnBC,kBAAmB,8BACnBC,oBAAqB,gCACrBC,oBAAqB,iCAEzBC,MACI5C,WACI6C,MAAO,WAEXrC,SACIqC,MAAO,YAEXzC,UACIyC,MAAO,WAEXxC,YACIwC,MAAO,aAEXvC,WACIuC,MAAO,WAEXpC,iBACIoC,MAAO,SAAU,eAErBd,kBACIc,MAAO,WAEXb,0BACIa,MAAO,mBAEXZ,+BACIY,MAAO,2BAEXX,6BACIW,MAAO,mBAEXV,yBACIU,MAAO,mBAEXlC,WACIkC,MAAO,cAEX/B,SACI+B,MAAO,SAAU,aACjBC,QAAS,WAEblC,QACIiC,MAAO,SAAU,WACjBC,QAAS,UAEbV,SACIS,MAAQ,WAEZ9B,cACI8B,MAAQ,WAEZ7B,kBACI6B,MAAQ,WAEZ5B,cACI4B,MAAQ,WAEZ3B,aACI2B,MAAQ,WAEZ1B,YACI0B,MAAQ,WAEZzB,SACIyB,MAAQ,UACRC,QAAS,WAEbzB,WACIwB,MAAQ,SAAU,cAEtBvB,iBACIuB,MAAQ,SAAU,cAEtBtB,gBACIsB,MAAQ,WAEZnB,uBACImB,MAAQ,cAEZlB,iBACIkB,MAAQ,WAEZjB,UACIiB,MAAQ,aAQpBE,SAAQ1D,QACJC,QAASH,WAIbC,YAAYL","file":"app.js.map"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":3,"sources":["bootstrap-image-gallery.js.src.js"],"names":["factory","define","amd","window","jQuery","blueimp","Gallery","$","extend","prototype","options","useBootstrapModal","close","imageFactory","videoFactory","textFactory","modalFactory","obj","callback","factoryInterface","this","call","that","modalTemplate","container","children","modal","clone","css","on","event","target","preventDefault","stopPropagation","element","type","addClass","find","text","title","String","fromCharCode","append","removeClass"],"mappings":"CAaE,SAAUA,GACR,YACsB,mBAAXC,SAAyBA,OAAOC,IACvCD,QACI,SACA,kBACDD,GAEHA,EACIG,OAAOC,OACPD,OAAOE,QAAQC,UAGzB,SAAUC,EAAGD,GACX,YAEAC,GAAEC,OAAOF,EAAQG,UAAUC,SACvBC,mBAAmB,GAGvB,IAAIC,GAAQN,EAAQG,UAAUG,MAC1BC,EAAeP,EAAQG,UAAUI,aACjCC,EAAeR,EAAQG,UAAUK,aACjCC,EAAcT,EAAQG,UAAUM,WAEpCR,GAAEC,OAAOF,EAAQG,WACbO,aAAc,SAAUC,EAAKC,EAAUC,EAAkBnB,GACrD,IAAKoB,KAAKV,QAAQC,mBAAqBQ,EACnC,MAAOnB,GAAQqB,KAAKD,KAAMH,EAAKC,EAAUC,EAE7C,IAAIG,GAAOF,KACPG,EAAgBhB,EAAEa,KAAKI,WAAWC,SAAS,UAC3CC,EAAQH,EAAcI,QAAQC,IAAI,UAAW,SAASC,GAAG,QAAS,SAAUC,GAG5E,GAAIA,EAAMC,SAAWL,EAAM,IACvBI,EAAMC,SAAWL,EAAMD,WAAW,GAAI,CACtCK,EAAME,gBACNF,GAAMG,iBACNX,GAAKV,WAGTsB,EAAUlC,EAAQqB,KAAKD,KAAMH,EAAK,SAAUa,GAC5CZ,GACIiB,KAAML,EAAMK,KACZJ,OAAQL,EAAM,IAElBA,GAAMU,SAAS,OAChBjB,EACHO,GAAMW,KAAK,gBAAgBC,KAAKJ,EAAQK,OAASC,OAAOC,aAAa,KACrEf,GAAMW,KAAK,eAAeK,OAAOR,EAEjC,OAAOR,GAAM,IAGjBb,aAAc,SAAUI,EAAKC,EAAUC,GACnC,MAAOC,MAAKJ,aAAaC,EAAKC,EAAUC,EAAkBN,IAG9DC,aAAc,SAAUG,EAAKC,EAAUC,GACnC,MAAOC,MAAKJ,aAAaC,EAAKC,EAAUC,EAAkBL,IAG9DC,YAAa,SAAUE,EAAKC,EAAUC,GAClC,MAAOC,MAAKJ,aAAaC,EAAKC,EAAUC,EAAkBJ,IAG9DH,MAAO,WACHQ,KAAKI,UAAUa,KAAK,UAAUM,YAAY,KAC1C/B,GAAMS,KAAKD","file":"bootstrap-image-gallery.js.map"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
!function(t,i,e,n){var r=t.fn.peity=function(i,e){l&&this.each(function(){var n=t(this),h=n.data("_peity");h?(i&&(h.type=i),t.extend(h.opts,e)):(h=new a(n,i,t.extend({},r.defaults[i],n.data("peity"),e)),n.change(function(){h.draw()}).data("_peity",h));h.draw()});return this},a=function(t,i,e){this.$el=t;this.type=i;this.opts=e},h=a.prototype,s=h.svgElement=function(e,n){return t(i.createElementNS("http://www.w3.org/2000/svg",e)).attr(n)},l="createElementNS"in i&&s("svg",{})[0].createSVGRect;h.draw=function(){var t=this.opts;r.graphers[this.type].call(this,t);t.after&&t.after.call(this,t)};h.fill=function(){var i=this.opts.fill;return t.isFunction(i)?i:function(t,e){return i[e%i.length]}};h.prepare=function(t,i){this.$svg||this.$el.hide().after(this.$svg=s("svg",{"class":"peity"}));return this.$svg.empty().data("peity",this).attr({height:i,width:t})};h.values=function(){return t.map(this.$el.text().split(this.opts.delimiter),function(t){return parseFloat(t)})};r.defaults={};r.graphers={};r.register=function(t,i,e){this.defaults[t]=i;this.graphers[t]=e};r.register("pie",{fill:["#ff9900","#fff4dd","#ffc66e"],radius:8},function(i){if(!i.delimiter){var n=this.$el.text().match(/[^0-9\.]/);i.delimiter=n?n[0]:","}n=t.map(this.values(),function(t){return t>0?t:0});if("/"==i.delimiter)var r=n[0],n=[r,e.max(0,n[1]-r)];for(var a=0,r=n.length,h=0;r>a;a++)h+=n[a];h||(r=2,h=1,n=[0,1]);var l=2*i.radius,l=this.prepare(i.width||l,i.height||l),a=l.width(),p=l.height(),o=a/2,f=p/2,p=e.min(o,f),i=i.innerRadius;"donut"==this.type&&!i&&(i=.5*p);for(var c=e.PI,u=this.fill(),d=this.scale=function(t,i){var n=t/h*c*2-c/2;return[i*e.cos(n)+o,i*e.sin(n)+f]},g=0,a=0;r>a;a++){var m=n[a],v=m/h;if(0!=v){if(1==v)if(i)var v=o-.01,y=f-p,w=f-i,v=s("path",{d:["M",o,y,"A",p,p,0,1,1,v,y,"L",v,w,"A",i,i,0,1,0,o,w].join(" ")});else v=s("circle",{cx:o,cy:f,r:p});else y=g+m,w=["M"].concat(d(g,p),"A",p,p,0,v>.5?1:0,1,d(y,p),"L"),i?w=w.concat(d(y,i),"A",i,i,0,v>.5?1:0,0,d(g,i)):w.push(o,f),g+=m,v=s("path",{d:w.join(" ")});v.attr("fill",u.call(this,m,a,n));l.append(v)}}});r.register("donut",t.extend(!0,{},r.defaults.pie),function(t){r.graphers.pie.call(this,t)});r.register("line",{delimiter:",",fill:"#c6d9fd",height:16,min:0,stroke:"#4d89f9",strokeWidth:1,width:32},function(t){var i=this.values();1==i.length&&i.push(i[0]);for(var r=e.max.apply(e,t.max==n?i:i.concat(t.max)),a=e.min.apply(e,t.min==n?i:i.concat(t.min)),h=this.prepare(t.width,t.height),l=t.strokeWidth,p=h.width(),o=h.height()-l,f=r-a,r=this.x=function(t){return t*(p/(i.length-1))},c=this.y=function(t){var i=o;f&&(i-=(t-a)/f*o);return i+l/2},u=c(e.max(a,0)),d=[0,u],g=0;g<i.length;g++)d.push(r(g),c(i[g]));d.push(p,u);t.fill&&h.append(s("polygon",{fill:t.fill,points:d.join(" ")}));l&&h.append(s("polyline",{fill:"none",points:d.slice(2,d.length-2).join(" "),stroke:t.stroke,"stroke-width":l,"stroke-linecap":"square"}))});r.register("bar",{delimiter:",",fill:["#4D89F9"],height:16,min:0,padding:.1,width:32},function(t){for(var i=this.values(),r=e.max.apply(e,t.max==n?i:i.concat(t.max)),a=e.min.apply(e,t.min==n?i:i.concat(t.min)),h=this.prepare(t.width,t.height),l=h.width(),p=h.height(),o=r-a,t=t.padding,f=this.fill(),c=this.x=function(t){return t*l/i.length},u=this.y=function(t){return p-(o?(t-a)/o*p:1)},d=0;d<i.length;d++){var g,m=c(d+t),v=c(d+1-t)-m,y=i[d],w=u(y),x=w;o?0>y?x=u(e.min(r,0)):w=u(e.max(a,0)):g=1;g=w-x;0==g&&(g=1,r>0&&o&&x--);h.append(s("rect",{fill:f.call(this,y,d,i),x:m,y:x,width:v,height:g}))}})}(jQuery,document,Math);
//# sourceMappingURL=jquery.peity.min.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
!function(o,i){"function"==typeof define&&define.amd?define("pnotify.buttons",["jquery","pnotify"],i):"object"==typeof exports&&"undefined"!=typeof module?module.exports=i(require("jquery"),require("./pnotify")):i(o.jQuery,o.PNotify)}(this,function(o,i){i.prototype.options.buttons={closer:!0,closer_hover:!0,sticker:!0,sticker_hover:!0,show_on_nonblock:!1,labels:{close:"Close",stick:"Stick",unstick:"Unstick"},classes:{closer:null,pin_up:null,pin_down:null}};i.prototype.modules.buttons={closer:null,sticker:null,init:function(i,s){var n=this;i.elem.on({mouseenter:function(o){!n.options.sticker||i.options.nonblock&&i.options.nonblock.nonblock&&!n.options.show_on_nonblock||n.sticker.trigger("pnotify:buttons:toggleStick").css("visibility","visible");!n.options.closer||i.options.nonblock&&i.options.nonblock.nonblock&&!n.options.show_on_nonblock||n.closer.css("visibility","visible")},mouseleave:function(o){n.options.sticker_hover&&n.sticker.css("visibility","hidden");n.options.closer_hover&&n.closer.css("visibility","hidden")}});this.sticker=o("<div />",{"class":"ui-pnotify-sticker","aria-role":"button","aria-pressed":i.options.hide?"false":"true",tabindex:"0",title:i.options.hide?s.labels.stick:s.labels.unstick,css:{cursor:"pointer",visibility:s.sticker_hover?"hidden":"visible"},click:function(){i.options.hide=!i.options.hide;i.options.hide?i.queueRemove():i.cancelRemove();o(this).trigger("pnotify:buttons:toggleStick")}}).bind("pnotify:buttons:toggleStick",function(){var s=null===n.options.classes.pin_up?i.styles.pin_up:n.options.classes.pin_up,e=null===n.options.classes.pin_down?i.styles.pin_down:n.options.classes.pin_down;o(this).attr("title",i.options.hide?n.options.labels.stick:n.options.labels.unstick).children().attr("class","").addClass(i.options.hide?s:e).attr("aria-pressed",i.options.hide?"false":"true")}).append("<span />").trigger("pnotify:buttons:toggleStick").prependTo(i.container);(!s.sticker||i.options.nonblock&&i.options.nonblock.nonblock&&!s.show_on_nonblock)&&this.sticker.css("display","none");this.closer=o("<div />",{"class":"ui-pnotify-closer","aria-role":"button",tabindex:"0",title:s.labels.close,css:{cursor:"pointer",visibility:s.closer_hover?"hidden":"visible"},click:function(){i.remove(!1);n.sticker.css("visibility","hidden");n.closer.css("visibility","hidden")}}).append(o("<span />",{"class":null===s.classes.closer?i.styles.closer:s.classes.closer})).prependTo(i.container);(!s.closer||i.options.nonblock&&i.options.nonblock.nonblock&&!s.show_on_nonblock)&&this.closer.css("display","none")},update:function(o,i){!i.closer||o.options.nonblock&&o.options.nonblock.nonblock&&!i.show_on_nonblock?this.closer.css("display","none"):i.closer&&this.closer.css("display","block");!i.sticker||o.options.nonblock&&o.options.nonblock.nonblock&&!i.show_on_nonblock?this.sticker.css("display","none"):i.sticker&&this.sticker.css("display","block");this.sticker.trigger("pnotify:buttons:toggleStick");this.closer.find("span").attr("class","").addClass(null===i.classes.closer?o.styles.closer:i.classes.closer);i.sticker_hover?this.sticker.css("visibility","hidden"):o.options.nonblock&&o.options.nonblock.nonblock&&!i.show_on_nonblock||this.sticker.css("visibility","visible");i.closer_hover?this.closer.css("visibility","hidden"):o.options.nonblock&&o.options.nonblock.nonblock&&!i.show_on_nonblock||this.closer.css("visibility","visible")}};o.extend(i.styling.brighttheme,{closer:"brighttheme-icon-closer",pin_up:"brighttheme-icon-sticker",pin_down:"brighttheme-icon-sticker brighttheme-icon-stuck"});o.extend(i.styling.jqueryui,{closer:"ui-icon ui-icon-close",pin_up:"ui-icon ui-icon-pin-w",pin_down:"ui-icon ui-icon-pin-s"});o.extend(i.styling.bootstrap2,{closer:"icon-remove",pin_up:"icon-pause",pin_down:"icon-play"});o.extend(i.styling.bootstrap3,{closer:"glyphicon glyphicon-remove",pin_up:"glyphicon glyphicon-pause",pin_down:"glyphicon glyphicon-play"});o.extend(i.styling.fontawesome,{closer:"fa fa-times",pin_up:"fa fa-pause",pin_down:"fa fa-play"})});
//# sourceMappingURL=pnotify.buttons.js.map

View File

@@ -1 +0,0 @@
{"version":3,"sources":["pnotify.buttons.js.src.js"],"names":["root","factory","define","amd","exports","module","require","jQuery","PNotify","this","$","prototype","options","buttons","closer","closer_hover","sticker","sticker_hover","show_on_nonblock","labels","close","stick","unstick","classes","pin_up","pin_down","modules","init","notice","that","elem","on","mouseenter","e","nonblock","trigger","css","mouseleave","class","aria-role","aria-pressed","hide","tabindex","title","cursor","visibility","click","queueRemove","cancelRemove","bind","styles","attr","children","addClass","append","prependTo","container","remove","update","find","extend","styling","brighttheme","jqueryui","bootstrap2","bootstrap3","fontawesome"],"mappings":"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","file":"pnotify.buttons.js.map"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"version":3,"sources":["?"],"names":["mainScriptPath","document","body","getAttribute","jsBaseUrl","requirejs","config","baseUrl","paths","layout","dialog","templates","img","login","mappage","setup","jquery","bootstrap","text","mustache","localForage","velocity","velocityUI","slidebars","jsPlumb","farahey","customScrollbar","mousewheel","xEditable","morris","raphael","bootbox","easyPieChart","peityInlineChart","dragToSelect","hoverIntent","fullScreen","select2","validator","lazylinepainter","blueImpGallery","blueImpGalleryHelper","blueImpGalleryBootstrap","bootstrapConfirmation","bootstrapToggle","lazyload","easePack","tweenLite","datatables.net","datatables.net-buttons","datatables.net-buttons-html","datatables.net-responsive","datatables.net-select","pnotify","pnotify.buttons","pnotify.confirm","pnotify.nonblock","pnotify.desktop","pnotify.history","pnotify.callbacks","pnotify.reference","shim","deps","exports","require"],"mappings":"AACA,GAAIA,gBAAiBC,SAASC,KAAKC,aAAa,eAI5CC,UAAYH,SAASC,KAAKC,aAAa,eAG3CE,WAAUC,QACNC,QAAS,KAETC,OACIC,OAAQ,SACRH,OAAQ,aACRI,OAAQ,gBACRC,UAAW,kBACXC,IAAK,YAGLC,MAAO,cACPC,QAAS,gBACTC,MAAO,cAEPC,OAAQ,uBACRC,UAAW,oBACXC,KAAM,qBACNC,SAAU,mBACVC,YAAa,sBACbC,SAAU,mBACVC,WAAY,sBACZC,UAAW,gBACXC,QAAS,wBACTC,QAAS,kBACTC,gBAAiB,kCACjBC,WAAY,4BACZC,UAAW,6BACXC,OAAQ,iBACRC,QAAS,kBACTC,QAAS,kBACTC,aAAc,8BACdC,iBAAkB,uBAClBC,aAAc,0BACdC,YAAa,kCACbC,WAAY,4BACZC,QAAS,kBACTC,UAAW,oBACXC,gBAAiB,uCACjBC,eAAgB,sBAChBC,qBAAsB,qBACtBC,wBAAyB,8BACzBC,sBAAuB,6BACvBC,gBAAiB,4BACjBC,SAAU,0BAGVC,SAAU,mBACVC,UAAW,oBAGXC,iBAAkB,6DAClBC,yBAA0B,yDAC1BC,8BAA+B,oDAC/BC,4BAA6B,+DAC7BC,wBAAyB,uDAGzBC,QAAS,sBACTC,kBAAmB,8BACnBC,kBAAmB,8BACnBC,mBAAoB,+BACpBC,kBAAmB,8BACnBC,kBAAmB,8BACnBC,oBAAqB,gCACrBC,oBAAqB,iCAEzBC,MACI5C,WACI6C,MAAO,WAEXrC,SACIqC,MAAO,YAEXzC,UACIyC,MAAO,WAEXxC,YACIwC,MAAO,aAEXvC,WACIuC,MAAO,WAEXpC,iBACIoC,MAAO,SAAU,eAErBd,kBACIc,MAAO,WAEXb,0BACIa,MAAO,mBAEXZ,+BACIY,MAAO,2BAEXX,6BACIW,MAAO,mBAEXV,yBACIU,MAAO,mBAEXlC,WACIkC,MAAO,cAEX/B,SACI+B,MAAO,SAAU,aACjBC,QAAS,WAEblC,QACIiC,MAAO,SAAU,WACjBC,QAAS,UAEbV,SACIS,MAAQ,WAEZ9B,cACI8B,MAAQ,WAEZ7B,kBACI6B,MAAQ,WAEZ5B,cACI4B,MAAQ,WAEZ3B,aACI2B,MAAQ,WAEZ1B,YACI0B,MAAQ,WAEZzB,SACIyB,MAAQ,UACRC,QAAS,WAEbzB,WACIwB,MAAQ,SAAU,cAEtBvB,iBACIuB,MAAQ,SAAU,cAEtBtB,gBACIsB,MAAQ,WAEZnB,uBACImB,MAAQ,cAEZlB,iBACIkB,MAAQ,WAEZjB,UACIiB,MAAQ,aAQpBE,SAAQ1D,QACJC,QAASH,WAIbC,YAAYL","file":"app.js.map"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"version":3,"sources":["?"],"names":["factory","define","amd","window","jQuery","blueimp","Gallery","$","extend","prototype","options","useBootstrapModal","close","imageFactory","videoFactory","textFactory","modalFactory","obj","callback","factoryInterface","this","call","that","modalTemplate","container","children","modal","clone","css","on","event","target","preventDefault","stopPropagation","element","type","addClass","find","text","title","String","fromCharCode","append","removeClass"],"mappings":"CAaE,SAAUA,GACR,YACsB,mBAAXC,SAAyBA,OAAOC,IACvCD,QACI,SACA,kBACDD,GAEHA,EACIG,OAAOC,OACPD,OAAOE,QAAQC,UAGzB,SAAUC,EAAGD,GACX,YAEAC,GAAEC,OAAOF,EAAQG,UAAUC,SACvBC,mBAAmB,GAGvB,IAAIC,GAAQN,EAAQG,UAAUG,MAC1BC,EAAeP,EAAQG,UAAUI,aACjCC,EAAeR,EAAQG,UAAUK,aACjCC,EAAcT,EAAQG,UAAUM,WAEpCR,GAAEC,OAAOF,EAAQG,WACbO,aAAc,SAAUC,EAAKC,EAAUC,EAAkBnB,GACrD,IAAKoB,KAAKV,QAAQC,mBAAqBQ,EACnC,MAAOnB,GAAQqB,KAAKD,KAAMH,EAAKC,EAAUC,EAE7C,IAAIG,GAAOF,KACPG,EAAgBhB,EAAEa,KAAKI,WAAWC,SAAS,UAC3CC,EAAQH,EAAcI,QAAQC,IAAI,UAAW,SAASC,GAAG,QAAS,SAAUC,GAG5E,GAAIA,EAAMC,SAAWL,EAAM,IACvBI,EAAMC,SAAWL,EAAMD,WAAW,GAAI,CACtCK,EAAME,gBACNF,GAAMG,iBACNX,GAAKV,WAGTsB,EAAUlC,EAAQqB,KAAKD,KAAMH,EAAK,SAAUa,GAC5CZ,GACIiB,KAAML,EAAMK,KACZJ,OAAQL,EAAM,IAElBA,GAAMU,SAAS,OAChBjB,EACHO,GAAMW,KAAK,gBAAgBC,KAAKJ,EAAQK,OAASC,OAAOC,aAAa,KACrEf,GAAMW,KAAK,eAAeK,OAAOR,EAEjC,OAAOR,GAAM,IAGjBb,aAAc,SAAUI,EAAKC,EAAUC,GACnC,MAAOC,MAAKJ,aAAaC,EAAKC,EAAUC,EAAkBN,IAG9DC,aAAc,SAAUG,EAAKC,EAAUC,GACnC,MAAOC,MAAKJ,aAAaC,EAAKC,EAAUC,EAAkBL,IAG9DC,YAAa,SAAUE,EAAKC,EAAUC,GAClC,MAAOC,MAAKJ,aAAaC,EAAKC,EAAUC,EAAkBJ,IAG9DH,MAAO,WACHQ,KAAKI,UAAUa,KAAK,UAAUM,YAAY,KAC1C/B,GAAMS,KAAKD","file":"bootstrap-image-gallery.js.map"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
!function(t,i,e,n){var r=t.fn.peity=function(i,e){l&&this.each(function(){var n=t(this),h=n.data("_peity");h?(i&&(h.type=i),t.extend(h.opts,e)):(h=new a(n,i,t.extend({},r.defaults[i],n.data("peity"),e)),n.change(function(){h.draw()}).data("_peity",h));h.draw()});return this},a=function(t,i,e){this.$el=t;this.type=i;this.opts=e},h=a.prototype,s=h.svgElement=function(e,n){return t(i.createElementNS("http://www.w3.org/2000/svg",e)).attr(n)},l="createElementNS"in i&&s("svg",{})[0].createSVGRect;h.draw=function(){var t=this.opts;r.graphers[this.type].call(this,t);t.after&&t.after.call(this,t)};h.fill=function(){var i=this.opts.fill;return t.isFunction(i)?i:function(t,e){return i[e%i.length]}};h.prepare=function(t,i){this.$svg||this.$el.hide().after(this.$svg=s("svg",{class:"peity"}));return this.$svg.empty().data("peity",this).attr({height:i,width:t})};h.values=function(){return t.map(this.$el.text().split(this.opts.delimiter),function(t){return parseFloat(t)})};r.defaults={};r.graphers={};r.register=function(t,i,e){this.defaults[t]=i;this.graphers[t]=e};r.register("pie",{fill:["#ff9900","#fff4dd","#ffc66e"],radius:8},function(i){if(!i.delimiter){var n=this.$el.text().match(/[^0-9\.]/);i.delimiter=n?n[0]:","}n=t.map(this.values(),function(t){return 0<t?t:0});if("/"==i.delimiter)var r=n[0],n=[r,e.max(0,n[1]-r)];for(var a=0,r=n.length,h=0;a<r;a++)h+=n[a];h||(r=2,h=1,n=[0,1]);var l=2*i.radius,l=this.prepare(i.width||l,i.height||l),a=l.width(),p=l.height(),o=a/2,f=p/2,p=e.min(o,f),i=i.innerRadius;"donut"==this.type&&!i&&(i=.5*p);for(var c=e.PI,u=this.fill(),d=this.scale=function(t,i){var n=t/h*c*2-c/2;return[i*e.cos(n)+o,i*e.sin(n)+f]},g=0,a=0;a<r;a++){var m=n[a],v=m/h;if(0!=v){if(1==v)if(i)var v=o-.01,y=f-p,w=f-i,v=s("path",{d:["M",o,y,"A",p,p,0,1,1,v,y,"L",v,w,"A",i,i,0,1,0,o,w].join(" ")});else v=s("circle",{cx:o,cy:f,r:p});else y=g+m,w=["M"].concat(d(g,p),"A",p,p,0,.5<v?1:0,1,d(y,p),"L"),i?w=w.concat(d(y,i),"A",i,i,0,.5<v?1:0,0,d(g,i)):w.push(o,f),g+=m,v=s("path",{d:w.join(" ")});v.attr("fill",u.call(this,m,a,n));l.append(v)}}});r.register("donut",t.extend(!0,{},r.defaults.pie),function(t){r.graphers.pie.call(this,t)});r.register("line",{delimiter:",",fill:"#c6d9fd",height:16,min:0,stroke:"#4d89f9",strokeWidth:1,width:32},function(t){var i=this.values();1==i.length&&i.push(i[0]);for(var r=e.max.apply(e,t.max==n?i:i.concat(t.max)),a=e.min.apply(e,t.min==n?i:i.concat(t.min)),h=this.prepare(t.width,t.height),l=t.strokeWidth,p=h.width(),o=h.height()-l,f=r-a,r=this.x=function(t){return t*(p/(i.length-1))},c=this.y=function(t){var i=o;f&&(i-=(t-a)/f*o);return i+l/2},u=c(e.max(a,0)),d=[0,u],g=0;g<i.length;g++)d.push(r(g),c(i[g]));d.push(p,u);t.fill&&h.append(s("polygon",{fill:t.fill,points:d.join(" ")}));l&&h.append(s("polyline",{fill:"none",points:d.slice(2,d.length-2).join(" "),stroke:t.stroke,"stroke-width":l,"stroke-linecap":"square"}))});r.register("bar",{delimiter:",",fill:["#4D89F9"],height:16,min:0,padding:.1,width:32},function(t){for(var i=this.values(),r=e.max.apply(e,t.max==n?i:i.concat(t.max)),a=e.min.apply(e,t.min==n?i:i.concat(t.min)),h=this.prepare(t.width,t.height),l=h.width(),p=h.height(),o=r-a,t=t.padding,f=this.fill(),c=this.x=function(t){return t*l/i.length},u=this.y=function(t){return p-(o?(t-a)/o*p:1)},d=0;d<i.length;d++){var g,m=c(d+t),v=c(d+1-t)-m,y=i[d],w=u(y),x=w;o?0>y?x=u(e.min(r,0)):w=u(e.max(a,0)):g=1;g=w-x;0==g&&(g=1,0<r&&o&&x--);h.append(s("rect",{fill:f.call(this,y,d,i),x:m,y:x,width:v,height:g}))}})}(jQuery,document,Math);
//# sourceMappingURL=jquery.peity.min.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
!function(o,i){"function"==typeof define&&define.amd?define("pnotify.buttons",["jquery","pnotify"],i):"object"==typeof exports&&"undefined"!=typeof module?module.exports=i(require("jquery"),require("./pnotify")):i(o.jQuery,o.PNotify)}(this,function(o,i){i.prototype.options.buttons={closer:!0,closer_hover:!0,sticker:!0,sticker_hover:!0,show_on_nonblock:!1,labels:{close:"Close",stick:"Stick",unstick:"Unstick"},classes:{closer:null,pin_up:null,pin_down:null}};i.prototype.modules.buttons={closer:null,sticker:null,init:function(i,s){var n=this;i.elem.on({mouseenter:function(o){!n.options.sticker||i.options.nonblock&&i.options.nonblock.nonblock&&!n.options.show_on_nonblock||n.sticker.trigger("pnotify:buttons:toggleStick").css("visibility","visible");!n.options.closer||i.options.nonblock&&i.options.nonblock.nonblock&&!n.options.show_on_nonblock||n.closer.css("visibility","visible")},mouseleave:function(o){n.options.sticker_hover&&n.sticker.css("visibility","hidden");n.options.closer_hover&&n.closer.css("visibility","hidden")}});this.sticker=o("<div />",{class:"ui-pnotify-sticker","aria-role":"button","aria-pressed":i.options.hide?"false":"true",tabindex:"0",title:i.options.hide?s.labels.stick:s.labels.unstick,css:{cursor:"pointer",visibility:s.sticker_hover?"hidden":"visible"},click:function(){i.options.hide=!i.options.hide;i.options.hide?i.queueRemove():i.cancelRemove();o(this).trigger("pnotify:buttons:toggleStick")}}).bind("pnotify:buttons:toggleStick",function(){var s=null===n.options.classes.pin_up?i.styles.pin_up:n.options.classes.pin_up,e=null===n.options.classes.pin_down?i.styles.pin_down:n.options.classes.pin_down;o(this).attr("title",i.options.hide?n.options.labels.stick:n.options.labels.unstick).children().attr("class","").addClass(i.options.hide?s:e).attr("aria-pressed",i.options.hide?"false":"true")}).append("<span />").trigger("pnotify:buttons:toggleStick").prependTo(i.container);(!s.sticker||i.options.nonblock&&i.options.nonblock.nonblock&&!s.show_on_nonblock)&&this.sticker.css("display","none");this.closer=o("<div />",{class:"ui-pnotify-closer","aria-role":"button",tabindex:"0",title:s.labels.close,css:{cursor:"pointer",visibility:s.closer_hover?"hidden":"visible"},click:function(){i.remove(!1);n.sticker.css("visibility","hidden");n.closer.css("visibility","hidden")}}).append(o("<span />",{class:null===s.classes.closer?i.styles.closer:s.classes.closer})).prependTo(i.container);(!s.closer||i.options.nonblock&&i.options.nonblock.nonblock&&!s.show_on_nonblock)&&this.closer.css("display","none")},update:function(o,i){!i.closer||o.options.nonblock&&o.options.nonblock.nonblock&&!i.show_on_nonblock?this.closer.css("display","none"):i.closer&&this.closer.css("display","block");!i.sticker||o.options.nonblock&&o.options.nonblock.nonblock&&!i.show_on_nonblock?this.sticker.css("display","none"):i.sticker&&this.sticker.css("display","block");this.sticker.trigger("pnotify:buttons:toggleStick");this.closer.find("span").attr("class","").addClass(null===i.classes.closer?o.styles.closer:i.classes.closer);i.sticker_hover?this.sticker.css("visibility","hidden"):o.options.nonblock&&o.options.nonblock.nonblock&&!i.show_on_nonblock||this.sticker.css("visibility","visible");i.closer_hover?this.closer.css("visibility","hidden"):o.options.nonblock&&o.options.nonblock.nonblock&&!i.show_on_nonblock||this.closer.css("visibility","visible")}};o.extend(i.styling.brighttheme,{closer:"brighttheme-icon-closer",pin_up:"brighttheme-icon-sticker",pin_down:"brighttheme-icon-sticker brighttheme-icon-stuck"});o.extend(i.styling.jqueryui,{closer:"ui-icon ui-icon-close",pin_up:"ui-icon ui-icon-pin-w",pin_down:"ui-icon ui-icon-pin-s"});o.extend(i.styling.bootstrap2,{closer:"icon-remove",pin_up:"icon-pause",pin_down:"icon-play"});o.extend(i.styling.bootstrap3,{closer:"glyphicon glyphicon-remove",pin_up:"glyphicon glyphicon-pause",pin_down:"glyphicon glyphicon-play"});o.extend(i.styling.fontawesome,{closer:"fa fa-times",pin_up:"fa fa-pause",pin_down:"fa fa-play"})});
//# sourceMappingURL=pnotify.buttons.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["?"],"names":["root","factory","define","amd","exports","module","require","jQuery","PNotify","this","$","prototype","options","buttons","closer","closer_hover","sticker","sticker_hover","show_on_nonblock","labels","close","stick","unstick","classes","pin_up","pin_down","modules","init","notice","that","elem","on","mouseenter","e","nonblock","trigger","css","mouseleave","class","aria-role","aria-pressed","hide","tabindex","title","cursor","visibility","click","queueRemove","cancelRemove","bind","styles","attr","children","addClass","append","prependTo","container","remove","update","find","extend","styling","brighttheme","jqueryui","bootstrap2","bootstrap3","fontawesome"],"mappings":"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","file":"pnotify.buttons.js.map"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -40,7 +40,24 @@
{{^hideSettingsTab}}
<div role="tabpanel" class="tab-pane fade {{#openTabSettings}}in active{{/openTabSettings}}" id="{{dialogMapSettingsContainerId}}">
<form role="form" class="form-horizontal">
<h4><i class="fa fa-share-alt fa-fw"></i> Share settings</h4>
<h4 class="pf-dynamic-area">Configuration</h4>
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<div class="col-sm-offset-1 col-sm-11">
<div class="col-sm-12 col-xs-6 checkbox checkbox-primary" title="remove expired EOL connections">
<input id="{{deleteExpiredConnectionsId}}" name="deleteExpiredConnections" value="1" type="checkbox" {{#deleteExpiredConnections}}checked{{/deleteExpiredConnections}}>
<label for="{{deleteExpiredConnectionsId}}">Auto delete expired connections</label>
</div>
</div>
</div>
</div>
<div class="col-sm-6"></div>
</div>
<h4 class="pf-dynamic-area">Share settings</h4>
<div class="row">
<div class="col-sm-11">

View File

@@ -3,7 +3,7 @@
<ul class="nav navbar-nav {{dialogNavigationClass}}" role="tablist">
<li class="active">
<a role="tab" data-toggle="tab" data-name="infoSummary" href="#{{dialogSummaryContainerId}}">
<i class="fa fa-info fa-fw"></i>&nbsp;Info
<i class="fa fa-street-view fa-fw"></i>&nbsp;Information
</a>
</li>
<li class="">

View File

@@ -54,7 +54,7 @@
<kbd>right click</kbd> somewhere on the map to open the context menu.
</p>
<ul class="list-unstyled well" style=" margin-left: 10px;">
<li><i class="fa fa-info fa-fw"></i> Show some basic map information</li>
<li><i class="fa fa-street-view fa-fw"></i> Show some basic map information</li>
<li><i class="fa fa-plus fa-fw"></i> Add a new system at the position, you clicked at</li>
<li><i class="fa fa-object-ungroup fa-fw"></i> Select all (unlocked) systems on the map</li>
<li><i class="fa fa-filter fa-fw"></i> Filter map connections by a scope <small><a href="#" data-target="#pf-manual-scrollspy-anchor-connection-scope">more</a></small></li>
@@ -407,7 +407,7 @@
<h4 id="pf-manual-scrollspy-anchor-notification-desktop">Desktop push notifications</h4>
<p>
<em class="pf-brand">pathfinder</em> supports desktop push notifications. The first time this kind of notification is send to a client, a Browser security question must be confirmed.
In order to test desktop push notifications <kbd>click</kbd> the "Notification test" <small>(<i class="fa fa-bullhorn fa-fw"></i>)</small> option in the main menu <small>(<i class="fa fa-bars fa-fw"></i>)</small>.<br>
In order to test desktop push notifications <kbd>click</kbd> the "Notification test" <small>(<i class="fa fa-bullhorn fa-fw"></i>)</small> option in the main menu.<br>
Events that trigger desktop notification.
</p>
<ul>

View File

@@ -8,18 +8,25 @@
<i class="fa fa-user fa-fw"></i>&nbsp;Account
</a>
</li>
<li>
<a role="tab" data-toggle="tab" data-name="share" href="#{{settingsShareContainerId}}">
<i class="fa fa-share-alt fa-fw"></i>&nbsp;Share
</a>
</li>
{{#userData.character}}
<li>
<a role="tab" data-toggle="tab" data-name="share" href="#{{settingsShareContainerId}}">
<i class="fa fa-share-alt fa-fw"></i>&nbsp;Share
</a>
</li>
<li>
<a role="tab" data-toggle="tab" data-name="share" href="#{{settingsCharacterContainerId}}">
<i class="fa fa-male fa-fw"></i>&nbsp;Character
</a>
</li>
{{/userData.character}}
</ul>
</div>
</nav>
<div class="tab-content">
<div role="tabpanel" class="tab-pane fade in active" id="{{settingsAccountContainerId}}">
{{! account tab ================================================================================================ }}
{{! account tab ================================================================================================== }}
<form role="form" class="form-horizontal">
{{! Username }}
@@ -147,7 +154,7 @@
</form>
</div>
<div role="tabpanel" class="tab-pane" id="{{settingsShareContainerId}}">
{{! sharing tab ================================================================================================ }}
{{! sharing tab ================================================================================================== }}
<form role="form" class="form-horizontal">
@@ -164,58 +171,44 @@
</div>
{{#userData.character}}
<h4 class="pf-dynamic-area"><img src="{{ccpImageServer}}Character/{{id}}_32.jpg">&nbsp;&nbsp;Private maps "<em class="pf-map-type-private">{{name}}</em>"</h4>
<h4 class="pf-dynamic-area"><img src="{{ccpImageServer}}Character/{{id}}_64.jpg">&nbsp;&nbsp;Private maps "<em class="pf-map-type-private">{{name}}</em>"</h4>
<div class="row">
<div class="col-sm-9">
<div class="col-sm-10">
<label for="privateSharing">
<input id="privateSharing" type="checkbox" name="privateSharing" data-toggle="toggle" value="1" {{#shared}}checked{{/shared}}>
&nbsp;map invite for private maps
</label>
</div>
</div>
<div class="col-sm-3">
<label class="control-label" for="privateSharing">
<input id="privateSharing" type="checkbox" name="privateSharing" data-toggle="toggle" value="1" {{#shared}}checked{{/shared}}>
&nbsp;map invite for private maps
</label>
</div>
<div class="col-sm-3"></div>
</div>
{{#corporation}}
<h4 class="pf-dynamic-area"><img src="{{ccpImageServer}}Corporation/{{id}}_32.png">&nbsp;&nbsp;Corporation maps "<em class="pf-map-type-corporation">{{name}}</em>"</h4>
<h4 class="pf-dynamic-area"><img src="{{ccpImageServer}}Corporation/{{id}}_64.png">&nbsp;&nbsp;Corporation maps "<em class="pf-map-type-corporation">{{name}}</em>"</h4>
<div class="row">
<div class="col-sm-9">
<div class="col-sm-10">
<label for="corporationSharing">
<input id="corporationSharing" type="checkbox" name="corporationSharing" data-toggle="toggle" value="1" {{#shared}}checked{{/shared}}>
&nbsp;map invite for corporation maps
</label>
</div>
</div>
<div class="col-sm-3">
<label class="control-label" for="corporationSharing">
<input id="corporationSharing" type="checkbox" name="corporationSharing" data-toggle="toggle" value="1" {{#shared}}checked{{/shared}}>
&nbsp;map invite for corporation maps
</label>
</div>
<div class="col-sm-3"></div>
</div>
{{/corporation}}
{{#alliance}}
<h4 class="pf-dynamic-area"><img src="{{ccpImageServer}}Alliance/{{id}}_32.png">&nbsp;&nbsp;Alliance maps "<em class="pf-map-type-alliance">{{name}}</em>"</h4>
<h4 class="pf-dynamic-area"><img src="{{ccpImageServer}}Alliance/{{id}}_64.png">&nbsp;&nbsp;Alliance maps "<em class="pf-map-type-alliance">{{name}}</em>"</h4>
<div class="row">
<div class="col-sm-9">
<div class="col-sm-10">
<label for="allianceSharing">
<input id="allianceSharing" type="checkbox" name="allianceSharing" data-toggle="toggle" value="1" {{#shared}}checked{{/shared}}>
&nbsp;map invite for alliance maps
</label>
</div>
</div>
<div class="col-sm-3">
<label class="control-label" for="allianceSharing">
<input id="allianceSharing" type="checkbox" name="allianceSharing" data-toggle="toggle" value="1" {{#shared}}checked{{/shared}}>
&nbsp;map invite for alliance maps
</label>
</div>
<div class="col-sm-3"></div>
</div>
{{/alliance}}
@@ -225,5 +218,33 @@
</form>
</div>
<div role="tabpanel" class="tab-pane" id="{{settingsCharacterContainerId}}">
{{! character tab ================================================================================================ }}
<form role="form" class="form-horizontal">
{{#userData.character}}
<h4 class="pf-dynamic-area"><img src="{{ccpImageServer}}Character/{{id}}_64.jpg">&nbsp;&nbsp;{{name}}</h4>
<div class="row">
<div class="col-xs-8 col-sm-6">
<div class="form-group">
<div class="col-sm-offset-1 col-sm-11">
<div class="checkbox checkbox-primary" title="show/share current location on map">
<input id="logLocation" name="logLocation" value="1" type="checkbox" {{#logLocation}}checked{{/logLocation}}>
<label for="logLocation">Auto update current location</label>
</div>
</div>
</div>
</div>
<div class="col-sm-6"></div>
</div>
<input type="hidden" name="character">
{{/userData.character}}
</form>
</div>
</div>
</div>

View File

@@ -63,9 +63,12 @@
<thead>
<tr>
<th colspan="4" class="separator-right">character</th>
<th colspan="4" class="separator-right hidden-xs hidden-sm">systems</th>
<th colspan="4" class="separator-right hidden-xs hidden-sm">connection</th>
<th colspan="4" class="separator-right hidden-xs hidden-sm">signatures</th>
<th colspan="3" class="hidden-xs hidden-sm">systems</th>
<th class="text-right separator-right"><span class="hidden-md hidden-lg">sys.</span></th>
<th colspan="3" class="hidden-xs hidden-sm">connection</th>
<th class="text-right separator-right"><span class="hidden-md hidden-lg">con.</span></th>
<th colspan="3" class="hidden-xs hidden-sm">signatures</th>
<th class="text-right separator-right"><span class="hidden-md hidden-lg">sig.</span></th>
<th class="text-right">sum</th>
</tr>
<tr>

Some files were not shown because too many files have changed in this diff Show More