aboutsummaryrefslogtreecommitdiff
path: root/static/js/forms.ts
blob: e35a4b20b60680718ea17b002170856a02ff93d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
(function () {

  const cookiesDisabled = !navigator.cookieEnabled;

  if (cookiesDisabled) {
    document.cookie = "disabled";
    document.cookie.indexOf("disabled");
    return console.warn("WARNING: Cannot persist form state due to cookie restrictions");
  }

  ["pageshow", "URLChangedCustomEvent", "DOMContentLoaded"].forEach(function (event) {
    self.addEventListener(event, function (event) {
      const input = Array.prototype.slice.call(document.querySelectorAll("form input"));
      const select = Array.prototype.slice.call(document.querySelectorAll("form select"));
      const textarea = Array.prototype.slice.call(document.querySelectorAll("form textarea"));
      const summary = Array.prototype.slice.call(document.querySelectorAll("details summary"));

      const states = input.concat(select).concat(textarea);

      for (var i = 0; i < states.length; i++) {
        const state = states[i];
        const sync = i === states.length - 1;

        if (localStorage[state.id]) {
          if (state.type === "radio" || state.type === "checkbox") {
            if (localStorage[state.id] === "on") state.checked = true;
          } else state.value = localStorage[state.id];
        }

        if (sync) self.dispatchEvent(new Event("storage"));

        state.addEventListener("change", function (event) {

          // console.log("INFO: STATE:",   event.target);
          // console.log("INFO: ID:",      event.target.id);
          // console.log("INFO: NAME:",    event.target.name);
          // console.log("INFO: TYPE:",    event.target.type);
          // console.log("INFO: VALUE:",   event.target.value);
          // console.log("INFO: CHECKED:", event.target.checked);

          localStorage[event.target.id] = event.target.value;

          const group = document.querySelectorAll(`input[name='${event.target.name}']`);

          for (var j = 0; j < group.length; j++) {
            const member = group[j];
            if ((member.type === "radio" || member.type === "checkbox") && !member.checked) {
              localStorage[member.id] = "off";
            }
          }
          self.dispatchEvent(new Event("storage"));
        });
      }

      for (var k = 0; k < summary.length; k++) {
        let child = summary[k];
        let details = child.parentElement;

        if (details.id && details.nodeName === "DETAILS") {
          sessionStorage[details.id] === "false" && details.removeAttribute("open");
          sessionStorage[details.id] === "true" && details.setAttribute("open", true);

          child.addEventListener("click", function (event) {
            let details = event.target.parentElement;
            sessionStorage[details.id] = !details.open;
          });
        }
      }
    });
  });

  ["storage"].forEach(function (event) {
    self.addEventListener(event, function () {
      let stylesheet;

      stylesheet = document.querySelector('link[href$="default-simple.css"]')

      if (localStorage["config.layout.simple"]  === "on")  stylesheet.rel = "stylesheet"
      if (localStorage["config.layout.default"] === "on")  stylesheet.rel = "alternate stylesheet"

      stylesheet = document.querySelector('link[href$="default-fast.css"]')

      if (localStorage["config.navigation.fast"] === "on") stylesheet.rel = "stylesheet"
      if (localStorage["config.navigation.slow"] === "on") stylesheet.rel = "alternate stylesheet"

      for (var i = 0; i < document.styleSheets.length; i++) {
        let stylesheet = document.styleSheets[i];
        for (var k = 0; k < stylesheet.rules.length; k++) {
          let media = stylesheet.rules[k].media;
          if (media && media.mediaText.includes("prefers-color-scheme")) {
            if (localStorage["config.theme.light"] === "on") {
              media.mediaText = "(prefers-color-scheme: dark)";
              if (getComputedStyle(document.body).getPropertyValue("color-scheme") === "dark") { media.mediaText = "(prefers-color-scheme: light)"; }
            }

            if (localStorage["config.theme.auto"] === "on") {
              media.mediaText = "(prefers-color-scheme: dark)";
            }

            if (localStorage["config.theme.dark"] === "on") {
              media.mediaText = "(prefers-color-scheme: light)";
              if (getComputedStyle(document.body).getPropertyValue("color-scheme") === "light") { media.mediaText = "(prefers-color-scheme: dark)"; }
            }
          }
        }
      }
    });
   });

  const early = setInterval(persistence, 4);

  function persistence() {
    if (document.styleSheets.length > 0) {
      self.dispatchEvent(new Event("storage"));
      clearInterval(early);
    }
  }

  self.addEventListener("DOMContentLoaded", function () {
    self.dispatchEvent(new Event("storage"));
    clearInterval(early);
  });
})();