@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
|
@@ -183,6 +183,149 @@ describe('SyAutocomplete', () => {
|
|
|
183
183
|
expect(wrapper.emitted('update:modelValue')?.[0]).toEqual([null])
|
|
184
184
|
})
|
|
185
185
|
|
|
186
|
+
it('removes chip when Enter key is pressed on chip close button', async () => {
|
|
187
|
+
wrapper.unmount()
|
|
188
|
+
wrapper = mount(SyAutocomplete, {
|
|
189
|
+
props: {
|
|
190
|
+
modelValue: [items[0]!, items[1]!],
|
|
191
|
+
items,
|
|
192
|
+
multiple: true,
|
|
193
|
+
chips: true,
|
|
194
|
+
returnObject: true,
|
|
195
|
+
label: 'Test Chips Keyboard',
|
|
196
|
+
textKey: 'text',
|
|
197
|
+
valueKey: 'value',
|
|
198
|
+
},
|
|
199
|
+
attachTo: document.body,
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
await wrapper.vm.$nextTick()
|
|
203
|
+
const closeBtn = wrapper.find('.v-chip__close')
|
|
204
|
+
closeBtn.element.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, cancelable: true }))
|
|
205
|
+
await flushPromises()
|
|
206
|
+
await wrapper.vm.$nextTick()
|
|
207
|
+
|
|
208
|
+
expect(wrapper.emitted('update:modelValue')).toBeTruthy()
|
|
209
|
+
// First item was removed — remaining is [items[1]]
|
|
210
|
+
const emitted = wrapper.emitted('update:modelValue')?.[0]?.[0] as unknown[]
|
|
211
|
+
expect(emitted).toHaveLength(1)
|
|
212
|
+
expect((emitted[0] as { value: string }).value).toBe('2')
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
it('removes chip when Space key is pressed on chip close button', async () => {
|
|
216
|
+
wrapper.unmount()
|
|
217
|
+
wrapper = mount(SyAutocomplete, {
|
|
218
|
+
props: {
|
|
219
|
+
modelValue: [items[0]!, items[1]!],
|
|
220
|
+
items,
|
|
221
|
+
multiple: true,
|
|
222
|
+
chips: true,
|
|
223
|
+
returnObject: true,
|
|
224
|
+
label: 'Test Chips Space',
|
|
225
|
+
textKey: 'text',
|
|
226
|
+
valueKey: 'value',
|
|
227
|
+
},
|
|
228
|
+
attachTo: document.body,
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
await wrapper.vm.$nextTick()
|
|
232
|
+
const closeBtn = wrapper.find('.v-chip__close')
|
|
233
|
+
closeBtn.element.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true, cancelable: true }))
|
|
234
|
+
await flushPromises()
|
|
235
|
+
await wrapper.vm.$nextTick()
|
|
236
|
+
|
|
237
|
+
expect(wrapper.emitted('update:modelValue')).toBeTruthy()
|
|
238
|
+
const emitted = wrapper.emitted('update:modelValue')?.[0]?.[0] as unknown[]
|
|
239
|
+
expect(emitted).toHaveLength(1)
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
it('does not open menu when modelValue is set programmatically (suppressMenuOpen)', async () => {
|
|
243
|
+
// Menu must be closed initially
|
|
244
|
+
expect(isMenuOverlayActive()).toBe(false)
|
|
245
|
+
|
|
246
|
+
// Programmatic update (e.g., filter reset sets a value) should NOT open the menu
|
|
247
|
+
await wrapper.setProps({ modelValue: items[0] })
|
|
248
|
+
await flushPromises()
|
|
249
|
+
await wrapper.vm.$nextTick()
|
|
250
|
+
|
|
251
|
+
expect(isMenuOverlayActive()).toBe(false)
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
it('keeps menu open when blur target is a chip (checkErrorOnBlur)', async () => {
|
|
255
|
+
wrapper.unmount()
|
|
256
|
+
wrapper = mount(SyAutocomplete, {
|
|
257
|
+
props: {
|
|
258
|
+
modelValue: ['1'],
|
|
259
|
+
items,
|
|
260
|
+
multiple: true,
|
|
261
|
+
chips: true,
|
|
262
|
+
label: 'Test blur chip',
|
|
263
|
+
textKey: 'text',
|
|
264
|
+
valueKey: 'value',
|
|
265
|
+
menuId,
|
|
266
|
+
},
|
|
267
|
+
attachTo: document.body,
|
|
268
|
+
})
|
|
269
|
+
|
|
270
|
+
// Open menu
|
|
271
|
+
const input = wrapper.find('input')
|
|
272
|
+
await input.trigger('click')
|
|
273
|
+
await flushPromises()
|
|
274
|
+
await wrapper.vm.$nextTick()
|
|
275
|
+
expect(isMenuOverlayActive()).toBe(true)
|
|
276
|
+
|
|
277
|
+
// Create a chip DOM element as blur relatedTarget
|
|
278
|
+
const chipEl = document.createElement('span')
|
|
279
|
+
chipEl.className = 'sy-autocomplete__chip'
|
|
280
|
+
document.body.appendChild(chipEl)
|
|
281
|
+
|
|
282
|
+
const inputEl = getInputEl()!
|
|
283
|
+
inputEl.dispatchEvent(new FocusEvent('blur', { relatedTarget: chipEl, bubbles: true }))
|
|
284
|
+
await flushPromises()
|
|
285
|
+
await wrapper.vm.$nextTick()
|
|
286
|
+
|
|
287
|
+
// Menu should remain open
|
|
288
|
+
expect(isMenuOverlayActive()).toBe(true)
|
|
289
|
+
|
|
290
|
+
document.body.removeChild(chipEl)
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
it('keeps menu open when blur target is the clear button (checkErrorOnBlur)', async () => {
|
|
294
|
+
wrapper.unmount()
|
|
295
|
+
wrapper = mount(SyAutocomplete, {
|
|
296
|
+
props: {
|
|
297
|
+
modelValue: items[0],
|
|
298
|
+
items,
|
|
299
|
+
clearable: true,
|
|
300
|
+
label: 'Test blur clear',
|
|
301
|
+
textKey: 'text',
|
|
302
|
+
valueKey: 'value',
|
|
303
|
+
menuId,
|
|
304
|
+
},
|
|
305
|
+
attachTo: document.body,
|
|
306
|
+
})
|
|
307
|
+
|
|
308
|
+
const input = wrapper.find('input')
|
|
309
|
+
await input.trigger('click')
|
|
310
|
+
await flushPromises()
|
|
311
|
+
await wrapper.vm.$nextTick()
|
|
312
|
+
expect(isMenuOverlayActive()).toBe(true)
|
|
313
|
+
|
|
314
|
+
// Create a clear-button DOM element as blur relatedTarget
|
|
315
|
+
const clearBtn = document.createElement('button')
|
|
316
|
+
clearBtn.className = 'sy-autocomplete__clear-button'
|
|
317
|
+
document.body.appendChild(clearBtn)
|
|
318
|
+
|
|
319
|
+
const inputEl = getInputEl()!
|
|
320
|
+
inputEl.dispatchEvent(new FocusEvent('blur', { relatedTarget: clearBtn, bubbles: true }))
|
|
321
|
+
await flushPromises()
|
|
322
|
+
await wrapper.vm.$nextTick()
|
|
323
|
+
|
|
324
|
+
expect(isMenuOverlayActive()).toBe(true)
|
|
325
|
+
|
|
326
|
+
document.body.removeChild(clearBtn)
|
|
327
|
+
})
|
|
328
|
+
|
|
186
329
|
it('shows clear button when clearable and has selection', async () => {
|
|
187
330
|
wrapper.unmount()
|
|
188
331
|
wrapper = mount(SyAutocomplete, {
|
|
@@ -160,21 +160,25 @@ export const ariaManager = {
|
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
162
|
inputEl.setAttribute('aria-haspopup', 'listbox')
|
|
163
|
-
if (!
|
|
163
|
+
if (!isOpen.value) {
|
|
164
164
|
inputEl.removeAttribute('aria-controls')
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
165
|
+
}
|
|
166
|
+
else if (!popupRendered) {
|
|
167
|
+
inputEl.removeAttribute('aria-controls')
|
|
168
|
+
nextTick(() => {
|
|
169
|
+
const popupNowRendered = Boolean(document.getElementById(menuId))
|
|
170
|
+
if (isOpen.value && popupNowRendered) {
|
|
171
|
+
inputEl.setAttribute('aria-controls', menuId)
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
inputEl.removeAttribute('aria-controls')
|
|
175
|
+
}
|
|
176
|
+
})
|
|
173
177
|
}
|
|
174
178
|
ariaManager.updateValidationAttributes(inputEl, false, false)
|
|
175
179
|
nextTick(() => {
|
|
176
180
|
const popupStillThere = Boolean(document.getElementById(menuId))
|
|
177
|
-
if (popupStillThere) {
|
|
181
|
+
if (isOpen.value && popupStillThere) {
|
|
178
182
|
inputEl.setAttribute('aria-controls', menuId)
|
|
179
183
|
}
|
|
180
184
|
else {
|
|
@@ -508,12 +508,12 @@ const options = [
|
|
|
508
508
|
{ text: 'Option 3', value: '3' },
|
|
509
509
|
]
|
|
510
510
|
|
|
511
|
-
const validateForm = () => {
|
|
511
|
+
const validateForm = async (): Promise<void> => {
|
|
512
512
|
// Réinitialiser
|
|
513
513
|
formSubmitted.value = false
|
|
514
514
|
|
|
515
515
|
// Valider le champ avec la méthode validateOnSubmit
|
|
516
|
-
const isValid = selectField.value.validateOnSubmit()
|
|
516
|
+
const isValid = await selectField.value.validateOnSubmit()
|
|
517
517
|
|
|
518
518
|
if (!isValid) {
|
|
519
519
|
return
|
|
@@ -551,7 +551,7 @@ const validateForm = () => {
|
|
|
551
551
|
const errorMessages = ref([])
|
|
552
552
|
const formSubmitted = ref(false)
|
|
553
553
|
|
|
554
|
-
const validateForm = () => {
|
|
554
|
+
const validateForm = async (): Promise<void> => {
|
|
555
555
|
// Réinitialiser
|
|
556
556
|
formSubmitted.value = false
|
|
557
557
|
|
|
@@ -562,7 +562,7 @@ const validateForm = () => {
|
|
|
562
562
|
}
|
|
563
563
|
|
|
564
564
|
// Valider le champ avec la méthode validateOnSubmit
|
|
565
|
-
const isValid = selectField.value.validateOnSubmit()
|
|
565
|
+
const isValid = await selectField.value.validateOnSubmit()
|
|
566
566
|
|
|
567
567
|
if (!isValid) {
|
|
568
568
|
return
|
|
@@ -50,7 +50,6 @@
|
|
|
50
50
|
|
|
51
51
|
// Initialisation du composable de validation
|
|
52
52
|
const validation = useValidation({
|
|
53
|
-
customRules: props.customRules,
|
|
54
53
|
fieldIdentifier: props.label,
|
|
55
54
|
disableErrorHandling: props.disableErrorHandling,
|
|
56
55
|
})
|
|
@@ -90,11 +89,11 @@
|
|
|
90
89
|
const inputId = ref(`sy-input-select-${Math.random().toString(36).substring(7)}`)
|
|
91
90
|
|
|
92
91
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
93
|
-
const selectItem = (item: any) => {
|
|
92
|
+
const selectItem = async (item: any) => {
|
|
94
93
|
selectedItem.value = item
|
|
95
94
|
emit('update:modelValue', item)
|
|
96
95
|
isOpen.value = false
|
|
97
|
-
validateField(item)
|
|
96
|
+
await validateField(item)
|
|
98
97
|
emit('update:errorMessages', localErrorMessages.value)
|
|
99
98
|
}
|
|
100
99
|
|
|
@@ -182,7 +181,7 @@
|
|
|
182
181
|
: [],
|
|
183
182
|
)
|
|
184
183
|
|
|
185
|
-
const validateField = (value: unknown) => {
|
|
184
|
+
const validateField = async (value: unknown) => {
|
|
186
185
|
if (props.readonly) {
|
|
187
186
|
validation.clearValidation()
|
|
188
187
|
localErrorMessages.value = []
|
|
@@ -195,7 +194,7 @@
|
|
|
195
194
|
return true
|
|
196
195
|
}
|
|
197
196
|
|
|
198
|
-
const result = validation.validateField(
|
|
197
|
+
const result = await validation.validateField(
|
|
199
198
|
value,
|
|
200
199
|
[...defaultRules.value, ...(props.customRules || [])],
|
|
201
200
|
)
|
|
@@ -204,14 +203,14 @@
|
|
|
204
203
|
return !result.hasError
|
|
205
204
|
}
|
|
206
205
|
|
|
207
|
-
const validateOnSubmit = () => {
|
|
208
|
-
const isValid = validateField(selectedItem.value)
|
|
206
|
+
const validateOnSubmit = async () => {
|
|
207
|
+
const isValid = await validateField(selectedItem.value)
|
|
209
208
|
hasError.value = !isValid
|
|
210
209
|
return isValid
|
|
211
210
|
}
|
|
212
211
|
|
|
213
|
-
const checkForErrors = () => {
|
|
214
|
-
return validateField(selectedItem.value)
|
|
212
|
+
const checkForErrors = async () => {
|
|
213
|
+
return await validateField(selectedItem.value)
|
|
215
214
|
}
|
|
216
215
|
|
|
217
216
|
defineExpose({
|
|
@@ -96,7 +96,7 @@ describe('SyInputSelect', () => {
|
|
|
96
96
|
})
|
|
97
97
|
})
|
|
98
98
|
|
|
99
|
-
describe('Validation', () => {
|
|
99
|
+
describe('Validation', async () => {
|
|
100
100
|
it('validateField valide correctement un champ requis avec une valeur', async () => {
|
|
101
101
|
const wrapper = mount(SyInputSelect, {
|
|
102
102
|
props: {
|
|
@@ -105,7 +105,7 @@ describe('SyInputSelect', () => {
|
|
|
105
105
|
},
|
|
106
106
|
})
|
|
107
107
|
|
|
108
|
-
const result = wrapper.vm.validateField({ text: 'Option 1', value: '1' })
|
|
108
|
+
const result = await wrapper.vm.validateField({ text: 'Option 1', value: '1' })
|
|
109
109
|
expect(result).toBe(true)
|
|
110
110
|
expect(wrapper.find('.v-messages__message').exists()).toBe(false)
|
|
111
111
|
})
|
|
@@ -119,7 +119,7 @@ describe('SyInputSelect', () => {
|
|
|
119
119
|
},
|
|
120
120
|
})
|
|
121
121
|
|
|
122
|
-
const result = wrapper.vm.validateField(null)
|
|
122
|
+
const result = await wrapper.vm.validateField(null)
|
|
123
123
|
expect(result).toBe(false)
|
|
124
124
|
|
|
125
125
|
await wrapper.setProps({ errorMessages: ['Test Label est requis'] })
|
|
@@ -134,15 +134,15 @@ describe('SyInputSelect', () => {
|
|
|
134
134
|
props: { required: true },
|
|
135
135
|
})
|
|
136
136
|
|
|
137
|
-
const result = wrapper.vm.validateOnSubmit()
|
|
137
|
+
const result = await wrapper.vm.validateOnSubmit()
|
|
138
138
|
expect(result).toBe(false)
|
|
139
139
|
|
|
140
140
|
await wrapper.setProps({ modelValue: { text: 'Option 1', value: '1' } })
|
|
141
|
-
const resultWithValue = wrapper.vm.validateOnSubmit()
|
|
141
|
+
const resultWithValue = await wrapper.vm.validateOnSubmit()
|
|
142
142
|
expect(resultWithValue).toBe(true)
|
|
143
143
|
})
|
|
144
144
|
|
|
145
|
-
it('vérifie que checkForErrors retourne le résultat de la validation', () => {
|
|
145
|
+
it('vérifie que checkForErrors retourne le résultat de la validation', async () => {
|
|
146
146
|
const wrapper1 = mount(SyInputSelect, {
|
|
147
147
|
props: {
|
|
148
148
|
required: true,
|
|
@@ -150,7 +150,7 @@ describe('SyInputSelect', () => {
|
|
|
150
150
|
},
|
|
151
151
|
})
|
|
152
152
|
|
|
153
|
-
const result1 = wrapper1.vm.checkForErrors()
|
|
153
|
+
const result1 = await wrapper1.vm.checkForErrors()
|
|
154
154
|
expect(result1).toBe(false)
|
|
155
155
|
|
|
156
156
|
const wrapper2 = mount(SyInputSelect, {
|
|
@@ -160,13 +160,13 @@ describe('SyInputSelect', () => {
|
|
|
160
160
|
},
|
|
161
161
|
})
|
|
162
162
|
|
|
163
|
-
const result2 = wrapper2.vm.checkForErrors()
|
|
163
|
+
const result2 = await wrapper2.vm.checkForErrors()
|
|
164
164
|
expect(result2).toBe(true)
|
|
165
165
|
})
|
|
166
166
|
})
|
|
167
167
|
|
|
168
168
|
describe('Mode readonly', () => {
|
|
169
|
-
it('désactive la validation en mode readonly', () => {
|
|
169
|
+
it('désactive la validation en mode readonly', async () => {
|
|
170
170
|
const wrapper = mount(SyInputSelect, {
|
|
171
171
|
props: {
|
|
172
172
|
readonly: true,
|
|
@@ -174,7 +174,7 @@ describe('SyInputSelect', () => {
|
|
|
174
174
|
},
|
|
175
175
|
})
|
|
176
176
|
|
|
177
|
-
const result = wrapper.vm.validateField(null)
|
|
177
|
+
const result = await wrapper.vm.validateField(null)
|
|
178
178
|
expect(result).toBe(true)
|
|
179
179
|
expect(wrapper.find('.v-messages__message').exists()).toBe(false)
|
|
180
180
|
})
|
|
@@ -193,7 +193,7 @@
|
|
|
193
193
|
|
|
194
194
|
const iconColor = computed(() => {
|
|
195
195
|
if (hasError.value || Boolean(isRequired.value) || props.errorMessages.length > 0) return 'error'
|
|
196
|
-
return 'rgb(
|
|
196
|
+
return 'rgb(var(--v-theme-iconBase));'
|
|
197
197
|
})
|
|
198
198
|
|
|
199
199
|
const variant = computed(() => {
|
|
@@ -286,7 +286,10 @@
|
|
|
286
286
|
emit('update:modelValue', props.multiple ? [] : null)
|
|
287
287
|
|
|
288
288
|
// Garder la liste ouverte après une suppression et réinitialiser la navigation au clavier
|
|
289
|
-
|
|
289
|
+
const target = event?.target as HTMLElement | undefined
|
|
290
|
+
const listElement = list.value?.$el as HTMLElement | undefined
|
|
291
|
+
const isClickFromList = Boolean(listElement && target && listElement.contains(target))
|
|
292
|
+
if (event?.type === 'keydown' || isClickFromList) {
|
|
290
293
|
if (!isOpen.value) {
|
|
291
294
|
isOpen.value = true
|
|
292
295
|
}
|
|
@@ -968,7 +971,9 @@
|
|
|
968
971
|
class="ma-1"
|
|
969
972
|
closable
|
|
970
973
|
:close-label="locales.removeChip(getChipText(item))"
|
|
971
|
-
@click:close="removeChip(item)"
|
|
974
|
+
@click:close.stop.prevent="removeChip(item)"
|
|
975
|
+
@keydown.enter.capture.stop.prevent="(event) => (event.target as HTMLElement | null)?.closest('.v-chip__close') && removeChip(item)"
|
|
976
|
+
@keydown.space.capture.stop.prevent="(event) => (event.target as HTMLElement | null)?.closest('.v-chip__close') && removeChip(item)"
|
|
972
977
|
>
|
|
973
978
|
{{ getChipText(item) }}
|
|
974
979
|
</VChip>
|
|
@@ -1144,8 +1149,6 @@
|
|
|
1144
1149
|
</template>
|
|
1145
1150
|
|
|
1146
1151
|
<style scoped lang="scss">
|
|
1147
|
-
@use '@/assets/tokens';
|
|
1148
|
-
|
|
1149
1152
|
.sy-select-container {
|
|
1150
1153
|
display: flex;
|
|
1151
1154
|
flex-direction: column;
|
|
@@ -1157,12 +1160,12 @@
|
|
|
1157
1160
|
|
|
1158
1161
|
:deep(.v-input__prepend > .v-icon__svg),
|
|
1159
1162
|
:deep(.v-input__append > .v-icon__svg) {
|
|
1160
|
-
fill: rgb(
|
|
1163
|
+
fill: rgb(var(--v-theme-iconBase));
|
|
1161
1164
|
}
|
|
1162
1165
|
|
|
1163
1166
|
:deep(.v-input__prepend .v-icon:focus-visible),
|
|
1164
1167
|
:deep(.v-input__append .v-icon:focus-visible) {
|
|
1165
|
-
outline: 2px solid
|
|
1168
|
+
outline: 2px solid rgb(var(--v-theme-accentPrimary));
|
|
1166
1169
|
outline-offset: 2px;
|
|
1167
1170
|
opacity: 1;
|
|
1168
1171
|
}
|
|
@@ -1213,7 +1216,7 @@
|
|
|
1213
1216
|
/* Ensure focus styles match selection styles for keyboard navigation */
|
|
1214
1217
|
.v-list-item:focus-visible,
|
|
1215
1218
|
.v-list-item.keyboard-focused {
|
|
1216
|
-
outline: 2px solid
|
|
1219
|
+
outline: 2px solid rgb(var(--v-theme-accentPrimary));
|
|
1217
1220
|
outline-offset: -2px;
|
|
1218
1221
|
background-color: rgb(0 0 0 / 8%);
|
|
1219
1222
|
}
|
|
@@ -1240,11 +1243,11 @@
|
|
|
1240
1243
|
.v-icon.arrow {
|
|
1241
1244
|
position: absolute;
|
|
1242
1245
|
right: 10px;
|
|
1243
|
-
color:
|
|
1246
|
+
color: rgb(var(--v-theme-iconBase));
|
|
1244
1247
|
}
|
|
1245
1248
|
|
|
1246
1249
|
.sy-select__clear-icon {
|
|
1247
|
-
color:
|
|
1250
|
+
color: rgb(var(--v-theme-iconBase)) !important;
|
|
1248
1251
|
opacity: var(--v-medium-emphasis-opacity) !important;
|
|
1249
1252
|
}
|
|
1250
1253
|
|
|
@@ -1289,7 +1292,7 @@
|
|
|
1289
1292
|
|
|
1290
1293
|
.sy-select :deep(.v-field__input) {
|
|
1291
1294
|
opacity: 1;
|
|
1292
|
-
color:
|
|
1295
|
+
color: rgb(var(--v-theme-iconBase)) !important;
|
|
1293
1296
|
cursor: pointer;
|
|
1294
1297
|
caret-color: transparent;
|
|
1295
1298
|
padding-right: 25px;
|
|
@@ -964,6 +964,60 @@ describe('SySelect.vue', () => {
|
|
|
964
964
|
|
|
965
965
|
wrapper.unmount()
|
|
966
966
|
})
|
|
967
|
+
|
|
968
|
+
it('removes chip when Enter key is pressed on chip close button', async () => {
|
|
969
|
+
const items = [
|
|
970
|
+
{ text: 'Option 1', value: '1' },
|
|
971
|
+
{ text: 'Option 2', value: '2' },
|
|
972
|
+
]
|
|
973
|
+
const wrapper = mount(SySelect, {
|
|
974
|
+
props: {
|
|
975
|
+
items,
|
|
976
|
+
multiple: true,
|
|
977
|
+
chips: true,
|
|
978
|
+
modelValue: ['1', '2'],
|
|
979
|
+
textKey: 'text',
|
|
980
|
+
valueKey: 'value',
|
|
981
|
+
},
|
|
982
|
+
attachTo: document.body,
|
|
983
|
+
})
|
|
984
|
+
|
|
985
|
+
await wrapper.vm.$nextTick()
|
|
986
|
+
const closeButton = wrapper.find('.v-chip__close')
|
|
987
|
+
closeButton.element.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, cancelable: true }))
|
|
988
|
+
await wrapper.vm.$nextTick()
|
|
989
|
+
|
|
990
|
+
expect(wrapper.emitted()['update:modelValue']?.[0]).toEqual([['2']])
|
|
991
|
+
|
|
992
|
+
wrapper.unmount()
|
|
993
|
+
})
|
|
994
|
+
|
|
995
|
+
it('removes chip when Space key is pressed on chip close button', async () => {
|
|
996
|
+
const items = [
|
|
997
|
+
{ text: 'Option 1', value: '1' },
|
|
998
|
+
{ text: 'Option 2', value: '2' },
|
|
999
|
+
]
|
|
1000
|
+
const wrapper = mount(SySelect, {
|
|
1001
|
+
props: {
|
|
1002
|
+
items,
|
|
1003
|
+
multiple: true,
|
|
1004
|
+
chips: true,
|
|
1005
|
+
modelValue: ['1', '2'],
|
|
1006
|
+
textKey: 'text',
|
|
1007
|
+
valueKey: 'value',
|
|
1008
|
+
},
|
|
1009
|
+
attachTo: document.body,
|
|
1010
|
+
})
|
|
1011
|
+
|
|
1012
|
+
await wrapper.vm.$nextTick()
|
|
1013
|
+
const closeButton = wrapper.find('.v-chip__close')
|
|
1014
|
+
closeButton.element.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true, cancelable: true }))
|
|
1015
|
+
await wrapper.vm.$nextTick()
|
|
1016
|
+
|
|
1017
|
+
expect(wrapper.emitted()['update:modelValue']?.[0]).toEqual([['2']])
|
|
1018
|
+
|
|
1019
|
+
wrapper.unmount()
|
|
1020
|
+
})
|
|
967
1021
|
})
|
|
968
1022
|
|
|
969
1023
|
describe('keyboard navigation', () => {
|
|
@@ -83,9 +83,6 @@
|
|
|
83
83
|
const isSubmitted = ref(false)
|
|
84
84
|
|
|
85
85
|
const validation = useValidation({
|
|
86
|
-
customRules: props.customRules,
|
|
87
|
-
warningRules: props.customWarningRules,
|
|
88
|
-
successRules: props.customSuccessRules,
|
|
89
86
|
showSuccessMessages: props.showSuccessMessages,
|
|
90
87
|
fieldIdentifier: props.label,
|
|
91
88
|
disableErrorHandling: props.disableErrorHandling,
|
|
@@ -135,7 +132,7 @@
|
|
|
135
132
|
return model.value as (string | number) | null
|
|
136
133
|
}
|
|
137
134
|
|
|
138
|
-
const validateField = (value: (string | number) | (string | number)[] | null) => {
|
|
135
|
+
const validateField = async (value: (string | number) | (string | number)[] | null) => {
|
|
139
136
|
if (props.readonly) {
|
|
140
137
|
validation.clearValidation()
|
|
141
138
|
return true
|
|
@@ -146,7 +143,7 @@
|
|
|
146
143
|
return true
|
|
147
144
|
}
|
|
148
145
|
|
|
149
|
-
const result = validation.validateField(
|
|
146
|
+
const result = await validation.validateField(
|
|
150
147
|
value,
|
|
151
148
|
[...defaultRules.value, ...props.customRules],
|
|
152
149
|
props.customWarningRules,
|
|
@@ -155,18 +152,18 @@
|
|
|
155
152
|
return !result.hasError
|
|
156
153
|
}
|
|
157
154
|
|
|
158
|
-
const validateOnSubmit = () => {
|
|
155
|
+
const validateOnSubmit = async () => {
|
|
159
156
|
isSubmitted.value = true
|
|
160
|
-
return validateField(getValidationValue())
|
|
157
|
+
return await validateField(getValidationValue())
|
|
161
158
|
}
|
|
162
159
|
|
|
163
160
|
const checkErrorOnBlur = () => {
|
|
164
161
|
validateField(getValidationValue())
|
|
165
162
|
}
|
|
166
163
|
|
|
167
|
-
watch(model, (newValue) => {
|
|
164
|
+
watch(model, async (newValue) => {
|
|
168
165
|
if (!props.isValidateOnBlur || isSubmitted.value) {
|
|
169
|
-
validateField(newValue as (string | number) | (string | number)[] | null)
|
|
166
|
+
await validateField(newValue as (string | number) | (string | number)[] | null)
|
|
170
167
|
}
|
|
171
168
|
})
|
|
172
169
|
|
|
@@ -5,7 +5,7 @@ import { fn } from '@storybook/test'
|
|
|
5
5
|
|
|
6
6
|
// Interface pour typer correctement le composant SyCheckbox avec sa méthode validateOnSubmit
|
|
7
7
|
interface SyCheckboxInstance {
|
|
8
|
-
validateOnSubmit: () => boolean
|
|
8
|
+
validateOnSubmit: () => Promise<boolean>
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
const meta = {
|
|
@@ -171,9 +171,6 @@ export const Indeterminate: Story = {
|
|
|
171
171
|
template: `<SyCheckbox v-model="checked" :indeterminate="indeterminate" v-bind="args" label="Case à cocher indéterminée" />`,
|
|
172
172
|
}),
|
|
173
173
|
parameters: {
|
|
174
|
-
a11y: {
|
|
175
|
-
disable: true,
|
|
176
|
-
},
|
|
177
174
|
sourceCode: [
|
|
178
175
|
{
|
|
179
176
|
name: 'Template',
|
|
@@ -207,9 +204,6 @@ Cette case à cocher est dans un état indéterminé, généralement utilisé lo
|
|
|
207
204
|
|
|
208
205
|
export const WithControlsIds: Story = {
|
|
209
206
|
parameters: {
|
|
210
|
-
a11y: {
|
|
211
|
-
disable: true,
|
|
212
|
-
},
|
|
213
207
|
sourceCode: [
|
|
214
208
|
{
|
|
215
209
|
name: 'Template',
|
|
@@ -702,11 +696,11 @@ const rules = [
|
|
|
702
696
|
},
|
|
703
697
|
]
|
|
704
698
|
|
|
705
|
-
const validateForm = () => {
|
|
699
|
+
const validateForm = async (): Promise<void> => {
|
|
706
700
|
if (!checkbox.value || !checkbox2.value) return
|
|
707
701
|
hasError.value = true
|
|
708
|
-
const isValid = checkbox.value.validateOnSubmit()
|
|
709
|
-
const isValid2 = checkbox2.value.validateOnSubmit()
|
|
702
|
+
const isValid = await checkbox.value.validateOnSubmit()
|
|
703
|
+
const isValid2 = await checkbox2.value.validateOnSubmit()
|
|
710
704
|
if (isValid && isValid2) {
|
|
711
705
|
formSubmitted.value = true
|
|
712
706
|
hasError.value = false
|
|
@@ -735,18 +729,18 @@ Cette case à cocher utilise des règles de validation personnalisées et valide
|
|
|
735
729
|
const hasError = ref(false)
|
|
736
730
|
|
|
737
731
|
// Revalider quand les valeurs changent
|
|
738
|
-
watch([checked, checked2], () => {
|
|
732
|
+
watch([checked, checked2], async () => {
|
|
739
733
|
if (hasError.value && checkbox.value && checkbox2.value) {
|
|
740
|
-
checkbox.value.validateOnSubmit()
|
|
741
|
-
checkbox2.value.validateOnSubmit()
|
|
734
|
+
await checkbox.value.validateOnSubmit()
|
|
735
|
+
await checkbox2.value.validateOnSubmit()
|
|
742
736
|
}
|
|
743
737
|
})
|
|
744
738
|
|
|
745
|
-
const validateForm = () => {
|
|
739
|
+
const validateForm = async (): Promise<void> => {
|
|
746
740
|
if (!checkbox.value || !checkbox2.value) return
|
|
747
741
|
hasError.value = true
|
|
748
|
-
const isValid = checkbox.value.validateOnSubmit()
|
|
749
|
-
const isValid2 = checkbox2.value.validateOnSubmit()
|
|
742
|
+
const isValid = await checkbox.value.validateOnSubmit()
|
|
743
|
+
const isValid2 = await checkbox2.value.validateOnSubmit()
|
|
750
744
|
if (isValid && isValid2) {
|
|
751
745
|
formSubmitted.value = true
|
|
752
746
|
hasError.value = false
|