diff --git a/extension/options.html b/extension/options.html --- a/extension/options.html +++ b/extension/options.html @@ -24,39 +24,40 @@
diff --git a/extension/options.js b/extension/options.js --- a/extension/options.js +++ b/extension/options.js @@ -34,10 +34,6 @@ }); } -function extensionCheckboxes() { - return document.querySelectorAll("#extensions-selection input[type=checkbox][data-extension]"); -} - function loadSettings(cb) { storage.get(DEFAULT_EXTENSION_SETTINGS, function (items) { if (chrome.runtime.lastError) { @@ -52,16 +48,47 @@ continue; } - var checkbox = document.querySelector("input[type=checkbox][data-extension=" + key + "]"); - if (!checkbox) { - console.warn("Failed to find checkbox for extension", key); - continue; - } - - var checked = !!items[key].enabled; - checkbox.checked = checked; + let controls = document.querySelectorAll("[data-extension=" + key + "]"); + for (let control of controls) { + let settingsKey = control.dataset.settingsKey; + if (!settingsKey) { + console.warn("Invalid settings key in", control, "cannot load this"); + continue; + } + + let value = items[key][settingsKey] + + if (control.type === "checkbox") { + control.checked = !!value; + } else { + if (value === true) { + control.value = "TRUE"; + } else if (value === false) { + control.value = "FALSE"; + } else { + control.value = value; + } + } + + control.addEventListener("change", () => { + let saveMessage = document.getElementById("save-message"); + saveMessage.innerText = ""; + + saveSettings((error) => { + if (error) { + try { + saveMessage.innerText = chrome.i18n.getMessage("options_save_failed"); + } catch (e) { + // When the extension is reloaded, any call to extension APIs throws, make sure we show at least some form of error + saveMessage.innerText = "Saving settings failed (" + (error || e) + ")"; + } + return; + } - // TODO restore additional stuff if we have it + sendMessage("settings", "changed"); + }); + }); + } } if (typeof cb === "function") { @@ -73,22 +100,41 @@ function saveSettings(cb) { var settings = {}; - for (var key in DEFAULT_EXTENSION_SETTINGS) { - if (!DEFAULT_EXTENSION_SETTINGS.hasOwnProperty(key)) { + let controls = document.querySelectorAll("[data-extension]"); + for (let control of controls) { + let extension = control.dataset.extension; + + if (!DEFAULT_EXTENSION_SETTINGS.hasOwnProperty(extension)) { + console.warn("Cannot save settings for extension", extension, "which isn't in DEFAULT_EXTENSION_SETTINGS"); continue; } - var checkbox = document.querySelector("input[type=checkbox][data-extension=" + key + "]"); - if (!checkbox) { - console.warn("Failed to find checkbox for extension", key); + let settingsKey = control.dataset.settingsKey; + if (!settingsKey) { + console.warn("Invalid settings key in", control, "cannot save this"); continue; } - settings[key] = { - enabled: checkbox.checked - }; + if (!settings[extension]) { + settings[extension] = {}; + } + + if (!DEFAULT_EXTENSION_SETTINGS[extension].hasOwnProperty(settingsKey)) { + console.warn("Cannot save settings key", settingsKey, "in extension", extension, "which isn't in DEFAULT_EXTENSION_SETTINGS"); + continue; + } - // TODO save additional stuff if we have it + if (control.type === "checkbox") { + settings[extension][settingsKey] = control.checked; + } else { + let value = control.value; + if (value === "TRUE") { + value = true; + } else if (value === "FALSE") { + value = false; + } + settings[extension][settingsKey] = value; + } } try { @@ -148,29 +194,6 @@ }); mprisEx.disabled = !mpris.checked; }); - - // auto save when changing any setting - // TODO can we do that on closing, or does it not matter how often we do chrome storage sync thing? - document.querySelectorAll("input[type=checkbox]").forEach(function (item) { - item.addEventListener("click", function () { - var saveMessage = document.getElementById("save-message"); - saveMessage.innerText = ""; - - saveSettings(function (error) { - if (error) { - try { - saveMessage.innerText = chrome.i18n.getMessage("options_save_failed"); - } catch (e) { - // When the extension is reloaded, any call to extension APIs throws, make sure we show at least some form of error - saveMessage.innerText = "Saving settings failed (" + (error || e) + ")"; - } - return; - } - - sendMessage("settings", "changed"); - }); - }); - }); }); document.getElementById("open-krunner-settings").addEventListener("click", function (event) {