/** * Ask how pending CMap changes should be handled before navigation. * * Each call to choose resolves once with "save", "discard" or "cancel". * Saving and discarding remain workspace responsibilities because they change * the active editor and persistence state. */ export class CmapUnsavedDialog { constructor(dialog) { this.dialog = dialog; this.resolveChoice = null; dialog.querySelector("#cmap-unsaved-save") .addEventListener("click", () => this.finish("save")); dialog.querySelector("#cmap-unsaved-discard") .addEventListener("click", () => this.finish("discard")); dialog.querySelector("#cmap-unsaved-cancel") .addEventListener("click", () => this.finish("cancel")); dialog.addEventListener("cancel", (event) => { event.preventDefault(); this.finish("cancel"); }); } choose() { if (this.resolveChoice) return Promise.resolve("cancel"); this.dialog.showModal(); return new Promise((resolve) => { this.resolveChoice = resolve; }); } chooseSave() { this.finish("save"); } finish(choice) { const resolve = this.resolveChoice; if (!resolve) return; this.resolveChoice = null; this.dialog.close(); resolve(choice); } }