From 0276d00af286100186b74b3eff48a3558e153664 Mon Sep 17 00:00:00 2001 From: Areeb Jamal Date: Mon, 21 Sep 2020 16:57:39 +0530 Subject: [PATCH] fix: Restore ticket clause for saving event (#5105) --- app/mixins/event-wizard.js | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/app/mixins/event-wizard.js b/app/mixins/event-wizard.js index fd680beb726..8f7c67e2989 100644 --- a/app/mixins/event-wizard.js +++ b/app/mixins/event-wizard.js @@ -1,6 +1,6 @@ import Mixin from '@ember/object/mixin'; import MutableArray from '@ember/array/mutable'; -import RSVP from 'rsvp'; +import RSVP, { allSettled } from 'rsvp'; import { v1 } from 'ember-uuid'; import CustomFormMixin from 'open-event-frontend/mixins/custom-form'; @@ -70,9 +70,10 @@ export default Mixin.create(MutableArray, CustomFormMixin, { data[key] = result.value; } } - const numberOfTickets = data.tickets ? data.tickets.length : 0; + const numberOfTickets = data.tickets?.length || 0; - if (event.name && event.startsAtDate && event.endsAtDate) { + if (event.name && event.startsAtDate && event.endsAtDate && (event.state === 'draft' || (numberOfTickets > 0 && event.deletedTickets?.length !== numberOfTickets))) { + await destroyDeletedTickets(event.deletedTickets); await event.save(); await Promise.all((data.tickets ? data.tickets.toArray() : []).map(ticket => { @@ -133,8 +134,8 @@ export default Mixin.create(MutableArray, CustomFormMixin, { if (event.startsAtDate === undefined || event.endsAtDate === undefined) { errorObject.errors.push({ 'detail': 'Dates have not been provided' }); } - if (numberOfTickets === 0) { - errorObject.errors.push({ 'detail': 'Tickets are required for publishing event' }); + if (numberOfTickets === 0 || event.deletedTickets?.length === numberOfTickets) { + errorObject.errors.push({ 'detail': 'Tickets are required for publishing/published event' }); } throw (errorObject); } @@ -219,12 +220,17 @@ export default Mixin.create(MutableArray, CustomFormMixin, { }, move(direction) { this.onValid(() => { + preSaveActions.call(this); this.sendAction('move', direction, this.data); }); }, onValidate(callback) { this.onValid(() => { - callback(true); + const allTicketsDeleted = this.deletedTickets?.length === this.data.event.tickets.length; + if (allTicketsDeleted) { + this.notify.error('Tickets are required for publishing/published event'); + } + callback(!allTicketsDeleted); }); }, @@ -249,15 +255,19 @@ export default Mixin.create(MutableArray, CustomFormMixin, { } }); -function destroyDeletedTickets(deletedTickets) { +async function destroyDeletedTickets(deletedTickets) { if (!deletedTickets) {return} // This mixin may be used in other steps not containing tickets - deletedTickets.forEach(ticket => { - ticket.destroyRecord(); - }); + await allSettled(deletedTickets.map(ticket => { + try { + return ticket.destroyRecord(); + } catch (e) { + console.error('Error while deleting tickets', e); + } + })); } function preSaveActions() { - destroyDeletedTickets(this.deletedTickets); + this.data.event.deletedTickets = this.deletedTickets; if (this.selectedLocationType) { this.set('data.event.online', ['Online', 'Mixed'].includes(this.selectedLocationType));