Skip to content

Commit 844da92

Browse files
rouxxiyafaurelie-crouillebois
committed
feat(orga): add action column in organization-participants route
Co-authored-by: Yannick François <[email protected]> Co-authored-by: Aurelie Crouillebois <[email protected]>
1 parent 5c6896e commit 844da92

File tree

12 files changed

+119
-28
lines changed

12 files changed

+119
-28
lines changed

orga/app/adapters/organization-participant.js

+10
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ export default class OrganizationParticipantAdapter extends ApplicationAdapter {
88
return `${this.host}/${this.namespace}/organizations/${organizationId}/participants`;
99
}
1010

11+
addOralizationFeatureForParticipant(learnerId, organizationId) {
12+
const url = `${this.host}/${this.namespace}/organizations/${organizationId}/organization-learners/${learnerId}/features/ORALIZATION`;
13+
return this.ajax(url, 'POST');
14+
}
15+
16+
removeOralizationFeatureForParticipant(learnerId, organizationId) {
17+
const url = `${this.host}/${this.namespace}/organizations/${organizationId}/organization-learners/${learnerId}/features/ORALIZATION`;
18+
return this.ajax(url, 'DELETE');
19+
}
20+
1121
deleteParticipants(organizationId, ids) {
1222
const url = `${this.host}/${this.namespace}/organizations/${organizationId}/organization-learners`;
1323
return this.ajax(url, 'DELETE', { data: { listLearners: ids } });

orga/app/components/organization-participant/list.gjs

+28-12
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ export default class List extends Component {
1919
@tracked showDeletionModal = false;
2020

2121
@service currentUser;
22+
@service intl;
2223

23-
get isAdminInOrganization () {
24-
return !!this.currentUser.isAdminInOrganization
24+
get isAdminInOrganization() {
25+
return !!this.currentUser.isAdminInOrganization;
2526
}
2627

2728
get showCheckbox() {
@@ -60,6 +61,10 @@ export default class List extends Component {
6061
return this.args.participants.meta.customFilters;
6162
}
6263

64+
get hasActionColumn() {
65+
return this.currentUser.canActivateOralizationLearner;
66+
}
67+
6368
@action
6469
openDeletionModal() {
6570
this.showDeletionModal = true;
@@ -90,9 +95,26 @@ export default class List extends Component {
9095
}
9196

9297
@action
93-
openEditStudentNumberModal() {
94-
window.alert('wesh');
98+
actionsForParticipant(participant) {
99+
if (!this.currentUser.canActivateOralizationLearner) {
100+
return [];
101+
}
102+
const oralizationActivated = participant.extraColumns['ORALIZATION'];
103+
return [
104+
{
105+
label: oralizationActivated
106+
? this.intl.t('pages.organization-participants.table.actions.disable-oralization')
107+
: this.intl.t('pages.organization-participants.table.actions.enable-oralization'),
108+
onClick: () =>
109+
this.args.toggleOralizationFeatureForParticipant(
110+
participant.id,
111+
this.currentUser.organization.id,
112+
!oralizationActivated,
113+
),
114+
},
115+
];
95116
}
117+
96118
<template>
97119
<div id={{this.filtersId}} />
98120

@@ -104,18 +126,13 @@ export default class List extends Component {
104126
<tbody>
105127
<SelectableList @items={{@participants}}>
106128
<:manager as |allSelected someSelected toggleAll selectedParticipants reset|>
107-
{{log "allSelected" allSelected}}
108-
{{log "someSelected" someSelected}}
109-
{{log "toggleAll" toggleAll}}
110-
{{log "selectedParticipants" selectedParticipants}}
111-
{{log "reset" reset}}
112129
<InElement @destinationId={{this.headerId}}>
113130
<TableHeaders
114131
@allSelected={{allSelected}}
115132
@someSelected={{someSelected}}
116133
@showCheckbox={{this.showCheckbox}}
117134
@hasParticipants={{this.hasParticipants}}
118-
@isAdminInOrganization={{this.isAdminInOrganization}}
135+
@hasActionColumn={{this.hasActionColumn}}
119136
@onToggleAll={{toggleAll}}
120137
@lastnameSort={{@lastnameSort}}
121138
@customHeadings={{this.customColumns}}
@@ -194,8 +211,7 @@ export default class List extends Component {
194211
@customRows={{this.customColumns}}
195212
@hideCertifiableDate={{@hasComputeOrganizationLearnerCertificabilityEnabled}}
196213
@hasOrganizationParticipantPage={{@hasOrganizationParticipantPage}}
197-
@isAdminInOrganization={{this.isAdminInOrganization}}
198-
@openEditStudentNumberModal={{this.openEditStudentNumberModal}}
214+
@actionsForParticipant={{this.actionsForParticipant participant}}
199215
/>
200216
</:item>
201217
</SelectableList>

orga/app/components/organization-participant/table-headers.gjs

+3-3
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,11 @@ export default class TableHeaders extends Component {
7878
</Header>
7979
{{/unless}}
8080

81-
{{#if @isAdminInOrganization}}
82-
<Header @size="small" class="table__column--last-col">
81+
{{#if @hasActionColumn}}
82+
<Header @size="small" class="table__column--last-col">
8383
{{t "common.actions.global"}}
8484
</Header>
8585
{{/if}}
86-
</tr>
86+
</tr>
8787
</template>
8888
}

orga/app/components/organization-participant/table-row.gjs

+11-9
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ import { service } from '@ember/service';
55
import Component from '@glimmer/component';
66
import dayjs from 'dayjs';
77
import { t } from 'ember-intl';
8-
import Dropdown from '../dropdown/icon-trigger'
9-
import DropdownItemp from '../dropdown/item.hbs'
8+
import { gt } from 'ember-truth-helpers';
109

1110
import CertificabilityCell from '../certificability/cell';
11+
import DropdownIconTrigger from '../dropdown/icon-trigger';
12+
import DropdownItem from '../dropdown/item';
1213
import LastParticipationDateTooltip from '../ui/last-participation-date-tooltip';
13-
import { fn } from "@ember/helper";
1414

1515
export default class TableRow extends Component {
1616
@service currentUser;
@@ -115,17 +115,19 @@ export default class TableRow extends Component {
115115
</td>
116116
{{/unless}}
117117

118-
{{#if @isAdminInOrganization}}
119-
<Dropdown
118+
{{#if (gt @actionsForParticipant.length 0)}}
119+
<DropdownIconTrigger
120120
@icon="ellipsis-vertical"
121121
@dropdownButtonClass="organization-participant-list-page__dropdown-button"
122122
@dropdownContentClass="organization-participant-list-page__dropdown-content"
123123
@ariaLabel={{t "pages.sup-organization-participants.actions.show-actions"}}
124124
>
125-
<DropdownItemp @onClick={{fn @openEditStudentNumberModal @participant}}>
126-
{{t "pages.sup-organization-participants.actions.edit-student-number"}}
127-
</DropdownItemp>
128-
</Dropdown>
125+
{{#each @actionsForParticipant as |actionForPartipant|}}
126+
<DropdownItem @onClick={{actionForPartipant.onClick}}>
127+
{{actionForPartipant.label}}
128+
</DropdownItem>
129+
{{/each}}
130+
</DropdownIconTrigger>
129131
{{/if}}
130132
</tr>
131133
</template>

orga/app/controllers/authenticated/organization-participants/list.js

+13
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,19 @@ export default class ListController extends Controller {
8686
}
8787
}
8888

89+
@action
90+
async toggleOralizationFeatureForParticipant(participantId, organizationId, toActivate) {
91+
if (toActivate) {
92+
await this.store
93+
.adapterFor('organization-participant')
94+
.addOralizationFeatureForParticipant(participantId, organizationId);
95+
} else {
96+
await this.store
97+
.adapterFor('organization-participant')
98+
.removeOralizationFeatureForParticipant(participantId, organizationId);
99+
}
100+
}
101+
89102
@action
90103
async deleteOrganizationLearners(listLearners) {
91104
try {

orga/app/models/prescriber.js

+5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export default class Prescriber extends Model {
1818
PLACES_MANAGEMENT: 'PLACES_MANAGEMENT',
1919
MISSIONS_MANAGEMENT: 'MISSIONS_MANAGEMENT',
2020
LEARNER_IMPORT: 'LEARNER_IMPORT',
21+
ORALIZATION: 'ORALIZATION',
2122
};
2223
}
2324
get fullName() {
@@ -58,6 +59,10 @@ export default class Prescriber extends Model {
5859
return this.features[Prescriber.featureList.LEARNER_IMPORT];
5960
}
6061

62+
get hasOralizationFeature() {
63+
return this.features[Prescriber.featureList.ORALIZATION];
64+
}
65+
6166
get hasParticipants() {
6267
return Boolean(this.participantCount);
6368
}

orga/app/services/current-user.js

+4
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,8 @@ export default class CurrentUserService extends Service {
9191
get hasLearnerImportFeature() {
9292
return this.prescriber.hasOrganizationLearnerImport;
9393
}
94+
95+
get canActivateOralizationLearner() {
96+
return this.prescriber.hasOralizationFeature;
97+
}
9498
}

orga/app/templates/authenticated/organization-participants/list.hbs

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
@deleteParticipants={{this.deleteOrganizationLearners}}
2222
@hasComputeOrganizationLearnerCertificabilityEnabled={{this.hasComputeOrganizationLearnerCertificabilityEnabled}}
2323
@hasOrganizationParticipantPage={{this.hasOrganizationParticipantPage}}
24+
@toggleOralizationFeatureForParticipant={{this.toggleOralizationFeatureForParticipant}}
2425
/>
2526
{{else}}
2627
<OrganizationParticipant::NoParticipantPanel />

orga/tests/unit/adapters/organization-participant-test.js

+28
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,32 @@ module('Unit | Adapters | organization-participant', function (hooks) {
4343
assert.ok(ajaxStub.calledWithExactly(url, 'DELETE', { data: expectedData }));
4444
});
4545
});
46+
module('#addOralizationFeatureForParticipant', () => {
47+
test('should POST organization-learners/feature', async function (assert) {
48+
// given
49+
const organizationId = 1;
50+
const learnerId = 1;
51+
// when
52+
adapter.addOralizationFeatureForParticipant(learnerId, organizationId);
53+
54+
// then
55+
const url = `${ENV.APP.API_HOST}/api/organizations/${organizationId}/organization-learners/${learnerId}/features/ORALIZATION`;
56+
57+
assert.ok(ajaxStub.calledWithExactly(url, 'POST'));
58+
});
59+
});
60+
module('#removeOralizationFeatureForParticipant', () => {
61+
test('should DELETE organization-learners/feature', async function (assert) {
62+
// given
63+
const organizationId = 1;
64+
const learnerId = 1;
65+
// when
66+
adapter.removeOralizationFeatureForParticipant(learnerId, organizationId);
67+
68+
// then
69+
const url = `${ENV.APP.API_HOST}/api/organizations/${organizationId}/organization-learners/${learnerId}/features/ORALIZATION`;
70+
71+
assert.ok(ajaxStub.calledWithExactly(url, 'DELETE'));
72+
});
73+
});
4674
});

orga/translations/en.json

+4
Original file line numberDiff line numberDiff line change
@@ -1077,6 +1077,10 @@
10771077
},
10781078
"page-title": "Participants",
10791079
"table": {
1080+
"actions": {
1081+
"disable-oralization": "Deactivate oralization",
1082+
"enable-oralization": "Activate oralization"
1083+
},
10801084
"column": {
10811085
"checkbox": "Select/Unselect {firstname} {lastname}",
10821086
"first-name": "First name",

orga/translations/fr.json

+4
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,10 @@
10831083
},
10841084
"page-title": "Participants",
10851085
"table": {
1086+
"actions": {
1087+
"disable-oralization": "Désactiver la lecture de consigne",
1088+
"enable-oralization": "Activer la lecture de consigne"
1089+
},
10861090
"column": {
10871091
"checkbox": "Sélectionner/Désélectionner {firstname} {lastname}",
10881092
"first-name": "Prénom",

orga/translations/nl.json

+8-4
Original file line numberDiff line numberDiff line change
@@ -1131,6 +1131,9 @@
11311131
},
11321132
"page-title": "Deelnemers",
11331133
"table": {
1134+
"description": "Tabel met deelnemers gesorteerd op naam.",
1135+
"empty": "Geen deelnemers",
1136+
"row-title": "Deelnemer",
11341137
"column": {
11351138
"checkbox": "Selecteren/Deselecteren {firstname} {lastname}",
11361139
"first-name": "Voornaam",
@@ -1157,15 +1160,16 @@
11571160
"label": "Aantal deelnames"
11581161
}
11591162
},
1163+
"actions": {
1164+
"enable-oralization": "Activate oralization",
1165+
"disable-oralization": "Deactivate oralization"
1166+
},
11601167
"row-value": {
11611168
"oralization": {
11621169
"true": "Geactiveerd",
11631170
"false": "Gedeactiveerd"
11641171
}
1165-
},
1166-
"description": "Tabel met deelnemers gesorteerd op naam.",
1167-
"empty": "Geen deelnemers",
1168-
"row-title": "Deelnemer"
1172+
}
11691173
}
11701174
},
11711175
"participants-list": {

0 commit comments

Comments
 (0)