admin page v1

This commit is contained in:
2019-03-31 22:07:21 +02:00
parent e4a8cc7dbb
commit a9956a6a2e
10 changed files with 180 additions and 15 deletions

View File

@@ -29,6 +29,10 @@ class Project extends PhpObject {
$this->oDb = &$oDb;
}
public function getProjectId() {
return $this->iProjectId;
}
public function setProjectId($iProjectId=0) {
if($iProjectId > 0) {
$this->iProjectId = $iProjectId;
@@ -53,25 +57,47 @@ class Project extends PhpObject {
return $this->sMode;
}
public function getProjectId() {
return $this->iProjectId;
}
public function getProjectCodeName() {
return $this->sCodeName;
}
public function setProjectCodeName($sCodeName) {
return $this->updateField('codename', $sCodeName);
}
public function getActivePeriod($sFromTo='') {
return ($sFromTo=='')?$this->asActive:$this->asActive[$sFromTo];
}
public function setActivePeriod($oValue, $sFromTo='') {
if($sFromTo=='') {
$this->updateField('active_from', $oValue['from']);
return $this->updateField('active_to', $oValue['to']);
}
else {
return $this->updateField('active_'.$sFromTo, $oValue);
}
}
public function getTimeZone() {
return $this->asGeo['timezone'];
}
public function setTimeZone($sTimeZone) {
return $this->updateField('timezone', $sTimeZone);
}
public function getGeoFile() {
return $this->asGeo['file'];
}
public function getFeedIds() {
return $this->oDb->selectColumn(
Feed::FEED_TABLE,
Db::getId(Feed::FEED_TABLE),
array(Db::getId(self::PROJ_TABLE) => $this->getProjectId())
);
}
public function getProjects($iProjectId=0) {
$bSpecificProj = ($iProjectId > 0);
@@ -109,17 +135,13 @@ class Project extends PhpObject {
return $bSpecificProj?$asProject:$asProjects;
}
public function getFeedIds() {
return $this->oDb->selectColumn(
Feed::FEED_TABLE,
Db::getId(Feed::FEED_TABLE),
array(Db::getId(self::PROJ_TABLE) => $this->getProjectId())
);
public function getProject() {
return $this->getProjects($this->getProjectId());
}
private function setProjectInfo() {
if($this->getProjectId() > 0) {
$asProject = $this->getProjects($this->getProjectId());
$asProject = $this->getProject();
$this->sMode = $asProject['mode'];
$this->asActive = array('from'=>$asProject['active_from'], 'to'=>$asProject['active_to']);
@@ -129,4 +151,11 @@ class Project extends PhpObject {
}
else $this->addError('Error while setting project: no project ID');
}
private function updateField($sField, $oValue) {
$bResult = ($this->oDb->updateRow(self::PROJ_TABLE, $this->getProjectId(), array($sField=>$oValue)) > 0);
$this->setProjectInfo();
return $bResult;
}
}

View File

@@ -327,6 +327,31 @@ class Spot extends Main
return self::getJsonResult(true, '');
}
public function getAdminSettings() {
return self::getJsonResult(true, '', array('projects'=>$this->oProject->getProjects()));
}
public function setAdminSettings($sField, $sValue) {
$bSuccess = false;
$sDesc = '';
switch($sField) {
case 'codename':
$bSuccess = $this->oProject->setProjectCodeName($sValue);
break;
case 'active_from':
case 'active_to':
$bSuccess = $this->oProject->setActivePeriod($sValue, mb_substr($sField, 7));
break;
case 'timezone':
$bSuccess = $this->oProject->setTimeZone($sValue);
break;
}
if(!$bSuccess) $sDesc = 'Issue committing to DB';
return self::getJsonResult($bSuccess, $sDesc, array('values'=>$this->oProject->getProject()));
}
public static function DecToDMS($dValue, $sType='lat') {
if($sType=='lat') $sDirection = ($dValue >= 0)?'N':'S';
else $sDirection = ($dValue >= 0)?'E':'W';

View File

@@ -17,6 +17,8 @@ $sName = isset($_GET['name'])?$_GET['name']:'';
$sContent = isset($_GET['content'])?$_GET['content']:'';
$iChunk = isset($_GET['chunk'])?$_GET['chunk']:0;
$iProjectId = isset($_REQUEST['project_id'])?$_REQUEST['project_id']:0;
$sField = isset($_REQUEST['field'])?$_REQUEST['field']:'';
$oValue = isset($_REQUEST['value'])?$_REQUEST['value']:'';
//Initiate class
$oSpot = new Spot($oClassManagement, __FILE__);
@@ -45,6 +47,12 @@ if($sAction!='')
case 'sync_pics':
$sResult = $oSpot->syncPics();
break;
case 'get_admin':
$sResult = $oSpot->getAdminSettings();
break;
case 'set_admin':
$sResult = $oSpot->setAdminSettings($sField, $oValue);
break;
default:
$sResult = Main::getJsonResult(false, Main::NOT_FOUND);
}

88
masks/admin.html Normal file
View File

@@ -0,0 +1,88 @@
<div id="admin">
<div id="projects">
<table>
<tr>
<th>Project</th>
<th>Mode</th>
<th>Code Name</th>
<th>Start</th>
<th>End</th>
<th>Time Zone</th>
</tr>
</table>
</div>
<div id="feedback"></div>
</div>
<script type="text/javascript">
oSpot.pageInit = function(asHash) {
self.get(
'get_admin',
function(asData){
setProjects(asData.projects);
},
{},
function(e){console.log(e);}
);
};
oSpot.onFeedback = function(sType, sMsg, asContext) {
delete asContext.a;
sMsg += ' (context: ';
$.each(asContext, function(sKey, sElem) {
sMsg += sKey+'='+sElem+' / ' ;
});
sMsg = sMsg.slice(0, -3)+')';
$('#feedback').append($('<p>', {'class': sType}).text(sMsg));
};
function setProjects(asProjects) {
$.each(asProjects, function(iKey, oProject) {
var sElemId = 'proj_'+oProject.id;
var $Project = ($('#'+sElemId).length==0)?$('<tr>', {'id': sElemId}):$('#'+sElemId).empty();
console.log(sElemId);
console.log($('#'.sElemId).length);
$Project
.data('project_id', oProject.id)
.append($('<td>', {'class': 'name'}).text(oProject.name))
.append($('<td>', {'class': 'mode'}).text(oProject.mode))
.append($('<td>').addInput('text', 'codename', oProject.codename))
.append($('<td>').addInput('date', 'active_from', oProject.active_from.substr(0, 10)))
.append($('<td>').addInput('date', 'active_to', oProject.active_to.substr(0, 10)))
.append($('<td>').addInput('text', 'timezone', oProject.timezone))
.appendTo($('#projects').find('table'));
});
$('input')
.change(commit)
.keyup(waitAndCommit);
}
function commit(event, $This) {
$This = $This || $(this);
var sNewVal = $This.val();
if($This.data('old_value')!=sNewVal) { console.log('commit');
$This.data('old_value', sNewVal);
var asInputs = {project_id: $This.closest('tr').data('project_id'), field: $This.attr('name'), value: sNewVal};
self.get(
'set_admin',
function(asData){
oSpot.onFeedback('success', 'Sauvegarde OK', asInputs);
setProjects([asData.values]);
},
asInputs,
function(sError){
oSpot.onFeedback('error', sError, asInputs);
}
);
}
}
function waitAndCommit(event) { console.log('waitAndCommit');
if(typeof self.tmp('wait') != 'undefined') clearTimeout(self.tmp('wait'));
self.tmp('wait', setTimeout(()=>{commit(event,$(this));}, 1000));
}
</script>

View File

@@ -226,6 +226,11 @@ function setElem(aoAnchor, asPath, oValue)
}
}
$.prototype.addInput = function(sType, sName, sValue)
{
return $(this).append($('<input>', {type: sType, name: sName, value: sValue}).data('old_value', sValue));
};
$.prototype.addIcon = function(sIcon, bMargin, sStyle)
{
bMargin = bMargin || false;

9
style/_mask_admin.scss Normal file
View File

@@ -0,0 +1,9 @@
#feedback {
.error {
color: red;
}
.success {
color: green;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -11,5 +11,6 @@
/* Pages Specific CSS (masks) */
@import 'mask_project';
@import 'mask_upload';
@import 'mask_admin';
@import 'mobile';

2
todo
View File

@@ -1,4 +1,4 @@
To Do List
----------
- Check that update feed works
- admin page #admin to manage projects
- require js