@cnamts/synapse 1.0.19 → 1.0.21
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/{DateFilter-CeVuSfJ9.js → DateFilter-uN8OURoP.js} +1 -1
- package/dist/{NumberFilter-C8PAu_sw.js → NumberFilter-sm1dQNQi.js} +1 -1
- package/dist/{PeriodFilter-UMUaxx3d.js → PeriodFilter-Cklsxnh9.js} +1 -1
- package/dist/{SelectFilter-CqZl8CYt.js → SelectFilter-CWefj27Z.js} +1 -1
- package/dist/{TextFilter-D_RhhNOh.js → TextFilter-Ddyj885L.js} +1 -1
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +4 -4
- package/dist/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.d.ts +17 -7
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +4 -4
- package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +4 -4
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2416 -0
- package/dist/components/Customs/Selects/SyAutocomplete/types.d.ts +5 -0
- package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +14 -0
- package/dist/components/Customs/Selects/SyAutocomplete/utils/useItemUtils.d.ts +16 -0
- package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +28 -0
- package/dist/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.d.ts +12 -0
- package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +2 -0
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +160 -0
- package/dist/components/Customs/SyCheckBoxGroup/locales.d.ts +3 -0
- package/dist/components/Customs/SyCheckBoxGroup/types.d.ts +10 -0
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +1545 -2
- package/dist/components/Customs/SyIcon/SyIcon.d.ts +2 -1
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1495 -2
- package/dist/components/DatePicker/composables/useDateSelection.d.ts +1 -0
- package/dist/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.d.ts +60 -0
- package/dist/components/ErrorPage/ErrorPage.d.ts +1 -12
- package/dist/components/ErrorPage/locales.d.ts +18 -3
- package/dist/components/FileUpload/FileUpload.d.ts +2 -0
- package/dist/components/MaintenancePage/locales.d.ts +18 -2
- package/dist/components/NotFoundPage/locales.d.ts +20 -4
- package/dist/components/PaginatedTable/PaginatedTable.d.ts +1 -1
- package/dist/components/PaginatedTable/Pagination.d.ts +17 -0
- package/dist/components/StatusPage/StatusPage.d.ts +39 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -5
- package/dist/components/Tables/SyTable/SyTable.d.ts +5 -5
- package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +13 -3
- package/dist/components/index.d.ts +4 -0
- package/dist/components/types.d.ts +15 -0
- package/dist/composables/useFormFieldErrorHandling.d.ts +31 -0
- package/dist/design-system-v3.js +126 -122
- package/dist/design-system-v3.umd.cjs +325 -314
- package/dist/{main-B39UVv5p.js → main-CWniLr0s.js} +15837 -14587
- package/dist/modules.d.ts +6 -0
- package/dist/style.css +1 -1
- package/dist/utils/theme/index.d.ts +6 -0
- package/package.json +12 -10
- package/src/assets/amelipro/icons.ts +166 -153
- package/src/components/Accordion/Accordion.mdx +4 -1
- package/src/components/Accordion/{Accessibilite/AccessibilityGuide.mdx → accessibilite/Accessibility.mdx} +2 -2
- package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.stories.ts +73 -14
- package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +119 -27
- package/src/components/Amelipro/AmeliproClickableTile/tests/AmeliproClickableTile.a11y.spec.ts +304 -0
- package/src/components/Amelipro/AmeliproClickableTile/tests/AmeliproClickableTile.spec.ts +435 -9
- package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +60 -0
- package/src/components/Amelipro/AmeliproIcon/__tests__/AmeliproIcon.spec.ts +1 -1
- package/src/components/Amelipro/AmeliproIcon/iconList.ts +2 -0
- package/src/components/BackBtn/BackBtn.vue +5 -4
- package/src/components/BackBtn/accessibilite/Accessibility.mdx +15 -0
- package/src/components/BackToTopBtn/BackToTopBtn.vue +6 -3
- package/src/components/BackToTopBtn/accessibilite/Accessibility.mdx +15 -0
- package/src/components/Captcha/Captcha.vue +5 -1
- package/src/components/Captcha/CaptchaAlert.vue +9 -7
- package/src/components/Captcha/accessibilite/Accessibility.mdx +10 -0
- package/src/components/ChipList/accessibilite/Accessibility.mdx +15 -0
- package/src/components/CollapsibleList/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +8 -6
- package/src/components/Common/IconSlot/IconSlot.vue +1 -1
- package/src/components/ContextualMenu/ContextualMenu.stories.ts +0 -3
- package/src/components/ContextualMenu/accessibilite/Accessibility.mdx +71 -0
- package/src/components/CookieBanner/CookieBanner.stories.ts +11 -20
- package/src/components/CookieBanner/CookieBanner.vue +20 -5
- package/src/components/CookieBanner/accessibilite/Accessibility.mdx +71 -0
- package/src/components/CookieBanner/tests/CookieBanner.spec.ts +48 -4
- package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +5 -4
- package/src/components/CopyBtn/CopyBtn.vue +6 -3
- package/src/components/CopyBtn/accessibilite/Accessibility.mdx +15 -0
- package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +15 -0
- package/src/components/Customs/Selects/SelectOverview.mdx +112 -1
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.mdx +52 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +979 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +653 -0
- package/src/components/Customs/Selects/{SySelect → SyAutocomplete/accessibilite}/Accessibilite.stories.ts +7 -38
- package/src/components/Customs/Selects/{SySelect/Accessibilite.mdx → SyAutocomplete/accessibilite/Accessibility.mdx} +15 -20
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +72 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +345 -0
- package/src/components/Customs/Selects/SyAutocomplete/types.ts +7 -0
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +180 -0
- package/src/components/Customs/Selects/SyAutocomplete/utils/useItemUtils.ts +46 -0
- package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +107 -0
- package/src/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.ts +74 -0
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +13 -9
- package/src/components/Customs/Selects/SyInputSelect/accessibilite/Accessibility.mdx +12 -0
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +43 -34
- package/src/components/Customs/Selects/SySelect/SySelect.vue +19 -2
- package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +274 -0
- package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +21 -16
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.mdx +32 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +856 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +334 -0
- package/src/components/Customs/SyCheckBoxGroup/accessibilite/Accessibility.mdx +243 -0
- package/src/components/Customs/SyCheckBoxGroup/locales.ts +3 -0
- package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.a11y.spec.ts +30 -0
- package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.spec.ts +152 -0
- package/src/components/Customs/SyCheckBoxGroup/types.ts +10 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +16 -27
- package/src/components/Customs/SyCheckbox/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +3 -3
- package/src/components/Customs/SyForm/SyForm.a11y.spec.ts +1 -1
- package/src/components/Customs/SyForm/accessibilite/Accessibility.mdx +10 -0
- package/src/components/Customs/SyIcon/SyIcon.mdx +4 -1
- package/src/components/Customs/SyIcon/SyIcon.vue +4 -3
- package/src/components/Customs/SyIcon/{Accessibilite.stories.ts → accessibilite/Accessibilite.stories.ts} +3 -3
- package/src/components/Customs/SyIcon/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
- package/src/components/Customs/SyPagination/SyPagination.mdx +4 -2
- package/src/components/Customs/SyPagination/accessibilite/Accessibility.mdx +10 -0
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +16 -43
- package/src/components/Customs/SyRadioGroup/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
- package/src/components/Customs/SyTabs/SyTabs.mdx +4 -2
- package/src/components/Customs/SyTabs/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
- package/src/components/Customs/SyTextField/SyTextField.mdx +1 -2
- package/src/components/Customs/SyTextField/SyTextField.vue +13 -0
- package/src/components/Customs/SyTextField/accessibilite/Accessibility.mdx +15 -0
- package/src/components/DataList/accessibilite/Accessibility.mdx +15 -0
- package/src/components/DataListGroup/accessibilite/Accessibility.mdx +14 -0
- package/src/components/DatePicker/Accessibilite.mdx +1 -1
- package/src/components/DatePicker/Accessibilite.stories.ts +1 -1
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +7 -4
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +49 -13
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +43 -2
- package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +297 -0
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +48 -21
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +98 -0
- package/src/components/DatePicker/composables/useDateSelection.ts +5 -0
- package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +273 -0
- package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +4 -4
- package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +10 -0
- package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.mdx +83 -0
- package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.stories.ts +502 -0
- package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.vue +428 -0
- package/src/components/DeclarationAccessibilityPage/accessibilite/Accessibility.mdx +75 -0
- package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.a11y.spec.ts +53 -0
- package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.spec.ts +59 -0
- package/src/components/DiacriticPicker/DiacriticPicker.vue +20 -1
- package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +10 -0
- package/src/components/DialogBox/accessibilite/Accessibility.mdx +15 -0
- package/src/components/DownloadBtn/DownloadBtn.vue +5 -4
- package/src/components/DownloadBtn/accessibilite/Accessibility.mdx +15 -0
- package/src/components/ErrorPage/ErrorPage.mdx +6 -16
- package/src/components/ErrorPage/ErrorPage.stories.ts +16 -87
- package/src/components/ErrorPage/ErrorPage.vue +38 -125
- package/src/components/ErrorPage/accessibilite/Accessibility.mdx +77 -0
- package/src/components/ErrorPage/assets/error-ap.svg +1774 -0
- package/src/components/ErrorPage/locales.ts +21 -3
- package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +5 -13
- package/src/components/ErrorPage/tests/ErrorPage.spec.ts +2 -41
- package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +8 -266
- package/src/components/ExternalLinks/accessibilite/Accessibility.mdx +15 -0
- package/src/components/FileList/UploadItem/UploadItem.vue +25 -20
- package/src/components/FileList/accessibilite/Accessibility.mdx +12 -0
- package/src/components/FilePreview/accessibilite/Accessibility.mdx +12 -0
- package/src/components/FileUpload/FileUpload.vue +5 -0
- package/src/components/FileUpload/FileUploadContent.vue +5 -4
- package/src/components/FileUpload/accessibilite/Accessibility.mdx +12 -0
- package/src/components/FilterInline/FilterInline.vue +5 -4
- package/src/components/FilterInline/accessibilite/Accessibility.mdx +12 -0
- package/src/components/FilterSideBar/accessibilite/Accessibility.mdx +15 -0
- package/src/components/FooterBar/FooterBar.stories.ts +18 -14
- package/src/components/FooterBar/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +3 -4
- package/src/components/FooterBar/defaultSocialMediaLinks.ts +6 -4
- package/src/components/FranceConnectBtn/FranceConnectBtn.vue +6 -5
- package/src/components/FranceConnectBtn/accessibilite/Accessibility.mdx +15 -0
- package/src/components/FranceConnectBtn/tests/__snapshots__/FranceConnectBtn.spec.ts.snap +3 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/accessibilite/Accessibility.mdx +15 -0
- package/src/components/HeaderBar/accessibilite/Accessibility.mdx +15 -0
- package/src/components/HeaderBar/{Usages.mdx → usages/Usages.mdx} +2 -2
- package/src/components/HeaderLoading/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +9 -5
- package/src/components/HeaderToolbar/accessibilite/Accessibility.mdx +15 -0
- package/src/components/LangBtn/LangBtn.vue +5 -4
- package/src/components/LangBtn/accessibilite/Accessibility.mdx +15 -0
- package/src/components/Logo/accessibilite/Accessibility.mdx +17 -0
- package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +12 -0
- package/src/components/LunarCalendar/accessibilite/Accessibility.mdx +10 -0
- package/src/components/MaintenancePage/MaintenancePage.mdx +1 -1
- package/src/components/MaintenancePage/MaintenancePage.vue +15 -7
- package/src/components/MaintenancePage/accessibilite/Accessibility.mdx +70 -0
- package/src/components/MaintenancePage/assets/maintenance-ap.svg +1718 -0
- package/src/components/MaintenancePage/locales.ts +24 -3
- package/src/components/MaintenancePage/tests/MaintenancePage.a11y.spec.ts +75 -3
- package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +42 -2
- package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +3 -2
- package/src/components/NirField/accessibilite/Accessibility.mdx +15 -0
- package/src/components/NotFoundPage/NotFoundPage.mdx +1 -1
- package/src/components/NotFoundPage/NotFoundPage.stories.ts +3 -3
- package/src/components/NotFoundPage/NotFoundPage.vue +16 -11
- package/src/components/NotFoundPage/accessibilite/Accessibility.mdx +87 -0
- package/src/components/NotFoundPage/assets/not-found-ap.svg +2061 -0
- package/src/components/NotFoundPage/locales.ts +24 -4
- package/src/components/NotFoundPage/tests/NotFoundPage.a11y.spec.ts +168 -4
- package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +100 -12
- package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +2 -2
- package/src/components/NotificationBar/Notification/Notification.vue +1 -1
- package/src/components/NotificationBar/NotificationBar.mdx +2 -2
- package/src/components/NotificationBar/accessibilite/Accessibility.mdx +75 -0
- package/src/components/PageContainer/{AccessibilityGuide.mdx → accessibilite/Accessibility.mdx} +7 -4
- package/src/components/PageContainer/tests/PageContainer.a11y.spec.ts +14 -7
- package/src/components/PaginatedTable/PaginatedTable.vue +27 -47
- package/src/components/PaginatedTable/Pagination.vue +93 -0
- package/src/components/PaginatedTable/accessibilite/Accessibility.mdx +12 -0
- package/src/components/PasswordField/PasswordField.vue +2 -1
- package/src/components/PasswordField/accessibilite/Accessibility.mdx +108 -0
- package/src/components/PeriodField/accessibilite/Accessibility.mdx +12 -0
- package/src/components/PhoneField/PhoneField.stories.ts +46 -38
- package/src/components/PhoneField/accessibilite/Accessibility.mdx +15 -0
- package/src/components/RangeField/accessibilite/Accessibility.mdx +15 -0
- package/src/components/RatingPicker/accessibilite/Accessibility.mdx +15 -0
- package/src/components/SearchListField/SearchListField.vue +6 -3
- package/src/components/SearchListField/accessibilite/Accessibility.mdx +15 -0
- package/src/components/SkipLink/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +7 -4
- package/src/components/SocialMediaLinks/DefaultSocialMediaLinks.ts +6 -4
- package/src/components/SocialMediaLinks/SocialMediaLinks.mdx +7 -5
- package/src/components/SocialMediaLinks/SocialMediaLinks.stories.ts +17 -13
- package/src/components/SocialMediaLinks/SocialMediaLinks.vue +9 -1
- package/src/components/SocialMediaLinks/accessibilite/Accessibility.mdx +67 -0
- package/src/components/SocialMediaLinks/tests/DefaultSocialMediaLinks.spec.ts +5 -5
- package/src/components/SocialMediaLinks/tests/SocialMediaLinks.a11y.spec.ts +59 -0
- package/src/components/SocialMediaLinks/tests/SocialMediaLinks.spec.ts +9 -7
- package/src/components/StatusPage/StatusPage.mdx +22 -0
- package/src/components/StatusPage/StatusPage.stories.ts +193 -0
- package/src/components/StatusPage/StatusPage.vue +145 -0
- package/src/components/StatusPage/accessibilite/Accessibility.mdx +81 -0
- package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +29 -0
- package/src/components/StatusPage/tests/StatusPage.spec.ts +50 -0
- package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +270 -0
- package/src/components/SubHeader/accessibilite/Accessibility.mdx +15 -0
- package/src/components/SyAlert/SyAlert.vue +6 -6
- package/src/components/SyAlert/accessibilite/Accessibility.mdx +12 -0
- package/src/components/SyTextArea/accessibilite/Accessibility.mdx +10 -0
- package/src/components/TableToolbar/TableToolbar.stories.ts +6 -6
- package/src/components/TableToolbar/TableToolbar.vue +7 -4
- package/src/components/TableToolbar/accessibilite/Accessibility.mdx +12 -0
- package/src/components/TableToolbar/tests/__snapshots__/TableToolbar.spec.ts.snap +0 -5
- package/src/components/Tables/SyServerTable/SyServerTable.mdx +4 -1
- package/src/components/Tables/SyServerTable/accessibilite/Accessibility.mdx +10 -0
- package/src/components/Tables/SyTable/SyTable.mdx +4 -1
- package/src/components/Tables/SyTable/accessibilite/Accessibility.mdx +10 -0
- package/src/components/Tables/common/TableHeader.vue +3 -1
- package/src/components/Tables/common/organizeColumns/OrganizeColumns.vue +18 -14
- package/src/components/ToolbarContainer/ToolbarContainer.mdx +2 -1
- package/src/components/ToolbarContainer/ToolbarContainer.stories.ts +563 -420
- package/src/components/ToolbarContainer/accessibilite/Accessibility.mdx +69 -0
- package/src/components/UploadWorkflow/UploadWorkflow.mdx +11 -1
- package/src/components/UploadWorkflow/UploadWorkflow.stories.ts +107 -3
- package/src/components/UploadWorkflow/UploadWorkflow.vue +35 -24
- package/src/components/UploadWorkflow/accessibilite/Accessibility.mdx +12 -0
- package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +48 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +9 -5
- package/src/components/UploadWorkflow/useFileList.ts +7 -0
- package/src/components/Usages/Usages.vue +3 -2
- package/src/components/UserMenuBtn/UserMenuBtn.vue +7 -5
- package/src/components/UserMenuBtn/accessibilite/Accessibility.mdx +12 -0
- package/src/components/index.ts +5 -0
- package/src/components/types.ts +10 -0
- package/src/composables/rules/tests/useFieldValidation.spec.ts +39 -3
- package/src/composables/rules/useFieldValidation.ts +31 -9
- package/src/composables/useFormFieldErrorHandling.ts +141 -0
- package/src/modules.d.ts +6 -0
- package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +7 -0
- package/src/utils/theme/index.ts +19 -0
- package/src/utils/theme/tests/useThemeLocales.spec.ts +245 -0
- package/dist/components/MaintenancePage/index.d.ts +0 -2
- package/src/components/BackBtn/Accessibilite.mdx +0 -14
- package/src/components/BackBtn/Accessibilite.stories.ts +0 -30
- package/src/components/BackToTopBtn/Accessibilite.mdx +0 -14
- package/src/components/BackToTopBtn/Accessibilite.stories.ts +0 -31
- package/src/components/ChipList/Accessibilite.mdx +0 -14
- package/src/components/ChipList/Accessibilite.stories.ts +0 -31
- package/src/components/CollapsibleList/Accessibilite.stories.ts +0 -29
- package/src/components/ContextualMenu/Accessibilite.mdx +0 -13
- package/src/components/ContextualMenu/Accessibilite.stories.ts +0 -29
- package/src/components/CookieBanner/Accessibilite.mdx +0 -13
- package/src/components/CookieBanner/Accessibilite.stories.ts +0 -30
- package/src/components/CopyBtn/Accessibilite.mdx +0 -13
- package/src/components/CopyBtn/Accessibilite.stories.ts +0 -29
- package/src/components/Customs/Selects/SelectBtnField/Accessibilite.mdx +0 -14
- package/src/components/Customs/Selects/SelectBtnField/Accessibilite.stories.ts +0 -29
- package/src/components/Customs/Selects/SyInputSelect/Accessibilite.mdx +0 -13
- package/src/components/Customs/Selects/SyInputSelect/Accessibilite.stories.ts +0 -25
- package/src/components/Customs/SyPagination/tests/SyPagination.a11y.spec.ts +0 -27
- package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +0 -51
- package/src/components/Customs/SyTextField/Accessibilite.mdx +0 -14
- package/src/components/Customs/SyTextField/Accessibilite.stories.ts +0 -34
- package/src/components/DataList/Accessibilite.mdx +0 -13
- package/src/components/DataList/Accessibilite.stories.ts +0 -29
- package/src/components/DataListGroup/Accessibilite.mdx +0 -13
- package/src/components/DataListGroup/Accessibilite.stories.ts +0 -29
- package/src/components/DataListItem/tests/DataListItem.a11y.spec.ts +0 -31
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +0 -27
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.a11y.spec.ts +0 -26
- package/src/components/DatePicker/DateTextInput/tests/DateTextInput.a11y.spec.ts +0 -27
- package/src/components/DialogBox/Accessibilite.mdx +0 -14
- package/src/components/DialogBox/Accessibilite.stories.ts +0 -29
- package/src/components/DownloadBtn/Accessibilite.mdx +0 -14
- package/src/components/DownloadBtn/Accessibilite.stories.ts +0 -29
- package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +0 -26
- package/src/components/ErrorPage/Accessibilite.mdx +0 -13
- package/src/components/ErrorPage/Accessibilite.stories.ts +0 -36
- package/src/components/ExternalLinks/Accessibilite.mdx +0 -18
- package/src/components/ExternalLinks/Accessibilite.stories.ts +0 -62
- package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +0 -39
- package/src/components/FileList/Accessibilite.mdx +0 -13
- package/src/components/FileList/Accessibilite.stories.ts +0 -26
- package/src/components/FilePreview/Accessibilite.mdx +0 -14
- package/src/components/FilePreview/Accessibilite.stories.ts +0 -26
- package/src/components/FileUpload/Accessibilite.mdx +0 -13
- package/src/components/FileUpload/Accessibilite.stories.ts +0 -26
- package/src/components/FilterInline/Accessibilite.mdx +0 -15
- package/src/components/FilterInline/Accessibilite.stories.ts +0 -26
- package/src/components/FilterSideBar/Accessibilite.mdx +0 -13
- package/src/components/FilterSideBar/Accessibilite.stories.ts +0 -30
- package/src/components/FooterBar/Accessibilite.stories.ts +0 -26
- package/src/components/FranceConnectBtn/Accessibilite.mdx +0 -13
- package/src/components/FranceConnectBtn/Accessibilite.stories.ts +0 -30
- package/src/components/HeaderBar/Accessibilite.mdx +0 -13
- package/src/components/HeaderBar/Accessibilite.stories.ts +0 -31
- package/src/components/HeaderBar/HeaderBurgerMenu/Accessibilite.mdx +0 -13
- package/src/components/HeaderBar/HeaderBurgerMenu/Accessibilite.stories.ts +0 -30
- package/src/components/HeaderLoading/Accessibilite.stories.ts +0 -31
- package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.a11y.spec.ts +0 -45
- package/src/components/HeaderToolbar/Accessibilite.mdx +0 -13
- package/src/components/HeaderToolbar/Accessibilite.stories.ts +0 -36
- package/src/components/HeaderToolbar/tests/HeaderToolbar.a11y.spec.ts +0 -25
- package/src/components/LangBtn/Accessibilite.mdx +0 -13
- package/src/components/LangBtn/Accessibilite.stories.ts +0 -32
- package/src/components/Logo/Accessibilite.mdx +0 -13
- package/src/components/Logo/Accessibilite.stories.ts +0 -30
- package/src/components/LogoBrandSection/Accessibilite.mdx +0 -13
- package/src/components/LogoBrandSection/Accessibilite.stories.ts +0 -26
- package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +0 -31
- package/src/components/MaintenancePage/Accessibilite.mdx +0 -13
- package/src/components/MaintenancePage/Accessibilite.stories.ts +0 -36
- package/src/components/MaintenancePage/index.ts +0 -3
- package/src/components/NirField/Accessibilite.mdx +0 -13
- package/src/components/NirField/Accessibilite.stories.ts +0 -31
- package/src/components/NotFoundPage/Accessibilite.mdx +0 -13
- package/src/components/NotFoundPage/Accessibilite.stories.ts +0 -36
- package/src/components/NotificationBar/Accessibilite.mdx +0 -13
- package/src/components/NotificationBar/Accessibilite.stories.ts +0 -30
- package/src/components/PageContainer/Accessibilite.mdx +0 -13
- package/src/components/PageContainer/Accessibilite.stories.ts +0 -30
- package/src/components/PaginatedTable/Accessibilite.mdx +0 -13
- package/src/components/PaginatedTable/Accessibilite.stories.ts +0 -26
- package/src/components/PaginatedTable/tests/PaginatedTable.a11y.spec.ts +0 -43
- package/src/components/PasswordField/Accessibilite.mdx +0 -13
- package/src/components/PasswordField/Accessibilite.stories.ts +0 -121
- package/src/components/PeriodField/Accessibilite.mdx +0 -13
- package/src/components/PeriodField/Accessibilite.stories.ts +0 -27
- package/src/components/PhoneField/Accessibilite.mdx +0 -13
- package/src/components/PhoneField/Accessibilite.stories.ts +0 -32
- package/src/components/PhoneField/tests/PhoneField.a11y.spec.ts +0 -34
- package/src/components/RangeField/Accessibilite.mdx +0 -13
- package/src/components/RangeField/Accessibilite.stories.ts +0 -32
- package/src/components/RatingPicker/Accessibilite.mdx +0 -13
- package/src/components/RatingPicker/Accessibilite.stories.ts +0 -30
- package/src/components/SearchListField/Accessibilite.mdx +0 -13
- package/src/components/SearchListField/Accessibilite.stories.ts +0 -30
- package/src/components/SkipLink/Accessibilite.stories.ts +0 -36
- package/src/components/SocialMediaLinks/Accessibilite.mdx +0 -13
- package/src/components/SocialMediaLinks/Accessibilite.stories.ts +0 -36
- package/src/components/SubHeader/Accessibilite.mdx +0 -13
- package/src/components/SubHeader/Accessibilite.stories.ts +0 -36
- package/src/components/SyAlert/Accessibilite.mdx +0 -13
- package/src/components/SyAlert/Accessibilite.stories.ts +0 -30
- package/src/components/TableToolbar/Accessibilite.mdx +0 -13
- package/src/components/TableToolbar/Accessibilite.stories.ts +0 -26
- package/src/components/UploadWorkflow/Accessibilite.mdx +0 -13
- package/src/components/UploadWorkflow/Accessibilite.stories.ts +0 -26
- package/src/components/UserMenuBtn/Accessibilite.mdx +0 -13
- package/src/components/UserMenuBtn/Accessibilite.stories.ts +0 -25
- /package/src/components/HeaderBar/{Usages.stories.ts → usages/Usages.stories.ts} +0 -0
- /package/src/components/NotFoundPage/assets/{not-found.svg → not-found-cnam.svg} +0 -0
- /package/src/components/SyBtnMenu/accessibilite/{AccessibilityGuide.mdx → Accessibility.mdx} +0 -0
package/src/components/index.ts
CHANGED
|
@@ -50,7 +50,10 @@ export { default as Captcha } from './Captcha/Captcha.vue'
|
|
|
50
50
|
export { default as SelectBtnField } from './Customs/Selects/SelectBtnField/SelectBtnField.vue'
|
|
51
51
|
export { default as SyInputSelect } from './Customs/Selects/SyInputSelect/SyInputSelect.vue'
|
|
52
52
|
export { default as SySelect } from './Customs/Selects/SySelect/SySelect.vue'
|
|
53
|
+
export { default as SyAutocomplete } from './Customs/Selects/SyAutocomplete/SyAutocomplete.vue'
|
|
54
|
+
// export { default as SyBtnSelect } from './Customs/Selects/SyBtnSelect/SyBtnSelect.vue'
|
|
53
55
|
export { default as SyCheckbox } from './Customs/SyCheckbox/SyCheckbox.vue'
|
|
56
|
+
export { default as SyCheckBoxGroup } from './Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue'
|
|
54
57
|
export { default as SyForm } from './Customs/SyForm/SyForm.vue'
|
|
55
58
|
export { default as SyRadioGroup } from './Customs/SyRadioGroup/SyRadioGroup.vue'
|
|
56
59
|
export { default as SyTextField } from './Customs/SyTextField/SyTextField.vue'
|
|
@@ -117,6 +120,8 @@ export { default as SyAlert } from './SyAlert/SyAlert.vue'
|
|
|
117
120
|
export { default as ErrorPage } from './ErrorPage/ErrorPage.vue'
|
|
118
121
|
export { default as MaintenancePage } from './MaintenancePage/MaintenancePage.vue'
|
|
119
122
|
export { default as NotFoundPage } from './NotFoundPage/NotFoundPage.vue'
|
|
123
|
+
export { default as StatusPage } from './StatusPage/StatusPage.vue'
|
|
124
|
+
export { default as DeclarationAccessibilityPage } from './DeclarationAccessibilityPage/DeclarationAccessibilityPage.vue'
|
|
120
125
|
|
|
121
126
|
// ===========================
|
|
122
127
|
// Amelipro
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RouteLocationRaw } from 'vue-router'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Type pour les props de navigation
|
|
5
|
+
* Permet de spécifier soit href (lien externe), soit to (route interne), soit ni l'un ni l'autre
|
|
6
|
+
*/
|
|
7
|
+
export type NavigationProps =
|
|
8
|
+
| { href: string, to?: never }
|
|
9
|
+
| { to: RouteLocationRaw, href?: never }
|
|
10
|
+
| { href?: never, to?: never }
|
|
@@ -284,6 +284,18 @@ describe('useFieldValidation', () => {
|
|
|
284
284
|
}])[0]!
|
|
285
285
|
expect(ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
|
|
286
286
|
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
287
|
+
|
|
288
|
+
const ruleWithEmptyDate = generateRules([{
|
|
289
|
+
type: 'notBeforeDate',
|
|
290
|
+
options: { date: '', message: 'Date cannot be before reference date.' },
|
|
291
|
+
}])[0]!
|
|
292
|
+
expect(ruleWithEmptyDate(new Date())).toEqual({})
|
|
293
|
+
|
|
294
|
+
const ruleWithUndefinedDate = generateRules([{
|
|
295
|
+
type: 'notBeforeDate',
|
|
296
|
+
options: { date: undefined as unknown as string, message: 'Date cannot be before reference date.' },
|
|
297
|
+
}])[0]!
|
|
298
|
+
expect(ruleWithUndefinedDate(new Date())).toEqual({})
|
|
287
299
|
})
|
|
288
300
|
|
|
289
301
|
it('should throw when date reference is not a string in notBeforeDate rule', () => {
|
|
@@ -296,7 +308,7 @@ describe('useFieldValidation', () => {
|
|
|
296
308
|
},
|
|
297
309
|
}])[0]!
|
|
298
310
|
invalidRule(new Date())
|
|
299
|
-
}).toThrow('
|
|
311
|
+
}).toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
300
312
|
})
|
|
301
313
|
|
|
302
314
|
it('should validate notAfterDate rule', () => {
|
|
@@ -324,6 +336,18 @@ describe('useFieldValidation', () => {
|
|
|
324
336
|
}])[0]!
|
|
325
337
|
expect(ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
|
|
326
338
|
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
339
|
+
|
|
340
|
+
const ruleWithEmptyDate = generateRules([{
|
|
341
|
+
type: 'notAfterDate',
|
|
342
|
+
options: { date: '', message: 'Date cannot be after reference date.' },
|
|
343
|
+
}])[0]!
|
|
344
|
+
expect(ruleWithEmptyDate(new Date())).toEqual({})
|
|
345
|
+
|
|
346
|
+
const ruleWithUndefinedDate = generateRules([{
|
|
347
|
+
type: 'notAfterDate',
|
|
348
|
+
options: { date: undefined as unknown as string, message: 'Date cannot be after reference date.' },
|
|
349
|
+
}])[0]!
|
|
350
|
+
expect(ruleWithUndefinedDate(new Date())).toEqual({})
|
|
327
351
|
})
|
|
328
352
|
|
|
329
353
|
it('should throw when date reference is not a string in notAfterDate rule', () => {
|
|
@@ -336,7 +360,7 @@ describe('useFieldValidation', () => {
|
|
|
336
360
|
},
|
|
337
361
|
}])[0]!
|
|
338
362
|
invalidRule(new Date())
|
|
339
|
-
}).toThrow('
|
|
363
|
+
}).toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
340
364
|
})
|
|
341
365
|
|
|
342
366
|
it('should validate dateExact rule', () => {
|
|
@@ -364,6 +388,18 @@ describe('useFieldValidation', () => {
|
|
|
364
388
|
}])[0]!
|
|
365
389
|
expect(ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
|
|
366
390
|
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
391
|
+
|
|
392
|
+
const ruleWithEmptyDate = generateRules([{
|
|
393
|
+
type: 'dateExact',
|
|
394
|
+
options: { date: '', message: 'Date must be exactly the reference date.' },
|
|
395
|
+
}])[0]!
|
|
396
|
+
expect(ruleWithEmptyDate(new Date())).toEqual({})
|
|
397
|
+
|
|
398
|
+
const ruleWithUndefinedDate = generateRules([{
|
|
399
|
+
type: 'dateExact',
|
|
400
|
+
options: { date: undefined as unknown as string, message: 'Date must be exactly the reference date.' },
|
|
401
|
+
}])[0]!
|
|
402
|
+
expect(ruleWithUndefinedDate(new Date())).toEqual({})
|
|
367
403
|
})
|
|
368
404
|
|
|
369
405
|
it('should throw when date reference is not a string in dateExact rule', () => {
|
|
@@ -376,7 +412,7 @@ describe('useFieldValidation', () => {
|
|
|
376
412
|
},
|
|
377
413
|
}])[0]!
|
|
378
414
|
invalidRule(new Date())
|
|
379
|
-
}).toThrow('
|
|
415
|
+
}).toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
380
416
|
})
|
|
381
417
|
|
|
382
418
|
it('should validate custom rule', () => {
|
|
@@ -233,14 +233,19 @@ export function useFieldValidation() {
|
|
|
233
233
|
}
|
|
234
234
|
|
|
235
235
|
case 'notBeforeDate': {
|
|
236
|
-
|
|
236
|
+
const hasDateOption = Object.prototype.hasOwnProperty.call(options, 'date')
|
|
237
|
+
if (!hasDateOption) {
|
|
237
238
|
return { error: 'Configuration de la règle invalide' }
|
|
238
239
|
}
|
|
239
240
|
// Si la valeur est null ou vide, ne pas valider (champ vide autorisé)
|
|
240
241
|
if (value === null || value === undefined || value === '') {
|
|
241
242
|
return {}
|
|
242
243
|
}
|
|
243
|
-
if (
|
|
244
|
+
if (
|
|
245
|
+
options.date === undefined
|
|
246
|
+
|| options.date === null
|
|
247
|
+
|| (typeof options.date === 'string' && options.date.trim() === '')
|
|
248
|
+
) {
|
|
244
249
|
return {}
|
|
245
250
|
}
|
|
246
251
|
const dateValue = parseDate(value)
|
|
@@ -250,7 +255,7 @@ export function useFieldValidation() {
|
|
|
250
255
|
|
|
251
256
|
// Check if options.date is a string and in DD/MM/YYYY format
|
|
252
257
|
if (typeof options.date !== 'string') {
|
|
253
|
-
throw new Error('
|
|
258
|
+
throw new Error('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
254
259
|
}
|
|
255
260
|
|
|
256
261
|
const referenceDate = parseDate(options.date)
|
|
@@ -269,14 +274,19 @@ export function useFieldValidation() {
|
|
|
269
274
|
}
|
|
270
275
|
|
|
271
276
|
case 'notAfterDate': {
|
|
272
|
-
|
|
277
|
+
const hasDateOption = Object.prototype.hasOwnProperty.call(options, 'date')
|
|
278
|
+
if (!hasDateOption) {
|
|
273
279
|
return { error: 'Configuration de la règle invalide' }
|
|
274
280
|
}
|
|
275
281
|
// Si la valeur est null ou vide, ne pas valider (champ vide autorisé)
|
|
276
282
|
if (value === null || value === undefined || value === '') {
|
|
277
283
|
return {}
|
|
278
284
|
}
|
|
279
|
-
if (
|
|
285
|
+
if (
|
|
286
|
+
options.date === undefined
|
|
287
|
+
|| options.date === null
|
|
288
|
+
|| (typeof options.date === 'string' && options.date.trim() === '')
|
|
289
|
+
) {
|
|
280
290
|
return {}
|
|
281
291
|
}
|
|
282
292
|
const dateValue = parseDate(value)
|
|
@@ -286,7 +296,7 @@ export function useFieldValidation() {
|
|
|
286
296
|
|
|
287
297
|
// Check if options.date is a string and in DD/MM/YYYY format
|
|
288
298
|
if (typeof options.date !== 'string') {
|
|
289
|
-
throw new Error('
|
|
299
|
+
throw new Error('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
290
300
|
}
|
|
291
301
|
|
|
292
302
|
const referenceDate = parseDate(options.date)
|
|
@@ -305,14 +315,19 @@ export function useFieldValidation() {
|
|
|
305
315
|
}
|
|
306
316
|
|
|
307
317
|
case 'dateExact': {
|
|
308
|
-
|
|
318
|
+
const hasDateOption = Object.prototype.hasOwnProperty.call(options, 'date')
|
|
319
|
+
if (!hasDateOption) {
|
|
309
320
|
return { error: 'Configuration de la règle invalide' }
|
|
310
321
|
}
|
|
311
322
|
// Si la valeur est null ou vide, ne pas valider (champ vide autorisé)
|
|
312
323
|
if (value === null || value === undefined || value === '') {
|
|
313
324
|
return {}
|
|
314
325
|
}
|
|
315
|
-
if (
|
|
326
|
+
if (
|
|
327
|
+
options.date === undefined
|
|
328
|
+
|| options.date === null
|
|
329
|
+
|| (typeof options.date === 'string' && options.date.trim() === '')
|
|
330
|
+
) {
|
|
316
331
|
return {}
|
|
317
332
|
}
|
|
318
333
|
const dateValue = parseDate(value)
|
|
@@ -321,7 +336,7 @@ export function useFieldValidation() {
|
|
|
321
336
|
}
|
|
322
337
|
|
|
323
338
|
if (typeof options.date !== 'string') {
|
|
324
|
-
throw new Error('
|
|
339
|
+
throw new Error('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
325
340
|
}
|
|
326
341
|
|
|
327
342
|
const referenceDate = parseDate(options.date)
|
|
@@ -366,6 +381,13 @@ export function useFieldValidation() {
|
|
|
366
381
|
if (result === true) {
|
|
367
382
|
return { success: options.successMessage || baseMessages.success }
|
|
368
383
|
}
|
|
384
|
+
// If result is undefined or falsy but not true, treat as invalid
|
|
385
|
+
if (result === false) {
|
|
386
|
+
return options.isWarning
|
|
387
|
+
? { warning: options.warningMessage || baseMessages.warning }
|
|
388
|
+
: { error: options.message || baseMessages.error }
|
|
389
|
+
}
|
|
390
|
+
// If result is a string, use it as error/warning message
|
|
369
391
|
return options.isWarning
|
|
370
392
|
? { warning: typeof result === 'string' ? result : options.warningMessage || baseMessages.warning }
|
|
371
393
|
: { error: typeof result === 'string' ? result : options.message || baseMessages.error }
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { computed, watch, type Ref } from 'vue'
|
|
2
|
+
import { useValidation, type ValidationRule } from '@/composables/validation/useValidation'
|
|
3
|
+
import { useValidatable } from '@/composables/validation/useValidatable'
|
|
4
|
+
|
|
5
|
+
export interface UseFormFieldErrorHandlingProps {
|
|
6
|
+
errorMessages?: string[] | null
|
|
7
|
+
warningMessages?: string[] | null
|
|
8
|
+
successMessages?: string[] | null
|
|
9
|
+
hasError?: boolean
|
|
10
|
+
hasWarning?: boolean
|
|
11
|
+
hasSuccess?: boolean
|
|
12
|
+
customRules?: ValidationRule[]
|
|
13
|
+
customWarningRules?: ValidationRule[]
|
|
14
|
+
customSuccessRules?: ValidationRule[]
|
|
15
|
+
showSuccessMessages?: boolean
|
|
16
|
+
disableErrorHandling?: boolean
|
|
17
|
+
required?: boolean
|
|
18
|
+
label?: string
|
|
19
|
+
isValidateOnBlur?: boolean
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface UseFormFieldErrorHandlingReturn {
|
|
23
|
+
validation: ReturnType<typeof useValidation>
|
|
24
|
+
hasError: Ref<boolean>
|
|
25
|
+
hasWarning: Ref<boolean>
|
|
26
|
+
hasSuccess: Ref<boolean>
|
|
27
|
+
errors: Ref<string[]>
|
|
28
|
+
warnings: Ref<string[]>
|
|
29
|
+
successes: Ref<string[]>
|
|
30
|
+
validateField: (value: unknown) => boolean
|
|
31
|
+
validateOnSubmit: () => boolean
|
|
32
|
+
checkErrorOnBlur: () => void
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const useFormFieldErrorHandling = (
|
|
36
|
+
props: UseFormFieldErrorHandlingProps,
|
|
37
|
+
modelValue: Ref<unknown>,
|
|
38
|
+
emitUpdate?: () => void,
|
|
39
|
+
): UseFormFieldErrorHandlingReturn => {
|
|
40
|
+
const validation = useValidation({
|
|
41
|
+
customRules: props.customRules || [],
|
|
42
|
+
warningRules: props.customWarningRules || [],
|
|
43
|
+
successRules: props.customSuccessRules || [],
|
|
44
|
+
showSuccessMessages: props.showSuccessMessages ?? true,
|
|
45
|
+
fieldIdentifier: props.label,
|
|
46
|
+
disableErrorHandling: props.disableErrorHandling ?? false,
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
// Synchronisation des messages externes
|
|
50
|
+
watch(() => props.errorMessages, (newVal) => {
|
|
51
|
+
validation.errors.value = newVal || []
|
|
52
|
+
}, { immediate: true })
|
|
53
|
+
|
|
54
|
+
watch(() => props.warningMessages, (newVal) => {
|
|
55
|
+
validation.warnings.value = newVal || []
|
|
56
|
+
}, { immediate: true })
|
|
57
|
+
|
|
58
|
+
watch(() => props.successMessages, (newVal) => {
|
|
59
|
+
validation.successes.value = newVal || []
|
|
60
|
+
}, { immediate: true })
|
|
61
|
+
|
|
62
|
+
// Construction des règles de validation
|
|
63
|
+
const defaultRules = computed<ValidationRule[]>(() => props.required
|
|
64
|
+
? [{
|
|
65
|
+
type: 'required',
|
|
66
|
+
options: {
|
|
67
|
+
message: `Le champ ${props.label || 'ce champ'} est requis.`,
|
|
68
|
+
fieldIdentifier: props.label,
|
|
69
|
+
},
|
|
70
|
+
}]
|
|
71
|
+
: [],
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
const validateField = (value: unknown) => {
|
|
75
|
+
if (props.disableErrorHandling) {
|
|
76
|
+
return true
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Ne pas valider si la valeur est null/undefined et non requise
|
|
80
|
+
if (value == null && !props.required) {
|
|
81
|
+
validation.clearValidation()
|
|
82
|
+
return true
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const result = validation.validateField(
|
|
86
|
+
value,
|
|
87
|
+
[...defaultRules.value, ...props.customRules!],
|
|
88
|
+
props.customWarningRules!,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
return !result.hasError
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const validateOnSubmit = () => {
|
|
95
|
+
return validateField(modelValue.value)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const checkErrorOnBlur = () => {
|
|
99
|
+
validateField(modelValue.value)
|
|
100
|
+
if (emitUpdate) {
|
|
101
|
+
emitUpdate()
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
watch(modelValue, (newValue) => {
|
|
106
|
+
if (!props.isValidateOnBlur) {
|
|
107
|
+
validateField(newValue)
|
|
108
|
+
}
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
watch([() => props.required, () => props.label], () => {
|
|
112
|
+
// Re-valider quand les règles changent
|
|
113
|
+
if (modelValue.value != null) {
|
|
114
|
+
validateField(modelValue.value)
|
|
115
|
+
}
|
|
116
|
+
}, { immediate: true })
|
|
117
|
+
|
|
118
|
+
const hasError = computed(() => validation.hasError.value || (props.hasError ?? false))
|
|
119
|
+
const hasWarning = computed(() => validation.hasWarning.value || (props.hasWarning ?? false))
|
|
120
|
+
const hasSuccess = computed(() => ((validation.hasSuccess.value && !hasError.value && !hasWarning.value) || (props.hasSuccess ?? false)) && (props.showSuccessMessages ?? true))
|
|
121
|
+
|
|
122
|
+
const errors = computed(() => [...validation.errors.value, ...(props.errorMessages || [])])
|
|
123
|
+
const warnings = computed(() => validation.warnings.value)
|
|
124
|
+
const successes = computed(() => validation.successes.value)
|
|
125
|
+
|
|
126
|
+
// Intégration avec le système de validation du formulaire
|
|
127
|
+
useValidatable(validateOnSubmit, validation.clearValidation)
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
validation,
|
|
131
|
+
hasError,
|
|
132
|
+
hasWarning,
|
|
133
|
+
hasSuccess,
|
|
134
|
+
errors,
|
|
135
|
+
warnings,
|
|
136
|
+
successes,
|
|
137
|
+
validateField,
|
|
138
|
+
validateOnSubmit,
|
|
139
|
+
checkErrorOnBlur,
|
|
140
|
+
}
|
|
141
|
+
}
|
package/src/modules.d.ts
CHANGED
|
@@ -351,6 +351,9 @@ import '../../styles/shared.css';
|
|
|
351
351
|
|
|
352
352
|
<h4>Outil éventuel</h4>
|
|
353
353
|
<p>Utilisation du lecteur d'écran pour vérifier la navigation et l'accessibilité des formulaires, tel que l'indication du caractère obligatoire du champ, la liaison du champ aux aides à la saisie ainsi qu'aux messages d'erreurs, le comportement à la soumission du formulaire, etc.</p>
|
|
354
|
+
|
|
355
|
+
<h4>Ressources</h4>
|
|
356
|
+
<p><a href="https://bati-itao.github.io/learning/esdc-self-paced-web-accessibility-course/module6/forms-concepts-fr.html">Concepts des formulaires</a></p>
|
|
354
357
|
</div>
|
|
355
358
|
|
|
356
359
|
<div className="verification-card">
|
|
@@ -375,6 +378,8 @@ import '../../styles/shared.css';
|
|
|
375
378
|
<li>Les en-têtes de colonnes des tableaux utilisent des balises `th` avec l'attribut `scope="col"`.</li>
|
|
376
379
|
</ul>
|
|
377
380
|
</div>
|
|
381
|
+
<h4>Ressources</h4>
|
|
382
|
+
<p><a href="https://bati-itao.github.io/learning/esdc-self-paced-web-accessibility-course/module4/tables-concepts-fr.html">Concepts des tableaux</a></p>
|
|
378
383
|
</div>
|
|
379
384
|
|
|
380
385
|
<div className="verification-card">
|
|
@@ -432,6 +437,8 @@ import '../../styles/shared.css';
|
|
|
432
437
|
</ol>
|
|
433
438
|
<h4>Outil éventuel</h4>
|
|
434
439
|
<p>Aucun</p>
|
|
440
|
+
<h4>Ressources</h4>
|
|
441
|
+
<p><a href="https://bati-itao.github.io/learning/esdc-self-paced-web-accessibility-course/module9/introduction-fr.html">Concepts des contenus multimédia</a></p>
|
|
435
442
|
</div>
|
|
436
443
|
|
|
437
444
|
<div className="info-section">
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { computed } from 'vue'
|
|
2
|
+
import { useTheme } from 'vuetify'
|
|
3
|
+
import type { ComputedRef } from 'vue'
|
|
4
|
+
|
|
5
|
+
export function useThemeLocales<
|
|
6
|
+
T extends Record<string, unknown> & { default: unknown },
|
|
7
|
+
>(locales: T): {
|
|
8
|
+
themeLocales: ComputedRef<T[keyof T]>
|
|
9
|
+
} {
|
|
10
|
+
const vuetifyTheme = useTheme()
|
|
11
|
+
|
|
12
|
+
const themeLocales = computed((): T[keyof T] => {
|
|
13
|
+
return (locales[vuetifyTheme.name.value as keyof T] ?? locales.default) as T[keyof T]
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
return {
|
|
17
|
+
themeLocales,
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest'
|
|
2
|
+
import { useThemeLocales } from '../index'
|
|
3
|
+
import { useTheme } from 'vuetify'
|
|
4
|
+
import { nextTick, ref } from 'vue'
|
|
5
|
+
import type { Mock } from 'vitest'
|
|
6
|
+
|
|
7
|
+
// Mock Vuetify
|
|
8
|
+
vi.mock('vuetify', () => ({
|
|
9
|
+
useTheme: vi.fn(),
|
|
10
|
+
}))
|
|
11
|
+
|
|
12
|
+
describe('useThemeLocales', () => {
|
|
13
|
+
let mockTheme: { name: ReturnType<typeof ref<string>> }
|
|
14
|
+
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
// Reset mock before each test
|
|
17
|
+
vi.clearAllMocks()
|
|
18
|
+
|
|
19
|
+
// Setup default mock theme with reactive ref
|
|
20
|
+
mockTheme = {
|
|
21
|
+
name: ref('default'),
|
|
22
|
+
}
|
|
23
|
+
;(useTheme as Mock).mockReturnValue(mockTheme)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('should return themeLocales computed property', () => {
|
|
27
|
+
const locales = {
|
|
28
|
+
default: { title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' },
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const { themeLocales } = useThemeLocales(locales)
|
|
32
|
+
|
|
33
|
+
expect(themeLocales).toBeDefined()
|
|
34
|
+
expect(themeLocales.value).toEqual({ title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' })
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('should return default locale when theme name is not found', () => {
|
|
38
|
+
const locales = {
|
|
39
|
+
default: { title: 'Default Title', message: 'Default Message', pageTitle: 'Default', code: '500' },
|
|
40
|
+
cnam: { title: 'CNAM Title', message: 'CNAM Message', pageTitle: 'CNAM', code: '500' },
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
mockTheme.name.value = 'unknown'
|
|
44
|
+
|
|
45
|
+
const { themeLocales } = useThemeLocales(locales)
|
|
46
|
+
|
|
47
|
+
expect(themeLocales.value).toEqual({
|
|
48
|
+
title: 'Default Title',
|
|
49
|
+
message: 'Default Message',
|
|
50
|
+
pageTitle: 'Default',
|
|
51
|
+
code: '500',
|
|
52
|
+
})
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('should return locale for cnam theme', () => {
|
|
56
|
+
const locales = {
|
|
57
|
+
default: { title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' },
|
|
58
|
+
cnam: { title: 'CNAM Title', message: 'CNAM Message', pageTitle: 'CNAM', code: '500' },
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
mockTheme.name.value = 'cnam'
|
|
62
|
+
|
|
63
|
+
const { themeLocales } = useThemeLocales(locales)
|
|
64
|
+
|
|
65
|
+
expect(themeLocales.value).toEqual({
|
|
66
|
+
title: 'CNAM Title',
|
|
67
|
+
message: 'CNAM Message',
|
|
68
|
+
pageTitle: 'CNAM',
|
|
69
|
+
code: '500',
|
|
70
|
+
})
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('should return locale for ap theme', () => {
|
|
74
|
+
const locales = {
|
|
75
|
+
default: { title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' },
|
|
76
|
+
ap: { title: 'AP Title', message: 'AP Message', pageTitle: 'AP', code: '500' },
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
mockTheme.name.value = 'ap'
|
|
80
|
+
|
|
81
|
+
const { themeLocales } = useThemeLocales(locales)
|
|
82
|
+
|
|
83
|
+
expect(themeLocales.value).toEqual({
|
|
84
|
+
title: 'AP Title',
|
|
85
|
+
message: 'AP Message',
|
|
86
|
+
pageTitle: 'AP',
|
|
87
|
+
code: '500',
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it('should return locale for ap2026 theme', () => {
|
|
92
|
+
const locales = {
|
|
93
|
+
default: { title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' },
|
|
94
|
+
ap2026: { title: 'AP 2026 Title', message: 'AP 2026 Message', pageTitle: 'AP2026', code: '500' },
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
mockTheme.name.value = 'ap2026'
|
|
98
|
+
|
|
99
|
+
const { themeLocales } = useThemeLocales(locales)
|
|
100
|
+
|
|
101
|
+
expect(themeLocales.value).toEqual({
|
|
102
|
+
title: 'AP 2026 Title',
|
|
103
|
+
message: 'AP 2026 Message',
|
|
104
|
+
pageTitle: 'AP2026',
|
|
105
|
+
code: '500',
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
it('should update themeLocales when theme changes', async () => {
|
|
110
|
+
const locales = {
|
|
111
|
+
default: { title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' },
|
|
112
|
+
cnam: { title: 'CNAM Title', pageTitle: 'CNAM', message: 'msg', code: '500' },
|
|
113
|
+
ap: { title: 'AP Title', pageTitle: 'AP', message: 'msg', code: '500' },
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Initial theme
|
|
117
|
+
mockTheme.name.value = 'cnam'
|
|
118
|
+
const { themeLocales } = useThemeLocales(locales)
|
|
119
|
+
expect(themeLocales.value.title).toBe('CNAM Title')
|
|
120
|
+
|
|
121
|
+
// Change theme
|
|
122
|
+
mockTheme.name.value = 'ap'
|
|
123
|
+
await nextTick()
|
|
124
|
+
expect(themeLocales.value.title).toBe('AP Title')
|
|
125
|
+
|
|
126
|
+
// Change to default
|
|
127
|
+
mockTheme.name.value = 'default'
|
|
128
|
+
await nextTick()
|
|
129
|
+
expect(themeLocales.value.title).toBe('Default Title')
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
it('should handle complex locale objects', () => {
|
|
133
|
+
const locales = {
|
|
134
|
+
default: {
|
|
135
|
+
pageTitle: 'Error',
|
|
136
|
+
message: 'An error occurred',
|
|
137
|
+
code: '500',
|
|
138
|
+
src: undefined,
|
|
139
|
+
},
|
|
140
|
+
cnam: {
|
|
141
|
+
pageTitle: 'Error CNAM',
|
|
142
|
+
message: 'An error occurred at CNAM',
|
|
143
|
+
code: '500',
|
|
144
|
+
src: undefined,
|
|
145
|
+
},
|
|
146
|
+
ap: {
|
|
147
|
+
pageTitle: 'Error AP',
|
|
148
|
+
message: 'An error occurred at AP',
|
|
149
|
+
code: '500',
|
|
150
|
+
src: 'image-ap.svg',
|
|
151
|
+
},
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
mockTheme.name.value = 'ap'
|
|
155
|
+
|
|
156
|
+
const { themeLocales } = useThemeLocales(locales)
|
|
157
|
+
|
|
158
|
+
expect(themeLocales.value).toEqual({
|
|
159
|
+
pageTitle: 'Error AP',
|
|
160
|
+
message: 'An error occurred at AP',
|
|
161
|
+
code: '500',
|
|
162
|
+
src: 'image-ap.svg',
|
|
163
|
+
})
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
it('should maintain reactivity across multiple instances', async () => {
|
|
167
|
+
const locales = {
|
|
168
|
+
default: { title: 'Default', pageTitle: 'Default', message: 'msg', code: '500' },
|
|
169
|
+
cnam: { title: 'CNAM', pageTitle: 'CNAM', message: 'msg', code: '500' },
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const { themeLocales: locales1 } = useThemeLocales(locales)
|
|
173
|
+
const { themeLocales: locales2 } = useThemeLocales(locales)
|
|
174
|
+
|
|
175
|
+
mockTheme.name.value = 'cnam'
|
|
176
|
+
await nextTick()
|
|
177
|
+
|
|
178
|
+
expect(locales1.value.title).toBe('CNAM')
|
|
179
|
+
expect(locales2.value.title).toBe('CNAM')
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
it('should handle locale with null or undefined values', () => {
|
|
183
|
+
const locales = {
|
|
184
|
+
default: { title: 'Default', icon: null, description: undefined, pageTitle: 'Default', message: 'msg', code: '500' },
|
|
185
|
+
cnam: { title: 'CNAM', icon: null, description: undefined, pageTitle: 'CNAM', message: 'msg', code: '500' },
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
mockTheme.name.value = 'cnam'
|
|
189
|
+
|
|
190
|
+
const { themeLocales } = useThemeLocales(locales)
|
|
191
|
+
|
|
192
|
+
expect(themeLocales.value.title).toBe('CNAM')
|
|
193
|
+
expect(themeLocales.value.icon).toBeNull()
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
it('should work with generic type inference', () => {
|
|
197
|
+
const locales = {
|
|
198
|
+
default: { title: 'Default', message: 'Default message', pageTitle: 'Default', code: '500' },
|
|
199
|
+
cnam: {
|
|
200
|
+
title: 'CNAM',
|
|
201
|
+
message: 'CNAM message',
|
|
202
|
+
code: '500',
|
|
203
|
+
pageTitle: 'CNAM',
|
|
204
|
+
},
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
mockTheme.name.value = 'cnam'
|
|
208
|
+
|
|
209
|
+
const { themeLocales } = useThemeLocales(locales)
|
|
210
|
+
|
|
211
|
+
expect(themeLocales.value.title).toBe('CNAM')
|
|
212
|
+
expect(themeLocales.value.message).toBe('CNAM message')
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
it('should prefer theme locale over default when available', () => {
|
|
216
|
+
const locales = {
|
|
217
|
+
default: { title: 'Default Title', message: 'Default Message', pageTitle: 'Default', code: '500' },
|
|
218
|
+
custom: { title: 'Custom Title', message: 'Custom Message', pageTitle: 'Custom', code: '500' },
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
mockTheme.name.value = 'custom'
|
|
222
|
+
|
|
223
|
+
const { themeLocales } = useThemeLocales(locales)
|
|
224
|
+
|
|
225
|
+
expect(themeLocales.value.title).toBe('Custom Title')
|
|
226
|
+
expect(themeLocales.value.message).toBe('Custom Message')
|
|
227
|
+
})
|
|
228
|
+
|
|
229
|
+
it('should fallback to default when accessing non-existent theme', () => {
|
|
230
|
+
const locales = {
|
|
231
|
+
default: { title: 'Default', message: 'Default message', pageTitle: 'Default', code: '500' },
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
mockTheme.name.value = 'nonexistent'
|
|
235
|
+
|
|
236
|
+
const { themeLocales } = useThemeLocales(locales)
|
|
237
|
+
|
|
238
|
+
expect(themeLocales.value).toEqual({
|
|
239
|
+
title: 'Default',
|
|
240
|
+
message: 'Default message',
|
|
241
|
+
pageTitle: 'Default',
|
|
242
|
+
code: '500',
|
|
243
|
+
})
|
|
244
|
+
})
|
|
245
|
+
})
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Meta, Story } from '@storybook/addon-docs';
|
|
2
|
-
import * as AccessStories from './Accessibilite.stories.ts';
|
|
3
|
-
import '../../stories/styles/shared.css';
|
|
4
|
-
|
|
5
|
-
<Meta of={AccessStories} />
|
|
6
|
-
|
|
7
|
-
<div className="header">
|
|
8
|
-
<h1>Accessibilité</h1>
|
|
9
|
-
<p>Informations sur l'accessibilité du composant</p>
|
|
10
|
-
</div>
|
|
11
|
-
|
|
12
|
-
<Story of={AccessStories.Legende} />
|
|
13
|
-
<br />
|
|
14
|
-
|