@cnamts/synapse 1.0.0 → 1.0.1
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-BmRuzQ9Z.js +98 -0
- package/dist/NumberFilter-CnIPDHqx.js +121 -0
- package/dist/PeriodFilter-CZwZ8CnQ.js +112 -0
- package/dist/SelectFilter-Cj-GW2Cc.js +97 -0
- package/dist/TextFilter-DTxZHJwX.js +114 -0
- package/dist/{components/BackBtn → common}/constants/ExpertiseLevelEnum.d.ts +3 -0
- package/dist/components/BackBtn/AccessibiliteItems.d.ts +1 -1
- package/dist/components/BackToTopBtn/AccessibiliteItems.d.ts +1 -1
- package/dist/components/ChipList/AccessibiliteItems.d.ts +1 -1
- package/dist/components/CollapsibleList/AccessibiliteItems.d.ts +1 -1
- package/dist/components/ContextualMenu/AccessibiliteItems.d.ts +1 -1
- package/dist/components/CookieBanner/AccessibiliteItems.d.ts +1 -1
- package/dist/components/CopyBtn/AccessibiliteItems.d.ts +1 -1
- package/dist/components/Customs/SyBtnSelect/AccessibiliteItems.d.ts +1 -1
- package/dist/components/Customs/SyInputSelect/AccessibiliteItems.d.ts +1 -1
- package/dist/components/Customs/SySelect/AccessibiliteItems.d.ts +1 -1
- package/dist/components/Customs/SyTextField/AccessibiliteItems.d.ts +1 -1
- package/dist/components/DataList/AccessibiliteItems.d.ts +1 -1
- package/dist/components/DataListGroup/AccessibiliteItems.d.ts +1 -1
- package/dist/components/DatePicker/AccessibiliteItems.d.ts +1 -1
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +4162 -0
- package/dist/components/DatePicker/{DatePicker.d.ts → DatePicker/DatePicker.d.ts} +142 -102
- package/dist/components/DatePicker/{DateTextInput.d.ts → DateTextInput/DateTextInput.d.ts} +32 -26
- package/dist/components/DatePicker/composables/index.d.ts +15 -0
- package/dist/components/DatePicker/composables/useDateFormatValidation.d.ts +25 -0
- package/dist/components/DatePicker/composables/useDateInputEditing.d.ts +33 -0
- package/dist/components/DatePicker/composables/useDatePickerViewMode.d.ts +16 -0
- package/dist/components/DatePicker/composables/useDatePickerVisibility.d.ts +27 -0
- package/dist/components/DatePicker/composables/useDateRangeInput.d.ts +29 -0
- package/dist/components/DatePicker/composables/useDateRangeValidation.d.ts +11 -0
- package/dist/components/DatePicker/composables/useDateSelection.d.ts +10 -0
- package/dist/components/DatePicker/composables/useDateValidation.d.ts +35 -0
- package/dist/components/DatePicker/composables/useDisplayedDateString.d.ts +16 -0
- package/dist/components/DatePicker/composables/useIconState.d.ts +17 -0
- package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +30 -0
- package/dist/components/DatePicker/composables/useInputHandler.d.ts +32 -0
- package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +33 -0
- package/dist/components/DatePicker/composables/useMonthButtonCustomization.d.ts +9 -0
- package/dist/components/DatePicker/composables/useTodayButton.d.ts +16 -0
- package/dist/components/DatePicker/composables/useWeekendDays.d.ts +11 -0
- package/dist/components/DatePicker/constants/messages.d.ts +29 -0
- package/dist/components/DatePicker/types.d.ts +13 -0
- package/dist/components/DialogBox/AccessibiliteItems.d.ts +1 -1
- package/dist/components/DownloadBtn/AccessibiliteItems.d.ts +1 -1
- package/dist/components/ErrorPage/AccessibiliteItems.d.ts +1 -1
- package/dist/components/ExternalLinks/AccessibiliteItems.d.ts +1 -1
- package/dist/components/FileList/AccessibiliteItems.d.ts +1 -1
- package/dist/components/FilePreview/AccessibiliteItems.d.ts +1 -1
- package/dist/components/FileUpload/AccessibiliteItems.d.ts +1 -1
- package/dist/components/FilterInline/AccessibiliteItems.d.ts +1 -1
- package/dist/components/FilterSideBar/AccessibiliteItems.d.ts +1 -1
- package/dist/components/FilterSideBar/FilterSideBar.d.ts +395 -1
- package/dist/components/FooterBar/AccessibiliteItems.d.ts +1 -1
- package/dist/components/FranceConnectBtn/AccessibiliteItems.d.ts +1 -1
- package/dist/components/HeaderBar/AccessibiliteItems.d.ts +1 -1
- package/dist/components/HeaderBar/HeaderBurgerMenu/AccessibiliteItems.d.ts +1 -1
- package/dist/components/HeaderLoading/AccessibiliteItems.d.ts +1 -1
- package/dist/components/HeaderToolbar/AccessibiliteItems.d.ts +1 -1
- package/dist/components/LangBtn/AccessibiliteItems.d.ts +1 -1
- package/dist/components/Logo/AccessibiliteItems.d.ts +1 -1
- package/dist/components/LogoBrandSection/AccessibiliteItems.d.ts +1 -1
- package/dist/components/MaintenancePage/AccessibiliteItems.d.ts +1 -1
- package/dist/components/NirField/AccessibiliteItems.d.ts +1 -1
- package/dist/components/NotFoundPage/AccessibiliteItems.d.ts +1 -1
- package/dist/components/NotificationBar/AccessibiliteItems.d.ts +1 -1
- package/dist/components/PageContainer/AccessibiliteItems.d.ts +1 -1
- package/dist/components/PaginatedTable/AccessibiliteItems.d.ts +1 -1
- package/dist/components/PasswordField/AccessibiliteItems.d.ts +1 -1
- package/dist/components/PeriodField/AccessibiliteItems.d.ts +1 -1
- package/dist/components/PeriodField/PeriodField.d.ts +171 -37
- package/dist/components/PhoneField/AccessibiliteItems.d.ts +1 -1
- package/dist/components/RangeField/AccessibiliteItems.d.ts +1 -1
- package/dist/components/RatingPicker/AccessibiliteItems.d.ts +1 -1
- package/dist/components/SearchListField/AccessibiliteItems.d.ts +1 -1
- package/dist/components/SelectBtnField/AccessibiliteItems.d.ts +1 -1
- package/dist/components/SkipLink/AccessibiliteItems.d.ts +1 -1
- package/dist/components/SocialMediaLinks/AccessibiliteItems.d.ts +1 -1
- package/dist/components/SubHeader/AccessibiliteItems.d.ts +1 -1
- package/dist/components/SyAlert/AccessibiliteItems.d.ts +1 -1
- package/dist/components/TableToolbar/AccessibiliteItems.d.ts +1 -1
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +647 -0
- package/dist/components/Tables/SyTable/SyTable.d.ts +666 -0
- package/dist/components/Tables/common/SyTableFilter.d.ts +126 -0
- package/dist/components/Tables/common/TableHeader.d.ts +33 -0
- package/dist/components/Tables/common/constants/StateEnum.d.ts +6 -0
- package/dist/components/Tables/common/filters/DateFilter.d.ts +121 -0
- package/dist/components/Tables/common/filters/NumberFilter.d.ts +132 -0
- package/dist/components/Tables/common/filters/PeriodFilter.d.ts +135 -0
- package/dist/components/Tables/common/filters/SelectFilter.d.ts +120 -0
- package/dist/components/Tables/common/filters/TextFilter.d.ts +132 -0
- package/dist/components/Tables/common/formatters.d.ts +17 -0
- package/dist/components/Tables/common/locales.d.ts +7 -0
- package/dist/components/Tables/common/tableAccessibilityUtils.d.ts +8 -0
- package/dist/components/Tables/common/tableFilterUtils.d.ts +2 -0
- package/dist/components/Tables/common/tableStorageUtils.d.ts +29 -0
- package/dist/components/Tables/common/tableUtils.d.ts +42 -0
- package/dist/components/Tables/common/types.d.ts +80 -0
- package/dist/components/Tables/common/useTableFilter.d.ts +9 -0
- package/dist/components/Tables/index.d.ts +2 -0
- package/dist/components/UploadWorkflow/AccessibiliteItems.d.ts +1 -1
- package/dist/components/UserMenuBtn/AccessibiliteItems.d.ts +1 -1
- package/dist/components/index.d.ts +3 -1
- package/dist/design-system-v3.js +100 -11944
- package/dist/design-system-v3.umd.cjs +22 -4
- package/dist/designTokens/index.d.ts +3 -1
- package/dist/designTokens/tokens/cnam/cnamFonts.d.ts +140 -0
- package/dist/designTokens/tokens/pa/paFonts.d.ts +140 -0
- package/dist/designTokens/utils/createFontVariables.d.ts +39 -0
- package/dist/designTokens/utils/index.d.ts +2 -1
- package/dist/main-WDqeoGM-.js +14788 -0
- package/dist/style.css +1 -1
- package/dist/utils/rules/isRequired/index.d.ts +1 -1
- package/dist/vite-env.d.ts +12 -0
- package/package.json +3 -3
- package/src/assets/_spacers.scss +37 -1
- package/src/assets/_typography.scss +158 -0
- package/src/assets/settings.scss +7 -0
- package/src/common/constants/ExpertiseLevelEnum.ts +7 -0
- package/src/components/BackBtn/AccessibiliteItems.ts +1 -1
- package/src/components/BackToTopBtn/AccessibiliteItems.ts +1 -1
- package/src/components/ChipList/AccessibiliteItems.ts +1 -1
- package/src/components/CollapsibleList/AccessibiliteItems.ts +1 -1
- package/src/components/ContextualMenu/AccessibiliteItems.ts +1 -1
- package/src/components/CookieBanner/AccessibiliteItems.ts +1 -1
- package/src/components/CopyBtn/AccessibiliteItems.ts +1 -1
- package/src/components/Customs/SyBtnSelect/AccessibiliteItems.ts +1 -1
- package/src/components/Customs/SyInputSelect/AccessibiliteItems.ts +1 -1
- package/src/components/Customs/SySelect/AccessibiliteItems.ts +1 -1
- package/src/components/Customs/SySelect/SySelect.vue +3 -9
- package/src/components/Customs/SySelect/tests/SySelect.spec.ts +4 -2
- package/src/components/Customs/SyTextField/AccessibiliteItems.ts +1 -1
- package/src/components/DataList/AccessibiliteItems.ts +1 -1
- package/src/components/DataListGroup/AccessibiliteItems.ts +1 -1
- package/src/components/DatePicker/AccessibiliteItems.ts +1 -1
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.mdx +212 -0
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1097 -0
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +497 -180
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +941 -0
- package/src/components/DatePicker/DatePicker/DatePicker.mdx +176 -0
- package/src/components/DatePicker/{tests → DatePicker}/DatePicker.spec.ts +1 -1
- package/src/components/DatePicker/{DatePicker.stories.ts → DatePicker/DatePicker.stories.ts} +115 -400
- package/src/components/DatePicker/{DatePicker.vue → DatePicker/DatePicker.vue} +302 -84
- package/src/components/DatePicker/DatePickerOverview.mdx +227 -0
- package/src/components/DatePicker/{DatePickerValidation.mdx → DatePickerValidationExample/DatePickerValidation.mdx} +3 -3
- package/src/components/DatePicker/{DatePickerValidation.stories.ts → DatePickerValidationExample/DatePickerValidation.stories.ts} +2 -2
- package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +310 -0
- package/src/components/DatePicker/DateTextInput/DateTextInput.range.spec.ts +278 -0
- package/src/components/DatePicker/{tests → DateTextInput}/DateTextInput.spec.ts +8 -7
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +916 -0
- package/src/components/DatePicker/DateTextInput/NoCalendar.mdx +64 -0
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +572 -0
- package/src/components/DatePicker/composables/index.ts +22 -0
- package/src/components/DatePicker/composables/tests/useDateFormatValidation.spec.ts +165 -0
- package/src/components/DatePicker/composables/tests/useDateInputEditing.spec.ts +359 -0
- package/src/components/DatePicker/composables/tests/useDatePickerViewMode.spec.ts +160 -0
- package/src/components/DatePicker/composables/tests/useDatePickerVisibility.spec.ts +339 -0
- package/src/components/DatePicker/composables/tests/useDateRangeInput.spec.ts +277 -0
- package/src/components/DatePicker/composables/tests/useDateRangeValidation.spec.ts +107 -0
- package/src/components/DatePicker/composables/tests/useDateSelection.spec.ts +171 -0
- package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +245 -0
- package/src/components/DatePicker/composables/tests/useDisplayedDateString.spec.ts +98 -0
- package/src/components/DatePicker/composables/tests/useIconState.spec.ts +130 -0
- package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +278 -0
- package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +233 -0
- package/src/components/DatePicker/composables/tests/useMonthButtonCustomization.spec.ts +100 -0
- package/src/components/DatePicker/composables/tests/useTodayButton.spec.ts +97 -0
- package/src/components/DatePicker/composables/tests/useWeekendDays.spec.ts +28 -0
- package/src/components/DatePicker/composables/useDateFormatValidation.ts +95 -0
- package/src/components/DatePicker/composables/useDateInputEditing.ts +326 -0
- package/src/components/DatePicker/composables/useDatePickerViewMode.ts +61 -0
- package/src/components/DatePicker/composables/useDatePickerVisibility.ts +146 -0
- package/src/components/DatePicker/composables/useDateRangeInput.ts +375 -0
- package/src/components/DatePicker/composables/useDateRangeValidation.ts +48 -0
- package/src/components/DatePicker/composables/useDateSelection.ts +121 -0
- package/src/components/DatePicker/composables/useDateValidation.ts +225 -0
- package/src/components/DatePicker/composables/useDisplayedDateString.ts +58 -0
- package/src/components/DatePicker/composables/useIconState.ts +53 -0
- package/src/components/DatePicker/composables/useInputBlurHandler.ts +101 -0
- package/src/components/DatePicker/composables/useInputHandler.ts +436 -0
- package/src/components/DatePicker/composables/useManualDateValidation.ts +161 -0
- package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +89 -0
- package/src/components/DatePicker/composables/useTodayButton.ts +43 -0
- package/src/components/DatePicker/composables/useWeekendDays.ts +21 -0
- package/src/components/DatePicker/constants/messages.ts +50 -0
- package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +4 -4
- package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +1 -1
- package/src/components/DatePicker/playground/ComplexDatePickerPlayground.vue +172 -0
- package/src/components/DatePicker/types.ts +15 -0
- package/src/components/DialogBox/AccessibiliteItems.ts +1 -1
- package/src/components/DownloadBtn/AccessibiliteItems.ts +1 -1
- package/src/components/ErrorPage/AccessibiliteItems.ts +1 -1
- package/src/components/ExternalLinks/AccessibiliteItems.ts +1 -1
- package/src/components/FileList/AccessibiliteItems.ts +1 -1
- package/src/components/FilePreview/AccessibiliteItems.ts +1 -1
- package/src/components/FileUpload/AccessibiliteItems.ts +1 -1
- package/src/components/FilterInline/AccessibiliteItems.ts +1 -1
- package/src/components/FilterSideBar/AccessibiliteItems.ts +1 -1
- package/src/components/FilterSideBar/FilterSideBar.vue +108 -90
- package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +27 -0
- package/src/components/FilterSideBar/tests/__snapshots__/FilterSideBar.spec.ts.snap +114 -109
- package/src/components/FooterBar/AccessibiliteItems.ts +1 -1
- package/src/components/FooterBar/FooterBar.vue +2 -1
- package/src/components/FranceConnectBtn/AccessibiliteItems.ts +1 -1
- package/src/components/HeaderBar/AccessibiliteItems.ts +1 -1
- package/src/components/HeaderBar/HeaderBurgerMenu/AccessibiliteItems.ts +1 -1
- package/src/components/HeaderLoading/AccessibiliteItems.ts +1 -1
- package/src/components/HeaderToolbar/AccessibiliteItems.ts +1 -1
- package/src/components/LangBtn/AccessibiliteItems.ts +1 -1
- package/src/components/Logo/Accessibilite.stories.ts +4 -0
- package/src/components/Logo/AccessibiliteItems.ts +1 -1
- package/src/components/LogoBrandSection/AccessibiliteItems.ts +1 -1
- package/src/components/MaintenancePage/AccessibiliteItems.ts +1 -1
- package/src/components/NirField/AccessibiliteItems.ts +1 -1
- package/src/components/NotFoundPage/AccessibiliteItems.ts +1 -1
- package/src/components/NotificationBar/AccessibiliteItems.ts +1 -1
- package/src/components/PageContainer/AccessibiliteItems.ts +1 -1
- package/src/components/PaginatedTable/AccessibiliteItems.ts +1 -1
- package/src/components/PaginatedTable/PaginatedTable.stories.ts +19 -0
- package/src/components/PaginatedTable/PaginatedTable.vue +51 -13
- package/src/components/PaginatedTable/tests/PaginatedTable.spec.ts +0 -2
- package/src/components/PasswordField/AccessibiliteItems.ts +1 -1
- package/src/components/PeriodField/AccessibiliteItems.ts +1 -1
- package/src/components/PeriodField/PeriodField.vue +13 -1
- package/src/components/PhoneField/AccessibiliteItems.ts +1 -1
- package/src/components/RangeField/AccessibiliteItems.ts +1 -1
- package/src/components/RatingPicker/AccessibiliteItems.ts +1 -1
- package/src/components/SearchListField/AccessibiliteItems.ts +1 -1
- package/src/components/SelectBtnField/AccessibiliteItems.ts +1 -1
- package/src/components/SkipLink/AccessibiliteItems.ts +1 -1
- package/src/components/SocialMediaLinks/AccessibiliteItems.ts +1 -1
- package/src/components/SubHeader/AccessibiliteItems.ts +1 -1
- package/src/components/SyAlert/AccessibiliteItems.ts +1 -1
- package/src/components/TableToolbar/AccessibiliteItems.ts +1 -1
- package/src/components/TableToolbar/TableToolbar.stories.ts +110 -56
- package/src/components/Tables/SyServerTable/FilterRules.stories.ts +83 -0
- package/src/components/Tables/SyServerTable/SyServerTable.mdx +160 -0
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +2887 -0
- package/src/components/Tables/SyServerTable/SyServerTable.vue +302 -0
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +450 -0
- package/src/components/Tables/SyServerTable/tests/__snapshots__/SyServerTable.spec.ts.snap +521 -0
- package/src/components/Tables/SyTable/FilterRules.stories.ts +235 -0
- package/src/components/Tables/SyTable/SyTable.mdx +129 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +1966 -0
- package/src/components/Tables/SyTable/SyTable.vue +317 -0
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +345 -0
- package/src/components/Tables/SyTable/tests/__snapshots__/SyTable.spec.ts.snap +521 -0
- package/src/components/Tables/common/SyTableFilter.vue +342 -0
- package/src/components/Tables/common/TableHeader.vue +221 -0
- package/src/components/Tables/common/constants/StateEnum.ts +6 -0
- package/src/components/Tables/common/filters/DateFilter.vue +140 -0
- package/src/components/Tables/common/filters/NumberFilter.vue +234 -0
- package/src/components/Tables/common/filters/PeriodFilter.vue +147 -0
- package/src/components/Tables/common/filters/SelectFilter.vue +126 -0
- package/src/components/Tables/common/filters/TextFilter.vue +191 -0
- package/src/components/Tables/common/filters/tests/DateFilter.spec.ts +187 -0
- package/src/components/Tables/common/filters/tests/NumberFilter.spec.ts +280 -0
- package/src/components/Tables/common/filters/tests/PeriodFilter.spec.ts +192 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +219 -0
- package/src/components/Tables/common/filters/tests/TextFilter.spec.ts +260 -0
- package/src/components/Tables/common/formatters.ts +72 -0
- package/src/components/Tables/common/locales.ts +7 -0
- package/src/components/Tables/common/tableAccessibilityUtils.ts +61 -0
- package/src/components/Tables/common/tableFilterUtils.ts +327 -0
- package/src/components/Tables/common/tableStorageUtils.ts +102 -0
- package/src/components/Tables/common/tableStyles.scss +54 -0
- package/src/components/Tables/common/tableUtils.ts +115 -0
- package/src/components/Tables/common/tests/SyTableFilter.spec.ts +312 -0
- package/src/components/Tables/common/tests/resize.spec.ts +161 -0
- package/src/components/Tables/common/tests/tableFilterUtils.spec.ts +106 -0
- package/src/components/Tables/common/tests/tableUtils.spec.ts +272 -0
- package/src/components/Tables/common/types.ts +81 -0
- package/src/components/Tables/common/useTableFilter.ts +19 -0
- package/src/components/Tables/index.ts +3 -0
- package/src/components/UploadWorkflow/AccessibiliteItems.ts +1 -1
- package/src/components/UserMenuBtn/AccessibiliteItems.ts +1 -1
- package/src/components/index.ts +3 -1
- package/src/composables/date/useDateFormatDayjs.ts +8 -3
- package/src/composables/date/useDateInitializationDayjs.ts +28 -36
- package/src/composables/rules/useFieldValidation.ts +1 -2
- package/src/designTokens/index.ts +4 -0
- package/src/designTokens/tokens/cnam/cnamFonts.ts +140 -0
- package/src/designTokens/tokens/pa/paFonts.ts +140 -0
- package/src/designTokens/utils/createFontVariables.ts +143 -0
- package/src/designTokens/utils/index.ts +2 -1
- package/src/stories/Demarrer/Accueil.stories.ts +12 -3
- package/src/utils/rules/isHolidayDay/IsHolidayDay.stories.ts +1 -1
- package/src/utils/rules/isRequired/index.ts +2 -1
- package/src/vite-env.d.ts +12 -0
- package/src/vuetifyConfig.ts +10 -3
- package/dist/components/BackToTopBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/ChipList/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/CollapsibleList/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/ContextualMenu/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/CookieBanner/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/CopyBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/Customs/SyBtnSelect/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/Customs/SyInputSelect/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/Customs/SySelect/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/Customs/SyTextField/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/DataList/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/DataListGroup/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/DatePicker/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/DialogBox/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/DownloadBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/ErrorPage/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/ExternalLinks/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/FileList/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/FilePreview/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/FileUpload/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/FilterInline/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/FilterSideBar/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/FooterBar/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/FranceConnectBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/HeaderBar/HeaderBurgerMenu/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/HeaderBar/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/HeaderLoading/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/HeaderToolbar/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/LangBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/Logo/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/LogoBrandSection/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/MaintenancePage/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/NirField/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/NotFoundPage/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/NotificationBar/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/PageContainer/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/PaginatedTable/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/PasswordField/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/PeriodField/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/PhoneField/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/RangeField/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/RatingPicker/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/SearchListField/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/SelectBtnField/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/SkipLink/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/SocialMediaLinks/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/SubHeader/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/SyAlert/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/TableToolbar/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/UploadWorkflow/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/dist/components/UserMenuBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
- package/src/components/BackBtn/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/BackToTopBtn/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/ChipList/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/CollapsibleList/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/ContextualMenu/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/CookieBanner/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/CopyBtn/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/Customs/SyBtnSelect/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/Customs/SyInputSelect/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/Customs/SySelect/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/Customs/SyTextField/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/DataList/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/DataListGroup/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/DatePicker/DatePicker.mdx +0 -222
- package/src/components/DatePicker/DateTextInput.vue +0 -504
- package/src/components/DatePicker/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/DialogBox/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/DownloadBtn/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/ErrorPage/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/ExternalLinks/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/FileList/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/FilePreview/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/FileUpload/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/FilterInline/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/FilterSideBar/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/FooterBar/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/FranceConnectBtn/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/HeaderBar/HeaderBurgerMenu/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/HeaderBar/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/HeaderLoading/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/HeaderToolbar/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/LangBtn/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/Logo/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/LogoBrandSection/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/MaintenancePage/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/NirField/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/NotFoundPage/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/NotificationBar/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/PageContainer/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/PaginatedTable/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/PasswordField/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/PeriodField/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/PhoneField/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/RangeField/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/RatingPicker/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/SearchListField/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/SelectBtnField/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/SkipLink/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/SocialMediaLinks/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/SubHeader/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/SyAlert/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/TableToolbar/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/UploadWorkflow/constants/ExpertiseLevelEnum.ts +0 -4
- package/src/components/UserMenuBtn/constants/ExpertiseLevelEnum.ts +0 -4
- /package/src/components/DatePicker/{examples → playground}/DatePickerHolidayRule.vue +0 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest'
|
|
2
|
+
import { mount } from '@vue/test-utils'
|
|
3
|
+
import { createVuetify } from 'vuetify'
|
|
4
|
+
import * as components from 'vuetify/components'
|
|
5
|
+
import * as directives from 'vuetify/directives'
|
|
6
|
+
|
|
7
|
+
import SelectFilter from '../SelectFilter.vue'
|
|
8
|
+
import SySelect from '@/components/Customs/SySelect/SySelect.vue'
|
|
9
|
+
import type { FilterType } from '../../types'
|
|
10
|
+
|
|
11
|
+
const vuetify = createVuetify({
|
|
12
|
+
components,
|
|
13
|
+
directives,
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
describe('SelectFilter.vue', () => {
|
|
17
|
+
let wrapper: ReturnType<typeof mount<typeof SelectFilter>>
|
|
18
|
+
const header = {
|
|
19
|
+
title: 'Test Select',
|
|
20
|
+
key: 'test',
|
|
21
|
+
filterOptions: [
|
|
22
|
+
{ text: 'Option 1', value: 'option1' },
|
|
23
|
+
{ text: 'Option 2', value: 'option2' },
|
|
24
|
+
],
|
|
25
|
+
}
|
|
26
|
+
const filters: { key: string, value: string | number, type: FilterType }[] = []
|
|
27
|
+
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
wrapper = mount(SelectFilter, {
|
|
30
|
+
global: {
|
|
31
|
+
plugins: [vuetify],
|
|
32
|
+
stubs: {
|
|
33
|
+
SySelect: {
|
|
34
|
+
template: '<div class="sy-select-stub" data-testid="sy-select" :label="label" :items="items" :clearable="clearable" :density="density" :hideDetails="hideDetails"></div>',
|
|
35
|
+
props: ['modelValue', 'label', 'items', 'clearable', 'density', 'hideDetails', 'hideMessages', 'disableErrorHandling', 'variant'],
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
props: {
|
|
40
|
+
header,
|
|
41
|
+
filters,
|
|
42
|
+
filterValue: undefined,
|
|
43
|
+
},
|
|
44
|
+
})
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('renders correctly with default props', () => {
|
|
48
|
+
expect(wrapper.exists()).toBe(true)
|
|
49
|
+
expect(wrapper.findComponent(SySelect).exists()).toBe(true)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('passes the correct props to SySelect', () => {
|
|
53
|
+
const sySelect = wrapper.findComponent(SySelect)
|
|
54
|
+
// Use attributes for stubbed components
|
|
55
|
+
expect(sySelect.attributes('label')).toBe('Test Select')
|
|
56
|
+
// Can't easily test complex objects with attributes
|
|
57
|
+
// expect(sySelect.attributes('items')) would not work as expected
|
|
58
|
+
expect(sySelect.attributes('clearable')).toBe('true')
|
|
59
|
+
expect(sySelect.attributes('density')).toBe('compact')
|
|
60
|
+
expect(sySelect.attributes('hidedetails')).toBe('true')
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
it('emits update:filters event when value changes', async () => {
|
|
64
|
+
const sySelect = wrapper.findComponent(SySelect)
|
|
65
|
+
await sySelect.vm.$emit('update:modelValue', 'option1')
|
|
66
|
+
|
|
67
|
+
expect(wrapper.emitted('update:filters')).toBeTruthy()
|
|
68
|
+
expect(wrapper.emitted('update:filters')![0][0]).toEqual([
|
|
69
|
+
{ key: 'test', value: 'option1', type: 'select' as FilterType },
|
|
70
|
+
])
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('emits update:filters event to remove filter when value is null', async () => {
|
|
74
|
+
// First set a value
|
|
75
|
+
const sySelect = wrapper.findComponent(SySelect)
|
|
76
|
+
await sySelect.vm.$emit('update:modelValue', 'option1')
|
|
77
|
+
|
|
78
|
+
// Then clear it
|
|
79
|
+
await sySelect.vm.$emit('update:modelValue', null)
|
|
80
|
+
|
|
81
|
+
expect(wrapper.emitted('update:filters')![1][0]).toEqual([])
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
it('emits update:filters event to remove filter when value is undefined', async () => {
|
|
85
|
+
// First set a value
|
|
86
|
+
const sySelect = wrapper.findComponent(SySelect)
|
|
87
|
+
await sySelect.vm.$emit('update:modelValue', 'option1')
|
|
88
|
+
|
|
89
|
+
// Then clear it
|
|
90
|
+
await sySelect.vm.$emit('update:modelValue', undefined)
|
|
91
|
+
|
|
92
|
+
expect(wrapper.emitted('update:filters')![1][0]).toEqual([])
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('handles clear button click', async () => {
|
|
96
|
+
const sySelect = wrapper.findComponent(SySelect)
|
|
97
|
+
await sySelect.vm.$emit('click:clear')
|
|
98
|
+
|
|
99
|
+
expect(wrapper.emitted('update:filters')).toBeTruthy()
|
|
100
|
+
expect(wrapper.emitted('update:filters')![0][0]).toEqual([])
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
it('updates existing filter when one already exists', async () => {
|
|
104
|
+
const existingFilters = [{ key: 'test', value: 'option1', type: 'select' as FilterType }]
|
|
105
|
+
await wrapper.setProps({ filters: existingFilters })
|
|
106
|
+
|
|
107
|
+
const sySelect = wrapper.findComponent(SySelect)
|
|
108
|
+
await sySelect.vm.$emit('update:modelValue', 'option2')
|
|
109
|
+
|
|
110
|
+
expect(wrapper.emitted('update:filters')![0][0]).toEqual([
|
|
111
|
+
{ key: 'test', value: 'option2', type: 'select' as FilterType },
|
|
112
|
+
])
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
it('works with object values', async () => {
|
|
116
|
+
const objectHeader = {
|
|
117
|
+
title: 'Test Object Select',
|
|
118
|
+
key: 'test',
|
|
119
|
+
filterOptions: [
|
|
120
|
+
{ text: 'Option 1', value: { id: 1, name: 'Option 1' } },
|
|
121
|
+
{ text: 'Option 2', value: { id: 2, name: 'Option 2' } },
|
|
122
|
+
],
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
await wrapper.setProps({ header: objectHeader })
|
|
126
|
+
|
|
127
|
+
const sySelect = wrapper.findComponent(SySelect)
|
|
128
|
+
await sySelect.vm.$emit('update:modelValue', { id: 1, name: 'Option 1' })
|
|
129
|
+
|
|
130
|
+
expect(wrapper.emitted('update:filters')![0][0]).toEqual([
|
|
131
|
+
{ key: 'test', value: { id: 1, name: 'Option 1' }, type: 'select' as FilterType },
|
|
132
|
+
])
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
it('generates unique key when header.key and header.value are absent', async () => {
|
|
136
|
+
// Recréer le wrapper avec un header sans key ni value, seulement title
|
|
137
|
+
const headerWithoutKey = {
|
|
138
|
+
title: 'Test Select',
|
|
139
|
+
filterOptions: [
|
|
140
|
+
{ text: 'Option 1', value: 'option1' },
|
|
141
|
+
{ text: 'Option 2', value: 'option2' },
|
|
142
|
+
],
|
|
143
|
+
}
|
|
144
|
+
const newWrapper = mount(SelectFilter, {
|
|
145
|
+
global: {
|
|
146
|
+
plugins: [vuetify],
|
|
147
|
+
stubs: {
|
|
148
|
+
SySelect: {
|
|
149
|
+
template: '<div class="sy-select-stub" data-testid="sy-select"></div>',
|
|
150
|
+
props: ['modelValue', 'label', 'items', 'clearable', 'density', 'hideDetails'],
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
props: {
|
|
155
|
+
header: headerWithoutKey,
|
|
156
|
+
filters: [],
|
|
157
|
+
filterValue: undefined,
|
|
158
|
+
},
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
// Émettre une valeur pour déclencher la mise à jour du filtre
|
|
162
|
+
const sySelect = newWrapper.findComponent(SySelect)
|
|
163
|
+
await sySelect.vm.$emit('update:modelValue', 'option1')
|
|
164
|
+
|
|
165
|
+
// Vérifier que l'événement a été émis avec une clé générée basée sur le titre
|
|
166
|
+
expect(newWrapper.emitted('update:filters')).toBeTruthy()
|
|
167
|
+
const emittedFilters = newWrapper.emitted('update:filters')![0][0] as Array<{ key: string, value: string, type: string }>
|
|
168
|
+
expect(emittedFilters.length).toBe(1)
|
|
169
|
+
expect(emittedFilters[0].key).toBe('filter_Test Select')
|
|
170
|
+
expect(emittedFilters[0].value).toBe('option1')
|
|
171
|
+
expect(emittedFilters[0].type).toBe('select')
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
it('generates unique key with timestamp when all header properties are absent', async () => {
|
|
175
|
+
// Mock Date.now() pour avoir une valeur prévisible dans le test
|
|
176
|
+
const originalDateNow = Date.now
|
|
177
|
+
const mockTimestamp = 1622548800000 // 2021-06-01T12:00:00.000Z
|
|
178
|
+
global.Date.now = vi.fn(() => mockTimestamp)
|
|
179
|
+
|
|
180
|
+
// Recréer le wrapper avec un header complètement vide
|
|
181
|
+
const emptyHeader = {
|
|
182
|
+
filterOptions: [
|
|
183
|
+
{ text: 'Option 1', value: 'option1' },
|
|
184
|
+
{ text: 'Option 2', value: 'option2' },
|
|
185
|
+
],
|
|
186
|
+
}
|
|
187
|
+
const newWrapper = mount(SelectFilter, {
|
|
188
|
+
global: {
|
|
189
|
+
plugins: [vuetify],
|
|
190
|
+
stubs: {
|
|
191
|
+
SySelect: {
|
|
192
|
+
template: '<div class="sy-select-stub" data-testid="sy-select"></div>',
|
|
193
|
+
props: ['modelValue', 'label', 'items', 'clearable', 'density', 'hideDetails'],
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
props: {
|
|
198
|
+
header: emptyHeader,
|
|
199
|
+
filters: [],
|
|
200
|
+
filterValue: undefined,
|
|
201
|
+
},
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
// Émettre une valeur pour déclencher la mise à jour du filtre
|
|
205
|
+
const sySelect = newWrapper.findComponent(SySelect)
|
|
206
|
+
await sySelect.vm.$emit('update:modelValue', 'option1')
|
|
207
|
+
|
|
208
|
+
// Vérifier que l'événement a été émis avec une clé générée basée sur le timestamp
|
|
209
|
+
expect(newWrapper.emitted('update:filters')).toBeTruthy()
|
|
210
|
+
const emittedFilters = newWrapper.emitted('update:filters')![0][0] as Array<{ key: string, value: string, type: string }>
|
|
211
|
+
expect(emittedFilters.length).toBe(1)
|
|
212
|
+
expect(emittedFilters[0].key).toBe(`filter_${mockTimestamp}`)
|
|
213
|
+
expect(emittedFilters[0].value).toBe('option1')
|
|
214
|
+
expect(emittedFilters[0].type).toBe('select')
|
|
215
|
+
|
|
216
|
+
// Restaurer Date.now
|
|
217
|
+
global.Date.now = originalDateNow
|
|
218
|
+
})
|
|
219
|
+
})
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest'
|
|
2
|
+
import { mount } from '@vue/test-utils'
|
|
3
|
+
import { createVuetify } from 'vuetify'
|
|
4
|
+
import * as components from 'vuetify/components'
|
|
5
|
+
import * as directives from 'vuetify/directives'
|
|
6
|
+
|
|
7
|
+
import TextFilter from '../TextFilter.vue'
|
|
8
|
+
import SyTextField from '@/components/Customs/SyTextField/SyTextField.vue'
|
|
9
|
+
import type { FilterType } from '../../types'
|
|
10
|
+
import { filterItems } from '../../tableFilterUtils'
|
|
11
|
+
|
|
12
|
+
const vuetify = createVuetify({
|
|
13
|
+
components,
|
|
14
|
+
directives,
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
describe('TextFilter.vue', () => {
|
|
18
|
+
let wrapper: ReturnType<typeof mount<typeof TextFilter>>
|
|
19
|
+
const header = { title: 'Test Column', key: 'test' }
|
|
20
|
+
const filters: { key: string, value: string, type: FilterType }[] = []
|
|
21
|
+
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
wrapper = mount(TextFilter, {
|
|
24
|
+
global: {
|
|
25
|
+
plugins: [vuetify],
|
|
26
|
+
stubs: {
|
|
27
|
+
SyTextField: {
|
|
28
|
+
template: '<div class="sy-text-field-stub" data-testid="sy-text-field" :label="label" :clearable="clearable" :density="density" :hideDetails="hideDetails"></div>',
|
|
29
|
+
props: ['modelValue', 'label', 'clearable', 'density', 'hideDetails', 'hideMessages', 'disableErrorHandling', 'variant'],
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
props: {
|
|
34
|
+
header,
|
|
35
|
+
filters,
|
|
36
|
+
filterValue: '',
|
|
37
|
+
debounceTime: 0, // Set debounce time to 0 for testing
|
|
38
|
+
},
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('renders correctly with default props', () => {
|
|
43
|
+
expect(wrapper.exists()).toBe(true)
|
|
44
|
+
expect(wrapper.findComponent(SyTextField).exists()).toBe(true)
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('passes the correct props to SyTextField', () => {
|
|
48
|
+
const syTextField = wrapper.findComponent(SyTextField)
|
|
49
|
+
// Use attributes for stubbed components
|
|
50
|
+
expect(syTextField.attributes('label')).toBe('Test Column')
|
|
51
|
+
expect(syTextField.attributes('clearable')).toBe('true')
|
|
52
|
+
expect(syTextField.attributes('density')).toBe('compact')
|
|
53
|
+
expect(syTextField.attributes('hidedetails')).toBe('true')
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
it('emits update:filters event when value changes', async () => {
|
|
57
|
+
const syTextField = wrapper.findComponent(SyTextField)
|
|
58
|
+
await syTextField.vm.$emit('update:modelValue', 'test value')
|
|
59
|
+
|
|
60
|
+
expect(wrapper.emitted('update:filters')).toBeTruthy()
|
|
61
|
+
expect(wrapper.emitted('update:filters')![0][0]).toEqual([
|
|
62
|
+
{ key: 'test', value: 'test value', type: 'text' as FilterType },
|
|
63
|
+
])
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
it('emits update:filters event to remove filter when value is empty', async () => {
|
|
67
|
+
// First set a value
|
|
68
|
+
const syTextField = wrapper.findComponent(SyTextField)
|
|
69
|
+
await syTextField.vm.$emit('update:modelValue', 'test value')
|
|
70
|
+
|
|
71
|
+
// Then clear it
|
|
72
|
+
await syTextField.vm.$emit('update:modelValue', '')
|
|
73
|
+
|
|
74
|
+
expect(wrapper.emitted('update:filters')![1][0]).toEqual([])
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
it('handles clear button click', async () => {
|
|
78
|
+
const syTextField = wrapper.findComponent(SyTextField)
|
|
79
|
+
await syTextField.vm.$emit('click:clear')
|
|
80
|
+
|
|
81
|
+
expect(wrapper.emitted('update:filters')).toBeTruthy()
|
|
82
|
+
expect(wrapper.emitted('update:filters')![0][0]).toEqual([])
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
it('updates existing filter when one already exists', async () => {
|
|
86
|
+
const existingFilters = [{ key: 'test', value: 'old value', type: 'text' as FilterType }]
|
|
87
|
+
await wrapper.setProps({ filters: existingFilters })
|
|
88
|
+
|
|
89
|
+
const syTextField = wrapper.findComponent(SyTextField)
|
|
90
|
+
await syTextField.vm.$emit('update:modelValue', 'new value')
|
|
91
|
+
|
|
92
|
+
expect(wrapper.emitted('update:filters')![0][0]).toEqual([
|
|
93
|
+
{ key: 'test', value: 'new value', type: 'text' as FilterType },
|
|
94
|
+
])
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
it('generates unique key when header.key and header.value are absent', async () => {
|
|
98
|
+
// Recréer le wrapper avec un header sans key ni value, seulement title
|
|
99
|
+
const headerWithoutKey = { title: 'Test Column' }
|
|
100
|
+
const newWrapper = mount(TextFilter, {
|
|
101
|
+
global: {
|
|
102
|
+
plugins: [vuetify],
|
|
103
|
+
stubs: {
|
|
104
|
+
SyTextField: {
|
|
105
|
+
template: '<div class="sy-text-field-stub" data-testid="sy-text-field"></div>',
|
|
106
|
+
props: ['modelValue', 'label', 'clearable', 'density', 'hideDetails'],
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
props: {
|
|
111
|
+
header: headerWithoutKey,
|
|
112
|
+
filters: [],
|
|
113
|
+
filterValue: '',
|
|
114
|
+
debounceTime: 0, // Set debounce time to 0 for testing
|
|
115
|
+
},
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
// Émettre une valeur pour déclencher la mise à jour du filtre
|
|
119
|
+
const syTextField = newWrapper.findComponent(SyTextField)
|
|
120
|
+
await syTextField.vm.$emit('update:modelValue', 'test value')
|
|
121
|
+
|
|
122
|
+
// Vérifier que l'événement a été émis avec une clé générée basée sur le titre
|
|
123
|
+
expect(newWrapper.emitted('update:filters')).toBeTruthy()
|
|
124
|
+
const emittedFilters = newWrapper.emitted('update:filters')![0][0] as Array<{ key: string, value: string, type: string }>
|
|
125
|
+
expect(emittedFilters.length).toBe(1)
|
|
126
|
+
expect(emittedFilters[0].key).toBe('filter_Test Column')
|
|
127
|
+
expect(emittedFilters[0].value).toBe('test value')
|
|
128
|
+
expect(emittedFilters[0].type).toBe('text')
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
it('generates unique key with timestamp when all header properties are absent', async () => {
|
|
132
|
+
// Mock Date.now() pour avoir une valeur prévisible dans le test
|
|
133
|
+
const originalDateNow = Date.now
|
|
134
|
+
const mockTimestamp = 1622548800000 // 2021-06-01T12:00:00.000Z
|
|
135
|
+
global.Date.now = vi.fn(() => mockTimestamp)
|
|
136
|
+
|
|
137
|
+
// Recréer le wrapper avec un header complètement vide
|
|
138
|
+
const emptyHeader = {}
|
|
139
|
+
const newWrapper = mount(TextFilter, {
|
|
140
|
+
global: {
|
|
141
|
+
plugins: [vuetify],
|
|
142
|
+
stubs: {
|
|
143
|
+
SyTextField: {
|
|
144
|
+
template: '<div class="sy-text-field-stub" data-testid="sy-text-field"></div>',
|
|
145
|
+
props: ['modelValue', 'label', 'clearable', 'density', 'hideDetails'],
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
props: {
|
|
150
|
+
header: emptyHeader,
|
|
151
|
+
filters: [],
|
|
152
|
+
filterValue: '',
|
|
153
|
+
debounceTime: 0, // Set debounce time to 0 for testing
|
|
154
|
+
},
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
// Émettre une valeur pour déclencher la mise à jour du filtre
|
|
158
|
+
const syTextField = newWrapper.findComponent(SyTextField)
|
|
159
|
+
await syTextField.vm.$emit('update:modelValue', 'test value')
|
|
160
|
+
|
|
161
|
+
// Vérifier que l'événement a été émis avec une clé générée basée sur le timestamp
|
|
162
|
+
expect(newWrapper.emitted('update:filters')).toBeTruthy()
|
|
163
|
+
const emittedFilters = newWrapper.emitted('update:filters')![0][0] as Array<{ key: string, value: string, type: string }>
|
|
164
|
+
expect(emittedFilters.length).toBe(1)
|
|
165
|
+
expect(emittedFilters[0].key).toBe(`filter_${mockTimestamp}`)
|
|
166
|
+
expect(emittedFilters[0].value).toBe('test value')
|
|
167
|
+
expect(emittedFilters[0].type).toBe('text')
|
|
168
|
+
|
|
169
|
+
// Restaurer Date.now
|
|
170
|
+
global.Date.now = originalDateNow
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
describe('Text filter rules', () => {
|
|
174
|
+
const testItems = [
|
|
175
|
+
{ id: 1, text: 'apple' },
|
|
176
|
+
{ id: 2, text: 'banana' },
|
|
177
|
+
{ id: 3, text: 'Cherry' },
|
|
178
|
+
{ id: 4, text: 'date' },
|
|
179
|
+
{ id: 5, text: 'Elderberry' },
|
|
180
|
+
{ id: 6, text: 'fig' },
|
|
181
|
+
{ id: 7, text: 'grape' },
|
|
182
|
+
{ id: 8, text: '' }, // Empty string
|
|
183
|
+
{ id: 9, text: null }, // Null value
|
|
184
|
+
]
|
|
185
|
+
|
|
186
|
+
it('performs case-insensitive search by default', () => {
|
|
187
|
+
const filters = [{ key: 'text', value: 'cherry', type: 'text' as FilterType }]
|
|
188
|
+
const result = filterItems(testItems, filters)
|
|
189
|
+
expect(result).toHaveLength(1)
|
|
190
|
+
expect(result[0].id).toBe(3)
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
it('supports wildcard * for any string of characters', () => {
|
|
194
|
+
const filters = [{ key: 'text', value: 'a*', type: 'text' as FilterType }]
|
|
195
|
+
const result = filterItems(testItems, filters)
|
|
196
|
+
expect(result).toHaveLength(2)
|
|
197
|
+
expect(result.map(item => item.id)).toEqual([1, 2])
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
it('supports wildcard ? for any single character', () => {
|
|
201
|
+
const filters = [{ key: 'text', value: '????', type: 'text' as FilterType }]
|
|
202
|
+
const result = filterItems(testItems, filters)
|
|
203
|
+
expect(result).toHaveLength(3)
|
|
204
|
+
expect(result.map(item => item.id)).toEqual([1, 4, 6])
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
it('supports case-sensitive search with double quotes', () => {
|
|
208
|
+
const filters = [{ key: 'text', value: '"Cherry"', type: 'text' as FilterType }]
|
|
209
|
+
const result = filterItems(testItems, filters)
|
|
210
|
+
expect(result).toHaveLength(1)
|
|
211
|
+
expect(result[0].id).toBe(3)
|
|
212
|
+
|
|
213
|
+
// Should not match lowercase
|
|
214
|
+
const filters2 = [{ key: 'text', value: '"cherry"', type: 'text' as FilterType }]
|
|
215
|
+
const result2 = filterItems(testItems, filters2)
|
|
216
|
+
expect(result2).toHaveLength(0)
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
it('supports prefix search with wildcard', () => {
|
|
220
|
+
const filters = [{ key: 'text', value: 'e*', type: 'text' as FilterType }]
|
|
221
|
+
const result = filterItems(testItems, filters)
|
|
222
|
+
expect(result).toHaveLength(1)
|
|
223
|
+
expect(result[0].id).toBe(5)
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
it('supports exact length search with =????', () => {
|
|
227
|
+
const filters = [{ key: 'text', value: '=????', type: 'text' as FilterType }]
|
|
228
|
+
const result = filterItems(testItems, filters)
|
|
229
|
+
expect(result).toHaveLength(3)
|
|
230
|
+
expect(result.map(item => item.id)).toEqual([1, 4, 6])
|
|
231
|
+
|
|
232
|
+
// Test with different length
|
|
233
|
+
const filters2 = [{ key: 'text', value: '=?????', type: 'text' as FilterType }]
|
|
234
|
+
const result2 = filterItems(testItems, filters2)
|
|
235
|
+
expect(result2).toHaveLength(2)
|
|
236
|
+
expect(result2.map(item => item.id)).toEqual([2, 5])
|
|
237
|
+
})
|
|
238
|
+
|
|
239
|
+
it('supports empty or null value search with <>?*', () => {
|
|
240
|
+
const filters = [{ key: 'text', value: '<>?*', type: 'text' as FilterType }]
|
|
241
|
+
const result = filterItems(testItems, filters)
|
|
242
|
+
expect(result).toHaveLength(2)
|
|
243
|
+
expect(result.map(item => item.id)).toEqual([8, 9])
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
it('supports alphabetical comparison with >', () => {
|
|
247
|
+
const filters = [{ key: 'text', value: '>f', type: 'text' as FilterType }]
|
|
248
|
+
const result = filterItems(testItems, filters)
|
|
249
|
+
expect(result).toHaveLength(2)
|
|
250
|
+
expect(result.map(item => item.id)).toEqual([6, 7])
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
it('combines multiple wildcards correctly', () => {
|
|
254
|
+
const filters = [{ key: 'text', value: '*r*', type: 'text' as FilterType }]
|
|
255
|
+
const result = filterItems(testItems, filters)
|
|
256
|
+
expect(result).toHaveLength(3)
|
|
257
|
+
expect(result.map(item => item.id)).toEqual([3, 5, 7])
|
|
258
|
+
})
|
|
259
|
+
})
|
|
260
|
+
})
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fonctions utilitaires pour formater les données dans les tableaux
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Formate un objet période pour l'affichage
|
|
7
|
+
*
|
|
8
|
+
* @param value - L'objet période à formater
|
|
9
|
+
* @returns Chaîne de période formatée
|
|
10
|
+
*/
|
|
11
|
+
export function formatPeriod(value: unknown): string {
|
|
12
|
+
// Traite les valeurs null ou undefined
|
|
13
|
+
if (value === null || value === undefined) {
|
|
14
|
+
return ''
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Traite les objets période
|
|
18
|
+
if (typeof value === 'object' && value !== null && 'from' in value && 'to' in value) {
|
|
19
|
+
const periodValue = value as { from?: string | null, to?: string | null }
|
|
20
|
+
const from = periodValue.from || ''
|
|
21
|
+
const to = periodValue.to || ''
|
|
22
|
+
|
|
23
|
+
// Formate comme "du [date] au [date]"
|
|
24
|
+
if (from && to) {
|
|
25
|
+
return `du ${from} au ${to}`
|
|
26
|
+
}
|
|
27
|
+
// Si seule la date de début est présente
|
|
28
|
+
else if (from) {
|
|
29
|
+
return `du ${from}`
|
|
30
|
+
}
|
|
31
|
+
// Si seule la date de fin est présente
|
|
32
|
+
else if (to) {
|
|
33
|
+
return `au ${to}`
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Repli sur la représentation en chaîne de caractères
|
|
38
|
+
return String(value)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Traite les éléments du tableau pour formater les champs spéciaux comme les périodes
|
|
43
|
+
*
|
|
44
|
+
* @param items - Les éléments du tableau à traiter
|
|
45
|
+
* @returns Éléments traités avec des valeurs formatées
|
|
46
|
+
*/
|
|
47
|
+
export function processItems(items: Record<string, unknown>[]): Record<string, unknown>[] {
|
|
48
|
+
if (!items || !Array.isArray(items)) return []
|
|
49
|
+
|
|
50
|
+
return items.map((item) => {
|
|
51
|
+
if (!item) return item
|
|
52
|
+
|
|
53
|
+
const newItem = { ...item } as Record<string, unknown>
|
|
54
|
+
|
|
55
|
+
// Traite tous les champs de l'élément
|
|
56
|
+
Object.keys(newItem).forEach((key) => {
|
|
57
|
+
const value = newItem[key]
|
|
58
|
+
|
|
59
|
+
// Vérifie si ce champ est un objet de type période (possède les propriétés from et to)
|
|
60
|
+
if (value
|
|
61
|
+
&& typeof value === 'object'
|
|
62
|
+
&& value !== null
|
|
63
|
+
&& 'from' in value
|
|
64
|
+
&& 'to' in value) {
|
|
65
|
+
// Formate la période et la stocke à nouveau
|
|
66
|
+
newItem[key] = formatPeriod(value)
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
return newItem
|
|
71
|
+
})
|
|
72
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const locales = {
|
|
2
|
+
resetFilters: 'Réinitialiser les filtres',
|
|
3
|
+
noData: 'Aucune donnée disponible',
|
|
4
|
+
columnOrder: (columnTitle: string) => `Ordonner par ${columnTitle}`,
|
|
5
|
+
ResizableColumn: 'Redimensionner la colonne',
|
|
6
|
+
resizeColumn: (columnTitle: string) => `Redimensionner la colonne ${columnTitle}`,
|
|
7
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { onMounted } from 'vue'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Utility function to enhance table accessibility
|
|
5
|
+
*/
|
|
6
|
+
export function useTableAccessibility({
|
|
7
|
+
tableId,
|
|
8
|
+
}: {
|
|
9
|
+
tableId: string
|
|
10
|
+
}) {
|
|
11
|
+
function setupAccessibility() {
|
|
12
|
+
onMounted(() => {
|
|
13
|
+
const captionElement = document.querySelector(`#${tableId} caption`)
|
|
14
|
+
if (captionElement && captionElement.textContent?.trim() === '') {
|
|
15
|
+
captionElement.setAttribute('aria-label', 'Table caption')
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const inputs = document.querySelectorAll(`#${tableId} input`)
|
|
19
|
+
inputs.forEach((input) => {
|
|
20
|
+
(input as HTMLElement).removeAttribute('aria-describedby')
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
const fields = document.querySelectorAll(`#${tableId} .v-field`)
|
|
24
|
+
fields.forEach((field) => {
|
|
25
|
+
const element = field as HTMLElement
|
|
26
|
+
element.setAttribute('tabindex', '0')
|
|
27
|
+
|
|
28
|
+
// Remove immediately if it exists
|
|
29
|
+
if (element.hasAttribute('aria-controls')) {
|
|
30
|
+
element.removeAttribute('aria-controls')
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Check again after a delay
|
|
34
|
+
setTimeout(() => {
|
|
35
|
+
if (element.hasAttribute('aria-controls')) {
|
|
36
|
+
element.removeAttribute('aria-controls')
|
|
37
|
+
}
|
|
38
|
+
}, 500)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
const fieldLabels = document.querySelectorAll(`#${tableId} .v-field`)
|
|
42
|
+
fieldLabels.forEach((fieldLabel) => {
|
|
43
|
+
(fieldLabel as HTMLElement).setAttribute('aria-label', 'items per page')
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
const fieldTitles = document.querySelectorAll(`#${tableId} .v-field`)
|
|
47
|
+
fieldTitles.forEach((fieldTitle) => {
|
|
48
|
+
(fieldTitle as HTMLElement).setAttribute('title', 'items per page')
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
const th = document.querySelectorAll(`#${tableId} th`)
|
|
52
|
+
for (let i = 0; i < th.length; i++) {
|
|
53
|
+
th[i].setAttribute('scope', 'col')
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
setupAccessibility,
|
|
60
|
+
}
|
|
61
|
+
}
|