@cnamts/synapse 1.0.23 → 1.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AutocompleteFilter-BWLR3U7W.js +114 -0
- package/dist/AutocompleteFilter-D9jzRzAL.cjs +1 -0
- package/dist/{DateFilter-Dc-gSGwk.js → DateFilter-BpwFexzi.js} +1 -1
- package/dist/DateFilter-DTUl8hb1.cjs +1 -0
- package/dist/{NumberFilter-vP38Wp6j.js → NumberFilter-Bz_NTdX9.js} +3 -3
- package/dist/NumberFilter-MAEojdk0.cjs +1 -0
- package/dist/PeriodFilter-CC4WgIhl.cjs +1 -0
- package/dist/{PeriodFilter-Ba1uYUnT.js → PeriodFilter-DX_wy9g-.js} +1 -1
- package/dist/SelectFilter-BR3fvl-a.cjs +1 -0
- package/dist/SelectFilter-xqiPtPgX.js +135 -0
- package/dist/{TextFilter-B84dpnoq.js → TextFilter-BBl3JFqK.js} +7 -7
- package/dist/TextFilter-CCfYFl5F.cjs +1 -0
- package/dist/apLightTheme-CFSRrjv2.cjs +1 -0
- package/dist/apLightTheme-D1P4jcD0.js +1231 -0
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +60 -60
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
- package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7501 -10095
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +21 -21
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +41 -41
- package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
- package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +108 -146
- package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +5 -5
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -16
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +8 -8
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +28 -506
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +28 -506
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +65 -85
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +627 -771
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +315 -402
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +112 -155
- package/dist/components/DatePicker/composables/index.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
- package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
- package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
- package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
- package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +4 -4
- package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
- package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
- package/dist/components/MonthPicker/MonthPicker.d.ts +86 -122
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +85 -121
- package/dist/components/NirField/NirField.d.ts +206 -270
- package/dist/components/NirField/locales.d.ts +10 -10
- package/dist/components/NirField/useNirValidation.d.ts +64 -0
- package/dist/components/PasswordField/PasswordField.d.ts +8 -9
- package/dist/components/PeriodField/PeriodField.d.ts +1352 -1640
- package/dist/components/PhoneField/PhoneField.d.ts +88 -124
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
- package/dist/components/SyTextArea/SyTextArea.d.ts +34 -14
- package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +9 -6
- package/dist/components/Tables/SyTable/SyTable.d.ts +9 -6
- package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
- package/dist/components/Tables/common/SyTablePagination.d.ts +17 -19
- package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
- package/dist/components/Tables/common/filters/locales.d.ts +0 -1
- package/dist/components/Tables/common/types.d.ts +19 -3
- package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
- package/dist/components/Tables/common/usePagination.d.ts +3 -1
- package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
- package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
- package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
- package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +6 -6
- package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
- package/dist/composables/rules/useFieldValidation.d.ts +4 -4
- package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
- package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
- package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
- package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
- package/dist/composables/validation/useFormValidation.d.ts +11 -2
- package/dist/composables/validation/useValidation.d.ts +15 -9
- package/dist/design-system-v3.d.ts +2 -0
- package/dist/design-system-v3.js +186 -187
- package/dist/design-system-v3.umd.cjs +1 -1066
- package/dist/{main-aLKwdMi1.js → main-BtTqyn4z.js} +16434 -15672
- package/dist/main-C1e3eoxd.cjs +1067 -0
- package/dist/main.d.ts +0 -1
- package/dist/synapse.css +1 -0
- package/dist/tooth-11-D3sLWv2n.cjs +1 -0
- package/dist/tooth-12-CXrLuH03.cjs +1 -0
- package/dist/tooth-13-BSfo5fpT.cjs +1 -0
- package/dist/tooth-14-DMzulx0h.cjs +1 -0
- package/dist/tooth-15-BKRFVi-9.cjs +1 -0
- package/dist/tooth-16-CpuxAbuM.cjs +1 -0
- package/dist/tooth-17-BPoahUdg.cjs +1 -0
- package/dist/tooth-18-DhHJz8sy.cjs +1 -0
- package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
- package/dist/tooth-22-C2Tn19sB.cjs +1 -0
- package/dist/tooth-23-C9uaaSGb.cjs +1 -0
- package/dist/tooth-24-BrK9UGpf.cjs +1 -0
- package/dist/tooth-25-CE_EfGNp.cjs +1 -0
- package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
- package/dist/tooth-27-C5J7JkWM.cjs +1 -0
- package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
- package/dist/tooth-31-BrYqmkTi.cjs +1 -0
- package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
- package/dist/tooth-33-DuxvqO2J.cjs +1 -0
- package/dist/tooth-34-BCSCXMB6.cjs +1 -0
- package/dist/tooth-35-BLUXkX88.cjs +1 -0
- package/dist/tooth-36-IrKHYqlA.cjs +1 -0
- package/dist/tooth-37-BYqpdMwo.cjs +1 -0
- package/dist/tooth-38-B_eNXXdu.cjs +1 -0
- package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
- package/dist/tooth-42-szcDqlM0.cjs +1 -0
- package/dist/tooth-43-B3ka6rQm.cjs +1 -0
- package/dist/tooth-44-CazyQucj.cjs +1 -0
- package/dist/tooth-45-B4HQtc8n.cjs +1 -0
- package/dist/tooth-46-BPM40gbG.cjs +1 -0
- package/dist/tooth-47-Dvr20dlh.cjs +1 -0
- package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
- package/dist/tooth-51-OBpwCOF3.cjs +1 -0
- package/dist/tooth-52-aKxyHcmq.cjs +1 -0
- package/dist/tooth-53-vCwJjTOc.cjs +1 -0
- package/dist/tooth-54-DsWu2iFy.cjs +1 -0
- package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
- package/dist/tooth-61-BbLvxMQi.cjs +1 -0
- package/dist/tooth-62-CmTkWczP.cjs +1 -0
- package/dist/tooth-63-DI7l_2qI.cjs +1 -0
- package/dist/tooth-64-B21sOsJh.cjs +1 -0
- package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
- package/dist/tooth-71-D473PPO5.cjs +1 -0
- package/dist/tooth-72-Drh1wnNu.cjs +1 -0
- package/dist/tooth-73-DzlwYI23.cjs +1 -0
- package/dist/tooth-74-8aGvcZPg.cjs +1 -0
- package/dist/tooth-75-BFK7At_r.cjs +1 -0
- package/dist/tooth-81-BZmR-I0M.cjs +1 -0
- package/dist/tooth-82-euVfUUZV.cjs +1 -0
- package/dist/tooth-83-KV010j64.cjs +1 -0
- package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
- package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
- package/dist/vuetifyConfig.js +561 -0
- package/dist/vuetifyConfig.umd.cjs +1 -0
- package/package.json +10 -4
- package/src/assets/overrides/_btns.scss +0 -6
- package/src/assets/overrides/_icons.scss +9 -1
- package/src/assets/overrides/_typography.scss +0 -10
- package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
- package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
- package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +12 -12
- package/src/components/ChipList/ChipList.stories.ts +0 -15
- package/src/components/ChipList/ChipList.vue +5 -1
- package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
- package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
- package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +0 -9
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +22 -5
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +143 -0
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +14 -10
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +8 -9
- package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
- package/src/components/Customs/Selects/SySelect/SySelect.vue +14 -11
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +54 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +16 -11
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +35 -0
- package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
- package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
- package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +29 -27
- package/src/components/Customs/SyTextField/SyTextField.vue +154 -157
- package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +32 -0
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +120 -11
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +330 -223
- package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +195 -159
- package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +10 -10
- package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
- package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
- package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
- package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
- package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +63 -57
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
- package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
- package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
- package/src/components/DatePicker/composables/index.ts +1 -0
- package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
- package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
- package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
- package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
- package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
- package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
- package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
- package/src/components/DatePicker/composables/useDateTextField.ts +7 -6
- package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
- package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
- package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
- package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
- package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
- package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
- package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
- package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
- package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
- package/src/components/MonthPicker/tests/MonthPicker.spec.ts +2 -1
- package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +7 -7
- package/src/components/NirField/NirField.stories.ts +4 -0
- package/src/components/NirField/NirField.vue +64 -260
- package/src/components/NirField/accessibilite/Accessibility.mdx +2 -2
- package/src/components/NirField/locales.ts +1 -1
- package/src/components/NirField/tests/NirField.spec.ts +6 -0
- package/src/components/NirField/useNirValidation.ts +271 -0
- package/src/components/PasswordField/PasswordField.stories.ts +4 -4
- package/src/components/PasswordField/PasswordField.vue +18 -24
- package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
- package/src/components/PeriodField/PeriodField.stories.ts +4 -4
- package/src/components/PeriodField/PeriodField.vue +57 -57
- package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
- package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
- package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
- package/src/components/PhoneField/PhoneField.vue +5 -6
- package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
- package/src/components/RangeField/RangeField.vue +6 -0
- package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
- package/src/components/SyTextArea/SyTextArea.vue +53 -23
- package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
- package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
- package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +673 -1
- package/src/components/Tables/SyServerTable/SyServerTable.vue +148 -91
- package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +58 -0
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +122 -0
- package/src/components/Tables/SyTable/SyTable.mdx +25 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +452 -1
- package/src/components/Tables/SyTable/SyTable.vue +130 -56
- package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +57 -0
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +108 -0
- package/src/components/Tables/common/SyTableFilter.vue +22 -2
- package/src/components/Tables/common/TableHeader.vue +5 -1
- package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
- package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
- package/src/components/Tables/common/filters/SelectFilter.vue +10 -11
- package/src/components/Tables/common/filters/TextFilter.vue +1 -1
- package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
- package/src/components/Tables/common/filters/locales.ts +0 -1
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
- package/src/components/Tables/common/tableFilterUtils.ts +3 -0
- package/src/components/Tables/common/tableStyles.scss +48 -4
- package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
- package/src/components/Tables/common/types.ts +13 -4
- package/src/components/Tables/common/useClickableTableRow.ts +103 -0
- package/src/components/Tables/common/usePagination.ts +13 -0
- package/src/components/Tables/common/usePinnedColumns.ts +237 -0
- package/src/components/Tables/common/useTableHeaders.ts +3 -3
- package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
- package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
- package/src/composables/date/useDatePickerAccessibility.ts +42 -207
- package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
- package/src/composables/rules/useFieldValidation.ts +34 -17
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
- package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
- package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
- package/src/composables/unifyValidation/useValidation.ts +190 -0
- package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
- package/src/composables/useFormFieldErrorHandling.ts +4 -7
- package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
- package/src/composables/validation/tests/useValidation.spec.ts +116 -21
- package/src/composables/validation/useFormValidation.ts +20 -13
- package/src/composables/validation/useValidatable.ts +8 -1
- package/src/composables/validation/useValidation.ts +135 -99
- package/src/composantsVuetify/Introduction.mdx +48 -0
- package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
- package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
- package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
- package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
- package/src/designTokens/tokens/cnam/cnamSemantic.ts +2 -2
- package/src/main.ts +0 -2
- package/src/stories/Components/Components.stories.ts +74 -9
- package/src/stories/Demarrer/Accueil.stories.ts +3 -3
- package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
- package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
- package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
- package/dist/SelectFilter-BioGT6Nn.js +0 -136
- package/dist/style.css +0 -1
- package/src/components/DatePicker/Accessibilite.mdx +0 -14
|
@@ -1,12 +1,72 @@
|
|
|
1
|
-
import { Meta, Story } from '@storybook/addon-docs'
|
|
2
|
-
import * as Stories from '../PeriodField.stories.ts'
|
|
3
|
-
import '@/
|
|
1
|
+
import { Meta, Story } from '@storybook/addon-docs'
|
|
2
|
+
import * as Stories from '../PeriodField.stories.ts'
|
|
3
|
+
import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg'
|
|
4
|
+
import '@/stories/styles/shared.css'
|
|
5
|
+
import {
|
|
6
|
+
AccessibilityGuideLayout,
|
|
7
|
+
CriteriaSection,
|
|
8
|
+
CriteriaCard,
|
|
9
|
+
DemoSection,
|
|
10
|
+
BestPracticesSection,
|
|
11
|
+
ResourcesSection,
|
|
12
|
+
} from '@/stories/accessibility/AccessibilityGuideLayout.mdx'
|
|
4
13
|
|
|
5
14
|
<Meta of={Stories} />
|
|
6
15
|
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
16
|
+
<AccessibilityGuideLayout
|
|
17
|
+
componentName="PeriodField"
|
|
18
|
+
iconSrc={AccessibilityIcon}
|
|
19
|
+
>
|
|
20
|
+
<CriteriaSection>
|
|
21
|
+
<CriteriaCard title="Structure sémantique" icon="🔍">
|
|
22
|
+
<ul>
|
|
23
|
+
<li><strong>Rôles</strong> : Deux inputs avec <code>aria-required</code> synchronisé quand <code>required</code>.</li>
|
|
24
|
+
<li><strong>Association</strong> : Labels natifs pour chaque champ (date de début/fin) avec placeholders distinctifs "Début"/"Fin".</li>
|
|
25
|
+
<li><strong>Descriptions</strong> : <code>aria-describedby</code> relie aides contextuelles, messages de validation croisée (début ≤ fin).</li>
|
|
26
|
+
<li><strong>États</strong> : <code>aria-invalid</code>, <code>aria-disabled</code>, <code>aria-readonly</code> sur chaque champ indiquent validation et props.</li>
|
|
27
|
+
</ul>
|
|
28
|
+
</CriteriaCard>
|
|
11
29
|
|
|
12
|
-
<
|
|
30
|
+
<CriteriaCard title="Saisie et clavier" icon="⌨️">
|
|
31
|
+
<ul>
|
|
32
|
+
<li><strong>Tab</strong> : Navigation séquentielle entre les deux champs sans piège de focus.</li>
|
|
33
|
+
<li><strong>Masque automatique</strong> : Formatage automatique des séparateurs sans bloquer la saisie ni les raccourcis clavier.</li>
|
|
34
|
+
<li><strong>Raccourcis</strong> : <kbd>Ctrl/C</kbd> fonctionnel sur chaque champ.</li>
|
|
35
|
+
<li><strong>Calendrier optionnel</strong> : Icône calendrier active un DatePicker accessible avec navigation clavier complète.</li>
|
|
36
|
+
<li><strong>Lecture seule</strong> : Désactive validation et effacement, icônes décoratives non interactives.</li>
|
|
37
|
+
</ul>
|
|
38
|
+
</CriteriaCard>
|
|
39
|
+
|
|
40
|
+
<CriteriaCard title="Validation croisée" icon="📣">
|
|
41
|
+
<ul>
|
|
42
|
+
<li><strong>Cohérence période</strong> : Validation automatique que début ≤ fin avec messages d'erreur croisés.</li>
|
|
43
|
+
<li><strong>Champs requis</strong> : Si required, les deux champs doivent être remplis ou aucun (logique flexible).</li>
|
|
44
|
+
<li><strong>Messages contextualisés</strong> : Erreurs/avertissements/succès sous chaque champ (associés via <code>aria-describedby</code>).</li>
|
|
45
|
+
<li><strong>Validation personnalisée</strong> : <code>customRules</code> / <code>customWarningRules</code> par champ.</li>
|
|
46
|
+
</ul>
|
|
47
|
+
</CriteriaCard>
|
|
48
|
+
|
|
49
|
+
<CriteriaCard title="Calendrier intégré" icon="📅">
|
|
50
|
+
<ul>
|
|
51
|
+
<li><strong>Icône accessible</strong> : Bouton avec <code>aria-label</code> explicite ("Ouvrir le calendrier"). Les attributs <code>aria-expanded</code> et <code>aria-haspopup</code> ne sont pas appliqués directement sur les champs textes pour respecter leur rôle natif.</li>
|
|
52
|
+
<li><strong>Navigation calendrier</strong> : Flèches, Home/End, PageUp/Down, Entrée/Espace pour sélectionner dates.</li>
|
|
53
|
+
<li><strong>Focus management</strong> : Retour automatique au champ après sélection dans calendrier.</li>
|
|
54
|
+
<li><strong>Format cohérent</strong> : Date sélectionnée respecte le format configuré (DD/MM/YYYY par défaut).</li>
|
|
55
|
+
</ul>
|
|
56
|
+
</CriteriaCard>
|
|
57
|
+
</CriteriaSection>
|
|
58
|
+
|
|
59
|
+
<DemoSection title="Période par défaut">
|
|
60
|
+
<Story of={Stories.Default} />
|
|
61
|
+
</DemoSection>
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
<BestPracticesSection>
|
|
65
|
+
- Utiliser des placeholders distinctifs ("Début"/"Fin") et des labels clairs pour chaque champ.
|
|
66
|
+
- Afficher un hint persistant expliquant le format attendu et la logique de validation croisée.
|
|
67
|
+
- En mode requis, clarifier que les deux champs doivent être remplis ou aucun selon le cas d'usage.
|
|
68
|
+
- Conserver l'icône calendrier décorative mais non interactive en mode lecture seule ou désactivé.
|
|
69
|
+
- Avec validation personnalisée, synchroniser les messages entre les deux champs pour cohérence.
|
|
70
|
+
- Tester la navigation clavier entre les champs et l'interaction calendrier si activé.
|
|
71
|
+
</BestPracticesSection>
|
|
72
|
+
</AccessibilityGuideLayout>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { DOMWrapper, mount, VueWrapper } from '@vue/test-utils'
|
|
1
|
+
import { DOMWrapper, flushPromises, mount, VueWrapper } from '@vue/test-utils'
|
|
2
2
|
import { describe, it, expect } from 'vitest'
|
|
3
|
-
import type
|
|
3
|
+
import { nextTick, type ComponentPublicInstance } from 'vue'
|
|
4
4
|
|
|
5
5
|
import PeriodField from '../PeriodField.vue'
|
|
6
6
|
import DatePicker from '@/components/DatePicker/CalendarMode/DatePicker.vue'
|
|
@@ -116,6 +116,32 @@ describe('PeriodField.vue', () => {
|
|
|
116
116
|
expect(wrapper.vm.isValid).toBe(false)
|
|
117
117
|
})
|
|
118
118
|
|
|
119
|
+
it('shows error when from date is after to date when updated', async () => {
|
|
120
|
+
const wrapper = mount(PeriodField, {
|
|
121
|
+
props: {
|
|
122
|
+
modelValue: { from: '2024-01-01', to: '2024-01-31' },
|
|
123
|
+
},
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
// Find both DatePicker components
|
|
127
|
+
const datePickers = wrapper.findAllComponents({ name: 'DatePicker' })
|
|
128
|
+
expect(datePickers.length).toBe(2)
|
|
129
|
+
|
|
130
|
+
const fromInput = datePickers[0]!.find('input')
|
|
131
|
+
await fromInput.setValue('15/01/2024')
|
|
132
|
+
await fromInput.trigger('blur')
|
|
133
|
+
await flushPromises()
|
|
134
|
+
|
|
135
|
+
const toInput = datePickers[1]!.find('input')
|
|
136
|
+
await toInput.setValue('10/01/2024')
|
|
137
|
+
await toInput.trigger('blur')
|
|
138
|
+
await flushPromises()
|
|
139
|
+
await nextTick()
|
|
140
|
+
|
|
141
|
+
expect(datePickers[0]?.text()).toContain('date de début ne peut pas être supérieure à la date de fin')
|
|
142
|
+
expect(datePickers[1]?.text()).toContain('La date de fin ne peut pas être inférieure à la date de début')
|
|
143
|
+
})
|
|
144
|
+
|
|
119
145
|
it('validates when required and both dates are missing', async () => {
|
|
120
146
|
const wrapper = mount(PeriodField, {
|
|
121
147
|
props: {
|
|
@@ -300,7 +300,6 @@
|
|
|
300
300
|
})
|
|
301
301
|
|
|
302
302
|
const validation = useValidation({
|
|
303
|
-
customRules: validationRules.value,
|
|
304
303
|
showSuccessMessages: true,
|
|
305
304
|
disableErrorHandling: shouldDisableErrorHandling.value,
|
|
306
305
|
})
|
|
@@ -332,9 +331,9 @@
|
|
|
332
331
|
|
|
333
332
|
const showHelpTextBelow = computed(() => !!props.helpText?.trim())
|
|
334
333
|
|
|
335
|
-
const runValidation = (): void => {
|
|
334
|
+
const runValidation = async (): Promise<void> => {
|
|
336
335
|
const cleanedValue = phoneNumber.value.replace(/\s/g, '')
|
|
337
|
-
validation.validateField(cleanedValue, validationRules.value)
|
|
336
|
+
await validation.validateField(cleanedValue, validationRules.value)
|
|
338
337
|
}
|
|
339
338
|
|
|
340
339
|
function validateInputOnBlur() {
|
|
@@ -346,13 +345,13 @@
|
|
|
346
345
|
runValidation()
|
|
347
346
|
}
|
|
348
347
|
|
|
349
|
-
watch(phoneNumber, (newValue) => {
|
|
348
|
+
watch(phoneNumber, async (newValue) => {
|
|
350
349
|
if (shouldDisableErrorHandling.value) return
|
|
351
350
|
|
|
352
351
|
if (!props.isValidatedOnBlur) {
|
|
353
352
|
// Validation en temps réel (isValidatedOnBlur=false)
|
|
354
353
|
const cleanedValue = newValue.replace(/\s/g, '')
|
|
355
|
-
validation.validateField(cleanedValue, validationRules.value)
|
|
354
|
+
await validation.validateField(cleanedValue, validationRules.value)
|
|
356
355
|
}
|
|
357
356
|
else if (onBlur.value) {
|
|
358
357
|
// Après un premier blur, effacer les erreurs pendant la frappe —
|
|
@@ -377,7 +376,7 @@
|
|
|
377
376
|
}
|
|
378
377
|
|
|
379
378
|
onBlur.value = true
|
|
380
|
-
runValidation()
|
|
379
|
+
await runValidation()
|
|
381
380
|
|
|
382
381
|
if (props.withCountryCode && props.countryCodeRequired && !dialCode.value) {
|
|
383
382
|
validation.errors.value.push(`Le champ ${locales.indicatifLabel} est requis.`)
|
|
@@ -9,11 +9,11 @@ const meta = {
|
|
|
9
9
|
parameters: {
|
|
10
10
|
docs: {
|
|
11
11
|
controls: {
|
|
12
|
-
exclude: ['
|
|
12
|
+
exclude: ['validateOn', 'update:modelValue', 'onUpdate:modelValue'],
|
|
13
13
|
},
|
|
14
14
|
},
|
|
15
15
|
controls: {
|
|
16
|
-
exclude: ['
|
|
16
|
+
exclude: ['validateOn', 'onUpdate:modelValue'],
|
|
17
17
|
},
|
|
18
18
|
},
|
|
19
19
|
argTypes: {
|
|
@@ -89,6 +89,142 @@ const meta = {
|
|
|
89
89
|
table: {
|
|
90
90
|
type: { summary: 'boolean' },
|
|
91
91
|
defaultValue: { summary: 'false' },
|
|
92
|
+
category: 'validation',
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
rules: {
|
|
96
|
+
control: { type: 'object' },
|
|
97
|
+
description: 'Règles de validation Vuetify (mode useVuetifyValidation=true)',
|
|
98
|
+
table: {
|
|
99
|
+
type: { summary: 'Array<(value: string) => boolean | string>' },
|
|
100
|
+
defaultValue: { summary: '[]' },
|
|
101
|
+
category: 'validation',
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
useVuetifyValidation: {
|
|
105
|
+
control: { type: 'boolean' },
|
|
106
|
+
description: 'Active la validation Vuetify (sinon validation unifiée customRules)',
|
|
107
|
+
table: {
|
|
108
|
+
type: { summary: 'boolean' },
|
|
109
|
+
defaultValue: { summary: 'false' },
|
|
110
|
+
category: 'validation',
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
isValidateOnBlur: {
|
|
114
|
+
control: { type: 'boolean' },
|
|
115
|
+
description: 'Déclenche la validation au blur (sinon à la saisie)',
|
|
116
|
+
table: {
|
|
117
|
+
type: { summary: 'boolean' },
|
|
118
|
+
defaultValue: { summary: 'true' },
|
|
119
|
+
category: 'validation',
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
disableErrorHandling: {
|
|
123
|
+
control: { type: 'boolean' },
|
|
124
|
+
description: 'Désactive la gestion des messages d\'erreur/alerte/succès',
|
|
125
|
+
table: {
|
|
126
|
+
type: { summary: 'boolean' },
|
|
127
|
+
defaultValue: { summary: 'false' },
|
|
128
|
+
category: 'validation',
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
showSuccessMessages: {
|
|
132
|
+
control: { type: 'boolean' },
|
|
133
|
+
description: 'Affiche les messages de succès',
|
|
134
|
+
table: {
|
|
135
|
+
type: { summary: 'boolean' },
|
|
136
|
+
defaultValue: { summary: 'true' },
|
|
137
|
+
category: 'validation',
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
customRules: {
|
|
141
|
+
control: { type: 'object' },
|
|
142
|
+
description: 'Règles d\'erreur pour le mode validation unifiée',
|
|
143
|
+
table: {
|
|
144
|
+
type: { summary: 'ValidationRule[]' },
|
|
145
|
+
defaultValue: { summary: '[]' },
|
|
146
|
+
category: 'validation',
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
customWarningRules: {
|
|
150
|
+
control: { type: 'object' },
|
|
151
|
+
description: 'Règles d\'alerte pour le mode validation unifiée',
|
|
152
|
+
table: {
|
|
153
|
+
type: { summary: 'ValidationRule[]' },
|
|
154
|
+
defaultValue: { summary: '[]' },
|
|
155
|
+
category: 'validation',
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
customSuccessRules: {
|
|
159
|
+
control: { type: 'object' },
|
|
160
|
+
description: 'Règles de succès pour le mode validation unifiée',
|
|
161
|
+
table: {
|
|
162
|
+
type: { summary: 'ValidationRule[]' },
|
|
163
|
+
defaultValue: { summary: '[]' },
|
|
164
|
+
category: 'validation',
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
errorMessages: {
|
|
168
|
+
control: { type: 'object' },
|
|
169
|
+
description: 'Messages d\'erreur externes ajoutés au résultat de validation',
|
|
170
|
+
table: {
|
|
171
|
+
type: { summary: 'string[] | null' },
|
|
172
|
+
defaultValue: { summary: 'null' },
|
|
173
|
+
category: 'validation',
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
warningMessages: {
|
|
177
|
+
control: { type: 'object' },
|
|
178
|
+
description: 'Messages d\'alerte externes ajoutés au résultat de validation',
|
|
179
|
+
table: {
|
|
180
|
+
type: { summary: 'string[] | null' },
|
|
181
|
+
defaultValue: { summary: 'null' },
|
|
182
|
+
category: 'validation',
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
successMessages: {
|
|
186
|
+
control: { type: 'object' },
|
|
187
|
+
description: 'Messages de succès externes ajoutés au résultat de validation',
|
|
188
|
+
table: {
|
|
189
|
+
type: { summary: 'string[] | null' },
|
|
190
|
+
defaultValue: { summary: 'null' },
|
|
191
|
+
category: 'validation',
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
hasError: {
|
|
195
|
+
control: { type: 'boolean' },
|
|
196
|
+
description: 'Force l\'état erreur',
|
|
197
|
+
table: {
|
|
198
|
+
type: { summary: 'boolean' },
|
|
199
|
+
defaultValue: { summary: 'false' },
|
|
200
|
+
category: 'validation',
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
hasWarning: {
|
|
204
|
+
control: { type: 'boolean' },
|
|
205
|
+
description: 'Force l\'état alerte',
|
|
206
|
+
table: {
|
|
207
|
+
type: { summary: 'boolean' },
|
|
208
|
+
defaultValue: { summary: 'false' },
|
|
209
|
+
category: 'validation',
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
hasSuccess: {
|
|
213
|
+
control: { type: 'boolean' },
|
|
214
|
+
description: 'Force l\'état succès',
|
|
215
|
+
table: {
|
|
216
|
+
type: { summary: 'boolean' },
|
|
217
|
+
defaultValue: { summary: 'false' },
|
|
218
|
+
category: 'validation',
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
maxErrors: {
|
|
222
|
+
control: { type: 'number' },
|
|
223
|
+
description: 'Nombre maximum de messages d\'erreur affichés',
|
|
224
|
+
table: {
|
|
225
|
+
type: { summary: 'number' },
|
|
226
|
+
defaultValue: { summary: '1' },
|
|
227
|
+
category: 'validation',
|
|
92
228
|
},
|
|
93
229
|
},
|
|
94
230
|
},
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed, ref, toRef, watch } from 'vue'
|
|
3
3
|
import type { VTextarea } from 'vuetify/components'
|
|
4
|
-
import { locales } from './locales'
|
|
5
4
|
import useTextActions from './useTextActions'
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import { useDefaultValidationRules, type TextareaRule as Rule } from './useDefaultValidationRules'
|
|
6
|
+
import { useValidation, validationPropsDefaults, type FieldValidationProps } from '@/composables/unifyValidation/useValidation'
|
|
7
|
+
import type { ValidationRule as SyValidationRule } from '@/composables/validation/useValidation'
|
|
8
8
|
|
|
9
9
|
const props = withDefaults(defineProps<{
|
|
10
10
|
modelValue?: string
|
|
@@ -20,12 +20,11 @@
|
|
|
20
20
|
color?: string
|
|
21
21
|
label: string
|
|
22
22
|
bgColor?: string
|
|
23
|
-
}>(), {
|
|
23
|
+
} & FieldValidationProps>(), {
|
|
24
24
|
modelValue: '',
|
|
25
25
|
trim: false,
|
|
26
26
|
replaceTabs: undefined,
|
|
27
27
|
rules: () => [],
|
|
28
|
-
required: false,
|
|
29
28
|
maxLines: undefined,
|
|
30
29
|
autoWrap: undefined,
|
|
31
30
|
normalize: false,
|
|
@@ -33,6 +32,7 @@
|
|
|
33
32
|
variant: 'outlined',
|
|
34
33
|
color: 'primary',
|
|
35
34
|
bgColor: 'white',
|
|
35
|
+
...validationPropsDefaults,
|
|
36
36
|
})
|
|
37
37
|
|
|
38
38
|
const emits = defineEmits<{
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
const textAreaRef = ref<VTextarea | null>(null)
|
|
43
43
|
const hasInteracted = ref(false)
|
|
44
|
+
const focused = ref(false)
|
|
44
45
|
|
|
45
46
|
const internalValue = ref(props.modelValue)
|
|
46
47
|
watch(
|
|
@@ -87,25 +88,48 @@
|
|
|
87
88
|
internalValue.value = value
|
|
88
89
|
}
|
|
89
90
|
|
|
90
|
-
const
|
|
91
|
-
|
|
91
|
+
const { vuetifyRules: defaultVuetifyRules, customRules: defaultCustomRules } = useDefaultValidationRules({
|
|
92
|
+
required: toRef(props, 'required'),
|
|
93
|
+
maxLines: toRef(props, 'maxLines'),
|
|
94
|
+
hasInteracted,
|
|
95
|
+
})
|
|
92
96
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
return true
|
|
98
|
-
})
|
|
97
|
+
const mergedCustomRules = computed<SyValidationRule[]>(() => [
|
|
98
|
+
...defaultCustomRules.value,
|
|
99
|
+
...(props.customRules || []),
|
|
100
|
+
])
|
|
99
101
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
102
|
+
const mergedVuetifyRules = computed<Rule[]>(() => [
|
|
103
|
+
...(props.rules || []),
|
|
104
|
+
...defaultVuetifyRules.value,
|
|
105
|
+
])
|
|
106
|
+
|
|
107
|
+
const { validate, errors, warnings, successes, hasError, hasWarning, hasSuccess } = useValidation({
|
|
108
|
+
modelValue: internalValue,
|
|
109
|
+
readonly: toRef(props, 'readonly'),
|
|
110
|
+
disabled: toRef(props, 'disabled'),
|
|
111
|
+
required: toRef(props, 'required'),
|
|
112
|
+
isValidateOnBlur: toRef(props, 'isValidateOnBlur'),
|
|
113
|
+
showSuccessMessages: toRef(props, 'showSuccessMessages'),
|
|
114
|
+
disableErrorHandling: toRef(props, 'disableErrorHandling'),
|
|
115
|
+
useVuetifyValidation: toRef(props, 'useVuetifyValidation'),
|
|
116
|
+
label: toRef(props, 'label'),
|
|
117
|
+
rules: mergedVuetifyRules,
|
|
118
|
+
customRules: mergedCustomRules,
|
|
119
|
+
customWarningRules: toRef(props, 'customWarningRules'),
|
|
120
|
+
customSuccessRules: toRef(props, 'customSuccessRules'),
|
|
121
|
+
errorMessages: toRef(props, 'errorMessages'),
|
|
122
|
+
warningMessages: toRef(props, 'warningMessages'),
|
|
123
|
+
successMessages: toRef(props, 'successMessages'),
|
|
124
|
+
hasErrorProp: toRef(props, 'hasError'),
|
|
125
|
+
hasWarningProp: toRef(props, 'hasWarning'),
|
|
126
|
+
hasSuccessProp: toRef(props, 'hasSuccess'),
|
|
127
|
+
maxErrors: toRef(props, 'maxErrors'),
|
|
128
|
+
focused,
|
|
129
|
+
})
|
|
107
130
|
|
|
108
|
-
|
|
131
|
+
defineExpose({
|
|
132
|
+
validateOnSubmit: validate,
|
|
109
133
|
})
|
|
110
134
|
|
|
111
135
|
</script>
|
|
@@ -117,13 +141,19 @@
|
|
|
117
141
|
:variant="variant"
|
|
118
142
|
:color="color"
|
|
119
143
|
:bg-color="props.bgColor"
|
|
144
|
+
:error="hasError"
|
|
145
|
+
:error-messages="errors"
|
|
146
|
+
:messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess && props.showSuccessMessages ? successes : []))"
|
|
147
|
+
:max-errors="props.maxErrors"
|
|
148
|
+
:disabled="props.disabled"
|
|
149
|
+
:readonly="props.readonly"
|
|
120
150
|
:validate-on="validateOn"
|
|
121
|
-
:rules="
|
|
151
|
+
:rules="props.useVuetifyValidation ? mergedVuetifyRules : undefined"
|
|
122
152
|
:label="label"
|
|
123
153
|
:aria-label="label"
|
|
124
154
|
:required="required"
|
|
125
155
|
:aria-required="required ? 'true' : undefined"
|
|
126
156
|
@update:model-value="execValueChange"
|
|
127
|
-
@update:focused="(e: boolean) => !e
|
|
157
|
+
@update:focused="(e: boolean) => { focused = e; if (!e) execBlurChange() }"
|
|
128
158
|
/>
|
|
129
159
|
</template>
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { it, describe, expect } from 'vitest'
|
|
2
|
-
import { mount } from '@vue/test-utils'
|
|
3
|
-
import { nextTick } from 'vue'
|
|
2
|
+
import { flushPromises, mount } from '@vue/test-utils'
|
|
4
3
|
import SyTextArea from '../SyTextArea.vue'
|
|
5
4
|
|
|
6
5
|
describe('SyTextArea', () => {
|
|
@@ -126,11 +125,16 @@ describe('SyTextArea', () => {
|
|
|
126
125
|
},
|
|
127
126
|
})
|
|
128
127
|
const textarea = wrapper.find('textarea')
|
|
128
|
+
await textarea.trigger('focus')
|
|
129
129
|
await textarea.setValue('content\ncontent\ncontent\ncontent\ncontent\ncontent')
|
|
130
|
+
await textarea.trigger('blur')
|
|
131
|
+
|
|
130
132
|
expect(wrapper.text()).toContain('Ce champ ne peut pas dépasser 5 lignes')
|
|
131
133
|
|
|
134
|
+
await textarea.trigger('focus')
|
|
132
135
|
await textarea.setValue('content\ncontent\ncontent\ncontent\ncontent')
|
|
133
|
-
await
|
|
136
|
+
await textarea.trigger('blur')
|
|
137
|
+
|
|
134
138
|
expect(wrapper.text()).not.toContain('Ce champ ne peut pas dépasser 5 lignes')
|
|
135
139
|
})
|
|
136
140
|
|
|
@@ -201,4 +205,123 @@ describe('SyTextArea', () => {
|
|
|
201
205
|
|
|
202
206
|
expect(textarea.element.value).toBe('new value')
|
|
203
207
|
})
|
|
208
|
+
|
|
209
|
+
it('shows custom error from customRules in custom validation mode', async () => {
|
|
210
|
+
const wrapper = mount(SyTextArea, {
|
|
211
|
+
props: {
|
|
212
|
+
modelValue: '',
|
|
213
|
+
label: 'Description des symptomes',
|
|
214
|
+
isValidateOnBlur: false,
|
|
215
|
+
customRules: [
|
|
216
|
+
{
|
|
217
|
+
type: 'custom',
|
|
218
|
+
options: {
|
|
219
|
+
validate: (value: string) => value.includes('ok'),
|
|
220
|
+
message: 'Le texte doit contenir ok',
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
},
|
|
225
|
+
})
|
|
226
|
+
|
|
227
|
+
const textarea = wrapper.find('textarea')
|
|
228
|
+
await textarea.trigger('focus')
|
|
229
|
+
await textarea.setValue('test')
|
|
230
|
+
await textarea.trigger('blur')
|
|
231
|
+
await flushPromises()
|
|
232
|
+
|
|
233
|
+
const isValid = await (wrapper.vm as { validateOnSubmit: () => Promise<boolean> }).validateOnSubmit()
|
|
234
|
+
expect(isValid).toBe(false)
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
it('shows vuetify rule error when useVuetifyValidation is true', async () => {
|
|
238
|
+
const wrapper = mount(SyTextArea, {
|
|
239
|
+
props: {
|
|
240
|
+
modelValue: '',
|
|
241
|
+
label: 'Description des symptomes',
|
|
242
|
+
useVuetifyValidation: true,
|
|
243
|
+
rules: [
|
|
244
|
+
(value: string) => value.includes('ok') || 'Erreur Vuetify personnalisée',
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
const textarea = wrapper.find('textarea')
|
|
250
|
+
await textarea.trigger('focus')
|
|
251
|
+
await textarea.setValue('test')
|
|
252
|
+
await textarea.trigger('blur')
|
|
253
|
+
await flushPromises()
|
|
254
|
+
|
|
255
|
+
expect(wrapper.text()).toContain('Erreur Vuetify personnalisée')
|
|
256
|
+
})
|
|
257
|
+
|
|
258
|
+
it('shows custom warning from customWarningRules in custom validation mode', async () => {
|
|
259
|
+
const wrapper = mount(SyTextArea, {
|
|
260
|
+
props: {
|
|
261
|
+
modelValue: '',
|
|
262
|
+
label: 'Description des symptomes',
|
|
263
|
+
isValidateOnBlur: false,
|
|
264
|
+
customRules: [
|
|
265
|
+
{
|
|
266
|
+
type: 'custom',
|
|
267
|
+
options: {
|
|
268
|
+
validate: () => true,
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
],
|
|
272
|
+
customWarningRules: [
|
|
273
|
+
{
|
|
274
|
+
type: 'custom',
|
|
275
|
+
options: {
|
|
276
|
+
warningMessage: 'Avertissement personnalisé',
|
|
277
|
+
validate: () => false,
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
],
|
|
281
|
+
},
|
|
282
|
+
})
|
|
283
|
+
|
|
284
|
+
const textarea = wrapper.find('textarea')
|
|
285
|
+
await textarea.trigger('focus')
|
|
286
|
+
await textarea.setValue('valeur')
|
|
287
|
+
await textarea.trigger('blur')
|
|
288
|
+
await flushPromises()
|
|
289
|
+
|
|
290
|
+
expect(wrapper.text()).toContain('Avertissement personnalisé')
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
it('shows custom success from customSuccessRules in custom validation mode', async () => {
|
|
294
|
+
const wrapper = mount(SyTextArea, {
|
|
295
|
+
props: {
|
|
296
|
+
modelValue: '',
|
|
297
|
+
label: 'Description des symptomes',
|
|
298
|
+
isValidateOnBlur: false,
|
|
299
|
+
customRules: [
|
|
300
|
+
{
|
|
301
|
+
type: 'custom',
|
|
302
|
+
options: {
|
|
303
|
+
validate: () => true,
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
],
|
|
307
|
+
customSuccessRules: [
|
|
308
|
+
{
|
|
309
|
+
type: 'custom',
|
|
310
|
+
options: {
|
|
311
|
+
successMessage: 'Succès personnalisé',
|
|
312
|
+
validate: () => true,
|
|
313
|
+
},
|
|
314
|
+
},
|
|
315
|
+
],
|
|
316
|
+
},
|
|
317
|
+
})
|
|
318
|
+
|
|
319
|
+
const textarea = wrapper.find('textarea')
|
|
320
|
+
await textarea.trigger('focus')
|
|
321
|
+
await textarea.setValue('valeur')
|
|
322
|
+
await textarea.trigger('blur')
|
|
323
|
+
await flushPromises()
|
|
324
|
+
|
|
325
|
+
expect(wrapper.text()).toContain('Succès personnalisé')
|
|
326
|
+
})
|
|
204
327
|
})
|