/** * 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 */