| 1 | /**
 | 
  
    | 2 |  * This file is part of Haketilo.
 | 
  
    | 3 |  *
 | 
  
    | 4 |  * Function: Showing and error/info/confirmation dialog.
 | 
  
    | 5 |  *
 | 
  
    | 6 |  * Copyright (C) 2022 Wojtek Kosior
 | 
  
    | 7 |  *
 | 
  
    | 8 |  * This program is free software: you can redistribute it and/or modify
 | 
  
    | 9 |  * it under the terms of the GNU General Public License as published by
 | 
  
    | 10 |  * the Free Software Foundation, either version 3 of the License, or
 | 
  
    | 11 |  * (at your option) any later version.
 | 
  
    | 12 |  *
 | 
  
    | 13 |  * This program is distributed in the hope that it will be useful,
 | 
  
    | 14 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
  
    | 15 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
  
    | 16 |  * GNU General Public License for more details.
 | 
  
    | 17 |  *
 | 
  
    | 18 |  * As additional permission under GNU GPL version 3 section 7, you
 | 
  
    | 19 |  * may distribute forms of that code without the copy of the GNU
 | 
  
    | 20 |  * GPL normally required by section 4, provided you include this
 | 
  
    | 21 |  * license notice and, in case of non-source distribution, a URL
 | 
  
    | 22 |  * through which recipients can access the Corresponding Source.
 | 
  
    | 23 |  * If you modify file(s) with this exception, you may extend this
 | 
  
    | 24 |  * exception to your version of the file(s), but you are not
 | 
  
    | 25 |  * obligated to do so. If you do not wish to do so, delete this
 | 
  
    | 26 |  * exception statement from your version.
 | 
  
    | 27 |  *
 | 
  
    | 28 |  * As a special exception to the GPL, any HTML file which merely
 | 
  
    | 29 |  * makes function calls to this code, and for that purpose
 | 
  
    | 30 |  * includes it by reference shall be deemed a separate work for
 | 
  
    | 31 |  * copyright law purposes. If you modify this code, you may extend
 | 
  
    | 32 |  * this exception to your version of the code, but you are not
 | 
  
    | 33 |  * obligated to do so. If you do not wish to do so, delete this
 | 
  
    | 34 |  * exception statement from your version.
 | 
  
    | 35 |  *
 | 
  
    | 36 |  * You should have received a copy of the GNU General Public License
 | 
  
    | 37 |  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
  
    | 38 |  *
 | 
  
    | 39 |  * I, Wojtek Kosior, thereby promise not to sue for violation of this file's
 | 
  
    | 40 |  * license. Although I request that you do not make use of this code in a
 | 
  
    | 41 |  * proprietary program, I am not going to enforce this in court.
 | 
  
    | 42 |  */
 | 
  
    | 43 | 
 | 
  
    | 44 | #FROM html/DOM_helpers.js IMPORT clone_template, Showable
 | 
  
    | 45 | 
 | 
  
    | 46 | function make(on_dialog_show, on_dialog_hide)
 | 
  
    | 47 | {
 | 
  
    | 48 |     const dialog_context = clone_template("dialog");
 | 
  
    | 49 |     dialog_context.queue = [];
 | 
  
    | 50 | 
 | 
  
    | 51 |     Showable.call(dialog_context, on_dialog_show, on_dialog_hide);
 | 
  
    | 52 | 
 | 
  
    | 53 |     for (const [id, val] of [["yes", true], ["no", false], ["ok", undefined]]) {
 | 
  
    | 54 | 	const but = dialog_context[`${id}_but`];
 | 
  
    | 55 | 	but.haketilo_dialog_result = val;
 | 
  
    | 56 | 	but.addEventListener("click", e => close_dialog(dialog_context, e));
 | 
  
    | 57 |     }
 | 
  
    | 58 | 
 | 
  
    | 59 |     return dialog_context;
 | 
  
    | 60 | }
 | 
  
    | 61 | #EXPORT make
 | 
  
    | 62 | 
 | 
  
    | 63 | function close_dialog(dialog_context, event)
 | 
  
    | 64 | {
 | 
  
    | 65 |     if ((event && event.target.parentElement.classList.contains("hide")) ||
 | 
  
    | 66 |        dialog_context.queue.length === 0)
 | 
  
    | 67 | 	return;
 | 
  
    | 68 | 
 | 
  
    | 69 |     const [[shown_buts_id, msg, resolve]] = dialog_context.queue.splice(0, 1);
 | 
  
    | 70 | 
 | 
  
    | 71 |     if (dialog_context.queue.length > 0) {
 | 
  
    | 72 | 	process_queue_item(dialog_context);
 | 
  
    | 73 |     } else {
 | 
  
    | 74 | 	dialog_context.hide();
 | 
  
    | 75 |     }
 | 
  
    | 76 | 
 | 
  
    | 77 |     resolve(event ? event.target.haketilo_dialog_result : undefined);
 | 
  
    | 78 | }
 | 
  
    | 79 | #EXPORT  close_dialog  AS close
 | 
  
    | 80 | 
 | 
  
    | 81 | function process_queue_item(dialog_context)
 | 
  
    | 82 | {
 | 
  
    | 83 |     const [shown_buts_id, msg, resolve] = dialog_context.queue[0];
 | 
  
    | 84 | 
 | 
  
    | 85 |     [...dialog_context.msg.childNodes].forEach(n => n.remove());
 | 
  
    | 86 |     dialog_context.msg.append(...msg);
 | 
  
    | 87 |     for (const buts_id of ["ask_buts", "conf_buts"]) {
 | 
  
    | 88 | 	const action = buts_id === shown_buts_id ? "remove" : "add";
 | 
  
    | 89 | 	dialog_context[buts_id].classList[action]("hide");
 | 
  
    | 90 |     }
 | 
  
    | 91 | }
 | 
  
    | 92 | 
 | 
  
    | 93 | async function show_dialog(dialog_context, shown_buts_id, msg)
 | 
  
    | 94 | {
 | 
  
    | 95 |     let resolve;
 | 
  
    | 96 |     const result_prom = new Promise(cb => resolve = cb);
 | 
  
    | 97 |     dialog_context.queue.push([shown_buts_id, msg, resolve]);
 | 
  
    | 98 | 
 | 
  
    | 99 |     if (dialog_context.show())
 | 
  
    | 100 | 	process_queue_item(dialog_context);
 | 
  
    | 101 | 
 | 
  
    | 102 |     return await result_prom;
 | 
  
    | 103 | }
 | 
  
    | 104 | 
 | 
  
    | 105 | const error = (ctx, ...msg) => show_dialog(ctx, "conf_buts", msg);
 | 
  
    | 106 | #EXPORT error
 | 
  
    | 107 | 
 | 
  
    | 108 | /* info() and error() are the same for now, we might later change that. */
 | 
  
    | 109 | const info = error;
 | 
  
    | 110 | #EXPORT info
 | 
  
    | 111 | 
 | 
  
    | 112 | const ask = (ctx, ...msg) => show_dialog(ctx, "ask_buts", msg);
 | 
  
    | 113 | #EXPORT ask
 | 
  
    | 114 | 
 | 
  
    | 115 | const loader = (ctx, ...msg) => show_dialog(ctx, null, msg);
 | 
  
    | 116 | #EXPORT loader
 |