aboutsummaryrefslogtreecommitdiff
/**
 * This file is part of Haketilo.
 *
 * Function: Logic for the settings import frame.
 *
 * 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
 */