diff --git a/app/components/modals/edit-newsletter/confirm-create.hbs b/app/components/modals/edit-newsletter/confirm-create.hbs deleted file mode 100644 index a672c671a..000000000 --- a/app/components/modals/edit-newsletter/confirm-create.hbs +++ /dev/null @@ -1,37 +0,0 @@ - \ No newline at end of file diff --git a/app/components/modals/edit-newsletter/confirm-archive.hbs b/app/components/modals/newsletters/confirm-archive.hbs similarity index 100% rename from app/components/modals/edit-newsletter/confirm-archive.hbs rename to app/components/modals/newsletters/confirm-archive.hbs diff --git a/app/components/modals/edit-newsletter/confirm-newsletter-email.hbs b/app/components/modals/newsletters/confirm-newsletter-email.hbs similarity index 100% rename from app/components/modals/edit-newsletter/confirm-newsletter-email.hbs rename to app/components/modals/newsletters/confirm-newsletter-email.hbs diff --git a/app/components/modals/edit-newsletter/confirm-unarchive.hbs b/app/components/modals/newsletters/confirm-unarchive.hbs similarity index 100% rename from app/components/modals/edit-newsletter/confirm-unarchive.hbs rename to app/components/modals/newsletters/confirm-unarchive.hbs diff --git a/app/components/modals/edit-newsletter.hbs b/app/components/modals/newsletters/edit.hbs similarity index 85% rename from app/components/modals/edit-newsletter.hbs rename to app/components/modals/newsletters/edit.hbs index 6b10bcae7..700df4e8e 100644 --- a/app/components/modals/edit-newsletter.hbs +++ b/app/components/modals/newsletters/edit.hbs @@ -13,13 +13,11 @@ {{#if (eq this.tab "settings")}} - {{else}} - + {{/if}} @@ -39,7 +37,7 @@ data-test-button="save-newsletter" /> - + diff --git a/app/components/modals/edit-newsletter.js b/app/components/modals/newsletters/edit.js similarity index 65% rename from app/components/modals/edit-newsletter.js rename to app/components/modals/newsletters/edit.js index 7646ddf11..1fdda2bf1 100644 --- a/app/components/modals/edit-newsletter.js +++ b/app/components/modals/newsletters/edit.js @@ -1,6 +1,5 @@ import Component from '@glimmer/component'; -import ConfirmCreateModal from './edit-newsletter/confirm-create'; -import ConfirmNewsletterEmailModal from './edit-newsletter/confirm-newsletter-email'; +import ConfirmNewsletterEmailModal from './confirm-newsletter-email'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency'; @@ -14,7 +13,6 @@ export default class EditNewsletterModal extends Component { }; @tracked tab = 'settings'; - @tracked optInExisting = this.args.data.newsletter.isNew; willDestroy() { super.willDestroy(...arguments); @@ -34,35 +32,14 @@ export default class EditNewsletterModal extends Component { this.saveTask.perform(); } - @action - setOptInExisting(value) { - this.optInExisting = value; - } - @task *saveTask() { try { yield this.args.data.newsletter.validate({}); - const {optInExisting} = this; - - if (this.args.data.newsletter.isNew) { - const shouldCreate = yield this.modals.open(ConfirmCreateModal, { - optInExisting, - newsletter: this.args.data.newsletter - }); - - if (!shouldCreate) { - // ensure task button returns to idle state - return 'canceled'; - } - } - const newEmail = this.args.data.newsletter.senderEmail; - const result = yield this.args.data.newsletter.save({ - adapterOptions: {optInExisting} - }); + const result = yield this.args.data.newsletter.save(); if (result._meta?.sent_email_verification) { yield this.modals.open(ConfirmNewsletterEmailModal, { diff --git a/app/components/modals/edit-newsletter/design.hbs b/app/components/modals/newsletters/edit/design.hbs similarity index 100% rename from app/components/modals/edit-newsletter/design.hbs rename to app/components/modals/newsletters/edit/design.hbs diff --git a/app/components/modals/edit-newsletter/design.js b/app/components/modals/newsletters/edit/design.js similarity index 100% rename from app/components/modals/edit-newsletter/design.js rename to app/components/modals/newsletters/edit/design.js diff --git a/app/components/modals/edit-newsletter/preview.hbs b/app/components/modals/newsletters/edit/preview.hbs similarity index 100% rename from app/components/modals/edit-newsletter/preview.hbs rename to app/components/modals/newsletters/edit/preview.hbs diff --git a/app/components/modals/edit-newsletter/preview.js b/app/components/modals/newsletters/edit/preview.js similarity index 100% rename from app/components/modals/edit-newsletter/preview.js rename to app/components/modals/newsletters/edit/preview.js diff --git a/app/components/modals/edit-newsletter/settings.hbs b/app/components/modals/newsletters/edit/settings.hbs similarity index 86% rename from app/components/modals/edit-newsletter/settings.hbs rename to app/components/modals/newsletters/edit/settings.hbs index efdc63425..059eb52de 100644 --- a/app/components/modals/edit-newsletter/settings.hbs +++ b/app/components/modals/newsletters/edit/settings.hbs @@ -41,7 +41,7 @@ - + {{svg-jar "info" class="fill-darkgrey w4 h4"}} @@ -88,23 +88,6 @@ - - {{#if @newsletter.isNew}} - - -
-
- - -
-
-
- {{/if}} \ No newline at end of file diff --git a/app/components/modals/edit-newsletter/settings.js b/app/components/modals/newsletters/edit/settings.js similarity index 100% rename from app/components/modals/edit-newsletter/settings.js rename to app/components/modals/newsletters/edit/settings.js diff --git a/app/components/modals/newsletters/new.hbs b/app/components/modals/newsletters/new.hbs new file mode 100644 index 000000000..cc5d982e3 --- /dev/null +++ b/app/components/modals/newsletters/new.hbs @@ -0,0 +1,77 @@ + \ No newline at end of file diff --git a/app/components/modals/newsletters/new.js b/app/components/modals/newsletters/new.js new file mode 100644 index 000000000..8a4a7b14d --- /dev/null +++ b/app/components/modals/newsletters/new.js @@ -0,0 +1,61 @@ +import Component from '@glimmer/component'; +import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency'; +import {tracked} from '@glimmer/tracking'; + +export default class NewNewsletterModal extends Component { + @service modals; + + @tracked optInExisting = this.args.data.newsletter.isNew; + + willDestroy() { + super.willDestroy(...arguments); + this.args.data.newsletter.rollbackAttributes(); + } + + @action + onInput(property, event) { + this.args.data.newsletter[property] = event.target.value; + } + + @action + saveViaKeyboard(event, responder) { + responder.stopPropagation(); + event.preventDefault(); + + this.saveTask.perform(); + } + + @action + setOptInExisting(event) { + this.optInExisting = event.target.value; + } + + @action + toggleOptInExisting() { + this.optInExisting = !this.optInExisting; + } + + @task + *saveTask() { + try { + yield this.args.data.newsletter.validate({}); + + const result = yield this.args.data.newsletter.save({ + adapterOptions: {optInExisting: this.optInExisting} + }); + + this.args.data.afterSave?.(result); + + return result; + } catch (e) { + if (e === undefined) { + // ensure task button shows failed state + throw new Error('Validation failed'); + } + + throw e; + } + } +} diff --git a/app/components/modals/edit-newsletter/verify-newsletter-email.hbs b/app/components/modals/newsletters/verify-newsletter-email.hbs similarity index 100% rename from app/components/modals/edit-newsletter/verify-newsletter-email.hbs rename to app/components/modals/newsletters/verify-newsletter-email.hbs diff --git a/app/components/modals/edit-newsletter/verify-newsletter-email.js b/app/components/modals/newsletters/verify-newsletter-email.js similarity index 100% rename from app/components/modals/edit-newsletter/verify-newsletter-email.js rename to app/components/modals/newsletters/verify-newsletter-email.js diff --git a/app/components/settings/members-email-labs/newsletter-management.js b/app/components/settings/members-email-labs/newsletter-management.js index 896b8f57b..23f2bae55 100644 --- a/app/components/settings/members-email-labs/newsletter-management.js +++ b/app/components/settings/members-email-labs/newsletter-management.js @@ -1,6 +1,6 @@ import Component from '@glimmer/component'; -import ConfirmArchiveModal from '../../modals/edit-newsletter/confirm-archive'; -import ConfirmUnarchiveModal from '../../modals/edit-newsletter/confirm-unarchive'; +import ConfirmArchiveModal from '../../modals/newsletters/confirm-archive'; +import ConfirmUnarchiveModal from '../../modals/newsletters/confirm-unarchive'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency'; diff --git a/app/routes/settings/members-email-labs.js b/app/routes/settings/members-email-labs.js index 9ef9d9c3d..9c4156e56 100644 --- a/app/routes/settings/members-email-labs.js +++ b/app/routes/settings/members-email-labs.js @@ -1,6 +1,6 @@ import AdminRoute from 'ghost-admin/routes/admin'; import ConfirmUnsavedChangesModal from '../../components/modals/confirm-unsaved-changes'; -import VerifyNewsletterEmail from '../../components/modals/edit-newsletter/verify-newsletter-email'; +import VerifyNewsletterEmail from '../../components/modals/newsletters/verify-newsletter-email'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; diff --git a/app/routes/settings/members-email-labs/edit-newsletter.js b/app/routes/settings/members-email-labs/edit-newsletter.js index fe2bfeb04..e98cf3886 100644 --- a/app/routes/settings/members-email-labs/edit-newsletter.js +++ b/app/routes/settings/members-email-labs/edit-newsletter.js @@ -1,6 +1,6 @@ import AdminRoute from 'ghost-admin/routes/admin'; import ConfirmUnsavedChangesModal from '../../../components/modals/confirm-unsaved-changes'; -import EditNewsletterModal from '../../../components/modals/edit-newsletter'; +import EditNewsletterModal from '../../../components/modals/newsletters/edit'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; diff --git a/app/routes/settings/members-email-labs/new-newsletter.js b/app/routes/settings/members-email-labs/new-newsletter.js index e71214e00..2d4e3e997 100644 --- a/app/routes/settings/members-email-labs/new-newsletter.js +++ b/app/routes/settings/members-email-labs/new-newsletter.js @@ -1,6 +1,5 @@ import AdminRoute from 'ghost-admin/routes/admin'; -import ConfirmUnsavedChangesModal from '../../../components/modals/confirm-unsaved-changes'; -import EditNewsletterModal from '../../../components/modals/edit-newsletter'; +import NewNewsletterModal from '../../../components/modals/newsletters/new'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; @@ -19,7 +18,7 @@ export default class NewNewsletterRoute extends AdminRoute { setupController(controller, model) { this.newsletterModal?.close(); - this.newsletterModal = this.modals.open(EditNewsletterModal, { + this.newsletterModal = this.modals.open(NewNewsletterModal, { newsletter: model, afterSave: this.afterSave }, { @@ -35,64 +34,13 @@ export default class NewNewsletterRoute extends AdminRoute { deactivate() { this.isLeaving = true; this.newsletterModal?.close(); - this.isLeaving = false; - this.newsletterModal = null; - - this.confirmModal = null; - this.hasConfirmed = false; - } - - @action - async willTransition(transition) { - if (this.hasConfirmed) { - return true; - } - - transition.abort(); - - // wait for any existing confirm modal to be closed before allowing transition - if (this.confirmModal) { - return; - } - - const shouldLeave = await this.confirmUnsavedChanges(); - - if (shouldLeave) { - this.hasConfirmed = true; - return transition.retry(); - } - } - - async confirmUnsavedChanges() { - const newsletter = this.newsletterModal?._data.newsletter; - - if (newsletter && newsletter.hasDirtyAttributes && Object.keys(newsletter.changedAttributes()).length > 0) { - this.confirmModal = this.modals.open(ConfirmUnsavedChangesModal) - .then((discardChanges) => { - if (discardChanges === true) { - newsletter.rollbackAttributes(); - } - return discardChanges; - }).finally(() => { - this.confirmModal = null; - }); - - return this.confirmModal; - } - - return true; } @action async beforeModalClose() { - const shouldLeave = await this.confirmUnsavedChanges(); - - if (shouldLeave && !this.isLeaving) { + if (!this.isLeaving) { this.router.transitionTo('settings.members-email-labs'); - return true; } - - return false; } }