implement dynamic config form, checkers, reset and changed display
This commit is contained in:
parent
bdbbee701e
commit
2eaedd7025
|
@ -5,6 +5,7 @@
|
||||||
<title>NMEA 2000 Gateway</title>
|
<title>NMEA 2000 Gateway</title>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
let self=this;
|
||||||
let lastUpdate=(new Date()).getTime();
|
let lastUpdate=(new Date()).getTime();
|
||||||
function alertRestart(){
|
function alertRestart(){
|
||||||
alert("Board reset triggered, reconnect WLAN if necessary");
|
alert("Board reset triggered, reconnect WLAN if necessary");
|
||||||
|
@ -50,15 +51,39 @@
|
||||||
if (el){
|
if (el){
|
||||||
let v=jsonData[k];
|
let v=jsonData[k];
|
||||||
el.value=v;
|
el.value=v;
|
||||||
|
el.setAttribute('data-loaded',v);
|
||||||
|
checkChange(el);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
function checkMaxClients(v){
|
||||||
|
let parsed=parseInt(v);
|
||||||
|
if (isNaN(parsed)) return "not a valid number";
|
||||||
|
if (parsed < 0) return "must be >= 0";
|
||||||
|
if (parsed > 10) return "max is 10";
|
||||||
|
}
|
||||||
|
function checkSystemName(v){
|
||||||
|
//2...32 characters for ssid
|
||||||
|
let allowed=v.replace(/[^a-zA-Z0-9]*/g,'');
|
||||||
|
if (allowed != v) return "contains invalid characters, only a-z, A-Z, 0-9";
|
||||||
|
if (v.length < 2 || v.length > 32) return "invalid length (2...32)";
|
||||||
|
}
|
||||||
function changeConfig(){
|
function changeConfig(){
|
||||||
let url="/api/setConfig?";
|
let url="/api/setConfig?";
|
||||||
let values=document.querySelectorAll('.configForm select , .configForm input');
|
let values=document.querySelectorAll('.configForm select , .configForm input');
|
||||||
for (let i=0;i<values.length;i++){
|
for (let i=0;i<values.length;i++){
|
||||||
let v=values[i];
|
let v=values[i];
|
||||||
|
let check=v.getAttribute('data-check');
|
||||||
|
if (check){
|
||||||
|
if (typeof(self[check]) === 'function'){
|
||||||
|
let res=self[check](v.value);
|
||||||
|
if (res){
|
||||||
|
alert("invalid config for "+v.getAttribute('name')+"("+v.value+"):\n"+res);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
url+=v.getAttribute('name')+"="+encodeURIComponent(v.value)+"&";
|
url+=v.getAttribute('name')+"="+encodeURIComponent(v.value)+"&";
|
||||||
}
|
}
|
||||||
getJson(url)
|
getJson(url)
|
||||||
|
@ -107,6 +132,17 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function checkChange(el) {
|
||||||
|
let loaded = el.getAttribute('data-loaded');
|
||||||
|
if (loaded !== undefined) {
|
||||||
|
if (loaded != el.value) {
|
||||||
|
el.classList.add('changed');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
el.classList.remove("changed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
function createInput(configItem){
|
function createInput(configItem){
|
||||||
let el;
|
let el;
|
||||||
if (configItem.type === 'boolean' || configItem.type === 'list'){
|
if (configItem.type === 'boolean' || configItem.type === 'list'){
|
||||||
|
@ -162,8 +198,23 @@
|
||||||
row.appendChild(labelEl);
|
row.appendChild(labelEl);
|
||||||
let valueEl=createInput(item);
|
let valueEl=createInput(item);
|
||||||
if (!valueEl) return;
|
if (!valueEl) return;
|
||||||
|
valueEl.setAttribute('data-default',item.default);
|
||||||
|
valueEl.addEventListener('change',function(ev){
|
||||||
|
let el=ev.target;
|
||||||
|
checkChange(el);
|
||||||
|
})
|
||||||
|
if (item.check) valueEl.setAttribute('data-check',item.check);
|
||||||
row.appendChild(valueEl);
|
row.appendChild(valueEl);
|
||||||
let bt=document.createElement('button');
|
let bt=document.createElement('button');
|
||||||
|
bt.classList.add('defaultButton');
|
||||||
|
bt.setAttribute('data-default',item.default);
|
||||||
|
bt.addEventListener('click',function(ev){
|
||||||
|
valueEl.value=valueEl.getAttribute('data-default');
|
||||||
|
checkChange(valueEl);
|
||||||
|
})
|
||||||
|
bt.textContent="X";
|
||||||
|
row.appendChild(bt);
|
||||||
|
bt=document.createElement('button');
|
||||||
bt.classList.add('infoButton');
|
bt.classList.add('infoButton');
|
||||||
bt.addEventListener('click',function(ev){
|
bt.addEventListener('click',function(ev){
|
||||||
alert(item.description);
|
alert(item.description);
|
||||||
|
@ -199,6 +250,9 @@
|
||||||
border: 1px solid grey;
|
border: 1px solid grey;
|
||||||
max-width: 40em;
|
max-width: 40em;
|
||||||
}
|
}
|
||||||
|
.changed {
|
||||||
|
color: green
|
||||||
|
}
|
||||||
span.label {
|
span.label {
|
||||||
width: 10em;
|
width: 10em;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
Loading…
Reference in New Issue