Browse Source

ADD: admin->esl status-> add some extra infos

Giancarlo 7 years ago
parent
commit
ec298e965b

+ 1 - 0
.gitignore

@@ -58,3 +58,4 @@ bundle.js
 bundle.css
 bundle.css
 /cfg/*.bin
 /cfg/*.bin
 /src/OpenMind/Admin/ui/assets/build
 /src/OpenMind/Admin/ui/assets/build
+/fbtpl

+ 0 - 1
index.php

@@ -33,6 +33,5 @@ $frameworkUtils->LoadEncryptedConfig('cfg/config.bin');
 // Dynamic Module Loading
 // Dynamic Module Loading
 $frameworkUtils->PluginLoader('src/');
 $frameworkUtils->PluginLoader('src/');
 
 
-
 // Run Framework!!
 // Run Framework!!
 $f3->run();
 $f3->run();

+ 1 - 9
omlink.sql

@@ -48,14 +48,6 @@ CREATE TABLE `queuesystem` (
 ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;
 ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;
 
 
 
 
-DROP TABLE IF EXISTS `system`;
-CREATE TABLE `system` (
-  `config` varchar(2000) NOT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
-INSERT INTO `system` (`config`) VALUES
-('');
-
 DROP TABLE IF EXISTS `users`;
 DROP TABLE IF EXISTS `users`;
 CREATE TABLE `users` (
 CREATE TABLE `users` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `id` int(11) NOT NULL AUTO_INCREMENT,
@@ -70,4 +62,4 @@ INSERT INTO `users` (`id`, `username`, `saltedpassword`, `roles`, `avatar`) VALU
 (1,	'admin',	'$2y$10$cJiNAGj.XSELKuVuQ9gSwOlExVSDGj6IsuIsSsK.fV0KEJX56ncWK',	'a:2:{i:0;s:5:\"admin\";i:1;s:4:\"demo\";}',	''),
 (1,	'admin',	'$2y$10$cJiNAGj.XSELKuVuQ9gSwOlExVSDGj6IsuIsSsK.fV0KEJX56ncWK',	'a:2:{i:0;s:5:\"admin\";i:1;s:4:\"demo\";}',	''),
 (2,	'operatore1',	'$2y$10$9uRKekk0i9Z08fXQFSjW6.PK6l/fk956bNvMjmBMmaJNqo9KJ5Txu',	'a:1:{i:0;s:4:\"demo\";}',	'');
 (2,	'operatore1',	'$2y$10$9uRKekk0i9Z08fXQFSjW6.PK6l/fk956bNvMjmBMmaJNqo9KJ5Txu',	'a:1:{i:0;s:4:\"demo\";}',	'');
 
 
--- 2019-04-16 20:35:14
+-- 2019-04-22 22:27:01

+ 6 - 2
src/OpenMind/Admin/Pages.php

@@ -101,9 +101,13 @@ class Pages extends Controller
 				$labelID = $configOBJ->label_id;
 				$labelID = $configOBJ->label_id;
 				$esl = new SmartESL($this->findBoxCore, [$labelID]);
 				$esl = new SmartESL($this->findBoxCore, [$labelID]);
 				$status = $esl->GetStatus(true);
 				$status = $esl->GetStatus(true);
+
+				$svgPath = $this->findBoxCore->GetTemplateImage($status[$configOBJ->label_id]['data']['template_id']);
+
 				echo json_encode([
 				echo json_encode([
-					"err" => "Configuration reloaded successfully",
-					"value" => $status[$configOBJ->label_id]
+					"err" => "Status reloaded successfully",
+					"value" => $status[$configOBJ->label_id],
+					"svgPath" => $svgPath
 				]);
 				]);
 
 
 				break;
 				break;

+ 53 - 9
src/OpenMind/Admin/ui/assets/js/admin.js

@@ -1,3 +1,5 @@
+var SignalAbortFetch = null;
+
 const fetchHeaders = {
 const fetchHeaders = {
 	'Accept': 'text/html',
 	'Accept': 'text/html',
 	'Content-Type': 'text/html',
 	'Content-Type': 'text/html',
@@ -8,6 +10,12 @@ const fetchHeaders = {
 };
 };
 
 
 $(function () {
 $(function () {
+	$.fn.dataTable.ext.order['dom-checkbox'] = function (settings, col) {
+		return this.api().column(col, {order: 'index'}).nodes().map(function (td, i) {
+			return $('input', td).prop('checked') ? '1' : '0';
+		});
+	};
+
 	// DataTable fix
 	// DataTable fix
 	$("#datatable").DataTable({
 	$("#datatable").DataTable({
 		paging: false,
 		paging: false,
@@ -21,13 +29,21 @@ $(function () {
 				railOpacity: .3,
 				railOpacity: .3,
 				height: "50vh"
 				height: "50vh"
 			})
 			})
-		}
+		},
+		"columnDefs": [
+			{"orderDataType": "dom-checkbox", "targets": 0},
+			{'orderable': false, "targets": -1}
+		]
 	});
 	});
 
 
 	$('.statusmodal').on('shown.bs.modal', function () {
 	$('.statusmodal').on('shown.bs.modal', function () {
 		labelID = $('.statusmodal #labelID').html();
 		labelID = $('.statusmodal #labelID').html();
 		refreshESLStatus(labelID);
 		refreshESLStatus(labelID);
 	});
 	});
+
+	$('.statusmodal').on('hide.bs.modal', function () {
+		SignalAbortFetch.abort();
+	});
 });
 });
 
 
 /**
 /**
@@ -42,7 +58,7 @@ $(function () {
  * @returns {Promise<Response | never>}
  * @returns {Promise<Response | never>}
  */
  */
 function AjaxReq(url, options) {
 function AjaxReq(url, options) {
-	let defaults = {headers: fetchHeaders}
+	let defaults = {headers: fetchHeaders};
 	// Extend default options
 	// Extend default options
 	Object.assign(defaults, options);
 	Object.assign(defaults, options);
 
 
@@ -78,32 +94,60 @@ function LoadConfig() {
 }
 }
 
 
 function OpenESLDetails(labelID) {
 function OpenESLDetails(labelID) {
+	SignalAbortFetch = new AbortController();
+
+	$('#esl_rssi_list').html('');
+	$('#svgpath').removeAttr('src');
+
 	$('.statusmodal #labelID').html(labelID);
 	$('.statusmodal #labelID').html(labelID);
 	$('.statusmodal').modal('show');
 	$('.statusmodal').modal('show');
 }
 }
 
 
-function fillStatusApList(ESLstatus) {
+function fillESLDetails(ESLstatus) {
 	$('#esl_rssi_list').html('');
 	$('#esl_rssi_list').html('');
-	for (let [ap, rssi] of Object.entries(ESLstatus)) {
-		let ap_rssi = `<div class="ml-4"><span class="badge badge-primary">${ap}</span><span class="ml-2 badge text-inverse badge-warning">${rssi}</span></div>`;
+	$('#svgpath').removeAttr('src');
+
+	$('#esl_rssi').html(ESLstatus.value.status.rssi);
+	$('#hello').html(ESLstatus.value.status.hello_period);
+	$('#blink_count').html(ESLstatus.value.status.blink_count);
+	let hardver = `${ESLstatus.value.status.hard_major}.${ESLstatus.value.status.hard_minor}.${ESLstatus.value.status.hard_patch}`;
+	let softver = `${ESLstatus.value.status.soft_major}.${ESLstatus.value.status.soft_minor}.${ESLstatus.value.status.soft_patch}`;
+	$('#hardware_ver').html(hardver);
+	$('#software_ver').html(softver);
+
+	for (let [ap, rssi] of Object.entries(ESLstatus.value.rssi)) {
+		let ap_rssi = `<div><span class="badge badge-primary">${ap}</span><span class="badge text-inverse badge-warning">${rssi}</span></div>`;
 		$('#esl_rssi_list').append(ap_rssi);
 		$('#esl_rssi_list').append(ap_rssi);
 	}
 	}
+
+	if (ESLstatus.svgPath != null)
+		$('#svgpath').prop('src', BASEURL + '/' + ESLstatus.svgPath);
 }
 }
 
 
 function refreshESLStatus(labelID) {
 function refreshESLStatus(labelID) {
+	$('#spinnerloader').removeClass('d-none');
+
 	AjaxReq(`${BASEURL}/admin/config`, {
 	AjaxReq(`${BASEURL}/admin/config`, {
 		method: 'POST',
 		method: 'POST',
-		body: JSON.stringify({"method": "geteslstatus", "label_id": labelID})
+		body: JSON.stringify({"method": "geteslstatus", "label_id": labelID}),
+		signal: SignalAbortFetch.signal
 	})
 	})
 		.then(json => {
 		.then(json => {
-			$('#esl_rssi').html(json.value.status.rssi);
-			fillStatusApList(json.value.rssi);
+			fillESLDetails(json);
 			toastr.success(json.err);
 			toastr.success(json.err);
+			if ($('.statusmodal').is(':visible'))
+				setTimeout(function () {
+					refreshESLStatus(labelID);
+				}, 3000);
 		})
 		})
 		.catch(err => {
 		.catch(err => {
+			if (err.name == 'AbortError')
+				return;
 			if (err.url !== undefined)
 			if (err.url !== undefined)
 				toastr.error(err.url, `${err.status} (${err.statusText})`);
 				toastr.error(err.url, `${err.status} (${err.statusText})`);
 			else
 			else
 				toastr.error(err);
 				toastr.error(err);
-		});
+		}).finally(function () {
+		$('#spinnerloader').addClass('d-none');
+	});
 }
 }

+ 62 - 4
src/OpenMind/Admin/ui/labelstatus.tpl

@@ -22,6 +22,7 @@
 			<table id="datatable" class="table dt-responsive responsive table-bordered mb-0">
 			<table id="datatable" class="table dt-responsive responsive table-bordered mb-0">
 				<thead>
 				<thead>
 				<tr>
 				<tr>
+					<th></th>
 					<th>Label ID</th>
 					<th>Label ID</th>
 					<th>Status</th>
 					<th>Status</th>
 					<th>Template</th>
 					<th>Template</th>
@@ -36,6 +37,14 @@
 				<repeat group="{{@ESL_STATUS}}" key="{{@LABEL_ID}}" value="{{@STATUS}}">
 				<repeat group="{{@ESL_STATUS}}" key="{{@LABEL_ID}}" value="{{@STATUS}}">
 
 
 					<tr>
 					<tr>
+						<td class="text-center">
+
+							<div class="checkbox checkbox-single checkbox-primary">
+								<input id="chk_{{@LABEL_ID}}" type="checkbox" name="sel[]" value="{{@LABEL_ID}}"/>
+								<label></label>
+							</div>
+
+						</td>
 						<td><span class="text-white font-weight-bold">{{@LABEL_ID}}</span></td>
 						<td><span class="text-white font-weight-bold">{{@LABEL_ID}}</span></td>
 						<td><span class="badge badge-{{@STATUS_BADGE_COLOR[@STATUS['data']['esl_state']]}}">{{@STATUS['data']['esl_state']}}</span></td>
 						<td><span class="badge badge-{{@STATUS_BADGE_COLOR[@STATUS['data']['esl_state']]}}">{{@STATUS['data']['esl_state']}}</span></td>
 						<td>[{{@STATUS['data']['template_id']}}] {{@STATUS['data']['template_name']}}</td>
 						<td>[{{@STATUS['data']['template_id']}}] {{@STATUS['data']['template_name']}}</td>
@@ -55,17 +64,66 @@
 	</div>
 	</div>
 </div>
 </div>
 
 
-{* Modal *}
+{* Modal Status *}
 <div class="modal fade statusmodal" tabindex="-1" role="dialog" aria-labelledby="statusmodal" aria-hidden="true" style="display: none;">
 <div class="modal fade statusmodal" tabindex="-1" role="dialog" aria-labelledby="statusmodal" aria-hidden="true" style="display: none;">
-	<div class="modal-dialog modal-sm">
+	<div class="modal-dialog modal-dialog-centered">
 		<div class="modal-content">
 		<div class="modal-content">
 			<div class="modal-header">
 			<div class="modal-header">
 				<h4 class="modal-title mt-0" id="statusmodal">Status label <span id="labelID"></span></h4>
 				<h4 class="modal-title mt-0" id="statusmodal">Status label <span id="labelID"></span></h4>
 				<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
 				<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
 			</div>
 			</div>
 			<div class="modal-body">
 			<div class="modal-body">
-				RSSI: <span class="badge badge-warning text-inverse" id="esl_rssi"></span><br/>
-				RSS_AP: <span id="esl_rssi_list"></span>
+				<div class="row">
+
+					<div class="col-6">
+						<div class="card" id="status_values">
+							<h5 class="card-header">RSSI <span class="badge badge-warning text-inverse" id="esl_rssi"></span></h5>
+							<div class="card-body">
+								<div id="esl_rssi_list"></div>
+							</div>
+						</div>
+					</div>
+
+					<div class="col-6">
+						<div class="card">
+							<h5 class="card-header">Template</h5>
+							<div class="card-body">
+								<img class="w-100" id="svgpath" src="">
+							</div>
+						</div>
+					</div>
+
+				</div>
+				<div class="row">
+
+					<div class="col-6">
+						<div class="card">
+							<h5 class="card-header">Label info</h5>
+							<div class="card-body">
+								<table class="table table-borderless table-sm">
+									<tr>
+										<td>Hello period</td>
+										<td><span class="badge badge-success" id="hello"></span></td>
+									</tr>
+									<tr>
+										<td>Blink count</td>
+										<td><span class="badge badge-success" id="blink_count"></span></td>
+									</tr>
+									<tr>
+										<td>Hardware Version</td>
+										<td><span class="badge badge-success" id="hardware_ver"></span></td>
+									</tr>
+									<tr>
+										<td>Software Version</td>
+										<td><span class="badge badge-success" id="software_ver"></span></td>
+									</tr>
+								</table>
+							</div>
+						</div>
+					</div>
+
+
+				</div>
 			</div>
 			</div>
 		</div>
 		</div>
 	</div>
 	</div>

+ 8 - 0
src/OpenMind/Admin/ui/masterpage.tpl

@@ -39,6 +39,14 @@
 			<div class="menu-extras topbar-custom">
 			<div class="menu-extras topbar-custom">
 
 
 				<ul class="list-unstyled topbar-right-menu float-right mb-0">
 				<ul class="list-unstyled topbar-right-menu float-right mb-0">
+					<li id="spinnerloader" class="d-none">
+						<a class="nav-link" href="#">
+							<div class="d-flex align-items-center">
+								<strong>Loading...</strong>
+								<div class="spinner-border text-warning ml-auto" role="status" aria-hidden="true"></div>
+							</div>
+						</a>
+					</li>
 
 
 					<li class="menu-item">
 					<li class="menu-item">
 						<!-- Mobile menu toggle-->
 						<!-- Mobile menu toggle-->

+ 1 - 1
src/OpenMind/Admin/ui/omlsettings.tpl

@@ -10,7 +10,7 @@
 			</div>
 			</div>
 		</div>
 		</div>
 
 
-		<h4 class="header-title mt-0 m-b-30">Configuration</h4>
+		<h4 class="header-title mt-0 m-b-30">config.ini</h4>
 		<div class="row">
 		<div class="row">
 			<div class="col-md-12">
 			<div class="col-md-12">
 				<textarea id="config_text" class="form-control" style="height: 100vh">{{@CONFIG_TEXT}}</textarea>
 				<textarea id="config_text" class="form-control" style="height: 100vh">{{@CONFIG_TEXT}}</textarea>

+ 40 - 0
src/OpenMind/FindBox/FindBoxCoreSystem.php

@@ -12,6 +12,7 @@ namespace OpenMind\FindBox;
 
 
 use Exception;
 use Exception;
 use OpenMind\System\System;
 use OpenMind\System\System;
+use ZipArchive;
 
 
 function array_filter_keys(array $array, array $keysToExtract)
 function array_filter_keys(array $array, array $keysToExtract)
 {
 {
@@ -273,6 +274,45 @@ class FindBoxCoreSystem
 
 
 			$esl['data']['template_name'] = $tplName ?? '{NO_NAME}';
 			$esl['data']['template_name'] = $tplName ?? '{NO_NAME}';
 		}
 		}
+	}
+
+	/**
+	 * Retrieve the SVG file of template
+	 *
+	 * @param $templateID name or id of findbox tremplate
+	 * @return string|null
+	 */
+	public function GetTemplateImage($templateID)
+	{
+		$quote = !is_numeric($templateID) ? '"' : '';
+		$urlAPI = "/1.0.0/index.php/smartesl.templates.gettemplate/1.0.0/[{$quote}{$templateID}{$quote}]";
+		$ret = $this->CallAPI($urlAPI, "");
+
+		if ($ret['err'] == 0 && $ret['value']['code'] == 0) {
+			// Update current properties
+			$status = $ret['value']['value'];
 
 
+			$binZIP = @base64_decode($status['base64_zip']);
+
+			if ($binZIP == null)
+				return null;
+
+			$zipName = "fbtpl/{$templateID}.zip";
+
+			@mkdir('fbtpl', 0777, true);
+
+			file_put_contents($zipName, $binZIP);
+
+			$zip = new ZipArchive();
+			if ($zip->open($zipName) === TRUE) {
+				$dest = "fbtpl/{$templateID}.svg";
+				$zip->extractTo('fbtpl/', 'source.svg');
+				$zip->close();
+				rename('fbtpl/source.svg', $dest);
+				unlink("fbtpl/{$templateID}.zip");
+				return $dest;
+			}
+		}
+		return NULL;
 	}
 	}
 }
 }