script.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. (function(){
  2. function httpApi(url, method, callback) {
  3. var req = new XMLHttpRequest();
  4. req.onreadystatechange = function(e) {
  5. if (this.readyState === XMLHttpRequest.DONE)
  6. callback(this.status, JSON.parse(this.responseText));
  7. };
  8. req.open(method, url, true);
  9. req.send();
  10. }
  11. function setInputState(output, input, state) {
  12. httpApi("/api/setState?output=" +encodeURIComponent(output) +"&input=" +encodeURIComponent(input) +"&state=" +(state ? 1 : 0), "POST", (status, outputs) => {
  13. if (status !== 200)
  14. console.error("Cannot set output list");
  15. else
  16. displayOutputs(outputs);
  17. });
  18. }
  19. function makeOutputStatus(data) {
  20. var statusDiv = document.createElement("div");
  21. statusDiv.className = "status" +data.status ? "" : " no-status";
  22. statusDiv.innerHTML = JSON.stringify(data.status);
  23. return statusDiv;
  24. }
  25. function makeOutputNode(data) {
  26. var child = document.createElement("fieldset"),
  27. inputList = document.createElement("ul");
  28. child.classList.add("output");
  29. child.innerHTML += "<legend>" +data.name +"</legend>";
  30. child.appendChild(makeOutputStatus(data));
  31. for (var i in data.inputs) {
  32. var inputItem = document.createElement("li");
  33. inputItem.classList.add("input");
  34. inputItem.classList.add(data.inputs[i] ? "input-enabled" : "input-disabled");
  35. inputItem.textContent = i;
  36. (function() {
  37. var output = data.id,
  38. input = i,
  39. state = data.inputs[i];
  40. inputItem.addEventListener("click", () => setInputState(output, input, !state));
  41. })();
  42. inputList.appendChild(inputItem);
  43. }
  44. child.appendChild(inputList);
  45. return child;
  46. }
  47. function displayOutputs(outputs) {
  48. var div = document.getElementById("outputs");
  49. div.innerHTML = "";
  50. outputs.forEach(i => div.appendChild(makeOutputNode(i)));
  51. }
  52. function refreshOutput() {
  53. httpApi("/api/outputs", "GET", (status, outputs) => {
  54. if (status !== 200)
  55. console.error("Cannot fetch output list");
  56. else
  57. displayOutputs(outputs);
  58. });
  59. }
  60. refreshOutput();
  61. })()