implement dynamic config form, checkers, reset and changed display

This commit is contained in:
andreas 2021-10-28 22:00:39 +02:00
parent bdbbee701e
commit 2eaedd7025
1 changed files with 54 additions and 0 deletions

View File

@ -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;