@cnamts/synapse 1.0.25 → 1.0.27
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/dist/{AutocompleteFilter-D7qBuCAP.js → AutocompleteFilter-C9eLKyW8.js} +3 -3
- package/dist/{DateFilter-BitMWrMU.js → DateFilter-y-GLkAkn.js} +9 -9
- package/dist/{NumberFilter-BTLUxw0a.js → NumberFilter-DN6hIBS7.js} +1 -1
- package/dist/{PeriodFilter-B5rUIPAC.js → PeriodFilter-MoUUp9qS.js} +1 -1
- package/dist/{SelectFilter-l4QnRcuk.js → SelectFilter-bCbrdLmu.js} +1 -1
- package/dist/{TextFilter-C9hj6Qrp.js → TextFilter-CvjgEaoM.js} +4 -4
- package/dist/apLightTheme2026-ug4Y23ns.js +611 -0
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2369 -351
- package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +18 -0
- package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +1 -1
- package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +3 -1
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +58 -288
- package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +1 -0
- package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +15 -0
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +4 -3
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +4 -3
- package/dist/components/Customs/SyIconButton/SyIconButton.d.ts +18 -0
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +20 -37
- package/dist/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.d.ts +50 -0
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +8 -10
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +197 -185
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +91 -82
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +35 -32
- package/dist/components/DatePicker/composables/index.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDatePickerState.d.ts +3 -3
- package/dist/components/DatePicker/composables/useDatePickerValidationBridge.d.ts +51 -0
- package/dist/components/DatePicker/composables/useDateTextField.d.ts +2 -2
- package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
- package/dist/components/DatePicker/types.d.ts +1 -2
- package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +1 -0
- package/dist/components/MonthPicker/MonthPicker.d.ts +24 -24
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +24 -24
- package/dist/components/NirField/NirField.d.ts +64 -60
- package/dist/components/NirField/useNirValidation.d.ts +6 -2
- package/dist/components/PasswordField/PasswordField.d.ts +3 -3
- package/dist/components/PeriodField/PeriodField.d.ts +338 -314
- package/dist/components/PhoneField/PhoneField.d.ts +34 -24
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +0 -3
- package/dist/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +3 -1
- package/dist/components/RatingPicker/NumberPicker/NumberPicker.d.ts +4 -3
- package/dist/components/RatingPicker/RatingPicker.d.ts +18 -5
- package/dist/components/RatingPicker/StarsPicker/StarsPicker.d.ts +3 -1
- package/dist/components/RatingPicker/useRatingFocus.d.ts +18 -0
- package/dist/components/SyTextArea/SyTextArea.d.ts +25 -15
- package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +20 -0
- package/dist/components/SyTextArea/locales.d.ts +1 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -4
- package/dist/components/Tables/SyTable/SyTable.d.ts +5 -4
- package/dist/components/Tables/common/SyTablePagination.d.ts +152 -364
- package/dist/components/Tables/common/TableHeader.d.ts +1 -1
- package/dist/components/Tables/common/filters/DateFilter.d.ts +4 -4
- package/dist/components/Tables/common/types.d.ts +2 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/composables/date/useDateInitializationDayjs.d.ts +3 -1
- package/dist/composables/unifyValidation/documentationValidationProps.d.ts +160 -160
- package/dist/composables/unifyValidation/useCustomValidation.d.ts +3 -1
- package/dist/composables/unifyValidation/useValidation.d.ts +27 -19
- package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +1 -1
- package/dist/composables/validation/useValidation.d.ts +1 -0
- package/dist/design-system-v3.js +81 -80
- package/dist/designTokens/tokens/amelipro/apContextual.d.ts +6 -6
- package/dist/designTokens/tokens/amelipro/apDarkTheme.d.ts +3 -1
- package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +53 -98
- package/dist/designTokens/tokens/baseContextualTokens.d.ts +0 -6
- package/dist/designTokens/tokens/baseTokens.d.ts +232 -0
- package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +6 -6
- package/dist/designTokens/tokens/cnam/cnamDarkTheme.d.ts +1 -1
- package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +57 -99
- package/dist/designTokens/tokens/pa/paContextual.d.ts +0 -6
- package/dist/designTokens/tokens/pa/paDarkTheme.d.ts +1 -1
- package/dist/designTokens/tokens/pa/paLightTheme.d.ts +53 -97
- package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -0
- package/dist/designTokens/tokens/semanticTokens.d.ts +112 -0
- package/dist/{main-Cpx8Co6H.js → main-CI6Q9nmO.js} +13843 -13478
- package/dist/synapse.css +1 -1
- package/dist/vuetifyConfig.js +208 -72
- package/package.json +10 -7
- package/src/assets/overrides/_icons.scss +5 -17
- package/src/assets/overrides/_otp.scss +4 -5
- package/src/assets/overrides/_typography.scss +2 -1
- package/src/assets/overrides/_utilities.scss +1 -42
- package/src/components/Accordion/Accordion.vue +2 -0
- package/src/components/ChipList/ChipList.vue +30 -18
- package/src/components/ChipList/tests/chipList.spec.ts +4 -4
- package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -1
- package/src/components/CookiesSelection/CookiesSelection.vue +2 -1
- package/src/components/CopyBtn/CopyBtn.vue +9 -0
- package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.stories.ts +4 -0
- package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +7 -6
- package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +223 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +283 -351
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +183 -219
- package/src/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.ts +101 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +761 -1
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +3 -1
- package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +79 -5
- package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +1029 -0
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +52 -217
- package/src/components/Customs/Selects/SySelect/SySelect.vue +248 -236
- package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +3 -0
- package/src/components/Customs/Selects/SySelect/composables/useSySelectValidation.ts +64 -0
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +440 -5
- package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +1026 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +18 -7
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +5 -5
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +8 -8
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +27 -6
- package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +1 -1
- package/src/components/Customs/SyIcon/accessibilite/Accessibility.mdx +0 -6
- package/src/components/Customs/SyIcon/utils/tests/iconUtils.spec.ts +107 -0
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.mdx +2 -2
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +395 -200
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +100 -127
- package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +127 -0
- package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.a11y.spec.ts +93 -1
- package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.spec.ts +146 -9
- package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.visual.cy.ts +165 -0
- package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +773 -0
- package/src/components/Customs/SyTabs/SyTabs.stories.ts +5 -5
- package/src/components/Customs/SyTabs/config.ts +3 -3
- package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +265 -0
- package/src/components/Customs/SyTabs/tests/useTabTransition.spec.ts +188 -0
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +10 -29
- package/src/components/Customs/SyTextField/SyTextField.vue +52 -17
- package/src/components/DataList/DataList.stories.ts +1 -1
- package/src/components/DataListItem/tests/DataListItem.spec.ts +3 -1
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +52 -154
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.coverage.spec.ts +156 -0
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +495 -4
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +55 -73
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +207 -1
- package/src/components/DatePicker/ComplexDatePicker/tests/bridge-integration.regression.spec.ts +210 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/calendar-navigation.regression.spec.ts +214 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/validation-cross.regression.spec.ts +194 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/validation-success-messages.regression.spec.ts +83 -0
- package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +169 -60
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
- package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +320 -0
- package/src/components/DatePicker/composables/index.ts +1 -0
- package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +360 -0
- package/src/components/DatePicker/composables/tests/useDatePickerValidationBridge.spec.ts +129 -0
- package/src/components/DatePicker/composables/useDatePickerState.ts +33 -14
- package/src/components/DatePicker/composables/useDatePickerValidationBridge.ts +205 -0
- package/src/components/DatePicker/composables/useDateRangeInput.ts +2 -1
- package/src/components/DatePicker/composables/useDateSelection.ts +2 -1
- package/src/components/DatePicker/composables/useDateTextField.ts +2 -2
- package/src/components/DatePicker/composables/useInputBlurHandler.ts +2 -2
- package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +1 -1
- package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +1 -1
- package/src/components/DatePicker/tests/exposed-methods.coverage.spec.ts +75 -0
- package/src/components/DatePicker/types.ts +1 -2
- package/src/components/DialogBox/DialogBox.stories.ts +8 -8
- package/src/components/DialogBox/DialogBox.vue +1 -1
- package/src/components/DialogBox/accessibilite/Accessibility.mdx +86 -22
- package/src/components/FileList/UploadItem/UploadItem.vue +4 -4
- package/src/components/FileUpload/FileUpload.vue +2 -2
- package/src/components/FileUpload/FileUploadContent.vue +1 -1
- package/src/components/FilterInline/FilterInline.mdx +2 -2
- package/src/components/FilterSideBar/FilterSideBar.stories.ts +1 -1
- package/src/components/FilterSideBar/FilterSideBar.vue +4 -3
- package/src/components/FooterBar/FooterBar.vue +7 -7
- package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -2
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +7 -7
- package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +2 -2
- package/src/components/HeaderLoading/tests/HeaderLoading.spec.ts +87 -8
- package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +3 -3
- package/src/components/HeaderNavigationBar/HorizontalNavbar/tests/HorizontalNavbar.spec.ts +589 -0
- package/src/components/HeaderToolbar/tests/HeaderToolBar.spec.ts +153 -1
- package/src/components/HeaderToolbar/tests/useMobileRightMenu.spec.ts +258 -0
- package/src/components/LangBtn/LangBtn.vue +2 -1
- package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +2 -2
- package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +1 -1
- package/src/components/LunarCalendar/tests/useLunarCalendarRules.spec.ts +184 -0
- package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +3 -3
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +1 -1
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +2 -2
- package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +1 -1
- package/src/components/NirField/NirField.vue +3 -3
- package/src/components/NotificationBar/Notification/Notification.vue +12 -12
- package/src/components/NotificationBar/NotificationBar.stories.ts +8 -8
- package/src/components/PaginatedTable/PaginatedTable.vue +1 -1
- package/src/components/PaginatedTable/Pagination.vue +3 -3
- package/src/components/PasswordField/PasswordField.vue +15 -11
- package/src/components/PasswordField/tests/PasswordField.spec.ts +3 -3
- package/src/components/PhoneField/PhoneField.vue +4 -2
- package/src/components/RangeField/RangeSlider/RangeSlider.vue +11 -18
- package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
- package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +32 -48
- package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +5 -0
- package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +48 -53
- package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +2 -1
- package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +40 -13
- package/src/components/RatingPicker/RatingPicker.stories.ts +65 -88
- package/src/components/RatingPicker/RatingPicker.vue +71 -15
- package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +28 -37
- package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +1 -1
- package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +5 -0
- package/src/components/RatingPicker/accessibilite/Accessibility.mdx +137 -9
- package/src/components/RatingPicker/tests/RatingPicker.a11y.spec.ts +123 -0
- package/src/components/RatingPicker/tests/RatingPicker.spec.ts +3 -2
- package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +40 -11
- package/src/components/RatingPicker/useRatingFocus.ts +97 -0
- package/src/components/StatusPage/tests/StatusPage.spec.ts +149 -0
- package/src/components/SubHeader/SubHeader.vue +1 -1
- package/src/components/SyAlert/SyAlert.vue +23 -23
- package/src/components/SyTextArea/SyTextArea.stories.ts +177 -131
- package/src/components/SyTextArea/SyTextArea.vue +257 -74
- package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +81 -0
- package/src/components/SyTextArea/locales.ts +1 -0
- package/src/components/SyTextArea/tests/SyTextArea.spec.ts +449 -1
- package/src/components/SyTextArea/useDefaultValidationRules.ts +2 -7
- package/src/components/SyTextArea/validation/Validation.stories.ts +856 -0
- package/src/components/TableToolbar/TableToolbar.vue +6 -6
- package/src/components/TableToolbar/accessibilite/Accessibility.mdx +81 -7
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +163 -0
- package/src/components/Tables/SyServerTable/SyServerTable.vue +3 -2
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +67 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +94 -0
- package/src/components/Tables/SyTable/SyTable.vue +3 -2
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +64 -0
- package/src/components/Tables/common/SyTableFilter.vue +4 -4
- package/src/components/Tables/common/SyTablePagination.vue +1 -0
- package/src/components/Tables/common/TableHeader.vue +3 -3
- package/src/components/Tables/common/filters/DateFilter.vue +2 -2
- package/src/components/Tables/common/filters/logics/tests/NumberFilterLogic.spec.ts +176 -0
- package/src/components/Tables/common/filters/logics/tests/SelectFilterLogic.spec.ts +111 -0
- package/src/components/Tables/common/tableStyles.scss +6 -6
- package/src/components/Tables/common/types.ts +2 -0
- package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +2 -0
- package/src/components/index.ts +1 -0
- package/src/composables/date/tests/useDateFormatDayjs.spec.ts +112 -0
- package/src/composables/date/tests/{useDateInitialization.spec.ts → useDateInitializationDayjs.spec.ts} +39 -3
- package/src/composables/date/tests/useHolidayDay.spec.ts +109 -0
- package/src/composables/date/useDateInitializationDayjs.ts +4 -1
- package/src/composables/rules/tests/useFieldValidation.spec.ts +374 -0
- package/src/composables/tests/useError.spec.ts +30 -0
- package/src/composables/tests/useFormFieldErrorHandling.spec.ts +234 -0
- package/src/composables/unifyValidation/documentationValidationProps.ts +12 -12
- package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +177 -0
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +32 -1
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +28 -2
- package/src/composables/unifyValidation/useCustomValidation.ts +34 -12
- package/src/composables/unifyValidation/useValidation.ts +55 -27
- package/src/composables/unifyValidation/useVuetifyValidation.ts +2 -2
- package/src/composables/useFilterable/useFilterable.spec.ts +42 -0
- package/src/composables/useFilterable/useFilterable.ts +11 -7
- package/src/composables/useFormFieldErrorHandling.ts +6 -3
- package/src/composables/validation/tests/useValidation.spec.ts +2 -2
- package/src/composables/validation/useValidation.ts +15 -3
- package/src/composantsVuetify/VBtn/VBtn.mdx +9 -39
- package/src/composantsVuetify/VBtn/v-btn.stories.ts +26 -86
- package/src/composantsVuetify/VCard/VCard.mdx +59 -0
- package/src/composantsVuetify/VCard/v-card.stories.ts +279 -0
- package/src/designTokens/tokens/amelipro/apColors2026.ts +1 -1
- package/src/designTokens/tokens/amelipro/apContextual.ts +6 -0
- package/src/designTokens/tokens/amelipro/apDarkTheme.ts +2 -2
- package/src/designTokens/tokens/amelipro/apLightTheme.ts +72 -100
- package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
- package/src/designTokens/tokens/baseContextualTokens.ts +1 -6
- package/src/designTokens/tokens/baseTokens.ts +232 -0
- package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -0
- package/src/designTokens/tokens/cnam/cnamDarkTheme.ts +2 -2
- package/src/designTokens/tokens/cnam/cnamLightTheme.ts +76 -101
- package/src/designTokens/tokens/pa/paDarkTheme.ts +2 -2
- package/src/designTokens/tokens/pa/paLightTheme.ts +73 -99
- package/src/designTokens/tokens/pa/paSemantic.ts +2 -0
- package/src/designTokens/tokens/semanticTokens.ts +114 -0
- package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +61 -91
- package/src/stories/Accessibilite/AuditDesignSystem.mdx +5 -8
- package/src/stories/Accessibilite/AuditEtContreAudit/Exemptions-derogations.mdx +1 -1
- package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +11 -8
- package/src/stories/Accessibilite/AuditEtContreAudit/RGAA.mdx +6 -7
- package/src/stories/Accessibilite/Introduction.mdx +30 -30
- package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +168 -78
- package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +13 -6
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +66 -45
- package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +23 -49
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/FauxPositifs.stories.ts +6 -0
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/Utilisation.mdx +7 -19
- package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +18 -20
- package/src/stories/Components/Components.stories.ts +59 -6
- package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -3
- package/src/stories/DesignTokens/Colors.mdx +6 -8
- package/src/stories/DesignTokens/colors.stories.ts +244 -1081
- package/src/utils/amelipro/toKebabCase/tests/toKebabCase.spec.ts +52 -0
- package/src/utils/formatNir/tests/formatNir.spec.ts +34 -0
- package/src/utils/tests/insertAt.spec.ts +44 -0
- package/dist/AutocompleteFilter-Df9i5mAl.cjs +0 -1
- package/dist/DateFilter-BJD6FMev.cjs +0 -1
- package/dist/NumberFilter-DGCzCXzI.cjs +0 -1
- package/dist/PeriodFilter-DO_ecTZW.cjs +0 -1
- package/dist/SelectFilter-CGwcKWLm.cjs +0 -1
- package/dist/TextFilter-B8nf7xoK.cjs +0 -1
- package/dist/apLightTheme-CEK4iY3f.cjs +0 -1
- package/dist/apLightTheme-DnIM24Lv.js +0 -950
- package/dist/composables/date/useDateFormat.d.ts +0 -26
- package/dist/composables/date/useDateInitialization.d.ts +0 -18
- package/dist/design-system-v3.umd.cjs +0 -1
- package/dist/main-ByDPHpae.cjs +0 -1067
- package/dist/tooth-11-D3sLWv2n.cjs +0 -1
- package/dist/tooth-12-CXrLuH03.cjs +0 -1
- package/dist/tooth-13-BSfo5fpT.cjs +0 -1
- package/dist/tooth-14-DMzulx0h.cjs +0 -1
- package/dist/tooth-15-BKRFVi-9.cjs +0 -1
- package/dist/tooth-16-CpuxAbuM.cjs +0 -1
- package/dist/tooth-17-BPoahUdg.cjs +0 -1
- package/dist/tooth-18-DhHJz8sy.cjs +0 -1
- package/dist/tooth-21-Dgd5hn_X.cjs +0 -1
- package/dist/tooth-22-C2Tn19sB.cjs +0 -1
- package/dist/tooth-23-C9uaaSGb.cjs +0 -1
- package/dist/tooth-24-BrK9UGpf.cjs +0 -1
- package/dist/tooth-25-CE_EfGNp.cjs +0 -1
- package/dist/tooth-26-Ctv4i9Fy.cjs +0 -1
- package/dist/tooth-27-C5J7JkWM.cjs +0 -1
- package/dist/tooth-28-Z9oWqjo0.cjs +0 -1
- package/dist/tooth-31-BrYqmkTi.cjs +0 -1
- package/dist/tooth-32-BNNR0oCZ.cjs +0 -1
- package/dist/tooth-33-DuxvqO2J.cjs +0 -1
- package/dist/tooth-34-BCSCXMB6.cjs +0 -1
- package/dist/tooth-35-BLUXkX88.cjs +0 -1
- package/dist/tooth-36-IrKHYqlA.cjs +0 -1
- package/dist/tooth-37-BYqpdMwo.cjs +0 -1
- package/dist/tooth-38-B_eNXXdu.cjs +0 -1
- package/dist/tooth-41-Ddva4Ot8.cjs +0 -1
- package/dist/tooth-42-szcDqlM0.cjs +0 -1
- package/dist/tooth-43-B3ka6rQm.cjs +0 -1
- package/dist/tooth-44-CazyQucj.cjs +0 -1
- package/dist/tooth-45-B4HQtc8n.cjs +0 -1
- package/dist/tooth-46-BPM40gbG.cjs +0 -1
- package/dist/tooth-47-Dvr20dlh.cjs +0 -1
- package/dist/tooth-48-Bd8ljGsF.cjs +0 -1
- package/dist/tooth-51-OBpwCOF3.cjs +0 -1
- package/dist/tooth-52-aKxyHcmq.cjs +0 -1
- package/dist/tooth-53-vCwJjTOc.cjs +0 -1
- package/dist/tooth-54-DsWu2iFy.cjs +0 -1
- package/dist/tooth-55-BxC1X2Dn.cjs +0 -1
- package/dist/tooth-61-BbLvxMQi.cjs +0 -1
- package/dist/tooth-62-CmTkWczP.cjs +0 -1
- package/dist/tooth-63-DI7l_2qI.cjs +0 -1
- package/dist/tooth-64-B21sOsJh.cjs +0 -1
- package/dist/tooth-65-D2ZC2VEr.cjs +0 -1
- package/dist/tooth-71-D473PPO5.cjs +0 -1
- package/dist/tooth-72-Drh1wnNu.cjs +0 -1
- package/dist/tooth-73-DzlwYI23.cjs +0 -1
- package/dist/tooth-74-8aGvcZPg.cjs +0 -1
- package/dist/tooth-75-BFK7At_r.cjs +0 -1
- package/dist/tooth-81-BZmR-I0M.cjs +0 -1
- package/dist/tooth-82-euVfUUZV.cjs +0 -1
- package/dist/tooth-83-KV010j64.cjs +0 -1
- package/dist/tooth-84-BBg1RjhZ.cjs +0 -1
- package/dist/tooth-85-Cr-kc1wM.cjs +0 -1
- package/dist/vuetifyConfig.umd.cjs +0 -1
- 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/DatePicker/CalendarMode/tests/DatePicker.events.spec.ts +0 -178
- 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/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/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/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/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/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/composables/date/tests/useDateFormat.spec.ts +0 -67
- package/src/composables/date/useDateFormat.ts +0 -110
- package/src/composables/date/useDateInitialization.ts +0 -92
|
@@ -14,7 +14,10 @@ dayjs.extend(timezone)
|
|
|
14
14
|
dayjs.locale('fr')
|
|
15
15
|
|
|
16
16
|
// Types
|
|
17
|
-
export type
|
|
17
|
+
export type DateModelValue = string | [string, string] | null
|
|
18
|
+
|
|
19
|
+
/** @deprecated Utilisez DateModelValue à la place */
|
|
20
|
+
export type DateValue = DateModelValue
|
|
18
21
|
export type DateInput = string | string[] | null | object
|
|
19
22
|
|
|
20
23
|
/**
|
|
@@ -44,6 +44,38 @@ describe('useFieldValidation', () => {
|
|
|
44
44
|
expect(await rule(null)).toEqual({ error: 'This field is required.' })
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
+
it('should validate required rule with warning mode', async () => {
|
|
48
|
+
const rules = generateRules([{ type: 'required', options: { isWarning: true, warningMessage: 'Warning: field required.' } }])
|
|
49
|
+
const rule = rules[0]!
|
|
50
|
+
|
|
51
|
+
expect(await rule('')).toEqual({ warning: 'Warning: field required.' })
|
|
52
|
+
expect(await rule('value')).toEqual({ success: 'Le champ est valide.' })
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('should use fieldIdentifier in error messages', async () => {
|
|
56
|
+
const rules = generateRules([{
|
|
57
|
+
type: 'required',
|
|
58
|
+
options: { fieldIdentifier: 'l\'email du destinataire' },
|
|
59
|
+
}])
|
|
60
|
+
const rule = rules[0]!
|
|
61
|
+
|
|
62
|
+
expect(await rule('')).toEqual({ error: 'Vous devez renseigner l\'email du destinataire.' })
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it('should use default error message when no message provided', async () => {
|
|
66
|
+
const rules = generateRules([{ type: 'required', options: { fieldName: 'Nom' } }])
|
|
67
|
+
const rule = rules[0]!
|
|
68
|
+
|
|
69
|
+
expect(await rule('')).toEqual({ error: 'Vous devez renseigner Nom.' })
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
it('should use default warning message when no warningMessage provided', async () => {
|
|
73
|
+
const rules = generateRules([{ type: 'min', options: { value: 5, isWarning: true } }])
|
|
74
|
+
const rule = rules[0]!
|
|
75
|
+
|
|
76
|
+
expect(await rule(3)).toHaveProperty('warning')
|
|
77
|
+
})
|
|
78
|
+
|
|
47
79
|
it('should validate min rule', async () => {
|
|
48
80
|
const rules = generateRules([{ type: 'min', options: { value: 5, message: 'Value must be at least 5.' } }])
|
|
49
81
|
const rule = rules[0]!
|
|
@@ -64,6 +96,26 @@ describe('useFieldValidation', () => {
|
|
|
64
96
|
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
65
97
|
})
|
|
66
98
|
|
|
99
|
+
it('should validate min and max rules with warning mode', async () => {
|
|
100
|
+
const minRule = generateRules([{ type: 'min', options: { value: 5, isWarning: true } }])[0]!
|
|
101
|
+
const maxRule = generateRules([{ type: 'max', options: { value: 10, isWarning: true } }])[0]!
|
|
102
|
+
|
|
103
|
+
expect(await minRule(3)).toHaveProperty('warning')
|
|
104
|
+
expect(await maxRule(15)).toHaveProperty('warning')
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
it('should handle non-number values for min and max rules', async () => {
|
|
108
|
+
const minRule = generateRules([{ type: 'min', options: { value: 5, message: 'Min error.' } }])[0]!
|
|
109
|
+
const maxRule = generateRules([{ type: 'max', options: { value: 10, message: 'Max error.' } }])[0]!
|
|
110
|
+
|
|
111
|
+
// Test avec des strings (typeof value !== 'number' est true, donc la condition échoue)
|
|
112
|
+
expect(await minRule('not-a-number')).toEqual({ error: 'Min error.' })
|
|
113
|
+
expect(await maxRule('not-a-number')).toEqual({ error: 'Max error.' })
|
|
114
|
+
// Test avec des objets
|
|
115
|
+
expect(await minRule({})).toEqual({ error: 'Min error.' })
|
|
116
|
+
expect(await maxRule({})).toEqual({ error: 'Max error.' })
|
|
117
|
+
})
|
|
118
|
+
|
|
67
119
|
it('should validate minLength rule', async () => {
|
|
68
120
|
const rules = generateRules([{ type: 'minLength', options: { length: 5, message: 'Minimum length is 5.' } }])
|
|
69
121
|
const rule = rules[0]!
|
|
@@ -74,6 +126,32 @@ describe('useFieldValidation', () => {
|
|
|
74
126
|
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
75
127
|
})
|
|
76
128
|
|
|
129
|
+
it('should validate minLength and maxLength with warning mode', async () => {
|
|
130
|
+
const minLenRule = generateRules([{ type: 'minLength', options: { length: 5, isWarning: true } }])[0]!
|
|
131
|
+
const maxLenRule = generateRules([{ type: 'maxLength', options: { length: 5, isWarning: true } }])[0]!
|
|
132
|
+
|
|
133
|
+
expect(await minLenRule('1234')).toHaveProperty('warning')
|
|
134
|
+
expect(await maxLenRule('123456')).toHaveProperty('warning')
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
it('should handle non-string values for string-based rules', async () => {
|
|
138
|
+
const minLenRule = generateRules([{ type: 'minLength', options: { length: 5, message: 'MinLength error.' } }])[0]!
|
|
139
|
+
const maxLenRule = generateRules([{ type: 'maxLength', options: { length: 5, message: 'MaxLength error.' } }])[0]!
|
|
140
|
+
const exactLenRule = generateRules([{ type: 'exactLength', options: { length: 5, message: 'ExactLength error.' } }])[0]!
|
|
141
|
+
const emailRule = generateRules([{ type: 'email', options: { message: 'Email error.' } }])[0]!
|
|
142
|
+
const patternRule = generateRules([{ type: 'matchPattern', options: { pattern: /^[a-z]+$/, message: 'Pattern error.' } }])[0]!
|
|
143
|
+
|
|
144
|
+
// Test avec des nombres (typeof value !== 'string' est true)
|
|
145
|
+
expect(await minLenRule(12345)).toEqual({ error: 'MinLength error.' })
|
|
146
|
+
expect(await maxLenRule(12345)).toEqual({ error: 'MaxLength error.' })
|
|
147
|
+
expect(await exactLenRule(12345)).toEqual({ error: 'ExactLength error.' })
|
|
148
|
+
expect(await emailRule(12345)).toEqual({ error: 'Email error.' })
|
|
149
|
+
expect(await patternRule(12345)).toEqual({ error: 'Pattern error.' })
|
|
150
|
+
// Test avec des objets
|
|
151
|
+
expect(await minLenRule({})).toEqual({ error: 'MinLength error.' })
|
|
152
|
+
expect(await emailRule({})).toEqual({ error: 'Email error.' })
|
|
153
|
+
})
|
|
154
|
+
|
|
77
155
|
it('should validate minLength rule with ignoreSpace option', async () => {
|
|
78
156
|
const rules = generateRules([{
|
|
79
157
|
type: 'minLength',
|
|
@@ -140,6 +218,14 @@ describe('useFieldValidation', () => {
|
|
|
140
218
|
expect(await rule('1 2 3 4 5')).toEqual({ success: 'Le champ est valide.' }) // Length without spaces is 5
|
|
141
219
|
})
|
|
142
220
|
|
|
221
|
+
it('should validate exactLength and matchPattern with warning mode', async () => {
|
|
222
|
+
const exactLenRule = generateRules([{ type: 'exactLength', options: { length: 5, isWarning: true } }])[0]!
|
|
223
|
+
const patternRule = generateRules([{ type: 'matchPattern', options: { pattern: /^[a-z]+$/, isWarning: true } }])[0]!
|
|
224
|
+
|
|
225
|
+
expect(await exactLenRule('1234')).toHaveProperty('warning')
|
|
226
|
+
expect(await patternRule('ABC')).toHaveProperty('warning')
|
|
227
|
+
})
|
|
228
|
+
|
|
143
229
|
it('should validate email rule', async () => {
|
|
144
230
|
// Vérifions d'abord que la regex EMAIL_REGEXP fonctionne comme prévu
|
|
145
231
|
expect(EMAIL_REGEXP.test('invalid-email')).toBe(false)
|
|
@@ -156,6 +242,13 @@ describe('useFieldValidation', () => {
|
|
|
156
242
|
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
157
243
|
})
|
|
158
244
|
|
|
245
|
+
it('should validate email rule with warning mode', async () => {
|
|
246
|
+
const emailRule = generateRules([{ type: 'email', options: { isWarning: true, warningMessage: 'Invalid email warning.' } }])[0]!
|
|
247
|
+
|
|
248
|
+
expect(await emailRule('invalid')).toEqual({ warning: 'Invalid email warning.' })
|
|
249
|
+
expect(await emailRule('test@example.com')).toEqual({ success: 'Le champ est valide.' })
|
|
250
|
+
})
|
|
251
|
+
|
|
159
252
|
it('should validate matchPattern rule', async () => {
|
|
160
253
|
const rules = generateRules([{
|
|
161
254
|
type: 'matchPattern',
|
|
@@ -183,6 +276,10 @@ describe('useFieldValidation', () => {
|
|
|
183
276
|
// 13 janvier 2023 est un vendredi (jour 5)
|
|
184
277
|
expect(await rule(new Date(2023, 0, 13))).toEqual({ success: 'Le champ est valide.' })
|
|
185
278
|
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
279
|
+
expect(await rule(null)).toEqual({}) // Null should be ignored
|
|
280
|
+
expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
|
|
281
|
+
// Test avec une date invalide (string qui ne parse pas)
|
|
282
|
+
expect(await rule('invalid-date-string')).toEqual({ error: 'Date invalide' })
|
|
186
283
|
})
|
|
187
284
|
|
|
188
285
|
it('should validate notBeforeToday rule', async () => {
|
|
@@ -199,6 +296,10 @@ describe('useFieldValidation', () => {
|
|
|
199
296
|
// 16 janvier 2023 est après aujourd'hui
|
|
200
297
|
expect(await rule(new Date(2023, 0, 16))).toEqual({ success: 'Le champ est valide.' })
|
|
201
298
|
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
299
|
+
expect(await rule(null)).toEqual({}) // Null should be ignored
|
|
300
|
+
expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
|
|
301
|
+
// Test avec une date invalide (string qui ne parse pas)
|
|
302
|
+
expect(await rule('not-a-valid-date')).toEqual({ error: 'Date invalide' })
|
|
202
303
|
})
|
|
203
304
|
|
|
204
305
|
it('should validate notAfterToday rule', async () => {
|
|
@@ -215,6 +316,29 @@ describe('useFieldValidation', () => {
|
|
|
215
316
|
// 14 janvier 2023 est avant aujourd'hui
|
|
216
317
|
expect(await rule(new Date(2023, 0, 14))).toEqual({ success: 'Le champ est valide.' })
|
|
217
318
|
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
319
|
+
expect(await rule(null)).toEqual({}) // Null should be ignored
|
|
320
|
+
expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
|
|
321
|
+
// Test avec une date invalide (string qui ne parse pas)
|
|
322
|
+
expect(await rule('bad-date-format')).toEqual({ error: 'Date invalide' })
|
|
323
|
+
})
|
|
324
|
+
|
|
325
|
+
it('should validate date rules with warning mode', async () => {
|
|
326
|
+
const notWeekendRule = generateRules([{
|
|
327
|
+
type: 'notWeekend',
|
|
328
|
+
options: { isWarning: true, warningMessage: 'Weekend warning.' },
|
|
329
|
+
}])[0]!
|
|
330
|
+
const notBeforeTodayRule = generateRules([{
|
|
331
|
+
type: 'notBeforeToday',
|
|
332
|
+
options: { isWarning: true, warningMessage: 'Before today warning.' },
|
|
333
|
+
}])[0]!
|
|
334
|
+
const notAfterTodayRule = generateRules([{
|
|
335
|
+
type: 'notAfterToday',
|
|
336
|
+
options: { isWarning: true, warningMessage: 'After today warning.' },
|
|
337
|
+
}])[0]!
|
|
338
|
+
|
|
339
|
+
expect(await notWeekendRule(new Date(2023, 0, 15))).toEqual({ warning: 'Weekend warning.' })
|
|
340
|
+
expect(await notBeforeTodayRule(new Date(2023, 0, 14))).toEqual({ warning: 'Before today warning.' })
|
|
341
|
+
expect(await notAfterTodayRule(new Date(2023, 0, 16))).toEqual({ warning: 'After today warning.' })
|
|
218
342
|
})
|
|
219
343
|
|
|
220
344
|
it('should test parseDate function directly', () => {
|
|
@@ -296,6 +420,37 @@ describe('useFieldValidation', () => {
|
|
|
296
420
|
options: { date: undefined as unknown as string, message: 'Date cannot be before reference date.' },
|
|
297
421
|
}])[0]!
|
|
298
422
|
expect(await ruleWithUndefinedDate(new Date())).toEqual({})
|
|
423
|
+
// Test avec valeur null/undefined
|
|
424
|
+
expect(await rule(null)).toEqual({}) // Null should be ignored
|
|
425
|
+
expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
|
|
426
|
+
// Test avec une date de référence invalide (string qui ne parse pas)
|
|
427
|
+
const ruleWithInvalidRefDate = generateRules([{
|
|
428
|
+
type: 'notBeforeDate',
|
|
429
|
+
options: { date: 'invalid-date', message: 'Date cannot be before reference date.' },
|
|
430
|
+
}])[0]!
|
|
431
|
+
expect(await ruleWithInvalidRefDate(new Date())).toEqual({ error: 'Date de référence invalide' })
|
|
432
|
+
})
|
|
433
|
+
|
|
434
|
+
it('should validate notBeforeDate and notAfterDate with warning mode', async () => {
|
|
435
|
+
const notBeforeDateRule = generateRules([{
|
|
436
|
+
type: 'notBeforeDate',
|
|
437
|
+
options: {
|
|
438
|
+
date: '10/01/2023',
|
|
439
|
+
isWarning: true,
|
|
440
|
+
warningMessage: 'Date before ref warning.',
|
|
441
|
+
},
|
|
442
|
+
}])[0]!
|
|
443
|
+
const notAfterDateRule = generateRules([{
|
|
444
|
+
type: 'notAfterDate',
|
|
445
|
+
options: {
|
|
446
|
+
date: '20/01/2023',
|
|
447
|
+
isWarning: true,
|
|
448
|
+
warningMessage: 'Date after ref warning.',
|
|
449
|
+
},
|
|
450
|
+
}])[0]!
|
|
451
|
+
|
|
452
|
+
expect(await notBeforeDateRule(new Date(2023, 0, 9))).toEqual({ warning: 'Date before ref warning.' })
|
|
453
|
+
expect(await notAfterDateRule(new Date(2023, 0, 21))).toEqual({ warning: 'Date after ref warning.' })
|
|
299
454
|
})
|
|
300
455
|
|
|
301
456
|
it('should throw when date reference is not a string in notBeforeDate rule', async () => {
|
|
@@ -348,6 +503,15 @@ describe('useFieldValidation', () => {
|
|
|
348
503
|
options: { date: undefined as unknown as string, message: 'Date cannot be after reference date.' },
|
|
349
504
|
}])[0]!
|
|
350
505
|
expect(await ruleWithUndefinedDate(new Date())).toEqual({})
|
|
506
|
+
// Test avec valeur null/undefined
|
|
507
|
+
expect(await rule(null)).toEqual({}) // Null should be ignored
|
|
508
|
+
expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
|
|
509
|
+
// Test avec une date de référence invalide (string qui ne parse pas)
|
|
510
|
+
const ruleWithInvalidRefDate = generateRules([{
|
|
511
|
+
type: 'notAfterDate',
|
|
512
|
+
options: { date: 'invalid-date', message: 'Date cannot be after reference date.' },
|
|
513
|
+
}])[0]!
|
|
514
|
+
expect(await ruleWithInvalidRefDate(new Date())).toEqual({ error: 'Date de référence invalide' })
|
|
351
515
|
})
|
|
352
516
|
|
|
353
517
|
it('should throw when date reference is not a string in notAfterDate rule', async () => {
|
|
@@ -400,6 +564,29 @@ describe('useFieldValidation', () => {
|
|
|
400
564
|
options: { date: undefined as unknown as string, message: 'Date must be exactly the reference date.' },
|
|
401
565
|
}])[0]!
|
|
402
566
|
expect(await ruleWithUndefinedDate(new Date())).toEqual({})
|
|
567
|
+
// Test avec valeur null/undefined
|
|
568
|
+
expect(await rule(null)).toEqual({}) // Null should be ignored
|
|
569
|
+
expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
|
|
570
|
+
// Test avec une date de référence invalide (string qui ne parse pas)
|
|
571
|
+
const ruleWithInvalidRefDate = generateRules([{
|
|
572
|
+
type: 'dateExact',
|
|
573
|
+
options: { date: 'invalid-date', message: 'Date must be exactly the reference date.' },
|
|
574
|
+
}])[0]!
|
|
575
|
+
expect(await ruleWithInvalidRefDate(new Date())).toEqual({ error: 'Date de référence invalide' })
|
|
576
|
+
})
|
|
577
|
+
|
|
578
|
+
it('should validate dateExact with warning mode', async () => {
|
|
579
|
+
const dateExactRule = generateRules([{
|
|
580
|
+
type: 'dateExact',
|
|
581
|
+
options: {
|
|
582
|
+
date: '15/01/2023',
|
|
583
|
+
isWarning: true,
|
|
584
|
+
warningMessage: 'Not exact date warning.',
|
|
585
|
+
},
|
|
586
|
+
}])[0]!
|
|
587
|
+
|
|
588
|
+
expect(await dateExactRule(new Date(2023, 0, 14))).toEqual({ warning: 'Not exact date warning.' })
|
|
589
|
+
expect(await dateExactRule(new Date(2023, 0, 15))).toEqual({ success: 'Le champ est valide.' })
|
|
403
590
|
})
|
|
404
591
|
|
|
405
592
|
it('should throw when date reference is not a string in dateExact rule', async () => {
|
|
@@ -434,6 +621,165 @@ describe('useFieldValidation', () => {
|
|
|
434
621
|
expect(await customMessageRule('invalid')).toEqual({ error: 'Custom error message' })
|
|
435
622
|
})
|
|
436
623
|
|
|
624
|
+
it('should validate custom rule with async function', async () => {
|
|
625
|
+
// Test avec une fonction async (Promise)
|
|
626
|
+
const asyncRule = generateRules([{
|
|
627
|
+
type: 'custom',
|
|
628
|
+
options: {
|
|
629
|
+
validate: async (value: unknown) => {
|
|
630
|
+
await new Promise(resolve => setTimeout(resolve, 10))
|
|
631
|
+
return value === 'async-valid'
|
|
632
|
+
},
|
|
633
|
+
message: 'Async validation failed.',
|
|
634
|
+
},
|
|
635
|
+
}])[0]!
|
|
636
|
+
|
|
637
|
+
expect(await asyncRule('invalid')).toEqual({ error: 'Async validation failed.' })
|
|
638
|
+
expect(await asyncRule('async-valid')).toEqual({ success: 'Le champ est valide.' })
|
|
639
|
+
})
|
|
640
|
+
|
|
641
|
+
it('should handle custom rule async function returning string message', async () => {
|
|
642
|
+
const asyncStringRule = generateRules([{
|
|
643
|
+
type: 'custom',
|
|
644
|
+
options: {
|
|
645
|
+
validate: async (value: unknown) => {
|
|
646
|
+
await new Promise(resolve => setTimeout(resolve, 10))
|
|
647
|
+
return value === 'valid' ? true : 'Custom async error'
|
|
648
|
+
},
|
|
649
|
+
},
|
|
650
|
+
}])[0]!
|
|
651
|
+
|
|
652
|
+
expect(await asyncStringRule('invalid')).toEqual({ error: 'Custom async error' })
|
|
653
|
+
expect(await asyncStringRule('valid')).toEqual({ success: 'Le champ est valide.' })
|
|
654
|
+
})
|
|
655
|
+
|
|
656
|
+
it('should handle custom rule async function throwing error', async () => {
|
|
657
|
+
const asyncErrorRule = generateRules([{
|
|
658
|
+
type: 'custom',
|
|
659
|
+
options: {
|
|
660
|
+
validate: async () => {
|
|
661
|
+
throw new Error('Async error message')
|
|
662
|
+
},
|
|
663
|
+
// Pas de message défini pour que l'erreur soit capturée
|
|
664
|
+
},
|
|
665
|
+
}])[0]!
|
|
666
|
+
|
|
667
|
+
expect(await asyncErrorRule('any')).toEqual({ error: 'Async error message' })
|
|
668
|
+
})
|
|
669
|
+
|
|
670
|
+
it('should handle custom rule with warning and async function', async () => {
|
|
671
|
+
const asyncWarningRule = generateRules([{
|
|
672
|
+
type: 'custom',
|
|
673
|
+
options: {
|
|
674
|
+
validate: async (value: unknown) => {
|
|
675
|
+
await new Promise(resolve => setTimeout(resolve, 10))
|
|
676
|
+
return value === 'warning' ? 'Warning message' : true
|
|
677
|
+
},
|
|
678
|
+
isWarning: true,
|
|
679
|
+
},
|
|
680
|
+
}])[0]!
|
|
681
|
+
|
|
682
|
+
expect(await asyncWarningRule('warning')).toEqual({ warning: 'Warning message' })
|
|
683
|
+
expect(await asyncWarningRule('valid')).toEqual({ success: 'Le champ est valide.' })
|
|
684
|
+
})
|
|
685
|
+
|
|
686
|
+
it('should handle custom rule without validate function in error mode', async () => {
|
|
687
|
+
// Test sans validate et isWarning=false (branche error par défaut)
|
|
688
|
+
const noValidateErrorRule = generateRules([{
|
|
689
|
+
type: 'custom',
|
|
690
|
+
options: { message: 'No validate function provided.' },
|
|
691
|
+
}])[0]!
|
|
692
|
+
|
|
693
|
+
expect(await noValidateErrorRule('any')).toEqual({ error: 'No validate function provided.' })
|
|
694
|
+
})
|
|
695
|
+
|
|
696
|
+
it('should handle custom rule without validate function with default error message', async () => {
|
|
697
|
+
// Test sans validate ni message (branche baseMessages.error)
|
|
698
|
+
const noValidateDefaultRule = generateRules([{
|
|
699
|
+
type: 'custom',
|
|
700
|
+
options: { fieldName: 'TestField' },
|
|
701
|
+
}])[0]!
|
|
702
|
+
|
|
703
|
+
expect(await noValidateDefaultRule('any')).toHaveProperty('error')
|
|
704
|
+
})
|
|
705
|
+
|
|
706
|
+
it('should handle custom rule without validate function in warning mode', async () => {
|
|
707
|
+
const noValidateWarningRule = generateRules([{
|
|
708
|
+
type: 'custom',
|
|
709
|
+
options: {
|
|
710
|
+
warningMessage: 'Warning: no validation.',
|
|
711
|
+
isWarning: true,
|
|
712
|
+
},
|
|
713
|
+
}])[0]!
|
|
714
|
+
|
|
715
|
+
expect(await noValidateWarningRule('any')).toEqual({ warning: 'Warning: no validation.' })
|
|
716
|
+
})
|
|
717
|
+
|
|
718
|
+
it('should handle custom rule returning false with warning', async () => {
|
|
719
|
+
const falseWarningRule = generateRules([{
|
|
720
|
+
type: 'custom',
|
|
721
|
+
options: {
|
|
722
|
+
validate: () => false,
|
|
723
|
+
isWarning: true,
|
|
724
|
+
warningMessage: 'Custom warning for false.',
|
|
725
|
+
},
|
|
726
|
+
}])[0]!
|
|
727
|
+
|
|
728
|
+
expect(await falseWarningRule('any')).toEqual({ warning: 'Custom warning for false.' })
|
|
729
|
+
})
|
|
730
|
+
|
|
731
|
+
it('should handle custom rule returning false with default warning', async () => {
|
|
732
|
+
// Test res === false avec isWarning=true mais sans warningMessage (branche baseMessages.warning)
|
|
733
|
+
const falseDefaultWarningRule = generateRules([{
|
|
734
|
+
type: 'custom',
|
|
735
|
+
options: {
|
|
736
|
+
validate: () => false,
|
|
737
|
+
isWarning: true,
|
|
738
|
+
fieldName: 'TestField',
|
|
739
|
+
},
|
|
740
|
+
}])[0]!
|
|
741
|
+
|
|
742
|
+
expect(await falseDefaultWarningRule('any')).toHaveProperty('warning')
|
|
743
|
+
})
|
|
744
|
+
|
|
745
|
+
it('should handle custom rule async error with warningMessage', async () => {
|
|
746
|
+
const asyncErrorWarningRule = generateRules([{
|
|
747
|
+
type: 'custom',
|
|
748
|
+
options: {
|
|
749
|
+
validate: async () => { throw new Error('Thrown error') },
|
|
750
|
+
isWarning: true,
|
|
751
|
+
warningMessage: 'Caught async warning.',
|
|
752
|
+
},
|
|
753
|
+
}])[0]!
|
|
754
|
+
|
|
755
|
+
expect(await asyncErrorWarningRule('any')).toEqual({ warning: 'Caught async warning.' })
|
|
756
|
+
})
|
|
757
|
+
|
|
758
|
+
it('should handle async error that is not an Error instance', async () => {
|
|
759
|
+
// Test où err n'est pas une instance de Error (branche String(err))
|
|
760
|
+
const asyncNonErrorRule = generateRules([{
|
|
761
|
+
type: 'custom',
|
|
762
|
+
options: {
|
|
763
|
+
validate: async () => { throw 'String error message' },
|
|
764
|
+
},
|
|
765
|
+
}])[0]!
|
|
766
|
+
|
|
767
|
+
expect(await asyncNonErrorRule('any')).toEqual({ error: 'String error message' })
|
|
768
|
+
})
|
|
769
|
+
|
|
770
|
+
it('should handle custom rule returning string with warning', async () => {
|
|
771
|
+
// Test typeof res === 'string' avec isWarning=true
|
|
772
|
+
const stringWarningRule = generateRules([{
|
|
773
|
+
type: 'custom',
|
|
774
|
+
options: {
|
|
775
|
+
validate: () => 'Custom warning string',
|
|
776
|
+
isWarning: true,
|
|
777
|
+
},
|
|
778
|
+
}])[0]!
|
|
779
|
+
|
|
780
|
+
expect(await stringWarningRule('any')).toEqual({ warning: 'Custom warning string' })
|
|
781
|
+
})
|
|
782
|
+
|
|
437
783
|
it('should handle warning mode instead of error', async () => {
|
|
438
784
|
const rules = generateRules([{
|
|
439
785
|
type: 'required',
|
|
@@ -498,4 +844,32 @@ describe('useFieldValidation', () => {
|
|
|
498
844
|
|
|
499
845
|
expect(await rule('any value')).toEqual({ error: 'La règle spécifiée pour ce champ n\'existe pas.' })
|
|
500
846
|
})
|
|
847
|
+
|
|
848
|
+
it('should validate isHolidayDay rule', async () => {
|
|
849
|
+
const rules = generateRules([{
|
|
850
|
+
type: 'isHolidayDay',
|
|
851
|
+
options: { message: 'Date cannot be a holiday.' },
|
|
852
|
+
}])
|
|
853
|
+
const rule = rules[0]!
|
|
854
|
+
|
|
855
|
+
// Test avec une date valide (pas un jour férié)
|
|
856
|
+
expect(await rule(new Date(2023, 0, 13))).toEqual({ success: 'Le champ est valide.' })
|
|
857
|
+
// Test avec null/undefined/empty
|
|
858
|
+
expect(await rule(null)).toEqual({}) // Null should be ignored
|
|
859
|
+
expect(await rule(undefined)).toEqual({}) // Undefined should be ignored
|
|
860
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
861
|
+
// Test avec une date invalide
|
|
862
|
+
expect(await rule('invalid-date')).toEqual({ error: 'Date invalide' })
|
|
863
|
+
})
|
|
864
|
+
|
|
865
|
+
it('should validate isHolidayDay with warning mode', async () => {
|
|
866
|
+
const holidayRule = generateRules([{
|
|
867
|
+
type: 'isHolidayDay',
|
|
868
|
+
options: { isWarning: true, warningMessage: 'Holiday warning.' },
|
|
869
|
+
}])[0]!
|
|
870
|
+
|
|
871
|
+
// Le 1er janvier 2023 est un jour férié
|
|
872
|
+
expect(await holidayRule(new Date(2023, 0, 1))).toEqual({ warning: 'Holiday warning.' })
|
|
873
|
+
expect(await holidayRule(new Date(2023, 0, 13))).toEqual({ success: 'Le champ est valide.' })
|
|
874
|
+
})
|
|
501
875
|
})
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { useError } from '../useError'
|
|
3
|
+
|
|
4
|
+
describe('useError', () => {
|
|
5
|
+
it('retourne un objet avec la méthode propError', () => {
|
|
6
|
+
const { propError } = useError()
|
|
7
|
+
expect(typeof propError).toBe('function')
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
it('propError lève une Error avec le message fourni', () => {
|
|
11
|
+
const { propError } = useError()
|
|
12
|
+
expect(() => propError('message d\'erreur')).toThrow('message d\'erreur')
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
it('propError lève une instance de Error', () => {
|
|
16
|
+
const { propError } = useError()
|
|
17
|
+
expect(() => propError('test')).toThrowError(Error)
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('propError lève une erreur avec un message vide si chaîne vide', () => {
|
|
21
|
+
const { propError } = useError()
|
|
22
|
+
expect(() => propError('')).toThrow('')
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('chaque appel à useError retourne une nouvelle instance indépendante', () => {
|
|
26
|
+
const a = useError()
|
|
27
|
+
const b = useError()
|
|
28
|
+
expect(a.propError).not.toBe(b.propError)
|
|
29
|
+
})
|
|
30
|
+
})
|