Skip to content

Commit 0347991

Browse files
Hieu Lam - TMAkhangonodkhang
authored
feature-8788: Implement language form fields in the attendee form (#8808)
* 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 * feature-8788: Implement language form fields in the attendee form * feature-8788: Merge code development * feature-8788: Add translate * feature-8788: Implement language form fields in the attendee form * feature-8788: Implement language form fields in the attendee form --------- Co-authored-by: Khang On - TMA <[email protected]> Co-authored-by: khangon <[email protected]>
1 parent 420f88b commit 0347991

File tree

31 files changed

+417
-13
lines changed

31 files changed

+417
-13
lines changed

app/components/forms/orders/attendee-list.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { action, computed } from '@ember/object';
44
import { groupBy } from 'lodash-es';
55
import { or } from '@ember/object/computed';
66
import { tracked } from '@glimmer/tracking';
7+
import { languageForms } from 'open-event-frontend/utils/dictionary/language-form';
78

89
@classic
910
export default class AttendeeList extends Component {
@@ -17,9 +18,30 @@ export default class AttendeeList extends Component {
1718

1819
@computed('data.attendees')
1920
get holders() {
21+
this.data.attendees.forEach(attendee => {
22+
if (attendee.language_form_1) {
23+
this.languageFormMapCodeToName(attendee, 'language_form_1');
24+
}
25+
if (attendee.language_form_2) {
26+
this.languageFormMapCodeToName(attendee, 'language_form_2');
27+
}
28+
});
2029
return this.data.attendees;
2130
}
2231

32+
languageFormMapCodeToName(attendee, key) {
33+
const languageFormMap = [];
34+
const languageFormList = attendee[key].split(',');
35+
languageForms.forEach(languageForm => {
36+
languageFormList.forEach(item => {
37+
if (item === languageForm.code) {
38+
languageFormMap.push(languageForm.name);
39+
}
40+
});
41+
});
42+
return attendee.set(key, languageFormMap.map(select => select).join(', '));
43+
}
44+
2345
@or('event.isBillingInfoMandatory', 'data.isBillingEnabled')
2446
showBillingInfo;
2547

app/components/forms/orders/order-form.js

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { genders } from 'open-event-frontend/utils/dictionary/genders';
1414
import { ageGroups } from 'open-event-frontend/utils/dictionary/age-groups';
1515
import { countries } from 'open-event-frontend/utils/dictionary/demography';
1616
import { years } from 'open-event-frontend/utils/dictionary/year-list';
17+
import { languageForms } from 'open-event-frontend/utils/dictionary/language-form';
1718
import { homeWikis } from 'open-event-frontend/utils/dictionary/home-wikis';
1819

1920
export default Component.extend(FormMixin, {
@@ -459,6 +460,24 @@ export default Component.extend(FormMixin, {
459460
]
460461
};
461462

463+
const languageForm1Validation = {
464+
rules: [
465+
{
466+
type : 'empty',
467+
prompt : this.l10n.t('Please enter Language Form.')
468+
}
469+
]
470+
};
471+
472+
const languageForm2Validation = {
473+
rules: [
474+
{
475+
type : 'empty',
476+
prompt : this.l10n.t('Please enter Language Form.')
477+
}
478+
]
479+
};
480+
462481
const validationRules = {
463482
inline : true,
464483
delay : false,
@@ -580,6 +599,8 @@ export default Component.extend(FormMixin, {
580599
validationRules.fields[`instagram_required_${ index}`] = instagramRequiredValidation;
581600
validationRules.fields[`linkedin_${ index}`] = linkedinValidation;
582601
validationRules.fields[`linkedin_required_${ index}`] = linkedinRequiredValidation;
602+
validationRules.fields[`language_form_1_required_${ index}`] = languageForm1Validation;
603+
validationRules.fields[`language_form_2_required_${ index}`] = languageForm2Validation;
583604
this.allFields.attendee.filter(field => field.isComplex && field.isRequired).forEach(field => {
584605
validationRules.fields[`${field.fieldIdentifier}_required_${index}`] = {
585606
rules: [
@@ -601,11 +622,12 @@ export default Component.extend(FormMixin, {
601622
return groupBy(requiredFixed.concat(customFields), field => field.get('form'));
602623
}),
603624

604-
genders : orderBy(genders, 'name'),
605-
ageGroups : orderBy(ageGroups, 'position'),
606-
countries : orderBy(countries, 'name'),
607-
years : orderBy(years, 'year'),
608-
homeWikis : orderBy(homeWikis, 'item'),
625+
genders : orderBy(genders, 'name'),
626+
ageGroups : orderBy(ageGroups, 'position'),
627+
countries : orderBy(countries, 'name'),
628+
years : orderBy(years, 'year'),
629+
languageForms : orderBy(languageForms, 'item'),
630+
homeWikis : orderBy(homeWikis, 'item'),
609631

610632
actions: {
611633
submit(data) {
@@ -626,6 +648,9 @@ export default Component.extend(FormMixin, {
626648
holder.set('lastname', '');
627649
holder.set('email', '');
628650
}
651+
},
652+
updateLanguageFormsSelection(checked, changed, selectedOptions, holder, field) {
653+
holder.set(field.fieldIdentifier, selectedOptions.map(select => select.value).join(','));
629654
}
630655
}
631656
});
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import Component from '@ember/component';
2+
import FormMixin from 'open-event-frontend/mixins/form';
3+
import { A } from '@ember/array';
4+
5+
6+
export default Component.extend(FormMixin, {
7+
selectedFields : [],
8+
value1 : [],
9+
languageForms : A([]),
10+
init() {
11+
this._super(...arguments);
12+
},
13+
14+
actions: {
15+
onChange1(checked, value, valueList) {
16+
this.value1 = valueList;
17+
},
18+
valueChange() {
19+
},
20+
onChange() {
21+
}
22+
}
23+
});
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import { A } from '@ember/array';
2+
import EmberObject, { action } from '@ember/object';
3+
import { guidFor } from '@ember/object/internals';
4+
import Component from '@glimmer/component';
5+
6+
/**
7+
ui-checkbox-group component see {{#crossLink "mixins.UiCheckboxGroupBase"}}{{/crossLink}}
8+
9+
@module components
10+
@namespace components
11+
@class UiCheckboxGroup
12+
@constructor
13+
*/
14+
export default class UiCheckboxGroupComponent extends Component {
15+
constructor() {
16+
super(...arguments);
17+
this.value = this.args.value ?? A();
18+
}
19+
20+
get type() {
21+
return this.args.type ?? 'checkbox';
22+
}
23+
24+
get name() {
25+
return this.args.name ?? guidFor(this);
26+
}
27+
28+
/**
29+
* name key for option, by default name
30+
*
31+
* @property {String} namePath
32+
* @default 'name'
33+
*/
34+
get labelPath() {
35+
return this.args.labelPath ?? 'name';
36+
}
37+
38+
/**
39+
* value key for option, by default value
40+
*
41+
* @property {String} valuePath
42+
* @default 'value'
43+
*/
44+
get valuePath() {
45+
return this.args.valuePath ?? 'value';
46+
}
47+
48+
/**
49+
* options for the select component
50+
*
51+
* @property {Array} options
52+
*/
53+
get options() {
54+
if (!this.args.options) {return A()}
55+
const _options = A();
56+
for (let i = 0; i < this.args.options.length; i++) {
57+
const item = this.args.options[i];
58+
const label = item.name;
59+
const value = item.code;
60+
const checked = this.isOptionChecked(value);
61+
const obj = EmberObject.create({
62+
label,
63+
value: String(value),
64+
checked
65+
});
66+
_options.pushObject(obj);
67+
}
68+
69+
return _options;
70+
}
71+
72+
isOptionChecked(optionValue) {
73+
if (this.type === 'checkbox') {
74+
return this.value.includes(optionValue);
75+
}
76+
77+
if (this.type === 'radio') {
78+
return this.value === optionValue;
79+
}
80+
}
81+
82+
@action
83+
childOnChange(checked, value) {
84+
if (this.type === 'checkbox') {
85+
if (checked && !this.value.includes(value)) {
86+
this.value.pushObject(value);
87+
}
88+
if (!checked && this.value.includes(value)) {
89+
this.value.removeObject(value);
90+
}
91+
92+
if (this.args.onChange) {
93+
this.args.onChange(checked, value, this.value, this.args.holder, this.args.field);
94+
}
95+
}
96+
97+
if (this.type === 'radio') {
98+
if (checked) {
99+
this.value = value;
100+
}
101+
102+
if (this.args.onChange) {
103+
this.args.onChange(checked, value);
104+
}
105+
}
106+
}
107+
}

app/mixins/custom-form.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,28 @@ export default Mixin.create(MutableArray, {
638638
isIncluded : false,
639639
isPublic : false,
640640
event : parent
641+
}),
642+
this.store.createRecord('custom-form', {
643+
name : 'languageForm1',
644+
fieldIdentifier : 'language_form_1',
645+
formID : _formID,
646+
form : 'attendee',
647+
type : 'checkbox',
648+
isRequired : false,
649+
isIncluded : false,
650+
isPublic : false,
651+
event : parent
652+
}),
653+
this.store.createRecord('custom-form', {
654+
name : 'languageForm2',
655+
fieldIdentifier : 'language_form_2',
656+
formID : _formID,
657+
form : 'attendee',
658+
type : 'checkbox',
659+
isRequired : false,
660+
isIncluded : false,
661+
isPublic : false,
662+
event : parent
641663
})
642664
];
643665
}

app/models/attendee.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ export default ModelBase.extend({
4141
acceptShareDetails : attr('boolean', { defaultValue: true }),
4242
birthDate : attr('moment'),
4343
complexFieldValues : attr(),
44+
language_form_1 : attr('string'),
45+
language_form_2 : attr('string'),
4446
home_wiki : attr('string'),
4547

4648
/**

app/models/custom-form.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,9 @@ export default ModelBase.extend({
107107
acceptVideoRecording : tn.t('Photo & video & text consent'),
108108
acceptShareDetails : tn.t('Partner contact consent'),
109109
ageGroup : tn.t('Age Group'),
110-
homeWiki : tn.t('What is your home wiki')
110+
homeWiki : tn.t('What is your home wiki'),
111+
languageForm1 : tn.t('What is your native language, or what language are you most fluent in?'),
112+
languageForm2 : tn.t('Are you fluent in any other of the following languages?')
111113
},
112114

113115
ready() {

app/templates/components/forms/orders/attendee-list.hbs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,17 @@
5252
{{else if (eq field.type 'select')}}
5353
<span class="word-break">{{get holder field.identifierPath}}</span>
5454
{{else if (eq field.type 'checkbox')}}
55-
<span class="word-break">
56-
{{#if (get holder field.identifierPath)}}
57-
{{t 'Yes'}}
58-
{{else}}
59-
{{t 'No'}}
60-
{{/if}}
61-
</span>
55+
{{#if (or (eq field.fieldIdentifier "language_form_1") (eq field.fieldIdentifier "language_form_2"))}}
56+
<span class="word-break">{{get holder field.identifierPath}}</span>
57+
{{else}}
58+
<span class="word-break">
59+
{{#if (get holder field.identifierPath)}}
60+
{{t 'Yes'}}
61+
{{else}}
62+
{{t 'No'}}
63+
{{/if}}
64+
</span>
65+
{{/if}}
6266
{{else}}
6367
{{#if (not field.isComplex)}}
6468
<span class="word-break">{{sanitize (get holder field.identifierPath)}}</span>

app/templates/components/forms/orders/order-form.hbs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,14 @@
236236
</div>
237237
</UiDropdown>
238238
{{/if}}
239+
{{#if (or (eq field.fieldIdentifier "language_form_1") (eq field.fieldIdentifier "language_form_2"))}}
240+
<Widgets::Forms::UiCheckboxGroup
241+
@options={{languageForms}}
242+
@onChange={{action "updateLanguageFormsSelection"}}
243+
@holder={{holder}}
244+
@field={{field}}
245+
/>
246+
{{/if}}
239247
</div>
240248
{{/if}}
241249
{{/if}}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<div class="{{@class}}" ...attributes>
2+
{{#if @label}}
3+
<label>{{@label}}</label>
4+
{{/if}}
5+
{{#each this.options as |op|}}
6+
<div class="menu">
7+
<UiCheckbox
8+
@value={{op.value}}
9+
@name={{this.name}}
10+
@type={{this.type}}
11+
@onChange={{action 'childOnChange'}}
12+
@checked={{op.checked}}/>
13+
{{op.label}}
14+
</div>
15+
{{/each}}
16+
</div>
17+

0 commit comments

Comments
 (0)