- added new character setting for "auto update location", closed #220

This commit is contained in:
Exodus4D
2016-10-29 20:22:11 +02:00
parent 70d8974e19
commit a24a32fb3b
12 changed files with 207 additions and 104 deletions

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

@@ -89,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']
],
@@ -125,6 +130,7 @@ class CharacterModel extends BasicModel {
$characterData->id = $this->id;
$characterData->name = $this->name;
$characterData->shared = $this->shared;
$characterData->logLocation = $this->logLocation;
if($addCharacterLogData){
if($logModel = $this->getLog()){
@@ -185,6 +191,19 @@ 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
@@ -230,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
@@ -383,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;
}
}
}
@@ -487,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

@@ -53,7 +53,6 @@ define([
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
@@ -402,7 +401,7 @@ define([
userCharacterImageClass: config.userCharacterImageClass,
userShipClass: config.headUserShipClass,
userShipImageClass: config.userShipImageClass,
mapTrackingId: config.headMapTrackingId
mapTrackingId: Util.config.headMapTrackingId
};
var headRendered = Mustache.render(TplHead, moduleData);
@@ -447,7 +446,7 @@ define([
});
// tracking toggle
var mapTrackingCheckbox = $('#' + config.headMapTrackingId);
var mapTrackingCheckbox = $('#' + Util.config.headMapTrackingId);
mapTrackingCheckbox.bootstrapToggle({
size: 'mini',
on: 'on',
@@ -494,7 +493,6 @@ define([
* load page footer
*/
$.fn.loadFooter = function(){
var pageElement = $(this);
var moduleData = {
@@ -727,7 +725,6 @@ define([
* updates the header with current user data
*/
$.fn.updateHeaderUserData = function(){
var userData = Util.getCurrentUserData();
var userInfoElement = $('.' + config.headUserCharacterClass);
@@ -771,7 +768,7 @@ define([
};
// check for changes
// check for character/ship changes ---------------------------------------------
if(
userData &&
userData.character
@@ -783,6 +780,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 +831,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
*/

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

@@ -393,22 +393,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');

File diff suppressed because one or more lines are too long

View File

@@ -53,7 +53,6 @@ define([
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
@@ -402,7 +401,7 @@ define([
userCharacterImageClass: config.userCharacterImageClass,
userShipClass: config.headUserShipClass,
userShipImageClass: config.userShipImageClass,
mapTrackingId: config.headMapTrackingId
mapTrackingId: Util.config.headMapTrackingId
};
var headRendered = Mustache.render(TplHead, moduleData);
@@ -447,7 +446,7 @@ define([
});
// tracking toggle
var mapTrackingCheckbox = $('#' + config.headMapTrackingId);
var mapTrackingCheckbox = $('#' + Util.config.headMapTrackingId);
mapTrackingCheckbox.bootstrapToggle({
size: 'mini',
on: 'on',
@@ -494,7 +493,6 @@ define([
* load page footer
*/
$.fn.loadFooter = function(){
var pageElement = $(this);
var moduleData = {
@@ -727,7 +725,6 @@ define([
* updates the header with current user data
*/
$.fn.updateHeaderUserData = function(){
var userData = Util.getCurrentUserData();
var userInfoElement = $('.' + config.headUserCharacterClass);
@@ -771,7 +768,7 @@ define([
};
// check for changes
// check for character/ship changes ---------------------------------------------
if(
userData &&
userData.character
@@ -783,6 +780,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 +831,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
*/

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

@@ -393,22 +393,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');

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

@@ -40,7 +40,7 @@
<i class="fa fa-fw fa-bolt"></i>
<span>offline</span>
</p>
<p class="navbar-text" title="map tracking">
<p class="navbar-text" title="map connection tracking">
<i class="fa fa-fw fa-location-arrow"></i>
<input id="{{mapTrackingId}}" type="checkbox" data-toggle="toggle" value="1" >
</p>

View File

@@ -13,6 +13,11 @@
&.pf-dynamic-area{
min-height: 0;
margin: 10px 0;
& > img{
margin: -10px 5px -10px -10px;
width: 35px;
}
}
}