closed #90 (IGB map not working) jsPlumb v2.0.5 downgraded to v1.7.6
#84 renamed "landingpage" view to "login" view #84 added some basic CREST API data mappers #84 added "isNPC" flag t Corporation table (WIP) #84 added CREST API settings to environment.ini
This commit is contained in:
@@ -25,7 +25,11 @@ DB_CCP_NAME = eve_parallax_min
|
||||
DB_CCP_USER = root
|
||||
DB_CCP_PASS =
|
||||
|
||||
; SMTP settings
|
||||
; CCP SSO settings
|
||||
SSO_CCP_CLIENT_ID =
|
||||
SSO_CCP_SECRET_KEY =
|
||||
|
||||
; SMTP settings. see: https://developers.eveonline.com/applications
|
||||
SMTP_HOST = localhost
|
||||
SMTP_PORT = 25
|
||||
SMTP_SCHEME = ""
|
||||
@@ -53,6 +57,10 @@ DB_CCP_NAME =
|
||||
DB_CCP_USER =
|
||||
DB_CCP_PASS =
|
||||
|
||||
; CCP SSO settings
|
||||
SSO_CCP_CLIENT_ID =
|
||||
SSO_CCP_SECRET_KEY =
|
||||
|
||||
; SMTP settings
|
||||
SMTP_HOST = localhost
|
||||
SMTP_PORT = 25
|
||||
|
||||
@@ -12,15 +12,15 @@ namespace Controller;
|
||||
class AppController extends Controller {
|
||||
|
||||
/**
|
||||
* show the main landing page
|
||||
* show main login (index) page
|
||||
* @param $f3
|
||||
*/
|
||||
public function showLandingpage($f3) {
|
||||
public function init($f3) {
|
||||
// page title
|
||||
$f3->set('pageTitle', 'Login');
|
||||
|
||||
// main page content
|
||||
$f3->set('pageContent', $f3->get('PATHFINDER.VIEW.LANDINGPAGE'));
|
||||
$f3->set('pageContent', $f3->get('PATHFINDER.VIEW.LOGIN'));
|
||||
|
||||
// body element class
|
||||
$f3->set('bodyClass', 'pf-body pf-landing');
|
||||
@@ -29,7 +29,7 @@ class AppController extends Controller {
|
||||
$f3->set('trusted', 1);
|
||||
|
||||
// JS main file
|
||||
$f3->set('jsView', 'landingpage');
|
||||
$f3->set('jsView', 'login');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
500
app/main/controller/ccpssocontroller.php
Normal file
500
app/main/controller/ccpssocontroller.php
Normal file
@@ -0,0 +1,500 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Exodus
|
||||
* Date: 23.01.2016
|
||||
* Time: 17:18
|
||||
*
|
||||
* Handles access to EVE-Online "CREST API" and "SSO" auth functions
|
||||
* - Add your API credentials in "environment.ini"
|
||||
* - Check "PATHFINDER.API" in "pathfinder.ini" for correct API URLs
|
||||
* Hint: \Web::instance()->request automatically caches responses by their response "Cache-Control" header!
|
||||
*/
|
||||
|
||||
namespace Controller;
|
||||
|
||||
use Data\Mapper as Mapper;
|
||||
use Model;
|
||||
|
||||
class CcpSsoController extends Controller {
|
||||
|
||||
const SESSION_KEY_ACCESS_TOKEN = 'SESSION.sso.access_token';
|
||||
const SESSION_KEY_REFRESH_TOKEN = 'SESSION.sso.refresh_token';
|
||||
|
||||
const ERROR_CCP_SSO_URL = 'Invalid "PATHFINDER.API.CCP_SSO" url. %s';
|
||||
const ERROR_CCP_CREST_URL = 'Invalid "PATHFINDER.API.CCP_CREST" url. %s';
|
||||
const ERROR_RESOURCE_DEPRECATED = 'Resource: %s has been marked deprecated. %s';
|
||||
const ERROR_ACCESS_TOKEN = 'Unable to get a valid "access_token. %s';
|
||||
const ERROR_VERIFY_CHARACTER = 'Unable to verify character data. %s';
|
||||
const ERROR_GET_ENDPOINTS = 'Unable to get endpoints data. $s';
|
||||
const ERROR_GET_ENDPOINT = 'Unable to get endpoint data. $s';
|
||||
const ERROR_FIND_ENDPOINT = 'Unable to find endpoint: %s';
|
||||
|
||||
/**
|
||||
* "Scopes" that are used by pathfinder
|
||||
* -> Enable scopes: https://developers.eveonline.com
|
||||
* @var array
|
||||
*/
|
||||
private $requestScopes = [
|
||||
'characterLocationRead',
|
||||
'characterNavigationWrite'
|
||||
];
|
||||
|
||||
/**
|
||||
* timeout for API calls
|
||||
* @var int
|
||||
*/
|
||||
private $apiTimeout = 3;
|
||||
|
||||
/**
|
||||
* redirect user to CCP SSO page and request authorization
|
||||
* @param $f3
|
||||
*/
|
||||
public function requestAuthorization($f3){
|
||||
// used for state check between request and callback
|
||||
$state = bin2hex(mcrypt_create_iv(12, MCRYPT_DEV_URANDOM));
|
||||
$f3->set('SESSION.sso.state', $state);
|
||||
|
||||
$urlParams = [
|
||||
'response_type' => 'code',
|
||||
'redirect_uri' => Controller::getEnvironmentData('URL') . $f3->build('/sso/callbackAuthorization'),
|
||||
'client_id' => Controller::getEnvironmentData('SSO_CCP_CLIENT_ID'),
|
||||
'scope' => implode(' ', $this->requestScopes),
|
||||
'state' => $state
|
||||
];
|
||||
|
||||
$ssoAuthUrl = self::getAuthorizationEndpoint() . '?' . http_build_query($urlParams, '', '&', PHP_QUERY_RFC3986 );
|
||||
|
||||
$f3->status(302);
|
||||
$f3->reroute($ssoAuthUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* callback handler for CCP SSO user Auth
|
||||
* -> see requestAuthorization()
|
||||
* @param $f3
|
||||
*/
|
||||
public function callbackAuthorization($f3){
|
||||
$getParams = (array)$f3->get('GET');
|
||||
|
||||
if($f3->exists('SESSION.sso.state')){
|
||||
// check response and validate 'state'
|
||||
if(
|
||||
isset($getParams['code']) &&
|
||||
isset($getParams['state']) &&
|
||||
!empty($getParams['code']) &&
|
||||
!empty($getParams['state']) &&
|
||||
$f3->get('SESSION.sso.state') === $getParams['state']
|
||||
){
|
||||
|
||||
// clear 'state' for new next request
|
||||
$f3->clear('SESSION.sso.state');
|
||||
|
||||
$accessToken = $this->getAccessToken($getParams['code']);
|
||||
if($accessToken){
|
||||
$data = $this->verifyCharacterData($accessToken);
|
||||
|
||||
$characterData = $this->getCharacterData($accessToken);
|
||||
$characterModel = $this->updateCharacter($characterData);
|
||||
|
||||
if( !is_null($characterModel) ){
|
||||
// everything OK -> login succeeded
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// on error -> route back to login form
|
||||
$this->getF3()->reroute('@login');
|
||||
}
|
||||
|
||||
/**
|
||||
* get a valid "access_token" for oAuth 2.0 verification
|
||||
* -> if $authCode is set -> request NEW "access_token"
|
||||
* -> else check for existing (not expired) "access_token"
|
||||
* -> else try to refresh auth and get fresh "access_token"
|
||||
* @param bool $authCode
|
||||
* @return bool|mixed
|
||||
*/
|
||||
private function getAccessToken($authCode = false){
|
||||
$accessToken = false;
|
||||
|
||||
if( !empty($authCode) ){
|
||||
// Authentication Code is set -> request new Access Token -------------------------------------------------
|
||||
|
||||
// clear "old" token (if exist and still valid)
|
||||
$this->getF3()->clear(self::SESSION_KEY_ACCESS_TOKEN);
|
||||
|
||||
$accessToken = $this->verifyAuthorizationCode($authCode);
|
||||
}elseif($this->getF3()->exists(self::SESSION_KEY_ACCESS_TOKEN)){
|
||||
// Access Token exists and not expired --------------------------------------------------------------------
|
||||
$accessToken = $this->getF3()->get(self::SESSION_KEY_ACCESS_TOKEN);
|
||||
}elseif($this->getF3()->exists(self::SESSION_KEY_REFRESH_TOKEN)){
|
||||
// Refresh Token exists -> refresh Access Token -----------------------------------------------------------
|
||||
$accessToken = $this->refreshAccessToken($this->getF3()->get(self::SESSION_KEY_REFRESH_TOKEN));
|
||||
}else{
|
||||
// Unable to get Token -> trigger error -------------------------------------------------------------------
|
||||
$this->getLogger('error')->write(sprintf(self::ERROR_ACCESS_TOKEN, $authCode));
|
||||
}
|
||||
|
||||
return $accessToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* verify authorization code, and get an "access_token" data
|
||||
* @param $authCode
|
||||
* @return bool|mixed
|
||||
*/
|
||||
private function verifyAuthorizationCode($authCode){
|
||||
$requestParams = [
|
||||
'grant_type' => 'authorization_code',
|
||||
'code' => $authCode
|
||||
];
|
||||
|
||||
return $this->requestAccessToken($requestParams);
|
||||
}
|
||||
|
||||
/**
|
||||
* get new "access_token" by an existing "refresh_token"
|
||||
* -> if "access_token" is expired, this function gets a fresh one
|
||||
* @param $refreshToken
|
||||
* @return bool|mixed
|
||||
*/
|
||||
private function refreshAccessToken($refreshToken){
|
||||
$requestParams = [
|
||||
'grant_type' => 'refresh_token',
|
||||
'refresh_token' => $refreshToken
|
||||
];
|
||||
|
||||
return $this->requestAccessToken($requestParams);
|
||||
}
|
||||
|
||||
/**
|
||||
* request an "access_token" AND "refresh_token" data
|
||||
* -> this can either be done by sending a valid "authorization code"
|
||||
* OR by providing a valid "refresh_token"
|
||||
* @param $requestParams
|
||||
* @return bool|mixed
|
||||
*/
|
||||
private function requestAccessToken($requestParams){
|
||||
$verifyAuthCodeUrl = self::getVerifyAuthorizationCodeEndpoint();
|
||||
$verifyAuthCodeUrlParts = parse_url($verifyAuthCodeUrl);
|
||||
$accessToken = false;
|
||||
|
||||
if($verifyAuthCodeUrlParts){
|
||||
$contentType = 'application/x-www-form-urlencoded';
|
||||
$requestOptions = [
|
||||
'timeout' => $this->apiTimeout,
|
||||
'method' => 'POST',
|
||||
'user_agent' => $this->getUserAgent(),
|
||||
'header' => [
|
||||
'Authorization: Basic ' . $this->getAuthorizationHeader(),
|
||||
'Content-Type: ' . $contentType,
|
||||
'Host: ' . $verifyAuthCodeUrlParts['host']
|
||||
]
|
||||
];
|
||||
|
||||
// content (parameters to send with)
|
||||
$requestOptions['content'] = http_build_query($requestParams);
|
||||
|
||||
$apiResponse = \Web::instance()->request($verifyAuthCodeUrl, $requestOptions);
|
||||
|
||||
if($apiResponse['body']){
|
||||
$authCodeRequestData = json_decode($apiResponse['body']);
|
||||
|
||||
if(property_exists($authCodeRequestData, 'refresh_token')){
|
||||
// this token is used to refresh/get a new access_token when expires
|
||||
$this->getF3()->set(self::SESSION_KEY_REFRESH_TOKEN, $authCodeRequestData->refresh_token);
|
||||
}
|
||||
|
||||
if(property_exists($authCodeRequestData, 'access_token')){
|
||||
// this token is required for endpoints that require Auth
|
||||
$accessToken = $this->getF3()->set(self::SESSION_KEY_ACCESS_TOKEN, $authCodeRequestData->access_token);
|
||||
}
|
||||
}else{
|
||||
$this->getLogger('error')->write(sprintf(self::ERROR_ACCESS_TOKEN, print_r($requestParams, true)));
|
||||
}
|
||||
}else{
|
||||
$this->getLogger('error')->write(sprintf(self::ERROR_CCP_SSO_URL, __METHOD__));
|
||||
}
|
||||
|
||||
return $accessToken;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* verify character data by "access_token"
|
||||
* -> get some basic information (like character id)
|
||||
* -> if more character information is required, use CREST endpoints request instead
|
||||
* @param $accessToken
|
||||
* @return bool|mixed
|
||||
*/
|
||||
private function verifyCharacterData($accessToken){
|
||||
$verifyUserUrl = self::getVerifyUserEndpoint();
|
||||
$verifyUrlParts = parse_url($verifyUserUrl);
|
||||
$characterData = false;
|
||||
|
||||
if($verifyUrlParts){
|
||||
$requestOptions = [
|
||||
'timeout' => $this->apiTimeout,
|
||||
'method' => 'GET',
|
||||
'user_agent' => $this->getUserAgent(),
|
||||
'header' => [
|
||||
'Authorization: Bearer ' . $accessToken,
|
||||
'Host: ' . $verifyUrlParts['host']
|
||||
]
|
||||
];
|
||||
|
||||
$apiResponse = \Web::instance()->request($verifyUserUrl, $requestOptions);
|
||||
|
||||
if($apiResponse['body']){
|
||||
$characterData = json_decode($apiResponse['body']);
|
||||
}else{
|
||||
$this->getLogger('error')->write(sprintf(self::ERROR_VERIFY_CHARACTER, __METHOD__));
|
||||
}
|
||||
}else{
|
||||
$this->getLogger('error')->write(sprintf(self::ERROR_CCP_SSO_URL, __METHOD__));
|
||||
}
|
||||
|
||||
return $characterData;
|
||||
}
|
||||
|
||||
/**
|
||||
* get all available Endpoints
|
||||
* @param $accessToken
|
||||
* @return bool|mixed
|
||||
*/
|
||||
private function getEndpoints($accessToken){
|
||||
$crestUrl = self::getCrestEndpoint();
|
||||
$endpointsData = false;
|
||||
$crestUrlParts = parse_url($crestUrl);
|
||||
|
||||
if($crestUrlParts){
|
||||
// represents API version
|
||||
$contentType = 'application/vnd.ccp.eve.Api-v3+json';
|
||||
$requestOptions = [
|
||||
'timeout' => $this->apiTimeout,
|
||||
'method' => 'GET',
|
||||
'user_agent' => $this->getUserAgent(),
|
||||
'header' => [
|
||||
'Authorization: Bearer ' . $accessToken,
|
||||
'Accept: ' . $contentType,
|
||||
'Host: ' . $crestUrlParts['host']
|
||||
]
|
||||
];
|
||||
|
||||
$apiResponse = \Web::instance()->request($crestUrl, $requestOptions);
|
||||
|
||||
if($apiResponse['headers']){
|
||||
// check headers for error
|
||||
$this->checkResponseHeaders($apiResponse['headers'], $crestUrl, $contentType);
|
||||
|
||||
if($apiResponse['body']){
|
||||
$endpointsData = json_decode($apiResponse['body'], true);
|
||||
}else{
|
||||
$this->getLogger('error')->write(sprintf(self::ERROR_GET_ENDPOINTS, __METHOD__));
|
||||
}
|
||||
}
|
||||
}else{
|
||||
$this->getLogger('error')->write(sprintf(self::ERROR_CCP_CREST_URL, __METHOD__));
|
||||
}
|
||||
|
||||
return $endpointsData;
|
||||
}
|
||||
|
||||
private function walkEndpoint($accessToken, $endpoint, $path = []){
|
||||
$targetEndpoint = null;
|
||||
|
||||
|
||||
if( !empty($path) ){
|
||||
$newNode = array_shift($path);
|
||||
|
||||
if(isset($endpoint[$newNode])){
|
||||
$currentEndpoint = $endpoint[$newNode];
|
||||
if(isset($currentEndpoint['href'])){
|
||||
$newEndpoint = $this->getEndpoint($accessToken, $currentEndpoint['href']);
|
||||
$targetEndpoint = $this->walkEndpoint($accessToken, $newEndpoint, $path);
|
||||
|
||||
}else{
|
||||
// TODO leaf
|
||||
$targetEndpoint = ' target:) ';
|
||||
}
|
||||
}else{
|
||||
// endpoint not found
|
||||
$this->getLogger('error')->write(sprintf(self::ERROR_FIND_ENDPOINT, $newNode));
|
||||
}
|
||||
}else{
|
||||
$targetEndpoint = $endpoint;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return $targetEndpoint;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get a specific endpoint by its $resourceUrl
|
||||
* @param $accessToken
|
||||
* @param $resourceUrl
|
||||
* @return mixed|null
|
||||
*/
|
||||
private function getEndpoint($accessToken, $resourceUrl){
|
||||
$resourceUrlParts = parse_url($resourceUrl);
|
||||
$endpoint = null;
|
||||
|
||||
if($resourceUrlParts){
|
||||
$requestOptions = [
|
||||
'timeout' => $this->apiTimeout,
|
||||
'method' => 'GET',
|
||||
'user_agent' => $this->getUserAgent(),
|
||||
'header' => [
|
||||
'Authorization: Bearer ' . $accessToken,
|
||||
'Host: login.eveonline.com',
|
||||
'Host: ' . $resourceUrlParts['host']
|
||||
]
|
||||
];
|
||||
|
||||
$apiResponse = \Web::instance()->request($resourceUrl, $requestOptions);
|
||||
|
||||
if($apiResponse['headers']){
|
||||
// check headers for error
|
||||
$this->checkResponseHeaders($apiResponse['headers'], $requestOptions);
|
||||
|
||||
if($apiResponse['body']){
|
||||
$endpoint = json_decode($apiResponse['body'], true);
|
||||
}else{
|
||||
$this->getLogger('error')->write(sprintf(self::ERROR_GET_ENDPOINT, __METHOD__));
|
||||
}
|
||||
}
|
||||
}else{
|
||||
$this->getLogger('error')->write(sprintf(self::ERROR_CCP_CREST_URL, __METHOD__));
|
||||
}
|
||||
|
||||
return $endpoint;
|
||||
}
|
||||
|
||||
/**
|
||||
* get character data
|
||||
* @param $accessToken
|
||||
* @return array
|
||||
*/
|
||||
private function getCharacterData($accessToken){
|
||||
$endpoints = $this->getEndpoints($accessToken);
|
||||
$characterData = [];
|
||||
|
||||
$endpoint = $this->walkEndpoint($accessToken, $endpoints, [
|
||||
'decode',
|
||||
'character'
|
||||
]);
|
||||
|
||||
if( !empty($endpoint) ){
|
||||
$characterData['character'] = (new Mapper\CrestCharacter($endpoint))->getData();
|
||||
|
||||
if(isset($endpoint['corporation'])){
|
||||
$characterData['corporation'] = (new Mapper\CrestCorporation($endpoint['corporation']))->getData();
|
||||
}
|
||||
}
|
||||
|
||||
return $characterData;
|
||||
}
|
||||
|
||||
/*
|
||||
private function getCharacterLocation($accessToken){
|
||||
$endpoints = $this->getEndpoints($accessToken);
|
||||
$endpoint = $this->walkEndpoint($accessToken, $endpoints, [
|
||||
'decode',
|
||||
'character',
|
||||
'location'
|
||||
]);
|
||||
|
||||
var_dump($endpoint);
|
||||
|
||||
die(' END getCharacterLocation() ');
|
||||
|
||||
|
||||
$characterData = [];
|
||||
return $characterData;
|
||||
} */
|
||||
|
||||
/**
|
||||
* update character
|
||||
* @param $characterData
|
||||
* @return \Model\CharacterModel
|
||||
* @throws \Exception
|
||||
*/
|
||||
private function updateCharacter($characterData){
|
||||
|
||||
$characterModel = null;
|
||||
$corporationModel = null;
|
||||
$allianceModel = null;
|
||||
|
||||
if( !empty($characterData['corporation']) ){
|
||||
$corporationModel = Model\BasicModel::getNew('CorporationModel');
|
||||
$corporationModel->getById($characterData['corporation']['id'], 0);
|
||||
$corporationModel->copyfrom($characterData['corporation']);
|
||||
$corporationModel->save();
|
||||
}
|
||||
|
||||
if( !empty($characterData['alliance']) ){
|
||||
$allianceModel = Model\BasicModel::getNew('AllianceModel');
|
||||
$allianceModel->getById($characterData['alliance']['id'], 0);
|
||||
$allianceModel->copyfrom($characterData['alliance']);
|
||||
$allianceModel->save();
|
||||
}
|
||||
|
||||
if( !empty($characterData['character']) ){
|
||||
$characterModel = Model\BasicModel::getNew('CharacterModel');
|
||||
$characterModel->getById($characterData['character']['id'], 0);
|
||||
$characterModel->copyfrom($characterData['character']);
|
||||
$characterModel->corporationId = $corporationModel;
|
||||
$characterModel->allianceId = $allianceModel;
|
||||
$characterModel->save();
|
||||
}
|
||||
|
||||
return $characterModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* check response "Header" data for errors
|
||||
* @param $headers
|
||||
* @param string $requestUrl
|
||||
* @param string $contentType
|
||||
*/
|
||||
private function checkResponseHeaders($headers, $requestUrl = '', $contentType = ''){
|
||||
$headers = (array)$headers;
|
||||
if(preg_grep ('/^X-Deprecated/i', $headers)){
|
||||
$this->getLogger('error')->write(sprintf(self::ERROR_RESOURCE_DEPRECATED, $requestUrl, $contentType));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get "Authorization:" Header data
|
||||
* -> This header is required for any Auth-required endpoints!
|
||||
* @return string
|
||||
*/
|
||||
private function getAuthorizationHeader(){
|
||||
return base64_encode(
|
||||
Controller::getEnvironmentData('SSO_CCP_CLIENT_ID') . ':'
|
||||
. Controller::getEnvironmentData('SSO_CCP_SECRET_KEY')
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
static function getAuthorizationEndpoint(){
|
||||
return \Base::instance()->get('PATHFINDER.API.CCP_SSO') . '/oauth/authorize';
|
||||
}
|
||||
|
||||
static function getVerifyAuthorizationCodeEndpoint(){
|
||||
return \Base::instance()->get('PATHFINDER.API.CCP_SSO') . '/oauth/token';
|
||||
}
|
||||
|
||||
static function getVerifyUserEndpoint(){
|
||||
return \Base::instance()->get('PATHFINDER.API.CCP_SSO') . '/oauth/verify';
|
||||
}
|
||||
|
||||
static function getCrestEndpoint(){
|
||||
return \Base::instance()->get('PATHFINDER.API.CCP_CREST');
|
||||
}
|
||||
}
|
||||
@@ -137,7 +137,7 @@ class Controller {
|
||||
|
||||
if( !$f3->get('AJAX') ){
|
||||
// redirect to landing page
|
||||
$f3->reroute('@landing');
|
||||
$f3->reroute('@login');
|
||||
}else{
|
||||
$params = $f3->get('POST');
|
||||
$return = (object) [];
|
||||
@@ -145,7 +145,7 @@ class Controller {
|
||||
isset($params['reroute']) &&
|
||||
(bool)$params['reroute']
|
||||
){
|
||||
$return->reroute = rtrim(self::getEnvironmentData('URL'), '/') . $f3->alias('landing');
|
||||
$return->reroute = rtrim(self::getEnvironmentData('URL'), '/') . $f3->alias('login');
|
||||
}else{
|
||||
// no reroute -> errors can be shown
|
||||
$return->error[] = $this->getUserLoggedOffError();
|
||||
@@ -428,7 +428,7 @@ class Controller {
|
||||
$url = $this->getF3()->alias( $this->getF3()->get('ALIAS') );
|
||||
}else{
|
||||
// get main (index.php) URL
|
||||
$url = $this->getF3()->alias('landing');
|
||||
$url = $this->getF3()->alias('login');
|
||||
}
|
||||
|
||||
return $url;
|
||||
@@ -440,7 +440,6 @@ class Controller {
|
||||
*/
|
||||
protected function getUserAgent(){
|
||||
$userAgent = '';
|
||||
|
||||
$userAgent .= $this->getF3()->get('PATHFINDER.NAME');
|
||||
$userAgent .= ' - ' . $this->getF3()->get('PATHFINDER.VERSION');
|
||||
$userAgent .= ' | ' . $this->getF3()->get('PATHFINDER.CONTACT');
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Controller;
|
||||
|
||||
class MapController extends \Controller\AccessController {
|
||||
|
||||
public function showMap($f3) {
|
||||
public function init($f3) {
|
||||
|
||||
// page title
|
||||
$f3->set('pageTitle', 'Maps');
|
||||
|
||||
106
app/main/data/mapper/abstractiterator.php
Normal file
106
app/main/data/mapper/abstractiterator.php
Normal file
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Exodus
|
||||
* Date: 31.01.2016
|
||||
* Time: 04:06
|
||||
*/
|
||||
|
||||
namespace data\mapper;
|
||||
|
||||
|
||||
class AbstractIterator extends \RecursiveArrayIterator {
|
||||
|
||||
/**
|
||||
* iterator mapping
|
||||
* -> overwrite in child classes (late static binding)
|
||||
* @var array
|
||||
*/
|
||||
protected static $map = [];
|
||||
|
||||
/**
|
||||
* remove unmapped values from Array
|
||||
* -> see $map
|
||||
* @var bool
|
||||
*/
|
||||
protected static $removeUnmapped = true;
|
||||
|
||||
|
||||
function __construct($data){
|
||||
parent::__construct($data, \RecursiveIteratorIterator::SELF_FIRST);
|
||||
}
|
||||
|
||||
/**
|
||||
* map iterator
|
||||
* @return array
|
||||
*/
|
||||
public function getData(){
|
||||
iterator_apply($this, 'self::recursiveIterator', [$this]);
|
||||
|
||||
return iterator_to_array($this, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* recursive iterator function called on every node
|
||||
* @param $iterator
|
||||
* @return mixed
|
||||
*/
|
||||
static function recursiveIterator($iterator){
|
||||
|
||||
while($iterator->valid()){
|
||||
|
||||
if(array_key_exists($iterator->key(), static::$map)){
|
||||
// check for mapping key
|
||||
if($iterator->hasChildren()){
|
||||
|
||||
// recursive call for child elements
|
||||
$iterator->offsetSet($iterator->key(), forward_static_call(array('self', __METHOD__), $iterator->getChildren())->getArrayCopy());
|
||||
$iterator->next();
|
||||
}elseif(is_array(static::$map[$iterator->key()])){
|
||||
// a -> array mapping
|
||||
$parentKey = array_keys(static::$map[$iterator->key()])[0];
|
||||
$entryKey = array_values(static::$map[$iterator->key()])[0];
|
||||
|
||||
// check if key already exists
|
||||
if($iterator->offsetExists($parentKey)){
|
||||
$currentValue = $iterator->offsetGet($parentKey);
|
||||
// add new array entry
|
||||
$currentValue[$entryKey] = $iterator->current();
|
||||
|
||||
$iterator->offsetSet($parentKey, $currentValue);
|
||||
}else{
|
||||
$iterator->offsetSet($parentKey, [$entryKey => $iterator->current()]);
|
||||
}
|
||||
|
||||
|
||||
}elseif(is_object(static::$map[$iterator->key()])){
|
||||
// a -> a (format by function)
|
||||
$formatFunction = static::$map[$iterator->key()];
|
||||
$iterator->offsetSet($iterator->key(), call_user_func($formatFunction, $iterator));
|
||||
|
||||
// just value change no key change
|
||||
$iterator->next();
|
||||
}elseif(static::$map[$iterator->key()] !== $iterator->key()){
|
||||
// a -> b mapping (key changed)
|
||||
$iterator->offsetSet(static::$map[$iterator->key()], $iterator->current());
|
||||
$iterator->offsetUnset($iterator->key());
|
||||
}else{
|
||||
// a -> a (no changes)
|
||||
$iterator->next();
|
||||
}
|
||||
|
||||
}elseif(
|
||||
static::$removeUnmapped &&
|
||||
!in_array($iterator->key(), static::$map)
|
||||
|
||||
){
|
||||
$iterator->offsetUnset($iterator->key());
|
||||
}else{
|
||||
$iterator->next();
|
||||
}
|
||||
}
|
||||
|
||||
return $iterator;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -8,9 +8,9 @@
|
||||
|
||||
namespace Data\Mapper;
|
||||
|
||||
class CcpSystemsMapper extends \RecursiveArrayIterator {
|
||||
class CcpSystemsMapper extends AbstractIterator {
|
||||
|
||||
static $map = [
|
||||
protected static $map = [
|
||||
'system_id' => 'systemId',
|
||||
'system_name' => 'name',
|
||||
'system_security' => 'trueSec',
|
||||
@@ -20,11 +20,6 @@ class CcpSystemsMapper extends \RecursiveArrayIterator {
|
||||
'region_name' => ['region' => 'name']
|
||||
];
|
||||
|
||||
function __construct($data){
|
||||
|
||||
parent::__construct($data, \RecursiveIteratorIterator::SELF_FIRST);
|
||||
}
|
||||
|
||||
/**
|
||||
* get formatted data
|
||||
* @return array
|
||||
@@ -131,11 +126,7 @@ class CcpSystemsMapper extends \RecursiveArrayIterator {
|
||||
return iterator_to_array($this, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* recursive iterator function called on every node
|
||||
* @param $iterator
|
||||
* @return mixed
|
||||
*/
|
||||
|
||||
static function recursiveIterator($iterator){
|
||||
|
||||
while ( $iterator -> valid() ) {
|
||||
|
||||
19
app/main/data/mapper/crestcharacter.php
Normal file
19
app/main/data/mapper/crestcharacter.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Exodus
|
||||
* Date: 31.01.2016
|
||||
* Time: 19:09
|
||||
*/
|
||||
|
||||
namespace Data\Mapper;
|
||||
|
||||
|
||||
class CrestCharacter extends AbstractIterator {
|
||||
|
||||
protected static $map = [
|
||||
'id' => 'id',
|
||||
'name' => 'name'
|
||||
];
|
||||
|
||||
}
|
||||
20
app/main/data/mapper/crestcorporation.php
Normal file
20
app/main/data/mapper/crestcorporation.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Exodus
|
||||
* Date: 31.01.2016
|
||||
* Time: 03:55
|
||||
*/
|
||||
|
||||
namespace Data\Mapper;
|
||||
|
||||
|
||||
class CrestCorporation extends AbstractIterator {
|
||||
|
||||
protected static $map = [
|
||||
'id' => 'id',
|
||||
'name' => 'name',
|
||||
'isNPC' => 'isNPC'
|
||||
];
|
||||
|
||||
}
|
||||
@@ -31,6 +31,11 @@ class CorporationModel extends BasicModel {
|
||||
'nullable' => false,
|
||||
'default' => 0
|
||||
],
|
||||
'isNPC' => [
|
||||
'type' => Schema::DT_BOOL,
|
||||
'nullable' => false,
|
||||
'default' => 0
|
||||
],
|
||||
'corporationCharacters' => [
|
||||
'has-many' => ['Model\CharacterModel', 'corporationId']
|
||||
],
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
[PATHFINDER]
|
||||
NAME = PATHFINDER
|
||||
; installed version (used for CSS/JS cache busting)
|
||||
VERSION = v1.0.0RC1
|
||||
VERSION = v1.0.0RC2
|
||||
; contact information (DO NOT CHANGE)
|
||||
CONTACT = https://github.com/exodus4d
|
||||
; source code (DO NOT CHANGE)
|
||||
@@ -39,7 +39,7 @@ INVITE_LIMIT = 50
|
||||
; static page templates
|
||||
INDEX = templates/view/index.html
|
||||
SETUP = templates/view/setup.html
|
||||
LANDINGPAGE = templates/view/landingpage.html
|
||||
LOGIN = templates/view/login.html
|
||||
|
||||
; HTTP status pages ===============================================================================
|
||||
[PATHFINDER.STATUS]
|
||||
@@ -102,6 +102,12 @@ DELETE_ACCOUNT = delete_account
|
||||
|
||||
; API =============================================================================================
|
||||
[PATHFINDER.API]
|
||||
; Path for CCPs XML APIv2
|
||||
; CCP SSO OAuth 2.0
|
||||
CCP_SSO = https://login.eveonline.com
|
||||
; CCP CREST API
|
||||
CCP_CREST = https://crest-tq.eveonline.com
|
||||
; CCP_CREST = https://api-sisi.testeveonline.com
|
||||
; CCP XML APIv2
|
||||
CCP_XML = https://api.eveonline.com
|
||||
; GitHub Developer API
|
||||
GIT_HUB = https://api.github.com
|
||||
|
||||
@@ -1,13 +1,18 @@
|
||||
; Route config
|
||||
|
||||
[routes]
|
||||
; DB setup setup
|
||||
; IMPORTANT: remove/comment this line after setup/update is finished!
|
||||
GET @setup: /setup = Controller\Setup->init, 0
|
||||
GET @setup: /setup = Controller\Setup->init, 0
|
||||
; login (index) page
|
||||
GET @login: / = Controller\AppController->init, 0
|
||||
; CCP SSO redirect
|
||||
GET @sso: /sso/@action = Controller\CcpSsoController->@action, 0
|
||||
|
||||
; static routes (main views) default cache: 86400
|
||||
GET|POST @landing: /= Controller\AppController->showLandingpage, 0
|
||||
GET|POST @map: /map= Controller\MapController->showMap, 0
|
||||
; map page
|
||||
GET @map: /map = Controller\MapController->init, 0
|
||||
|
||||
; ajax wildcard APIs (throttled)
|
||||
GET|POST /api/@controller/@action [ajax] = Controller\Api\@controller->@action, 0, 512
|
||||
GET|POST /api/@controller/@action/@arg1 [ajax] = Controller\Api\@controller->@action, 0, 512
|
||||
GET|POST /api/@controller/@action/@arg1/@arg2 [ajax] = Controller\Api\@controller->@action, 0, 512
|
||||
GET|POST /api/@controller/@action [ajax] = Controller\Api\@controller->@action, 0, 512
|
||||
GET|POST /api/@controller/@action/@arg1 [ajax] = Controller\Api\@controller->@action, 0, 512
|
||||
GET|POST /api/@controller/@action/@arg1/@arg2 [ajax] = Controller\Api\@controller->@action, 0, 512
|
||||
|
||||
4
build.js
4
build.js
@@ -76,13 +76,13 @@
|
||||
//of its dependencies includes i18n bundles, they may not be included in the
|
||||
//built file unless the locale: section is set above.
|
||||
{
|
||||
name: 'mappage',
|
||||
name: 'login',
|
||||
include: ['text'],
|
||||
excludeShallow: [
|
||||
'app'
|
||||
]
|
||||
},{
|
||||
name: 'landingpage',
|
||||
name: 'mappage',
|
||||
include: ['text'],
|
||||
excludeShallow: [
|
||||
'app'
|
||||
|
||||
@@ -17,7 +17,7 @@ requirejs.config({
|
||||
img: '../../img', // images dir
|
||||
|
||||
// main views
|
||||
landingpage: './app/landingpage', // initial start "landing page" view
|
||||
login: './app/login', // initial start "login page" view
|
||||
mappage: './app/mappage', // initial start "map page" view
|
||||
setup: './app/setup', // initial start "setup page" view
|
||||
|
||||
@@ -28,7 +28,7 @@ requirejs.config({
|
||||
velocity: 'lib/velocity.min', // v1.2.2 animation engine - http://julian.com/research/velocity/
|
||||
velocityUI: 'lib/velocity.ui.min', // v5.0.4 plugin for velocity - http://julian.com/research/velocity/#uiPack
|
||||
slidebars: 'lib/slidebars', // v0.10 Slidebars - side menu plugin http://plugins.adchsm.me/slidebars/
|
||||
jsPlumb: 'lib/jsPlumb-2.0.5-min', // v2.0.5 jsPlumb (Vanilla)- main map draw plugin https://jsplumbtoolkit.com/
|
||||
jsPlumb: 'lib/dom.jsPlumb-1.7.6', // v1.7.6 jsPlumb (Vanilla)- main map draw plugin https://jsplumbtoolkit.com/
|
||||
farahey: 'lib/farahey-0.5', // v0.5 jsPlumb "magnetizing" extension - https://github.com/jsplumb/farahey
|
||||
customScrollbar: 'lib/jquery.mCustomScrollbar.concat.min', // v3.0.9 Custom scroll bars - http://manos.malihu.gr/
|
||||
datatables: 'lib/datatables/jquery.dataTables.min', // v1.10.7 DataTables - https://datatables.net/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Main landingPage application
|
||||
* Main loginPage application
|
||||
*/
|
||||
|
||||
define([
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Main landingPage application
|
||||
* Main setupPage application
|
||||
*/
|
||||
|
||||
define([
|
||||
|
||||
@@ -1082,7 +1082,7 @@ define([
|
||||
var statusInfo = '';
|
||||
|
||||
// character status can not be checked if there are no reference data
|
||||
// e.g. during registration process (landing page)
|
||||
// e.g. during registration process (login page)
|
||||
if(Init.characterStatus){
|
||||
// get info for current "main" character
|
||||
var corporationId = getCurrentUserInfo('corporationId');
|
||||
@@ -1472,7 +1472,7 @@ define([
|
||||
Init.currentUserData = userData;
|
||||
|
||||
// check if function is available
|
||||
// this is not the case for "landing" page
|
||||
// this is not the case in "login" page
|
||||
if( $.fn.updateHeaderUserData ){
|
||||
$.fn.updateHeaderUserData();
|
||||
}
|
||||
|
||||
12729
js/lib/dom.jsPlumb-1.7.6.js
Normal file
12729
js/lib/dom.jsPlumb-1.7.6.js
Normal file
File diff suppressed because it is too large
Load Diff
6
js/lib/jsPlumb-2.0.5-min.js
vendored
6
js/lib/jsPlumb-2.0.5-min.js
vendored
File diff suppressed because one or more lines are too long
12733
js/lib/jsPlumb-2.0.5.js
Normal file
12733
js/lib/jsPlumb-2.0.5.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
||||
var mainScriptPath=document.body.getAttribute("data-script"),jsBaseUrl=document.body.getAttribute("data-js-path");requirejs.config({baseUrl:"js",paths:{layout:"layout",config:"app/config",dialog:"app/ui/dialog",templates:"../../templates",img:"../../img",landingpage:"./app/landingpage",mappage:"./app/mappage",setup:"./app/setup",jquery:"lib/jquery-1.11.3.min",bootstrap:"lib/bootstrap.min",text:"lib/requirejs/text",mustache:"lib/mustache.min",velocity:"lib/velocity.min",velocityUI:"lib/velocity.ui.min",slidebars:"lib/slidebars",jsPlumb:"lib/jsPlumb-2.0.5-min",farahey:"lib/farahey-0.5",customScrollbar:"lib/jquery.mCustomScrollbar.concat.min",datatables:"lib/datatables/jquery.dataTables.min",datatablesResponsive:"lib/datatables/extensions/responsive/dataTables.responsive",datatablesTableTools:"lib/datatables/extensions/tabletools/js/dataTables.tableTools",xEditable:"lib/bootstrap-editable.min",morris:"lib/morris.min",raphael:"lib/raphael-min",bootbox:"lib/bootbox.min",easyPieChart:"lib/jquery.easypiechart.min",dragToSelect:"lib/jquery.dragToSelect",hoverIntent:"lib/jquery.hoverIntent.minified",fullScreen:"lib/jquery.fullscreen.min",select2:"lib/select2.min",validator:"lib/validator.min",lazylinepainter:"lib/jquery.lazylinepainter-1.5.1.min",blueImpGallery:"lib/blueimp-gallery",blueImpGalleryHelper:"lib/blueimp-helper",blueImpGalleryBootstrap:"lib/bootstrap-image-gallery",bootstrapConfirmation:"lib/bootstrap-confirmation",bootstrapToggle:"lib/bootstrap2-toggle.min",lazyload:"lib/jquery.lazyload.min",easePack:"lib/EasePack.min",tweenLite:"lib/TweenLite.min",pnotify:"lib/pnotify/pnotify.core","pnotify.buttons":"lib/pnotify/pnotify.buttons","pnotify.confirm":"lib/pnotify/pnotify.confirm","pnotify.nonblock":"lib/pnotify/pnotify.nonblock","pnotify.desktop":"lib/pnotify/pnotify.desktop","pnotify.history":"lib/pnotify/pnotify.history","pnotify.callbacks":"lib/pnotify/pnotify.callbacks","pnotify.reference":"lib/pnotify/pnotify.reference"},shim:{bootstrap:{deps:["jquery"]},farahey:{deps:["jsPlumb"]},velocity:{deps:["jquery"]},velocityUI:{deps:["velocity"]},slidebars:{deps:["jquery"]},customScrollbar:{deps:["jquery"]},datatables:{deps:["jquery"]},datatablesBootstrap:{deps:["datatables"]},datatablesResponsive:{deps:["datatables"]},datatablesTableTools:{deps:["datatables"]},xEditable:{deps:["bootstrap"]},bootbox:{deps:["jquery","bootstrap"],exports:"bootbox"},morris:{deps:["jquery","raphael"],exports:"Morris"},pnotify:{deps:["jquery"]},easyPieChart:{deps:["jquery"]},dragToSelect:{deps:["jquery"]},hoverIntent:{deps:["jquery"]},fullScreen:{deps:["jquery"]},select2:{deps:["jquery"],exports:"Select2"},validator:{deps:["jquery","bootstrap"]},lazylinepainter:{deps:["jquery","bootstrap"]},blueImpGallery:{deps:["jquery"]},bootstrapConfirmation:{deps:["bootstrap"]},bootstrapToggle:{deps:["jquery"]},lazyload:{deps:["jquery"]}}});require.config({baseUrl:jsBaseUrl});requirejs([mainScriptPath]);
|
||||
//# sourceMappingURL=app.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"sources":["app.js.src.js"],"names":["mainScriptPath","document","body","getAttribute","jsBaseUrl","requirejs","config","baseUrl","paths","layout","dialog","templates","img","landingpage","mappage","setup","jquery","bootstrap","text","mustache","velocity","velocityUI","slidebars","jsPlumb","farahey","customScrollbar","datatables","datatablesResponsive","datatablesTableTools","xEditable","morris","raphael","bootbox","easyPieChart","dragToSelect","hoverIntent","fullScreen","select2","validator","lazylinepainter","blueImpGallery","blueImpGalleryHelper","blueImpGalleryBootstrap","bootstrapConfirmation","bootstrapToggle","lazyload","easePack","tweenLite","pnotify","pnotify.buttons","pnotify.confirm","pnotify.nonblock","pnotify.desktop","pnotify.history","pnotify.callbacks","pnotify.reference","shim","deps","datatablesBootstrap","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,YAAa,oBACbC,QAAS,gBACTC,MAAO,cAEPC,OAAQ,wBACRC,UAAW,oBACXC,KAAM,qBACNC,SAAU,mBACVC,SAAU,mBACVC,WAAY,sBACZC,UAAW,gBACXC,QAAS,wBACTC,QAAS,kBACTC,gBAAiB,yCACjBC,WAAY,uCAEZC,qBAAsB,6DAEtBC,qBAAsB,gEACtBC,UAAW,6BACXC,OAAQ,iBACRC,QAAS,kBACTC,QAAS,kBACTC,aAAc,8BACdC,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,QAAS,2BACTC,kBAAmB,8BACnBC,kBAAmB,8BACnBC,mBAAoB,+BACpBC,kBAAmB,8BACnBC,kBAAmB,8BACnBC,oBAAqB,gCACrBC,oBAAqB,iCAGzBC,MACIvC,WACIwC,MAAO,WAEXjC,SACIiC,MAAO,YAEXrC,UACIqC,MAAO,WAEXpC,YACIoC,MAAO,aAEXnC,WACImC,MAAO,WAEXhC,iBACIgC,MAAO,WAEX/B,YACI+B,MAAO,WAEXC,qBACID,MAAO,eAEX9B,sBACI8B,MAAO,eAEX7B,sBACI6B,MAAO,eAEX5B,WACI4B,MAAO,cAEXzB,SACIyB,MAAO,SAAU,aACjBE,QAAS,WAEb7B,QACI2B,MAAO,SAAU,WACjBE,QAAS,UAEbX,SACIS,MAAQ,WAEZxB,cACIwB,MAAQ,WAEZvB,cACIuB,MAAQ,WAEZtB,aACIsB,MAAQ,WAEZrB,YACIqB,MAAQ,WAEZpB,SACIoB,MAAQ,UACRE,QAAS,WAEbrB,WACImB,MAAQ,SAAU,cAEtBlB,iBACIkB,MAAQ,SAAU,cAEtBjB,gBACIiB,MAAQ,WAEZd,uBACIc,MAAQ,cAEZb,iBACIa,MAAQ,WAEZZ,UACIY,MAAQ,aAQpBG,SAAQtD,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
2
public/js/v1.0.0RC2/app.js
Normal file
2
public/js/v1.0.0RC2/app.js
Normal file
@@ -0,0 +1,2 @@
|
||||
var mainScriptPath=document.body.getAttribute("data-script"),jsBaseUrl=document.body.getAttribute("data-js-path");requirejs.config({baseUrl:"js",paths:{layout:"layout",config:"app/config",dialog:"app/ui/dialog",templates:"../../templates",img:"../../img",login:"./app/login",mappage:"./app/mappage",setup:"./app/setup",jquery:"lib/jquery-1.11.3.min",bootstrap:"lib/bootstrap.min",text:"lib/requirejs/text",mustache:"lib/mustache.min",velocity:"lib/velocity.min",velocityUI:"lib/velocity.ui.min",slidebars:"lib/slidebars",jsPlumb:"lib/dom.jsPlumb-1.7.6",farahey:"lib/farahey-0.5",customScrollbar:"lib/jquery.mCustomScrollbar.concat.min",datatables:"lib/datatables/jquery.dataTables.min",datatablesResponsive:"lib/datatables/extensions/responsive/dataTables.responsive",datatablesTableTools:"lib/datatables/extensions/tabletools/js/dataTables.tableTools",xEditable:"lib/bootstrap-editable.min",morris:"lib/morris.min",raphael:"lib/raphael-min",bootbox:"lib/bootbox.min",easyPieChart:"lib/jquery.easypiechart.min",dragToSelect:"lib/jquery.dragToSelect",hoverIntent:"lib/jquery.hoverIntent.minified",fullScreen:"lib/jquery.fullscreen.min",select2:"lib/select2.min",validator:"lib/validator.min",lazylinepainter:"lib/jquery.lazylinepainter-1.5.1.min",blueImpGallery:"lib/blueimp-gallery",blueImpGalleryHelper:"lib/blueimp-helper",blueImpGalleryBootstrap:"lib/bootstrap-image-gallery",bootstrapConfirmation:"lib/bootstrap-confirmation",bootstrapToggle:"lib/bootstrap2-toggle.min",lazyload:"lib/jquery.lazyload.min",easePack:"lib/EasePack.min",tweenLite:"lib/TweenLite.min",pnotify:"lib/pnotify/pnotify.core","pnotify.buttons":"lib/pnotify/pnotify.buttons","pnotify.confirm":"lib/pnotify/pnotify.confirm","pnotify.nonblock":"lib/pnotify/pnotify.nonblock","pnotify.desktop":"lib/pnotify/pnotify.desktop","pnotify.history":"lib/pnotify/pnotify.history","pnotify.callbacks":"lib/pnotify/pnotify.callbacks","pnotify.reference":"lib/pnotify/pnotify.reference"},shim:{bootstrap:{deps:["jquery"]},farahey:{deps:["jsPlumb"]},velocity:{deps:["jquery"]},velocityUI:{deps:["velocity"]},slidebars:{deps:["jquery"]},customScrollbar:{deps:["jquery"]},datatables:{deps:["jquery"]},datatablesBootstrap:{deps:["datatables"]},datatablesResponsive:{deps:["datatables"]},datatablesTableTools:{deps:["datatables"]},xEditable:{deps:["bootstrap"]},bootbox:{deps:["jquery","bootstrap"],exports:"bootbox"},morris:{deps:["jquery","raphael"],exports:"Morris"},pnotify:{deps:["jquery"]},easyPieChart:{deps:["jquery"]},dragToSelect:{deps:["jquery"]},hoverIntent:{deps:["jquery"]},fullScreen:{deps:["jquery"]},select2:{deps:["jquery"],exports:"Select2"},validator:{deps:["jquery","bootstrap"]},lazylinepainter:{deps:["jquery","bootstrap"]},blueImpGallery:{deps:["jquery"]},bootstrapConfirmation:{deps:["bootstrap"]},bootstrapToggle:{deps:["jquery"]},lazyload:{deps:["jquery"]}}});require.config({baseUrl:jsBaseUrl});requirejs([mainScriptPath]);
|
||||
//# sourceMappingURL=app.js.map
|
||||
1
public/js/v1.0.0RC2/app.js.map
Normal file
1
public/js/v1.0.0RC2/app.js.map
Normal file
@@ -0,0 +1 @@
|
||||
{"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","velocity","velocityUI","slidebars","jsPlumb","farahey","customScrollbar","datatables","datatablesResponsive","datatablesTableTools","xEditable","morris","raphael","bootbox","easyPieChart","dragToSelect","hoverIntent","fullScreen","select2","validator","lazylinepainter","blueImpGallery","blueImpGalleryHelper","blueImpGalleryBootstrap","bootstrapConfirmation","bootstrapToggle","lazyload","easePack","tweenLite","pnotify","pnotify.buttons","pnotify.confirm","pnotify.nonblock","pnotify.desktop","pnotify.history","pnotify.callbacks","pnotify.reference","shim","deps","datatablesBootstrap","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,wBACRC,UAAW,oBACXC,KAAM,qBACNC,SAAU,mBACVC,SAAU,mBACVC,WAAY,sBACZC,UAAW,gBACXC,QAAS,wBACTC,QAAS,kBACTC,gBAAiB,yCACjBC,WAAY,uCAEZC,qBAAsB,6DAEtBC,qBAAsB,gEACtBC,UAAW,6BACXC,OAAQ,iBACRC,QAAS,kBACTC,QAAS,kBACTC,aAAc,8BACdC,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,QAAS,2BACTC,kBAAmB,8BACnBC,kBAAmB,8BACnBC,mBAAoB,+BACpBC,kBAAmB,8BACnBC,kBAAmB,8BACnBC,oBAAqB,gCACrBC,oBAAqB,iCAGzBC,MACIvC,WACIwC,MAAO,WAEXjC,SACIiC,MAAO,YAEXrC,UACIqC,MAAO,WAEXpC,YACIoC,MAAO,aAEXnC,WACImC,MAAO,WAEXhC,iBACIgC,MAAO,WAEX/B,YACI+B,MAAO,WAEXC,qBACID,MAAO,eAEX9B,sBACI8B,MAAO,eAEX7B,sBACI6B,MAAO,eAEX5B,WACI4B,MAAO,cAEXzB,SACIyB,MAAO,SAAU,aACjBE,QAAS,WAEb7B,QACI2B,MAAO,SAAU,WACjBE,QAAS,UAEbX,SACIS,MAAQ,WAEZxB,cACIwB,MAAQ,WAEZvB,cACIuB,MAAQ,WAEZtB,aACIsB,MAAQ,WAEZrB,YACIqB,MAAQ,WAEZpB,SACIoB,MAAQ,UACRE,QAAS,WAEbrB,WACImB,MAAQ,SAAU,cAEtBlB,iBACIkB,MAAQ,SAAU,cAEtBjB,gBACIiB,MAAQ,WAEZd,uBACIc,MAAQ,cAEZb,iBACIa,MAAQ,WAEZZ,UACIY,MAAQ,aAQpBG,SAAQtD,QACJC,QAASH,WAIbC,YAAYL","file":"app.js.map"}
|
||||
@@ -17,7 +17,7 @@ requirejs.config({
|
||||
img: '../../img', // images dir
|
||||
|
||||
// main views
|
||||
landingpage: './app/landingpage', // initial start "landing page" view
|
||||
login: './app/login', // initial start "login page" view
|
||||
mappage: './app/mappage', // initial start "map page" view
|
||||
setup: './app/setup', // initial start "setup page" view
|
||||
|
||||
@@ -28,7 +28,7 @@ requirejs.config({
|
||||
velocity: 'lib/velocity.min', // v1.2.2 animation engine - http://julian.com/research/velocity/
|
||||
velocityUI: 'lib/velocity.ui.min', // v5.0.4 plugin for velocity - http://julian.com/research/velocity/#uiPack
|
||||
slidebars: 'lib/slidebars', // v0.10 Slidebars - side menu plugin http://plugins.adchsm.me/slidebars/
|
||||
jsPlumb: 'lib/jsPlumb-2.0.5-min', // v2.0.5 jsPlumb (Vanilla)- main map draw plugin https://jsplumbtoolkit.com/
|
||||
jsPlumb: 'lib/dom.jsPlumb-1.7.6', // v1.7.6 jsPlumb (Vanilla)- main map draw plugin https://jsplumbtoolkit.com/
|
||||
farahey: 'lib/farahey-0.5', // v0.5 jsPlumb "magnetizing" extension - https://github.com/jsplumb/farahey
|
||||
customScrollbar: 'lib/jquery.mCustomScrollbar.concat.min', // v3.0.9 Custom scroll bars - http://manos.malihu.gr/
|
||||
datatables: 'lib/datatables/jquery.dataTables.min', // v1.10.7 DataTables - https://datatables.net/
|
||||
File diff suppressed because one or more lines are too long
1
public/js/v1.0.0RC2/app/login.js.map
Normal file
1
public/js/v1.0.0RC2/app/login.js.map
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
public/js/v1.0.0RC2/app/mappage.js.map
Normal file
1
public/js/v1.0.0RC2/app/mappage.js.map
Normal file
File diff suppressed because one or more lines are too long
2
public/js/v1.0.0RC2/app/notification.js
Normal file
2
public/js/v1.0.0RC2/app/notification.js
Normal file
File diff suppressed because one or more lines are too long
1
public/js/v1.0.0RC2/app/notification.js.map
Normal file
1
public/js/v1.0.0RC2/app/notification.js.map
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
public/js/v1.0.0RC2/app/setup.js.map
Normal file
1
public/js/v1.0.0RC2/app/setup.js.map
Normal file
File diff suppressed because one or more lines are too long
@@ -1,4 +1,42 @@
|
||||
|
||||
app/login.js
|
||||
----------------
|
||||
lib/jquery-1.11.3.min.js
|
||||
app/init.js
|
||||
app/config/system_effect.js
|
||||
app/config/signature_type.js
|
||||
lib/bootstrap.min.js
|
||||
lib/bootbox.min.js
|
||||
app/ccp.js
|
||||
lib/velocity.min.js
|
||||
lib/velocity.ui.min.js
|
||||
lib/jquery.mCustomScrollbar.concat.min.js
|
||||
lib/validator.min.js
|
||||
lib/bootstrap-editable.min.js
|
||||
lib/jquery.easypiechart.min.js
|
||||
lib/jquery.hoverIntent.minified.js
|
||||
lib/bootstrap-confirmation.js
|
||||
lib/bootstrap2-toggle.min.js
|
||||
app/util.js
|
||||
lib/mustache.min.js
|
||||
app/render.js
|
||||
lib/blueimp-helper.js
|
||||
lib/blueimp-gallery.js
|
||||
lib/jquery.lazyload.min.js
|
||||
lib/EasePack.min.js
|
||||
lib/TweenLite.min.js
|
||||
app/ui/header.js
|
||||
lib/jquery.lazylinepainter-1.5.1.min.js
|
||||
app/ui/logo.js
|
||||
app/ui/demo_map.js
|
||||
app/ui/dialog/account_settings.js
|
||||
app/ui/dialog/notification.js
|
||||
app/ui/dialog/manual.js
|
||||
app/ui/dialog/releases.js
|
||||
app/ui/dialog/credit.js
|
||||
app/login.js
|
||||
lib/requirejs/text.js
|
||||
|
||||
app/mappage.js
|
||||
----------------
|
||||
lib/jquery-1.11.3.min.js
|
||||
@@ -50,7 +88,7 @@ app/ui/system_killboard.js
|
||||
lib/datatables/jquery.dataTables.min.js
|
||||
lib/datatables/extensions/tabletools/js/dataTables.tableTools.js
|
||||
lib/datatables/extensions/responsive/dataTables.responsive.js
|
||||
lib/jsPlumb-2.0.5-min.js
|
||||
lib/dom.jsPlumb-1.7.6.js
|
||||
lib/farahey-0.5.js
|
||||
app/map/magnetizing.js
|
||||
lib/jquery.dragToSelect.js
|
||||
@@ -63,44 +101,6 @@ app/page.js
|
||||
app/ui/form_element.js
|
||||
app/mappage.js
|
||||
|
||||
app/landingpage.js
|
||||
----------------
|
||||
lib/jquery-1.11.3.min.js
|
||||
app/init.js
|
||||
app/config/system_effect.js
|
||||
app/config/signature_type.js
|
||||
lib/bootstrap.min.js
|
||||
lib/bootbox.min.js
|
||||
app/ccp.js
|
||||
lib/velocity.min.js
|
||||
lib/velocity.ui.min.js
|
||||
lib/jquery.mCustomScrollbar.concat.min.js
|
||||
lib/validator.min.js
|
||||
lib/bootstrap-editable.min.js
|
||||
lib/jquery.easypiechart.min.js
|
||||
lib/jquery.hoverIntent.minified.js
|
||||
lib/bootstrap-confirmation.js
|
||||
lib/bootstrap2-toggle.min.js
|
||||
app/util.js
|
||||
lib/mustache.min.js
|
||||
app/render.js
|
||||
lib/blueimp-helper.js
|
||||
lib/blueimp-gallery.js
|
||||
lib/jquery.lazyload.min.js
|
||||
lib/EasePack.min.js
|
||||
lib/TweenLite.min.js
|
||||
app/ui/header.js
|
||||
lib/jquery.lazylinepainter-1.5.1.min.js
|
||||
app/ui/logo.js
|
||||
app/ui/demo_map.js
|
||||
app/ui/dialog/account_settings.js
|
||||
app/ui/dialog/notification.js
|
||||
app/ui/dialog/manual.js
|
||||
app/ui/dialog/releases.js
|
||||
app/ui/dialog/credit.js
|
||||
app/landingpage.js
|
||||
lib/requirejs/text.js
|
||||
|
||||
app/setup.js
|
||||
----------------
|
||||
lib/jquery-1.11.3.min.js
|
||||
7
public/js/v1.0.0RC2/lib/jsPlumb-2.0.5.js
Normal file
7
public/js/v1.0.0RC2/lib/jsPlumb-2.0.5.js
Normal file
File diff suppressed because one or more lines are too long
1
public/js/v1.0.0RC2/lib/jsPlumb-2.0.5.js.map
Normal file
1
public/js/v1.0.0RC2/lib/jsPlumb-2.0.5.js.map
Normal file
File diff suppressed because one or more lines are too long
12733
public/js/v1.0.0RC2/lib/jsPlumb-2.0.5.js.src.js
Normal file
12733
public/js/v1.0.0RC2/lib/jsPlumb-2.0.5.js.src.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -144,9 +144,9 @@
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
{*
|
||||
<a href="{{ 'sso','action=requestAuthorization' | alias }}">SSO login</a>
|
||||
*}
|
||||
|
||||
{* features/ gallery *}
|
||||
<section id="pf-landing-gallery">
|
||||
Reference in New Issue
Block a user