dynamically build config form in UI
This commit is contained in:
parent
b4fe48744b
commit
bdbbee701e
146
web/index.html
146
web/index.html
|
@ -107,6 +107,75 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function createInput(configItem){
|
||||||
|
let el;
|
||||||
|
if (configItem.type === 'boolean' || configItem.type === 'list'){
|
||||||
|
el=document.createElement('select')
|
||||||
|
el.setAttribute('name',configItem.name)
|
||||||
|
let slist=[];
|
||||||
|
if (configItem.list){
|
||||||
|
configItem.list.forEach(function(v){
|
||||||
|
slist.push({l:v,v:v});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
slist.push({l:'on',v:'true'})
|
||||||
|
slist.push({l:'off',v:'false'})
|
||||||
|
}
|
||||||
|
slist.forEach(function(sitem){
|
||||||
|
let sitemEl=document.createElement('option');
|
||||||
|
sitemEl.setAttribute('value',sitem.v);
|
||||||
|
sitemEl.textContent=sitem.l;
|
||||||
|
el.appendChild(sitemEl);
|
||||||
|
})
|
||||||
|
return el;
|
||||||
|
}
|
||||||
|
el=document.createElement('input');
|
||||||
|
el.setAttribute('name',configItem.name)
|
||||||
|
if (configItem.type === 'password'){
|
||||||
|
el.setAttribute('type','password');
|
||||||
|
}
|
||||||
|
else if (configItem.type === 'number'){
|
||||||
|
el.setAttribute('type','number');
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
el.setAttribute('type','text');
|
||||||
|
}
|
||||||
|
return el;
|
||||||
|
}
|
||||||
|
let configDefinitions;
|
||||||
|
function loadConfigDefinitions(){
|
||||||
|
getJson("config.json")
|
||||||
|
.then(function(defs){
|
||||||
|
let frame=document.querySelector('.configFormRows');
|
||||||
|
if (! frame) throw Error("no config form");
|
||||||
|
frame.innerHTML='';
|
||||||
|
configDefinitions=defs;
|
||||||
|
defs.forEach(function(item){
|
||||||
|
if (! item.type) return;
|
||||||
|
let row=document.createElement('div');
|
||||||
|
row.classList.add('row');
|
||||||
|
let label=item.label || item.name;
|
||||||
|
let labelEl=document.createElement('span');
|
||||||
|
labelEl.classList.add('label');
|
||||||
|
labelEl.textContent=label;
|
||||||
|
row.appendChild(labelEl);
|
||||||
|
let valueEl=createInput(item);
|
||||||
|
if (!valueEl) return;
|
||||||
|
row.appendChild(valueEl);
|
||||||
|
let bt=document.createElement('button');
|
||||||
|
bt.classList.add('infoButton');
|
||||||
|
bt.addEventListener('click',function(ev){
|
||||||
|
alert(item.description);
|
||||||
|
});
|
||||||
|
bt.textContent="?";
|
||||||
|
row.appendChild(bt);
|
||||||
|
frame.appendChild(row);
|
||||||
|
})
|
||||||
|
resetForm();
|
||||||
|
})
|
||||||
|
.catch(function(err){alert("unable to load config: "+err)})
|
||||||
|
}
|
||||||
window.setInterval(update,1000);
|
window.setInterval(update,1000);
|
||||||
window.addEventListener('load',function(){
|
window.addEventListener('load',function(){
|
||||||
let buttons=document.querySelectorAll('button');
|
let buttons=document.querySelectorAll('button');
|
||||||
|
@ -118,7 +187,7 @@
|
||||||
cd.addEventListener('change',function(ev){
|
cd.addEventListener('change',function(ev){
|
||||||
showCanDetails(ev.target.checked);
|
showCanDetails(ev.target.checked);
|
||||||
});
|
});
|
||||||
resetForm();
|
loadConfigDefinitions();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
|
@ -151,6 +220,10 @@ span#connected.ok{
|
||||||
.buttons {
|
.buttons {
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
}
|
}
|
||||||
|
button.infoButton {
|
||||||
|
margin-left: 1em;
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
#canDetails{
|
#canDetails{
|
||||||
display:none;
|
display:none;
|
||||||
}
|
}
|
||||||
|
@ -201,75 +274,8 @@ span#connected.ok{
|
||||||
</div>
|
</div>
|
||||||
<button id="reset" >Reset</button>
|
<button id="reset" >Reset</button>
|
||||||
<div class="configForm">
|
<div class="configForm">
|
||||||
<div class="row">
|
<div class="configFormRows">
|
||||||
<span class="label">system name</span>
|
|
||||||
<input name="systemName" type="text">
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<span class="label">NMEAtoUSB</span>
|
|
||||||
<select name="sendUsb">
|
|
||||||
<option value="true">On</option>
|
|
||||||
<option value="false" selected="selected">Off</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<!--"1200","2400","4800","9600","14400","19200","28800","38400","57600","115200","230400","460800"-->
|
|
||||||
<div class="row">
|
|
||||||
<span class="label">USB baud rate</span>
|
|
||||||
<select name="usbBaud">
|
|
||||||
<option value="1200">1200</option>
|
|
||||||
<option value="2400">2400</option>
|
|
||||||
<option value="4800">4800</option>
|
|
||||||
<option value="9600">9600</option>
|
|
||||||
<option value="14400">14400</option>
|
|
||||||
<option value="19200">19200</option>
|
|
||||||
<option value="28800">28800</option>
|
|
||||||
<option value="38400">38400</option>
|
|
||||||
<option value="57600">57600</option>
|
|
||||||
<option value="115200">115200</option>
|
|
||||||
<option value="230400">230400</option>
|
|
||||||
<option value="460800">460800</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<span class="label">TCP Port</span>
|
|
||||||
<input name="serverPort" type="number">
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<span class="label">maxTCPClients</span>
|
|
||||||
<input name="maxClients" type="number">
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<span class="label">NMEAtoTCP</span>
|
|
||||||
<select name="sendTCP">
|
|
||||||
<option value="true">On</option>
|
|
||||||
<option value="false" selected="selected">Off</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<span class="label">SeasmartToTCP</span>
|
|
||||||
<select name="sendSeasmart">
|
|
||||||
<option value="true">On</option>
|
|
||||||
<option value="false" selected="selected">Off</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<span class="label">shutdown AP after (min)</span>
|
|
||||||
<input name="stopApTime" type="number">
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<span class="label">wifiClient</span>
|
|
||||||
<select name="wifiClient">
|
|
||||||
<option value="true">On</option>
|
|
||||||
<option value="false" selected="selected">Off</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<span class="label">wifiClientPass</span>
|
|
||||||
<input name="wifiPass" type="text">
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<span class="label">wifiClientSSID</span>
|
|
||||||
<input name="wifiSSID" type="text">
|
|
||||||
</div>
|
</div>
|
||||||
<div class="buttons">
|
<div class="buttons">
|
||||||
<button id="resetForm">ReloadConfig</button>
|
<button id="resetForm">ReloadConfig</button>
|
||||||
|
|
Loading…
Reference in New Issue