esp32-nmea2000-obp60/webinstall/helper.js

140 lines
3.9 KiB
JavaScript

const getParam = (key,opt_default) => {
if (opt_default === undefined) opt_default="";
let value = RegExp("" + key + "[^&]+").exec(window.location.search);
// Return the unescaped value minus everything starting from the equals sign or an empty string
return decodeURIComponent(!!value ? value.toString().replace(/^[^=]+./, "") : opt_default);
};
/**
* add an HTML element
* @param {*} type
* @param {*} clazz
* @param {*} parent
* @param {*} text
* @returns
*/
const addEl = (type, clazz, parent, text) => {
let el = document.createElement(type);
if (clazz) {
if (!(clazz instanceof Array)) {
clazz = clazz.split(/ */);
}
clazz.forEach(function (ce) {
el.classList.add(ce);
});
}
if (text !== undefined) el.textContent = text;
if (parent) parent.appendChild(el);
return el;
}
/**
* call a function for each matching element
* @param {*} selector
* @param {*} cb
*/
const forEachEl = (selector, cb) => {
let arr = document.querySelectorAll(selector);
for (let i = 0; i < arr.length; i++) {
cb(arr[i]);
}
}
const setButtons=(config)=>{
for (let k in config){
let bt=document.getElementById(k);
if (bt){
bt.addEventListener('click',config[k]);
}
}
}
const fillValues=(values,items)=>{
items.forEach((it)=>{
let e=document.getElementById(it);
if (e){
if (e.tagName == 'INPUT') values[it]=e.value;
if (e.tagName == 'DIV' || e.tagName == 'SPAN') values [it]=e.textContent;
}
})
};
const setValue=(id,value)=>{
let el=document.getElementById(id);
if (! el) return;
if (el.tagName == 'DIV' || el.tagName == 'SPAN' || el.tagName == 'P'){
el.textContent=value;
return;
}
if (el.tagName == 'INPUT'){
el.value=value;
return;
}
if (el.tagName.match(/^H[0-9]/)){
el.textContent=value;
return;
}
if (el.tagName == 'A'){
el.setAttribute('href',value);
return;
}
}
const setValues=(data,translations)=>{
for (let k in data){
let id=k;
if (translations){
let t=translations[k];
if (t !== undefined) id=t;
}
setValue(id,data[k]);
}
}
const buildUrl=(url,pars)=>{
let delim=(url.match("[?]"))?"&":"?";
for (let k in pars){
url+=delim;
delim="&";
url+=encodeURIComponent(k);
url+="=";
url+=encodeURIComponent(pars[k]);
}
return url;
}
const fetchJson=(url,pars)=>{
let furl=buildUrl(url,pars);
return fetch(furl).then((rs)=>rs.json());
}
const setVisible=(el,vis,useParent)=>{
if (typeof(el) !== 'object') el=document.getElementById(el);
if (! el) return;
if (useParent) el=el.parentElement;
if (! el) return;
if (vis) el.classList.remove('hidden');
else el.classList.add('hidden');
}
const enableEl=(id,en)=>{
let el=document.getElementById(id);
if (!el) return;
if (en) el.disabled=false;
else el.disabled=true;
}
const fillSelect=(el,values)=>{
if (typeof(el) !== 'object') el=document.getElementById(el);
if (! el) return;
el.textContent='';
let kf=(values instanceof Array)?(k)=>values[k]:(k)=>k;
for (let k in values){
let o=addEl('option','',el);
o.setAttribute('value',kf(k));
o.textContent=values[k];
}
}
const readFile=(file,optAsText)=>{
return new Promise((resolve,reject)=>{
let reader = new FileReader();
reader.addEventListener('load', function (e) {
resolve(e.target.result);
});
reader.addEventListener('error',(e)=>reject(e));
if (optAsText) reader.readAsText(file);
else reader.readAsBinaryString(file);
});
}
export { readFile, getParam, addEl, forEachEl,setButtons,fillValues, setValue,setValues,buildUrl,fetchJson,setVisible, enableEl,fillSelect }