@cnamts/synapse 1.0.23 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -5
- package/dist/AutocompleteFilter-D7qBuCAP.js +114 -0
- package/dist/AutocompleteFilter-Df9i5mAl.cjs +1 -0
- package/dist/DateFilter-BJD6FMev.cjs +1 -0
- package/dist/{DateFilter-Dc-gSGwk.js → DateFilter-BitMWrMU.js} +1 -1
- package/dist/{NumberFilter-vP38Wp6j.js → NumberFilter-BTLUxw0a.js} +3 -3
- package/dist/NumberFilter-DGCzCXzI.cjs +1 -0
- package/dist/{PeriodFilter-Ba1uYUnT.js → PeriodFilter-B5rUIPAC.js} +1 -1
- package/dist/PeriodFilter-DO_ecTZW.cjs +1 -0
- package/dist/SelectFilter-CGwcKWLm.cjs +1 -0
- package/dist/SelectFilter-l4QnRcuk.js +135 -0
- package/dist/TextFilter-B8nf7xoK.cjs +1 -0
- package/dist/{TextFilter-B84dpnoq.js → TextFilter-C9hj6Qrp.js} +7 -7
- package/dist/apLightTheme-CEK4iY3f.cjs +1 -0
- package/dist/apLightTheme-DnIM24Lv.js +950 -0
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +60 -60
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
- package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7501 -10095
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +21 -21
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +41 -41
- package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
- package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +117 -151
- package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +5 -5
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -16
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +8 -8
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +31 -506
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +28 -506
- package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +69 -89
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +627 -791
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +315 -412
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +112 -160
- package/dist/components/DatePicker/composables/index.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
- package/dist/components/DatePicker/composables/useDatePickerState.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
- package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
- package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
- package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
- package/dist/components/FileList/FileList.d.ts +6 -0
- package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +17 -17
- package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
- package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
- package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
- package/dist/components/MonthPicker/MonthPicker.d.ts +86 -127
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +85 -126
- package/dist/components/NirField/NirField.d.ts +202 -278
- package/dist/components/NirField/locales.d.ts +10 -10
- package/dist/components/NirField/useNirValidation.d.ts +64 -0
- package/dist/components/PasswordField/PasswordField.d.ts +8 -9
- package/dist/components/PeriodField/PeriodField.d.ts +1352 -1680
- package/dist/components/PhoneField/PhoneField.d.ts +88 -129
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
- package/dist/components/SyTextArea/SyTextArea.d.ts +34 -14
- package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +10 -6
- package/dist/components/Tables/SyTable/SyTable.d.ts +10 -6
- package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
- package/dist/components/Tables/common/SyTablePagination.d.ts +19 -19
- package/dist/components/Tables/common/TableHeader.d.ts +5 -0
- package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
- package/dist/components/Tables/common/filters/locales.d.ts +0 -1
- package/dist/components/Tables/common/locales.d.ts +3 -0
- package/dist/components/Tables/common/types.d.ts +21 -3
- package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
- package/dist/components/Tables/common/usePagination.d.ts +3 -1
- package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
- package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
- package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
- package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +7 -6
- package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
- package/dist/composables/rules/useFieldValidation.d.ts +4 -4
- package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
- package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
- package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
- package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
- package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
- package/dist/composables/validation/useFormValidation.d.ts +11 -2
- package/dist/composables/validation/useValidation.d.ts +19 -9
- package/dist/design-system-v3.d.ts +2 -0
- package/dist/design-system-v3.js +186 -187
- package/dist/design-system-v3.umd.cjs +1 -1066
- package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
- package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
- package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
- package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
- package/dist/designTokens/tokens/baseColors.d.ts +127 -0
- package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
- package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
- package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
- package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
- package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
- package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
- package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
- package/dist/designTokens/utils/index.d.ts +2 -2
- package/dist/main-ByDPHpae.cjs +1067 -0
- package/dist/main-Cpx8Co6H.js +38869 -0
- package/dist/main.d.ts +0 -1
- package/dist/synapse.css +1 -0
- package/dist/tooth-11-D3sLWv2n.cjs +1 -0
- package/dist/tooth-12-CXrLuH03.cjs +1 -0
- package/dist/tooth-13-BSfo5fpT.cjs +1 -0
- package/dist/tooth-14-DMzulx0h.cjs +1 -0
- package/dist/tooth-15-BKRFVi-9.cjs +1 -0
- package/dist/tooth-16-CpuxAbuM.cjs +1 -0
- package/dist/tooth-17-BPoahUdg.cjs +1 -0
- package/dist/tooth-18-DhHJz8sy.cjs +1 -0
- package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
- package/dist/tooth-22-C2Tn19sB.cjs +1 -0
- package/dist/tooth-23-C9uaaSGb.cjs +1 -0
- package/dist/tooth-24-BrK9UGpf.cjs +1 -0
- package/dist/tooth-25-CE_EfGNp.cjs +1 -0
- package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
- package/dist/tooth-27-C5J7JkWM.cjs +1 -0
- package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
- package/dist/tooth-31-BrYqmkTi.cjs +1 -0
- package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
- package/dist/tooth-33-DuxvqO2J.cjs +1 -0
- package/dist/tooth-34-BCSCXMB6.cjs +1 -0
- package/dist/tooth-35-BLUXkX88.cjs +1 -0
- package/dist/tooth-36-IrKHYqlA.cjs +1 -0
- package/dist/tooth-37-BYqpdMwo.cjs +1 -0
- package/dist/tooth-38-B_eNXXdu.cjs +1 -0
- package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
- package/dist/tooth-42-szcDqlM0.cjs +1 -0
- package/dist/tooth-43-B3ka6rQm.cjs +1 -0
- package/dist/tooth-44-CazyQucj.cjs +1 -0
- package/dist/tooth-45-B4HQtc8n.cjs +1 -0
- package/dist/tooth-46-BPM40gbG.cjs +1 -0
- package/dist/tooth-47-Dvr20dlh.cjs +1 -0
- package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
- package/dist/tooth-51-OBpwCOF3.cjs +1 -0
- package/dist/tooth-52-aKxyHcmq.cjs +1 -0
- package/dist/tooth-53-vCwJjTOc.cjs +1 -0
- package/dist/tooth-54-DsWu2iFy.cjs +1 -0
- package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
- package/dist/tooth-61-BbLvxMQi.cjs +1 -0
- package/dist/tooth-62-CmTkWczP.cjs +1 -0
- package/dist/tooth-63-DI7l_2qI.cjs +1 -0
- package/dist/tooth-64-B21sOsJh.cjs +1 -0
- package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
- package/dist/tooth-71-D473PPO5.cjs +1 -0
- package/dist/tooth-72-Drh1wnNu.cjs +1 -0
- package/dist/tooth-73-DzlwYI23.cjs +1 -0
- package/dist/tooth-74-8aGvcZPg.cjs +1 -0
- package/dist/tooth-75-BFK7At_r.cjs +1 -0
- package/dist/tooth-81-BZmR-I0M.cjs +1 -0
- package/dist/tooth-82-euVfUUZV.cjs +1 -0
- package/dist/tooth-83-KV010j64.cjs +1 -0
- package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
- package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
- package/dist/utils/functions/classToHex.d.ts +1 -1
- package/dist/utils/functions/createHexResolver.d.ts +16 -0
- package/dist/vuetifyConfig.js +522 -0
- package/dist/vuetifyConfig.umd.cjs +1 -0
- package/package.json +37 -20
- package/src/assets/amelipro/apTokens2026.scss +5 -5
- package/src/assets/overrides/_breakpoints.scss +25 -0
- package/src/assets/overrides/_btns.scss +0 -8
- package/src/assets/overrides/_forms.scss +1 -3
- package/src/assets/overrides/_icons.scss +14 -10
- package/src/assets/overrides/_otp.scss +41 -0
- package/src/assets/overrides/_tables.scss +11 -20
- package/src/assets/overrides/_tooltips.scss +17 -7
- package/src/assets/overrides/_typography.scss +35 -47
- package/src/assets/overrides/_utilities.scss +43 -47
- package/src/assets/themes.scss +1 -0
- package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
- package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
- package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
- package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
- package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
- package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
- package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
- package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
- package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
- package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
- package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
- package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
- package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
- package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
- package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
- package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
- package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
- package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
- package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
- package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
- package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
- package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
- package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
- package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
- package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
- package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
- package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
- package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
- package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
- package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
- package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
- package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
- package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
- package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
- package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
- package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
- package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
- package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
- package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
- package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
- package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
- package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
- package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
- package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
- package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
- package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
- package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
- package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
- package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
- package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
- package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
- package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
- package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
- package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
- package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
- package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
- package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
- package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
- package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
- package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
- package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
- package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
- package/src/components/Captcha/Captcha.vue +1 -3
- package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +12 -12
- package/src/components/ChipList/ChipList.stories.ts +0 -15
- package/src/components/ChipList/ChipList.vue +19 -17
- package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
- package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
- package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +0 -2
- package/src/components/CopyBtn/CopyBtn.vue +1 -3
- package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
- package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +0 -9
- package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +28 -7
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +209 -0
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +14 -10
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +12 -15
- package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +1 -39
- package/src/components/Customs/Selects/SySelect/SySelect.vue +274 -71
- package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +89 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
- package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +45 -11
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +53 -3
- package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
- package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
- package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
- package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
- package/src/components/Customs/SyTabs/SyTabs.stories.ts +32 -33
- package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
- package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
- package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
- package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
- package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +50 -68
- package/src/components/Customs/SyTextField/SyTextField.vue +156 -161
- package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +32 -0
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +120 -11
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +342 -237
- package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +215 -175
- package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +33 -10
- package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
- package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
- package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
- package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
- package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +71 -67
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
- package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
- package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
- package/src/components/DatePicker/composables/index.ts +1 -0
- package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
- package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
- package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
- package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
- package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
- package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
- package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
- package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
- package/src/components/DatePicker/composables/useDatePickerState.ts +24 -0
- package/src/components/DatePicker/composables/useDateTextField.ts +6 -6
- package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
- package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
- package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
- package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
- package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
- package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
- package/src/components/DialogBox/DialogBox.vue +3 -5
- package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
- package/src/components/FileList/FileList.vue +9 -2
- package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
- package/src/components/FileList/tests/FileList.spec.ts +47 -0
- package/src/components/FileUpload/FileUpload.vue +3 -5
- package/src/components/FileUpload/FileUploadContent.vue +3 -5
- package/src/components/FilterInline/FilterInline.vue +1 -3
- package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
- package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
- package/src/components/FilterSideBar/FilterSideBar.vue +7 -0
- package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
- package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
- package/src/components/FooterBar/FooterBar.vue +9 -13
- package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
- package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
- package/src/components/HeaderBar/HeaderBar.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
- package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
- package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
- package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
- package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
- package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
- package/src/components/LangBtn/LangBtn.vue +2 -4
- package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
- package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
- package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
- package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
- package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
- package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
- package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
- package/src/components/MonthPicker/tests/MonthPicker.spec.ts +2 -1
- package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +7 -7
- package/src/components/NirField/NirField.stories.ts +6 -2
- package/src/components/NirField/NirField.vue +67 -265
- package/src/components/NirField/accessibilite/Accessibility.mdx +102 -7
- package/src/components/NirField/locales.ts +1 -1
- package/src/components/NirField/tests/NirField.spec.ts +124 -0
- package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
- package/src/components/NirField/useNirValidation.ts +277 -0
- package/src/components/NotificationBar/Notification/Notification.vue +5 -7
- package/src/components/NotificationBar/NotificationBar.vue +1 -3
- package/src/components/PaginatedTable/PaginatedTable.vue +2 -3
- package/src/components/PaginatedTable/Pagination.vue +3 -5
- package/src/components/PasswordField/PasswordField.stories.ts +4 -4
- package/src/components/PasswordField/PasswordField.vue +26 -34
- package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
- package/src/components/PeriodField/PeriodField.stories.ts +4 -4
- package/src/components/PeriodField/PeriodField.vue +57 -57
- package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
- package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
- package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
- package/src/components/PhoneField/PhoneField.vue +8 -9
- package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
- package/src/components/RangeField/RangeField.vue +6 -0
- package/src/components/RangeField/RangeSlider/RangeSlider.vue +0 -2
- package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
- package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
- package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +6 -8
- package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +3 -5
- package/src/components/SearchListField/SearchListField.vue +0 -2
- package/src/components/SkipLink/SkipLink.vue +2 -4
- package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
- package/src/components/SubHeader/SubHeader.vue +1 -1
- package/src/components/SyAlert/SyAlert.vue +7 -9
- package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
- package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
- package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
- package/src/components/SyTextArea/SyTextArea.vue +53 -23
- package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
- package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
- package/src/components/TableToolbar/TableToolbar.vue +6 -8
- package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +839 -1
- package/src/components/Tables/SyServerTable/SyServerTable.vue +154 -95
- package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +81 -0
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +390 -0
- package/src/components/Tables/SyTable/SyTable.mdx +25 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +556 -1
- package/src/components/Tables/SyTable/SyTable.vue +136 -60
- package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +79 -0
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +382 -0
- package/src/components/Tables/common/SyTableFilter.vue +49 -4
- package/src/components/Tables/common/SyTablePagination.vue +142 -19
- package/src/components/Tables/common/TableHeader.vue +45 -4
- package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
- package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
- package/src/components/Tables/common/filters/SelectFilter.vue +11 -12
- package/src/components/Tables/common/filters/TextFilter.vue +1 -1
- package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
- package/src/components/Tables/common/filters/locales.ts +0 -1
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
- package/src/components/Tables/common/locales.ts +3 -0
- package/src/components/Tables/common/tableFilterUtils.ts +3 -0
- package/src/components/Tables/common/tableStyles.scss +60 -19
- package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
- package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
- package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
- package/src/components/Tables/common/types.ts +15 -4
- package/src/components/Tables/common/useClickableTableRow.ts +103 -0
- package/src/components/Tables/common/usePagination.ts +13 -0
- package/src/components/Tables/common/usePinnedColumns.ts +237 -0
- package/src/components/Tables/common/useTableHeaders.ts +52 -30
- package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
- package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
- package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
- package/src/components/UploadWorkflow/useFileList.ts +3 -0
- package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
- package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
- package/src/composables/date/useDatePickerAccessibility.ts +42 -207
- package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
- package/src/composables/rules/useFieldValidation.ts +34 -17
- package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
- package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
- package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
- package/src/composables/unifyValidation/useValidation.ts +190 -0
- package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
- package/src/composables/useFormFieldErrorHandling.ts +4 -7
- package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
- package/src/composables/validation/tests/useValidation.spec.ts +116 -21
- package/src/composables/validation/useFormValidation.ts +20 -13
- package/src/composables/validation/useValidatable.ts +8 -1
- package/src/composables/validation/useValidation.ts +151 -99
- package/src/composantsVuetify/Introduction.mdx +48 -0
- package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
- package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
- package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
- package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
- package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
- package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
- package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
- package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
- package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
- package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
- package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
- package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
- package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
- package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
- package/src/designTokens/tests/themeUtils.spec.ts +53 -0
- package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
- package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
- package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
- package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -1
- package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
- package/src/designTokens/tokens/baseColors.ts +129 -0
- package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
- package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
- package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
- package/src/designTokens/tokens/cnam/cnamLightTheme.ts +1 -1
- package/src/designTokens/tokens/cnam/cnamSemantic.ts +3 -3
- package/src/designTokens/tokens/pa/paColors.ts +2 -166
- package/src/designTokens/tokens/pa/paContextual.ts +3 -48
- package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
- package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
- package/src/designTokens/utils/buildColorClassMap.ts +34 -0
- package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
- package/src/designTokens/utils/createFlattenTheme.ts +15 -7
- package/src/designTokens/utils/index.ts +2 -2
- package/src/main.ts +0 -2
- package/src/stories/Accessibilite/AuditDesignSystem.mdx +0 -11
- package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
- package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
- package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +8 -1
- package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +51 -10
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +16 -9
- package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +48 -58
- package/src/stories/Components/Components.stories.ts +113 -9
- package/src/stories/Demarrer/Accueil.stories.ts +3 -3
- package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
- package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
- package/src/stories/Demarrer/Releases.stories.ts +48 -5
- package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
- package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
- package/src/stories/DesignTokens/colors.stories.ts +5 -6
- package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
- package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
- package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
- package/src/stories/GuideDuDev/Theme.mdx +36 -26
- package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
- package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
- package/src/stories/styles/accessibility-guide.css +3 -3
- package/src/utils/functions/classToHex.ts +6 -34
- package/src/utils/functions/createHexResolver.ts +45 -0
- package/src/utils/functions/tests/classToHex.spec.ts +36 -0
- package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
- package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
- package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
- package/dist/SelectFilter-BioGT6Nn.js +0 -136
- package/dist/designTokens/utils/convertGaps.d.ts +0 -5
- package/dist/main-aLKwdMi1.js +0 -37886
- package/dist/style.css +0 -1
- package/src/assets/apTokens.scss +0 -343
- package/src/assets/overrides/_container.scss +0 -36
- package/src/assets/tokens.scss +0 -388
- package/src/components/DatePicker/Accessibilite.mdx +0 -14
- package/src/designTokens/apColors.md +0 -66
- package/src/designTokens/cnamColors.md +0 -193
- package/src/designTokens/paColors.md +0 -66
- package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
- package/src/designTokens/tokens/json/primitives.json +0 -209
- package/src/designTokens/tokens/json/semantic.json +0 -120
- package/src/designTokens/utils/convertGaps.ts +0 -11
- package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
- package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +0 -306
|
@@ -67,6 +67,7 @@ describe('NirField.vue', () => {
|
|
|
67
67
|
})
|
|
68
68
|
|
|
69
69
|
it('displays error message for invalid NIR length', async () => {
|
|
70
|
+
await wrapper.find('.number-field input').trigger('focus')
|
|
70
71
|
await wrapper.find('.number-field input').setValue('123')
|
|
71
72
|
await wrapper.vm.$nextTick()
|
|
72
73
|
await wrapper.find('.number-field input').trigger('blur')
|
|
@@ -76,6 +77,7 @@ describe('NirField.vue', () => {
|
|
|
76
77
|
})
|
|
77
78
|
|
|
78
79
|
it('validates the NIR field successfully', async () => {
|
|
80
|
+
await wrapper.find('.number-field input').trigger('focus')
|
|
79
81
|
await wrapper.find('.number-field input').setValue('2940375120005')
|
|
80
82
|
await wrapper.vm.$nextTick()
|
|
81
83
|
await wrapper.find('.number-field input').trigger('blur')
|
|
@@ -87,6 +89,7 @@ describe('NirField.vue', () => {
|
|
|
87
89
|
it('displays error message for invalid key length', async () => {
|
|
88
90
|
await wrapper.find('.number-field input').setValue('2940375120005')
|
|
89
91
|
await wrapper.vm.$nextTick()
|
|
92
|
+
await wrapper.find('.key-field input').trigger('focus')
|
|
90
93
|
await wrapper.find('.key-field input').setValue('1')
|
|
91
94
|
await wrapper.vm.$nextTick()
|
|
92
95
|
await wrapper.find('.key-field input').trigger('blur')
|
|
@@ -98,6 +101,7 @@ describe('NirField.vue', () => {
|
|
|
98
101
|
it('validates the key field successfully', async () => {
|
|
99
102
|
await wrapper.find('.number-field input').setValue('2940375120005')
|
|
100
103
|
await wrapper.vm.$nextTick()
|
|
104
|
+
await wrapper.find('.key-field input').trigger('focus')
|
|
101
105
|
await wrapper.find('.key-field input').setValue('91')
|
|
102
106
|
await wrapper.vm.$nextTick()
|
|
103
107
|
await wrapper.find('.key-field input').trigger('blur')
|
|
@@ -149,6 +153,7 @@ describe('NirField.vue', () => {
|
|
|
149
153
|
|
|
150
154
|
const customWrapper = mount(NirField, {
|
|
151
155
|
props: {
|
|
156
|
+
label: 'NIR Field with custom key validation',
|
|
152
157
|
modelValue: undefined,
|
|
153
158
|
customKeyRules,
|
|
154
159
|
showSuccessMessages: true,
|
|
@@ -164,6 +169,7 @@ describe('NirField.vue', () => {
|
|
|
164
169
|
const numberField = customWrapper.find('.number-field input')
|
|
165
170
|
const keyField = customWrapper.find('.key-field input')
|
|
166
171
|
await numberField.setValue('2940375120005')
|
|
172
|
+
await keyField.trigger('focus')
|
|
167
173
|
await keyField.setValue('91')
|
|
168
174
|
await keyField.trigger('blur')
|
|
169
175
|
await customWrapper.vm.$nextTick()
|
|
@@ -365,6 +371,124 @@ describe('NirField.vue', () => {
|
|
|
365
371
|
})
|
|
366
372
|
})
|
|
367
373
|
|
|
374
|
+
describe('Configuration UI et UX', () => {
|
|
375
|
+
it('applies disabled state to both inputs', async () => {
|
|
376
|
+
await wrapper.setProps({ disabled: true })
|
|
377
|
+
await wrapper.vm.$nextTick()
|
|
378
|
+
await flushPromises()
|
|
379
|
+
|
|
380
|
+
const numberInput = wrapper.find('.number-field input')
|
|
381
|
+
const keyInput = wrapper.find('.key-field input')
|
|
382
|
+
|
|
383
|
+
expect(numberInput.attributes('disabled')).toBeDefined()
|
|
384
|
+
expect(keyInput.attributes('disabled')).toBeDefined()
|
|
385
|
+
})
|
|
386
|
+
|
|
387
|
+
it('applies readonly state to both inputs', async () => {
|
|
388
|
+
await wrapper.setProps({ readonly: true })
|
|
389
|
+
await wrapper.vm.$nextTick()
|
|
390
|
+
await flushPromises()
|
|
391
|
+
|
|
392
|
+
const numberInput = wrapper.find('.number-field input')
|
|
393
|
+
const keyInput = wrapper.find('.key-field input')
|
|
394
|
+
|
|
395
|
+
expect(numberInput.attributes('readonly')).toBeDefined()
|
|
396
|
+
expect(keyInput.attributes('readonly')).toBeDefined()
|
|
397
|
+
})
|
|
398
|
+
|
|
399
|
+
it('respects showSuccessMessages prop', async () => {
|
|
400
|
+
// Par défaut, showSuccessMessages = true
|
|
401
|
+
await wrapper.setProps({ showSuccessMessages: true })
|
|
402
|
+
|
|
403
|
+
// On ne peut pas tester facilement le DOM de VMessages dans ce contexte jsdom avec Vuetify
|
|
404
|
+
// On vérifie donc que la prop showSuccessMessages est bien transmise aux éléments enfants
|
|
405
|
+
// internes si applicable, ou que le comportement conditionnel est correctement câblé.
|
|
406
|
+
// La prop showSuccessMessages est utilisée dans v-show="numberValidation.hasSuccess.value && showSuccessMessages"
|
|
407
|
+
|
|
408
|
+
// Pour tester que Vue applique bien la condition, on vérifie l'état de notre wrapper
|
|
409
|
+
expect(wrapper.props('showSuccessMessages')).toBe(true)
|
|
410
|
+
|
|
411
|
+
// Avec showSuccessMessages = false
|
|
412
|
+
await wrapper.setProps({ showSuccessMessages: false })
|
|
413
|
+
await wrapper.vm.$nextTick()
|
|
414
|
+
await flushPromises()
|
|
415
|
+
|
|
416
|
+
expect(wrapper.props('showSuccessMessages')).toBe(false)
|
|
417
|
+
|
|
418
|
+
// On vérifie également que l'attribut est passé aux sous-composants s'ils l'utilisent
|
|
419
|
+
const textFields = wrapper.findAllComponents({ name: 'SyTextField' })
|
|
420
|
+
// SyTextField a showSuccessMessages false en dur dans NirField
|
|
421
|
+
expect(textFields[0]?.props('showSuccessMessages')).toBe(false)
|
|
422
|
+
})
|
|
423
|
+
|
|
424
|
+
it('respects disableErrorHandling prop', async () => {
|
|
425
|
+
await wrapper.setProps({ disableErrorHandling: true })
|
|
426
|
+
|
|
427
|
+
const numberField = wrapper.find('.number-field input')
|
|
428
|
+
await numberField.setValue('123') // Invalid NIR
|
|
429
|
+
await numberField.trigger('blur')
|
|
430
|
+
await wrapper.vm.$nextTick()
|
|
431
|
+
await flushPromises()
|
|
432
|
+
|
|
433
|
+
// La validation a lieu, mais disableErrorHandling est appliqué
|
|
434
|
+
const numberTextField = wrapper.findComponent({ name: 'SyTextField' })
|
|
435
|
+
expect(numberTextField.props('disableErrorHandling')).toBe(true)
|
|
436
|
+
})
|
|
437
|
+
|
|
438
|
+
it('renders tooltips correctly when provided', async () => {
|
|
439
|
+
const nirTooltip = 'Tooltip NIR'
|
|
440
|
+
const keyTooltip = 'Tooltip Clé'
|
|
441
|
+
await wrapper.setProps({
|
|
442
|
+
nirTooltip,
|
|
443
|
+
keyTooltip,
|
|
444
|
+
})
|
|
445
|
+
await wrapper.vm.$nextTick()
|
|
446
|
+
await flushPromises()
|
|
447
|
+
|
|
448
|
+
// Les tooltips sont passés aux SyTextField en tant que props 'appendTooltip' (par défaut)
|
|
449
|
+
const textFields = wrapper.findAllComponents({ name: 'SyTextField' })
|
|
450
|
+
|
|
451
|
+
expect(textFields[0]?.props('appendTooltip')).toBe(nirTooltip)
|
|
452
|
+
expect(textFields[1]?.props('appendTooltip')).toBe(keyTooltip)
|
|
453
|
+
})
|
|
454
|
+
|
|
455
|
+
it('renders asterisks correctly when displayAsterisk is true AND required is true', async () => {
|
|
456
|
+
// L'astérisque n'est affiché que si required = true ET displayAsterisk = true
|
|
457
|
+
await wrapper.setProps({ required: true, displayAsterisk: true, numberLabel: 'Numéro', keyLabel: 'Clé' })
|
|
458
|
+
await wrapper.vm.$nextTick()
|
|
459
|
+
await flushPromises()
|
|
460
|
+
|
|
461
|
+
// Dans NirField.vue, l'astérisque est ajouté directement à la string 'label'
|
|
462
|
+
// transmise aux composants enfants
|
|
463
|
+
const textFields = wrapper.findAllComponents({ name: 'SyTextField' })
|
|
464
|
+
expect(textFields[0]?.props('label')).toBe('Numéro *')
|
|
465
|
+
expect(textFields[1]?.props('label')).toBe('Clé *')
|
|
466
|
+
|
|
467
|
+
// Si on désactive l'astérisque
|
|
468
|
+
await wrapper.setProps({ displayAsterisk: false })
|
|
469
|
+
await wrapper.vm.$nextTick()
|
|
470
|
+
await flushPromises()
|
|
471
|
+
|
|
472
|
+
expect(textFields[0]?.props('label')).toBe('Numéro')
|
|
473
|
+
expect(textFields[1]?.props('label')).toBe('Clé')
|
|
474
|
+
})
|
|
475
|
+
|
|
476
|
+
it('removes fieldset when withoutFieldset is true', async () => {
|
|
477
|
+
// Par défaut, le fieldset est présent quand displayKey est true
|
|
478
|
+
expect(wrapper.find('fieldset').exists()).toBe(true)
|
|
479
|
+
|
|
480
|
+
await wrapper.setProps({ withoutFieldset: true })
|
|
481
|
+
await wrapper.vm.$nextTick()
|
|
482
|
+
await flushPromises()
|
|
483
|
+
|
|
484
|
+
// Le fieldset ne doit plus être présent
|
|
485
|
+
expect(wrapper.find('fieldset').exists()).toBe(false)
|
|
486
|
+
// Mais les champs doivent toujours être là
|
|
487
|
+
expect(wrapper.find('.number-field').exists()).toBe(true)
|
|
488
|
+
expect(wrapper.find('.key-field').exists()).toBe(true)
|
|
489
|
+
})
|
|
490
|
+
})
|
|
491
|
+
|
|
368
492
|
describe('Cursor position preservation when displayKey=false', () => {
|
|
369
493
|
let wrapperWithoutKey: ReturnType<typeof mount<typeof NirField>>
|
|
370
494
|
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
|
|
2
|
+
import { mount } from '@vue/test-utils'
|
|
3
|
+
import NirField from '../NirField.vue'
|
|
4
|
+
import { locales } from '../locales'
|
|
5
|
+
import { useValidation } from '@/composables/unifyValidation/useValidation'
|
|
6
|
+
|
|
7
|
+
describe('useNirValidation via NirField component', () => {
|
|
8
|
+
let wrapper: ReturnType<typeof mount<typeof NirField & {
|
|
9
|
+
numberValidation: ReturnType<typeof useValidation>
|
|
10
|
+
keyValidation: ReturnType<typeof useValidation>
|
|
11
|
+
validateOnSubmit: () => Promise<boolean>
|
|
12
|
+
}>>
|
|
13
|
+
let activeWrappers: ReturnType<typeof mount>[] = []
|
|
14
|
+
|
|
15
|
+
async function flushPromises() {
|
|
16
|
+
return new Promise(resolve => setTimeout(resolve, 0))
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const createWrapper = async (props = {}) => {
|
|
20
|
+
const w = mount(NirField, {
|
|
21
|
+
props: {
|
|
22
|
+
modelValue: undefined,
|
|
23
|
+
...props,
|
|
24
|
+
},
|
|
25
|
+
})
|
|
26
|
+
activeWrappers.push(w)
|
|
27
|
+
await w.vm.$nextTick()
|
|
28
|
+
await flushPromises()
|
|
29
|
+
return w
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
activeWrappers = []
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
afterEach(async () => {
|
|
37
|
+
await flushPromises()
|
|
38
|
+
for (const w of activeWrappers) {
|
|
39
|
+
if (w && typeof w.unmount === 'function') {
|
|
40
|
+
w.unmount()
|
|
41
|
+
await flushPromises()
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
activeWrappers = []
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('ne devrait pas afficher d\'erreurs custom si useVuetifyValidation est vrai', async () => {
|
|
48
|
+
wrapper = await createWrapper({ useVuetifyValidation: true, required: true })
|
|
49
|
+
|
|
50
|
+
await wrapper.find('.number-field input').trigger('focus')
|
|
51
|
+
await wrapper.find('.number-field input').trigger('blur')
|
|
52
|
+
await wrapper.vm.$nextTick()
|
|
53
|
+
await flushPromises()
|
|
54
|
+
|
|
55
|
+
// Les règles custom ne sont pas appliquées, donc le système de validation custom ne remonte pas d'erreur
|
|
56
|
+
expect(wrapper.vm.numberValidation.errors.value).toEqual([])
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('devrait afficher une erreur required si le champ est vide et required est vrai', async () => {
|
|
60
|
+
wrapper = await createWrapper({ required: true })
|
|
61
|
+
|
|
62
|
+
await wrapper.find('.number-field input').trigger('focus')
|
|
63
|
+
await wrapper.find('.number-field input').trigger('blur')
|
|
64
|
+
await wrapper.vm.$nextTick()
|
|
65
|
+
await flushPromises()
|
|
66
|
+
|
|
67
|
+
expect(wrapper.vm.numberValidation.errors.value).toContain(locales.errorRequiredNumber)
|
|
68
|
+
|
|
69
|
+
await wrapper.find('.key-field input').trigger('focus')
|
|
70
|
+
await wrapper.find('.key-field input').trigger('blur')
|
|
71
|
+
await wrapper.vm.$nextTick()
|
|
72
|
+
await flushPromises()
|
|
73
|
+
|
|
74
|
+
expect(wrapper.vm.keyValidation.errors.value).toContain(locales.errorRequiredKey)
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
it('devrait valider correctement le NIR (valide et invalide)', async () => {
|
|
78
|
+
wrapper = await createWrapper()
|
|
79
|
+
|
|
80
|
+
const numberInput = wrapper.find('.number-field input')
|
|
81
|
+
|
|
82
|
+
// Test invalide (trop court)
|
|
83
|
+
await numberInput.trigger('focus')
|
|
84
|
+
await numberInput.setValue('123456789012')
|
|
85
|
+
await numberInput.trigger('blur')
|
|
86
|
+
await wrapper.vm.$nextTick()
|
|
87
|
+
await flushPromises()
|
|
88
|
+
expect(wrapper.vm.numberValidation.errors.value).toContain(locales.errorInvalidNumber)
|
|
89
|
+
|
|
90
|
+
// Test invalide (mauvais NIR - sexe 0 invalide)
|
|
91
|
+
await numberInput.trigger('focus')
|
|
92
|
+
await numberInput.setValue('0000000000000')
|
|
93
|
+
await numberInput.trigger('blur')
|
|
94
|
+
await wrapper.vm.$nextTick()
|
|
95
|
+
await flushPromises()
|
|
96
|
+
expect(wrapper.vm.numberValidation.errors.value).toContain(locales.errorInvalidNumber)
|
|
97
|
+
|
|
98
|
+
// Test valide
|
|
99
|
+
await numberInput.trigger('focus')
|
|
100
|
+
await numberInput.setValue('2940375120005')
|
|
101
|
+
await numberInput.trigger('blur')
|
|
102
|
+
await wrapper.vm.$nextTick()
|
|
103
|
+
await flushPromises()
|
|
104
|
+
expect(wrapper.vm.numberValidation.errors.value).toEqual([])
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
it('devrait valider correctement la clé', async () => {
|
|
108
|
+
wrapper = await createWrapper()
|
|
109
|
+
|
|
110
|
+
const numberInput = wrapper.find('.number-field input')
|
|
111
|
+
const keyInput = wrapper.find('.key-field input')
|
|
112
|
+
|
|
113
|
+
// Remplissons d'abord le NIR
|
|
114
|
+
await numberInput.setValue('2940375120005')
|
|
115
|
+
await wrapper.vm.$nextTick()
|
|
116
|
+
await flushPromises()
|
|
117
|
+
|
|
118
|
+
// Test clé invalide
|
|
119
|
+
await keyInput.trigger('focus')
|
|
120
|
+
await keyInput.setValue('90')
|
|
121
|
+
await keyInput.trigger('blur')
|
|
122
|
+
await wrapper.vm.$nextTick()
|
|
123
|
+
await flushPromises()
|
|
124
|
+
expect(wrapper.vm.keyValidation.errors.value).toContain(locales.errorInvalidKey)
|
|
125
|
+
|
|
126
|
+
// Test clé valide (clé attendue pour 2940375120005 est 91)
|
|
127
|
+
await keyInput.trigger('focus')
|
|
128
|
+
await keyInput.setValue('91')
|
|
129
|
+
await keyInput.trigger('blur')
|
|
130
|
+
await wrapper.vm.$nextTick()
|
|
131
|
+
await flushPromises()
|
|
132
|
+
expect(wrapper.vm.keyValidation.errors.value).toEqual([])
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
it('devrait appliquer la précédence des règles customNumberRules si customRulesPrecedence est vrai', async () => {
|
|
136
|
+
const customMessage = 'Erreur custom en premier'
|
|
137
|
+
const customRule1 = {
|
|
138
|
+
type: 'custom',
|
|
139
|
+
options: {
|
|
140
|
+
validate: () => customMessage,
|
|
141
|
+
message: customMessage,
|
|
142
|
+
},
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
wrapper = await createWrapper({
|
|
146
|
+
customRulesPrecedence: true,
|
|
147
|
+
customNumberRules: [customRule1],
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
const numberInput = wrapper.find('.number-field input')
|
|
151
|
+
await numberInput.trigger('focus')
|
|
152
|
+
await numberInput.setValue('0000000000000') // Valeur invalide selon checkNIR
|
|
153
|
+
await numberInput.trigger('blur')
|
|
154
|
+
await wrapper.vm.$nextTick()
|
|
155
|
+
await flushPromises()
|
|
156
|
+
|
|
157
|
+
// Comme la règle custom a la précédence, c'est son erreur qui s'affiche en premier
|
|
158
|
+
// (useValidation s'arrête à la première erreur)
|
|
159
|
+
expect(wrapper.vm.numberValidation.errors.value[0]).toBe(customMessage)
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
it('devrait appliquer les règles customNumberRules à la fin si customRulesPrecedence est faux', async () => {
|
|
163
|
+
const customMessage = 'Erreur custom en dernier'
|
|
164
|
+
const customRule1 = {
|
|
165
|
+
type: 'custom',
|
|
166
|
+
options: {
|
|
167
|
+
validate: () => customMessage,
|
|
168
|
+
message: customMessage,
|
|
169
|
+
},
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
wrapper = await createWrapper({
|
|
173
|
+
customRulesPrecedence: false,
|
|
174
|
+
customNumberRules: [customRule1],
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
const numberInput = wrapper.find('.number-field input')
|
|
178
|
+
await numberInput.trigger('focus')
|
|
179
|
+
await numberInput.setValue('0000000000000') // Valeur invalide selon checkNIR
|
|
180
|
+
await numberInput.trigger('blur')
|
|
181
|
+
await wrapper.vm.$nextTick()
|
|
182
|
+
await flushPromises()
|
|
183
|
+
|
|
184
|
+
// L'erreur par défaut checkNIR s'affiche en premier (useValidation s'arrête à la première)
|
|
185
|
+
expect(wrapper.vm.numberValidation.errors.value[0]).toBe(locales.errorInvalidNumber)
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
it('devrait utiliser customKeyRules et masquer la règle par défaut si elle a validate', async () => {
|
|
189
|
+
const customMessage = 'Clé custom invalide'
|
|
190
|
+
const customKeyRule = {
|
|
191
|
+
type: 'custom',
|
|
192
|
+
options: {
|
|
193
|
+
validate: () => customMessage,
|
|
194
|
+
message: customMessage,
|
|
195
|
+
},
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
wrapper = await createWrapper({
|
|
199
|
+
customKeyRules: [customKeyRule],
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
const keyInput = wrapper.find('.key-field input')
|
|
203
|
+
await keyInput.trigger('focus')
|
|
204
|
+
await keyInput.setValue('91')
|
|
205
|
+
await keyInput.trigger('blur')
|
|
206
|
+
await wrapper.vm.$nextTick()
|
|
207
|
+
await flushPromises()
|
|
208
|
+
|
|
209
|
+
// Seule la règle custom est appliquée (et elle retourne une erreur)
|
|
210
|
+
expect(wrapper.vm.keyValidation.errors.value[0]).toBe(customMessage)
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
it('devrait valider correctement les deux champs lors de l\'appel à validateOnSubmit()', async () => {
|
|
214
|
+
wrapper = await createWrapper()
|
|
215
|
+
|
|
216
|
+
// Set valid values
|
|
217
|
+
await wrapper.find('.number-field input').setValue('2940375120005')
|
|
218
|
+
await wrapper.find('.key-field input').setValue('91')
|
|
219
|
+
await wrapper.vm.$nextTick()
|
|
220
|
+
await flushPromises()
|
|
221
|
+
|
|
222
|
+
const isValid = await wrapper.vm.validateOnSubmit()
|
|
223
|
+
expect(isValid).toBe(true)
|
|
224
|
+
|
|
225
|
+
// Si on a des valeurs invalides
|
|
226
|
+
await wrapper.find('.key-field input').setValue('90')
|
|
227
|
+
await wrapper.vm.$nextTick()
|
|
228
|
+
await flushPromises()
|
|
229
|
+
|
|
230
|
+
const isInvalid = await wrapper.vm.validateOnSubmit()
|
|
231
|
+
expect(isInvalid).toBe(false)
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
it('devrait valider correctement un NIR avec un département corse (2A / 2B)', async () => {
|
|
235
|
+
wrapper = await createWrapper()
|
|
236
|
+
|
|
237
|
+
const numberInput = wrapper.find('.number-field input')
|
|
238
|
+
const keyInput = wrapper.find('.key-field input')
|
|
239
|
+
|
|
240
|
+
// Corsica suttana
|
|
241
|
+
// 1 90 01 2A 001 001 (remplace 2A par 19 -> 1900119001001)
|
|
242
|
+
// 1900119001001 % 97 = 41 -> Clé attendue: 97 - 41 = 56
|
|
243
|
+
await numberInput.trigger('focus')
|
|
244
|
+
await numberInput.setValue('190012A001001')
|
|
245
|
+
await numberInput.trigger('blur')
|
|
246
|
+
|
|
247
|
+
await keyInput.trigger('focus')
|
|
248
|
+
await keyInput.setValue('56')
|
|
249
|
+
await keyInput.trigger('blur')
|
|
250
|
+
|
|
251
|
+
await wrapper.vm.$nextTick()
|
|
252
|
+
await flushPromises()
|
|
253
|
+
|
|
254
|
+
expect(wrapper.vm.numberValidation.errors.value).toEqual([])
|
|
255
|
+
expect(wrapper.vm.keyValidation.errors.value).toEqual([])
|
|
256
|
+
|
|
257
|
+
// Corsica suprana
|
|
258
|
+
// 1 90 01 2B 001 001 (remplace 2B par 18 -> 1900118001001)
|
|
259
|
+
// 1900118001001 % 97 = 14 -> Clé attendue: 97 - 14 = 83
|
|
260
|
+
await numberInput.trigger('focus')
|
|
261
|
+
await numberInput.setValue('190012B001001')
|
|
262
|
+
await numberInput.trigger('blur')
|
|
263
|
+
|
|
264
|
+
await keyInput.trigger('focus')
|
|
265
|
+
await keyInput.setValue('83')
|
|
266
|
+
await keyInput.trigger('blur')
|
|
267
|
+
|
|
268
|
+
await wrapper.vm.$nextTick()
|
|
269
|
+
await flushPromises()
|
|
270
|
+
|
|
271
|
+
expect(wrapper.vm.numberValidation.errors.value).toEqual([])
|
|
272
|
+
expect(wrapper.vm.keyValidation.errors.value).toEqual([])
|
|
273
|
+
})
|
|
274
|
+
|
|
275
|
+
it('devrait appliquer des règles différentes selon le nirType (simple vs complexe)', async () => {
|
|
276
|
+
// Le mois '50' est valide pour 'simple' (accepte de 20 à 99 pour le mois)
|
|
277
|
+
// mais invalide pour 'complexe' (n'accepte que jusqu'à 42 pour les pseudo-mois)
|
|
278
|
+
// Format: S AA MM DDD C C C
|
|
279
|
+
// Homme (1), 90, mois 50, corse 2A, 001, 001
|
|
280
|
+
const invalidComplexNir = '190502A001001'
|
|
281
|
+
|
|
282
|
+
// Par défaut, nirType est 'simple' donc le NIR doit être valide
|
|
283
|
+
wrapper = await createWrapper()
|
|
284
|
+
let numberInput = wrapper.find('.number-field input')
|
|
285
|
+
|
|
286
|
+
await numberInput.trigger('focus')
|
|
287
|
+
await numberInput.setValue(invalidComplexNir)
|
|
288
|
+
await numberInput.trigger('blur')
|
|
289
|
+
await wrapper.vm.$nextTick()
|
|
290
|
+
await flushPromises()
|
|
291
|
+
|
|
292
|
+
expect(wrapper.vm.numberValidation.errors.value).toEqual([])
|
|
293
|
+
|
|
294
|
+
// On change le type à 'complexe', le NIR devient invalide
|
|
295
|
+
wrapper = await createWrapper({ nirType: 'complexe' })
|
|
296
|
+
numberInput = wrapper.find('.number-field input')
|
|
297
|
+
|
|
298
|
+
await numberInput.trigger('focus')
|
|
299
|
+
await numberInput.setValue(invalidComplexNir)
|
|
300
|
+
await numberInput.trigger('blur')
|
|
301
|
+
await wrapper.vm.$nextTick()
|
|
302
|
+
await flushPromises()
|
|
303
|
+
|
|
304
|
+
expect(wrapper.vm.numberValidation.errors.value).toContain(locales.errorInvalidNumber)
|
|
305
|
+
})
|
|
306
|
+
|
|
307
|
+
it('ne devrait appliquer les customWarningRules que si la longueur est complète', async () => {
|
|
308
|
+
const numberWarning = 'Attention numéro'
|
|
309
|
+
const keyWarning = 'Attention clé'
|
|
310
|
+
|
|
311
|
+
wrapper = await createWrapper({
|
|
312
|
+
customNumberWarningRules: [{ type: 'custom', options: { validate: () => numberWarning, message: numberWarning } }],
|
|
313
|
+
customKeyWarningRules: [{ type: 'custom', options: { validate: () => keyWarning, message: keyWarning } }],
|
|
314
|
+
})
|
|
315
|
+
|
|
316
|
+
const numberInput = wrapper.find('.number-field input')
|
|
317
|
+
const keyInput = wrapper.find('.key-field input')
|
|
318
|
+
|
|
319
|
+
// Saisie partielle du numéro
|
|
320
|
+
await numberInput.trigger('focus')
|
|
321
|
+
await numberInput.setValue('123456789012') // 12 caractères
|
|
322
|
+
await numberInput.trigger('blur')
|
|
323
|
+
await wrapper.vm.$nextTick()
|
|
324
|
+
await flushPromises()
|
|
325
|
+
|
|
326
|
+
// Le warning n'est pas appliqué car < 13 caractères
|
|
327
|
+
expect(wrapper.vm.numberValidation.warnings.value).toEqual([])
|
|
328
|
+
|
|
329
|
+
// Saisie complète du numéro
|
|
330
|
+
await numberInput.trigger('focus')
|
|
331
|
+
await numberInput.setValue('1234567890123') // 13 caractères
|
|
332
|
+
await numberInput.trigger('blur')
|
|
333
|
+
await wrapper.vm.$nextTick()
|
|
334
|
+
await flushPromises()
|
|
335
|
+
|
|
336
|
+
expect(wrapper.vm.numberValidation.warnings.value).toContain(numberWarning)
|
|
337
|
+
|
|
338
|
+
// Saisie partielle de la clé
|
|
339
|
+
await keyInput.trigger('focus')
|
|
340
|
+
await keyInput.setValue('9') // 1 caractère
|
|
341
|
+
await keyInput.trigger('blur')
|
|
342
|
+
await wrapper.vm.$nextTick()
|
|
343
|
+
await flushPromises()
|
|
344
|
+
|
|
345
|
+
// Le warning n'est pas appliqué car < 2 caractères
|
|
346
|
+
expect(wrapper.vm.keyValidation.warnings.value).toEqual([])
|
|
347
|
+
|
|
348
|
+
// Saisie complète de la clé (le numéro doit être aussi complet pour valider la clé et déclencher le watch)
|
|
349
|
+
await numberInput.trigger('focus')
|
|
350
|
+
await numberInput.setValue('2940375120005') // on s'assure d'avoir un NIR valide
|
|
351
|
+
await numberInput.trigger('blur')
|
|
352
|
+
await wrapper.vm.$nextTick()
|
|
353
|
+
await flushPromises()
|
|
354
|
+
|
|
355
|
+
await keyInput.trigger('focus')
|
|
356
|
+
await keyInput.setValue('91') // 2 caractères (clé valide)
|
|
357
|
+
await keyInput.trigger('blur')
|
|
358
|
+
await wrapper.vm.$nextTick()
|
|
359
|
+
await flushPromises()
|
|
360
|
+
|
|
361
|
+
// Validation explicite pour forcer l'évaluation
|
|
362
|
+
await wrapper.vm.keyValidation.validate()
|
|
363
|
+
await wrapper.vm.$nextTick()
|
|
364
|
+
await flushPromises()
|
|
365
|
+
|
|
366
|
+
expect(wrapper.vm.keyValidation.warnings.value).toContain(keyWarning)
|
|
367
|
+
})
|
|
368
|
+
|
|
369
|
+
it('devrait mettre le focus sur le champ en erreur lors d\'une validation globale', async () => {
|
|
370
|
+
wrapper = await createWrapper({ required: true })
|
|
371
|
+
|
|
372
|
+
// Espionner le focus sur les inputs natifs
|
|
373
|
+
const numberInputEl = wrapper.find('.number-field input').element as HTMLInputElement
|
|
374
|
+
const keyInputEl = wrapper.find('.key-field input').element as HTMLInputElement
|
|
375
|
+
|
|
376
|
+
const numberFocusSpy = vi.spyOn(numberInputEl, 'focus')
|
|
377
|
+
const keyFocusSpy = vi.spyOn(keyInputEl, 'focus')
|
|
378
|
+
|
|
379
|
+
// Les champs sont vides, donc number sera en erreur en premier
|
|
380
|
+
await wrapper.vm.validateOnSubmit()
|
|
381
|
+
await wrapper.vm.$nextTick()
|
|
382
|
+
await flushPromises()
|
|
383
|
+
|
|
384
|
+
expect(numberFocusSpy).toHaveBeenCalled()
|
|
385
|
+
expect(keyFocusSpy).not.toHaveBeenCalled()
|
|
386
|
+
|
|
387
|
+
// On remplit le NIR mais la clé est vide (ou invalide)
|
|
388
|
+
numberFocusSpy.mockClear()
|
|
389
|
+
keyFocusSpy.mockClear()
|
|
390
|
+
|
|
391
|
+
await wrapper.find('.number-field input').setValue('2940375120005')
|
|
392
|
+
await wrapper.vm.$nextTick()
|
|
393
|
+
await flushPromises()
|
|
394
|
+
|
|
395
|
+
await wrapper.vm.validateOnSubmit()
|
|
396
|
+
await wrapper.vm.$nextTick()
|
|
397
|
+
await flushPromises()
|
|
398
|
+
|
|
399
|
+
expect(numberFocusSpy).not.toHaveBeenCalled()
|
|
400
|
+
expect(keyFocusSpy).toHaveBeenCalled()
|
|
401
|
+
})
|
|
402
|
+
|
|
403
|
+
it('ne devrait pas valider la clé lorsque displayKey est à false', async () => {
|
|
404
|
+
wrapper = await createWrapper({ displayKey: false, required: true })
|
|
405
|
+
|
|
406
|
+
const numberInput = wrapper.find('.number-field input')
|
|
407
|
+
|
|
408
|
+
// Saisir un NIR valide
|
|
409
|
+
await numberInput.trigger('focus')
|
|
410
|
+
await numberInput.setValue('2940375120005')
|
|
411
|
+
await numberInput.trigger('blur')
|
|
412
|
+
await wrapper.vm.$nextTick()
|
|
413
|
+
await flushPromises()
|
|
414
|
+
|
|
415
|
+
// Le champ numéro ne doit pas avoir d'erreur
|
|
416
|
+
expect(wrapper.vm.numberValidation.errors.value).toEqual([])
|
|
417
|
+
|
|
418
|
+
// La validation de la clé ne doit pas s'appliquer (pas de règles)
|
|
419
|
+
expect(wrapper.vm.keyValidation.errors.value).toEqual([])
|
|
420
|
+
|
|
421
|
+
// La validation globale doit réussir même sans clé
|
|
422
|
+
const isValid = await wrapper.vm.validateOnSubmit()
|
|
423
|
+
expect(isValid).toBe(true)
|
|
424
|
+
|
|
425
|
+
// hasFieldErrors doit être false car seule la validation du numéro compte
|
|
426
|
+
// On accède à hasFieldErrors via le composant car il est exposé par useNirValidation
|
|
427
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- deso
|
|
428
|
+
const componentInstance = wrapper.vm as any
|
|
429
|
+
expect(componentInstance.hasFieldErrors).toBe(false)
|
|
430
|
+
})
|
|
431
|
+
|
|
432
|
+
it('devrait ignorer les erreurs de clé lors de la validation globale lorsque displayKey est à false', async () => {
|
|
433
|
+
wrapper = await createWrapper({ displayKey: false })
|
|
434
|
+
|
|
435
|
+
const numberInput = wrapper.find('.number-field input')
|
|
436
|
+
|
|
437
|
+
// Saisir un NIR valide
|
|
438
|
+
await numberInput.trigger('focus')
|
|
439
|
+
await numberInput.setValue('2940375120005')
|
|
440
|
+
await numberInput.trigger('blur')
|
|
441
|
+
await wrapper.vm.$nextTick()
|
|
442
|
+
await flushPromises()
|
|
443
|
+
|
|
444
|
+
// Même si la clé n'est pas affichée, on vérifie que la validation globale ignore bien les erreurs de clé
|
|
445
|
+
// (simuler une erreur de clé qui ne devrait pas impacter la validation)
|
|
446
|
+
const isValid = await wrapper.vm.validateOnSubmit()
|
|
447
|
+
expect(isValid).toBe(true)
|
|
448
|
+
})
|
|
449
|
+
})
|