import type { EventNames, EventData } from "../../components/app_context.js"; import NoteContext from "../../components/note_context.js"; import { openDialog } from "../../services/dialog.js"; import BasicWidget from "../basic_widget.js"; import Container from "../containers/container.js"; import TypeWidget from "../type_widgets/type_widget.js"; const TPL = /*html*/`\ `; export default class PopupEditorDialog extends Container { private noteContext: NoteContext; private $modalHeader!: JQuery; private $modalBody!: JQuery; constructor() { super(); this.noteContext = new NoteContext("_popup-editor"); } doRender() { // This will populate this.$widget with the content of the children. super.doRender(); // Now we wrap it in the modal. const $newWidget = $(TPL); this.$modalHeader = $newWidget.find(".modal-title"); this.$modalBody = $newWidget.find(".modal-body"); const children = this.$widget.children(); this.$modalHeader.append(children[0]); this.$modalBody.append(children.slice(1)); this.$widget = $newWidget; this.setVisibility(false); } async openInPopupEvent({ noteIdOrPath }: EventData<"openInPopup">) { const $dialog = await openDialog(this.$widget, false, { focus: false }); await this.noteContext.setNote(noteIdOrPath); const activeEl = document.activeElement; if (activeEl && "blur" in activeEl) { (activeEl as HTMLElement).blur(); } $dialog.on("shown.bs.modal", async () => { // Reduce the z-index of modals so that ckeditor popups are properly shown on top of it. // The backdrop instance is not shared so it's OK to make a one-off modification. $("body > .modal-backdrop").css("z-index", "998"); $dialog.css("z-index", "999"); await this.handleEventInChildren("activeContextChanged", { noteContext: this.noteContext }); this.setVisibility(true); await this.handleEventInChildren("focusOnDetail", { ntxId: this.noteContext.ntxId }); }); $dialog.on("hidden.bs.modal", () => { const $typeWidgetEl = $dialog.find(".note-detail-printable"); if ($typeWidgetEl.length) { const typeWidget = glob.getComponentByEl($typeWidgetEl[0]) as TypeWidget; typeWidget.cleanup(); } this.setVisibility(false); }); } setVisibility(visible: boolean) { const $bodyItems = this.$modalBody.find("> div"); if (visible) { $bodyItems.fadeIn(); this.$modalHeader.children().show(); } else { $bodyItems.hide(); this.$modalHeader.children().hide(); } } handleEventInChildren(name: T, data: EventData): Promise | null { // Avoid events related to the current tab interfere with our popup. if (["noteSwitched", "noteSwitchedAndActivated"].includes(name)) { return Promise.resolve(); } return super.handleEventInChildren(name, data); } }