diff options
Diffstat (limited to 'html/import_frame.js')
-rw-r--r-- | html/import_frame.js | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/html/import_frame.js b/html/import_frame.js new file mode 100644 index 0000000..4075433 --- /dev/null +++ b/html/import_frame.js @@ -0,0 +1,163 @@ +/** + * Hachette HTML import frame script + * + * Copyright (C) 2021 Wojtek Kosior + * Redistribution terms are gathered in the `copyright' file. + */ + +/* + * IMPORTS_START + * IMPORT get_remote_storage + * IMPORT by_id + * IMPORT nice_name + * IMPORT make_once + * IMPORTS_END + */ + +let storage; + +const import_li_template = by_id("import_li_template"); +import_li_template.removeAttribute("id"); + +function import_li_id(prefix, item) +{ + return `ili_${prefix}_${item}`; +} + +let import_ul = by_id("import_ul"); +let import_chbxs_colliding = undefined; +let settings_import_map = undefined; + +function add_import_li(prefix, name) +{ + let li = import_li_template.cloneNode(true); + let name_span = li.firstElementChild; + let chbx = name_span.nextElementSibling; + let warning_span = chbx.nextElementSibling; + + li.setAttribute("data-prefix", prefix); + li.setAttribute("data-name", name); + li.id = import_li_id(prefix, name); + name_span.textContent = nice_name(prefix, name); + + if (storage.get(prefix, name) !== undefined) { + import_chbxs_colliding.push(chbx); + warning_span.textContent = "(will overwrite existing setting!)"; + } + + import_ul.appendChild(li); +} + +function check_all_imports() +{ + for (let li of import_ul.children) + li.firstElementChild.nextElementSibling.checked = true; +} + +function uncheck_all_imports() +{ + for (let li of import_ul.children) + li.firstElementChild.nextElementSibling.checked = false; +} + +function uncheck_colliding_imports() +{ + for (let chbx of import_chbxs_colliding) + chbx.checked = false; +} + +function commit_import() +{ + for (let li of import_ul.children) { + let chbx = li.firstElementChild.nextElementSibling; + + if (!chbx.checked) + continue; + + let prefix = li.getAttribute("data-prefix"); + let name = li.getAttribute("data-name"); + let key = prefix + name; + let value = settings_import_map.get(key); + storage.set(prefix, name, value); + } + + deactivate(); +} + +const import_loading_radio = by_id("import_loading_radio"); + +function show_loading() +{ + import_loading_radio.checked = true; +} + +const import_failed_radio = by_id("import_failed_radio"); +const import_errormsg = by_id("import_errormsg"); +const import_errordetail_chbx = by_id("import_errordetail_chbx"); +const import_errordetail = by_id("import_errordetail"); + +function show_error(errormsg, errordetail) +{ + import_failed_radio.checked = true; + import_errormsg.textContent = errormsg; + import_errordetail_chbx.checked = errordetail; + import_errordetail.textContent = errordetail; +} + +const import_selection_radio = by_id("import_selection_radio"); + +function show_selection(settings) +{ + import_selection_radio.checked = true; + + let old_children = import_ul.children; + while (old_children[0] !== undefined) + import_ul.removeChild(old_children[0]); + + import_chbxs_colliding = []; + settings_import_map = new Map(); + + for (let setting of settings) { + let [key, value] = Object.entries(setting)[0]; + let prefix = key[0]; + let name = key.substring(1); + add_import_li(prefix, name); + settings_import_map.set(key, value); + } +} + +function deactivate() +{ + /* Let GC free some memory */ + import_chbxs_colliding = undefined; + settings_import_map = undefined; + + if (exports.onclose) + exports.onclose(); +} + +const exports = {show_loading, show_error, show_selection, deactivate}; + +async function init() +{ + storage = await get_remote_storage(); + + by_id("commit_import_but").addEventListener("click", commit_import); + by_id("check_all_import_but").addEventListener("click", check_all_imports); + by_id("uncheck_all_import_but") + .addEventListener("click", uncheck_all_imports); + by_id("uncheck_colliding_import_but") + .addEventListener("click", uncheck_colliding_imports); + by_id("cancel_import_but").addEventListener("click", deactivate); + by_id("import_failok_but").addEventListener("click", deactivate); + + return exports; +} + +const get_import_frame = make_once(init); + +/* + * EXPORTS_START + * EXPORT get_import_frame + * EXPORTS_END + */ |