45 lines
1.2 KiB
JavaScript
45 lines
1.2 KiB
JavaScript
/**
|
|
* 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);
|
|
}
|
|
}
|