diff --git a/frontend/cypress/e2e/side_window/reporting/reportings.spec.ts b/frontend/cypress/e2e/side_window/reporting/reportings.spec.ts index 987646f6f3..4d96933e83 100644 --- a/frontend/cypress/e2e/side_window/reporting/reportings.spec.ts +++ b/frontend/cypress/e2e/side_window/reporting/reportings.spec.ts @@ -13,9 +13,9 @@ context('Reportings', () => { it('Reportings should be archived in Reportings Table', () => { cy.intercept('PUT', '/bff/v1/reportings/5').as('archiveReporting') - cy.get('*[data-cy="status-filter-Archivés"]').click() - cy.get('*[data-cy="more-actions-reporting-5"]').scrollIntoView().click({ force: true }) - cy.get('*[data-cy="archive-reporting-5"]').scrollIntoView().click({ force: true }) + cy.getDataCy('status-filter-Archivés').click() + cy.getDataCy('more-actions-reporting-5').scrollIntoView().click({ force: true }) + cy.getDataCy('archive-reporting-5').scrollIntoView().click({ force: true }) cy.wait('@archiveReporting').then(({ response }) => { expect(response && response.body.id).equal(5) @@ -25,8 +25,8 @@ context('Reportings', () => { it('Reporting should be duplicate and editable in Reportings Table', () => { cy.intercept('PUT', '/bff/v1/reportings').as('createReporting') - cy.get('*[data-cy="status-filter-Archivés"]').click() - cy.get('*[data-cy="duplicate-reporting-5"]').click({ force: true }) + cy.getDataCy('status-filter-Archivés').click() + cy.getDataCy('duplicate-reporting-5').click({ force: true }) cy.get('form').should('exist') cy.get('.rs-radio').find('label').contains('Autre').click() @@ -47,9 +47,9 @@ context('Reportings', () => { it('Reporting should be delete in Reportings Table', () => { cy.intercept('DELETE', '/bff/v1/reportings/4').as('deleteReporting') - cy.get('*[data-cy="status-filter-Archivés"]').click() - cy.get('*[data-cy="more-actions-reporting-4"]').scrollIntoView().click({ force: true }) - cy.get('*[data-cy="delete-reporting-4"]').scrollIntoView().click({ force: true }) + cy.getDataCy('status-filter-Archivés').click() + cy.getDataCy('more-actions-reporting-4').scrollIntoView().click({ force: true }) + cy.getDataCy('delete-reporting-4').scrollIntoView().click({ force: true }) cy.clickButton('Confirmer la suppression') @@ -58,38 +58,38 @@ context('Reportings', () => { }) }) it('Multiples reportings can be opened or created and saved in store', () => { - cy.get('*[data-cy="status-filter-Archivés"]').click() + cy.getDataCy('status-filter-Archivés').click() - cy.get('*[data-cy="edit-reporting-5"]').click({ force: true }) - cy.get('*[data-id="reporting-collapse-or-expand-button-5"]').click() + cy.getDataCy('edit-reporting-5').click({ force: true }) + cy.getDataCy('reporting-collapse-or-expand-button-5').click() // create new reporting cy.clickButton('Ajouter un nouveau signalement') cy.wait(500) - cy.get('*[data-cy="reporting-title"]').contains('NOUVEAU SIGNALEMENT (1)') + cy.getDataCy('reporting-title').contains('NOUVEAU SIGNALEMENT (1)') cy.fill('Nom du Sémaphore', 'Sémaphore de Dieppe') - cy.get('*[data-cy="reporting-target-type"]').click({ force: true }) + cy.getDataCy('reporting-target-type').click({ force: true }) cy.get('div[role="option"]').contains('Personne morale').click() cy.wait(200) - cy.get('*[data-id="reporting-collapse-or-expand-button-new-1"]').click() + cy.getDataCy('reporting-collapse-or-expand-button-new-1').click() // create another new reporting cy.clickButton('Ajouter un nouveau signalement') - cy.get('*[data-cy="reporting-title"]').contains('NOUVEAU SIGNALEMENT (2)') - cy.get('*[data-id="reporting-collapse-or-expand-button-new-1"]').click() + cy.getDataCy('reporting-title').contains('NOUVEAU SIGNALEMENT (2)') + cy.getDataCy('reporting-collapse-or-expand-button-new-1').click() - cy.get('*[data-cy="reporting-title"]').contains('NOUVEAU SIGNALEMENT (1)') - cy.get('*[data-cy="add-semaphore-source"]').contains('Sémaphore de Dieppe') - cy.get('*[data-cy="reporting-target-type"]').contains('Personne morale') + cy.getDataCy('reporting-title').contains('NOUVEAU SIGNALEMENT (1)') + cy.getDataCy('add-semaphore-source').contains('Sémaphore de Dieppe') + cy.getDataCy('reporting-target-type').contains('Personne morale') }) it('Mission with attached env_action can be detached', () => { cy.intercept('PUT', '/bff/v1/reportings/6').as('updateReporting') - cy.get('*[data-cy="status-filter-Archivés"]').click() + cy.getDataCy('status-filter-Archivés').click() - cy.get('*[data-cy="edit-reporting-6"]').click({ force: true }) + cy.getDataCy('edit-reporting-6').click({ force: true }) cy.clickButton('Détacher la mission') cy.wait(500) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index cff03ea89b..cc569184a8 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "license": "AGPL-3.0", "dependencies": { - "@mtes-mct/monitor-ui": "18.4.2", + "@mtes-mct/monitor-ui": "18.5.1", "@reduxjs/toolkit": "1.9.7", "@rsuite/responsive-nav": "5.0.2", "@sentry/browser": "7.73.0", @@ -3655,9 +3655,9 @@ "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" }, "node_modules/@mtes-mct/monitor-ui": { - "version": "18.4.2", - "resolved": "https://registry.npmjs.org/@mtes-mct/monitor-ui/-/monitor-ui-18.4.2.tgz", - "integrity": "sha512-/ul/YbXj4Ju3qxOba+ojbob1bMdlyU9yT28hNsstUYURTTJ9QXpozodAxDnLSJGkHwm4wyYNWa19aj4z9eKcRw==", + "version": "18.5.1", + "resolved": "https://registry.npmjs.org/@mtes-mct/monitor-ui/-/monitor-ui-18.5.1.tgz", + "integrity": "sha512-W4A7nhKT8Ft5TCRfDLwdLQy4xeK2av3YKKbAOnv8JLV3DcH8u3X4syXOwtLRL0azTZpA+gQMhpsSVbWk8pAEnQ==", "dependencies": { "@babel/runtime": "7.24.7", "@tanstack/react-table": "8.17.3", diff --git a/frontend/package.json b/frontend/package.json index 88ec2c4195..bb589d66d2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -26,7 +26,7 @@ "test:unit:watch": "npm run test:unit -- --watch" }, "dependencies": { - "@mtes-mct/monitor-ui": "18.4.2", + "@mtes-mct/monitor-ui": "18.5.1", "@reduxjs/toolkit": "1.9.7", "@rsuite/responsive-nav": "5.0.2", "@sentry/browser": "7.73.0", diff --git a/frontend/src/features/ControlUnit/components/ControlUnitDialog/ControlUnitContactList/Item.tsx b/frontend/src/features/ControlUnit/components/ControlUnitDialog/ControlUnitContactList/Item.tsx index 2bef216eff..b90ffc8afa 100644 --- a/frontend/src/features/ControlUnit/components/ControlUnitDialog/ControlUnitContactList/Item.tsx +++ b/frontend/src/features/ControlUnit/components/ControlUnitDialog/ControlUnitContactList/Item.tsx @@ -8,25 +8,30 @@ export type ItemProps = { controlUnitContact: ControlUnit.ControlUnitContactData onEdit: (controlUnitContactId: number) => Promisable } -export function Item({ controlUnitContact, onEdit }: ItemProps) { - const handleEdit = useCallback(() => { - onEdit(controlUnitContact.id) - }, [controlUnitContact.id, onEdit]) - function formatPhoneNumber(phoneNumber: string) { - if (phoneNumber.startsWith('00')) { - return `00 ${phoneNumber - .slice(2) - .match(/.{1,3}/g) - ?.join(' ')}` - } - if (phoneNumber.startsWith('0')) { +export function formatPhoneNumber(phoneNumber: string) { + if (phoneNumber.startsWith('00')) { + if (phoneNumber.length === 12) { return phoneNumber.match(/.{1,2}/g)?.join(' ') } - return phoneNumber.match(/.{1,3}/g)?.join(' ') + return `00 ${phoneNumber + .slice(2) + .match(/.{1,3}/g) + ?.join(' ')}` + } + if (phoneNumber.startsWith('0')) { + return phoneNumber.match(/.{1,2}/g)?.join(' ') } + return phoneNumber.match(/.{1,3}/g)?.join(' ') +} + +export function Item({ controlUnitContact, onEdit }: ItemProps) { + const handleEdit = useCallback(() => { + onEdit(controlUnitContact.id) + }, [controlUnitContact.id, onEdit]) + return ( diff --git a/frontend/src/features/ControlUnit/components/ControlUnitDialog/ControlUnitContactList/__tests__/formatPhoneNumber.test.ts b/frontend/src/features/ControlUnit/components/ControlUnitDialog/ControlUnitContactList/__tests__/formatPhoneNumber.test.ts new file mode 100644 index 0000000000..9b1929b08f --- /dev/null +++ b/frontend/src/features/ControlUnit/components/ControlUnitDialog/ControlUnitContactList/__tests__/formatPhoneNumber.test.ts @@ -0,0 +1,49 @@ +import { describe, expect, it } from '@jest/globals' + +import { formatPhoneNumber } from '../Item' + +describe('Phone Number format', () => { + it('should format international number starting with 00 then 3 by 3', async () => { + // Given + const phoneNumber = '00111222333444' + + // When + const formattedNumber = formatPhoneNumber(phoneNumber) + + // Then + expect(formattedNumber).toEqual('00 111 222 333 444') + }) + + it('should format international french number starting with 00 then 2 by 2', async () => { + // Given + const phoneNumber = '003344556677' + + // When + const formattedNumber = formatPhoneNumber(phoneNumber) + + // Then + expect(formattedNumber).toEqual('00 33 44 55 66 77') + }) + + it('should format french number 2 by 2', async () => { + // Given + const phoneNumber = '0122334455' + + // When + const formattedNumber = formatPhoneNumber(phoneNumber) + + // Then + expect(formattedNumber).toEqual('01 22 33 44 55') + }) + + it('should format other format 3 by 3', async () => { + // Given + const phoneNumber = '+33123456789100' + + // When + const formattedNumber = formatPhoneNumber(phoneNumber) + + // Then + expect(formattedNumber).toEqual('+33 123 456 789 100') + }) +}) diff --git a/frontend/src/features/Reportings/components/ReportingForm/Header.tsx b/frontend/src/features/Reportings/components/ReportingForm/Header.tsx index cdb7b12bb2..623be23cae 100644 --- a/frontend/src/features/Reportings/components/ReportingForm/Header.tsx +++ b/frontend/src/features/Reportings/components/ReportingForm/Header.tsx @@ -61,7 +61,7 @@ export function Header({ diff --git a/frontend/src/features/Reportings/components/ReportingsList/Cells/ButtonsRowGroup.tsx b/frontend/src/features/Reportings/components/ReportingsList/Cells/ButtonsRowGroup.tsx index 27f9184442..726e009360 100644 --- a/frontend/src/features/Reportings/components/ReportingsList/Cells/ButtonsRowGroup.tsx +++ b/frontend/src/features/Reportings/components/ReportingsList/Cells/ButtonsRowGroup.tsx @@ -78,7 +78,7 @@ export function ButtonsGroupRow({ id }) { />