Files
racket-wiki/static/js/wiki/cmap/dialogs/unsaved-dialog.js
T

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);
}
}