@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
package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts
CHANGED
|
@@ -76,7 +76,7 @@ ValidationExamples.parameters = {
|
|
|
76
76
|
<script setup>
|
|
77
77
|
import { computed, ref, watch } from 'vue';vue'
|
|
78
78
|
import DatePicker from '@/components/DatePicker/CalendarMode/DatePicker.vue'
|
|
79
|
-
import { useDateFormat } from '@/composables/date/
|
|
79
|
+
import { useDateFormat } from '@/composables/date/useDateFormatDayjs'
|
|
80
80
|
|
|
81
81
|
// Exemple 1: Validation de base (required)
|
|
82
82
|
const date1 = ref('')
|
|
@@ -7,16 +7,17 @@
|
|
|
7
7
|
useDateInputEditing,
|
|
8
8
|
useDateAutoClamp,
|
|
9
9
|
useDateTextField,
|
|
10
|
+
useDatePickerValidationBridge,
|
|
10
11
|
} from '../composables'
|
|
11
12
|
import { ref, computed, watch, nextTick, onMounted, toRefs } from 'vue'
|
|
12
13
|
import SyTextField from '../../Customs/SyTextField/SyTextField.vue'
|
|
13
14
|
import dayjs from 'dayjs'
|
|
14
15
|
import customParseFormat from 'dayjs/plugin/customParseFormat'
|
|
15
|
-
import {
|
|
16
|
+
import type { ValidationRule, ValidationResult } from '@/composables/validation/useValidation'
|
|
16
17
|
import { useValidatable } from '@/composables/validation/useValidatable'
|
|
17
18
|
import { useDateFormat } from '@/composables/date/useDateFormatDayjs'
|
|
18
19
|
import { DATE_PICKER_MESSAGES } from '../constants/messages'
|
|
19
|
-
import type {
|
|
20
|
+
import type { DateModelValue } from '@/composables/date/useDateInitializationDayjs'
|
|
20
21
|
import type { DateObjectValue } from '../types'
|
|
21
22
|
|
|
22
23
|
dayjs.extend(customParseFormat)
|
|
@@ -40,7 +41,7 @@
|
|
|
40
41
|
isOutlined?: boolean
|
|
41
42
|
isValidateOnBlur?: boolean
|
|
42
43
|
label: string
|
|
43
|
-
modelValue?:
|
|
44
|
+
modelValue?: DateModelValue
|
|
44
45
|
noIcon?: boolean
|
|
45
46
|
persistentHint?: boolean
|
|
46
47
|
placeholder?: string
|
|
@@ -48,8 +49,10 @@
|
|
|
48
49
|
required?: boolean
|
|
49
50
|
showSuccessMessages?: boolean
|
|
50
51
|
title?: string | false
|
|
52
|
+
/** @internal Désactive la validation interne quand utilisé dans un parent avec validation */
|
|
53
|
+
skipInternalValidation?: boolean
|
|
51
54
|
}>(), {
|
|
52
|
-
autoClamp:
|
|
55
|
+
autoClamp: false,
|
|
53
56
|
bgColor: 'white',
|
|
54
57
|
customRules: () => [],
|
|
55
58
|
customWarningRules: () => [],
|
|
@@ -74,14 +77,15 @@
|
|
|
74
77
|
required: false,
|
|
75
78
|
showSuccessMessages: true,
|
|
76
79
|
title: false,
|
|
80
|
+
skipInternalValidation: false,
|
|
77
81
|
})
|
|
78
82
|
|
|
79
83
|
const emit = defineEmits<{
|
|
80
|
-
(e: 'update:model-value', value:
|
|
84
|
+
(e: 'update:model-value', value: DateModelValue): void
|
|
81
85
|
(e: 'focus'): void
|
|
82
86
|
(e: 'blur'): void
|
|
83
87
|
(e: 'input', value: string): void
|
|
84
|
-
(e: 'date-selected', value:
|
|
88
|
+
(e: 'date-selected', value: DateModelValue): void
|
|
85
89
|
}>()
|
|
86
90
|
|
|
87
91
|
/**
|
|
@@ -98,19 +102,42 @@
|
|
|
98
102
|
|
|
99
103
|
/**
|
|
100
104
|
* =====================
|
|
101
|
-
* Validation setup (
|
|
105
|
+
* Validation setup (using DatePickerValidationBridge)
|
|
102
106
|
* =====================
|
|
103
107
|
*/
|
|
104
|
-
const
|
|
108
|
+
const selectedDates = ref<DateObjectValue>(null)
|
|
109
|
+
const currentRangeIsValid = ref(true)
|
|
110
|
+
const getRangeValidationError = ref('')
|
|
111
|
+
const isUpdatingFromInternal = ref(false)
|
|
112
|
+
|
|
113
|
+
// Quand skipInternalValidation est true, on utilise le readonlyValidation (pas de validation active)
|
|
114
|
+
// pour éviter la double validation avec le parent
|
|
115
|
+
const shouldUseInternalValidation = computed(() => !props.skipInternalValidation && !readonly.value)
|
|
116
|
+
|
|
117
|
+
const bridgeValidation = useDatePickerValidationBridge({
|
|
105
118
|
showSuccessMessages: props.showSuccessMessages,
|
|
106
|
-
fieldIdentifier: props.label || props.placeholder,
|
|
107
119
|
disableErrorHandling: props.disableErrorHandling,
|
|
120
|
+
noCalendar: true,
|
|
121
|
+
required: props.required,
|
|
122
|
+
displayRange: props.displayRange,
|
|
123
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Compatibility with legacy rule format
|
|
124
|
+
customRules: computed(() => shouldUseInternalValidation.value ? props.customRules as any : []),
|
|
125
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Compatibility with legacy rule format
|
|
126
|
+
customWarningRules: computed(() => shouldUseInternalValidation.value ? props.customWarningRules as any : []),
|
|
127
|
+
selectedDates,
|
|
128
|
+
isUpdatingFromInternal,
|
|
129
|
+
currentRangeIsValid,
|
|
130
|
+
getRangeValidationError,
|
|
131
|
+
skipValidationWhenReadonly: true,
|
|
132
|
+
readonly: readonly,
|
|
133
|
+
fieldIdentifier: props.label || props.placeholder || 'Date',
|
|
108
134
|
})
|
|
109
135
|
|
|
110
136
|
const readonlyValidation = {
|
|
111
137
|
errors: ref<string[]>([]),
|
|
112
138
|
warnings: ref<string[]>([]),
|
|
113
139
|
successes: ref<string[]>([]),
|
|
140
|
+
displaySuccesses: computed(() => []),
|
|
114
141
|
hasError: ref(false),
|
|
115
142
|
clearValidation: () => {},
|
|
116
143
|
validateField: () => ({
|
|
@@ -121,39 +148,57 @@
|
|
|
121
148
|
} as ValidationResult),
|
|
122
149
|
}
|
|
123
150
|
|
|
124
|
-
const validationApi = computed(() => (readonly.value ? readonlyValidation : baseValidation))
|
|
125
|
-
|
|
126
151
|
const errors = computed({
|
|
127
|
-
get: () =>
|
|
128
|
-
set: (value) => {
|
|
152
|
+
get: () => readonly.value ? readonlyValidation.errors.value : bridgeValidation.errors.value,
|
|
153
|
+
set: (value) => {
|
|
154
|
+
if (!readonly.value) bridgeValidation.errors.value = value
|
|
155
|
+
},
|
|
129
156
|
})
|
|
130
157
|
const warnings = computed({
|
|
131
|
-
get: () =>
|
|
132
|
-
set: (value) => {
|
|
158
|
+
get: () => readonly.value ? readonlyValidation.warnings.value : bridgeValidation.warnings.value,
|
|
159
|
+
set: (value) => {
|
|
160
|
+
if (!readonly.value) bridgeValidation.warnings.value = value
|
|
161
|
+
},
|
|
133
162
|
})
|
|
134
163
|
const successes = computed({
|
|
135
|
-
get: () =>
|
|
136
|
-
set: (value) => {
|
|
164
|
+
get: () => readonly.value ? readonlyValidation.successes.value : bridgeValidation.successes.value,
|
|
165
|
+
set: (value) => {
|
|
166
|
+
if (!readonly.value) bridgeValidation.successes.value = value
|
|
167
|
+
},
|
|
137
168
|
})
|
|
138
169
|
const hasError = computed(() => {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- computed/ref dual shape
|
|
142
|
-
return (api as any).hasError?.value ?? api.errors.value.length > 0
|
|
170
|
+
if (readonly.value) return false
|
|
171
|
+
return bridgeValidation.errors.value.length > 0
|
|
143
172
|
})
|
|
144
173
|
|
|
145
|
-
const clearValidation = () =>
|
|
174
|
+
const clearValidation = () => {
|
|
175
|
+
if (readonly.value) {
|
|
176
|
+
readonlyValidation.clearValidation()
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
bridgeValidation.clearValidation()
|
|
180
|
+
}
|
|
181
|
+
}
|
|
146
182
|
|
|
147
183
|
const validateField = async (
|
|
148
184
|
value: unknown,
|
|
149
185
|
rules?: ValidationRule[],
|
|
150
186
|
warningRules?: ValidationRule[],
|
|
151
|
-
): Promise<ValidationResult> =>
|
|
187
|
+
): Promise<ValidationResult> => {
|
|
188
|
+
if (readonly.value) {
|
|
189
|
+
return readonlyValidation.validateField()
|
|
190
|
+
}
|
|
191
|
+
return await bridgeValidation.validateField(value, rules, warningRules)
|
|
192
|
+
}
|
|
152
193
|
|
|
153
194
|
// Agrégation des erreurs internes et externes
|
|
154
195
|
const errorMessages = computed(() => [...errors.value, ...props.externalErrorMessages])
|
|
155
196
|
const warningMessages = warnings
|
|
156
|
-
const
|
|
197
|
+
const displaySuccesses = computed(() => {
|
|
198
|
+
if (readonly.value) return []
|
|
199
|
+
return (bridgeValidation.validation as { displaySuccesses?: { value: string[] } }).displaySuccesses?.value ?? []
|
|
200
|
+
})
|
|
201
|
+
const successMessages = displaySuccesses
|
|
157
202
|
|
|
158
203
|
/**
|
|
159
204
|
* Safe validate utility
|
|
@@ -174,7 +219,6 @@
|
|
|
174
219
|
* Range input + validations
|
|
175
220
|
* =====================
|
|
176
221
|
*/
|
|
177
|
-
const selectedDates = ref<DateObjectValue>(null)
|
|
178
222
|
const {
|
|
179
223
|
handleRangeInput,
|
|
180
224
|
resetState,
|
|
@@ -185,14 +229,22 @@
|
|
|
185
229
|
handlePaste: handlePasteRange,
|
|
186
230
|
} = useDateRangeInput(displayFormat.value, isRange.value, parseDate, formatDate)
|
|
187
231
|
|
|
188
|
-
|
|
232
|
+
// Note: currentRangeIsValid et getRangeValidationError sont déjà définis pour le Bridge
|
|
233
|
+
// On met juste à jour les refs depuis useDateRangeValidation
|
|
234
|
+
const rangeValidation = useDateRangeValidation(selectedDates, isRange.value)
|
|
235
|
+
watch(() => rangeValidation.currentRangeIsValid.value, (v) => {
|
|
236
|
+
currentRangeIsValid.value = v
|
|
237
|
+
})
|
|
238
|
+
watch(() => rangeValidation.getRangeValidationError.value, (v) => {
|
|
239
|
+
getRangeValidationError.value = v
|
|
240
|
+
})
|
|
189
241
|
|
|
190
242
|
/**
|
|
191
243
|
* =====================
|
|
192
244
|
* Format + manual validation
|
|
193
245
|
* =====================
|
|
194
246
|
*/
|
|
195
|
-
|
|
247
|
+
// isUpdatingFromInternal est déjà déclaré plus haut pour le Bridge
|
|
196
248
|
const isFocused = ref(false)
|
|
197
249
|
const hasInteracted = ref(false)
|
|
198
250
|
const ariaLabel = ref(props.label || props.placeholder || DATE_PICKER_MESSAGES.LABEL_DEFAULT)
|
|
@@ -521,6 +573,19 @@
|
|
|
521
573
|
const nextCursorPosition = nextEditableIndex(dateFormat, editPosition + 1)
|
|
522
574
|
updateDateValue(updatedDateText, nextCursorPosition)
|
|
523
575
|
}
|
|
576
|
+
else if (isEditingLeftDate && separatorIndex !== -1) {
|
|
577
|
+
const rightStartPosition = nextEditableIndex(dateFormat, 0)
|
|
578
|
+
const updatedRightDateText = overwriteAt(rightDateText, rightStartPosition, keyboardEvent.key)
|
|
579
|
+
const nextCursorPosition = nextEditableIndex(dateFormat, rightStartPosition + 1)
|
|
580
|
+
|
|
581
|
+
isOverwriteEditing.value = true
|
|
582
|
+
inputValue.value = `${leftDateText}${rangeSeparator}${updatedRightDateText}`
|
|
583
|
+
requestAnimationFrame(() => {
|
|
584
|
+
const absoluteCursorPosition = separatorIndex + rangeSeparator.length + nextCursorPosition
|
|
585
|
+
inputElement.setSelectionRange(absoluteCursorPosition, absoluteCursorPosition)
|
|
586
|
+
isOverwriteEditing.value = false
|
|
587
|
+
})
|
|
588
|
+
}
|
|
524
589
|
return
|
|
525
590
|
}
|
|
526
591
|
|
|
@@ -576,7 +641,7 @@
|
|
|
576
641
|
return formatDate(date, returnFormat.value)
|
|
577
642
|
}
|
|
578
643
|
|
|
579
|
-
function emitModel(val:
|
|
644
|
+
function emitModel(val: DateModelValue) {
|
|
580
645
|
emit('update:model-value', val)
|
|
581
646
|
}
|
|
582
647
|
|
|
@@ -657,6 +722,30 @@
|
|
|
657
722
|
else handlePasteSingle(evt)
|
|
658
723
|
}
|
|
659
724
|
|
|
725
|
+
function applyAutoClampOnCurrentInput(syncModel = true): boolean {
|
|
726
|
+
if (!props.autoClamp || !inputValue.value) return false
|
|
727
|
+
|
|
728
|
+
const clamped = clampIfNeeded(inputValue.value)
|
|
729
|
+
if (clamped === inputValue.value) return false
|
|
730
|
+
|
|
731
|
+
inputValue.value = clamped
|
|
732
|
+
if (!syncModel) return true
|
|
733
|
+
|
|
734
|
+
// Sync model après clamp uniquement si la valeur a changé.
|
|
735
|
+
isFormatting.value = true
|
|
736
|
+
if (isRange.value) {
|
|
737
|
+
const [startDate, endDate] = parseRangeInput(inputValue.value)
|
|
738
|
+
if (startDate && endDate) emitModel([toReturnFormat(startDate), toReturnFormat(endDate)])
|
|
739
|
+
else if (startDate) emit('date-selected', toReturnFormat(startDate))
|
|
740
|
+
}
|
|
741
|
+
else {
|
|
742
|
+
const parsedDate = parseDate(inputValue.value, displayFormat.value)
|
|
743
|
+
if (parsedDate) emitModel(returnFormat.value !== displayFormat.value ? toReturnFormat(parsedDate) : formatDate(parsedDate, displayFormat.value))
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
return true
|
|
747
|
+
}
|
|
748
|
+
|
|
660
749
|
async function onFocus() {
|
|
661
750
|
isFocused.value = true
|
|
662
751
|
// Si aucun chiffre n'a été saisi (champ vide ou squelette), bootstrap et place le caret au début
|
|
@@ -682,18 +771,45 @@
|
|
|
682
771
|
return
|
|
683
772
|
}
|
|
684
773
|
|
|
774
|
+
// Le mode overwrite désactive le clamp pendant la frappe pour préserver le curseur.
|
|
775
|
+
// On l'applique donc avant la validation au blur, sinon une date comme 31/04
|
|
776
|
+
// sort en erreur avant d'atteindre la logique d'autoClamp.
|
|
777
|
+
// isFormatting bloque le watcher inputValue pour éviter une double émission du modèle.
|
|
778
|
+
isFormatting.value = true
|
|
779
|
+
applyAutoClampOnCurrentInput(false)
|
|
780
|
+
isFormatting.value = false
|
|
781
|
+
|
|
685
782
|
if (inputValue.value) {
|
|
686
783
|
const formatValidationResult = validateDateFormatForSingleOrRange(inputValue.value)
|
|
687
784
|
const customRulesValidationResult = await safeValidateField(inputValue.value, computed(() => props.customRules).value, computed(() => props.customWarningRules).value)
|
|
688
785
|
|
|
689
786
|
if (formatValidationResult.isValid && !customRulesValidationResult.hasError && !isRange.value) {
|
|
690
787
|
const parsedDate = dayjs(inputValue.value, displayFormat.value, true).toDate()
|
|
788
|
+
// Guard isFormatting to prevent the modelValue watcher from
|
|
789
|
+
// rewriting inputValue in reaction to our own emit.
|
|
790
|
+
isFormatting.value = true
|
|
691
791
|
emitModel(returnFormat.value !== displayFormat.value ? dayjs(parsedDate).format(returnFormat.value) : inputValue.value)
|
|
692
792
|
}
|
|
693
793
|
else if (formatValidationResult.isValid && !customRulesValidationResult.hasError && isRange.value) {
|
|
694
794
|
if (typeof inputValue.value === 'string' && inputValue.value.includes(' - ')) {
|
|
695
795
|
const dateRangeParts = inputValue.value.split(' - ')
|
|
696
|
-
if (dateRangeParts.length === 2)
|
|
796
|
+
if (dateRangeParts.length === 2) {
|
|
797
|
+
const sd = dayjs(dateRangeParts[0]!, displayFormat.value, true)
|
|
798
|
+
const ed = dayjs(dateRangeParts[1]!, displayFormat.value, true)
|
|
799
|
+
// Guard isFormatting to prevent the modelValue watcher from
|
|
800
|
+
// rewriting inputValue in reaction to our own emit.
|
|
801
|
+
isFormatting.value = true
|
|
802
|
+
if (sd.isValid() && ed.isValid()) {
|
|
803
|
+
const emittedRange: [string, string] = [
|
|
804
|
+
returnFormat.value !== displayFormat.value ? sd.format(returnFormat.value) : dateRangeParts[0]!,
|
|
805
|
+
returnFormat.value !== displayFormat.value ? ed.format(returnFormat.value) : dateRangeParts[1]!,
|
|
806
|
+
]
|
|
807
|
+
emitModel(emittedRange)
|
|
808
|
+
}
|
|
809
|
+
else {
|
|
810
|
+
emitModel([dateRangeParts[0]!, dateRangeParts[1]!])
|
|
811
|
+
}
|
|
812
|
+
}
|
|
697
813
|
else emitModel(inputValue.value)
|
|
698
814
|
}
|
|
699
815
|
else emitModel(inputValue.value)
|
|
@@ -701,29 +817,20 @@
|
|
|
701
817
|
else {
|
|
702
818
|
runRules(inputValue.value)
|
|
703
819
|
if (!props.disableErrorHandling && formatValidationResult.message) errors.value.push(formatValidationResult.message)
|
|
704
|
-
//
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
// For custom rule errors with valid format, keep the current value
|
|
820
|
+
// Keep the invalid input visible so the user can correct it.
|
|
821
|
+
// Do NOT emit null — that would trigger the modelValue watcher
|
|
822
|
+
// which clears inputValue and hides the error message.
|
|
823
|
+
return
|
|
709
824
|
}
|
|
710
825
|
}
|
|
711
826
|
|
|
712
|
-
// autoClamp au blur
|
|
713
|
-
if (props.autoClamp) inputValue.value = clampIfNeeded(inputValue.value)
|
|
714
|
-
|
|
715
|
-
// Sync model après clamp
|
|
716
|
-
if (isRange.value) {
|
|
717
|
-
const [startDate, endDate] = parseRangeInput(inputValue.value)
|
|
718
|
-
if (startDate && endDate) emitModel([toReturnFormat(startDate), toReturnFormat(endDate)])
|
|
719
|
-
else if (startDate) emit('date-selected', toReturnFormat(startDate))
|
|
720
|
-
}
|
|
721
|
-
else {
|
|
722
|
-
const parsedDate = parseDate(inputValue.value, displayFormat.value)
|
|
723
|
-
if (parsedDate) emitModel(returnFormat.value !== displayFormat.value ? toReturnFormat(parsedDate) : formatDate(parsedDate, displayFormat.value))
|
|
724
|
-
}
|
|
725
|
-
|
|
726
827
|
runRules(inputValue.value)
|
|
828
|
+
|
|
829
|
+
// Release isFormatting after the current microtask so that
|
|
830
|
+
// the modelValue watcher (triggered synchronously by emitModel)
|
|
831
|
+
// stays blocked, but future external changes are allowed.
|
|
832
|
+
await nextTick()
|
|
833
|
+
isFormatting.value = false
|
|
727
834
|
}
|
|
728
835
|
|
|
729
836
|
/**
|
|
@@ -874,7 +981,7 @@
|
|
|
874
981
|
})).validateDates()
|
|
875
982
|
}
|
|
876
983
|
finally {
|
|
877
|
-
|
|
984
|
+
queueMicrotask(() => (isUpdatingFromInternal.value = false))
|
|
878
985
|
}
|
|
879
986
|
|
|
880
987
|
if (result.isComplete && result.dates[1]) {
|
|
@@ -892,7 +999,7 @@
|
|
|
892
999
|
|
|
893
1000
|
emit('input', result.formattedValue)
|
|
894
1001
|
if (result.cursorPosition !== undefined && !isHandlingBackspace.value) {
|
|
895
|
-
|
|
1002
|
+
queueMicrotask(() => inputEl?.setSelectionRange(result.cursorPosition!, result.cursorPosition!))
|
|
896
1003
|
}
|
|
897
1004
|
}
|
|
898
1005
|
else {
|
|
@@ -992,7 +1099,7 @@
|
|
|
992
1099
|
successes,
|
|
993
1100
|
})).validateDates()
|
|
994
1101
|
}
|
|
995
|
-
finally {
|
|
1102
|
+
finally { queueMicrotask(() => (isUpdatingFromInternal.value = false)) }
|
|
996
1103
|
inputValue.value = formatRangeForDisplay(sd, ed)
|
|
997
1104
|
runRules(inputValue.value)
|
|
998
1105
|
}
|
|
@@ -1092,7 +1199,9 @@
|
|
|
1092
1199
|
:readonly="props.readonly"
|
|
1093
1200
|
:variant-style="props.isOutlined ? 'outlined' : 'underlined'"
|
|
1094
1201
|
:warning-messages="warningMessages"
|
|
1095
|
-
:success-messages="
|
|
1202
|
+
:success-messages="successMessages"
|
|
1203
|
+
:has-success="isOnSuccess"
|
|
1204
|
+
:show-success-messages="props.showSuccessMessages"
|
|
1096
1205
|
:bg-color="props.bgColor"
|
|
1097
1206
|
color="primary"
|
|
1098
1207
|
:is-clearable="!props.readonly"
|
|
@@ -1120,10 +1229,10 @@
|
|
|
1120
1229
|
}
|
|
1121
1230
|
|
|
1122
1231
|
:deep(.v-field) {
|
|
1123
|
-
color: rgb(var(--v-theme-
|
|
1232
|
+
color: rgb(var(--v-theme-warning)) !important;
|
|
1124
1233
|
|
|
1125
1234
|
.v-field__outline {
|
|
1126
|
-
color: rgb(var(--v-theme-
|
|
1235
|
+
color: rgb(var(--v-theme-warning)) !important;
|
|
1127
1236
|
}
|
|
1128
1237
|
}
|
|
1129
1238
|
|
|
@@ -1131,7 +1240,7 @@
|
|
|
1131
1240
|
opacity: 1 !important;
|
|
1132
1241
|
|
|
1133
1242
|
.v-messages__message {
|
|
1134
|
-
color: rgb(var(--v-theme-
|
|
1243
|
+
color: rgb(var(--v-theme-warning)) !important;
|
|
1135
1244
|
}
|
|
1136
1245
|
}
|
|
1137
1246
|
}
|
|
@@ -1139,11 +1248,11 @@
|
|
|
1139
1248
|
.error-field {
|
|
1140
1249
|
:deep(.v-input__control),
|
|
1141
1250
|
:deep(.v-messages__message) {
|
|
1142
|
-
color: rgb(var(--v-theme-
|
|
1251
|
+
color: rgb(var(--v-theme-error)) !important;
|
|
1143
1252
|
}
|
|
1144
1253
|
|
|
1145
1254
|
.v-field--active & {
|
|
1146
|
-
color: rgb(var(--v-theme-
|
|
1255
|
+
color: rgb(var(--v-theme-error)) !important;
|
|
1147
1256
|
}
|
|
1148
1257
|
}
|
|
1149
1258
|
|
|
@@ -1155,10 +1264,10 @@
|
|
|
1155
1264
|
}
|
|
1156
1265
|
|
|
1157
1266
|
:deep(.v-field) {
|
|
1158
|
-
color: rgb(var(--v-theme-
|
|
1267
|
+
color: rgb(var(--v-theme-onSuccessVariant)) !important;
|
|
1159
1268
|
|
|
1160
1269
|
.v-field__outline {
|
|
1161
|
-
color: rgb(var(--v-theme-
|
|
1270
|
+
color: rgb(var(--v-theme-onSuccessVariant)) !important;
|
|
1162
1271
|
}
|
|
1163
1272
|
}
|
|
1164
1273
|
|
|
@@ -1166,7 +1275,7 @@
|
|
|
1166
1275
|
opacity: 1 !important;
|
|
1167
1276
|
|
|
1168
1277
|
.v-messages__message {
|
|
1169
|
-
color: rgb(var(--v-theme-
|
|
1278
|
+
color: rgb(var(--v-theme-onSuccessVariant)) !important;
|
|
1170
1279
|
}
|
|
1171
1280
|
}
|
|
1172
1281
|
}
|
|
@@ -196,7 +196,7 @@ const meta = {
|
|
|
196
196
|
},
|
|
197
197
|
'birthDate': {
|
|
198
198
|
control: 'boolean',
|
|
199
|
-
description: '
|
|
199
|
+
description: '⚠️ **DEPRECATED** — Utilisez `isBirthDate` à la place.',
|
|
200
200
|
defaultValue: false,
|
|
201
201
|
},
|
|
202
202
|
'isBirthDate': {
|