import { t } from "../../services/i18n.js"; import utils from "../../services/utils.js"; import BasicWidget from "../basic_widget.js"; import { Modal } from "bootstrap"; const TPL = /*html*/` `; interface ShownCallbackData { $dialog: JQuery; $question: JQuery | null; $answer: JQuery | null; $form: JQuery; } export interface PromptDialogOptions { title?: string; message?: string; defaultValue?: string; shown?: PromptShownDialogCallback; callback?: (value: string | null) => void; } export type PromptShownDialogCallback = ((callback: ShownCallbackData) => void) | null; export default class PromptDialog extends BasicWidget { private resolve?: ((value: string | null) => void) | undefined | null; private shownCb?: PromptShownDialogCallback | null; private modal!: Modal; private $dialogBody!: JQuery; private $question!: JQuery | null; private $answer!: JQuery | null; private $form!: JQuery; constructor() { super(); this.resolve = null; this.shownCb = null; } doRender() { this.$widget = $(TPL); this.modal = Modal.getOrCreateInstance(this.$widget[0]); this.$dialogBody = this.$widget.find(".modal-body"); this.$form = this.$widget.find(".prompt-dialog-form"); this.$question = null; this.$answer = null; this.$widget.on("shown.bs.modal", () => { if (this.shownCb) { this.shownCb({ $dialog: this.$widget, $question: this.$question, $answer: this.$answer, $form: this.$form }); } this.$answer?.trigger("focus").select(); }); this.$widget.on("hidden.bs.modal", () => { if (this.resolve) { this.resolve(null); } }); this.$form.on("submit", (e) => { e.preventDefault(); if (this.resolve) { this.resolve(this.$answer?.val() as string); } this.modal.hide(); }); } showPromptDialogEvent({ title, message, defaultValue, shown, callback }: PromptDialogOptions) { this.shownCb = shown; this.resolve = callback; this.$widget.find(".prompt-title").text(title || t("prompt.defaultTitle")); this.$question = $("