]> git.lizzy.rs Git - rust.git/blob - src/librustdoc/html/static/js/settings.js
Rollup merge of #96415 - ehuss:git-io, r=bjorn3
[rust.git] / src / librustdoc / html / static / js / settings.js
1 // Local js definitions:
2 /* eslint-env es6 */
3 /* eslint no-var: "error" */
4 /* eslint prefer-const: "error" */
5 /* global getSettingValue, getVirtualKey, onEachLazy, updateLocalStorage, updateSystemTheme */
6 /* global addClass, removeClass */
7
8 (function () {
9     function changeSetting(settingName, value) {
10         updateLocalStorage(settingName, value);
11
12         switch (settingName) {
13             case "theme":
14             case "preferred-dark-theme":
15             case "preferred-light-theme":
16             case "use-system-theme":
17                 updateSystemTheme();
18                 updateLightAndDark();
19                 break;
20         }
21     }
22
23     function handleKey(ev) {
24         // Don't interfere with browser shortcuts
25         if (ev.ctrlKey || ev.altKey || ev.metaKey) {
26             return;
27         }
28         switch (getVirtualKey(ev)) {
29             case "Enter":
30             case "Return":
31             case "Space":
32                 ev.target.checked = !ev.target.checked;
33                 ev.preventDefault();
34                 break;
35         }
36     }
37
38     function showLightAndDark() {
39         addClass(document.getElementById("theme").parentElement, "hidden");
40         removeClass(document.getElementById("preferred-light-theme").parentElement, "hidden");
41         removeClass(document.getElementById("preferred-dark-theme").parentElement, "hidden");
42     }
43
44     function hideLightAndDark() {
45         addClass(document.getElementById("preferred-light-theme").parentElement, "hidden");
46         addClass(document.getElementById("preferred-dark-theme").parentElement, "hidden");
47         removeClass(document.getElementById("theme").parentElement, "hidden");
48     }
49
50     function updateLightAndDark() {
51         if (getSettingValue("use-system-theme") !== "false") {
52             showLightAndDark();
53         } else {
54             hideLightAndDark();
55         }
56     }
57
58     function setEvents() {
59         updateLightAndDark();
60         onEachLazy(document.getElementsByClassName("slider"), function(elem) {
61             const toggle = elem.previousElementSibling;
62             const settingId = toggle.id;
63             const settingValue = getSettingValue(settingId);
64             if (settingValue !== null) {
65                 toggle.checked = settingValue === "true";
66             }
67             toggle.onchange = function() {
68                 changeSetting(this.id, this.checked);
69             };
70             toggle.onkeyup = handleKey;
71             toggle.onkeyrelease = handleKey;
72         });
73         onEachLazy(document.getElementsByClassName("select-wrapper"), function(elem) {
74             const select = elem.getElementsByTagName("select")[0];
75             const settingId = select.id;
76             const settingValue = getSettingValue(settingId);
77             if (settingValue !== null) {
78                 select.value = settingValue;
79             }
80             select.onchange = function() {
81                 changeSetting(this.id, this.value);
82             };
83         });
84         onEachLazy(document.querySelectorAll("input[type=\"radio\"]"), function(elem) {
85             const settingId = elem.name;
86             const settingValue = getSettingValue(settingId);
87             if (settingValue !== null && settingValue !== "null") {
88                 elem.checked = settingValue === elem.value;
89             }
90             elem.addEventListener("change", function(ev) {
91                 changeSetting(ev.target.name, ev.target.value);
92             });
93         });
94         document.getElementById("back").addEventListener("click", function() {
95             history.back();
96         });
97     }
98
99     window.addEventListener("DOMContentLoaded", setEvents);
100 })();