@cnamts/synapse 1.0.23 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -5
- package/dist/AutocompleteFilter-D7qBuCAP.js +114 -0
- package/dist/AutocompleteFilter-Df9i5mAl.cjs +1 -0
- package/dist/DateFilter-BJD6FMev.cjs +1 -0
- package/dist/{DateFilter-Dc-gSGwk.js → DateFilter-BitMWrMU.js} +1 -1
- package/dist/{NumberFilter-vP38Wp6j.js → NumberFilter-BTLUxw0a.js} +3 -3
- package/dist/NumberFilter-DGCzCXzI.cjs +1 -0
- package/dist/{PeriodFilter-Ba1uYUnT.js → PeriodFilter-B5rUIPAC.js} +1 -1
- package/dist/PeriodFilter-DO_ecTZW.cjs +1 -0
- package/dist/SelectFilter-CGwcKWLm.cjs +1 -0
- package/dist/SelectFilter-l4QnRcuk.js +135 -0
- package/dist/TextFilter-B8nf7xoK.cjs +1 -0
- package/dist/{TextFilter-B84dpnoq.js → TextFilter-C9hj6Qrp.js} +7 -7
- package/dist/apLightTheme-CEK4iY3f.cjs +1 -0
- package/dist/apLightTheme-DnIM24Lv.js +950 -0
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +60 -60
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
- package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7501 -10095
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +21 -21
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +41 -41
- package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
- package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +117 -151
- package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +5 -5
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -16
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +8 -8
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +31 -506
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +28 -506
- package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +69 -89
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +627 -791
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +315 -412
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +112 -160
- package/dist/components/DatePicker/composables/index.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
- package/dist/components/DatePicker/composables/useDatePickerState.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
- package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
- package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
- package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
- package/dist/components/FileList/FileList.d.ts +6 -0
- package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +17 -17
- package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
- package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
- package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
- package/dist/components/MonthPicker/MonthPicker.d.ts +86 -127
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +85 -126
- package/dist/components/NirField/NirField.d.ts +202 -278
- package/dist/components/NirField/locales.d.ts +10 -10
- package/dist/components/NirField/useNirValidation.d.ts +64 -0
- package/dist/components/PasswordField/PasswordField.d.ts +8 -9
- package/dist/components/PeriodField/PeriodField.d.ts +1352 -1680
- package/dist/components/PhoneField/PhoneField.d.ts +88 -129
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
- package/dist/components/SyTextArea/SyTextArea.d.ts +34 -14
- package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +10 -6
- package/dist/components/Tables/SyTable/SyTable.d.ts +10 -6
- package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
- package/dist/components/Tables/common/SyTablePagination.d.ts +19 -19
- package/dist/components/Tables/common/TableHeader.d.ts +5 -0
- package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
- package/dist/components/Tables/common/filters/locales.d.ts +0 -1
- package/dist/components/Tables/common/locales.d.ts +3 -0
- package/dist/components/Tables/common/types.d.ts +21 -3
- package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
- package/dist/components/Tables/common/usePagination.d.ts +3 -1
- package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
- package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
- package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
- package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +7 -6
- package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
- package/dist/composables/rules/useFieldValidation.d.ts +4 -4
- package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
- package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
- package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
- package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
- package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
- package/dist/composables/validation/useFormValidation.d.ts +11 -2
- package/dist/composables/validation/useValidation.d.ts +19 -9
- package/dist/design-system-v3.d.ts +2 -0
- package/dist/design-system-v3.js +186 -187
- package/dist/design-system-v3.umd.cjs +1 -1066
- package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
- package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
- package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
- package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
- package/dist/designTokens/tokens/baseColors.d.ts +127 -0
- package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
- package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
- package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
- package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
- package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
- package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
- package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
- package/dist/designTokens/utils/index.d.ts +2 -2
- package/dist/main-ByDPHpae.cjs +1067 -0
- package/dist/main-Cpx8Co6H.js +38869 -0
- package/dist/main.d.ts +0 -1
- package/dist/synapse.css +1 -0
- package/dist/tooth-11-D3sLWv2n.cjs +1 -0
- package/dist/tooth-12-CXrLuH03.cjs +1 -0
- package/dist/tooth-13-BSfo5fpT.cjs +1 -0
- package/dist/tooth-14-DMzulx0h.cjs +1 -0
- package/dist/tooth-15-BKRFVi-9.cjs +1 -0
- package/dist/tooth-16-CpuxAbuM.cjs +1 -0
- package/dist/tooth-17-BPoahUdg.cjs +1 -0
- package/dist/tooth-18-DhHJz8sy.cjs +1 -0
- package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
- package/dist/tooth-22-C2Tn19sB.cjs +1 -0
- package/dist/tooth-23-C9uaaSGb.cjs +1 -0
- package/dist/tooth-24-BrK9UGpf.cjs +1 -0
- package/dist/tooth-25-CE_EfGNp.cjs +1 -0
- package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
- package/dist/tooth-27-C5J7JkWM.cjs +1 -0
- package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
- package/dist/tooth-31-BrYqmkTi.cjs +1 -0
- package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
- package/dist/tooth-33-DuxvqO2J.cjs +1 -0
- package/dist/tooth-34-BCSCXMB6.cjs +1 -0
- package/dist/tooth-35-BLUXkX88.cjs +1 -0
- package/dist/tooth-36-IrKHYqlA.cjs +1 -0
- package/dist/tooth-37-BYqpdMwo.cjs +1 -0
- package/dist/tooth-38-B_eNXXdu.cjs +1 -0
- package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
- package/dist/tooth-42-szcDqlM0.cjs +1 -0
- package/dist/tooth-43-B3ka6rQm.cjs +1 -0
- package/dist/tooth-44-CazyQucj.cjs +1 -0
- package/dist/tooth-45-B4HQtc8n.cjs +1 -0
- package/dist/tooth-46-BPM40gbG.cjs +1 -0
- package/dist/tooth-47-Dvr20dlh.cjs +1 -0
- package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
- package/dist/tooth-51-OBpwCOF3.cjs +1 -0
- package/dist/tooth-52-aKxyHcmq.cjs +1 -0
- package/dist/tooth-53-vCwJjTOc.cjs +1 -0
- package/dist/tooth-54-DsWu2iFy.cjs +1 -0
- package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
- package/dist/tooth-61-BbLvxMQi.cjs +1 -0
- package/dist/tooth-62-CmTkWczP.cjs +1 -0
- package/dist/tooth-63-DI7l_2qI.cjs +1 -0
- package/dist/tooth-64-B21sOsJh.cjs +1 -0
- package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
- package/dist/tooth-71-D473PPO5.cjs +1 -0
- package/dist/tooth-72-Drh1wnNu.cjs +1 -0
- package/dist/tooth-73-DzlwYI23.cjs +1 -0
- package/dist/tooth-74-8aGvcZPg.cjs +1 -0
- package/dist/tooth-75-BFK7At_r.cjs +1 -0
- package/dist/tooth-81-BZmR-I0M.cjs +1 -0
- package/dist/tooth-82-euVfUUZV.cjs +1 -0
- package/dist/tooth-83-KV010j64.cjs +1 -0
- package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
- package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
- package/dist/utils/functions/classToHex.d.ts +1 -1
- package/dist/utils/functions/createHexResolver.d.ts +16 -0
- package/dist/vuetifyConfig.js +522 -0
- package/dist/vuetifyConfig.umd.cjs +1 -0
- package/package.json +37 -20
- package/src/assets/amelipro/apTokens2026.scss +5 -5
- package/src/assets/overrides/_breakpoints.scss +25 -0
- package/src/assets/overrides/_btns.scss +0 -8
- package/src/assets/overrides/_forms.scss +1 -3
- package/src/assets/overrides/_icons.scss +14 -10
- package/src/assets/overrides/_otp.scss +41 -0
- package/src/assets/overrides/_tables.scss +11 -20
- package/src/assets/overrides/_tooltips.scss +17 -7
- package/src/assets/overrides/_typography.scss +35 -47
- package/src/assets/overrides/_utilities.scss +43 -47
- package/src/assets/themes.scss +1 -0
- package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
- package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
- package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
- package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
- package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
- package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
- package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
- package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
- package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
- package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
- package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
- package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
- package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
- package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
- package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
- package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
- package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
- package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
- package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
- package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
- package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
- package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
- package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
- package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
- package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
- package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
- package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
- package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
- package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
- package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
- package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
- package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
- package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
- package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
- package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
- package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
- package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
- package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
- package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
- package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
- package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
- package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
- package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
- package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
- package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
- package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
- package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
- package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
- package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
- package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
- package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
- package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
- package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
- package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
- package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
- package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
- package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
- package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
- package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
- package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
- package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
- package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
- package/src/components/Captcha/Captcha.vue +1 -3
- package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +12 -12
- package/src/components/ChipList/ChipList.stories.ts +0 -15
- package/src/components/ChipList/ChipList.vue +19 -17
- package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
- package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
- package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +0 -2
- package/src/components/CopyBtn/CopyBtn.vue +1 -3
- package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
- package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +0 -9
- package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +28 -7
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +209 -0
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +14 -10
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +12 -15
- package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +1 -39
- package/src/components/Customs/Selects/SySelect/SySelect.vue +274 -71
- package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +89 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
- package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +45 -11
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +53 -3
- package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
- package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
- package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
- package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
- package/src/components/Customs/SyTabs/SyTabs.stories.ts +32 -33
- package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
- package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
- package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
- package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
- package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +50 -68
- package/src/components/Customs/SyTextField/SyTextField.vue +156 -161
- package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +32 -0
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +120 -11
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +342 -237
- package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +215 -175
- package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +33 -10
- package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
- package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
- package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
- package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
- package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +71 -67
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
- package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
- package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
- package/src/components/DatePicker/composables/index.ts +1 -0
- package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
- package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
- package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
- package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
- package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
- package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
- package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
- package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
- package/src/components/DatePicker/composables/useDatePickerState.ts +24 -0
- package/src/components/DatePicker/composables/useDateTextField.ts +6 -6
- package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
- package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
- package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
- package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
- package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
- package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
- package/src/components/DialogBox/DialogBox.vue +3 -5
- package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
- package/src/components/FileList/FileList.vue +9 -2
- package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
- package/src/components/FileList/tests/FileList.spec.ts +47 -0
- package/src/components/FileUpload/FileUpload.vue +3 -5
- package/src/components/FileUpload/FileUploadContent.vue +3 -5
- package/src/components/FilterInline/FilterInline.vue +1 -3
- package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
- package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
- package/src/components/FilterSideBar/FilterSideBar.vue +7 -0
- package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
- package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
- package/src/components/FooterBar/FooterBar.vue +9 -13
- package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
- package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
- package/src/components/HeaderBar/HeaderBar.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
- package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
- package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
- package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
- package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
- package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
- package/src/components/LangBtn/LangBtn.vue +2 -4
- package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
- package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
- package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
- package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
- package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
- package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
- package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
- package/src/components/MonthPicker/tests/MonthPicker.spec.ts +2 -1
- package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +7 -7
- package/src/components/NirField/NirField.stories.ts +6 -2
- package/src/components/NirField/NirField.vue +67 -265
- package/src/components/NirField/accessibilite/Accessibility.mdx +102 -7
- package/src/components/NirField/locales.ts +1 -1
- package/src/components/NirField/tests/NirField.spec.ts +124 -0
- package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
- package/src/components/NirField/useNirValidation.ts +277 -0
- package/src/components/NotificationBar/Notification/Notification.vue +5 -7
- package/src/components/NotificationBar/NotificationBar.vue +1 -3
- package/src/components/PaginatedTable/PaginatedTable.vue +2 -3
- package/src/components/PaginatedTable/Pagination.vue +3 -5
- package/src/components/PasswordField/PasswordField.stories.ts +4 -4
- package/src/components/PasswordField/PasswordField.vue +26 -34
- package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
- package/src/components/PeriodField/PeriodField.stories.ts +4 -4
- package/src/components/PeriodField/PeriodField.vue +57 -57
- package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
- package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
- package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
- package/src/components/PhoneField/PhoneField.vue +8 -9
- package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
- package/src/components/RangeField/RangeField.vue +6 -0
- package/src/components/RangeField/RangeSlider/RangeSlider.vue +0 -2
- package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
- package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
- package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +6 -8
- package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +3 -5
- package/src/components/SearchListField/SearchListField.vue +0 -2
- package/src/components/SkipLink/SkipLink.vue +2 -4
- package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
- package/src/components/SubHeader/SubHeader.vue +1 -1
- package/src/components/SyAlert/SyAlert.vue +7 -9
- package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
- package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
- package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
- package/src/components/SyTextArea/SyTextArea.vue +53 -23
- package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
- package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
- package/src/components/TableToolbar/TableToolbar.vue +6 -8
- package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +839 -1
- package/src/components/Tables/SyServerTable/SyServerTable.vue +154 -95
- package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +81 -0
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +390 -0
- package/src/components/Tables/SyTable/SyTable.mdx +25 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +556 -1
- package/src/components/Tables/SyTable/SyTable.vue +136 -60
- package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +79 -0
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +382 -0
- package/src/components/Tables/common/SyTableFilter.vue +49 -4
- package/src/components/Tables/common/SyTablePagination.vue +142 -19
- package/src/components/Tables/common/TableHeader.vue +45 -4
- package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
- package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
- package/src/components/Tables/common/filters/SelectFilter.vue +11 -12
- package/src/components/Tables/common/filters/TextFilter.vue +1 -1
- package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
- package/src/components/Tables/common/filters/locales.ts +0 -1
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
- package/src/components/Tables/common/locales.ts +3 -0
- package/src/components/Tables/common/tableFilterUtils.ts +3 -0
- package/src/components/Tables/common/tableStyles.scss +60 -19
- package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
- package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
- package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
- package/src/components/Tables/common/types.ts +15 -4
- package/src/components/Tables/common/useClickableTableRow.ts +103 -0
- package/src/components/Tables/common/usePagination.ts +13 -0
- package/src/components/Tables/common/usePinnedColumns.ts +237 -0
- package/src/components/Tables/common/useTableHeaders.ts +52 -30
- package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
- package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
- package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
- package/src/components/UploadWorkflow/useFileList.ts +3 -0
- package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
- package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
- package/src/composables/date/useDatePickerAccessibility.ts +42 -207
- package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
- package/src/composables/rules/useFieldValidation.ts +34 -17
- package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
- package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
- package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
- package/src/composables/unifyValidation/useValidation.ts +190 -0
- package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
- package/src/composables/useFormFieldErrorHandling.ts +4 -7
- package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
- package/src/composables/validation/tests/useValidation.spec.ts +116 -21
- package/src/composables/validation/useFormValidation.ts +20 -13
- package/src/composables/validation/useValidatable.ts +8 -1
- package/src/composables/validation/useValidation.ts +151 -99
- package/src/composantsVuetify/Introduction.mdx +48 -0
- package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
- package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
- package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
- package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
- package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
- package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
- package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
- package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
- package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
- package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
- package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
- package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
- package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
- package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
- package/src/designTokens/tests/themeUtils.spec.ts +53 -0
- package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
- package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
- package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
- package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -1
- package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
- package/src/designTokens/tokens/baseColors.ts +129 -0
- package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
- package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
- package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
- package/src/designTokens/tokens/cnam/cnamLightTheme.ts +1 -1
- package/src/designTokens/tokens/cnam/cnamSemantic.ts +3 -3
- package/src/designTokens/tokens/pa/paColors.ts +2 -166
- package/src/designTokens/tokens/pa/paContextual.ts +3 -48
- package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
- package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
- package/src/designTokens/utils/buildColorClassMap.ts +34 -0
- package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
- package/src/designTokens/utils/createFlattenTheme.ts +15 -7
- package/src/designTokens/utils/index.ts +2 -2
- package/src/main.ts +0 -2
- package/src/stories/Accessibilite/AuditDesignSystem.mdx +0 -11
- package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
- package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
- package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +8 -1
- package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +51 -10
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +16 -9
- package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +48 -58
- package/src/stories/Components/Components.stories.ts +113 -9
- package/src/stories/Demarrer/Accueil.stories.ts +3 -3
- package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
- package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
- package/src/stories/Demarrer/Releases.stories.ts +48 -5
- package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
- package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
- package/src/stories/DesignTokens/colors.stories.ts +5 -6
- package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
- package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
- package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
- package/src/stories/GuideDuDev/Theme.mdx +36 -26
- package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
- package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
- package/src/stories/styles/accessibility-guide.css +3 -3
- package/src/utils/functions/classToHex.ts +6 -34
- package/src/utils/functions/createHexResolver.ts +45 -0
- package/src/utils/functions/tests/classToHex.spec.ts +36 -0
- package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
- package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
- package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
- package/dist/SelectFilter-BioGT6Nn.js +0 -136
- package/dist/designTokens/utils/convertGaps.d.ts +0 -5
- package/dist/main-aLKwdMi1.js +0 -37886
- package/dist/style.css +0 -1
- package/src/assets/apTokens.scss +0 -343
- package/src/assets/overrides/_container.scss +0 -36
- package/src/assets/tokens.scss +0 -388
- package/src/components/DatePicker/Accessibilite.mdx +0 -14
- package/src/designTokens/apColors.md +0 -66
- package/src/designTokens/cnamColors.md +0 -193
- package/src/designTokens/paColors.md +0 -66
- package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
- package/src/designTokens/tokens/json/primitives.json +0 -209
- package/src/designTokens/tokens/json/semantic.json +0 -120
- package/src/designTokens/utils/convertGaps.ts +0 -11
- package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
- package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +0 -306
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest'
|
|
2
2
|
import { useValidation } from '../useValidation'
|
|
3
3
|
|
|
4
4
|
describe('useValidation', () => {
|
|
@@ -13,7 +13,7 @@ describe('useValidation', () => {
|
|
|
13
13
|
expect(validation.hasSuccess.value).toBe(false)
|
|
14
14
|
})
|
|
15
15
|
|
|
16
|
-
it('should handle basic validation rules', () => {
|
|
16
|
+
it('should handle basic validation rules', async () => {
|
|
17
17
|
const validation = useValidation()
|
|
18
18
|
const rules = [{
|
|
19
19
|
type: 'required',
|
|
@@ -24,17 +24,17 @@ describe('useValidation', () => {
|
|
|
24
24
|
}]
|
|
25
25
|
|
|
26
26
|
// Test avec une valeur vide
|
|
27
|
-
const emptyResult = validation.validateField('', rules)
|
|
27
|
+
const emptyResult = await validation.validateField('', rules)
|
|
28
28
|
expect(emptyResult.hasError).toBe(true)
|
|
29
29
|
expect(emptyResult.state.errors).toContain('Ce champ est requis')
|
|
30
30
|
|
|
31
31
|
// Test avec une valeur valide
|
|
32
|
-
const validResult = validation.validateField('test', rules)
|
|
32
|
+
const validResult = await validation.validateField('test', rules)
|
|
33
33
|
expect(validResult.hasSuccess).toBe(true)
|
|
34
34
|
expect(validResult.state.successes).toContain('Champ valide')
|
|
35
35
|
})
|
|
36
36
|
|
|
37
|
-
it('should handle warning rules', () => {
|
|
37
|
+
it('should handle warning rules', async () => {
|
|
38
38
|
const validation = useValidation()
|
|
39
39
|
const warningRules = [{
|
|
40
40
|
type: 'custom',
|
|
@@ -46,17 +46,17 @@ describe('useValidation', () => {
|
|
|
46
46
|
}]
|
|
47
47
|
|
|
48
48
|
// Test avec une valeur courte
|
|
49
|
-
const shortResult = validation.validateField('test', [], warningRules)
|
|
49
|
+
const shortResult = await validation.validateField('test', [], warningRules)
|
|
50
50
|
expect(shortResult.hasWarning).toBe(true)
|
|
51
51
|
expect(shortResult.state.warnings[0]).toContain('8 caractères')
|
|
52
52
|
|
|
53
53
|
// Test avec une valeur valide
|
|
54
|
-
const validResult = validation.validateField('test_long', [], warningRules)
|
|
54
|
+
const validResult = await validation.validateField('test_long', [], warningRules)
|
|
55
55
|
expect(validResult.hasWarning).toBe(false)
|
|
56
56
|
expect(validResult.state.warnings).toEqual([])
|
|
57
57
|
})
|
|
58
58
|
|
|
59
|
-
it('should handle multiple validation rules', () => {
|
|
59
|
+
it('should handle multiple validation rules', async () => {
|
|
60
60
|
const validation = useValidation()
|
|
61
61
|
const rules = [
|
|
62
62
|
{
|
|
@@ -75,22 +75,22 @@ describe('useValidation', () => {
|
|
|
75
75
|
]
|
|
76
76
|
|
|
77
77
|
// Test avec une valeur vide
|
|
78
|
-
const emptyResult = validation.validateField('', rules)
|
|
78
|
+
const emptyResult = await validation.validateField('', rules)
|
|
79
79
|
expect(emptyResult.hasError).toBe(true)
|
|
80
80
|
expect(emptyResult.state.errors).toContain('Ce champ est requis')
|
|
81
81
|
|
|
82
82
|
// Test avec une valeur trop courte
|
|
83
|
-
const shortResult = validation.validateField('ab', rules)
|
|
83
|
+
const shortResult = await validation.validateField('ab', rules)
|
|
84
84
|
expect(shortResult.hasError).toBe(true)
|
|
85
85
|
expect(shortResult.state.errors).toContain('Minimum 3 caractères requis')
|
|
86
86
|
|
|
87
87
|
// Test avec une valeur valide
|
|
88
|
-
const validResult = validation.validateField('abc', rules)
|
|
88
|
+
const validResult = await validation.validateField('abc', rules)
|
|
89
89
|
expect(validResult.hasError).toBe(false)
|
|
90
90
|
expect(validResult.hasSuccess).toBe(true)
|
|
91
91
|
})
|
|
92
92
|
|
|
93
|
-
it('should respect showSuccessMessages option', () => {
|
|
93
|
+
it('should respect showSuccessMessages option', async () => {
|
|
94
94
|
const validation = useValidation({ showSuccessMessages: false })
|
|
95
95
|
const rules = [{
|
|
96
96
|
type: 'required',
|
|
@@ -100,12 +100,12 @@ describe('useValidation', () => {
|
|
|
100
100
|
},
|
|
101
101
|
}]
|
|
102
102
|
|
|
103
|
-
const result = validation.validateField('test', rules)
|
|
103
|
+
const result = await validation.validateField('test', rules)
|
|
104
104
|
expect(result.hasSuccess).toBe(false)
|
|
105
105
|
expect(result.state.successes).toEqual([])
|
|
106
106
|
})
|
|
107
107
|
|
|
108
|
-
it('should use fieldIdentifier in messages', () => {
|
|
108
|
+
it('should use fieldIdentifier in messages', async () => {
|
|
109
109
|
const validation = useValidation({ fieldIdentifier: 'Email' })
|
|
110
110
|
const rules = [{
|
|
111
111
|
type: 'required',
|
|
@@ -114,11 +114,11 @@ describe('useValidation', () => {
|
|
|
114
114
|
},
|
|
115
115
|
}]
|
|
116
116
|
|
|
117
|
-
const result = validation.validateField('', rules)
|
|
117
|
+
const result = await validation.validateField('', rules)
|
|
118
118
|
expect(result.state.errors[0]).toContain('Email')
|
|
119
119
|
})
|
|
120
120
|
|
|
121
|
-
it('should clear validation state', () => {
|
|
121
|
+
it('should clear validation state', async () => {
|
|
122
122
|
const validation = useValidation()
|
|
123
123
|
const rules = [{
|
|
124
124
|
type: 'required',
|
|
@@ -127,7 +127,7 @@ describe('useValidation', () => {
|
|
|
127
127
|
},
|
|
128
128
|
}]
|
|
129
129
|
|
|
130
|
-
validation.validateField('', rules)
|
|
130
|
+
await validation.validateField('', rules)
|
|
131
131
|
expect(validation.hasError.value).toBe(true)
|
|
132
132
|
|
|
133
133
|
validation.clearValidation()
|
|
@@ -145,10 +145,105 @@ describe('useValidation', () => {
|
|
|
145
145
|
},
|
|
146
146
|
}]
|
|
147
147
|
|
|
148
|
-
validation.validateField('', rules)
|
|
149
|
-
expect(
|
|
148
|
+
await validation.validateField('', rules)
|
|
149
|
+
expect(validation.validateOnSubmit()).toBe(false)
|
|
150
150
|
|
|
151
|
-
validation.validateField('test', rules)
|
|
152
|
-
expect(
|
|
151
|
+
await validation.validateField('test', rules)
|
|
152
|
+
expect(validation.validateOnSubmit()).toBe(true)
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
describe('Handle thrown errors in async rules', () => {
|
|
156
|
+
it('should handle thrown error in async validation rules', async () => {
|
|
157
|
+
const validation = useValidation()
|
|
158
|
+
const rules = [{
|
|
159
|
+
type: 'custom',
|
|
160
|
+
options: {
|
|
161
|
+
validate: async () => {
|
|
162
|
+
throw new Error('Network error')
|
|
163
|
+
},
|
|
164
|
+
message: 'Erreur personnalisée',
|
|
165
|
+
},
|
|
166
|
+
}]
|
|
167
|
+
|
|
168
|
+
const result = await validation.validateField('test', rules)
|
|
169
|
+
expect(result.hasError).toBe(true)
|
|
170
|
+
expect(result.state.errors[0]).toBe('Erreur personnalisée')
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
it('should use thrown error message when no custom message is provided', async () => {
|
|
174
|
+
const validation = useValidation()
|
|
175
|
+
const rules = [{
|
|
176
|
+
type: 'custom',
|
|
177
|
+
options: {
|
|
178
|
+
validate: async () => {
|
|
179
|
+
throw new Error('Service unavailable')
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
}]
|
|
183
|
+
|
|
184
|
+
const result = await validation.validateField('test', rules)
|
|
185
|
+
expect(result.hasError).toBe(true)
|
|
186
|
+
expect(result.state.errors[0]).toBe('Service unavailable')
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
it('should handle thrown error in async warning rules', async () => {
|
|
190
|
+
const validation = useValidation()
|
|
191
|
+
const warningRules = [{
|
|
192
|
+
type: 'custom',
|
|
193
|
+
options: {
|
|
194
|
+
validate: async () => {
|
|
195
|
+
throw new Error('Warning service failed')
|
|
196
|
+
},
|
|
197
|
+
isWarning: true,
|
|
198
|
+
},
|
|
199
|
+
}]
|
|
200
|
+
|
|
201
|
+
const result = await validation.validateField('test', [], warningRules)
|
|
202
|
+
expect(result.hasWarning).toBe(true)
|
|
203
|
+
expect(result.state.warnings[0]).toBe('Warning service failed')
|
|
204
|
+
})
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
it('should discard a slow async validation when a newer one is triggered after', async () => {
|
|
208
|
+
vi.useFakeTimers()
|
|
209
|
+
const validation = useValidation()
|
|
210
|
+
|
|
211
|
+
// Slow rule: resolves after 100ms with an error
|
|
212
|
+
const slowRules = [{
|
|
213
|
+
type: 'custom',
|
|
214
|
+
options: {
|
|
215
|
+
validate: () => new Promise<boolean>(resolve => setTimeout(() => resolve(false), 100)),
|
|
216
|
+
message: 'Erreur lente',
|
|
217
|
+
},
|
|
218
|
+
}]
|
|
219
|
+
|
|
220
|
+
// Fast rule: resolves immediately with success
|
|
221
|
+
const fastRules = [{
|
|
222
|
+
type: 'custom',
|
|
223
|
+
options: {
|
|
224
|
+
validate: () => true,
|
|
225
|
+
successMessage: 'Validation rapide réussie',
|
|
226
|
+
},
|
|
227
|
+
}]
|
|
228
|
+
|
|
229
|
+
// Launch slow validation first, then fast validation immediately after
|
|
230
|
+
const slowPromise = validation.validateField('test', slowRules)
|
|
231
|
+
const fastResult = await validation.validateField('test', fastRules)
|
|
232
|
+
|
|
233
|
+
// Fast validation should have succeeded
|
|
234
|
+
expect(fastResult.hasError).toBe(false)
|
|
235
|
+
expect(fastResult.hasSuccess).toBe(true)
|
|
236
|
+
expect(fastResult.state.successes).toContain('Validation rapide réussie')
|
|
237
|
+
|
|
238
|
+
// Wait for the slow validation to resolve
|
|
239
|
+
vi.advanceTimersByTime(100)
|
|
240
|
+
await slowPromise
|
|
241
|
+
|
|
242
|
+
// The slow validation must NOT have overwritten the fast result
|
|
243
|
+
expect(validation.errors.value).toEqual([])
|
|
244
|
+
expect(validation.hasError.value).toBe(false)
|
|
245
|
+
expect(validation.successes.value).toContain('Validation rapide réussie')
|
|
246
|
+
|
|
247
|
+
vi.useRealTimers()
|
|
153
248
|
})
|
|
154
249
|
})
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { provide, inject, ref, type InjectionKey, type Ref } from 'vue'
|
|
2
2
|
|
|
3
3
|
// Type pour les composants pouvant être validés
|
|
4
|
-
export
|
|
4
|
+
export type ValidatableComponent = {
|
|
5
5
|
validateOnSubmit: () => Promise<boolean> | boolean
|
|
6
6
|
clearValidation?: () => void
|
|
7
7
|
reset?: () => void
|
|
8
|
+
$props?: {
|
|
9
|
+
label?: string
|
|
10
|
+
}
|
|
8
11
|
}
|
|
9
12
|
|
|
10
13
|
// Clé d'injection pour le registre des composants validables
|
|
@@ -47,24 +50,28 @@ export function useFormValidation() {
|
|
|
47
50
|
// Fonction pour nettoyer les validations de tous les composants enregistrés
|
|
48
51
|
const clearAll = () => {
|
|
49
52
|
if (validatableComponents.value.length === 0) return
|
|
50
|
-
validatableComponents.value.forEach((component) => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
validatableComponents.value.forEach((component: ValidatableComponent) => {
|
|
54
|
+
if (component.clearValidation) {
|
|
55
|
+
try {
|
|
56
|
+
component.clearValidation()
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.warn('Error clearing validation for field: ' + (component?.$props?.label ?? 'unknown'), error)
|
|
60
|
+
}
|
|
56
61
|
}
|
|
57
62
|
})
|
|
58
63
|
}
|
|
59
64
|
|
|
60
65
|
const resetAll = () => {
|
|
61
66
|
if (validatableComponents.value.length === 0) return
|
|
62
|
-
validatableComponents.value.forEach((component) => {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
validatableComponents.value.forEach((component: ValidatableComponent) => {
|
|
68
|
+
if (component.reset) {
|
|
69
|
+
try {
|
|
70
|
+
component.reset()
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.warn('Error resetting field: ' + (component?.$props?.label ?? 'unknown'), error)
|
|
74
|
+
}
|
|
68
75
|
}
|
|
69
76
|
})
|
|
70
77
|
}
|
|
@@ -34,7 +34,14 @@ export function useValidatable(
|
|
|
34
34
|
const instance = getCurrentInstance()
|
|
35
35
|
|
|
36
36
|
// Keep a stable object reference for register/unregister symmetry
|
|
37
|
-
const componentRef = {
|
|
37
|
+
const componentRef = {
|
|
38
|
+
validateOnSubmit: validateMethod,
|
|
39
|
+
clearValidation,
|
|
40
|
+
reset,
|
|
41
|
+
$props: {
|
|
42
|
+
label: typeof instance?.props?.label === 'string' ? instance.props.label : undefined,
|
|
43
|
+
},
|
|
44
|
+
}
|
|
38
45
|
|
|
39
46
|
onMounted(() => {
|
|
40
47
|
if (instance) {
|
|
@@ -1,18 +1,40 @@
|
|
|
1
1
|
import { ref, computed } from 'vue'
|
|
2
|
-
import { useFieldValidation, type RuleOptions } from '../rules/useFieldValidation'
|
|
2
|
+
import { useFieldValidation, type RuleOptions, type ValidationResult as FieldValidationResult } from '../rules/useFieldValidation'
|
|
3
|
+
|
|
4
|
+
type builtInDateRuleType =
|
|
5
|
+
'noWeekend'
|
|
6
|
+
| 'noBeforeToday'
|
|
7
|
+
| 'notAfterToday'
|
|
8
|
+
| 'notBeforeDate'
|
|
9
|
+
| 'notAfterDate'
|
|
10
|
+
| 'dateExact'
|
|
11
|
+
| 'isHolidayDay'
|
|
12
|
+
|
|
13
|
+
type BuiltInNumberRuleType = 'min' | 'max'
|
|
14
|
+
type BuiltInStringRuleType = 'minLength' | 'maxLength' | 'exactLength' | 'email' | 'matchPattern'
|
|
15
|
+
type BuiltInRuleGeneralType = 'required' | 'custom'
|
|
16
|
+
export type BuiltInRuleType =
|
|
17
|
+
| BuiltInRuleGeneralType
|
|
18
|
+
| BuiltInNumberRuleType
|
|
19
|
+
| BuiltInStringRuleType
|
|
20
|
+
| builtInDateRuleType
|
|
21
|
+
|
|
22
|
+
interface CustomValidationRule {
|
|
23
|
+
type: 'custom'
|
|
24
|
+
options: RuleOptions & { validate: NonNullable<RuleOptions['validate']> }
|
|
25
|
+
}
|
|
3
26
|
|
|
4
|
-
|
|
5
|
-
type: string
|
|
27
|
+
interface StandardValidationRule {
|
|
28
|
+
type: BuiltInRuleType | ({} & string)
|
|
6
29
|
options: RuleOptions
|
|
7
30
|
}
|
|
8
31
|
|
|
32
|
+
export type ValidationRule = CustomValidationRule | StandardValidationRule
|
|
33
|
+
|
|
9
34
|
export interface ValidationOptions {
|
|
10
35
|
showSuccessMessages?: boolean
|
|
11
|
-
fieldIdentifier?: string
|
|
12
|
-
customRules?: ValidationRule[]
|
|
13
|
-
warningRules?: ValidationRule[]
|
|
14
|
-
successRules?: ValidationRule[]
|
|
15
36
|
disableErrorHandling?: boolean
|
|
37
|
+
fieldIdentifier?: string
|
|
16
38
|
}
|
|
17
39
|
|
|
18
40
|
export interface ValidationState {
|
|
@@ -38,6 +60,8 @@ export function useValidation(options: ValidationOptions = { showSuccessMessages
|
|
|
38
60
|
const warnings = ref<string[]>([])
|
|
39
61
|
const successes = ref<string[]>([])
|
|
40
62
|
|
|
63
|
+
let currentValidationToken = 0
|
|
64
|
+
|
|
41
65
|
const { generateRules } = useFieldValidation()
|
|
42
66
|
|
|
43
67
|
const hasError = computed(() => errors.value.length > 0)
|
|
@@ -52,128 +76,156 @@ export function useValidation(options: ValidationOptions = { showSuccessMessages
|
|
|
52
76
|
successes.value = []
|
|
53
77
|
}
|
|
54
78
|
|
|
79
|
+
/**
|
|
80
|
+
* Resolves an array of rule results that may be sync or async.
|
|
81
|
+
* Returns the resolved array directly if all are sync, or a Promise if any are async.
|
|
82
|
+
*/
|
|
83
|
+
const resolveRuleResults = (
|
|
84
|
+
results: (FieldValidationResult | Promise<FieldValidationResult>)[],
|
|
85
|
+
): FieldValidationResult[] | Promise<FieldValidationResult[]> => {
|
|
86
|
+
if (results.every(r => !(r instanceof Promise))) return results as FieldValidationResult[]
|
|
87
|
+
|
|
88
|
+
const safePromises = results.map((r: FieldValidationResult | Promise<FieldValidationResult>) => {
|
|
89
|
+
if (!(r instanceof Promise)) return Promise.resolve(r)
|
|
90
|
+
|
|
91
|
+
return r.catch((err: unknown) => {
|
|
92
|
+
const message = err instanceof Error ? err.message : String(err)
|
|
93
|
+
return { error: message || 'Erreur de validation' } as FieldValidationResult
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
return Promise.all(safePromises)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Executes validation rules against a value, returning sync or async results. */
|
|
101
|
+
const executeRules = (
|
|
102
|
+
rules: ValidationRule[],
|
|
103
|
+
value: unknown,
|
|
104
|
+
extraOptions?: Record<string, boolean>,
|
|
105
|
+
): FieldValidationResult[] | Promise<FieldValidationResult[]> => {
|
|
106
|
+
for (const rule of rules) {
|
|
107
|
+
if ('validator' in rule) {
|
|
108
|
+
console.error('[useValidation] "validator" en top level de ValidationRule n\'est plus supporté. Utilisez rule.options.validate à la place.')
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const prepared = rules.map(rule => ({
|
|
113
|
+
type: rule.type,
|
|
114
|
+
options: { ...rule.options, ...extraOptions, ...(options.fieldIdentifier && !rule.options?.fieldIdentifier ? { fieldIdentifier: options.fieldIdentifier } : {}) },
|
|
115
|
+
}))
|
|
116
|
+
const fns = generateRules(prepared)
|
|
117
|
+
return resolveRuleResults(fns.map(fn => fn(value)))
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Applies a callback to a sync or async value, discarding stale results via token. */
|
|
121
|
+
const thenOrSync = <T>(
|
|
122
|
+
value: T | Promise<T>,
|
|
123
|
+
token: number,
|
|
124
|
+
fn: (resolved: T) => ValidationResult | Promise<ValidationResult>,
|
|
125
|
+
): ValidationResult | Promise<ValidationResult> => {
|
|
126
|
+
if (value instanceof Promise) {
|
|
127
|
+
return value.then(resolved =>
|
|
128
|
+
token !== currentValidationToken ? buildResult() : fn(resolved),
|
|
129
|
+
)
|
|
130
|
+
}
|
|
131
|
+
return fn(value)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const buildResult = (): ValidationResult => ({
|
|
135
|
+
hasError: hasError.value,
|
|
136
|
+
hasWarning: hasWarning.value,
|
|
137
|
+
hasSuccess: hasSuccess.value,
|
|
138
|
+
state: {
|
|
139
|
+
errors: errors.value,
|
|
140
|
+
warnings: warnings.value,
|
|
141
|
+
successes: successes.value,
|
|
142
|
+
},
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
/** Adds a default success message when no custom success rules are provided. */
|
|
146
|
+
const addDefaultSuccessMessage = (rules: ValidationRule[]) => {
|
|
147
|
+
const customSuccessMessage = rules.find(rule => rule.options?.successMessage)?.options.successMessage
|
|
148
|
+
if (customSuccessMessage) {
|
|
149
|
+
successes.value.push(customSuccessMessage)
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
const defaultMessage = options.fieldIdentifier ? `Le champ ${options.fieldIdentifier} est valide.` : 'Champ valide'
|
|
153
|
+
successes.value.push(defaultMessage)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
55
157
|
const validateField = (
|
|
56
158
|
value: unknown,
|
|
57
159
|
rules: ValidationRule[] = [],
|
|
58
160
|
warningRules: ValidationRule[] = [],
|
|
59
161
|
successRules: ValidationRule[] = [],
|
|
60
|
-
): ValidationResult => {
|
|
162
|
+
): ValidationResult | Promise<ValidationResult> => {
|
|
163
|
+
const token = ++currentValidationToken
|
|
61
164
|
clearValidation()
|
|
62
165
|
|
|
63
|
-
|
|
64
|
-
if (options.disableErrorHandling) {
|
|
65
|
-
return {
|
|
66
|
-
hasError: false,
|
|
67
|
-
hasWarning: false,
|
|
68
|
-
hasSuccess: false,
|
|
69
|
-
state: {
|
|
70
|
-
errors: [],
|
|
71
|
-
warnings: [],
|
|
72
|
-
successes: [],
|
|
73
|
-
},
|
|
74
|
-
}
|
|
75
|
-
}
|
|
166
|
+
if (options.disableErrorHandling) return buildResult()
|
|
76
167
|
|
|
77
|
-
|
|
78
|
-
const normalRules = rules.map(rule => ({
|
|
79
|
-
type: rule.type,
|
|
80
|
-
options: {
|
|
81
|
-
...rule.options,
|
|
82
|
-
fieldIdentifier: options.fieldIdentifier || rule.options.fieldIdentifier,
|
|
83
|
-
},
|
|
84
|
-
}))
|
|
168
|
+
const resolved = executeRules(rules, value)
|
|
85
169
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
170
|
+
return thenOrSync(resolved, token, (ruleResults) => {
|
|
171
|
+
let hasValidationError = false
|
|
172
|
+
for (const result of ruleResults) {
|
|
173
|
+
if (result.error) {
|
|
174
|
+
errors.value.push(result.error)
|
|
175
|
+
hasValidationError = true
|
|
176
|
+
}
|
|
93
177
|
}
|
|
94
|
-
})
|
|
95
178
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (!hasValidationError && value && options.showSuccessMessages !== false && (!successRules || successRules.length === 0)) {
|
|
99
|
-
const customSuccessMessage = rules.find(rule => rule.options.successMessage)?.options.successMessage
|
|
100
|
-
if (customSuccessMessage) {
|
|
101
|
-
successes.value.push(customSuccessMessage)
|
|
179
|
+
if (!hasValidationError && value && options.showSuccessMessages !== false && successRules.length === 0) {
|
|
180
|
+
addDefaultSuccessMessage(rules)
|
|
102
181
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
182
|
+
|
|
183
|
+
if (!hasValidationError && warningRules.length > 0) {
|
|
184
|
+
const warningResolved = executeRules(warningRules, value, { isWarning: true })
|
|
185
|
+
return thenOrSync(warningResolved, token, (warningResults) => {
|
|
186
|
+
for (const r of warningResults) {
|
|
187
|
+
if (r.warning) warnings.value.push(r.warning)
|
|
188
|
+
}
|
|
189
|
+
return runSuccessRules(hasValidationError, value, successRules, token)
|
|
190
|
+
})
|
|
106
191
|
}
|
|
107
|
-
}
|
|
108
192
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
warningRules.map(rule => ({
|
|
113
|
-
type: rule.type,
|
|
114
|
-
options: {
|
|
115
|
-
...rule.options,
|
|
116
|
-
isWarning: true,
|
|
117
|
-
fieldIdentifier: options.fieldIdentifier || rule.options.fieldIdentifier,
|
|
118
|
-
},
|
|
119
|
-
})),
|
|
120
|
-
)
|
|
193
|
+
return runSuccessRules(hasValidationError, value, successRules, token)
|
|
194
|
+
})
|
|
195
|
+
}
|
|
121
196
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
197
|
+
/** Runs success rules after normal + warning rules. */
|
|
198
|
+
const runSuccessRules = (
|
|
199
|
+
hasValidationError: boolean,
|
|
200
|
+
value: unknown,
|
|
201
|
+
successRules: ValidationRule[],
|
|
202
|
+
token: number,
|
|
203
|
+
): ValidationResult | Promise<ValidationResult> => {
|
|
204
|
+
if (hasValidationError || hasWarning.value || successRules.length === 0) return buildResult()
|
|
129
205
|
|
|
130
|
-
|
|
131
|
-
if (!hasValidationError && !hasWarning.value) {
|
|
132
|
-
const successValidationRules = generateRules(
|
|
133
|
-
successRules.map(rule => ({
|
|
134
|
-
type: rule.type,
|
|
135
|
-
options: {
|
|
136
|
-
...rule.options,
|
|
137
|
-
isSuccess: true,
|
|
138
|
-
fieldIdentifier: options.fieldIdentifier || rule.options.fieldIdentifier,
|
|
139
|
-
},
|
|
140
|
-
})),
|
|
141
|
-
)
|
|
206
|
+
const successResolved = executeRules(successRules, value, { isSuccess: true })
|
|
142
207
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (
|
|
146
|
-
successes.value.push(
|
|
208
|
+
return thenOrSync(successResolved, token, (successResults) => {
|
|
209
|
+
for (const r of successResults) {
|
|
210
|
+
if (r.success && options.showSuccessMessages !== false) {
|
|
211
|
+
successes.value.push(r.success)
|
|
147
212
|
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
return {
|
|
152
|
-
hasError: hasError.value,
|
|
153
|
-
hasWarning: hasWarning.value,
|
|
154
|
-
hasSuccess: hasSuccess.value,
|
|
155
|
-
state: {
|
|
156
|
-
errors: errors.value,
|
|
157
|
-
warnings: warnings.value,
|
|
158
|
-
successes: successes.value,
|
|
159
|
-
},
|
|
160
|
-
}
|
|
213
|
+
}
|
|
214
|
+
return buildResult()
|
|
215
|
+
})
|
|
161
216
|
}
|
|
162
217
|
|
|
163
|
-
const validateOnSubmit =
|
|
218
|
+
const validateOnSubmit = (): boolean => {
|
|
164
219
|
return !hasError.value
|
|
165
220
|
}
|
|
166
221
|
|
|
167
222
|
return {
|
|
168
|
-
// États
|
|
169
223
|
errors,
|
|
170
224
|
warnings,
|
|
171
225
|
successes,
|
|
172
226
|
hasError,
|
|
173
227
|
hasWarning,
|
|
174
228
|
hasSuccess,
|
|
175
|
-
|
|
176
|
-
// Méthodes
|
|
177
229
|
validateField,
|
|
178
230
|
validateOnSubmit,
|
|
179
231
|
clearValidation,
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Meta } from '@storybook/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title="Composants/Composants Vuetify/Introduction" />
|
|
4
|
+
|
|
5
|
+
<div className="header">
|
|
6
|
+
<h1>Composants Vuetify</h1>
|
|
7
|
+
Pour certains composants, nous avons fait le choix d'utiliser directement les composants natifs de Vuetify en leur appliquant un thème via les tokens du design system. Cela permet de bénéficier de toute la puissance et la flexibilité de Vuetify tout en respectant la charte graphique de chaque thème.
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
## Pourquoi utiliser les composants Vuetify directement ?
|
|
11
|
+
|
|
12
|
+
Certains composants sont suffisamment couverts par Vuetify et ne nécessitent pas d'encapsulation supplémentaire. Dans ce cas, nous appliquons simplement les bonnes props Vuetify en combinaison avec les tokens de couleur de chaque thème.
|
|
13
|
+
Cela signifie que vous pouvez utiliser toute l'API Vuetify native sur ces composants, sans restriction.
|
|
14
|
+
|
|
15
|
+
## Utilisation
|
|
16
|
+
|
|
17
|
+
Pour ces composants, il vous suffit d'utiliser directement le composant Vuetify avec les props adéquates.
|
|
18
|
+
|
|
19
|
+
### Exemple avec `v-btn`
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<!-- Bouton primaire -->
|
|
23
|
+
<v-btn color="primary">Button</v-btn>
|
|
24
|
+
|
|
25
|
+
<!-- Bouton outlined -->
|
|
26
|
+
<v-btn color="primary" variant="outlined">Button</v-btn>
|
|
27
|
+
|
|
28
|
+
<!-- Bouton tonal -->
|
|
29
|
+
<v-btn color="primary" variant="tonal">Button</v-btn>
|
|
30
|
+
|
|
31
|
+
<!-- Bouton texte -->
|
|
32
|
+
<v-btn color="primary" variant="text">Button</v-btn>
|
|
33
|
+
|
|
34
|
+
<!-- Bouton désactivé -->
|
|
35
|
+
<v-btn color="primary" disabled>Button</v-btn>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Props Vuetify disponibles
|
|
39
|
+
|
|
40
|
+
Vous pouvez utiliser n'importe quelle prop reconnue par Vuetify sur ces composants. Par exemple, pour un bouton `v-btn` la liste complète des props est disponible sur la [documentation Vuetify](https://vuetifyjs.com/en/api/v-btn/#props) du composant.
|
|
41
|
+
|
|
42
|
+
## Thèmes supportés
|
|
43
|
+
|
|
44
|
+
Pour le `v-btn` par exemple les couleurs `primary`, `secondary` et `tertiary` sont définies différemment selon le thème actif.
|
|
45
|
+
|
|
46
|
+
## Conclusion
|
|
47
|
+
|
|
48
|
+
L'utilisation directe des composants Vuetify avec les thèmes du design system vous offre une flexibilité maximale. Vous bénéficiez de toute l'API Vuetify tout en respectant automatiquement la charte graphique du thème actif. Il vous suffit d'utiliser les bonnes valeurs pour obtenir un rendu cohérent avec le design system.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/blocks'
|
|
2
|
+
import * as VBreadcrumbsStories from './v-breadcrumbs.stories'
|
|
3
|
+
|
|
4
|
+
<Meta title="Composants/Composants Vuetify/VBreadcrumbs" />
|
|
5
|
+
|
|
6
|
+
<div className="header">
|
|
7
|
+
<h1>VBreadcrumbs</h1>
|
|
8
|
+
Ce composant utilise directement le composant natif `v-breadcrumbs` de Vuetify avec les couleurs du thème actif du design system.
|
|
9
|
+
Pour l'API complète du composant, consulter la [documentation Vuetify](https://vuetifyjs.com/en/api/v-breadcrumbs/#props).
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
## Default
|
|
13
|
+
|
|
14
|
+
<div style={{ padding: '24px' }}>
|
|
15
|
+
<Canvas of={VBreadcrumbsStories.Default} />
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
## Avec divider personnalisé
|
|
19
|
+
|
|
20
|
+
<div style={{ padding: '24px' }}>
|
|
21
|
+
<Canvas of={VBreadcrumbsStories.CustomDivider} />
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
## Désactivé
|
|
25
|
+
|
|
26
|
+
<div style={{ padding: '24px' }}>
|
|
27
|
+
<Canvas of={VBreadcrumbsStories.Disabled} />
|
|
28
|
+
</div>
|