From eca7c42865bde962e88a4ccbaa64e799cc31a8a7 Mon Sep 17 00:00:00 2001 From: AndreiaPena Date: Wed, 5 Mar 2025 16:47:56 +0100 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=94=A5=20certif:=20remove=20useless?= =?UTF-8?q?=20css=20for=20table?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- certif/app/styles/globals/tables.scss | 57 --------------------------- 1 file changed, 57 deletions(-) diff --git a/certif/app/styles/globals/tables.scss b/certif/app/styles/globals/tables.scss index 9edf9252dfb..7b4d95f0776 100644 --- a/certif/app/styles/globals/tables.scss +++ b/certif/app/styles/globals/tables.scss @@ -2,16 +2,6 @@ @use 'pix-design-tokens/typography'; .table { - width: 100%; - padding: var(--pix-spacing-2x); - overflow: auto; - - @extend %pix-body-s; - - @include breakpoints.device-is('tablet') { - overflow: initial; - } - &__column { width: 16%; @@ -22,53 +12,6 @@ text-align: start; } } - - &--medium { - width: 12%; - - td, th { - padding: var(--pix-spacing-2x); - } - } - - &--wide { - width: 25%; - - td, th { - padding: var(--pix-spacing-4x) var(--pix-spacing-2x); - } - } - } - - table { - min-width: 100%; - border-collapse: collapse; - - th, td { - padding: var(--pix-spacing-4x) var(--pix-spacing-2x); - text-align: start; - } - - tr > td:first-child, tr > th:first-child { - padding-left: var(--pix-spacing-4x); - } - - tbody { - tr:hover, - tr:focus, - tr:focus-within, - tr:active { - background-color: var(--pix-neutral-20); - } - - tr:first-child { - border-top: 2px solid var(--pix-neutral-20); - } - - tr:not(:last-child) { - border-bottom: 2px solid var(--pix-neutral-20); - } - } } &__empty { From a12d9ad9dc197f56d46f7b66838914d0ae1668ee Mon Sep 17 00:00:00 2001 From: AndreiaPena Date: Wed, 5 Mar 2025 17:39:53 +0100 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=94=A5=20certif:=20remove=20border-bo?= =?UTF-8?q?ttom=20on=20candidates=20list?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sessions/details/certification-candidates.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/certif/app/styles/pages/authenticated/sessions/details/certification-candidates.scss b/certif/app/styles/pages/authenticated/sessions/details/certification-candidates.scss index b1a49c0331a..25cb479b800 100644 --- a/certif/app/styles/pages/authenticated/sessions/details/certification-candidates.scss +++ b/certif/app/styles/pages/authenticated/sessions/details/certification-candidates.scss @@ -96,8 +96,7 @@ .panel-header { display: flex; padding-bottom: var(--pix-spacing-6x); - margin: var(--pix-spacing-6x) 0; - border-bottom: 1px solid var(--pix-neutral-100); + margin: var(--pix-spacing-6x) 0 var(--pix-spacing-3x) 0; &__title { display: flex; From d4bd2a04037e8dae9661bc02a7d3211ebd0c468b Mon Sep 17 00:00:00 2001 From: AndreiaPena Date: Fri, 28 Feb 2025 17:38:35 +0100 Subject: [PATCH 3/5] =?UTF-8?q?=E2=9C=A8=20certif:=20use=20PixTable=20on?= =?UTF-8?q?=20team=20list?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- certif/app/components/members-list-item.hbs | 91 ---- certif/app/components/members-list-item.js | 92 ---- certif/app/components/members-list.hbs | 45 +- certif/app/components/members-list.js | 44 +- certif/app/components/members-table.gjs | 150 ++++++ .../team/modal/change-member-role-modal.gjs | 88 ++++ certif/app/styles/app.scss | 1 + .../team/change-member-role-modal.scss | 7 + .../authenticated/team/list/members-test.js | 11 +- .../tests/acceptance/team/list/list-test.js | 6 +- .../components/members-list-item-test.js | 335 ------------- .../components/members-list-test.js | 272 ++++------- .../components/members-table-test.gjs | 439 ++++++++++++++++++ .../unit/components/members-list-item-test.js | 76 --- .../unit/components/members-list-test.js | 100 ++-- .../unit/components/members-table-test.js | 75 +++ certif/translations/en.json | 24 +- certif/translations/fr.json | 24 +- 18 files changed, 1001 insertions(+), 879 deletions(-) delete mode 100644 certif/app/components/members-list-item.hbs delete mode 100644 certif/app/components/members-list-item.js create mode 100644 certif/app/components/members-table.gjs create mode 100644 certif/app/components/team/modal/change-member-role-modal.gjs create mode 100644 certif/app/styles/components/team/change-member-role-modal.scss delete mode 100644 certif/tests/integration/components/members-list-item-test.js create mode 100644 certif/tests/integration/components/members-table-test.gjs delete mode 100644 certif/tests/unit/components/members-list-item-test.js create mode 100644 certif/tests/unit/components/members-table-test.js diff --git a/certif/app/components/members-list-item.hbs b/certif/app/components/members-list-item.hbs deleted file mode 100644 index f6973d18aa3..00000000000 --- a/certif/app/components/members-list-item.hbs +++ /dev/null @@ -1,91 +0,0 @@ - - {{@member.lastName}} - {{@member.firstName}} - - {{#if this.isEditionMode}} - - <:label>{{t "pages.team.members.actions.select-role.label"}} - - {{else}} - {{@member.roleLabel}} - {{/if}} - - {{#if this.shouldDisplayManagingColumn}} - - {{#if this.shouldDisplayMemberManageButton}} - - {{#if this.shouldDisplayChangeRoleOption}} - - {{t "pages.team.members.actions.edit-role"}} - - - {{t "pages.team.members.actions.remove-membership"}} - - {{/if}} - {{#if this.shouldDisplayLeaveCertificationCenterOption}} - - {{t "pages.team.members.actions.leave-certification-center"}} - - {{/if}} - - {{/if}} - {{#if this.isEditionMode}} -
- - {{t "pages.team.members.actions.save"}} - - -
- {{/if}} - - {{/if}} - {{#if @shouldDisplayRefererColumn}} - - {{#if @member.isReferer}} -
- - {{t "pages.team.pix-referer"}} - - - <:triggerElement> - - - - - <:tooltip> - {{t "pages.team.pix-referer-tooltip"}} - - -
- {{/if}} - - {{/if}} - \ No newline at end of file diff --git a/certif/app/components/members-list-item.js b/certif/app/components/members-list-item.js deleted file mode 100644 index e9d35b5713e..00000000000 --- a/certif/app/components/members-list-item.js +++ /dev/null @@ -1,92 +0,0 @@ -import { action } from '@ember/object'; -import { service } from '@ember/service'; -import Component from '@glimmer/component'; -import { tracked } from '@glimmer/tracking'; - -const ARIA_LABEL_MEMBER_TRANSLATION = 'pages.team.members.actions.select-role.options.member'; -const ARIA_LABEL_ADMIN_TRANSLATION = 'pages.team.members.actions.select-role.options.admin'; - -export default class MembersListItem extends Component { - @service currentUser; - @service pixToast; - @service intl; - @tracked isEditionMode = false; - - roleOptions = [ - { - value: 'ADMIN', - label: this.intl.t(ARIA_LABEL_ADMIN_TRANSLATION), - disabled: false, - }, - { - value: 'MEMBER', - label: this.intl.t(ARIA_LABEL_MEMBER_TRANSLATION), - disabled: false, - }, - ]; - - displayRoleByOrganizationRole = { - ADMIN: this.intl.t(ARIA_LABEL_ADMIN_TRANSLATION), - MEMBER: this.intl.t(ARIA_LABEL_MEMBER_TRANSLATION), - }; - - get shouldDisplayManagingColumn() { - return this.currentUser.isAdminOfCurrentCertificationCenter; - } - - get shouldDisplayMemberManageButton() { - return this.shouldDisplayChangeRoleOption || this.shouldDisplayLeaveCertificationCenterOption; - } - - get shouldDisplayChangeRoleOption() { - if (this.isCurrentUserMembership) { - return false; - } - - if (!this.currentUser.isAdminOfCurrentCertificationCenter) { - return false; - } - - return !this.isEditionMode; - } - - get shouldDisplayLeaveCertificationCenterOption() { - return this.args.isMultipleAdminsAvailable && this.isCurrentUserMembership; - } - - get isCurrentUserMembership() { - return this.currentUser.certificationPointOfContact.id === this.args.member.id; - } - - @action - setRoleSelection(value) { - this.args.member.role = value; - } - - @action - toggleEditionMode() { - this.isEditionMode = true; - } - - @action - async updateMember(member) { - this.isEditionMode = false; - try { - await member.save(); - this.pixToast.sendSuccessNotification({ - message: this.intl.t('pages.team.members.notifications.change-member-role.success'), - }); - } catch (e) { - member.rollbackAttributes(); - this.pixToast.sendErrorNotification({ - message: this.intl.t('pages.team.members.notifications.change-member-role.error'), - }); - } - } - - @action - cancelUpdateRoleOfMember() { - this.isEditionMode = false; - this.args.member.rollbackAttributes(); - } -} diff --git a/certif/app/components/members-list.hbs b/certif/app/components/members-list.hbs index ff7e4a36b3f..a28d155d4ef 100644 --- a/certif/app/components/members-list.hbs +++ b/certif/app/components/members-list.hbs @@ -1,34 +1,11 @@
-
-
- - - - {{t "common.labels.candidate.lastname"}} - {{t "common.labels.candidate.firstname"}} - {{t "common.labels.candidate.role"}} - {{#if this.shouldDisplayManagingColumn}} - {{t "pages.team.table-headers.actions"}} - {{/if}} - {{#if this.shouldDisplayRefererColumn}} - {{t "pages.team.referer"}} - {{/if}} - - - - {{#each @members as |member|}} - - {{/each}} - -
-
-
+
+ + + \ No newline at end of file diff --git a/certif/app/components/members-list.js b/certif/app/components/members-list.js index d39da0d1d4a..6c291ab76e7 100644 --- a/certif/app/components/members-list.js +++ b/certif/app/components/members-list.js @@ -11,20 +11,9 @@ export default class MembersList extends Component { @tracked isLeaveCertificationCenterModalOpen = false; @tracked isRemoveMemberModalOpen = false; + @tracked isChangeMemberRoleModalOpen = false; @tracked removingMember; - - get shouldDisplayRefererColumn() { - return this.args.hasCleaHabilitation; - } - - get shouldDisplayManagingColumn() { - return this.currentUser.isAdminOfCurrentCertificationCenter; - } - - get isMultipleAdminsAvailable() { - const adminMembers = this.args.members?.filter((member) => member.isAdmin); - return adminMembers.length > 1; - } + @tracked member; @action openLeaveCertificationCenterModal() { @@ -37,6 +26,12 @@ export default class MembersList extends Component { this.isRemoveMemberModalOpen = true; } + @action + openChangeMemberRoleModal(member) { + this.member = member; + this.isChangeMemberRoleModalOpen = true; + } + @action closeLeaveCertificationCenterModal() { this.isLeaveCertificationCenterModalOpen = false; @@ -48,6 +43,11 @@ export default class MembersList extends Component { this.removingMember = undefined; } + @action + closeChangeMemberRoleModal() { + this.isChangeMemberRoleModalOpen = false; + } + @action async leaveCertificationCenter() { try { @@ -86,4 +86,22 @@ export default class MembersList extends Component { this.closeRemoveMemberModal(); } } + + @action + async changeMemberRole(role) { + try { + this.member.role = role; + await this.member.save(); + this.pixToast.sendSuccessNotification({ + message: this.intl.t('pages.team.members.notifications.change-member-role.success'), + }); + this.isChangeMemberRoleModalOpen = false; + } catch (_) { + this.member.rollbackAttributes(); + this.pixToast.sendErrorNotification({ + message: this.intl.t('pages.team.members.notifications.change-member-role.error'), + }); + this.isChangeMemberRoleModalOpen = false; + } + } } diff --git a/certif/app/components/members-table.gjs b/certif/app/components/members-table.gjs new file mode 100644 index 00000000000..ba1d19ee07c --- /dev/null +++ b/certif/app/components/members-table.gjs @@ -0,0 +1,150 @@ +import PixIcon from '@1024pix/pix-ui/components/pix-icon'; +import PixIconButton from '@1024pix/pix-ui/components/pix-icon-button'; +import PixTable from '@1024pix/pix-ui/components/pix-table'; +import PixTableColumn from '@1024pix/pix-ui/components/pix-table-column'; +import PixTag from '@1024pix/pix-ui/components/pix-tag'; +import PixTooltip from '@1024pix/pix-ui/components/pix-tooltip'; +import { fn } from '@ember/helper'; +import { service } from '@ember/service'; +import Component from '@glimmer/component'; +import { t } from 'ember-intl'; +import { and, eq, notEq } from 'ember-truth-helpers'; + +export default class MembersTable extends Component { + @service currentUser; + @service pixToast; + @service intl; + + get isMultipleAdminsAvailable() { + const adminMembers = this.args.members.filter((member) => member.isAdmin); + return adminMembers.length > 1; + } + + get shouldDisplayManagingColumn() { + return this.currentUser.isAdminOfCurrentCertificationCenter && this.args.members.length > 1; + } + + get shouldDisplayRefererColumn() { + return this.args.hasCleaHabilitation; + } + + +} diff --git a/certif/app/components/team/modal/change-member-role-modal.gjs b/certif/app/components/team/modal/change-member-role-modal.gjs new file mode 100644 index 00000000000..9e8125e16df --- /dev/null +++ b/certif/app/components/team/modal/change-member-role-modal.gjs @@ -0,0 +1,88 @@ +import PixButton from '@1024pix/pix-ui/components/pix-button'; +import PixModal from '@1024pix/pix-ui/components/pix-modal'; +import PixSelect from '@1024pix/pix-ui/components/pix-select'; +import { fn } from '@ember/helper'; +import { action } from '@ember/object'; +import { service } from '@ember/service'; +import Component from '@glimmer/component'; +import { tracked } from '@glimmer/tracking'; +import { t } from 'ember-intl'; +import { or } from 'ember-truth-helpers'; + +const ARIA_LABEL_MEMBER_TRANSLATION = 'pages.team.members.modals.change-member-role.select-role.options.member'; +const ARIA_LABEL_ADMIN_TRANSLATION = 'pages.team.members.modals.change-member-role.select-role.options.admin'; + +export default class ChangeMemberRoleModal extends Component { + @service intl; + @tracked role = null; + + roleOptions = [ + { + value: 'ADMIN', + label: this.intl.t(ARIA_LABEL_ADMIN_TRANSLATION), + disabled: false, + }, + { + value: 'MEMBER', + label: this.intl.t(ARIA_LABEL_MEMBER_TRANSLATION), + disabled: false, + }, + ]; + + displayRoleByOrganizationRole = { + ADMIN: this.intl.t(ARIA_LABEL_ADMIN_TRANSLATION), + MEMBER: this.intl.t(ARIA_LABEL_MEMBER_TRANSLATION), + }; + + @action + setRoleSelection(value) { + this.role = value; + } + + @action + closeModal() { + this.role = null; + this.args.onClose(); + } + + +} diff --git a/certif/app/styles/app.scss b/certif/app/styles/app.scss index a662afa1981..bce48be8486 100644 --- a/certif/app/styles/app.scss +++ b/certif/app/styles/app.scss @@ -51,6 +51,7 @@ @use 'components/session-supervising/handle-live-alert-modal' as *; @use 'components/session-supervising/live-alert-handled-modal' as *; @use 'components/team/invitations-list' as *; +@use 'components/team/change-member-role-modal' as *; @use 'components/dropdown' as *; @use 'flatpickr' as *; diff --git a/certif/app/styles/components/team/change-member-role-modal.scss b/certif/app/styles/components/team/change-member-role-modal.scss new file mode 100644 index 00000000000..eec53cbaaed --- /dev/null +++ b/certif/app/styles/components/team/change-member-role-modal.scss @@ -0,0 +1,7 @@ +.change-member-role-modal__select-role { + padding: var(--pix-spacing-4x) 0; + + button { + width: fit-content; + } +} diff --git a/certif/tests/acceptance/routes/authenticated/team/list/members-test.js b/certif/tests/acceptance/routes/authenticated/team/list/members-test.js index ad9055405c3..b7c3f48ea7a 100644 --- a/certif/tests/acceptance/routes/authenticated/team/list/members-test.js +++ b/certif/tests/acceptance/routes/authenticated/team/list/members-test.js @@ -44,11 +44,15 @@ module('Acceptance | Routes | Team | List | Members', function (hooks) { const screen = await visit(`/equipe/membres`); // when - await clickByName(t('pages.team.members.actions.manage')); await clickByName(t('pages.team.members.actions.edit-role')); - await clickByName(t('pages.team.members.actions.select-role.label')); + await screen.findByRole('dialog'); + await clickByName(t('pages.team.members.modals.change-member-role.select-role.label')); await screen.findByRole('listbox'); - await click(screen.getByRole('option', { name: t('pages.team.members.actions.select-role.options.admin') })); + await click( + screen.getByRole('option', { + name: t('pages.team.members.modals.change-member-role.select-role.options.admin'), + }), + ); await clickByName(t('pages.team.members.actions.save')); const rows = await screen.findAllByRole('row'); @@ -60,7 +64,6 @@ module('Acceptance | Routes | Team | List | Members', function (hooks) { test('deletes a member', async function (assert) { // given const screen = await visit('/equipe/membres'); - await clickByName(t('pages.team.members.actions.manage')); await clickByName(t('pages.team.members.actions.remove-membership')); await screen.findByRole('dialog'); diff --git a/certif/tests/acceptance/team/list/list-test.js b/certif/tests/acceptance/team/list/list-test.js index f1a9f6f5df1..d47a8cffc6c 100644 --- a/certif/tests/acceptance/team/list/list-test.js +++ b/certif/tests/acceptance/team/list/list-test.js @@ -257,8 +257,8 @@ module('Acceptance | authenticated | team', function (hooks) { const screen = await visitScreen('/equipe'); // then - const row = within(await screen.findByRole('row', { name: 'Membres du centre de certification' })); - const pixRefererCell = within(row.getByRole('cell', { name: 'Référent CléA Numérique' })); + const table = within(await screen.findByRole('table', { name: t('pages.team.table.caption') })); + const pixRefererCell = within(table.getByRole('cell', { name: 'Référent CléA Numérique' })); assert .dom( pixRefererCell.getByText( @@ -368,7 +368,6 @@ module('Acceptance | authenticated | team', function (hooks) { const screen = await visitScreen('/equipe'); - await click(screen.getAllByRole('button', { name: 'Gérer' })[0]); await clickByName('Quitter cet espace Pix Certif'); await waitForDialog(); @@ -402,7 +401,6 @@ module('Acceptance | authenticated | team', function (hooks) { const screen = await visitScreen('/equipe'); - await click(screen.getAllByRole('button', { name: 'Gérer' })[0]); await clickByName('Quitter cet espace Pix Certif'); await waitForDialog(); diff --git a/certif/tests/integration/components/members-list-item-test.js b/certif/tests/integration/components/members-list-item-test.js deleted file mode 100644 index eeb87504f1f..00000000000 --- a/certif/tests/integration/components/members-list-item-test.js +++ /dev/null @@ -1,335 +0,0 @@ -import { clickByName, render as renderScreen } from '@1024pix/ember-testing-library'; -import { click } from '@ember/test-helpers'; -import { hbs } from 'ember-cli-htmlbars'; -import { t } from 'ember-intl/test-support'; -import { module, test } from 'qunit'; -import sinon from 'sinon'; - -import setupIntlRenderingTest from '../../helpers/setup-intl-rendering'; - -module('Integration | Component | MembersListItem', function (hooks) { - setupIntlRenderingTest(hooks); - - let store; - let currentUser; - let openRemoveMemberModal; - - hooks.beforeEach(function () { - store = this.owner.lookup('service:store'); - currentUser = this.owner.lookup('service:current-user'); - openRemoveMemberModal = sinon.stub(); - this.set('openRemoveMemberModal', openRemoveMemberModal); - }); - - hooks.afterEach(function () { - sinon.restore(); - }); - - module('when current user has a member role', function (hooks) { - hooks.beforeEach(function () { - sinon.stub(currentUser, 'isAdminOfCurrentCertificationCenter').value(false); - }); - - module('when member has a member role', function () { - test('it shows member firstName, lastName and role', async function (assert) { - // given - const memberWithMemberRole = store.createRecord('member', { - firstName: 'John', - lastName: 'Williams', - role: 'MEMBER', - }); - - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithMemberRole.id }); - this.set('member', memberWithMemberRole); - - // when - const screen = await renderScreen(hbs``); - - // then - assert.dom(screen.getByRole('cell', { name: 'John' })).exists(); - assert.dom(screen.getByRole('cell', { name: 'Williams' })).exists(); - assert.dom(screen.getByRole('cell', { name: t('pages.team.members.role.member') })).exists(); - assert.dom(screen.queryByRole('button', { name: t('pages.team.members.role.member') })).doesNotExist(); - }); - }); - - module('when member has an admin role', function () { - test('it shows admin firstName, lastName and role', async function (assert) { - // given - const memberWithAdminRole = store.createRecord('member', { - firstName: 'Maria', - lastName: 'Carré', - role: 'ADMIN', - }); - - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithAdminRole.id }); - this.set('member', memberWithAdminRole); - - // when - const screen = await renderScreen(hbs``); - - // then - assert.dom(screen.getByRole('cell', { name: 'Maria' })).exists(); - assert.dom(screen.getByRole('cell', { name: 'Carré' })).exists(); - assert.dom(screen.getByRole('cell', { name: t('pages.team.members.role.admin') })).exists(); - assert.dom(screen.queryByRole('button', { name: t('pages.team.members.role.member') })).doesNotExist(); - }); - }); - }); - - module('when current user has an admin role', function (hooks) { - hooks.beforeEach(function () { - sinon.stub(currentUser, 'isAdminOfCurrentCertificationCenter').value(true); - }); - - module('when not in edit mode', function () { - module('when member is not the connected user', function () { - test('it shows member firstName, lastName, role and manage button', async function (assert) { - // given - const memberWithMemberRole = store.createRecord('member', { - id: '123', - firstName: 'John', - lastName: 'Williams', - role: 'MEMBER', - }); - - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: '1' }); - this.set('member', memberWithMemberRole); - - // when - const screen = await renderScreen(hbs``); - - // then - assert.dom(screen.getByRole('cell', { name: 'John' })).exists(); - assert.dom(screen.getByRole('cell', { name: 'Williams' })).exists(); - assert.dom(screen.getByRole('cell', { name: t('pages.team.members.role.member') })).exists(); - assert.dom(screen.getByRole('button', { name: t('pages.team.members.actions.manage') })).exists(); - }); - - module('when user clicks the manage button', function () { - test('it shows `edit role` and `delete` actions', async function (assert) { - // given - const memberWithMemberRole = store.createRecord('member', { - id: '123', - firstName: 'John', - lastName: 'Williams', - role: 'MEMBER', - }); - - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: '1' }); - this.set('member', memberWithMemberRole); - - const screen = await renderScreen( - hbs``, - ); - - // when - await clickByName(t('pages.team.members.actions.manage')); - - // then - assert.dom(screen.getByRole('button', { name: 'Modifier le rôle' })).exists(); - assert.dom(screen.getByRole('button', { name: 'Supprimer' })).exists(); - }); - }); - }); - - module('when member is the connected user', function () { - module('and is the only admin in the certification center', function () { - test('it shows member firstName, lastName, role but does not show manage button', async function (assert) { - // given - const memberWithMemberRole = store.createRecord('member', { - id: '123', - firstName: 'John', - lastName: 'Williams', - role: 'MEMBER', - }); - this.set('member', memberWithMemberRole); - this.set('isMultipleAdminsAvailable', false); - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithMemberRole.id }); - - // when - const screen = await renderScreen( - hbs``, - ); - - // then - assert.dom(screen.getByRole('cell', { name: 'John' })).exists(); - assert.dom(screen.getByRole('cell', { name: 'Williams' })).exists(); - assert.dom(screen.getByRole('cell', { name: t('pages.team.members.role.member') })).exists(); - assert.dom(screen.queryByRole('button', { name: t('pages.team.members.actions.manage') })).doesNotExist(); - }); - }); - - module('and is not the only admin in the certification center', function () { - test('shows manage button', async function (assert) { - // given - const memberWithAdminRole = store.createRecord('member', { - id: '123', - firstName: 'John', - lastName: 'Williams', - role: 'ADMIN', - }); - this.set('member', memberWithAdminRole); - this.set('isMultipleAdminsAvailable', true); - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithAdminRole.id }); - - // when - const screen = await renderScreen( - hbs``, - ); - - // then - assert.dom(screen.getByRole('button', { name: t('pages.team.members.actions.manage') })).exists(); - }); - - module('when clicking on manage button', function () { - test('displays a dropdown with one option to leave the current certification center', async function (assert) { - // given - const memberWithAdminRole = store.createRecord('member', { - id: '123', - firstName: 'John', - lastName: 'Williams', - role: 'ADMIN', - }); - this.set('member', memberWithAdminRole); - this.set('isMultipleAdminsAvailable', true); - this.set('leaveCertificationCenter', sinon.stub()); - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithAdminRole.id }); - - const screen = await renderScreen( - hbs``, - ); - - // when - await clickByName('Gérer'); - - // then - assert.dom(screen.getByRole('list')).exists(); - assert.strictEqual(screen.getAllByRole('listitem').length, 1); - assert.dom(screen.getByText('Quitter cet espace Pix Certif')).exists(); - }); - - module('when clicking on "Quitter cet espace Pix Certif"', function () { - test('calls the onLeaveCertificationCenterButtonClicked event handler', async function (assert) { - // given - const memberWithAdminRole = store.createRecord('member', { - id: '123', - firstName: 'John', - lastName: 'Williams', - role: 'ADMIN', - }); - const leaveCertificationCenter = sinon.stub(); - this.set('member', memberWithAdminRole); - this.set('isMultipleAdminsAvailable', true); - this.set('leaveCertificationCenter', leaveCertificationCenter); - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithAdminRole.id }); - - await renderScreen( - hbs``, - ); - - // when - await clickByName('Gérer'); - await clickByName('Quitter cet espace Pix Certif'); - - // then - assert.true(leaveCertificationCenter.calledOnce); - }); - }); - }); - }); - }); - }); - - module('when mode edition is enabled', function (hooks) { - hooks.beforeEach(function () { - const memberWithMemberRole = store.createRecord('member', { - id: '123', - firstName: 'John', - lastName: 'Williams', - role: 'MEMBER', - }); - - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: '1' }); - this.set('member', memberWithMemberRole); - }); - - test('it shows role selection menu, save button and cancel button', async function (assert) { - // given - // when - const screen = await renderScreen( - hbs``, - ); - await clickByName(t('pages.team.members.actions.manage')); - await clickByName(t('pages.team.members.actions.edit-role')); - - // then - assert.dom(screen.getByLabelText(t('pages.team.members.actions.select-role.label'))).exists(); - assert.dom(screen.getByRole('button', { name: t('pages.team.members.actions.save') })).exists(); - assert.dom(screen.getByRole('button', { name: t('common.actions.cancel') })).exists(); - assert.dom(screen.queryByRole('button', { name: t('pages.team.members.actions.manage') })).doesNotExist(); - assert - .dom( - screen.queryByRole('button', { - name: t('pages.team.members.actions.edit-role'), - }), - ) - .doesNotExist(); - }); - - module('when selecting a new role', function () { - test('it displays the selected role', async function (assert) { - // given - const screen = await renderScreen( - hbs``, - ); - await clickByName(t('pages.team.members.actions.manage')); - await clickByName(t('pages.team.members.actions.edit-role')); - - // when - await clickByName(t('pages.team.members.actions.select-role.label')); - await screen.findByRole('listbox'); - await click(screen.getByRole('option', { name: t('pages.team.members.actions.select-role.options.admin') })); - - // then - assert - .dom(screen.getByRole('button', { name: t('pages.team.members.actions.select-role.label') })) - .containsText(t('pages.team.members.actions.select-role.options.admin')); - }); - }); - }); - - module('When remove member button is clicked', (hooks) => { - hooks.beforeEach(async function () { - const memberWithMemberRole = store.createRecord('member', { - id: '123', - firstName: 'John', - lastName: 'Williams', - role: 'MEMBER', - }); - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: '1' }); - this.set('member', memberWithMemberRole); - - await renderScreen( - hbs``, - ); - await clickByName('Gérer'); - await clickByName('Supprimer'); - }); - - test('emits an event to the parent with member', async function (assert) { - // then - assert.true(openRemoveMemberModal.calledOnceWith(this.member)); - }); - }); - }); -}); diff --git a/certif/tests/integration/components/members-list-test.js b/certif/tests/integration/components/members-list-test.js index 2d898b4414b..7ad58d3c0a9 100644 --- a/certif/tests/integration/components/members-list-test.js +++ b/certif/tests/integration/components/members-list-test.js @@ -10,230 +10,158 @@ import { waitForDialog, waitForDialogClose } from '../../helpers/wait-for'; module('Integration | Component | MembersList', function (hooks) { setupIntlRenderingTest(hooks); - let store; let currentUser; hooks.beforeEach(function () { store = this.owner.lookup('service:store'); currentUser = this.owner.lookup('service:current-user'); + sinon.stub(currentUser, 'isAdminOfCurrentCertificationCenter').value(true); + sinon.stub(currentUser, 'currentAllowedCertificationCenterAccess').value({ name: 'Certif NextGen' }); }); hooks.afterEach(function () { sinon.restore(); }); - module('when there are members in certification center', function () { - test('it displays column headers for last name, first name, role, actions and lists the team members', async function (assert) { + module('For edit role button', function () { + test('displays a modal', async function (assert) { // given - const memberWithAdminRole = store.createRecord('member', { - firstName: 'Satoru', - lastName: 'Gojô', + const connectedUserWithAdminRole = store.createRecord('member', { + id: '1', + firstName: 'Jacques', + lastName: 'Ouzi', role: 'ADMIN', }); const memberWithMemberRole = store.createRecord('member', { - firstName: 'Itadori', - lastName: 'Yuji', + id: '3', + firstName: 'Franck', + lastName: 'Ofone', role: 'MEMBER', }); - const members = [memberWithAdminRole, memberWithMemberRole]; + const members = [connectedUserWithAdminRole, memberWithMemberRole]; - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithAdminRole.id }); - sinon.stub(currentUser, 'isAdminOfCurrentCertificationCenter').get(() => true); + sinon.stub(currentUser, 'certificationPointOfContact').value({ id: connectedUserWithAdminRole.id }); this.set('members', members); - - // when const screen = await render(hbs``); - - // then - assert.dom(screen.getByRole('columnheader', { name: t('common.labels.candidate.lastname') })).exists(); - assert.dom(screen.getByRole('columnheader', { name: t('common.labels.candidate.firstname') })).exists(); - assert.dom(screen.getByRole('columnheader', { name: t('common.labels.candidate.role') })).exists(); - assert.dom(screen.getByRole('columnheader', { name: t('pages.team.table-headers.actions') })).exists(); - assert.strictEqual(members.length, 2); - - const table = screen.getByRole('table'); - const rows = await within(table).findAllByRole('row'); - assert.dom(within(rows[1]).getByRole('cell', { name: 'Gojô' })).exists(); - assert.dom(within(rows[2]).getByRole('cell', { name: 'Itadori' })).exists(); - }); - }); - - module('when certification center is habilitated CléA', function () { - test('it shows the referer column', async function (assert) { - // given - const certifMember1 = store.createRecord('member', { firstName: 'Maria', lastName: 'Carré', isReferer: false }); - const certifMember2 = store.createRecord('member', { firstName: 'John', lastName: 'Williams', isReferer: true }); - const members = [certifMember1, certifMember2]; - - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: certifMember1.id }); - this.set('members', members); - this.set('hasCleaHabilitation', true); + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); // when - const screen = await render( - hbs``, - ); + await click(within(table).getByRole('button', { name: t('pages.team.members.actions.edit-role') })); + await waitForDialog(); + // then - assert.dom(screen.getByRole('columnheader', { name: t('pages.team.referer') })).exists(); + assert + .dom(screen.getByRole('heading', { level: 1, name: t('pages.team.members.modals.change-member-role.title') })) + .exists(); }); }); - module('when a member is referer', function () { - test('it shows the referer tag', async function (assert) { + module('For remove member button', function () { + test('displays a modal', async function (assert) { // given - const certifMember1 = store.createRecord('member', { firstName: 'Maria', lastName: 'Carré', isReferer: false }); - const certifMember2 = store.createRecord('member', { firstName: 'John', lastName: 'Williams', isReferer: true }); - const members = [certifMember1, certifMember2]; - - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: certifMember1.id }); + const connectedUserWithAdminRole = store.createRecord('member', { + id: '1', + firstName: 'Jacques', + lastName: 'Ouzi', + role: 'ADMIN', + }); + const memberWithMemberRole = store.createRecord('member', { + id: '3', + firstName: 'Franck', + lastName: 'Ofone', + role: 'MEMBER', + }); + const members = [connectedUserWithAdminRole, memberWithMemberRole]; + sinon.stub(currentUser, 'certificationPointOfContact').value({ id: connectedUserWithAdminRole.id }); this.set('members', members); - this.set('hasCleaHabilitation', true); + const screen = await render(hbs``); // when - const screen = await render( - hbs``, - ); + await click(screen.getByRole('button', { name: t('pages.team.members.actions.remove-membership') })); + await waitForDialog(); // then - - assert.dom(screen.getByRole('cell', { name: t('pages.team.pix-referer') })).exists(); + assert + .dom(screen.getByRole('heading', { level: 1, name: t('pages.team.members.remove-membership-modal.title') })) + .exists(); }); }); - module('when there is no referer', function () { - test('it does not show the referer tag', async function (assert) { - // given - const certifMember1 = store.createRecord('member', { firstName: 'Maria', lastName: 'Carré', isReferer: false }); - const members = [certifMember1]; + module('For leaving centre button', function (hooks) { + hooks.beforeEach(function () { + const connectedUserWithAdminRole = store.createRecord('member', { + id: '1', + firstName: 'Jacques', + lastName: 'Ouzi', + role: 'ADMIN', + }); + const memberWithAdminRole = store.createRecord('member', { + id: '2', + firstName: 'Annie', + lastName: 'Versaire', + role: 'ADMIN', + }); + const members = [connectedUserWithAdminRole, memberWithAdminRole]; - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: certifMember1.id }); + sinon.stub(currentUser, 'certificationPointOfContact').value({ id: connectedUserWithAdminRole.id }); this.set('members', members); - this.set('hasCleaHabilitation', true); - - // when - const screen = await render( - hbs``, - ); - - // then - assert.dom(screen.queryByRole('cell', { name: t('pages.team.pix-referer') })).doesNotExist(); }); - }); - module('when certification center is not habilitated CléA', function () { - test('it does not show the referer column', async function (assert) { + test('displays a modal', async function (assert) { // given - const certifMember1 = store.createRecord('member', { firstName: 'Maria', lastName: 'Carré', isReferer: false }); - const members = [certifMember1]; - - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: certifMember1.id }); - this.set('members', members); - this.set('hasCleaHabilitation', false); + const screen = await render(hbs``); // when - const screen = await render( - hbs``, - ); + await clickByName('Quitter cet espace Pix Certif'); + await waitForDialog(); // then - assert.dom(screen.queryByRole('columnheader', { name: t('pages.team.referer') })).doesNotExist(); + assert.dom(screen.getByRole('heading', { level: 1, name: 'Quitter cet espace Pix Certif' })).exists(); + assert.dom(screen.getByText('Certif NextGen')).exists(); }); - }); - - module('when the connected user is not the only admin of the certification center', function () { - module('when clicking on "Quitter cet espace Pix Certif"', function (hooks) { - hooks.beforeEach(function () { - const connectedUserWithAdminRole = store.createRecord('member', { - id: '1', - firstName: 'Jacques', - lastName: 'Ouzi', - role: 'ADMIN', - }); - const memberWithAdminRole = store.createRecord('member', { - id: '2', - firstName: 'Annie', - lastName: 'Versaire', - role: 'ADMIN', - }); - const memberWithMemberRole = store.createRecord('member', { - id: '3', - firstName: 'Franck', - lastName: 'Ofone', - role: 'MEMBER', - }); - const members = [connectedUserWithAdminRole, memberWithAdminRole, memberWithMemberRole]; - sinon.stub(currentUser, 'certificationPointOfContact').value({ id: connectedUserWithAdminRole.id }); - sinon.stub(currentUser, 'isAdminOfCurrentCertificationCenter').value(true); - sinon.stub(currentUser, 'currentAllowedCertificationCenterAccess').value({ name: 'Certif NextGen' }); + module('when leave certification center modal is displayed', function () { + module('when clicking on "Annuler" button', function () { + test('closes the modal', async function (assert) { + // given + const screen = await render(hbs``); - this.set('members', members); - }); + await clickByName('Quitter cet espace Pix Certif'); + await waitForDialog(); - test('displays a modal', async function (assert) { - // given - const screen = await render(hbs``); + // when + await clickByName('Annuler'); + await waitForDialogClose(); - await click(screen.getAllByRole('button', { name: 'Gérer' })[0]); - - // when - await clickByName('Quitter cet espace Pix Certif'); - await waitForDialog(); - - // then - assert.dom(screen.getByRole('heading', { level: 1, name: 'Quitter cet espace Pix Certif' })).exists(); - assert.dom(screen.getByText('Certif NextGen')).exists(); - }); - - module('when leave certification center modal is displayed', function () { - module('when clicking on "Annuler" button', function () { - test('closes the modal', async function (assert) { - // given - const screen = await render(hbs``); - - await click(screen.getAllByRole('button', { name: 'Gérer' })[0]); - await clickByName('Quitter cet espace Pix Certif'); - await waitForDialog(); - - // when - await clickByName('Annuler'); - await waitForDialogClose(); - - // then - assert - .dom(screen.queryByRole('heading', { level: 1, name: 'Quitter cet espace Pix Certif' })) - .doesNotExist(); - }); + // then + assert.dom(screen.queryByRole('heading', { level: 1, name: 'Quitter cet espace Pix Certif' })).doesNotExist(); }); + }); - module('when clicking on "Confirmer" button', function () { - test('calls "onLeaveCertificationCenter" event handler and closes the modal', async function (assert) { - // given - const onLeaveCertificationCenter = sinon.stub(); - this.set('onLeaveCertificationCenter', onLeaveCertificationCenter); - const session = this.owner.lookup('service:session'); - sinon.stub(session, 'waitBeforeInvalidation'); - - const screen = await render( - hbs``, - ); - - await click(screen.getAllByRole('button', { name: 'Gérer' })[0]); - await clickByName('Quitter cet espace Pix Certif'); - await waitForDialog(); - - // when - await clickByName('Confirmer'); - await waitForDialogClose(); - - // then - sinon.assert.called(session.waitBeforeInvalidation); - assert - .dom(screen.queryByRole('heading', { level: 1, name: 'Quitter cet espace Pix Certif' })) - .doesNotExist(); - assert.true(onLeaveCertificationCenter.calledOnce); - }); + module('when clicking on "Confirmer" button', function () { + test('calls "onLeaveCertificationCenter" event handler and closes the modal', async function (assert) { + // given + const onLeaveCertificationCenter = sinon.stub(); + this.set('onLeaveCertificationCenter', onLeaveCertificationCenter); + const session = this.owner.lookup('service:session'); + sinon.stub(session, 'waitBeforeInvalidation'); + + const screen = await render( + hbs``, + ); + + await clickByName('Quitter cet espace Pix Certif'); + await waitForDialog(); + + // when + await clickByName('Confirmer'); + await waitForDialogClose(); + + // then + sinon.assert.called(session.waitBeforeInvalidation); + assert.dom(screen.queryByRole('heading', { level: 1, name: 'Quitter cet espace Pix Certif' })).doesNotExist(); + assert.true(onLeaveCertificationCenter.calledOnce); }); }); }); diff --git a/certif/tests/integration/components/members-table-test.gjs b/certif/tests/integration/components/members-table-test.gjs new file mode 100644 index 00000000000..3af44b9da72 --- /dev/null +++ b/certif/tests/integration/components/members-table-test.gjs @@ -0,0 +1,439 @@ +import { render, within } from '@1024pix/ember-testing-library'; +import { t } from 'ember-intl/test-support'; +import MembersTable from 'pix-certif/components/members-table'; +import { module, test } from 'qunit'; +import sinon from 'sinon'; + +import setupIntlRenderingTest from '../../helpers/setup-intl-rendering'; + +module('Integration | Component | Members Table', function (hooks) { + setupIntlRenderingTest(hooks); + + let store; + let currentUser; + + hooks.beforeEach(function () { + store = this.owner.lookup('service:store'); + currentUser = this.owner.lookup('service:current-user'); + }); + + hooks.afterEach(function () { + sinon.restore(); + }); + + test('it displays members firstName, lastName and role', async function (assert) { + // given + const memberWithMemberRole = store.createRecord('member', { + id: 111, + firstName: 'John', + lastName: 'Williams', + role: 'MEMBER', + }); + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + }); + const members = [memberWithMemberRole, memberWithAdminRole]; + + // when + const screen = await render(); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + assert.dom(screen.getByRole('columnheader', { name: t('common.labels.candidate.lastname') })).exists(); + assert.dom(within(table).getByRole('columnheader', { name: t('common.labels.candidate.firstname') })).exists(); + assert.dom(within(table).getByRole('columnheader', { name: t('common.labels.candidate.lastname') })).exists(); + assert.dom(within(table).getByRole('columnheader', { name: t('common.labels.candidate.role') })).exists(); + assert.dom(within(table).getByRole('row', { name: 'Williams John Membre' })).exists(); + assert.dom(within(table).getByRole('row', { name: 'Carré Maria Administrateur' })).exists(); + }); + + module('#shouldDisplayManagingColumn', function () { + module('when current user has a member role', function () { + test('it not display manage buttons', async function (assert) { + // given + sinon.stub(currentUser, 'isAdminOfCurrentCertificationCenter').value(false); + const memberWithMemberRole = store.createRecord('member', { + id: 111, + firstName: 'John', + lastName: 'Williams', + role: 'MEMBER', + }); + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + }); + const members = [memberWithMemberRole, memberWithAdminRole]; + + // when + const screen = await render(); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + assert + .dom(within(table).queryByRole('columnheader', { name: t('pages.team.table-headers.actions') })) + .doesNotExist(); + assert + .dom( + within(table).queryByRole('button', { name: t('pages.team.members.actions.leave-certification-center') }), + ) + .doesNotExist(); + assert + .dom(within(table).queryByRole('button', { name: t('pages.team.members.actions.edit-role') })) + .doesNotExist(); + assert + .dom(within(table).queryByRole('button', { name: t('pages.team.members.actions.remove-membership') })) + .doesNotExist(); + }); + }); + + module('when current user has an admin role', function (hooks) { + hooks.beforeEach(function () { + sinon.stub(currentUser, 'isAdminOfCurrentCertificationCenter').value(true); + }); + + module('when user is the only one member', function () { + test('it not display manage buttons', async function (assert) { + // given + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + }); + const members = [memberWithAdminRole]; + sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithAdminRole.id }); + + // when + const screen = await render(); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + assert + .dom(within(table).queryByRole('columnheader', { name: t('pages.team.table-headers.actions') })) + .doesNotExist(); + assert + .dom( + within(table).queryByRole('button', { name: t('pages.team.members.actions.leave-certification-center') }), + ) + .doesNotExist(); + assert + .dom(within(table).queryByRole('button', { name: t('pages.team.members.actions.edit-role') })) + .doesNotExist(); + assert + .dom(within(table).queryByRole('button', { name: t('pages.team.members.actions.remove-membership') })) + .doesNotExist(); + }); + }); + + module('when there are multiple members', function () { + module('For edit role button', function () { + module('When there are multiple ADMIN roles', function () { + test('it displays buttons for all except current user', async function (assert) { + // given + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + }); + const otherMemberWithAdminRole = store.createRecord('member', { + id: 111, + firstName: 'John', + lastName: 'Williams', + role: 'ADMIN', + }); + const members = [otherMemberWithAdminRole, memberWithAdminRole]; + sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithAdminRole.id }); + + // when + const screen = await render(); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + assert + .dom(within(table).getByRole('columnheader', { name: t('pages.team.table-headers.actions') })) + .exists(); + const buttons = within(table).getAllByRole('button', { name: t('pages.team.members.actions.edit-role') }); + assert.strictEqual(buttons.length, 1); + assert + .dom( + within(table).getByRole('row', { name: 'Williams John Administrateur Modifier le rôle Supprimer' }), + ) + .exists(); + assert + .dom( + within(table).queryByRole('row', { name: 'Carré Maria Administrateur Modifier le rôle Supprimer' }), + ) + .doesNotExist(); + }); + }); + + module('When others have only MEMBER roles', function () { + test('it displays buttons for all except current user', async function (assert) { + // given + const memberWithMemberRole = store.createRecord('member', { + id: 111, + firstName: 'John', + lastName: 'Williams', + role: 'MEMBER', + }); + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + }); + const members = [memberWithMemberRole, memberWithAdminRole]; + sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithAdminRole.id }); + + // when + const screen = await render(); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + assert + .dom(within(table).getByRole('columnheader', { name: t('pages.team.table-headers.actions') })) + .exists(); + const buttons = within(table).getAllByRole('button', { name: t('pages.team.members.actions.edit-role') }); + assert.strictEqual(buttons.length, 1); + assert + .dom(within(table).getByRole('row', { name: 'Williams John Membre Modifier le rôle Supprimer' })) + .exists(); + assert + .dom( + within(table).queryByRole('row', { name: 'Carré Maria Administrateur Modifier le rôle Supprimer' }), + ) + .doesNotExist(); + }); + }); + }); + + module('For remove member button', function () { + test('it displays buttons for all except current user', async function (assert) { + // given + const memberWithMemberRole = store.createRecord('member', { + id: 111, + firstName: 'John', + lastName: 'Williams', + role: 'MEMBER', + }); + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + }); + const members = [memberWithMemberRole, memberWithAdminRole]; + sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithAdminRole.id }); + + // when + const screen = await render(); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + const buttons = within(table).getAllByRole('button', { + name: t('pages.team.members.actions.remove-membership'), + }); + assert.strictEqual(buttons.length, 1); + assert + .dom(within(table).getByRole('row', { name: 'Williams John Membre Modifier le rôle Supprimer' })) + .exists(); + assert + .dom(within(table).queryByRole('row', { name: 'Carré Maria Administrateur Modifier le rôle Supprimer' })) + .doesNotExist(); + }); + }); + + module('For leaving centre button', function () { + module('When there are multiple ADMIN roles', function () { + test('it displays buttons only for current user', async function (assert) { + // given + const memberWithMemberRole = store.createRecord('member', { + id: 111, + firstName: 'John', + lastName: 'Williams', + role: 'MEMBER', + }); + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + }); + const otherMemberWithAdminRole = store.createRecord('member', { + id: 333, + firstName: 'Alain', + lastName: 'Verse', + role: 'ADMIN', + }); + sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithAdminRole.id }); + const members = [memberWithMemberRole, memberWithAdminRole, otherMemberWithAdminRole]; + + // when + const screen = await render(); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + assert + .dom(within(table).getByRole('columnheader', { name: t('pages.team.table-headers.actions') })) + .exists(); + const buttons = within(table).getAllByRole('button', { + name: t('pages.team.members.actions.leave-certification-center'), + }); + assert.strictEqual(buttons.length, 1); + assert + .dom(within(table).getByRole('row', { name: 'Williams John Membre Modifier le rôle Supprimer' })) + .exists(); + assert + .dom( + within(table).queryByRole('row', { + name: 'Carré Maria Administrateur Modifier le rôle Quitter le centre', + }), + ) + .doesNotExist(); + assert + .dom( + within(table).queryByRole('row', { name: 'Alain Verse Administrateur Modifier le rôle Supprimer' }), + ) + .doesNotExist(); + }); + }); + + //todo + module('When others have only MEMBER roles', function () { + test('it not displays button', async function (assert) { + // given + const memberWithMemberRole = store.createRecord('member', { + id: 111, + firstName: 'John', + lastName: 'Williams', + role: 'MEMBER', + }); + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + }); + const members = [memberWithMemberRole, memberWithAdminRole]; + sinon.stub(currentUser, 'certificationPointOfContact').value({ id: memberWithAdminRole.id }); + + // when + const screen = await render(); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + assert + .dom(within(table).getByRole('columnheader', { name: t('pages.team.table-headers.actions') })) + .exists(); + assert + .dom( + within(table).queryByRole('button', { + name: t('pages.team.members.actions.leave-certification-center'), + }), + ) + .doesNotExist(); + }); + }); + }); + }); + }); + }); + + module('#shouldDisplayRefererColumn', function () { + module('when certification center is habilitated CléA', function () { + test('it shows the referer column', async function (assert) { + // given + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + }); + const members = [memberWithAdminRole]; + + // when + const screen = await render( + , + ); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + assert.dom(within(table).getByRole('columnheader', { name: t('pages.team.referer') })).exists(); + }); + + module('when a member is referer', function () { + test('it shows the referer tag', async function (assert) { + // given + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + isReferer: true, + }); + const members = [memberWithAdminRole]; + + // when + const screen = await render( + , + ); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + assert.dom(within(table).getByRole('cell', { name: t('pages.team.pix-referer') })).exists(); + }); + }); + + module('when there is no referer', function () { + test('it does not show the referer tag', async function (assert) { + // given + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + isReferer: false, + }); + const members = [memberWithAdminRole]; + + // when + const screen = await render( + , + ); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + assert.dom(within(table).queryByRole('cell', { name: t('pages.team.pix-referer') })).doesNotExist(); + }); + }); + }); + + module('when certification center is not habilitated CléA', function () { + test('it not displays the referer column', async function (assert) { + // given + const memberWithAdminRole = store.createRecord('member', { + id: 222, + firstName: 'Maria', + lastName: 'Carré', + role: 'ADMIN', + }); + const members = [memberWithAdminRole]; + + // when + const screen = await render( + , + ); + + // then + const table = screen.getByRole('table', { name: t('pages.team.table.caption') }); + assert.dom(within(table).queryByRole('columnheader', { name: t('pages.team.referer') })).doesNotExist(); + }); + }); + }); +}); diff --git a/certif/tests/unit/components/members-list-item-test.js b/certif/tests/unit/components/members-list-item-test.js deleted file mode 100644 index cd1e9be0eed..00000000000 --- a/certif/tests/unit/components/members-list-item-test.js +++ /dev/null @@ -1,76 +0,0 @@ -import { setupTest } from 'ember-qunit'; -import { module, test } from 'qunit'; -import sinon from 'sinon'; - -import createGlimmerComponent from '../../helpers/create-glimmer-component'; -import setupIntl from '../../helpers/setup-intl'; - -module('Unit | Component | MembersListItem', (hooks) => { - setupTest(hooks); - setupIntl(hooks, 'fr'); - - module('#updateCertificationCenterMembership', () => { - test('disables edition mode, saves membership and displays success notification', async function (assert) { - // given - const component = createGlimmerComponent('component:members-list-item'); - component.isEditionMode = true; - component.pixToast = { - sendSuccessNotification: sinon.stub(), - }; - const member = { - save: sinon.stub().resolves(), - }; - - // when - await component.updateMember(member); - - // then - assert.false(component.isEditionMode); - assert.ok(member.save.called); - assert.ok(component.pixToast.sendSuccessNotification.called); - }); - - module('when an error occurs', function () { - test('rollbacks membership role modification and display error notification', async function (assert) { - // given - const component = createGlimmerComponent('component:members-list-item'); - component.isEditionMode = true; - component.pixToast = { - sendErrorNotification: sinon.stub(), - }; - const member = { - save: sinon.stub().rejects(), - rollbackAttributes: sinon.stub(), - }; - - // when - await component.updateMember(member); - - // then - assert.false(component.isEditionMode); - assert.ok(member.save.called); - assert.ok(member.rollbackAttributes.called); - assert.ok(component.pixToast.sendErrorNotification.called); - }); - }); - - module('when the cancel button is clicked', function () { - test('rollbacks member role modification', async function (assert) { - // given - const component = createGlimmerComponent('component:members-list-item'); - component.isEditionMode = true; - const member = { - rollbackAttributes: sinon.stub(), - }; - component.args.member = member; - - // when - await component.cancelUpdateRoleOfMember(); - - // then - assert.false(component.isEditionMode); - assert.ok(member.rollbackAttributes.called); - }); - }); - }); -}); diff --git a/certif/tests/unit/components/members-list-test.js b/certif/tests/unit/components/members-list-test.js index 5229d64c202..198b8e0e1f1 100644 --- a/certif/tests/unit/components/members-list-test.js +++ b/certif/tests/unit/components/members-list-test.js @@ -16,65 +16,77 @@ module('Unit | Component | MembersList', (hooks) => { store = this.owner.lookup('service:store'); }); - module('Getters', function () { - module('#isMultipleAdminsAvailable', () => { - module('when there is multiple members with the role "ADMIN"', function () { - test('returns true', function (assert) { + module('Methods', function () { + module('#changeMemberRole', () => { + test('closes modal, saves membership and displays success notification', async function (assert) { + // given + const component = createGlimmerComponent('component:members-list'); + component.isChangeMemberRoleModalOpen = true; + component.pixToast = { + sendSuccessNotification: sinon.stub(), + }; + const member = { + save: sinon.stub().resolves(), + }; + component.member = member; + const role = 'MEMBER'; + + // when + await component.changeMemberRole(role); + + // then + assert.false(component.isChangeMemberRoleModalOpen); + assert.ok(member.save.called); + assert.ok(component.pixToast.sendSuccessNotification.called); + }); + + module('when an error occurs', function () { + test('rollbacks membership role modification and display error notification', async function (assert) { // given - component.args.members = [ - store.createRecord('member', { - id: '1', - firstName: 'Éva', - lastName: 'Kué', - role: 'ADMIN', - }), - store.createRecord('member', { - id: '2', - firstName: 'Matt', - lastName: 'Ematic', - role: 'ADMIN', - }), - store.createRecord('member', { - id: '3', - firstName: 'Harry', - lastName: 'Coe', - role: 'MEMBER', - }), - ]; + const component = createGlimmerComponent('component:members-list'); + component.isChangeMemberRoleModalOpen = true; + component.pixToast = { + sendErrorNotification: sinon.stub(), + }; + const member = { + save: sinon.stub().rejects(), + rollbackAttributes: sinon.stub(), + }; + component.member = member; + const role = 'ADMIN'; // when + await component.changeMemberRole(role); + // then - assert.true(component.isMultipleAdminsAvailable); + assert.false(component.isChangeMemberRoleModalOpen); + assert.ok(member.save.called); + assert.ok(member.rollbackAttributes.called); + assert.ok(component.pixToast.sendErrorNotification.called); }); }); + }); - module('when there is one member with the role "ADMIN"', function () { - test('returns false', function (assert) { + module('#closeChangeMemberRoleModal', () => { + module('when the cancel button is clicked', function () { + test('rollbacks member role modification', async function (assert) { // given - component.args.members = [ - store.createRecord('member', { - id: '1', - firstName: 'Jean', - lastName: 'Tourloupe', - role: 'ADMIN', - }), - store.createRecord('member', { - id: '2', - firstName: 'Éva', - lastName: 'Noui', - role: 'MEMBER', - }), - ]; + const component = createGlimmerComponent('component:members-list'); + component.isChangeMemberRoleModalOpen = true; + const member = { + rollbackAttributes: sinon.stub(), + }; + component.args.member = member; // when + await component.closeChangeMemberRoleModal(); + // then - assert.false(component.isMultipleAdminsAvailable); + assert.false(component.isChangeMemberRoleModalOpen); }); }); }); - }); - module('Methods', function () { module('#closeLeaveCertificationCenterModal', function () { test('sets "isLeaveCertificationCenterModalOpen" value to "false"', function (assert) { // given diff --git a/certif/tests/unit/components/members-table-test.js b/certif/tests/unit/components/members-table-test.js new file mode 100644 index 00000000000..76c03f2eee3 --- /dev/null +++ b/certif/tests/unit/components/members-table-test.js @@ -0,0 +1,75 @@ +import { setupTest } from 'ember-qunit'; +import { module, test } from 'qunit'; + +import createGlimmerComponent from '../../helpers/create-glimmer-component'; +import setupIntl from '../../helpers/setup-intl'; + +module('Unit | Component | MembersTable', (hooks) => { + setupTest(hooks); + setupIntl(hooks, 'fr'); + + let component, store; + + hooks.beforeEach(function () { + component = createGlimmerComponent('component:members-table'); + store = this.owner.lookup('service:store'); + }); + + module('Getters', function () { + module('#isMultipleAdminsAvailable', () => { + module('when there is multiple members with the role "ADMIN"', function () { + test('returns true', function (assert) { + // given + component.args.members = [ + store.createRecord('member', { + id: '1', + firstName: 'Éva', + lastName: 'Kué', + role: 'ADMIN', + }), + store.createRecord('member', { + id: '2', + firstName: 'Matt', + lastName: 'Ematic', + role: 'ADMIN', + }), + store.createRecord('member', { + id: '3', + firstName: 'Harry', + lastName: 'Coe', + role: 'MEMBER', + }), + ]; + + // when + // then + assert.true(component.isMultipleAdminsAvailable); + }); + }); + + module('when there is one member with the role "ADMIN"', function () { + test('returns false', function (assert) { + // given + component.args.members = [ + store.createRecord('member', { + id: '1', + firstName: 'Jean', + lastName: 'Tourloupe', + role: 'ADMIN', + }), + store.createRecord('member', { + id: '2', + firstName: 'Éva', + lastName: 'Noui', + role: 'MEMBER', + }), + ]; + + // when + // then + assert.false(component.isMultipleAdminsAvailable); + }); + }); + }); + }); +}); diff --git a/certif/translations/en.json b/certif/translations/en.json index 653db9489aa..9d5505aef5e 100644 --- a/certif/translations/en.json +++ b/certif/translations/en.json @@ -958,18 +958,21 @@ "actions": { "edit-role": "Change role", "leave-certification-center": "Leave this Pix Certif space", - "manage": "Manage", "remove-membership": "Remove", - "save": "Save", - "select-role": { - "label": "Select a role", - "options": { - "admin": "Administrator", - "member": "Member" - } - } + "save": "Save" }, "modals": { + "change-member-role": { + "title": "Modify role", + "information": "You're about to change {firstName} {lastName}'s role.", + "select-role": { + "label": "Select a role", + "options": { + "admin": "Administrator", + "member": "Member" + } + } + }, "leave-certification-center": { "title": "Leave this Pix Certif space", "message": "Are you sure you want to leave this Pix Certif space? You will no longer have access to {certificationCenterName}.

Your sessions remain accessible to the rest of the team.

Your access to other Pix Certif spaces will not be affected.

You'll be disconnected." @@ -1023,6 +1026,9 @@ "empty-option": "--Sélectionner--", "label": "Sélectionner le référent CléA Numérique" }, + "table": { + "caption": "Table listing the members of the certification centre. It includes the first and last name of the member and the role. If the logged-in user has an administrator role, there is an action column for changing a member's role, deleting a member from the space or leaving the certification space. If the centre has CléA accreditation, the table will include the referent." + }, "table-headers": { "actions": "Actions" }, diff --git a/certif/translations/fr.json b/certif/translations/fr.json index ac31b00de5f..a2162387a0e 100644 --- a/certif/translations/fr.json +++ b/certif/translations/fr.json @@ -958,18 +958,21 @@ "actions": { "edit-role": "Modifier le rôle", "leave-certification-center": "Quitter cet espace Pix Certif", - "manage": "Gérer", "remove-membership": "Supprimer", - "save": "Enregistrer", - "select-role": { - "label": "Sélectionner un rôle", - "options": { - "admin": "Administrateur", - "member": "Membre" - } - } + "save": "Enregistrer" }, "modals": { + "change-member-role": { + "title": "Modifier le rôle", + "information": "Vous vous apprêtez à changer le rôle de {firstName} {lastName}.", + "select-role": { + "label": "Sélectionner un rôle", + "options": { + "admin": "Administrateur", + "member": "Membre" + } + } + }, "leave-certification-center": { "title": "Quitter cet espace Pix Certif", "message": "Êtes-vous sûr de vouloir quitter cet espace Pix Certif ? Vous n’aurez plus accès à {certificationCenterName}.

Vos sessions restent accessibles au reste de l'équipe.

Vos accès à d’autres espaces Pix Certif ne seront pas impactés.

Vous allez être déconnecté." @@ -1023,6 +1026,9 @@ "empty-option": "--Sélectionner--", "label": "Sélectionner le référent CléA Numérique" }, + "table": { + "caption": "Tableau listant les membres du centre de certification. Il comporte le nom et prénom du membre ainsi que le rôle. Si l'utilisateur connecté possède un rôle administrateur, une colonne action permet de modifier le rôle d'un membre, de supprimer un membre de l'espace ou encore de quitter lui-même cet espace de certification. Si le centre possède une habilitation CléA,le tableau comportera le référent." + }, "table-headers": { "actions": "Actions" }, From cf99db828f048d2f0b4973f533a62a658bbce362 Mon Sep 17 00:00:00 2001 From: AndreiaPena Date: Wed, 5 Mar 2025 17:45:19 +0100 Subject: [PATCH 4/5] =?UTF-8?q?=E2=9C=A8=20certif:=20use=20PixTable=20on?= =?UTF-8?q?=20reports=20list?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../completed-reports-information-step.hbs | 186 +++++++++--------- .../uncompleted-reports-information-step.hbs | 180 +++++++++-------- .../styles/components/issue-report-modal.scss | 2 +- .../reports-information-step.scss | 30 +-- certif/app/styles/globals/panels.scss | 1 - ...completed-reports-information-step-test.js | 3 +- ...completed-reports-information-step-test.js | 3 +- 7 files changed, 201 insertions(+), 204 deletions(-) diff --git a/certif/app/components/session-finalization/completed-reports-information-step.hbs b/certif/app/components/session-finalization/completed-reports-information-step.hbs index 9064adc1a59..12ff8adc51c 100644 --- a/certif/app/components/session-finalization/completed-reports-information-step.hbs +++ b/certif/app/components/session-finalization/completed-reports-information-step.hbs @@ -1,99 +1,109 @@ -
- - {{#if (gt @session.uncompletedCertificationReports.length 0)}} - - {{/if}} - - - - - - - {{#if @shouldDisplayHasSeenEndTestScreenCheckbox}} - - {{/if}} - - - - {{#each @certificationReports as |report|}} - - - - - - {{#if @shouldDisplayHasSeenEndTestScreenCheckbox}} - - {{/if}} - - {{/each}} - -
- - {{t "pages.session-finalization.reporting.completed-reports-information.description"}} - - - {{t "pages.session-finalization.reporting.completed-reports-information.extra-information"}} - -
{{t "common.labels.candidate.lastname"}}{{t "common.labels.candidate.firstname"}}{{t "pages.session-finalization.reporting.table.labels.certification-number"}}{{t "pages.session-finalization.reporting.table.labels.reporting"}} +
+ + {{#if (gt @session.uncompletedCertificationReports.length 0)}} + + {{t "pages.session-finalization.reporting.completed-reports-information.description"}} + + {{/if}} + + + <:columns as |report context|> + + <:header> + {{t "common.labels.candidate.lastname"}} + + <:cell> + {{report.lastName}} + + + + <:header> + {{t "common.labels.candidate.firstname"}} + + <:cell> + {{report.firstName}} + + + + <:header> + {{t "pages.session-finalization.reporting.table.labels.certification-number"}} + + <:cell> + {{report.certificationCourseId}} + + + + <:header> + {{t "pages.session-finalization.reporting.table.labels.reporting"}} + + <:cell> +
+ {{#if report.certificationIssueReports}} + +

+ {{t + "pages.session-finalization.reporting.table.reporting-count" + reportingsCount=report.certificationIssueReports.length + }} +

+ {{else}} + + {{/if}} +
+ +
+ {{#if @shouldDisplayHasSeenEndTestScreenCheckbox}} + + <:header> <:label>{{t "pages.session-finalization.reporting.table.labels.end-of-test-screen"}} -
{{report.lastName}}{{report.firstName}}{{report.certificationCourseId}} -
- {{#if report.certificationIssueReports}} - -

- {{t - "pages.session-finalization.reporting.table.reporting-count" - reportingsCount=report.certificationIssueReports.length - }} -

- {{else}} - - {{/if}} -
-
- - <:label>{{t - "pages.session-finalization.reporting.table.labels.end-of-test-screen-for-candidate" - firstName=report.firstName - lastName=report.lastName - }} - -
+ + <:cell> + + <:label>{{t + "pages.session-finalization.reporting.table.labels.end-of-test-screen-for-candidate" + firstName=report.firstName + lastName=report.lastName + }} + + + + {{/if}} + + + {{#if this.showAddIssueReportModal}} +
+ + {{t "pages.session-finalization.reporting.uncompleted-reports-information.description"}} + - - - - - - - - - - - - - {{#each @certificationReports as |report|}} - - - - - - - - {{/each}} - -
- - {{t "pages.session-finalization.reporting.uncompleted-reports-information.description"}} - - - {{t "pages.session-finalization.reporting.uncompleted-reports-information.extra-information"}} - -
{{t "common.labels.candidate.lastname"}}{{t "common.labels.candidate.firstname"}}{{t "pages.session-finalization.reporting.table.labels.certification-number"}}{{t "pages.session-finalization.reporting.table.labels.reporting"}} -
+ + <:columns as |report context|> + + <:header> + {{t "common.labels.candidate.lastname"}} + + <:cell> + {{report.lastName}} + + + + <:header> + {{t "common.labels.candidate.firstname"}} + + <:cell> + {{report.firstName}} + + + + <:header> + {{t "pages.session-finalization.reporting.table.labels.certification-number"}} + + <:cell> + {{report.certificationCourseId}} + + + + <:header> + {{t "pages.session-finalization.reporting.table.labels.reporting"}} + + <:cell> +
+ {{#if report.certificationIssueReports.length}} + +

+ {{t + "pages.session-finalization.reporting.table.reporting-count" + reportingsCount=report.certificationIssueReports.length + }} +

+ {{else}} + + {{/if}} +
+ +
+ + <:header> +
{{t "pages.session-finalization.reporting.uncompleted-reports-information.table.labels.abandonment-reason" }} - + <:triggerElement>
-
{{report.lastName}}{{report.firstName}}{{report.certificationCourseId}} -
- {{#if report.certificationIssueReports.length}} - -

- {{t - "pages.session-finalization.reporting.table.reporting-count" - reportingsCount=report.certificationIssueReports.length - }} -

- {{else}} - - {{/if}} -
-
- - <:label>{{t - "pages.session-finalization.reporting.uncompleted-reports-information.table.labels.abandonment-reason-label" - }} - -
+ + <:cell> + + <:label>{{t + "pages.session-finalization.reporting.uncompleted-reports-information.table.labels.abandonment-reason-label" + }} + + + + + {{#if this.showAddIssueReportModal}} {{/if}} -
\ No newline at end of file diff --git a/certif/app/styles/components/issue-report-modal.scss b/certif/app/styles/components/issue-report-modal.scss index d7bdbfb7b94..b1309a9dde3 100644 --- a/certif/app/styles/components/issue-report-modal.scss +++ b/certif/app/styles/components/issue-report-modal.scss @@ -49,7 +49,7 @@ &__subcategory-label { margin: 8px 0 0; padding: 0 0 0 16px; - color: var(--pix-neutral-20); + color: var(--pix-neutral-500); } } diff --git a/certif/app/styles/components/session-finalization/reports-information-step.scss b/certif/app/styles/components/session-finalization/reports-information-step.scss index a05e66cc117..34fb652f9c9 100644 --- a/certif/app/styles/components/session-finalization/reports-information-step.scss +++ b/certif/app/styles/components/session-finalization/reports-information-step.scss @@ -1,30 +1,8 @@ -.session-finalization-reports-information-step { - font-size: 0.8125rem; +.session-finalization-reports { + margin-top: var(--pix-spacing-4x); - &__title-completed { - padding: 20px 0 20px 24px; - - &--hidden { - display: none; - } - } - - &__title-uncompleted { - padding: 20px 0 20px 24px; - } - - table { - table-layout: initial; - - th { - width: 10%; - } - - th:nth-child(1), - th:nth-child(2), - th:nth-child(4) { - width: 20%; - } + &__information { + margin: var(--pix-spacing-2x); } &__checker { diff --git a/certif/app/styles/globals/panels.scss b/certif/app/styles/globals/panels.scss index c1eabe3b6f7..d3a572ad24a 100644 --- a/certif/app/styles/globals/panels.scss +++ b/certif/app/styles/globals/panels.scss @@ -3,7 +3,6 @@ .panel { background-color: var(--pix-neutral-0); border-radius: var(--pix-spacing-2x); - box-shadow: 0 1px 1px 0 rgb(12 22 58 / 10%), 0 2px 5px 0 rgb(0 0 0 / 10%); } .navbar { diff --git a/certif/tests/integration/components/session-finalization/completed-reports-information-step-test.js b/certif/tests/integration/components/session-finalization/completed-reports-information-step-test.js index cca2496d26a..227e5341fef 100644 --- a/certif/tests/integration/components/session-finalization/completed-reports-information-step-test.js +++ b/certif/tests/integration/components/session-finalization/completed-reports-information-step-test.js @@ -1,6 +1,7 @@ import { render } from '@1024pix/ember-testing-library'; import { click } from '@ember/test-helpers'; import { hbs } from 'ember-cli-htmlbars'; +import { t } from 'ember-intl/test-support'; import { certificationIssueReportCategories } from 'pix-certif/models/certification-issue-report'; import { module, test } from 'qunit'; import sinon from 'sinon'; @@ -105,7 +106,7 @@ module('Integration | Component | SessionFinalization::CompletedReportsInformati assert .dom( screen.getByRole('table', { - name: 'Certification(s) terminée(s) Liste des candidats qui ont fini leur test de certification, triée par nom de naissance, avec un lien pour ajouter un ou plusieurs signalements le cas échéant.', + name: t('pages.session-finalization.reporting.completed-reports-information.extra-information'), }), ) .exists(); diff --git a/certif/tests/integration/components/session-finalization/uncompleted-reports-information-step-test.js b/certif/tests/integration/components/session-finalization/uncompleted-reports-information-step-test.js index 02bae4ae5b9..fffed7aa135 100644 --- a/certif/tests/integration/components/session-finalization/uncompleted-reports-information-step-test.js +++ b/certif/tests/integration/components/session-finalization/uncompleted-reports-information-step-test.js @@ -1,6 +1,7 @@ import { render as renderScreen } from '@1024pix/ember-testing-library'; import { click } from '@ember/test-helpers'; import { hbs } from 'ember-cli-htmlbars'; +import { t } from 'ember-intl/test-support'; import { certificationIssueReportCategories } from 'pix-certif/models/certification-issue-report'; import { module, test } from 'qunit'; import sinon from 'sinon'; @@ -214,7 +215,7 @@ module('Integration | Component | SessionFinalization::UncompletedReportsInforma assert .dom( screen.getByRole('table', { - name: "Ces candidats n'ont pas fini leur test de certification ou le surveillant a mis fin à leur test Liste des candidats qui n’ont pas fini leur test de certification, triée par nom de naissance, avec un lien pour ajouter un ou plusieurs signalements le cas échéant et une liste déroulante permettant de sélectionner la raison de l’abandon.", + name: t('pages.session-finalization.reporting.uncompleted-reports-information.extra-information'), }), ) .exists(); From 0ca7542277d0d8742c07f7a4c955afa0d55caf11 Mon Sep 17 00:00:00 2001 From: AndreiaPena Date: Wed, 5 Mar 2025 16:47:56 +0100 Subject: [PATCH 5/5] =?UTF-8?q?=F0=9F=94=A5=20certif:=20remove=20useless?= =?UTF-8?q?=20css=20for=20table?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- certif/app/styles/globals/tables.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/certif/app/styles/globals/tables.scss b/certif/app/styles/globals/tables.scss index 7b4d95f0776..9f30587b87c 100644 --- a/certif/app/styles/globals/tables.scss +++ b/certif/app/styles/globals/tables.scss @@ -7,10 +7,6 @@ &--small { width: 10%; - - th { - text-align: start; - } } }