Skip to content

Commit

Permalink
feat(orga): add action column in organization-participants route
Browse files Browse the repository at this point in the history
Co-authored-by: Yannick François <[email protected]>
Co-authored-by: Aurelie Crouillebois <[email protected]>
  • Loading branch information
3 people committed Oct 24, 2024
1 parent 5c6896e commit 844da92
Show file tree
Hide file tree
Showing 12 changed files with 119 additions and 28 deletions.
10 changes: 10 additions & 0 deletions orga/app/adapters/organization-participant.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ export default class OrganizationParticipantAdapter extends ApplicationAdapter {
return `${this.host}/${this.namespace}/organizations/${organizationId}/participants`;
}

addOralizationFeatureForParticipant(learnerId, organizationId) {
const url = `${this.host}/${this.namespace}/organizations/${organizationId}/organization-learners/${learnerId}/features/ORALIZATION`;
return this.ajax(url, 'POST');
}

removeOralizationFeatureForParticipant(learnerId, organizationId) {
const url = `${this.host}/${this.namespace}/organizations/${organizationId}/organization-learners/${learnerId}/features/ORALIZATION`;
return this.ajax(url, 'DELETE');
}

deleteParticipants(organizationId, ids) {
const url = `${this.host}/${this.namespace}/organizations/${organizationId}/organization-learners`;
return this.ajax(url, 'DELETE', { data: { listLearners: ids } });
Expand Down
40 changes: 28 additions & 12 deletions orga/app/components/organization-participant/list.gjs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ export default class List extends Component {
@tracked showDeletionModal = false;

@service currentUser;
@service intl;

get isAdminInOrganization () {
return !!this.currentUser.isAdminInOrganization
get isAdminInOrganization() {
return !!this.currentUser.isAdminInOrganization;
}

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

get hasActionColumn() {
return this.currentUser.canActivateOralizationLearner;
}

@action
openDeletionModal() {
this.showDeletionModal = true;
Expand Down Expand Up @@ -90,9 +95,26 @@ export default class List extends Component {
}

@action
openEditStudentNumberModal() {
window.alert('wesh');
actionsForParticipant(participant) {
if (!this.currentUser.canActivateOralizationLearner) {
return [];
}
const oralizationActivated = participant.extraColumns['ORALIZATION'];
return [
{
label: oralizationActivated
? this.intl.t('pages.organization-participants.table.actions.disable-oralization')
: this.intl.t('pages.organization-participants.table.actions.enable-oralization'),
onClick: () =>
this.args.toggleOralizationFeatureForParticipant(
participant.id,
this.currentUser.organization.id,
!oralizationActivated,
),
},
];
}

<template>
<div id={{this.filtersId}} />

Expand All @@ -104,18 +126,13 @@ export default class List extends Component {
<tbody>
<SelectableList @items={{@participants}}>
<:manager as |allSelected someSelected toggleAll selectedParticipants reset|>
{{log "allSelected" allSelected}}
{{log "someSelected" someSelected}}
{{log "toggleAll" toggleAll}}
{{log "selectedParticipants" selectedParticipants}}
{{log "reset" reset}}
<InElement @destinationId={{this.headerId}}>
<TableHeaders
@allSelected={{allSelected}}
@someSelected={{someSelected}}
@showCheckbox={{this.showCheckbox}}
@hasParticipants={{this.hasParticipants}}
@isAdminInOrganization={{this.isAdminInOrganization}}
@hasActionColumn={{this.hasActionColumn}}
@onToggleAll={{toggleAll}}
@lastnameSort={{@lastnameSort}}
@customHeadings={{this.customColumns}}
Expand Down Expand Up @@ -194,8 +211,7 @@ export default class List extends Component {
@customRows={{this.customColumns}}
@hideCertifiableDate={{@hasComputeOrganizationLearnerCertificabilityEnabled}}
@hasOrganizationParticipantPage={{@hasOrganizationParticipantPage}}
@isAdminInOrganization={{this.isAdminInOrganization}}
@openEditStudentNumberModal={{this.openEditStudentNumberModal}}
@actionsForParticipant={{this.actionsForParticipant participant}}
/>
</:item>
</SelectableList>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,11 @@ export default class TableHeaders extends Component {
</Header>
{{/unless}}

{{#if @isAdminInOrganization}}
<Header @size="small" class="table__column--last-col">
{{#if @hasActionColumn}}
<Header @size="small" class="table__column--last-col">
{{t "common.actions.global"}}
</Header>
{{/if}}
</tr>
</tr>
</template>
}
20 changes: 11 additions & 9 deletions orga/app/components/organization-participant/table-row.gjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import { service } from '@ember/service';
import Component from '@glimmer/component';
import dayjs from 'dayjs';
import { t } from 'ember-intl';
import Dropdown from '../dropdown/icon-trigger'
import DropdownItemp from '../dropdown/item.hbs'
import { gt } from 'ember-truth-helpers';

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

export default class TableRow extends Component {
@service currentUser;
Expand Down Expand Up @@ -115,17 +115,19 @@ export default class TableRow extends Component {
</td>
{{/unless}}

{{#if @isAdminInOrganization}}
<Dropdown
{{#if (gt @actionsForParticipant.length 0)}}
<DropdownIconTrigger
@icon="ellipsis-vertical"
@dropdownButtonClass="organization-participant-list-page__dropdown-button"
@dropdownContentClass="organization-participant-list-page__dropdown-content"
@ariaLabel={{t "pages.sup-organization-participants.actions.show-actions"}}
>
<DropdownItemp @onClick={{fn @openEditStudentNumberModal @participant}}>
{{t "pages.sup-organization-participants.actions.edit-student-number"}}
</DropdownItemp>
</Dropdown>
{{#each @actionsForParticipant as |actionForPartipant|}}
<DropdownItem @onClick={{actionForPartipant.onClick}}>
{{actionForPartipant.label}}
</DropdownItem>
{{/each}}
</DropdownIconTrigger>
{{/if}}
</tr>
</template>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,19 @@ export default class ListController extends Controller {
}
}

@action
async toggleOralizationFeatureForParticipant(participantId, organizationId, toActivate) {
if (toActivate) {
await this.store
.adapterFor('organization-participant')
.addOralizationFeatureForParticipant(participantId, organizationId);
} else {
await this.store
.adapterFor('organization-participant')
.removeOralizationFeatureForParticipant(participantId, organizationId);
}
}

@action
async deleteOrganizationLearners(listLearners) {
try {
Expand Down
5 changes: 5 additions & 0 deletions orga/app/models/prescriber.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export default class Prescriber extends Model {
PLACES_MANAGEMENT: 'PLACES_MANAGEMENT',
MISSIONS_MANAGEMENT: 'MISSIONS_MANAGEMENT',
LEARNER_IMPORT: 'LEARNER_IMPORT',
ORALIZATION: 'ORALIZATION',
};
}
get fullName() {
Expand Down Expand Up @@ -58,6 +59,10 @@ export default class Prescriber extends Model {
return this.features[Prescriber.featureList.LEARNER_IMPORT];
}

get hasOralizationFeature() {
return this.features[Prescriber.featureList.ORALIZATION];
}

get hasParticipants() {
return Boolean(this.participantCount);
}
Expand Down
4 changes: 4 additions & 0 deletions orga/app/services/current-user.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,8 @@ export default class CurrentUserService extends Service {
get hasLearnerImportFeature() {
return this.prescriber.hasOrganizationLearnerImport;
}

get canActivateOralizationLearner() {
return this.prescriber.hasOralizationFeature;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
@deleteParticipants={{this.deleteOrganizationLearners}}
@hasComputeOrganizationLearnerCertificabilityEnabled={{this.hasComputeOrganizationLearnerCertificabilityEnabled}}
@hasOrganizationParticipantPage={{this.hasOrganizationParticipantPage}}
@toggleOralizationFeatureForParticipant={{this.toggleOralizationFeatureForParticipant}}
/>
{{else}}
<OrganizationParticipant::NoParticipantPanel />
Expand Down
28 changes: 28 additions & 0 deletions orga/tests/unit/adapters/organization-participant-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,32 @@ module('Unit | Adapters | organization-participant', function (hooks) {
assert.ok(ajaxStub.calledWithExactly(url, 'DELETE', { data: expectedData }));
});
});
module('#addOralizationFeatureForParticipant', () => {
test('should POST organization-learners/feature', async function (assert) {
// given
const organizationId = 1;
const learnerId = 1;
// when
adapter.addOralizationFeatureForParticipant(learnerId, organizationId);

// then
const url = `${ENV.APP.API_HOST}/api/organizations/${organizationId}/organization-learners/${learnerId}/features/ORALIZATION`;

assert.ok(ajaxStub.calledWithExactly(url, 'POST'));
});
});
module('#removeOralizationFeatureForParticipant', () => {
test('should DELETE organization-learners/feature', async function (assert) {
// given
const organizationId = 1;
const learnerId = 1;
// when
adapter.removeOralizationFeatureForParticipant(learnerId, organizationId);

// then
const url = `${ENV.APP.API_HOST}/api/organizations/${organizationId}/organization-learners/${learnerId}/features/ORALIZATION`;

assert.ok(ajaxStub.calledWithExactly(url, 'DELETE'));
});
});
});
4 changes: 4 additions & 0 deletions orga/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1077,6 +1077,10 @@
},
"page-title": "Participants",
"table": {
"actions": {
"disable-oralization": "Deactivate oralization",
"enable-oralization": "Activate oralization"
},
"column": {
"checkbox": "Select/Unselect {firstname} {lastname}",
"first-name": "First name",
Expand Down
4 changes: 4 additions & 0 deletions orga/translations/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -1083,6 +1083,10 @@
},
"page-title": "Participants",
"table": {
"actions": {
"disable-oralization": "Désactiver la lecture de consigne",
"enable-oralization": "Activer la lecture de consigne"
},
"column": {
"checkbox": "Sélectionner/Désélectionner {firstname} {lastname}",
"first-name": "Prénom",
Expand Down
12 changes: 8 additions & 4 deletions orga/translations/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -1131,6 +1131,9 @@
},
"page-title": "Deelnemers",
"table": {
"description": "Tabel met deelnemers gesorteerd op naam.",
"empty": "Geen deelnemers",
"row-title": "Deelnemer",
"column": {
"checkbox": "Selecteren/Deselecteren {firstname} {lastname}",
"first-name": "Voornaam",
Expand All @@ -1157,15 +1160,16 @@
"label": "Aantal deelnames"
}
},
"actions": {
"enable-oralization": "Activate oralization",
"disable-oralization": "Deactivate oralization"
},
"row-value": {
"oralization": {
"true": "Geactiveerd",
"false": "Gedeactiveerd"
}
},
"description": "Tabel met deelnemers gesorteerd op naam.",
"empty": "Geen deelnemers",
"row-title": "Deelnemer"
}
}
},
"participants-list": {
Expand Down

0 comments on commit 844da92

Please sign in to comment.