@cnamts/synapse 1.0.22 → 1.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AutocompleteFilter-BWLR3U7W.js +114 -0
- package/dist/AutocompleteFilter-D9jzRzAL.cjs +1 -0
- package/dist/{DateFilter-B5n-ZkLi.js → DateFilter-BpwFexzi.js} +1 -1
- package/dist/DateFilter-DTUl8hb1.cjs +1 -0
- package/dist/{NumberFilter-CtiZ9uj8.js → NumberFilter-Bz_NTdX9.js} +3 -3
- package/dist/NumberFilter-MAEojdk0.cjs +1 -0
- package/dist/PeriodFilter-CC4WgIhl.cjs +1 -0
- package/dist/{PeriodFilter-DzqiMb-b.js → PeriodFilter-DX_wy9g-.js} +1 -1
- package/dist/SelectFilter-BR3fvl-a.cjs +1 -0
- package/dist/SelectFilter-xqiPtPgX.js +135 -0
- package/dist/{TextFilter-BOFRNfcX.js → TextFilter-BBl3JFqK.js} +7 -7
- package/dist/TextFilter-CCfYFl5F.cjs +1 -0
- package/dist/apLightTheme-CFSRrjv2.cjs +1 -0
- package/dist/apLightTheme-D1P4jcD0.js +1231 -0
- package/dist/components/Accordion/Accordion.d.ts +13 -2
- package/dist/components/Accordion/composables/useAccordionState.d.ts +2 -1
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.d.ts +1 -1
- 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 +61 -61
- 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 +7506 -10100
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +22 -22
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +42 -42
- 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 +130 -147
- package/dist/components/Customs/Selects/SyAutocomplete/locales.d.ts +5 -0
- package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +6 -6
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +13 -17
- package/dist/components/Customs/Selects/SySelect/locales.d.ts +1 -0
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +9 -9
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +29 -507
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +29 -507
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +64 -81
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +640 -780
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +322 -407
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +114 -156
- 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/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/ErrorPage/ErrorPage.d.ts +3 -1
- package/dist/components/FileList/UploadItem/UploadItem.d.ts +6 -0
- package/dist/components/FileList/UploadItem/locales.d.ts +1 -4
- package/dist/components/FileUpload/FileUploadContent.d.ts +2 -0
- package/dist/components/FileUpload/validateFiles.d.ts +2 -1
- package/dist/components/HeaderBar/HeaderBar.d.ts +2 -1
- package/dist/components/HeaderBar/HeaderLogo/HeaderLogo.d.ts +2 -1
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +6 -5
- 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 +1903 -0
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1863 -0
- package/dist/components/MonthPicker/MonthPickerText/useTextField.d.ts +21 -0
- package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.d.ts +21 -0
- package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.d.ts +12 -0
- package/dist/components/MonthPicker/MonthPickerVisual/MonthSelector.d.ts +11 -0
- package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.d.ts +6 -0
- package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.d.ts +14 -0
- package/dist/components/MonthPicker/MonthPickerVisual/YearSelector.d.ts +14 -0
- package/dist/components/MonthPicker/MonthPickerVisual/useMonthGrid.d.ts +9 -0
- package/dist/components/MonthPicker/MonthPickerVisual/useYearGrid.d.ts +8 -0
- package/dist/components/MonthPicker/MonthPickerVisual/utils.d.ts +8 -0
- package/dist/components/MonthPicker/locales.d.ts +12 -0
- package/dist/components/MonthPicker/useMonthPickerValidation.d.ts +25 -0
- package/dist/components/NirField/NirField.d.ts +209 -271
- package/dist/components/NirField/locales.d.ts +10 -10
- package/dist/components/NirField/useNirValidation.d.ts +64 -0
- package/dist/components/NotificationBar/Notification/Notification.d.ts +3 -0
- package/dist/components/PasswordField/PasswordField.d.ts +9 -10
- package/dist/components/PeriodField/PeriodField.d.ts +1379 -1659
- package/dist/components/PhoneField/PhoneField.d.ts +90 -125
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
- package/dist/components/SyBtnMenu/SyBtnMenu.d.ts +1 -1
- package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +1 -0
- package/dist/components/SyHeading/SyHeading.d.ts +4 -2
- package/dist/components/SyHeading/SyHeading.test.d.ts +1 -0
- package/dist/components/SyTextArea/SyTextArea.d.ts +35 -15
- package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +11 -8
- package/dist/components/Tables/SyTable/SyTable.d.ts +11 -8
- package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
- package/dist/components/Tables/common/SyTablePagination.d.ts +21 -23
- 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/types.d.ts +19 -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 +6 -6
- package/dist/components/index.d.ts +1 -0
- package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
- package/dist/composables/rules/useFieldValidation.d.ts +4 -4
- 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 +15 -9
- package/dist/design-system-v3.d.ts +2 -0
- package/dist/design-system-v3.js +196 -194
- package/dist/design-system-v3.umd.cjs +1 -1066
- package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +5 -0
- package/dist/{main-CEl4J8_T.js → main-BtTqyn4z.js} +16983 -15576
- package/dist/main-C1e3eoxd.cjs +1067 -0
- 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/vuetifyConfig.js +561 -0
- package/dist/vuetifyConfig.umd.cjs +1 -0
- package/package.json +18 -6
- package/src/assets/apTokens.scss +2 -2
- package/src/assets/overrides/_btns.scss +2 -0
- package/src/assets/overrides/_forms.scss +9 -0
- package/src/assets/overrides/_icons.scss +41 -4
- package/src/assets/overrides/_tables.scss +19 -0
- package/src/assets/overrides/_typography.scss +0 -10
- package/src/components/Accordion/Accordion.mdx +23 -9
- package/src/components/Accordion/Accordion.stories.ts +153 -3
- package/src/components/Accordion/Accordion.vue +7 -6
- package/src/components/Accordion/composables/__tests__/useAccordionState.spec.ts +40 -12
- package/src/components/Accordion/composables/useAccordionState.ts +3 -4
- package/src/components/Accordion/tests/accordion.spec.ts +131 -19
- package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.mdx +3 -1
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.stories.ts +8 -0
- package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
- package/src/components/BackBtn/accessibilite/Accessibility.mdx +62 -10
- package/src/components/BackToTopBtn/BackToTopBtn.stories.ts +9 -3
- package/src/components/BackToTopBtn/accessibilite/Accessibility.mdx +86 -6
- package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
- package/src/components/Captcha/tests/Captcha.spec.ts +0 -29
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +14 -122
- package/src/components/ChipList/ChipList.stories.ts +0 -15
- package/src/components/ChipList/ChipList.vue +5 -1
- package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
- package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
- package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +124 -10
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +379 -93
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +162 -84
- package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibilite.stories.ts +40 -1
- package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibility.mdx +7 -1
- package/src/components/Customs/Selects/SyAutocomplete/locales.ts +5 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +96 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +377 -9
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +27 -13
- package/src/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.ts +9 -10
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +8 -9
- package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
- package/src/components/Customs/Selects/SySelect/SySelect.vue +60 -14
- package/src/components/Customs/Selects/SySelect/locales.ts +1 -0
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +54 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +16 -11
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +35 -0
- 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/SyIcon/SyIcon.vue +1 -1
- package/src/components/Customs/SyIcon/tests/SyIcon.a11y.spec.ts +20 -0
- package/src/components/Customs/SyIconButton/SyIconButton.mdx +46 -0
- package/src/components/Customs/SyIconButton/SyIconButton.stories.ts +184 -0
- package/src/components/Customs/SyIconButton/SyIconButton.vue +38 -0
- package/src/components/Customs/SyIconButton/accessibilite/Accessibility.mdx +64 -0
- package/src/components/Customs/SyIconButton/tests/SyIconButton.a11y.spec.ts +87 -0
- package/src/components/Customs/SyIconButton/tests/SyIconButton.spec.ts +152 -0
- package/src/components/Customs/SyIconButton/tests/__snapshots__/SyIconButton.spec.ts.snap +61 -0
- package/src/components/Customs/SyPagination/SyPagination.vue +5 -5
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
- package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +29 -27
- package/src/components/Customs/SyTextField/SyTextField.vue +174 -159
- package/src/components/Customs/SyTextField/accessibilite/Accessibility.mdx +67 -9
- package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +47 -0
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +155 -10
- package/src/components/DataList/accessibilite/Accessibility.mdx +79 -11
- package/src/components/DataListGroup/accessibilite/Accessibility.mdx +80 -11
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +330 -223
- 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 +195 -159
- package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +10 -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 +63 -57
- 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/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/useDateTextField.ts +7 -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/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
- package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +25 -0
- package/src/components/ErrorPage/ErrorPage.stories.ts +113 -19
- package/src/components/ErrorPage/ErrorPage.vue +17 -2
- package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +17 -0
- package/src/components/ErrorPage/tests/ErrorPage.spec.ts +21 -1
- package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +0 -1
- package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +23 -0
- package/src/components/FileList/FileList.stories.ts +51 -1
- package/src/components/FileList/UploadItem/UploadItem.vue +13 -6
- package/src/components/FileList/UploadItem/locales.ts +3 -12
- package/src/components/FileList/accessibilite/Accessibility.mdx +3 -0
- package/src/components/FileUpload/FileUpload.vue +2 -1
- package/src/components/FileUpload/FileUploadContent.vue +2 -1
- package/src/components/FileUpload/tests/FileUpload.spec.ts +47 -0
- package/src/components/FileUpload/validateFiles.ts +5 -2
- package/src/components/FranceConnectBtn/accessibilite/Accessibility.mdx +62 -9
- package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
- package/src/components/HeaderBar/HeaderBar.vue +2 -1
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +2 -1
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +2 -1
- package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
- package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
- package/src/components/LunarCalendar/accessibilite/Accessibility.mdx +74 -8
- package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +163 -0
- package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
- package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
- package/src/components/MaintenancePage/MaintenancePage.vue +1 -1
- package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +4 -5
- package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +0 -1
- package/src/components/MonthPicker/MonthPicker.mdx +35 -0
- package/src/components/MonthPicker/MonthPicker.stories.ts +527 -0
- package/src/components/MonthPicker/MonthPicker.vue +79 -0
- package/src/components/MonthPicker/MonthPickerText/MonthPickerInput.vue +89 -0
- package/src/components/MonthPicker/MonthPickerText/useTextField.ts +27 -0
- package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.vue +154 -0
- package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.ts +13 -0
- package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +137 -0
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +60 -0
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +149 -0
- package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +143 -0
- package/src/components/MonthPicker/MonthPickerVisual/useMonthGrid.ts +45 -0
- package/src/components/MonthPicker/MonthPickerVisual/useYearGrid.ts +45 -0
- package/src/components/MonthPicker/MonthPickerVisual/utils.ts +17 -0
- package/src/components/MonthPicker/accessibilite/Accessibility.mdx +59 -0
- package/src/components/MonthPicker/locales.ts +12 -0
- package/src/components/MonthPicker/tests/MonthPicker.a11y.spec.ts +71 -0
- package/src/components/MonthPicker/tests/MonthPicker.spec.ts +1249 -0
- package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +2545 -0
- package/src/components/MonthPicker/useMonthPickerValidation.ts +30 -0
- package/src/components/NirField/NirField.mdx +1 -2
- package/src/components/NirField/NirField.stories.ts +70 -6
- package/src/components/NirField/NirField.vue +64 -260
- package/src/components/NirField/accessibilite/Accessibility.mdx +2 -2
- package/src/components/NirField/locales.ts +1 -1
- package/src/components/NirField/tests/NirField.spec.ts +6 -0
- package/src/components/NirField/useNirValidation.ts +271 -0
- package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +2 -3
- package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +22 -14
- package/src/components/NotificationBar/Notification/Notification.vue +3 -1
- package/src/components/NotificationBar/NotificationBar.stories.ts +154 -0
- package/src/components/NotificationBar/tests/NotificationBar.a11y.spec.ts +26 -0
- package/src/components/NotificationBar/tests/NotificationBar.spec.ts +60 -0
- package/src/components/PasswordField/PasswordField.stories.ts +4 -4
- package/src/components/PasswordField/PasswordField.vue +18 -24
- 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 +5 -6
- package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
- package/src/components/RangeField/RangeField.vue +6 -0
- package/src/components/RangeField/accessibilite/Accessibility.mdx +79 -11
- package/src/components/SkipLink/tests/SkipLink.a11y.spec.ts +23 -0
- package/src/components/StatusPage/StatusPage.stories.ts +118 -0
- package/src/components/StatusPage/StatusPage.vue +5 -3
- package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +22 -0
- package/src/components/StatusPage/tests/StatusPage.spec.ts +22 -0
- package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +22 -14
- package/src/components/SubHeader/tests/SubHeader.a11y.spec.ts +20 -0
- package/src/components/SyAlert/SyAlert.vue +1 -0
- package/src/components/SyAlert/accessibilite/Accessibility.mdx +79 -9
- package/src/components/SyAlert/tests/SyAlert.a11y.spec.ts +23 -0
- package/src/components/SyHeading/SyHeading.a11y.test.ts +149 -0
- package/src/components/SyHeading/SyHeading.test.ts +115 -0
- package/src/components/SyHeading/SyHeading.vue +5 -3
- package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
- package/src/components/SyTextArea/SyTextArea.vue +53 -23
- package/src/components/SyTextArea/accessibilite/Accessibility.mdx +80 -8
- package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +151 -0
- package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
- package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
- package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +673 -1
- package/src/components/Tables/SyServerTable/SyServerTable.vue +148 -91
- package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +58 -0
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +122 -0
- package/src/components/Tables/SyTable/SyTable.mdx +25 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +452 -1
- package/src/components/Tables/SyTable/SyTable.vue +130 -56
- package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +57 -0
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +108 -0
- package/src/components/Tables/common/SyTableFilter.vue +22 -2
- package/src/components/Tables/common/TableHeader.vue +5 -1
- 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 +10 -11
- 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/tableFilterUtils.ts +3 -0
- package/src/components/Tables/common/tableStyles.scss +48 -4
- package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
- package/src/components/Tables/common/types.ts +13 -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 +3 -3
- package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
- package/src/components/ToolbarContainer/tests/ToolbarContainer.a11y.spec.ts +126 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +2 -2
- package/src/components/index.ts +1 -0
- 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/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 +15 -9
- 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 +135 -99
- package/src/composantsVuetify/Introduction.mdx +48 -0
- package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
- package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
- package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
- package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
- package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -1
- package/src/designTokens/tokens/cnam/cnamSemantic.ts +2 -2
- package/src/stories/Components/Components.stories.ts +74 -9
- package/src/stories/Demarrer/Accueil.stories.ts +3 -3
- package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
- package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
- package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
- package/dist/SelectFilter-BOYlF7rX.js +0 -136
- package/dist/style.css +0 -1
- package/src/components/DatePicker/Accessibilite.mdx +0 -14
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { mount, flushPromises } from '@vue/test-utils'
|
|
2
2
|
import { describe, it, expect } from 'vitest'
|
|
3
3
|
import DateTextInput from '../DateTextInput.vue'
|
|
4
|
-
import SyTextField from '
|
|
4
|
+
import SyTextField from '@/components/Customs/SyTextField/SyTextField.vue'
|
|
5
5
|
|
|
6
6
|
describe('DateTextInput.clean', () => {
|
|
7
7
|
const mountComponent = (props: Record<string, unknown>) => mount(DateTextInput, {
|
|
@@ -282,6 +282,57 @@ describe('DateTextInput.clean', () => {
|
|
|
282
282
|
expect(input.element.value).toContain('01/01/2025')
|
|
283
283
|
})
|
|
284
284
|
|
|
285
|
+
it('validateOnSubmit succeeds with a valid date', async () => {
|
|
286
|
+
const wrapper = mountComponent({
|
|
287
|
+
label: 'Date',
|
|
288
|
+
format: 'DD/MM/YYYY',
|
|
289
|
+
required: true,
|
|
290
|
+
})
|
|
291
|
+
|
|
292
|
+
const input = wrapper.find('input')
|
|
293
|
+
await input.setValue('15/06/2025')
|
|
294
|
+
await input.trigger('blur')
|
|
295
|
+
await flushPromises()
|
|
296
|
+
|
|
297
|
+
const result = await wrapper.vm.validateOnSubmit()
|
|
298
|
+
expect(result).toBe(true)
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
it('validateOnSubmit fails with an invalid date', async () => {
|
|
302
|
+
const wrapper = mountComponent({
|
|
303
|
+
label: 'Date',
|
|
304
|
+
format: 'DD/MM/YYYY',
|
|
305
|
+
required: true,
|
|
306
|
+
})
|
|
307
|
+
|
|
308
|
+
const input = wrapper.find('input')
|
|
309
|
+
await input.setValue('99/99/9999')
|
|
310
|
+
await input.trigger('blur')
|
|
311
|
+
await flushPromises()
|
|
312
|
+
|
|
313
|
+
const result = await wrapper.vm.validateOnSubmit()
|
|
314
|
+
expect(result).toBe(false)
|
|
315
|
+
})
|
|
316
|
+
|
|
317
|
+
it('validateOnSubmit fails with a future date and notAfterToday custom rule', async () => {
|
|
318
|
+
const wrapper = mountComponent({
|
|
319
|
+
label: 'Date',
|
|
320
|
+
format: 'DD/MM/YYYY',
|
|
321
|
+
required: true,
|
|
322
|
+
customRules: [
|
|
323
|
+
{ type: 'notAfterToday', options: { message: 'La date ne peut pas être après aujourd\'hui' } },
|
|
324
|
+
],
|
|
325
|
+
})
|
|
326
|
+
|
|
327
|
+
const input = wrapper.find('input')
|
|
328
|
+
await input.setValue('01/01/2100')
|
|
329
|
+
await input.trigger('blur')
|
|
330
|
+
await flushPromises()
|
|
331
|
+
|
|
332
|
+
const result = await wrapper.vm.validateOnSubmit()
|
|
333
|
+
expect(result).toBe(false)
|
|
334
|
+
})
|
|
335
|
+
|
|
285
336
|
it('does not validate on blur when isValidateOnBlur is false but validateOnSubmit still applies', async () => {
|
|
286
337
|
const wrapper = mountComponent({
|
|
287
338
|
label: 'Date',
|
|
@@ -24,4 +24,5 @@ export { useMonthButtonCustomization } from './useMonthButtonCustomization'
|
|
|
24
24
|
export { useAsteriskDisplay } from './useAsteriskDisplay'
|
|
25
25
|
export { useDatePickerState } from './useDatePickerState'
|
|
26
26
|
export { useHolidayHighlighting } from './useHolidayHighlighting'
|
|
27
|
+
export { useDatePickerFocusTrap } from './useDatePickerFocusTrap'
|
|
27
28
|
export * from './useCalendarKeyboardNavigation'
|
|
@@ -8,6 +8,7 @@ import { useCalendarKeyboardNavigation } from '../useCalendarKeyboardNavigation'
|
|
|
8
8
|
|
|
9
9
|
describe('useCalendarKeyboardNavigation', () => {
|
|
10
10
|
it('attaches and detaches keydown listener based on visibility', async () => {
|
|
11
|
+
vi.useFakeTimers()
|
|
11
12
|
const isDatePickerVisible = ref(false)
|
|
12
13
|
const datePickerRef = ref<ComponentPublicInstance | null>(null)
|
|
13
14
|
const getCurrentDate = vi.fn(() => null)
|
|
@@ -32,100 +33,116 @@ describe('useCalendarKeyboardNavigation', () => {
|
|
|
32
33
|
|
|
33
34
|
// When the date picker becomes visible, a keydown listener should be attached
|
|
34
35
|
isDatePickerVisible.value = true
|
|
35
|
-
await nextTick()
|
|
36
|
-
await nextTick()
|
|
36
|
+
await nextTick() // watcher triggers and calls nextTick(attachListeners)
|
|
37
|
+
await nextTick() // attachListeners runs and sets setTimeout
|
|
38
|
+
vi.advanceTimersByTime(150) // Flush setTimeout inside tryAttach
|
|
37
39
|
expect(addEventListenerSpy).toHaveBeenCalled()
|
|
38
40
|
|
|
39
41
|
// When it becomes hidden, the listener should be detached
|
|
40
42
|
isDatePickerVisible.value = false
|
|
41
|
-
await nextTick()
|
|
43
|
+
await nextTick() // watcher triggers and calls detachListeners
|
|
42
44
|
expect(removeEventListenerSpy).toHaveBeenCalled()
|
|
43
45
|
|
|
44
46
|
addEventListenerSpy.mockRestore()
|
|
45
47
|
removeEventListenerSpy.mockRestore()
|
|
48
|
+
vi.useRealTimers()
|
|
46
49
|
})
|
|
47
50
|
|
|
48
|
-
it('
|
|
51
|
+
it('navigates with arrows correctly, setting next day and forcing focus', async () => {
|
|
52
|
+
vi.useFakeTimers()
|
|
49
53
|
const isDatePickerVisible = ref(true)
|
|
50
|
-
|
|
51
54
|
const rootEl = document.createElement('div')
|
|
52
55
|
|
|
53
|
-
// Current day cell
|
|
54
|
-
const currentCell = document.createElement('div')
|
|
55
|
-
currentCell.setAttribute('data-v-date', '2023-01-10')
|
|
56
|
-
const currentButton = document.createElement('button')
|
|
57
|
-
currentButton.type = 'button'
|
|
58
|
-
currentCell.appendChild(currentButton)
|
|
59
|
-
rootEl.appendChild(currentCell)
|
|
60
|
-
|
|
61
|
-
// Next day cell
|
|
62
|
-
const nextCell = document.createElement('div')
|
|
63
|
-
nextCell.setAttribute('data-v-date', '2023-01-11')
|
|
64
|
-
const nextButton = document.createElement('button')
|
|
65
|
-
nextButton.type = 'button'
|
|
66
|
-
const focusSpy = vi.fn()
|
|
67
|
-
nextButton.focus = focusSpy
|
|
68
|
-
nextCell.appendChild(nextButton)
|
|
69
|
-
rootEl.appendChild(nextCell)
|
|
70
|
-
|
|
71
56
|
const datePickerRef = ref<ComponentPublicInstance | null>({ $el: rootEl } as unknown as ComponentPublicInstance)
|
|
72
57
|
const getCurrentDate = vi.fn(() => new Date(2023, 0, 10))
|
|
73
58
|
const setCurrentDate = vi.fn()
|
|
74
59
|
|
|
75
|
-
let savedListener:
|
|
60
|
+
let savedListener: ((e: KeyboardEvent) => void) | null = null
|
|
61
|
+
|
|
76
62
|
const addEventListenerSpy = vi.spyOn(document, 'addEventListener').mockImplementation((type, listener) => {
|
|
77
63
|
if (type === 'keydown') {
|
|
78
|
-
savedListener = listener as
|
|
64
|
+
savedListener = listener as ((e: KeyboardEvent) => void)
|
|
79
65
|
}
|
|
80
66
|
})
|
|
81
67
|
|
|
82
|
-
let attachListeners!: () => void
|
|
83
68
|
const TestComponent = defineComponent({
|
|
84
69
|
setup() {
|
|
85
|
-
const { attachListeners
|
|
70
|
+
const { attachListeners } = useCalendarKeyboardNavigation({
|
|
86
71
|
isDatePickerVisible,
|
|
87
72
|
datePickerRef,
|
|
88
73
|
getCurrentDate,
|
|
89
74
|
setCurrentDate,
|
|
90
75
|
})
|
|
91
|
-
|
|
76
|
+
|
|
77
|
+
// Assurer qu'on ne trouve aucun des deux autres sélecteurs pour retomber sur document.addEventListener
|
|
78
|
+
datePickerRef.value = null
|
|
79
|
+
|
|
80
|
+
attachListeners()
|
|
81
|
+
vi.advanceTimersByTime(150) // Flush setTimeout inside tryAttach
|
|
92
82
|
return () => null
|
|
93
83
|
},
|
|
94
84
|
})
|
|
95
85
|
|
|
96
86
|
mount(TestComponent)
|
|
97
|
-
|
|
98
|
-
attachListeners()
|
|
99
|
-
expect(addEventListenerSpy).toHaveBeenCalled()
|
|
100
87
|
expect(savedListener).toBeTruthy()
|
|
101
88
|
|
|
102
|
-
//
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
expect(
|
|
89
|
+
// ArrowRight: 10 Jan -> 11 Jan
|
|
90
|
+
const rightEvent = new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true })
|
|
91
|
+
const currentCell = document.createElement('div')
|
|
92
|
+
currentCell.setAttribute('data-v-date', '2023-01-10')
|
|
93
|
+
const currentButton = document.createElement('button')
|
|
94
|
+
currentButton.type = 'button'
|
|
95
|
+
currentCell.appendChild(currentButton)
|
|
96
|
+
Object.defineProperty(rightEvent, 'target', { value: currentButton })
|
|
97
|
+
|
|
98
|
+
if (savedListener) (savedListener as (e: KeyboardEvent) => void)(rightEvent)
|
|
99
|
+
|
|
100
|
+
expect(setCurrentDate).toHaveBeenCalled()
|
|
101
|
+
const nextDate = setCurrentDate.mock.calls[0]?.[0] as Date | undefined
|
|
102
|
+
expect(nextDate?.getDate()).toBe(11)
|
|
103
|
+
|
|
104
|
+
// ArrowLeft: 10 Jan -> 9 Jan
|
|
105
|
+
setCurrentDate.mockClear()
|
|
106
|
+
const leftEvent = new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true })
|
|
107
|
+
Object.defineProperty(leftEvent, 'target', { value: currentButton })
|
|
108
|
+
if (savedListener) (savedListener as (e: KeyboardEvent) => void)(leftEvent)
|
|
109
|
+
const prevDate = setCurrentDate.mock.calls[0]?.[0] as Date | undefined
|
|
110
|
+
expect(prevDate?.getDate()).toBe(9)
|
|
111
|
+
|
|
112
|
+
// ArrowUp: 10 Jan -> 3 Jan
|
|
113
|
+
setCurrentDate.mockClear()
|
|
114
|
+
const upEvent = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true })
|
|
115
|
+
Object.defineProperty(upEvent, 'target', { value: currentButton })
|
|
116
|
+
if (savedListener) (savedListener as (e: KeyboardEvent) => void)(upEvent)
|
|
117
|
+
const upDate = setCurrentDate.mock.calls[0]?.[0] as Date | undefined
|
|
118
|
+
expect(upDate?.getDate()).toBe(3)
|
|
119
|
+
|
|
120
|
+
// ArrowDown: 10 Jan -> 17 Jan
|
|
121
|
+
setCurrentDate.mockClear()
|
|
122
|
+
const downEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true })
|
|
123
|
+
Object.defineProperty(downEvent, 'target', { value: currentButton })
|
|
124
|
+
if (savedListener) (savedListener as (e: KeyboardEvent) => void)(downEvent)
|
|
125
|
+
const downDate = setCurrentDate.mock.calls[0]?.[0] as Date | undefined
|
|
126
|
+
expect(downDate?.getDate()).toBe(17)
|
|
114
127
|
|
|
115
128
|
addEventListenerSpy.mockRestore()
|
|
129
|
+
vi.useRealTimers()
|
|
116
130
|
})
|
|
117
131
|
|
|
118
132
|
it('falls back to getCurrentDate when event target is not a day cell', () => {
|
|
133
|
+
vi.useFakeTimers()
|
|
119
134
|
const isDatePickerVisible = ref(true)
|
|
120
|
-
const
|
|
135
|
+
const rootEl = document.createElement('div')
|
|
136
|
+
const datePickerRef = ref<ComponentPublicInstance | null>({ $el: rootEl } as unknown as ComponentPublicInstance)
|
|
121
137
|
const baseDate = new Date(2023, 0, 10)
|
|
122
138
|
const getCurrentDate = vi.fn(() => baseDate)
|
|
123
139
|
const setCurrentDate = vi.fn()
|
|
124
140
|
|
|
125
|
-
let savedListener:
|
|
141
|
+
let savedListener: ((e: KeyboardEvent) => void) | null = null
|
|
142
|
+
|
|
126
143
|
const addEventListenerSpy = vi.spyOn(document, 'addEventListener').mockImplementation((type, listener) => {
|
|
127
144
|
if (type === 'keydown') {
|
|
128
|
-
savedListener = listener as
|
|
145
|
+
savedListener = listener as ((e: KeyboardEvent) => void)
|
|
129
146
|
}
|
|
130
147
|
})
|
|
131
148
|
|
|
@@ -138,6 +155,9 @@ describe('useCalendarKeyboardNavigation', () => {
|
|
|
138
155
|
getCurrentDate,
|
|
139
156
|
setCurrentDate,
|
|
140
157
|
})
|
|
158
|
+
|
|
159
|
+
datePickerRef.value = null
|
|
160
|
+
|
|
141
161
|
attachListeners = result.attachListeners
|
|
142
162
|
return () => null
|
|
143
163
|
},
|
|
@@ -145,39 +165,49 @@ describe('useCalendarKeyboardNavigation', () => {
|
|
|
145
165
|
|
|
146
166
|
mount(TestComponent)
|
|
147
167
|
|
|
168
|
+
// Le setTimeout(..., 100) est appelé dans attachListeners, il faut l'avancer
|
|
148
169
|
attachListeners()
|
|
170
|
+
vi.advanceTimersByTime(150)
|
|
171
|
+
|
|
149
172
|
expect(addEventListenerSpy).toHaveBeenCalled()
|
|
150
173
|
expect(savedListener).toBeTruthy()
|
|
151
174
|
|
|
152
175
|
const preventDefault = vi.fn()
|
|
153
|
-
const event = {
|
|
176
|
+
const event = new KeyboardEvent('keydown', {
|
|
154
177
|
key: 'ArrowRight',
|
|
155
178
|
altKey: false,
|
|
156
179
|
ctrlKey: false,
|
|
157
180
|
metaKey: false,
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
181
|
+
})
|
|
182
|
+
Object.defineProperty(event, 'preventDefault', { value: preventDefault })
|
|
183
|
+
Object.defineProperty(event, 'target', { value: document.createElement('button') })
|
|
161
184
|
|
|
162
185
|
savedListener!(event)
|
|
163
186
|
|
|
164
187
|
expect(preventDefault).toHaveBeenCalled()
|
|
165
188
|
expect(setCurrentDate).toHaveBeenCalledTimes(1)
|
|
166
|
-
|
|
189
|
+
|
|
190
|
+
// When using ArrowRight from baseDate (10 Jan), it should compute 11 Jan
|
|
191
|
+
const nextDate = setCurrentDate.mock.calls[0]?.[0] as Date | undefined
|
|
192
|
+
expect(nextDate?.getDate()).toBe(11)
|
|
167
193
|
|
|
168
194
|
addEventListenerSpy.mockRestore()
|
|
195
|
+
vi.useRealTimers()
|
|
169
196
|
})
|
|
170
197
|
|
|
171
198
|
it('does not react to non-arrow keys', () => {
|
|
199
|
+
vi.useFakeTimers()
|
|
172
200
|
const isDatePickerVisible = ref(true)
|
|
173
|
-
const
|
|
201
|
+
const rootEl = document.createElement('div')
|
|
202
|
+
const datePickerRef = ref<ComponentPublicInstance | null>({ $el: rootEl } as unknown as ComponentPublicInstance)
|
|
174
203
|
const getCurrentDate = vi.fn(() => new Date(2023, 0, 10))
|
|
175
204
|
const setCurrentDate = vi.fn()
|
|
176
205
|
|
|
177
|
-
let savedListener:
|
|
206
|
+
let savedListener: ((e: KeyboardEvent) => void) | null = null
|
|
207
|
+
|
|
178
208
|
const addEventListenerSpy = vi.spyOn(document, 'addEventListener').mockImplementation((type, listener) => {
|
|
179
209
|
if (type === 'keydown') {
|
|
180
|
-
savedListener = listener as
|
|
210
|
+
savedListener = listener as ((e: KeyboardEvent) => void)
|
|
181
211
|
}
|
|
182
212
|
})
|
|
183
213
|
|
|
@@ -190,6 +220,9 @@ describe('useCalendarKeyboardNavigation', () => {
|
|
|
190
220
|
getCurrentDate,
|
|
191
221
|
setCurrentDate,
|
|
192
222
|
})
|
|
223
|
+
|
|
224
|
+
datePickerRef.value = null
|
|
225
|
+
|
|
193
226
|
attachListeners = result.attachListeners
|
|
194
227
|
return () => null
|
|
195
228
|
},
|
|
@@ -198,17 +231,18 @@ describe('useCalendarKeyboardNavigation', () => {
|
|
|
198
231
|
mount(TestComponent)
|
|
199
232
|
|
|
200
233
|
attachListeners()
|
|
234
|
+
vi.advanceTimersByTime(150) // Flush setTimeout inside tryAttach
|
|
201
235
|
expect(savedListener).toBeTruthy()
|
|
202
236
|
|
|
203
237
|
const preventDefault = vi.fn()
|
|
204
|
-
const event = {
|
|
238
|
+
const event = new KeyboardEvent('keydown', {
|
|
205
239
|
key: 'A',
|
|
206
240
|
altKey: false,
|
|
207
241
|
ctrlKey: false,
|
|
208
242
|
metaKey: false,
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
243
|
+
})
|
|
244
|
+
Object.defineProperty(event, 'preventDefault', { value: preventDefault })
|
|
245
|
+
Object.defineProperty(event, 'target', { value: document.createElement('div') })
|
|
212
246
|
|
|
213
247
|
savedListener!(event)
|
|
214
248
|
|
|
@@ -216,18 +250,22 @@ describe('useCalendarKeyboardNavigation', () => {
|
|
|
216
250
|
expect(preventDefault).not.toHaveBeenCalled()
|
|
217
251
|
|
|
218
252
|
addEventListenerSpy.mockRestore()
|
|
253
|
+
vi.useRealTimers()
|
|
219
254
|
})
|
|
220
255
|
|
|
221
256
|
it('ignores arrow keys when modifier keys are pressed', () => {
|
|
257
|
+
vi.useFakeTimers()
|
|
222
258
|
const isDatePickerVisible = ref(true)
|
|
223
|
-
const
|
|
259
|
+
const rootEl = document.createElement('div')
|
|
260
|
+
const datePickerRef = ref<ComponentPublicInstance | null>({ $el: rootEl } as unknown as ComponentPublicInstance)
|
|
224
261
|
const getCurrentDate = vi.fn(() => new Date(2023, 0, 10))
|
|
225
262
|
const setCurrentDate = vi.fn()
|
|
226
263
|
|
|
227
|
-
let savedListener:
|
|
264
|
+
let savedListener: ((e: KeyboardEvent) => void) | null = null
|
|
265
|
+
|
|
228
266
|
const addEventListenerSpy = vi.spyOn(document, 'addEventListener').mockImplementation((type, listener) => {
|
|
229
267
|
if (type === 'keydown') {
|
|
230
|
-
savedListener = listener as
|
|
268
|
+
savedListener = listener as ((e: KeyboardEvent) => void)
|
|
231
269
|
}
|
|
232
270
|
})
|
|
233
271
|
|
|
@@ -240,6 +278,9 @@ describe('useCalendarKeyboardNavigation', () => {
|
|
|
240
278
|
getCurrentDate,
|
|
241
279
|
setCurrentDate,
|
|
242
280
|
})
|
|
281
|
+
|
|
282
|
+
datePickerRef.value = null
|
|
283
|
+
|
|
243
284
|
attachListeners = result.attachListeners
|
|
244
285
|
return () => null
|
|
245
286
|
},
|
|
@@ -248,17 +289,19 @@ describe('useCalendarKeyboardNavigation', () => {
|
|
|
248
289
|
mount(TestComponent)
|
|
249
290
|
|
|
250
291
|
attachListeners()
|
|
292
|
+
vi.advanceTimersByTime(150)
|
|
293
|
+
|
|
251
294
|
expect(savedListener).toBeTruthy()
|
|
252
295
|
|
|
253
296
|
const preventDefault = vi.fn()
|
|
254
|
-
const event = {
|
|
297
|
+
const event = new KeyboardEvent('keydown', {
|
|
255
298
|
key: 'ArrowRight',
|
|
256
299
|
altKey: true,
|
|
257
300
|
ctrlKey: false,
|
|
258
301
|
metaKey: false,
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
302
|
+
})
|
|
303
|
+
Object.defineProperty(event, 'preventDefault', { value: preventDefault })
|
|
304
|
+
Object.defineProperty(event, 'target', { value: document.createElement('div') })
|
|
262
305
|
|
|
263
306
|
savedListener!(event)
|
|
264
307
|
|
|
@@ -266,5 +309,6 @@ describe('useCalendarKeyboardNavigation', () => {
|
|
|
266
309
|
expect(preventDefault).not.toHaveBeenCalled()
|
|
267
310
|
|
|
268
311
|
addEventListenerSpy.mockRestore()
|
|
312
|
+
vi.useRealTimers()
|
|
269
313
|
})
|
|
270
314
|
})
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
2
|
+
import { useDatePickerFocusTrap } from '../useDatePickerFocusTrap'
|
|
3
|
+
import { ref } from 'vue'
|
|
4
|
+
import type { ComponentPublicInstance } from 'vue'
|
|
5
|
+
|
|
6
|
+
describe('useDatePickerFocusTrap', () => {
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- sorry
|
|
8
|
+
let isDatePickerVisible: any
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- sorry
|
|
10
|
+
let datePickerRef: any
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- sorry
|
|
12
|
+
let onClose: any
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- sorry
|
|
14
|
+
let restoreFocus: any
|
|
15
|
+
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
isDatePickerVisible = ref(true)
|
|
18
|
+
datePickerRef = ref<ComponentPublicInstance | null>(null)
|
|
19
|
+
onClose = vi.fn()
|
|
20
|
+
restoreFocus = vi.fn()
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('should do nothing if date picker is closed', () => {
|
|
24
|
+
isDatePickerVisible.value = false
|
|
25
|
+
const { handleMenuKeydown } = useDatePickerFocusTrap({
|
|
26
|
+
isDatePickerVisible,
|
|
27
|
+
datePickerRef,
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
const event = new KeyboardEvent('keydown', { key: 'Tab' })
|
|
31
|
+
const preventDefault = vi.spyOn(event, 'preventDefault')
|
|
32
|
+
handleMenuKeydown(event)
|
|
33
|
+
|
|
34
|
+
expect(preventDefault).not.toHaveBeenCalled()
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('should close and restore focus on Escape', () => {
|
|
38
|
+
const { handleMenuKeydown } = useDatePickerFocusTrap({
|
|
39
|
+
isDatePickerVisible,
|
|
40
|
+
datePickerRef,
|
|
41
|
+
onClose,
|
|
42
|
+
restoreFocus,
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
const event = new KeyboardEvent('keydown', { key: 'Escape' })
|
|
46
|
+
const preventDefault = vi.spyOn(event, 'preventDefault')
|
|
47
|
+
const stopPropagation = vi.spyOn(event, 'stopPropagation')
|
|
48
|
+
|
|
49
|
+
handleMenuKeydown(event)
|
|
50
|
+
|
|
51
|
+
expect(isDatePickerVisible.value).toBe(false)
|
|
52
|
+
expect(onClose).toHaveBeenCalled()
|
|
53
|
+
expect(restoreFocus).toHaveBeenCalled()
|
|
54
|
+
expect(preventDefault).toHaveBeenCalled()
|
|
55
|
+
expect(stopPropagation).toHaveBeenCalled()
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it('should let non-Tab keys pass without interference', () => {
|
|
59
|
+
const { handleMenuKeydown } = useDatePickerFocusTrap({
|
|
60
|
+
isDatePickerVisible,
|
|
61
|
+
datePickerRef,
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
const event = new KeyboardEvent('keydown', { key: 'ArrowRight' })
|
|
65
|
+
const preventDefault = vi.spyOn(event, 'preventDefault')
|
|
66
|
+
|
|
67
|
+
handleMenuKeydown(event)
|
|
68
|
+
|
|
69
|
+
expect(preventDefault).not.toHaveBeenCalled()
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
it('should focus Today button when Tab is pressed inside a date grid', () => {
|
|
73
|
+
const rootEl = document.createElement('div')
|
|
74
|
+
|
|
75
|
+
// Create Today button
|
|
76
|
+
const todayButton = document.createElement('button')
|
|
77
|
+
todayButton.className = 'date-picker__today-button'
|
|
78
|
+
todayButton.focus = vi.fn()
|
|
79
|
+
rootEl.appendChild(todayButton)
|
|
80
|
+
|
|
81
|
+
// Create grid
|
|
82
|
+
const grid = document.createElement('div')
|
|
83
|
+
grid.className = 'v-date-picker-month'
|
|
84
|
+
|
|
85
|
+
// Create active cell inside grid
|
|
86
|
+
const cell = document.createElement('div')
|
|
87
|
+
const cellBtn = document.createElement('button')
|
|
88
|
+
cell.appendChild(cellBtn)
|
|
89
|
+
grid.appendChild(cell)
|
|
90
|
+
rootEl.appendChild(grid)
|
|
91
|
+
|
|
92
|
+
datePickerRef.value = { $el: rootEl } as unknown as ComponentPublicInstance
|
|
93
|
+
|
|
94
|
+
const { handleMenuKeydown } = useDatePickerFocusTrap({
|
|
95
|
+
isDatePickerVisible,
|
|
96
|
+
datePickerRef,
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
const event = new KeyboardEvent('keydown', { key: 'Tab' })
|
|
100
|
+
Object.defineProperty(event, 'target', { value: cellBtn })
|
|
101
|
+
const preventDefault = vi.spyOn(event, 'preventDefault')
|
|
102
|
+
|
|
103
|
+
handleMenuKeydown(event)
|
|
104
|
+
|
|
105
|
+
expect(preventDefault).toHaveBeenCalled()
|
|
106
|
+
expect(todayButton.focus).toHaveBeenCalled()
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
it('should cycle focus normally if not in a grid', () => {
|
|
110
|
+
const rootEl = document.createElement('div')
|
|
111
|
+
|
|
112
|
+
const btn1 = document.createElement('button')
|
|
113
|
+
btn1.focus = vi.fn()
|
|
114
|
+
|
|
115
|
+
const btn2 = document.createElement('button')
|
|
116
|
+
btn2.focus = vi.fn()
|
|
117
|
+
|
|
118
|
+
rootEl.appendChild(btn1)
|
|
119
|
+
rootEl.appendChild(btn2)
|
|
120
|
+
|
|
121
|
+
datePickerRef.value = { $el: rootEl } as unknown as ComponentPublicInstance
|
|
122
|
+
|
|
123
|
+
const { handleMenuKeydown } = useDatePickerFocusTrap({
|
|
124
|
+
isDatePickerVisible,
|
|
125
|
+
datePickerRef,
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
// Simuler le focus actuel sur btn1
|
|
129
|
+
vi.spyOn(document, 'activeElement', 'get').mockReturnValue(btn1)
|
|
130
|
+
|
|
131
|
+
const event = new KeyboardEvent('keydown', { key: 'Tab' })
|
|
132
|
+
Object.defineProperty(event, 'target', { value: btn1 })
|
|
133
|
+
|
|
134
|
+
handleMenuKeydown(event)
|
|
135
|
+
|
|
136
|
+
expect(btn2.focus).toHaveBeenCalled()
|
|
137
|
+
})
|
|
138
|
+
})
|