diff --git a/app/assets/javascripts/discourse/app/controllers/composer.js b/app/assets/javascripts/discourse/app/controllers/composer.js index cb24c87a7e..316faee0d6 100644 --- a/app/assets/javascripts/discourse/app/controllers/composer.js +++ b/app/assets/javascripts/discourse/app/controllers/composer.js @@ -28,6 +28,7 @@ import { isTesting } from "discourse-common/config/environment"; import EmberObject, { computed, action } from "@ember/object"; import deprecated from "discourse-common/lib/deprecated"; import bootbox from "bootbox"; +import showModal from "discourse/lib/show-modal"; import { cannotPostAgain, durationTextFromSeconds, @@ -1097,46 +1098,36 @@ export default Controller.extend({ cancel(this._saveDraftDebounce); } - const keyPrefix = - this.model.action === "edit" ? "post.abandon_edit" : "post.abandon"; - let promise = new Promise((resolve, reject) => { if (this.get("model.hasMetaData") || this.get("model.replyDirty")) { - bootbox.dialog(I18n.t(keyPrefix + ".confirm"), [ - { - label: differentDraft - ? I18n.t(keyPrefix + ".no_save_draft") - : I18n.t(keyPrefix + ".no_value"), - callback: () => { - // cancel composer without destroying draft on new draft context - if (differentDraft) { + const controller = showModal("discard-draft", { + model: this.model, + modalClass: "discard-draft-modal", + title: "post.abandon.title", + }); + controller.setProperties({ + differentDraft, + onDestroyDraft: () => { + this.destroyDraft() + .then(() => { this.model.clearState(); this.close(); + }) + .finally(() => { resolve(); - } + }); + }, + onSaveDraft: () => { + // cancel composer without destroying draft on new draft context + if (differentDraft) { + this.model.clearState(); + this.close(); + resolve(); + } - reject(); - }, + reject(); }, - { - label: I18n.t(keyPrefix + ".yes_value"), - class: "btn-danger", - callback: (result) => { - if (result) { - this.destroyDraft() - .then(() => { - this.model.clearState(); - this.close(); - }) - .finally(() => { - resolve(); - }); - } else { - resolve(); - } - }, - }, - ]); + }); } else { // it is possible there is some sort of crazy draft with no body ... just give up on it this.destroyDraft() diff --git a/app/assets/javascripts/discourse/app/controllers/discard-draft.js b/app/assets/javascripts/discourse/app/controllers/discard-draft.js new file mode 100644 index 0000000000..32633aec29 --- /dev/null +++ b/app/assets/javascripts/discourse/app/controllers/discard-draft.js @@ -0,0 +1,40 @@ +import Controller from "@ember/controller"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import discourseComputed from "discourse-common/utils/decorators"; + +export default Controller.extend(ModalFunctionality, { + differentDraft: null, + + @discourseComputed() + keyPrefix() { + return this.model.action === "edit" ? "post.abandon_edit" : "post.abandon"; + }, + + @discourseComputed("keyPrefix") + descriptionKey(keyPrefix) { + return `${keyPrefix}.confirm`; + }, + + @discourseComputed("keyPrefix") + discardKey(keyPrefix) { + return `${keyPrefix}.yes_value`; + }, + + @discourseComputed("keyPrefix", "differentDraft") + saveKey(keyPrefix, differentDraft) { + return differentDraft + ? `${keyPrefix}.no_save_draft` + : `${keyPrefix}.no_value`; + }, + + actions: { + _destroyDraft() { + this.onDestroyDraft(); + this.send("closeModal"); + }, + _saveDraft() { + this.onSaveDraft(); + this.send("closeModal"); + }, + }, +}); diff --git a/app/assets/javascripts/discourse/app/templates/modal/discard-draft.hbs b/app/assets/javascripts/discourse/app/templates/modal/discard-draft.hbs new file mode 100644 index 0000000000..37720352a1 --- /dev/null +++ b/app/assets/javascripts/discourse/app/templates/modal/discard-draft.hbs @@ -0,0 +1,10 @@ +{{#d-modal-body}} +