@cnamts/synapse 1.0.26 → 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-BPR-a55G.js → AutocompleteFilter-C9eLKyW8.js} +3 -3
- package/dist/{DateFilter-CknrJWs2.js → DateFilter-y-GLkAkn.js} +8 -8
- package/dist/{NumberFilter-DJ-yNlzv.js → NumberFilter-DN6hIBS7.js} +1 -1
- package/dist/{PeriodFilter-CiB5Oa9Z.js → PeriodFilter-MoUUp9qS.js} +1 -1
- package/dist/{SelectFilter-EiafX97M.js → SelectFilter-bCbrdLmu.js} +1 -1
- package/dist/{TextFilter-BzOmpdxj.js → TextFilter-CvjgEaoM.js} +4 -4
- package/dist/apLightTheme2026-ug4Y23ns.js +611 -0
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2369 -353
- 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 +9 -10
- 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 +3 -3
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +3 -3
- package/dist/components/Customs/SyIconButton/SyIconButton.d.ts +18 -0
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +20 -38
- package/dist/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.d.ts +50 -0
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +6 -6
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +147 -136
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +62 -54
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +27 -24
- package/dist/components/DatePicker/composables/index.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDatePickerValidationBridge.d.ts +51 -0
- package/dist/components/MonthPicker/MonthPicker.d.ts +23 -23
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +23 -23
- package/dist/components/NirField/NirField.d.ts +56 -56
- package/dist/components/PasswordField/PasswordField.d.ts +3 -3
- package/dist/components/PeriodField/PeriodField.d.ts +236 -212
- package/dist/components/PhoneField/PhoneField.d.ts +23 -23
- 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 +1 -0
- package/dist/components/Tables/SyTable/SyTable.d.ts +1 -0
- package/dist/components/Tables/common/SyTablePagination.d.ts +25 -25
- package/dist/components/Tables/common/types.d.ts +2 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/composables/unifyValidation/documentationValidationProps.d.ts +160 -160
- package/dist/composables/unifyValidation/useValidation.d.ts +16 -14
- 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 -100
- 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 -101
- 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-CI6Q9nmO.js +39234 -0
- package/dist/synapse.css +1 -1
- package/dist/vuetifyConfig.js +208 -72
- package/package.json +4 -2
- package/src/assets/overrides/_icons.scss +5 -4
- package/src/assets/overrides/_otp.scss +4 -4
- package/src/assets/overrides/_typography.scss +2 -1
- package/src/assets/overrides/_utilities.scss +1 -42
- package/src/components/ChipList/ChipList.vue +30 -18
- package/src/components/ChipList/tests/chipList.spec.ts +4 -4
- package/src/components/CopyBtn/CopyBtn.vue +2 -2
- 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 +182 -218
- 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 +9 -491
- package/src/components/Customs/Selects/SySelect/SySelect.vue +46 -79
- 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 +196 -0
- 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 +2 -2
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +8 -8
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +8 -8
- 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 +82 -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/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 +23 -15
- 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.vue +37 -142
- 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.vue +47 -66
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +206 -0
- 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/DateTextInput/DateTextInput.vue +129 -54
- 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/useDatePickerValidationBridge.ts +205 -0
- 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/DialogBox/DialogBox.vue +1 -1
- 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 +2 -2
- 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/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/Pagination.vue +2 -2
- package/src/components/PasswordField/PasswordField.vue +8 -8
- package/src/components/PasswordField/tests/PasswordField.spec.ts +3 -3
- package/src/components/RangeField/RangeSlider/RangeSlider.vue +2 -2
- package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
- 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 +235 -83
- 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 +2 -1
- 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 +2 -1
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +64 -0
- package/src/components/Tables/common/TableHeader.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 +31 -0
- package/src/composables/date/tests/useHolidayDay.spec.ts +109 -0
- 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 +5 -5
- package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +177 -0
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +30 -0
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +6 -2
- package/src/composables/unifyValidation/useCustomValidation.ts +19 -9
- package/src/composables/unifyValidation/useValidation.ts +18 -21
- package/src/composables/useFilterable/useFilterable.spec.ts +42 -0
- package/src/composables/useFilterable/useFilterable.ts +11 -7
- package/src/composables/useFormFieldErrorHandling.ts +2 -2
- package/src/composantsVuetify/VBtn/VBtn.mdx +9 -39
- package/src/composantsVuetify/VBtn/v-btn.stories.ts +26 -86
- 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 -103
- 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 -104
- 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/Components/Components.stories.ts +7 -3
- 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/apLightTheme-DS0Uy44H.js +0 -954
- package/dist/components/RatingPicker/tests/RatingPicker.a11y.spect.d.ts +0 -1
- package/dist/main-BsJ9ec3i.js +0 -38954
- 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/components/RatingPicker/tests/{RatingPicker.a11y.spect.ts → RatingPicker.a11y.spec.ts} +0 -0
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
import DateTextInput from '../DateTextInput/DateTextInput.vue'
|
|
5
5
|
import ComplexDatePicker from '../ComplexDatePicker/ComplexDatePicker.vue'
|
|
6
6
|
import { VDatePicker } from 'vuetify/components'
|
|
7
|
-
import { useValidation, type ValidationResult, type ValidationRule } from '@/composables/validation/useValidation'
|
|
8
7
|
import { useValidatable } from '@/composables/validation/useValidatable'
|
|
9
8
|
import { useDateFormat } from '@/composables/date/useDateFormatDayjs'
|
|
10
9
|
import { useDateInitialization, type DateModelValue, type DateInput } from '@/composables/date/useDateInitializationDayjs'
|
|
11
10
|
import { useDatePickerAccessibility } from '@/composables/date/useDatePickerAccessibility'
|
|
12
|
-
import { useWeekendDays, useTodayButton, useDatePickerViewMode, useDateSelection, useMonthButtonCustomization, useDisplayedDateString, useAsteriskDisplay,
|
|
11
|
+
import { useWeekendDays, useTodayButton, useDatePickerViewMode, useDateSelection, useMonthButtonCustomization, useDisplayedDateString, useAsteriskDisplay, useDatePickerState, useHolidayHighlighting, useCalendarKeyboardNavigation, useDatePickerFocusTrap, useDatePickerValidationBridge } from '../composables'
|
|
13
12
|
import { DATE_PICKER_MESSAGES } from '../constants/messages'
|
|
14
13
|
import dayjs from 'dayjs'
|
|
15
14
|
import customParseFormat from 'dayjs/plugin/customParseFormat'
|
|
@@ -250,69 +249,6 @@
|
|
|
250
249
|
(e: 'date-selected', value: DateModelValue): void
|
|
251
250
|
}>()
|
|
252
251
|
|
|
253
|
-
const validation = useValidation({
|
|
254
|
-
showSuccessMessages: props.showSuccessMessages,
|
|
255
|
-
fieldIdentifier: 'Date',
|
|
256
|
-
disableErrorHandling: props.disableErrorHandling,
|
|
257
|
-
})
|
|
258
|
-
const { errors, warnings, successes, validateField: baseValidateField, clearValidation: baseClearValidation } = validation
|
|
259
|
-
|
|
260
|
-
const clearValidation = () => baseClearValidation()
|
|
261
|
-
|
|
262
|
-
watch(() => props.readonly, () => {
|
|
263
|
-
// When toggling readonly, reset validation state to avoid stale success/errors
|
|
264
|
-
errors.value = []
|
|
265
|
-
warnings.value = []
|
|
266
|
-
successes.value = []
|
|
267
|
-
})
|
|
268
|
-
|
|
269
|
-
const validateField = (
|
|
270
|
-
value: unknown,
|
|
271
|
-
rules: ValidationRule[] = [],
|
|
272
|
-
warningRules: ValidationRule[] = [],
|
|
273
|
-
successRules: ValidationRule[] = [],
|
|
274
|
-
): Promise<ValidationResult> | ValidationResult => {
|
|
275
|
-
if (props.readonly) {
|
|
276
|
-
return {
|
|
277
|
-
hasError: false,
|
|
278
|
-
hasWarning: false,
|
|
279
|
-
hasSuccess: false,
|
|
280
|
-
state: { errors: [], warnings: [], successes: [] },
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
return baseValidateField(value, rules, warningRules, successRules)
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
const validateFieldForDateValidation = (
|
|
288
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- compat signature with useDateValidation
|
|
289
|
-
value: any,
|
|
290
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- compat signature with useDateValidation
|
|
291
|
-
rules: any[] = [],
|
|
292
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- compat signature with useDateValidation
|
|
293
|
-
warningRules: any[] = [],
|
|
294
|
-
): ValidationResult => {
|
|
295
|
-
if (props.readonly) {
|
|
296
|
-
return {
|
|
297
|
-
hasError: false,
|
|
298
|
-
hasWarning: false,
|
|
299
|
-
hasSuccess: false,
|
|
300
|
-
state: {
|
|
301
|
-
errors: [],
|
|
302
|
-
warnings: [],
|
|
303
|
-
successes: [],
|
|
304
|
-
},
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
return validateField(value, rules, warningRules, []) as ValidationResult
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
const errorMessages = errors
|
|
312
|
-
const warningMessages = warnings
|
|
313
|
-
const successMessages = validation.displaySuccesses
|
|
314
|
-
const isOnSuccess = computed(() => successes.value.length > 0 && errors.value.length === 0 && warnings.value.length === 0)
|
|
315
|
-
|
|
316
252
|
// Variable pour éviter les mises à jour récursives
|
|
317
253
|
const isUpdatingFromInternal = ref(false)
|
|
318
254
|
const preventCloseOnKeyboardNavigation = ref(false)
|
|
@@ -320,78 +256,37 @@
|
|
|
320
256
|
const currentRangeIsValid = ref(true)
|
|
321
257
|
const getRangeValidationError = ref('')
|
|
322
258
|
|
|
323
|
-
const {
|
|
259
|
+
const {
|
|
260
|
+
validation,
|
|
261
|
+
errors,
|
|
262
|
+
warnings,
|
|
263
|
+
successes,
|
|
264
|
+
clearValidation,
|
|
265
|
+
validateDates,
|
|
266
|
+
} = useDatePickerValidationBridge({
|
|
267
|
+
showSuccessMessages: props.showSuccessMessages,
|
|
268
|
+
disableErrorHandling: props.disableErrorHandling,
|
|
324
269
|
noCalendar: props.noCalendar,
|
|
325
|
-
|
|
326
|
-
required: false,
|
|
270
|
+
required: props.required,
|
|
327
271
|
displayRange: props.displayRange,
|
|
328
|
-
disableErrorHandling: props.disableErrorHandling,
|
|
329
272
|
customRules: computed(() => props.customRules),
|
|
330
273
|
customWarningRules: computed(() => props.customWarningRules),
|
|
331
274
|
selectedDates: selectedDates as Ref<DateObjectValue>,
|
|
332
275
|
isUpdatingFromInternal,
|
|
333
276
|
currentRangeIsValid,
|
|
334
277
|
getRangeValidationError,
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
278
|
+
readonly: computed(() => props.readonly),
|
|
279
|
+
skipValidationWhenReadonly: true,
|
|
280
|
+
useCalendarModeRequiredFlow: true,
|
|
281
|
+
isInitialValidation,
|
|
282
|
+
isValidateOnBlur: computed(() => props.isValidateOnBlur),
|
|
283
|
+
onblur,
|
|
340
284
|
})
|
|
341
285
|
|
|
342
|
-
|
|
343
|
-
const
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
return
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
// Réinitialiser la validation
|
|
350
|
-
clearValidation()
|
|
351
|
-
|
|
352
|
-
// Si la gestion des erreurs est désactivée, on effectue la validation interne
|
|
353
|
-
// mais on n'ajoute pas les messages d'erreur
|
|
354
|
-
const shouldDisplayErrors = !props.disableErrorHandling
|
|
355
|
-
|
|
356
|
-
// Vérifier si le champ est requis et vide
|
|
357
|
-
if ((forceValidation || !isUpdatingFromInternal.value) && props.required && (!selectedDates.value || (Array.isArray(selectedDates.value) && selectedDates.value.length === 0))) {
|
|
358
|
-
if (props.readonly) {
|
|
359
|
-
return
|
|
360
|
-
}
|
|
361
|
-
// Ne pas afficher d'erreur si on est sur une perte de focus et si isValidateOnBlur est false
|
|
362
|
-
if (onblur.value && !props.isValidateOnBlur) {
|
|
363
|
-
return
|
|
364
|
-
}
|
|
365
|
-
// Ne pas afficher d'erreur si on est dans le contexte du mounted initial
|
|
366
|
-
if (shouldDisplayErrors && (!isInitialValidation.value || forceValidation)) {
|
|
367
|
-
errors.value.push(DATE_PICKER_MESSAGES.ERROR_REQUIRED)
|
|
368
|
-
}
|
|
369
|
-
return
|
|
370
|
-
}
|
|
371
|
-
// Permettre aux custom rules de s'exécuter même sur des champs vides
|
|
372
|
-
if (!selectedDates.value) {
|
|
373
|
-
if (!props.customRules || props.customRules.length === 0) return
|
|
374
|
-
|
|
375
|
-
if (shouldDisplayErrors && (!isInitialValidation.value || forceValidation)) {
|
|
376
|
-
// Comportement historique : exécuter directement les règles personnalisées même si la valeur est vide
|
|
377
|
-
await validateField(
|
|
378
|
-
selectedDates.value,
|
|
379
|
-
props.customRules,
|
|
380
|
-
props.customWarningRules,
|
|
381
|
-
)
|
|
382
|
-
// Dédoublonner les messages comme auparavant
|
|
383
|
-
errors.value = [...new Set(errors.value)]
|
|
384
|
-
warnings.value = [...new Set(warnings.value)]
|
|
385
|
-
successes.value = [...new Set(successes.value)]
|
|
386
|
-
}
|
|
387
|
-
return
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
// Ne pas afficher d'erreurs de custom rules si on est dans le contexte du mounted initial
|
|
391
|
-
if (shouldDisplayErrors && (!isInitialValidation.value || forceValidation)) {
|
|
392
|
-
await coreValidateDates(forceValidation)
|
|
393
|
-
}
|
|
394
|
-
}
|
|
286
|
+
const errorMessages = errors
|
|
287
|
+
const warningMessages = warnings
|
|
288
|
+
const successMessages = validation.displaySuccesses
|
|
289
|
+
const isOnSuccess = computed(() => successes.value.length > 0 && errors.value.length === 0 && warnings.value.length === 0)
|
|
395
290
|
|
|
396
291
|
// Fonction centralisée pour mettre à jour le modèle
|
|
397
292
|
const updateModel = async (value: DateModelValue) => {
|
|
@@ -409,9 +304,9 @@
|
|
|
409
304
|
}
|
|
410
305
|
finally {
|
|
411
306
|
// S'assurer que le flag est toujours réinitialisé
|
|
412
|
-
|
|
307
|
+
queueMicrotask(() => {
|
|
413
308
|
isUpdatingFromInternal.value = false
|
|
414
|
-
}
|
|
309
|
+
})
|
|
415
310
|
}
|
|
416
311
|
}
|
|
417
312
|
|
|
@@ -447,9 +342,9 @@
|
|
|
447
342
|
}
|
|
448
343
|
}
|
|
449
344
|
finally {
|
|
450
|
-
|
|
345
|
+
queueMicrotask(() => {
|
|
451
346
|
isUpdatingFromInternal.value = false
|
|
452
|
-
}
|
|
347
|
+
})
|
|
453
348
|
}
|
|
454
349
|
}
|
|
455
350
|
else {
|
|
@@ -497,7 +392,7 @@
|
|
|
497
392
|
|
|
498
393
|
// Gestionnaire pour les mises à jour du DateTextInput en mode no-calendar
|
|
499
394
|
const handleDateTextInputUpdate = async (value: DateModelValue) => {
|
|
500
|
-
if (isUpdatingFromInternal.value) return
|
|
395
|
+
if (isUpdatingFromInternal.value && !props.noCalendar) return
|
|
501
396
|
|
|
502
397
|
try {
|
|
503
398
|
isUpdatingFromInternal.value = true
|
|
@@ -1217,13 +1112,13 @@
|
|
|
1217
1112
|
.v-messages__message--success {
|
|
1218
1113
|
:deep(.v-input__control),
|
|
1219
1114
|
:deep(.v-messages__message) {
|
|
1220
|
-
color: rgb(var(--v-theme-
|
|
1115
|
+
color: rgb(var(--v-theme-onSuccessVariant)) !important;
|
|
1221
1116
|
|
|
1222
1117
|
--v-medium-emphasis-opacity: 1;
|
|
1223
1118
|
}
|
|
1224
1119
|
|
|
1225
1120
|
.v-field--active & {
|
|
1226
|
-
color: rgb(var(--v-theme-
|
|
1121
|
+
color: rgb(var(--v-theme-onSuccessVariant)) !important;
|
|
1227
1122
|
}
|
|
1228
1123
|
}
|
|
1229
1124
|
|
|
@@ -1241,33 +1136,33 @@
|
|
|
1241
1136
|
|
|
1242
1137
|
.v-messages__message--error {
|
|
1243
1138
|
:deep(.v-input__control) {
|
|
1244
|
-
color: rgb(var(--v-theme-
|
|
1139
|
+
color: rgb(var(--v-theme-error)) !important;
|
|
1245
1140
|
|
|
1246
1141
|
--v-medium-emphasis-opacity: 1;
|
|
1247
1142
|
}
|
|
1248
1143
|
|
|
1249
1144
|
:deep(.v-messages__message) {
|
|
1250
|
-
color: rgb(var(--v-theme-
|
|
1145
|
+
color: rgb(var(--v-theme-error)) !important;
|
|
1251
1146
|
}
|
|
1252
1147
|
|
|
1253
1148
|
.v-field--active & {
|
|
1254
|
-
color: rgb(var(--v-theme-
|
|
1149
|
+
color: rgb(var(--v-theme-error)) !important;
|
|
1255
1150
|
}
|
|
1256
1151
|
}
|
|
1257
1152
|
|
|
1258
1153
|
.v-messages__message--warning {
|
|
1259
1154
|
:deep(.v-input__control) {
|
|
1260
|
-
color: rgb(var(--v-theme-
|
|
1155
|
+
color: rgb(var(--v-theme-onWarningVariant)) !important;
|
|
1261
1156
|
|
|
1262
1157
|
--v-medium-emphasis-opacity: 1;
|
|
1263
1158
|
}
|
|
1264
1159
|
|
|
1265
1160
|
:deep(.v-messages__message) {
|
|
1266
|
-
color: rgb(var(--v-theme-
|
|
1161
|
+
color: rgb(var(--v-theme-onWarningVariant)) !important;
|
|
1267
1162
|
}
|
|
1268
1163
|
|
|
1269
1164
|
.v-field--active & {
|
|
1270
|
-
color: rgb(var(--v-theme-
|
|
1165
|
+
color: rgb(var(--v-theme-onWarningVariant)) !important;
|
|
1271
1166
|
}
|
|
1272
1167
|
}
|
|
1273
1168
|
|
|
@@ -1308,7 +1203,7 @@
|
|
|
1308
1203
|
}
|
|
1309
1204
|
|
|
1310
1205
|
:deep(.v-date-picker-month__day .v-btn:hover) {
|
|
1311
|
-
background-color: rgb(var(--v-theme-
|
|
1206
|
+
background-color: rgb(var(--v-theme-background));
|
|
1312
1207
|
}
|
|
1313
1208
|
|
|
1314
1209
|
:deep(.v-date-picker-month__day--selected, .v-date-picker-month__day--adjacent) {
|
|
@@ -1316,7 +1211,7 @@
|
|
|
1316
1211
|
}
|
|
1317
1212
|
|
|
1318
1213
|
:deep(.v-date-picker-month__day--selected .v-btn:hover) {
|
|
1319
|
-
background-color: rgb(var(--v-theme-
|
|
1214
|
+
background-color: rgb(var(--v-theme-primaryVariant)) !important;
|
|
1320
1215
|
}
|
|
1321
1216
|
|
|
1322
1217
|
.fade-enter-active,
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { mount, flushPromises } from '@vue/test-utils'
|
|
2
|
+
import { describe, it, expect, vi, afterEach } from 'vitest'
|
|
3
|
+
import { nextTick } from 'vue'
|
|
4
|
+
import DatePicker from '../DatePicker.vue'
|
|
5
|
+
|
|
6
|
+
describe('DatePicker.vue - coverage', () => {
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
vi.useRealTimers()
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
it('handleDateTextInputUpdate null efface selectedDates (noCalendar)', async () => {
|
|
12
|
+
const w = mount(DatePicker, {
|
|
13
|
+
props: { label: 'Date', modelValue: '01/01/2025', format: 'DD/MM/YYYY', noCalendar: true },
|
|
14
|
+
})
|
|
15
|
+
await flushPromises()
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
17
|
+
await (w.vm as any).handleDateTextInputUpdate(null)
|
|
18
|
+
await flushPromises()
|
|
19
|
+
expect(w.vm.selectedDates).toBeNull()
|
|
20
|
+
w.unmount()
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('handleDateTextInputUpdate array range met à jour selectedDates (noCalendar)', async () => {
|
|
24
|
+
const w = mount(DatePicker, {
|
|
25
|
+
props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', noCalendar: true, displayRange: true },
|
|
26
|
+
})
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
await (w.vm as any).handleDateTextInputUpdate(['01/01/2025', '10/01/2025'])
|
|
29
|
+
await flushPromises()
|
|
30
|
+
expect(w.vm.selectedDates).not.toBeNull()
|
|
31
|
+
w.unmount()
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
it('handleDateTextInputSelection met à jour le modèle', async () => {
|
|
35
|
+
const w = mount(DatePicker, {
|
|
36
|
+
props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', noCalendar: true },
|
|
37
|
+
})
|
|
38
|
+
const input = w.find('input')
|
|
39
|
+
await input.setValue('01/01/2025')
|
|
40
|
+
await input.trigger('blur')
|
|
41
|
+
await flushPromises()
|
|
42
|
+
const emitted = w.emitted('update:modelValue')
|
|
43
|
+
expect(emitted).toBeTruthy()
|
|
44
|
+
w.unmount()
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('watcher modelValue array range met à jour textInputValue (noCalendar)', async () => {
|
|
48
|
+
const w = mount(DatePicker, {
|
|
49
|
+
props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', noCalendar: true, displayRange: true },
|
|
50
|
+
})
|
|
51
|
+
await w.setProps({ modelValue: ['01/01/2025', '10/01/2025'] })
|
|
52
|
+
await flushPromises()
|
|
53
|
+
expect(w.exists()).toBe(true)
|
|
54
|
+
w.unmount()
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('watcher modelValue string execute le watcher noCalendar (valeur valide)', async () => {
|
|
58
|
+
vi.useFakeTimers()
|
|
59
|
+
const w = mount(DatePicker, {
|
|
60
|
+
props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', noCalendar: true },
|
|
61
|
+
})
|
|
62
|
+
await w.setProps({ modelValue: '15/06/2025' })
|
|
63
|
+
await nextTick()
|
|
64
|
+
vi.runAllTimers()
|
|
65
|
+
await nextTick()
|
|
66
|
+
expect(w.exists()).toBe(true)
|
|
67
|
+
w.unmount()
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
it('watcher modelValue string invalide execute le watcher noCalendar', async () => {
|
|
71
|
+
vi.useFakeTimers()
|
|
72
|
+
const w = mount(DatePicker, {
|
|
73
|
+
props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', noCalendar: true },
|
|
74
|
+
})
|
|
75
|
+
await w.setProps({ modelValue: 'invalid-date' })
|
|
76
|
+
await nextTick()
|
|
77
|
+
vi.runAllTimers()
|
|
78
|
+
await nextTick()
|
|
79
|
+
expect(w.exists()).toBe(true)
|
|
80
|
+
w.unmount()
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('watcher selectedDates null remet currentMonth/Year à today', async () => {
|
|
84
|
+
const w = mount(DatePicker, {
|
|
85
|
+
props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY' },
|
|
86
|
+
})
|
|
87
|
+
w.vm.selectedDates = new Date(2020, 5, 15)
|
|
88
|
+
await nextTick()
|
|
89
|
+
w.vm.selectedDates = null
|
|
90
|
+
await nextTick()
|
|
91
|
+
const today = new Date()
|
|
92
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
93
|
+
expect((w.vm as any).currentYear).toBe(today.getFullYear().toString())
|
|
94
|
+
w.unmount()
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
it('syncDisplayedMonthYearFromDate met à jour currentMonth et currentYear', async () => {
|
|
98
|
+
const w = mount(DatePicker, {
|
|
99
|
+
props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY' },
|
|
100
|
+
})
|
|
101
|
+
const date = new Date(2028, 3, 15) // Avril 2028
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
103
|
+
;(w.vm as any).syncDisplayedMonthYearFromDate(date)
|
|
104
|
+
await nextTick()
|
|
105
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
106
|
+
expect((w.vm as any).currentMonth).toBe('3')
|
|
107
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
108
|
+
expect((w.vm as any).currentYear).toBe('2028')
|
|
109
|
+
w.unmount()
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
it('openDatePickerOnFocus émet focus', async () => {
|
|
113
|
+
const w = mount(DatePicker, {
|
|
114
|
+
props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY' },
|
|
115
|
+
})
|
|
116
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
117
|
+
;(w.vm as any).openDatePickerOnFocus()
|
|
118
|
+
await nextTick()
|
|
119
|
+
expect(w.emitted('focus')).toBeTruthy()
|
|
120
|
+
w.unmount()
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
it('openDatePickerOnIconClick ne fait rien si readonly', async () => {
|
|
124
|
+
const w = mount(DatePicker, {
|
|
125
|
+
props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', readonly: true },
|
|
126
|
+
})
|
|
127
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
128
|
+
;(w.vm as any).openDatePickerOnIconClick()
|
|
129
|
+
await nextTick()
|
|
130
|
+
expect(w.vm.isDatePickerVisible).toBe(false)
|
|
131
|
+
w.unmount()
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
it('watcher displayFormattedDate disabled sync depuis modelValue', async () => {
|
|
135
|
+
const w = mount(DatePicker, {
|
|
136
|
+
props: { label: 'Date', modelValue: '01/01/2025', format: 'DD/MM/YYYY', disabled: true },
|
|
137
|
+
})
|
|
138
|
+
await flushPromises()
|
|
139
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
140
|
+
;(w.vm as any).displayFormattedDate = ''
|
|
141
|
+
await nextTick()
|
|
142
|
+
expect(w.exists()).toBe(true)
|
|
143
|
+
w.unmount()
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
it('handleSelectToday displayRange sélectionne les deux dates', async () => {
|
|
147
|
+
const w = mount(DatePicker, {
|
|
148
|
+
props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', displayRange: true },
|
|
149
|
+
})
|
|
150
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
151
|
+
;(w.vm as any).handleSelectToday()
|
|
152
|
+
await flushPromises()
|
|
153
|
+
expect(w.emitted('update:modelValue')).toBeTruthy()
|
|
154
|
+
w.unmount()
|
|
155
|
+
})
|
|
156
|
+
})
|