@cnamts/synapse 1.0.24 → 1.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -5
- package/dist/{AutocompleteFilter-BWLR3U7W.js → AutocompleteFilter-BPR-a55G.js} +1 -1
- package/dist/{DateFilter-BpwFexzi.js → DateFilter-CknrJWs2.js} +2 -2
- package/dist/{NumberFilter-Bz_NTdX9.js → NumberFilter-DJ-yNlzv.js} +1 -1
- package/dist/{PeriodFilter-DX_wy9g-.js → PeriodFilter-CiB5Oa9Z.js} +1 -1
- package/dist/{SelectFilter-xqiPtPgX.js → SelectFilter-EiafX97M.js} +2 -2
- package/dist/{TextFilter-BBl3JFqK.js → TextFilter-BzOmpdxj.js} +1 -1
- package/dist/{apLightTheme-D1P4jcD0.js → apLightTheme-DS0Uy44H.js} +446 -723
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +14 -8
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +60 -289
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +1 -0
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +4 -0
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1 -0
- package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +0 -2
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +54 -73
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +31 -40
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +9 -14
- package/dist/components/DatePicker/composables/useDatePickerState.d.ts +4 -3
- 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/FileList/FileList.d.ts +6 -0
- package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +13 -13
- package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
- package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +1 -0
- package/dist/components/MonthPicker/MonthPicker.d.ts +2 -7
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +2 -7
- package/dist/components/NirField/NirField.d.ts +12 -20
- package/dist/components/NirField/useNirValidation.d.ts +6 -2
- package/dist/components/PeriodField/PeriodField.d.ts +110 -150
- package/dist/components/PhoneField/PhoneField.d.ts +12 -7
- 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/tests/RatingPicker.a11y.spect.d.ts +1 -0
- package/dist/components/RatingPicker/useRatingFocus.d.ts +18 -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 +154 -364
- package/dist/components/Tables/common/TableHeader.d.ts +6 -1
- package/dist/components/Tables/common/filters/DateFilter.d.ts +4 -4
- package/dist/components/Tables/common/locales.d.ts +3 -0
- package/dist/components/Tables/common/types.d.ts +2 -0
- package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +1 -0
- package/dist/composables/date/useDateInitializationDayjs.d.ts +3 -1
- package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
- package/dist/composables/unifyValidation/useCustomValidation.d.ts +3 -1
- package/dist/composables/unifyValidation/useValidation.d.ts +12 -6
- package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +1 -1
- package/dist/composables/validation/useValidation.d.ts +6 -1
- package/dist/design-system-v3.js +2 -2
- package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
- package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
- package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
- package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +2 -0
- package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
- package/dist/designTokens/tokens/baseColors.d.ts +127 -0
- package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
- package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
- package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +2 -0
- package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
- package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
- package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
- package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
- package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
- package/dist/designTokens/utils/index.d.ts +2 -2
- package/dist/{main-BtTqyn4z.js → main-BsJ9ec3i.js} +16021 -15715
- package/dist/synapse.css +1 -1
- package/dist/utils/functions/classToHex.d.ts +1 -1
- package/dist/utils/functions/createHexResolver.d.ts +16 -0
- package/dist/vuetifyConfig.js +113 -152
- package/package.json +35 -23
- package/src/assets/amelipro/apTokens2026.scss +5 -5
- package/src/assets/overrides/_breakpoints.scss +25 -0
- package/src/assets/overrides/_btns.scss +0 -2
- package/src/assets/overrides/_forms.scss +1 -3
- package/src/assets/overrides/_icons.scss +5 -22
- package/src/assets/overrides/_otp.scss +40 -0
- package/src/assets/overrides/_tables.scss +11 -20
- package/src/assets/overrides/_tooltips.scss +17 -7
- package/src/assets/overrides/_typography.scss +35 -37
- package/src/assets/overrides/_utilities.scss +43 -47
- package/src/assets/themes.scss +1 -0
- package/src/components/Accordion/Accordion.vue +2 -0
- package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
- package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
- package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
- package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
- package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
- package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
- package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
- package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
- package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
- package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
- package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
- package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
- package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
- package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
- package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
- package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
- package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
- package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
- package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
- package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
- package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
- package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
- package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
- package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
- package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
- package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
- package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
- package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
- package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
- package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
- package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
- package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
- package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
- package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
- package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
- package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
- package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
- package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
- package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
- package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
- package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
- package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
- package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
- package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
- package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
- package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
- package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
- package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
- package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
- package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
- package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
- package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
- package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
- package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
- package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
- package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
- package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
- package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
- package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
- package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
- package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
- package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
- package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
- package/src/components/Captcha/Captcha.vue +1 -3
- package/src/components/ChipList/ChipList.vue +14 -16
- package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -3
- package/src/components/CookiesSelection/CookiesSelection.vue +2 -1
- package/src/components/CopyBtn/CopyBtn.vue +10 -3
- package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
- package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +8 -4
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +66 -0
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +4 -6
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +414 -135
- package/src/components/Customs/Selects/SySelect/SySelect.vue +502 -257
- package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +278 -4
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +3 -3
- package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +52 -2
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +18 -3
- package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +23 -5
- package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
- package/src/components/Customs/SyTabs/SyTabs.stories.ts +34 -35
- package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
- package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
- package/src/components/Customs/SyTabs/config.ts +3 -3
- package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
- package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +21 -41
- package/src/components/Customs/SyTextField/SyTextField.vue +34 -9
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +29 -28
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +28 -23
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +24 -1
- package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +65 -33
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
- package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
- package/src/components/DatePicker/composables/useDatePickerState.ts +56 -13
- 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 -3
- package/src/components/DatePicker/composables/useInputBlurHandler.ts +2 -2
- package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
- package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
- package/src/components/DatePicker/types.ts +1 -2
- package/src/components/DialogBox/DialogBox.stories.ts +8 -8
- package/src/components/DialogBox/DialogBox.vue +3 -5
- package/src/components/DialogBox/accessibilite/Accessibility.mdx +86 -22
- package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
- package/src/components/FileList/FileList.vue +9 -2
- package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
- package/src/components/FileList/tests/FileList.spec.ts +47 -0
- package/src/components/FileUpload/FileUpload.vue +3 -5
- package/src/components/FileUpload/FileUploadContent.vue +3 -5
- package/src/components/FilterInline/FilterInline.vue +1 -3
- package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
- package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
- package/src/components/FilterSideBar/FilterSideBar.vue +9 -1
- package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
- package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
- package/src/components/FooterBar/FooterBar.vue +9 -13
- package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
- package/src/components/HeaderBar/HeaderBar.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
- package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
- package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
- package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
- package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
- package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
- package/src/components/LangBtn/LangBtn.vue +4 -5
- package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
- package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
- package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
- package/src/components/NirField/NirField.stories.ts +2 -2
- package/src/components/NirField/NirField.vue +3 -5
- package/src/components/NirField/accessibilite/Accessibility.mdx +100 -5
- package/src/components/NirField/tests/NirField.spec.ts +118 -0
- package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
- package/src/components/NirField/useNirValidation.ts +38 -32
- package/src/components/NotificationBar/Notification/Notification.vue +7 -9
- package/src/components/NotificationBar/NotificationBar.vue +1 -3
- package/src/components/PaginatedTable/PaginatedTable.vue +3 -4
- package/src/components/PaginatedTable/Pagination.vue +4 -6
- package/src/components/PasswordField/PasswordField.vue +15 -13
- package/src/components/PhoneField/PhoneField.vue +7 -5
- package/src/components/RangeField/RangeSlider/RangeSlider.vue +11 -20
- package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
- package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
- package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +38 -56
- 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 +31 -42
- 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.spect.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/SearchListField/SearchListField.vue +0 -2
- package/src/components/SkipLink/SkipLink.vue +2 -4
- package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
- package/src/components/SubHeader/SubHeader.vue +1 -1
- package/src/components/SyAlert/SyAlert.vue +7 -9
- package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
- package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
- package/src/components/SyTextArea/SyTextArea.vue +32 -1
- package/src/components/TableToolbar/TableToolbar.vue +6 -8
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +166 -0
- package/src/components/Tables/SyServerTable/SyServerTable.vue +10 -8
- package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +23 -0
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +268 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +104 -0
- package/src/components/Tables/SyTable/SyTable.vue +10 -8
- package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +22 -0
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +274 -0
- package/src/components/Tables/common/SyTableFilter.vue +31 -6
- package/src/components/Tables/common/SyTablePagination.vue +143 -19
- package/src/components/Tables/common/TableHeader.vue +41 -4
- package/src/components/Tables/common/filters/DateFilter.vue +2 -2
- package/src/components/Tables/common/filters/SelectFilter.vue +1 -1
- package/src/components/Tables/common/locales.ts +3 -0
- package/src/components/Tables/common/tableStyles.scss +16 -19
- package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
- package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
- package/src/components/Tables/common/types.ts +2 -0
- package/src/components/Tables/common/useTableHeaders.ts +49 -27
- package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
- package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
- package/src/components/UploadWorkflow/useFileList.ts +3 -0
- package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
- package/src/composables/date/tests/useDateFormatDayjs.spec.ts +81 -0
- package/src/composables/date/tests/{useDateInitialization.spec.ts → useDateInitializationDayjs.spec.ts} +39 -3
- package/src/composables/date/useDateInitializationDayjs.ts +4 -1
- package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +2 -1
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +22 -0
- package/src/composables/unifyValidation/useCustomValidation.ts +16 -4
- package/src/composables/unifyValidation/useValidation.ts +46 -15
- package/src/composables/unifyValidation/useVuetifyValidation.ts +2 -2
- package/src/composables/useFormFieldErrorHandling.ts +4 -1
- package/src/composables/validation/tests/useValidation.spec.ts +2 -2
- package/src/composables/validation/useValidation.ts +32 -4
- package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
- package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
- package/src/composantsVuetify/VCard/VCard.mdx +59 -0
- package/src/composantsVuetify/VCard/v-card.stories.ts +279 -0
- package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
- package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
- package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
- package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
- package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
- package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
- package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
- package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
- package/src/designTokens/tests/themeUtils.spec.ts +53 -0
- package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
- package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
- package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
- package/src/designTokens/tokens/amelipro/apLightTheme.ts +4 -1
- package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
- package/src/designTokens/tokens/baseColors.ts +129 -0
- package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
- package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
- package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
- package/src/designTokens/tokens/cnam/cnamLightTheme.ts +4 -1
- package/src/designTokens/tokens/cnam/cnamSemantic.ts +1 -1
- package/src/designTokens/tokens/pa/paColors.ts +2 -166
- package/src/designTokens/tokens/pa/paContextual.ts +3 -48
- package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
- package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
- package/src/designTokens/utils/buildColorClassMap.ts +34 -0
- package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
- package/src/designTokens/utils/createFlattenTheme.ts +15 -7
- package/src/designTokens/utils/index.ts +2 -2
- package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +61 -91
- package/src/stories/Accessibilite/AuditDesignSystem.mdx +5 -19
- 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/DesignSystem/Avancement.mdx +433 -0
- package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
- package/src/stories/Accessibilite/Introduction.mdx +30 -30
- package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +176 -79
- package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +67 -19
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +78 -50
- 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 +55 -67
- package/src/stories/Components/Components.stories.ts +92 -4
- package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
- package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
- package/src/stories/Demarrer/Releases.stories.ts +48 -5
- package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
- package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
- package/src/stories/DesignTokens/colors.stories.ts +5 -6
- package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
- package/src/stories/GuideDuDev/Theme.mdx +36 -26
- package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
- package/src/stories/styles/accessibility-guide.css +3 -3
- package/src/utils/functions/classToHex.ts +6 -34
- package/src/utils/functions/createHexResolver.ts +45 -0
- package/src/utils/functions/tests/classToHex.spec.ts +36 -0
- package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
- package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
- package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
- package/dist/AutocompleteFilter-D9jzRzAL.cjs +0 -1
- package/dist/DateFilter-DTUl8hb1.cjs +0 -1
- package/dist/NumberFilter-MAEojdk0.cjs +0 -1
- package/dist/PeriodFilter-CC4WgIhl.cjs +0 -1
- package/dist/SelectFilter-BR3fvl-a.cjs +0 -1
- package/dist/TextFilter-CCfYFl5F.cjs +0 -1
- package/dist/apLightTheme-CFSRrjv2.cjs +0 -1
- 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/designTokens/utils/convertGaps.d.ts +0 -5
- package/dist/main-C1e3eoxd.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/assets/apTokens.scss +0 -343
- package/src/assets/overrides/_container.scss +0 -36
- package/src/assets/tokens.scss +0 -388
- 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/designTokens/apColors.md +0 -66
- package/src/designTokens/cnamColors.md +0 -193
- package/src/designTokens/paColors.md +0 -66
- package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
- package/src/designTokens/tokens/json/primitives.json +0 -209
- package/src/designTokens/tokens/json/semantic.json +0 -120
- package/src/designTokens/utils/convertGaps.ts +0 -11
- package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
- package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +0 -306
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
|
|
2
|
-
import { initializeSelectedDates, type DateInput } from '../
|
|
2
|
+
import { initializeSelectedDates, type DateInput } from '../useDateInitializationDayjs'
|
|
3
3
|
|
|
4
|
-
describe('
|
|
4
|
+
describe('useDateInitializationDayjs', () => {
|
|
5
5
|
describe('initializeSelectedDates', () => {
|
|
6
6
|
it('returns null when modelValue is null or undefined', () => {
|
|
7
7
|
expect(initializeSelectedDates(null, 'DD/MM/YYYY')).toBeNull()
|
|
@@ -70,7 +70,7 @@ describe('useDateInitialization', () => {
|
|
|
70
70
|
expect(result1).toBeInstanceOf(Date)
|
|
71
71
|
expect((result1 as Date).getDate()).toBe(15)
|
|
72
72
|
|
|
73
|
-
// Date au format d'affichage quand le format de retour est
|
|
73
|
+
// Date au format d'affichage quand le format de retour est différent
|
|
74
74
|
const result2 = initializeSelectedDates('15/01/2023', 'DD/MM/YYYY', 'YYYY-MM-DD')
|
|
75
75
|
expect(result2).toBeInstanceOf(Date)
|
|
76
76
|
expect((result2 as Date).getDate()).toBe(15)
|
|
@@ -97,6 +97,42 @@ describe('useDateInitialization', () => {
|
|
|
97
97
|
})
|
|
98
98
|
})
|
|
99
99
|
|
|
100
|
+
it('creates dates at midnight (00:00:00.000)', () => {
|
|
101
|
+
const result = initializeSelectedDates('15/06/2023', 'DD/MM/YYYY') as Date
|
|
102
|
+
expect(result.getHours()).toBe(0)
|
|
103
|
+
expect(result.getMinutes()).toBe(0)
|
|
104
|
+
expect(result.getSeconds()).toBe(0)
|
|
105
|
+
expect(result.getMilliseconds()).toBe(0)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
it('creates dates at midnight for arrays too', () => {
|
|
109
|
+
const result = initializeSelectedDates(['01/03/2023', '15/03/2023'], 'DD/MM/YYYY') as Date[]
|
|
110
|
+
result.forEach((date) => {
|
|
111
|
+
expect(date.getHours()).toBe(0)
|
|
112
|
+
expect(date.getMinutes()).toBe(0)
|
|
113
|
+
expect(date.getSeconds()).toBe(0)
|
|
114
|
+
})
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
it('handles range array with different return format', () => {
|
|
118
|
+
const result = initializeSelectedDates(['2023-01-10', '2023-01-20'], 'DD/MM/YYYY', 'YYYY-MM-DD')
|
|
119
|
+
expect(Array.isArray(result)).toBe(true)
|
|
120
|
+
const dates = result as Date[]
|
|
121
|
+
expect(dates).toHaveLength(2)
|
|
122
|
+
expect(dates[0]?.getDate()).toBe(10)
|
|
123
|
+
expect(dates[1]?.getDate()).toBe(20)
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
it('accepts a range where both dates are equal', () => {
|
|
127
|
+
const result = initializeSelectedDates(['15/01/2023', '15/01/2023'], 'DD/MM/YYYY')
|
|
128
|
+
expect(Array.isArray(result)).toBe(true)
|
|
129
|
+
expect(result).toHaveLength(2)
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
it('returns null for empty string input', () => {
|
|
133
|
+
expect(initializeSelectedDates('', 'DD/MM/YYYY')).toBeNull()
|
|
134
|
+
})
|
|
135
|
+
|
|
100
136
|
it('returns null for object input', () => {
|
|
101
137
|
const result = initializeSelectedDates({}, 'DD/MM/YYYY')
|
|
102
138
|
expect(result).toBeNull()
|
|
@@ -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
|
/**
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
const RuleGeneralType = `'required' | 'custom'`
|
|
2
|
+
const StringRuleType = `'minLength' | 'maxLength' | 'exactLength' | 'email' | 'matchPattern'`
|
|
3
|
+
const NumberRuleType = `'min' | 'max'`
|
|
4
|
+
const DateRuleType = `'noWeekend' | 'noBeforeToday' | 'notAfterToday' | 'notBeforeDate' | 'notAfterDate' | 'dateExact' | 'isHolidayDay'`
|
|
5
|
+
|
|
6
|
+
function generateBuiltInRuleType(type: 'base' | 'date' | 'number' | 'string' | 'all' = 'all') {
|
|
7
|
+
switch (type) {
|
|
8
|
+
case 'base':
|
|
9
|
+
return RuleGeneralType
|
|
10
|
+
case 'date':
|
|
11
|
+
return `${RuleGeneralType} | ${DateRuleType}`
|
|
12
|
+
case 'number':
|
|
13
|
+
return `${RuleGeneralType} | ${NumberRuleType}`
|
|
14
|
+
case 'string':
|
|
15
|
+
return `${RuleGeneralType} | ${StringRuleType}`
|
|
16
|
+
case 'all':
|
|
17
|
+
return `${RuleGeneralType} | ${NumberRuleType} | ${StringRuleType} | ${DateRuleType}`
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function getValidationDocumentation(type: 'date' | 'number' | 'string' | 'all' = 'all') {
|
|
22
|
+
const builtInRuleType = generateBuiltInRuleType(type)
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
readonly: {
|
|
26
|
+
description: 'Permet de rendre le champ en lecture seule, le champ deviens grisé.',
|
|
27
|
+
control: 'boolean',
|
|
28
|
+
table: {
|
|
29
|
+
type: { summary: 'boolean' },
|
|
30
|
+
defaultValue: { summary: 'false' },
|
|
31
|
+
category: 'props',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
disabled: {
|
|
35
|
+
description: 'Désactive le champ sans changement visuel pour l\'utilisateur.',
|
|
36
|
+
control: 'boolean',
|
|
37
|
+
table: {
|
|
38
|
+
type: { summary: 'boolean' },
|
|
39
|
+
defaultValue: { summary: 'false' },
|
|
40
|
+
category: 'props',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
required: {
|
|
44
|
+
description: 'Indique que le champ est requis.',
|
|
45
|
+
control: 'boolean',
|
|
46
|
+
table: {
|
|
47
|
+
type: { summary: 'boolean' },
|
|
48
|
+
defaultValue: { summary: 'false' },
|
|
49
|
+
category: 'props',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
isValidateOnBlur: {
|
|
53
|
+
description: 'Détermine si la validation doit être déclenchée lors de la saisie ou du blur de l\'input.',
|
|
54
|
+
control: 'boolean',
|
|
55
|
+
table: {
|
|
56
|
+
type: { summary: 'boolean' },
|
|
57
|
+
defaultValue: { summary: 'true' },
|
|
58
|
+
category: 'props',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
showSuccessMessages: {
|
|
62
|
+
description: 'Affiche les messages de succès lorsque la validation est réussie. Si la prop est à `false` cela cache uniquement les messages texte, l\'état visuel reste actif.',
|
|
63
|
+
control: 'boolean',
|
|
64
|
+
table: {
|
|
65
|
+
type: { summary: 'boolean' },
|
|
66
|
+
defaultValue: { summary: 'true' },
|
|
67
|
+
category: 'props',
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
disableErrorHandling: {
|
|
71
|
+
description: 'Désactive la gestion des erreurs, utile lorsque vous souhaitez gérer les erreurs manuellement.',
|
|
72
|
+
control: 'boolean',
|
|
73
|
+
table: {
|
|
74
|
+
type: { summary: 'boolean' },
|
|
75
|
+
defaultValue: { summary: 'false' },
|
|
76
|
+
category: 'props',
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
useVuetifyValidation: {
|
|
80
|
+
description: 'Indique si la validation doit être gérée par Vuetify (true) ou par Synapse (false).',
|
|
81
|
+
control: 'boolean',
|
|
82
|
+
table: {
|
|
83
|
+
type: { summary: 'boolean' },
|
|
84
|
+
defaultValue: { summary: 'false' },
|
|
85
|
+
category: 'props',
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
label: {
|
|
89
|
+
description: 'Le label du champ.',
|
|
90
|
+
control: 'text',
|
|
91
|
+
table: {
|
|
92
|
+
type: { summary: 'string' },
|
|
93
|
+
category: 'props',
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
rules: {
|
|
97
|
+
description: 'Les règles de validation Vuetify à appliquer au champ si useVuetifyValidation est true.',
|
|
98
|
+
control: 'object',
|
|
99
|
+
table: {
|
|
100
|
+
type: {
|
|
101
|
+
summary: 'array',
|
|
102
|
+
detail: `
|
|
103
|
+
(value: unknown) => boolean | string
|
|
104
|
+
`,
|
|
105
|
+
},
|
|
106
|
+
category: 'props',
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
customRules: {
|
|
110
|
+
description: 'Les règles de validation personnalisées d\'erreur (bloquantes) à appliquer au champ. Elles sont évaluées à partir de la valeur du champ.',
|
|
111
|
+
control: 'object',
|
|
112
|
+
table: {
|
|
113
|
+
type: {
|
|
114
|
+
summary: 'array',
|
|
115
|
+
detail: `
|
|
116
|
+
{
|
|
117
|
+
type: ${builtInRuleType},
|
|
118
|
+
options: {
|
|
119
|
+
validate: (value: unknown) => boolean | string,
|
|
120
|
+
message: string,
|
|
121
|
+
[key: string]: unknown
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
`,
|
|
125
|
+
},
|
|
126
|
+
category: 'props',
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
customWarningRules: {
|
|
130
|
+
description: 'Les règles de validation personnalisées d\'avertissement (non bloquantes) à appliquer au champ. Elles sont évaluées à partir de la valeur du champ.',
|
|
131
|
+
control: 'object',
|
|
132
|
+
table: {
|
|
133
|
+
type: {
|
|
134
|
+
summary: 'array',
|
|
135
|
+
detail: `
|
|
136
|
+
{
|
|
137
|
+
type: ${builtInRuleType},
|
|
138
|
+
options: {
|
|
139
|
+
validate: (value: unknown) => boolean | string,
|
|
140
|
+
message: string,
|
|
141
|
+
[key: string]: unknown
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
`,
|
|
145
|
+
},
|
|
146
|
+
category: 'props',
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
customSuccessRules: {
|
|
150
|
+
description: 'Les règles de validation personnalisées de succès à appliquer au champ. Elles sont évaluées à partir de la valeur du champ.',
|
|
151
|
+
control: 'object',
|
|
152
|
+
table: {
|
|
153
|
+
type: {
|
|
154
|
+
summary: 'array',
|
|
155
|
+
detail: `
|
|
156
|
+
{
|
|
157
|
+
type: ${builtInRuleType},
|
|
158
|
+
options: {
|
|
159
|
+
validate: (value: unknown) => boolean | string,
|
|
160
|
+
message: string,
|
|
161
|
+
[key: string]: unknown
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
`,
|
|
165
|
+
},
|
|
166
|
+
category: 'props',
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
errorMessages: {
|
|
170
|
+
description: 'Permet d\'injecter des messages d\'erreur depuis le parent. Aucun calcul de validation n\'est exécuté.',
|
|
171
|
+
control: 'object',
|
|
172
|
+
table: {
|
|
173
|
+
type: { summary: 'array<string>' },
|
|
174
|
+
category: 'props',
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
warningMessages: {
|
|
178
|
+
description: 'Permet d\'injecter des messages d\'avertissement depuis le parent. Aucun calcul de validation n\'est exécuté.',
|
|
179
|
+
control: 'object',
|
|
180
|
+
table: {
|
|
181
|
+
type: { summary: 'array<string>' },
|
|
182
|
+
category: 'props',
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
successMessages: {
|
|
186
|
+
description: 'Permet d\'injecter des messages de succès depuis le parent. Aucun calcul de validation n\'est exécuté.',
|
|
187
|
+
control: 'object',
|
|
188
|
+
table: {
|
|
189
|
+
type: { summary: 'array<string>' },
|
|
190
|
+
category: 'props',
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
hasError: {
|
|
194
|
+
description: 'Indique si le champ a une erreur, peut être utilisé pour forcer l\'état d\'erreur.',
|
|
195
|
+
control: 'boolean',
|
|
196
|
+
table: {
|
|
197
|
+
type: { summary: 'boolean' },
|
|
198
|
+
category: 'props',
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
hasWarning: {
|
|
202
|
+
description: 'Indique si le champ a un avertissement, peut être utilisé pour forcer l\'état d\'avertissement.',
|
|
203
|
+
control: 'boolean',
|
|
204
|
+
table: {
|
|
205
|
+
type: { summary: 'boolean' },
|
|
206
|
+
category: 'props',
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
hasSuccess: {
|
|
210
|
+
description: 'Indique si le champ a un succès, peut être utilisé pour forcer l\'état de succès.',
|
|
211
|
+
control: 'boolean',
|
|
212
|
+
table: {
|
|
213
|
+
type: { summary: 'boolean' },
|
|
214
|
+
category: 'props',
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
hideDetails: {
|
|
218
|
+
description: 'Masque la section des détails (messages d\'erreur, compteur)',
|
|
219
|
+
control: 'boolean',
|
|
220
|
+
table: {
|
|
221
|
+
type: { summary: 'boolean' },
|
|
222
|
+
defaultValue: { summary: 'false' },
|
|
223
|
+
category: 'props',
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
maxErrors: {
|
|
227
|
+
description: 'Le nombre maximum d\'erreurs à afficher, applicable uniquement si useVuetifyValidation est true.',
|
|
228
|
+
control: 'number',
|
|
229
|
+
table: {
|
|
230
|
+
type: { summary: 'number' },
|
|
231
|
+
category: 'props',
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
}
|
|
235
|
+
}
|
|
@@ -468,7 +468,8 @@ describe('useCustomValidation', () => {
|
|
|
468
468
|
args.disableErrorHandling,
|
|
469
469
|
),
|
|
470
470
|
)
|
|
471
|
-
await result.validate()
|
|
471
|
+
const validationResult = await result.validate()
|
|
472
|
+
expect(validationResult.hasSuccess).toBe(true)
|
|
472
473
|
expect(args.successes.value).toEqual([])
|
|
473
474
|
})
|
|
474
475
|
|
|
@@ -1490,6 +1490,7 @@ describe('useValidation (unifyValidation)', () => {
|
|
|
1490
1490
|
const { result } = withSetup(() => useValidation(params as Parameters<typeof useValidation>[0]))
|
|
1491
1491
|
|
|
1492
1492
|
await result.validate()
|
|
1493
|
+
expect(result.hasSuccess.value).toBe(true)
|
|
1493
1494
|
expect(result.successes.value).toContain('Succès externe')
|
|
1494
1495
|
})
|
|
1495
1496
|
|
|
@@ -1510,9 +1511,30 @@ describe('useValidation (unifyValidation)', () => {
|
|
|
1510
1511
|
const { result } = withSetup(() => useValidation(params as Parameters<typeof useValidation>[0]))
|
|
1511
1512
|
|
|
1512
1513
|
await result.validate()
|
|
1514
|
+
expect(result.hasSuccess.value).toBe(true)
|
|
1513
1515
|
expect(result.successes.value).not.toContain('Succès interne')
|
|
1514
1516
|
expect(result.successes.value).toContain('Succès externe')
|
|
1515
1517
|
})
|
|
1518
|
+
|
|
1519
|
+
it('keeps hasSuccess true when inner success messages are hidden', async () => {
|
|
1520
|
+
const params = makeParams({
|
|
1521
|
+
modelValue: ref('ok'),
|
|
1522
|
+
showSuccessMessages: ref(false),
|
|
1523
|
+
customRules: ref([]),
|
|
1524
|
+
customSuccessRules: ref([{
|
|
1525
|
+
type: 'custom',
|
|
1526
|
+
options: {
|
|
1527
|
+
validate: (value: unknown) => value === 'ok',
|
|
1528
|
+
successMessage: 'Succès interne',
|
|
1529
|
+
},
|
|
1530
|
+
}]),
|
|
1531
|
+
})
|
|
1532
|
+
const { result } = withSetup(() => useValidation(params as Parameters<typeof useValidation>[0]))
|
|
1533
|
+
|
|
1534
|
+
await result.validate()
|
|
1535
|
+
expect(result.hasSuccess.value).toBe(true)
|
|
1536
|
+
expect(result.successes.value).toEqual([])
|
|
1537
|
+
})
|
|
1516
1538
|
})
|
|
1517
1539
|
|
|
1518
1540
|
describe('rules concurrences', () => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useValidation, type ValidationRule } from '@/composables/validation/useValidation'
|
|
2
2
|
import { useValidatable } from '@/composables/validation/useValidatable'
|
|
3
|
-
import { watch } from 'vue'
|
|
3
|
+
import { ref, watch } from 'vue'
|
|
4
4
|
import type { Ref } from 'vue'
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -15,13 +15,15 @@ export function useCustomValidation(
|
|
|
15
15
|
warnings: Ref<string[]>,
|
|
16
16
|
successes: Ref<string[]>,
|
|
17
17
|
showSuccessMessages: Ref<boolean>,
|
|
18
|
-
label: Ref<string>,
|
|
18
|
+
label: Ref<string | undefined>,
|
|
19
19
|
focused: Ref<boolean>,
|
|
20
20
|
isValidateOnBlur: Ref<boolean>,
|
|
21
21
|
disableErrorHandling: Ref<boolean>,
|
|
22
22
|
readonly?: Ref<boolean>,
|
|
23
23
|
disabled?: Ref<boolean>,
|
|
24
24
|
) {
|
|
25
|
+
const hasSuccess = ref(false)
|
|
26
|
+
|
|
25
27
|
let validator = useValidation({
|
|
26
28
|
showSuccessMessages: showSuccessMessages.value,
|
|
27
29
|
fieldIdentifier: label.value,
|
|
@@ -37,7 +39,7 @@ export function useCustomValidation(
|
|
|
37
39
|
disableErrorHandling: disableErrorHandling.value,
|
|
38
40
|
})
|
|
39
41
|
|
|
40
|
-
const isDirty = errors.value.length > 0 || warnings.value.length > 0 || successes.value.length > 0
|
|
42
|
+
const isDirty = errors.value.length > 0 || warnings.value.length > 0 || successes.value.length > 0 || hasSuccess.value
|
|
41
43
|
if (isDirty) {
|
|
42
44
|
validate()
|
|
43
45
|
}
|
|
@@ -50,6 +52,7 @@ export function useCustomValidation(
|
|
|
50
52
|
errors.value = []
|
|
51
53
|
warnings.value = []
|
|
52
54
|
successes.value = []
|
|
55
|
+
hasSuccess.value = false
|
|
53
56
|
return { hasError: false, hasWarning: false, hasSuccess: false, state: { errors: [] as string[], warnings: [] as string[], successes: [] as string[] } }
|
|
54
57
|
}
|
|
55
58
|
|
|
@@ -63,6 +66,7 @@ export function useCustomValidation(
|
|
|
63
66
|
errors.value = result.state.errors
|
|
64
67
|
warnings.value = result.state.warnings
|
|
65
68
|
successes.value = result.state.successes
|
|
69
|
+
hasSuccess.value = result.hasSuccess
|
|
66
70
|
|
|
67
71
|
return result
|
|
68
72
|
}
|
|
@@ -75,6 +79,7 @@ export function useCustomValidation(
|
|
|
75
79
|
errors.value = []
|
|
76
80
|
warnings.value = []
|
|
77
81
|
successes.value = []
|
|
82
|
+
hasSuccess.value = false
|
|
78
83
|
},
|
|
79
84
|
() => modelValue.value = undefined,
|
|
80
85
|
)
|
|
@@ -91,5 +96,12 @@ export function useCustomValidation(
|
|
|
91
96
|
}
|
|
92
97
|
})
|
|
93
98
|
|
|
94
|
-
|
|
99
|
+
function clearValidation() {
|
|
100
|
+
errors.value = []
|
|
101
|
+
warnings.value = []
|
|
102
|
+
successes.value = []
|
|
103
|
+
hasSuccess.value = false
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return { validate, hasSuccess, clearValidation }
|
|
95
107
|
}
|
|
@@ -12,15 +12,21 @@ export interface FieldValidationProps {
|
|
|
12
12
|
isValidateOnBlur?: boolean
|
|
13
13
|
showSuccessMessages?: boolean
|
|
14
14
|
disableErrorHandling?: boolean
|
|
15
|
-
//
|
|
15
|
+
// Quand cette prop vaut true (mode natif Vuetify), c'est Vuetify qui gère les erreurs, avertissements et succès
|
|
16
16
|
useVuetifyValidation?: boolean
|
|
17
|
-
label
|
|
17
|
+
label?: string
|
|
18
18
|
rules?: VuetifyValidationRule[]
|
|
19
|
+
// Règles de validation personnalisées d'erreur (bloquantes), évaluées à partir de la valeur du champ
|
|
19
20
|
customRules?: SyValidationRule[]
|
|
21
|
+
// Règles de validation personnalisées d'avertissement (non bloquantes), évaluées à partir de la valeur du champ
|
|
20
22
|
customWarningRules?: SyValidationRule[]
|
|
23
|
+
// Règles de validation personnalisées de succès, évaluées à partir de la valeur du champ
|
|
21
24
|
customSuccessRules?: SyValidationRule[]
|
|
25
|
+
// Messages d'erreur injectés par le parent ; ils n'exécutent aucune logique de validation
|
|
22
26
|
errorMessages?: string[] | null
|
|
27
|
+
// Messages d'avertissement injectés par le parent ; ils n'exécutent aucune logique de validation
|
|
23
28
|
warningMessages?: string[] | null
|
|
29
|
+
// Messages de succès injectés par le parent ; ils n'exécutent aucune logique de validation
|
|
24
30
|
successMessages?: string[] | null
|
|
25
31
|
hasError?: boolean
|
|
26
32
|
hasWarning?: boolean
|
|
@@ -29,9 +35,13 @@ export interface FieldValidationProps {
|
|
|
29
35
|
}
|
|
30
36
|
|
|
31
37
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
38
|
+
* Point d'entrée de la validation pour les composants de champ.
|
|
39
|
+
* Gère à la fois la validation native Vuetify (si useVuetifyValidation vaut true)
|
|
40
|
+
* et la validation custom Synapse (si customRules/customWarningRules/customSuccessRules sont fournis).
|
|
41
|
+
* customRules correspond aux règles d'erreur bloquantes.
|
|
42
|
+
* errorMessages/warningMessages/successMessages sont des messages externes injectés par le parent
|
|
43
|
+
* et ne déclenchent aucun calcul de validation.
|
|
44
|
+
* Expose aussi une interface unifiée pour les erreurs, avertissements, succès et la validation à la demande.
|
|
35
45
|
*/
|
|
36
46
|
export const validationPropsDefaults = {
|
|
37
47
|
readonly: false,
|
|
@@ -61,7 +71,7 @@ export function useValidation(params: {
|
|
|
61
71
|
isValidateOnBlur: Ref<boolean>
|
|
62
72
|
showSuccessMessages: Ref<boolean>
|
|
63
73
|
disableErrorHandling: Ref<boolean>
|
|
64
|
-
label: Ref<string>
|
|
74
|
+
label: Ref<string | undefined>
|
|
65
75
|
focused: Ref<boolean>
|
|
66
76
|
errorMessages?: Ref<string[] | null | undefined>
|
|
67
77
|
warningMessages?: Ref<string[] | null | undefined>
|
|
@@ -95,13 +105,15 @@ export function useValidation(params: {
|
|
|
95
105
|
errors: ref<string[]>([]),
|
|
96
106
|
warnings: ref<string[]>([]),
|
|
97
107
|
successes: ref<string[]>([]),
|
|
98
|
-
hasError: computed(() => false),
|
|
99
|
-
hasWarning: computed(() => false),
|
|
100
|
-
hasSuccess: computed(() => false),
|
|
108
|
+
hasError: computed(() => params.hasErrorProp?.value ?? false),
|
|
109
|
+
hasWarning: computed(() => params.hasWarningProp?.value ?? false),
|
|
110
|
+
hasSuccess: computed(() => params.hasSuccessProp?.value ?? false),
|
|
101
111
|
validate: async () => true,
|
|
112
|
+
clearValidation: () => {},
|
|
102
113
|
}
|
|
103
114
|
}
|
|
104
|
-
const
|
|
115
|
+
const vuetifyErrors = ref<string[]>([])
|
|
116
|
+
const customErrors = ref<string[]>([])
|
|
105
117
|
const innerWarnings = ref<string[]>([])
|
|
106
118
|
const innerSuccesses = ref<string[]>([])
|
|
107
119
|
|
|
@@ -112,7 +124,7 @@ export function useValidation(params: {
|
|
|
112
124
|
params.modelValue,
|
|
113
125
|
params.rules,
|
|
114
126
|
params.disabled,
|
|
115
|
-
|
|
127
|
+
vuetifyErrors,
|
|
116
128
|
params.hasErrorProp || ref(false),
|
|
117
129
|
computed(() => params.errorMessages?.value || []),
|
|
118
130
|
params.focused,
|
|
@@ -129,7 +141,7 @@ export function useValidation(params: {
|
|
|
129
141
|
params.customRules,
|
|
130
142
|
params.customWarningRules,
|
|
131
143
|
params.customSuccessRules,
|
|
132
|
-
|
|
144
|
+
customErrors,
|
|
133
145
|
innerWarnings,
|
|
134
146
|
innerSuccesses,
|
|
135
147
|
params.showSuccessMessages,
|
|
@@ -143,7 +155,8 @@ export function useValidation(params: {
|
|
|
143
155
|
|
|
144
156
|
async function validate(): Promise<boolean> {
|
|
145
157
|
if (params.readonly.value || params.disabled.value || params.disableErrorHandling.value) {
|
|
146
|
-
|
|
158
|
+
vuetifyErrors.value = []
|
|
159
|
+
customErrors.value = []
|
|
147
160
|
innerWarnings.value = []
|
|
148
161
|
innerSuccesses.value = []
|
|
149
162
|
|
|
@@ -162,7 +175,8 @@ export function useValidation(params: {
|
|
|
162
175
|
}
|
|
163
176
|
|
|
164
177
|
const errors = computed(() => [...new Set([
|
|
165
|
-
...
|
|
178
|
+
...vuetifyErrors.value,
|
|
179
|
+
...customErrors.value,
|
|
166
180
|
...(params.errorMessages?.value || []),
|
|
167
181
|
])])
|
|
168
182
|
const warnings = computed(() => [...new Set([
|
|
@@ -173,10 +187,26 @@ export function useValidation(params: {
|
|
|
173
187
|
...(params.showSuccessMessages.value ? innerSuccesses.value : []),
|
|
174
188
|
...(params.successMessages?.value || []),
|
|
175
189
|
])])
|
|
190
|
+
const internalHasSuccess = computed(() => customValidator.hasSuccess.value)
|
|
176
191
|
|
|
177
192
|
const hasError = computed(() => errors.value.length > 0 || params.hasErrorProp?.value)
|
|
178
193
|
const hasWarning = computed(() => warnings.value.length > 0 || params.hasWarningProp?.value)
|
|
179
|
-
|
|
194
|
+
// TODO: vérifier si c'est la meilleure approche pour supprimer le succès en mode Vuetify
|
|
195
|
+
const hasSuccess = computed(() => {
|
|
196
|
+
if (toValue(params.useVuetifyValidation)) {
|
|
197
|
+
return params.hasSuccessProp?.value ?? false
|
|
198
|
+
}
|
|
199
|
+
return (
|
|
200
|
+
(internalHasSuccess.value || (params.successMessages?.value?.length ?? 0) > 0)
|
|
201
|
+
&& !hasError.value
|
|
202
|
+
&& !hasWarning.value
|
|
203
|
+
) || (params.hasSuccessProp?.value ?? false)
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
function clearValidation() {
|
|
207
|
+
vuetifyErrors.value = []
|
|
208
|
+
customValidator.clearValidation()
|
|
209
|
+
}
|
|
180
210
|
|
|
181
211
|
return {
|
|
182
212
|
errors,
|
|
@@ -186,5 +216,6 @@ export function useValidation(params: {
|
|
|
186
216
|
hasWarning,
|
|
187
217
|
hasSuccess,
|
|
188
218
|
validate,
|
|
219
|
+
clearValidation,
|
|
189
220
|
}
|
|
190
221
|
}
|
|
@@ -12,8 +12,8 @@ export function useVuetifyValidation(
|
|
|
12
12
|
errorMessages: Ref<string[]>,
|
|
13
13
|
focused: Ref<boolean>,
|
|
14
14
|
maxErrors: Ref<number> | undefined,
|
|
15
|
-
name: Ref<string>,
|
|
16
|
-
label: Ref<string>,
|
|
15
|
+
name: Ref<string | undefined>,
|
|
16
|
+
label: Ref<string | undefined>,
|
|
17
17
|
readonly: Ref<boolean>,
|
|
18
18
|
validateOn: Ref<'input' | 'blur' | 'submit'>,
|
|
19
19
|
) {
|
|
@@ -123,7 +123,10 @@ export const useFormFieldErrorHandling = (
|
|
|
123
123
|
|
|
124
124
|
const hasError = computed(() => validation.hasError.value || (props.hasError ?? false))
|
|
125
125
|
const hasWarning = computed(() => validation.hasWarning.value || (props.hasWarning ?? false))
|
|
126
|
-
const hasSuccess = computed(() =>
|
|
126
|
+
const hasSuccess = computed(() =>
|
|
127
|
+
(validation.hasSuccess.value && !hasError.value && !hasWarning.value)
|
|
128
|
+
|| (props.hasSuccess ?? false),
|
|
129
|
+
)
|
|
127
130
|
|
|
128
131
|
const errors = computed(() => [...validation.errors.value, ...(props.errorMessages || [])])
|
|
129
132
|
const warnings = computed(() => validation.warnings.value)
|
|
@@ -90,7 +90,7 @@ describe('useValidation', () => {
|
|
|
90
90
|
expect(validResult.hasSuccess).toBe(true)
|
|
91
91
|
})
|
|
92
92
|
|
|
93
|
-
it('
|
|
93
|
+
it('keeps the success state when showSuccessMessages is false while hiding messages', async () => {
|
|
94
94
|
const validation = useValidation({ showSuccessMessages: false })
|
|
95
95
|
const rules = [{
|
|
96
96
|
type: 'required',
|
|
@@ -101,7 +101,7 @@ describe('useValidation', () => {
|
|
|
101
101
|
}]
|
|
102
102
|
|
|
103
103
|
const result = await validation.validateField('test', rules)
|
|
104
|
-
expect(result.hasSuccess).toBe(
|
|
104
|
+
expect(result.hasSuccess).toBe(true)
|
|
105
105
|
expect(result.state.successes).toEqual([])
|
|
106
106
|
})
|
|
107
107
|
|