Skip to content

Commit 304d752

Browse files
author
Hieu Lam - TMA
authored
feature-8740: Make attendee form ticket specific (#8804)
* feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8740: Make attendee form ticket specific * feature-8740: Make attendee form ticket specific * feature-8740: Make attendee form ticket specific * Demo-20230616: Merge code * Demo-20230616: Merge code * Demo-20230616: Merge code * feature-8470: Revert code demo * feature-8470: Revert code demo * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Merge code development * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8740: Make attendee form ticket specific * feature-8740: Make attendee form ticket specific * feature-8740: Make attendee form ticket specific * feature-8740: Make attendee form ticket specific
1 parent b2bdb9f commit 304d752

File tree

17 files changed

+386
-42
lines changed

17 files changed

+386
-42
lines changed

app/components/forms/wizard/attendee-step.js

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,98 @@ import { computed, observer } from '@ember/object';
33
import FormMixin from 'open-event-frontend/mixins/form';
44
import EventWizardMixin from 'open-event-frontend/mixins/event-wizard';
55
import { sortBy } from 'lodash-es';
6+
import { v4 } from 'ember-uuid';
7+
import { A } from '@ember/array';
68

79
export default Component.extend(FormMixin, EventWizardMixin, {
10+
tickets : [],
11+
excludeTickets : A(),
12+
isOldFormMode : false,
13+
isInit : false,
14+
15+
init() {
16+
this._super(...arguments);
17+
this.prepareCustomFormsForShow();
18+
},
19+
20+
prepareCustomFormsForShow() {
21+
const { tickets, customForms, forms } = this.data;
22+
if (this.isInit || forms.length) {return}
23+
this.isInit = true;
24+
const noForm = tickets.filter(_ticket => _ticket.formID).length === 0;
25+
if (noForm) {
26+
const _formID = v4();
27+
const _fields = customForms?.filter(field => {
28+
if (!field.isFixed && !field.isDeleted) {
29+
field.formID = _formID;
30+
return true;
31+
}
32+
return false;
33+
});
34+
if (_fields.length > 0) {
35+
tickets.forEach(_ticket => {
36+
_ticket.formID = _formID;
37+
this.excludeTickets.pushObject(_ticket);
38+
});
39+
forms.pushObject(this.store.createRecord('custom-form-ticket', {
40+
formID : _formID,
41+
customForms : _fields,
42+
ticketsDetails : tickets
43+
}));
44+
}
45+
} else {
46+
const _forms = {};
47+
tickets.forEach(ticket => {
48+
const { formID } = ticket;
49+
if (formID) {
50+
if (_forms[formID]) {
51+
_forms[formID].ticketsDetails.pushObject(ticket);
52+
} else {
53+
_forms[formID] = {
54+
ticketsDetails: [ticket]
55+
};
56+
}
57+
this.excludeTickets.pushObject(ticket);
58+
}
59+
});
60+
61+
Object.keys(_forms).forEach(_id => {
62+
const selectedTicket = _forms[_id].ticketsDetails;
63+
forms.pushObject({
64+
formID : _id,
65+
ticketsDetails : selectedTicket,
66+
customForms : customForms.filter(_field => _field.formID === _id)
67+
});
68+
});
69+
}
70+
},
71+
72+
prepareCustomFormsForSave() {
73+
this.data.forms.forEach(_form => {
74+
const { formID, customForms, ticketsDetails } = _form;
75+
customForms.forEach(field => {
76+
if (!field.isDeleted) {
77+
field.formID = formID;
78+
}
79+
if (!field.id) {
80+
this.data.customForms.pushObject(field);
81+
}
82+
});
83+
84+
ticketsDetails.forEach(ticket => {
85+
ticket.formID = formID;
86+
});
87+
});
88+
},
889

990
fixedFields: computed('data.customForms.@each', function() {
1091
return this.data.customForms?.filter(field => field.isFixed);
1192
}),
1293

94+
selectableTickets: computed('excludeTickets.@each', 'form.@each', function() {
95+
return this.data.tickets.filter(ticket => !this.excludeTickets.includes(ticket));
96+
}),
97+
1398
editableFields: computed('data.customForms.@each', function() {
1499
const filteredFields = this.data.customForms?.filter(field => !field.isFixed);
15100
const fields = sortBy(filteredFields, ['isComplex', 'name']);
@@ -26,9 +111,56 @@ export default Component.extend(FormMixin, EventWizardMixin, {
26111
return this.editableFields?.some(field => field.isComplex);
27112
}),
28113

114+
29115
actions: {
30116
removeField(field) {
31117
field.deleteRecord();
118+
},
119+
addMoreForm(ticketsDetails = []) {
120+
const _formID = v4();
121+
this.data.forms.pushObject(this.store.createRecord('custom-form-ticket', {
122+
formID : _formID,
123+
customForms : this.getCustomAttendeeForm(this.data.event, _formID),
124+
ticketsDetails
125+
}));
126+
},
127+
128+
onFormUpdateTicket(changedData) {
129+
const { added, changed, formID } = changedData;
130+
changed.forEach(ticket => {
131+
ticket.formID = added ? formID : '';
132+
});
133+
if (added) {
134+
this.excludeTickets.pushObjects(changed);
135+
} else {
136+
this.excludeTickets.removeObjects(changed);
137+
}
138+
},
139+
saveDraft() {
140+
this.prepareCustomFormsForSave();
141+
this._super();
142+
},
143+
saveForm() {
144+
this.prepareCustomFormsForSave();
145+
this._super();
146+
},
147+
move(direction) {
148+
this.prepareCustomFormsForSave();
149+
this._super(direction);
150+
},
151+
onRemoveForm(_id) {
152+
const deleteForm = this.data.forms.find(_form => _form.formID === _id);
153+
if (deleteForm) {
154+
const { ticketsDetails, customForms } = deleteForm;
155+
ticketsDetails.forEach(ticket => {
156+
ticket.formID = '';
157+
});
158+
customForms.forEach(field => {
159+
field.deleteRecord();
160+
});
161+
this.excludeTickets.removeObjects(deleteForm.ticketsDetails);
162+
this.data.forms.removeObject(deleteForm);
163+
}
32164
}
33165
}
34166
});

app/components/forms/wizard/custom-form-input.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { inject as service } from '@ember/service';
55
import DS from 'ember-data';
66
import { tracked } from '@glimmer/tracking';
77

8-
interface CustomForm { fieldIdentifier: string, name: string, type: string, min: number, max: number}
8+
interface CustomForm { fieldIdentifier: string, name: string, type: string, min: number, max: number, formIdentifier: string}
99

1010
function getIdentifier(name: string, fields: CustomForm[]): string {
1111
const fieldIdentifiers = new Set(fields.map(field => field.fieldIdentifier));
@@ -22,6 +22,7 @@ interface Args {
2222
customForms: CustomForm[],
2323
form: string,
2424
event: any,
25+
formIdentifier: string | '',
2526
min: number | 0,
2627
max: number | 10,
2728
onSave: (() => void) | null
@@ -79,8 +80,9 @@ export default class CustomFormInput extends Component<Args> {
7980
isIncluded : false,
8081
isComplex : true,
8182
event : this.args.event,
83+
formID : this.args.formIdentifier,
8284
min : this.min,
83-
max : this.max,
85+
max : this.max
8486
});
8587
}
8688

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import Component from '@ember/component';
2+
import { computed, observer } from '@ember/object';
3+
import FormMixin from 'open-event-frontend/mixins/form';
4+
import EventWizardMixin from 'open-event-frontend/mixins/event-wizard';
5+
import { sortBy, union } from 'lodash-es';
6+
7+
export default Component.extend(FormMixin, EventWizardMixin, {
8+
currentSelected: [],
9+
init() {
10+
this._super(...arguments);
11+
this.currentSelected = this.data.ticketsDetails;
12+
},
13+
ticketsEnable: computed('tickets', 'ticketsDetails', function() {
14+
return union(this.tickets || [], this.data.ticketsDetails || []);
15+
}),
16+
17+
fixedFields: computed('data.customForms.@each', function() {
18+
return this.data.customForms?.filter(field => field.isFixed);
19+
}),
20+
21+
selectChanges: observer('data.ticketsDetails', function() {
22+
const { ticketsDetails } = this.data;
23+
const { currentSelected } = this;
24+
25+
const added = currentSelected.length < ticketsDetails.length;
26+
let changed = [];
27+
if (added) {
28+
changed = ticketsDetails.filter(item => !currentSelected.includes(item));
29+
} else {
30+
changed = currentSelected.filter(item => !ticketsDetails.includes(item));
31+
}
32+
this.currentSelected = ticketsDetails;
33+
this.get('onFormUpdateTicket')({
34+
added,
35+
changed,
36+
formID: this.id
37+
});
38+
39+
}),
40+
41+
editableFields: computed('data.customForms.@each', function() {
42+
const filteredFields = this.data.customForms?.filter(field => !field.isFixed);
43+
const fields = sortBy(filteredFields, ['isComplex', 'name']);
44+
return sortBy(fields, ['position']);
45+
}),
46+
47+
revertChanges: observer('data.event.isTicketFormEnabled', function() {
48+
if (!this.event.isTicketFormEnabled) {
49+
this.editableFields.forEach(field => field.set('isRequired', false));
50+
}
51+
}),
52+
53+
showEditColumn: computed('editableFields.@each', function() {
54+
return this.editableFields?.some(field => field.isComplex);
55+
}),
56+
57+
actions: {
58+
removeField(field) {
59+
field.deleteRecord();
60+
}
61+
}
62+
});
63+

app/components/forms/wizard/custom-forms/table.hbs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<thead>
88
{{#if @headerText}}
99
<tr>
10-
<th colspan="{{if this.editColumn '5' '4'}}" class="text center aligned">
10+
<th colspan="{{if this.editColumn (if this.complexColumn '6' '5') '4'}}" class="text center aligned">
1111
{{@headerText}}
1212
</th>
1313
</tr>
@@ -24,7 +24,7 @@
2424
<th class="center aligned">
2525
{{t 'Type'}}
2626
</th>
27-
{{#if this.editColumn}}
27+
{{#if (and this.complexColumn (eq @form 'attendee'))}}
2828
<th class="center aligned">
2929
{{t 'Range'}}
3030
</th>
@@ -38,7 +38,7 @@
3838
<th class="center aligned">
3939
{{t 'Show Public'}}
4040
</th>
41-
{{#if this.editColumn}}
41+
{{#if this.complexColumn}}
4242
<th class="center aligned">
4343
{{t 'Actions'}}
4444
</th>
@@ -48,6 +48,7 @@
4848
</thead>
4949
<tbody>
5050
{{#each @fields as |field|}}
51+
{{#unless field.isDeleted}}
5152
<DraggableObject @overrideClass="{{if field.isIncluded 'positive'}} table-row" @content={{field}} @isSortable={{true}}>
5253
<td class="{{if this.device.isMobile 'center' 'right'}} border right aligned">
5354
<label class="{{if field.isFixed 'required'}}">
@@ -62,7 +63,7 @@
6263
<td class="border center aligned">
6364
{{t-var field.type}}
6465
</td>
65-
{{#if this.editColumn}}
66+
{{#if (and this.complexColumn (eq @form 'attendee'))}}
6667
<td class="border center aligned">
6768
{{if (eq field.type "number") (concat field.min " - " field.max) "-"}}
6869
</td>
@@ -90,7 +91,7 @@
9091
@onChange={{action (mut field.isPublic)}}
9192
@label={{if this.device.isMobile (t "Public")}} />
9293
</td>
93-
{{#if this.editColumn}}
94+
{{#if this.complexColumn}}
9495
<td class="border center aligned">
9596
{{#if field.isComplex}}
9697
<button class="ui compact icon positive circular button" data-tooltip="{{t 'Edit'}}" {{action @updateField field}}>
@@ -103,6 +104,7 @@
103104
</td>
104105
{{/if}}
105106
</DraggableObject>
107+
{{/unless}}
106108
{{/each}}
107109
</tbody>
108110
</table>

app/components/forms/wizard/custom-forms/table.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
import Component from '@glimmer/component';
22
import { action } from '@ember/object';
33

4-
interface CustomForm { isComplex: boolean }
4+
interface CustomForm { isComplex: boolean, isFixed: boolean }
55

66
interface Args {
77
fields: CustomForm[],
8+
form: string,
89
removeField: (field: any) => void,
910
updateField: (field: any) => void
1011
}
1112

1213
export default class CustomFormTable extends Component<Args> {
1314
get editColumn(): boolean {
15+
return this.args.fields?.some(field => !field.isFixed);
16+
}
17+
18+
get complexColumn(): boolean {
1419
return this.args.fields?.some(field => field.isComplex);
1520
}
1621

app/controllers/events/view/edit/attendee.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import EventWizardMixin from 'open-event-frontend/mixins/event-wizard';
77
export default class AttendeeController extends Controller.extend(EventWizardMixin) {
88
async saveForms(data) {
99
await Promise.all((data?.customForms?.toArray() ?? []).map(customForm => customForm.save()));
10+
await Promise.all((data?.tickets ?? []).map(ticket => ticket.save()));
1011
return data;
1112
}
1213

0 commit comments

Comments
 (0)