/**
* 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 clone_template
* IMPORT nice_name
* IMPORT make_once
* IMPORTS_END
*/
let storage;
let import_list = by_id("import_list");
let import_chbxs_colliding = undefined;
let entry_objects = undefined;
let settings_import_map = undefined;
function add_import_entry(prefix, name)
{
const cloned_template = clone_template("import_entry");
Object.assign(cloned_template, {prefix, name});
cloned_template.name_span.textContent = nice_name(prefix, name);
if (storage.get(prefix, name) !== undefined) {
import_chbxs_colliding.push(cloned_template.chbx);
cloned_template.warning.textContent = "!";
}
import_list.appendChild(cloned_template.entry);
return cloned_template;
}
function check_all_imports()
{
for (const entry_object of entry_objects)
entry_object.chbx.checked = true;
}
function uncheck_all_imports()
{
for (const entry_object of entry_objects)
entry_object.chbx.checked = false;
}
function uncheck_colliding_imports()
{
for (let chbx of import_chbxs_colliding)
chbx.checked = false;
}
function commit_import()
{
for (const entry_object of entry_objects) {
if (!entry_object.chbx.checked)
continue;
const key = entry_object.prefix + entry_object.name;
const value = settings_import_map.get(key);
storage.set(entry_object.prefix, entry_object.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");
const existing_settings_note = by_id("existing_settings_note");
function show_selection(settings)
{
import_selection_radio.checked = true;
let old_children = import_list.children;
while (old_children[0] !== undefined)
import_list.removeChild(old_children[0]);
import_chbxs_colliding = [];
entry_objects = [];
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);
entry_objects.push(add_import_entry(prefix, name));
settings_import_map.set(key, value);
}
const op = import_chbxs_colliding.length > 0 ? "remove" : "add";
existing_settings_note.classList[op]("hide");
}
function deactivate()
{
/* Let GC free some memory */
import_chbxs_colliding = undefined;
entry_objects = undefined;
settings_import_map = undefined;
if (exports.onclose)
exports.onclose();
}
const wrapper = by_id("import_table_wrapper");
const style_table = (...cls) => cls.forEach(c => wrapper.classList.add(c));
const exports =
{show_loading, show_error, show_selection, deactivate, style_table};
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
*/