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