function addOptions(dropdownID, opts){ opts.forEach((opt, index) => { var option = document.createElement("option"); if(opt.name){ //parameter could be command in case of actor. option.text = opt.name; option.value = opt.url; if(opt.operators) option.setAttribute("data-tglstates",JSON.stringify(opt.operators)); if(opt.type) option.setAttribute("data-type",opt.type); if(opt.options) option.setAttribute("data-parameters",JSON.stringify([opt])); if(opt.parameters){ //we have an actor with more than one parameters, then the parameters are actually nested inside the command option.setAttribute("data-parameters",JSON.stringify(opt.parameters)); } }else if(typeof opt === 'object'){ option.value = Object.keys(opt)[0]; option.text = opt[option.value]; }else { option.text = opt; option.value = opt; } if(typeof dropdownID === 'object'){ dropdownID.appendChild(option); }else{ document.getElementById(dropdownID).appendChild(option); } }); } function clearOptions(dropdownID){ if(typeof dropdownID === 'object'){ dropdownID.innerHTML = ""; }else{ document.getElementById(dropdownID).innerHTML = ""; } } function changeValueType(event){ dropdown = event.currentTarget; type = dropdown.options[dropdown.selectedIndex].dataset.type; id = dropdown.id.match(/\d+$/); if(dropdown.id.search("act") > -1){ opBtnID = document.getElementById("btnActOperator"+id); valBlockID = document.getElementById("act1ValBlock"+id); valElemID = document.getElementById("act1Value"+id); valOptID = document.getElementById("act1ValueOpt"+id); val2BlockID = document.getElementById("act2ValBlock"+id); val3BlockID = document.getElementById("act3ValBlock"+id); val4BlockID = document.getElementById("act4ValBlock"+id); }else{ opBtnID = document.getElementById("btnOperator"+id); valBlockID =document.getElementById("valBlock"+id); valElemID = document.getElementById("threshold"+id); valOptID = document.getElementById("thresholdOpt"+id); val2BlockID = null; } if(type =="hidden"){ opBtnID.hidden = true; valBlockID.hidden = true; if(val2BlockID){ //if this is an actor hide all additional inputs, as only one dropdown is supported val2BlockID.hidden = true; val3BlockID.hidden = true; val4BlockID.hidden = true; } }else{ opBtnID.setAttribute("data-tglstates",dropdown.options[dropdown.selectedIndex].dataset.tglstates); opBtnID.innerHTML = JSON.parse(dropdown.options[dropdown.selectedIndex].dataset.tglstates)[0]; opBtnID.hidden = false; valBlockID.hidden = false; if(type == "dropdown"){ valElemID.type = "text"; valOptID.hidden = false; valElemID.hidden = true; if(val2BlockID){ //if this is an actor hide all additional inputs, as only one dropdown is supported val2BlockID.hidden = true; val3BlockID.hidden = true; val4BlockID.hidden = true; } clearOptions(valOptID); addOptions(valOptID,JSON.parse(dropdown.options[dropdown.selectedIndex].dataset.parameters)[0].options); }else if(type == "button" || type == "bool"){ valElemID.type = "text"; valOptID.hidden = true; valBlockID.hidden = true; if(val2BlockID){ //if this is an actor hide all additional inputs, as only one dropdown is supported val2BlockID.hidden = true; val3BlockID.hidden = true; val4BlockID.hidden = true; } }else{ valElemID.type = type; if(type == "time") valElemID.value = "00:00"; else if(type == "date") valElemID.value = new Date().toISOString().split('T')[0] else if(type == "text") valElemID.value = ""; else valElemID.value = "0"; valOptID.hidden = true; valElemID.hidden = false; if(val2BlockID){ parameters = JSON.parse(dropdown.options[dropdown.selectedIndex].dataset.parameters); val2BlockID.hidden = true; val3BlockID.hidden = true; val4BlockID.hidden = true; theAssociatedLabel = valElemID.parentNode.querySelector("label[for='" + valElemID.id + "']"); theAssociatedLabel.innerHTML = parameters[0].name; switch(parameters.length){ case 4: theAssociatedLabel = val4BlockID.querySelector("label[for='" + val4BlockID.id.replace("Block","ue") + "']"); theAssociatedLabel.innerHTML = parameters[3].name; val4BlockID.hidden = false; case 3: theAssociatedLabel = val3BlockID.querySelector("label[for='" + val3BlockID.id.replace("Block","ue") + "']"); theAssociatedLabel.innerHTML = parameters[2].name; val3BlockID.hidden = false; case 2: theAssociatedLabel = val2BlockID.querySelector("label[for='" + val2BlockID.id.replace("Block","ue") + "']"); theAssociatedLabel.innerHTML = parameters[1].name; val2BlockID.hidden = false; } } } } } function fillSensorDD(ID){ var elem = document.getElementById("sensorSelect"+ID); fetch("./ajax/fillSensorDD.php", { method: 'GET', headers: { 'X-Requested-From-Modal': 'a', 'Requested-With-Ajax': 'ajax' } }) .then(response => response.text()) .then(html => { elem.innerHTML = html; elem.addEventListener("change", arrangeSensorInputs); document.getElementById("paramSelect"+ID).addEventListener("change", changeValueType); elem.dispatchEvent(new Event('change')); }) .catch(error => { elem.innerHTML = ""; }); } function fillActorDD(ID){ var elem = document.getElementById("actorSelect"+ID); fetch("./ajax/fillActorDD.php", { method: 'GET', headers: { 'X-Requested-From-Modal': 'a', 'Requested-With-Ajax': 'ajax' } }) .then(response => response.text()) .then(html => { elem.innerHTML = html; elem.addEventListener("change", arrangeActorInputs); document.getElementById("actParamSelect"+ID).addEventListener("change", changeValueType); document.getElementById("actorSelect"+ID).dispatchEvent(new Event('change')); }) .catch(error => { elem.innerHTML = ""; }); } function changeAllIDs (parentNode, newID) { for (var i = 0; i < parentNode.childNodes.length; i++) { var child = parentNode.childNodes[i]; changeAllIDs(child, newID); } if(parentNode.id){ parentNode.id = parentNode.id.replace(/\d+$/, newID); } if(parentNode.dataset !== undefined){ if(parentNode.dataset.delid) parentNode.dataset.delid = parentNode.dataset.delid.replace(/\d+$/, newID); } } function delAutoEntry(event){ ID = event.currentTarget.dataset.delid; document.getElementById(ID).remove(); ID = ID.replace(/\d+$/, function(n){ return ++n }); while(sensor= document.getElementById(ID)){ changeAllIDs(sensor, ID.match(/\d+$/)-1); ID = ID.replace(/\d+$/, function(n){ return ++n }); } } function addSensor(event){ var t = document.getElementById('sensorsList').children; //get the second last element (ignore "add" button) nextID = Number(t[t.length-1].id.replace("sensorSettings","")) + 1; var div = document.createElement('div'); div.className = "input-group mt-3"; div.id = "sensorSettings"+String(nextID); div.innerHTML = `