script.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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";
  22. if (data.status) {
  23. console.log(data.status.status);
  24. if (data.status.status.plugged) {
  25. var pluggedIcon = document.createElement("img");
  26. pluggedIcon.className = "icon"
  27. pluggedIcon.src = "charging.svg";
  28. statusDiv.appendChild(pluggedIcon);
  29. }
  30. if (data.status.status.battery !== undefined) {
  31. var batteryLvl = document.createElement("span"),
  32. batteryIcon = document.createElement("img"),
  33. batteryRes = [ "lowbattery.svg", "quarterbattery.svg", "batteryalmostcharged.svg", "batteryfullycharged.svg" ];
  34. batteryIcon.src = batteryRes[Math.min(batteryRes.length -1, Math.floor((data.status.status.battery * batteryRes.length) / 100))];
  35. batteryIcon.className = "icon";
  36. batteryLvl.appendChild(batteryIcon);
  37. batteryLvl.innerHTML += data.status.status.battery +"%";
  38. statusDiv.appendChild(batteryLvl);
  39. }
  40. if (data.status.ping) {
  41. var ping = document.createElement("div"),
  42. icon = document.createElement("img");
  43. icon.className = "icon";
  44. icon.src = "wifi.svg";
  45. ping.appendChild(icon);
  46. ping.innerHTML += data.status.ping.duration +"ms";
  47. statusDiv.appendChild(ping);
  48. }
  49. } else {
  50. statusDiv.classList.add("no-status");
  51. }
  52. return statusDiv;
  53. }
  54. function makeOutputNode(data) {
  55. var child = document.createElement("fieldset"),
  56. inputList = document.createElement("ul");
  57. child.classList.add("output");
  58. child.innerHTML += "<legend>" +data.name +"</legend>";
  59. child.appendChild(makeOutputStatus(data));
  60. for (var i in data.inputs) {
  61. var inputItem = document.createElement("li");
  62. inputItem.classList.add("input");
  63. inputItem.classList.add(data.inputs[i] ? "input-enabled" : "input-disabled");
  64. inputItem.textContent = i;
  65. (function() {
  66. var output = data.id,
  67. input = i,
  68. state = data.inputs[i];
  69. inputItem.addEventListener("click", () => setInputState(output, input, !state));
  70. })();
  71. inputList.appendChild(inputItem);
  72. }
  73. child.appendChild(inputList);
  74. return child;
  75. }
  76. function displayOutputs(outputs) {
  77. var div = document.getElementById("outputs");
  78. div.innerHTML = "";
  79. outputs.forEach(i => div.appendChild(makeOutputNode(i)));
  80. }
  81. function refreshOutput() {
  82. httpApi("/api/outputs", "GET", (status, outputs) => {
  83. if (status !== 200)
  84. console.error("Cannot fetch output list");
  85. else
  86. displayOutputs(outputs);
  87. });
  88. }
  89. refreshOutput();
  90. })()