@cnamts/synapse 1.0.27 → 1.1.0
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/README.md +1 -1
- package/dist/{AutocompleteFilter-C9eLKyW8.js → AutocompleteFilter-DXd4szWO.js} +3 -3
- package/dist/{DateFilter-y-GLkAkn.js → DateFilter-BD59Kgwf.js} +8 -8
- package/dist/{NumberFilter-DN6hIBS7.js → NumberFilter-BSMZE7uw.js} +1 -1
- package/dist/{PeriodFilter-MoUUp9qS.js → PeriodFilter-keUdSSk0.js} +1 -1
- package/dist/{SelectFilter-bCbrdLmu.js → SelectFilter-Dhvvwazl.js} +1 -1
- package/dist/{TextFilter-CvjgEaoM.js → TextFilter-CU8FpXz0.js} +4 -4
- package/dist/{apLightTheme2026-ug4Y23ns.js → apLightTheme2026-DbS7BPUf.js} +12 -11
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +4 -4
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +4 -4
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +6 -6
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +4 -4
- package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +4 -4
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +4 -4
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +4 -4
- package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +2 -2
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +85 -313
- package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +2 -2
- package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +1 -1
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +9 -11
- package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +7 -7
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +3 -3
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +5 -5
- package/dist/components/Customs/SyIcon/SyIcon.d.ts +77 -1
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +10 -10
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +19 -79
- package/dist/components/Customs/SyTextField/locales.d.ts +7 -0
- package/dist/components/Customs/SyTextField/types.d.ts +67 -4
- package/dist/components/Customs/SyTextField/useNumberField.d.ts +23 -0
- package/dist/components/Customs/SyTextField/useSyTextFieldValidation.d.ts +38 -0
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +170 -622
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +85 -311
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +39 -152
- package/dist/components/FilterInline/FilterInline.d.ts +3 -3
- package/dist/components/FilterSideBar/FilterSideBar.d.ts +4 -4
- package/dist/components/MonthPicker/MonthPicker.d.ts +37 -150
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +37 -150
- package/dist/components/NirField/NirField.d.ts +90 -321
- package/dist/components/NirField/useNirValidation.d.ts +10 -20
- package/dist/components/PasswordField/PasswordField.d.ts +20 -39
- package/dist/components/PasswordField/locales.d.ts +2 -0
- package/dist/components/PasswordField/types.d.ts +16 -0
- package/dist/components/PasswordField/usePasswordFieldValidation.d.ts +38 -0
- package/dist/components/PeriodField/PeriodField.d.ts +349 -1253
- package/dist/components/PhoneField/PhoneField.d.ts +37 -150
- package/dist/components/SearchListField/SearchListField.d.ts +3 -3
- package/dist/components/SyTextArea/SyTextArea.d.ts +14 -11
- package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +7 -7
- package/dist/components/Tables/common/SyTablePagination.d.ts +19 -20
- package/dist/composables/unifyValidation/documentationValidationProps.d.ts +1 -1
- package/dist/composables/unifyValidation/useValidation.d.ts +1 -9
- package/dist/composables/useFilterable/useFilterable.d.ts +1 -2
- package/dist/design-system-v3.js +19 -19
- package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +1 -0
- package/dist/designTokens/tokens/pa/paLightTheme.d.ts +1 -0
- package/dist/{main-CI6Q9nmO.js → main-D8ryUoS5.js} +13605 -13358
- package/dist/synapse.css +1 -1
- package/dist/vuetifyConfig.js +27 -25
- package/package.json +6 -5
- package/src/components/Accordion/tests/Accordion.visual.cy.ts +44 -0
- package/src/components/Accordion/tests/__snapshots__/accordion-default.snap.png +0 -0
- package/src/components/Accordion/tests/__snapshots__/accordion-disabled-item.snap.png +0 -0
- package/src/components/Accordion/tests/__snapshots__/accordion-open-first.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
- package/src/components/BackToTopBtn/tests/BackToTopBtn.visual.cy.ts +34 -0
- package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-custom-nudge.snap.png +0 -0
- package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-default.snap.png +0 -0
- package/src/components/Captcha/tests/Captcha.visual.cy.ts +45 -0
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +4 -0
- package/src/components/Captcha/tests/__snapshots__/captcha-audio-type.snap.png +0 -0
- package/src/components/Captcha/tests/__snapshots__/captcha-image-type.snap.png +0 -0
- package/src/components/Captcha/tests/__snapshots__/captcha-no-helpdesk.snap.png +0 -0
- package/src/components/ChipList/tests/ChipList.visual.cy.ts +46 -0
- package/src/components/ChipList/tests/__snapshots__/chip-list-default.snap.png +0 -0
- package/src/components/ChipList/tests/__snapshots__/chip-list-readonly.snap.png +0 -0
- package/src/components/ChipList/tests/__snapshots__/chip-list-state-icons.snap.png +0 -0
- package/src/components/CollapsibleList/tests/CollapsibleList.visual.cy.ts +33 -0
- package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-default.snap.png +0 -0
- package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-no-title.snap.png +0 -0
- package/src/components/ContextualMenu/tests/ContextualMenu.visual.cy.ts +35 -0
- package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-default.snap.png +0 -0
- package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-selected.snap.png +0 -0
- package/src/components/CookieBanner/tests/CookieBanner.visual.cy.ts +29 -0
- package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-default.snap.png +0 -0
- package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-with-items.snap.png +0 -0
- package/src/components/CookiesSelection/tests/CookiesSelection.visual.cy.ts +21 -0
- package/src/components/CookiesSelection/tests/__snapshots__/cookies-selection-default.snap.png +0 -0
- package/src/components/CopyBtn/tests/CopyBtn.visual.cy.ts +24 -0
- package/src/components/CopyBtn/tests/__snapshots__/copy-btn-default.snap.png +0 -0
- package/src/components/CopyBtn/tests/__snapshots__/copy-btn-no-tooltip.snap.png +0 -0
- package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.visual.cy.ts +60 -0
- package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-default.snap.png +0 -0
- package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-inline.snap.png +0 -0
- package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-readonly.snap.png +0 -0
- package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-selected.snap.png +0 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +1 -1
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +2 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.visual.cy.ts +63 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-default.snap.png +0 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-loading.snap.png +0 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-multiple.snap.png +0 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-with-value.snap.png +0 -0
- package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +0 -93
- package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.visual.cy.ts +48 -0
- package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-default.snap.png +0 -0
- package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-required.snap.png +0 -0
- package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-with-value.snap.png +0 -0
- package/src/components/Customs/Selects/SySelect/SySelect.vue +22 -47
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +3 -3
- package/src/components/Customs/Selects/SySelect/tests/SySelect.visual.cy.ts +77 -0
- package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-clearable.snap.png +0 -0
- package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-default.snap.png +0 -0
- package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-multiple-chips.snap.png +0 -0
- package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-required.snap.png +0 -0
- package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-with-value.snap.png +0 -0
- package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +1 -92
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +1 -1
- package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.visual.cy.ts +55 -0
- package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-default.snap.png +0 -0
- package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-disabled.snap.png +0 -0
- package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-selected.snap.png +0 -0
- package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-with-label.snap.png +0 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +1 -9
- package/src/components/Customs/SyCheckbox/tests/SyCheckbox.visual.cy.ts +61 -0
- package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-checked.snap.png +0 -0
- package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-disabled.snap.png +0 -0
- package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-indeterminate.snap.png +0 -0
- package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-required.snap.png +0 -0
- package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-unchecked.snap.png +0 -0
- package/src/components/Customs/SyIcon/SyIcon.vue +19 -1
- package/src/components/Customs/SyIcon/tests/SyIcon.visual.cy.ts +83 -0
- package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-color-error.snap.png +0 -0
- package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-decorative.snap.png +0 -0
- package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-informative.snap.png +0 -0
- package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-role-button.snap.png +0 -0
- package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-size-large.snap.png +0 -0
- package/src/components/Customs/SyIconButton/tests/SyIconButton.visual.cy.ts +55 -0
- package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-default.snap.png +0 -0
- package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-disabled.snap.png +0 -0
- package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-error.snap.png +0 -0
- package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-large.snap.png +0 -0
- package/src/components/Customs/SyPagination/tests/SyPagination.visual.cy.ts +40 -0
- package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-first-page.snap.png +0 -0
- package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-middle-page.snap.png +0 -0
- package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-with-label.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +0 -1
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -3
- package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +1 -1
- package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-asterisk.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-comfortable.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-compact.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-default.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-disabled.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-error.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-no-details.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-readonly.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-selected.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-success.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-warning.snap.png +0 -0
- package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +63 -27
- package/src/components/Customs/SyTabs/tests/SyTabs.visual.cy.ts +30 -0
- package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-default.snap.png +0 -0
- package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-second-active.snap.png +0 -0
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +160 -778
- package/src/components/Customs/SyTextField/SyTextField.vue +168 -153
- package/src/components/Customs/SyTextField/Validation/Validation.stories.ts +1164 -0
- package/src/components/Customs/SyTextField/locales.ts +12 -0
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +174 -8
- package/src/components/Customs/SyTextField/tests/SyTextField.visual.cy.ts +116 -0
- package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-clearable.snap.png +0 -0
- package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-default.snap.png +0 -0
- package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-disabled.snap.png +0 -0
- package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-no-spinner.snap.png +0 -0
- package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number.snap.png +0 -0
- package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-prepend-icon.snap.png +0 -0
- package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-readonly.snap.png +0 -0
- package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-required.snap.png +0 -0
- package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-with-value.snap.png +0 -0
- package/src/components/Customs/SyTextField/types.ts +70 -0
- package/src/components/Customs/SyTextField/useNumberField.ts +93 -0
- package/src/components/Customs/SyTextField/useSyTextFieldValidation.ts +104 -0
- package/src/components/DataList/tests/DataList.visual.cy.ts +85 -0
- package/src/components/DataList/tests/__snapshots__/data-list-default.snap.png +0 -0
- package/src/components/DataList/tests/__snapshots__/data-list-loading.snap.png +0 -0
- package/src/components/DataList/tests/__snapshots__/data-list-row.snap.png +0 -0
- package/src/components/DataList/tests/__snapshots__/data-list-with-icons.snap.png +0 -0
- package/src/components/DataList/tests/__snapshots__/data-list-with-title.snap.png +0 -0
- package/src/components/DataListGroup/tests/DataListGroup.visual.cy.ts +51 -0
- package/src/components/DataListGroup/tests/__snapshots__/data-list-group-default.snap.png +0 -0
- package/src/components/DataListGroup/tests/__snapshots__/data-list-group-loading.snap.png +0 -0
- package/src/components/DataListItem/tests/DataListItem.visual.cy.ts +53 -0
- package/src/components/DataListItem/tests/__snapshots__/data-list-item-chip.snap.png +0 -0
- package/src/components/DataListItem/tests/__snapshots__/data-list-item-default.snap.png +0 -0
- package/src/components/DataListItem/tests/__snapshots__/data-list-item-placeholder.snap.png +0 -0
- package/src/components/DataListItem/tests/__snapshots__/data-list-item-row.snap.png +0 -0
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +7 -7
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +7 -8
- package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +1 -1
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +2 -2
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
- package/src/components/DatePicker/composables/tests/useTodayButton.spec.ts +10 -10
- package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +11 -2
- package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.visual.cy.ts +35 -0
- package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-default.snap.png +0 -0
- package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-full.snap.png +0 -0
- package/src/components/DiacriticPicker/tests/DiacriticPicker.visual.cy.ts +24 -0
- package/src/components/DiacriticPicker/tests/__snapshots__/diacritic-picker-custom-title.snap.png +0 -0
- package/src/components/DiacriticPicker/tests/__snapshots__/diacritic-picker-default.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
- package/src/components/DownloadBtn/tests/DownloadBtn.spec.ts +2 -2
- package/src/components/DownloadBtn/tests/DownloadBtn.visual.cy.ts +38 -0
- package/src/components/DownloadBtn/tests/__snapshots__/download-btn-dark.snap.png +0 -0
- package/src/components/DownloadBtn/tests/__snapshots__/download-btn-idle.snap.png +0 -0
- package/src/components/ErrorPage/tests/ErrorPage.visual.cy.ts +32 -0
- package/src/components/ErrorPage/tests/__snapshots__/error-page-custom.snap.png +0 -0
- package/src/components/ErrorPage/tests/__snapshots__/error-page-default.snap.png +0 -0
- package/src/components/ErrorPage/tests/__snapshots__/error-page-no-btn.snap.png +0 -0
- package/src/components/ExternalLinks/tests/ExternalLinks.visual.cy.ts +30 -0
- package/src/components/ExternalLinks/tests/__snapshots__/external-links-default.snap.png +0 -0
- package/src/components/ExternalLinks/tests/__snapshots__/external-links-fixed.snap.png +0 -0
- package/src/components/FileList/tests/FileList.visual.cy.ts +31 -0
- package/src/components/FileList/tests/__snapshots__/file-list-default.snap.png +0 -0
- package/src/components/FileList/tests/__snapshots__/file-list-with-delete.snap.png +0 -0
- package/src/components/FilePreview/accessibilite/Accessibility.mdx +86 -8
- package/src/components/FileUpload/tests/FileUpload.visual.cy.ts +36 -0
- package/src/components/FileUpload/tests/__snapshots__/file-upload-default.snap.png +0 -0
- package/src/components/FileUpload/tests/__snapshots__/file-upload-disabled.snap.png +0 -0
- package/src/components/FileUpload/tests/__snapshots__/file-upload-multiple.snap.png +0 -0
- package/src/components/FilterInline/FilterInline.stories.ts +2 -0
- package/src/components/FilterInline/FilterInline.vue +10 -5
- package/src/components/FilterInline/tests/FilterInline.visual.cy.ts +25 -0
- package/src/components/FilterInline/tests/__snapshots__/filter-inline-default.snap.png +0 -0
- package/src/components/FilterSideBar/FilterSideBar.stories.ts +4 -1
- package/src/components/FilterSideBar/FilterSideBar.vue +11 -6
- package/src/components/FilterSideBar/tests/FilterSideBar.visual.cy.ts +37 -0
- package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-default.snap.png +0 -0
- package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-modale.snap.png +0 -0
- package/src/components/FooterBar/tests/FooterBar.visual.cy.ts +37 -0
- package/src/components/FooterBar/tests/__snapshots__/footer-bar-default.snap.png +0 -0
- package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-logo.snap.png +0 -0
- package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-social.snap.png +0 -0
- package/src/components/FooterBar/tests/__snapshots__/footer-bar-version.snap.png +0 -0
- package/src/components/FranceConnectBtn/tests/FranceConnectBtn.visual.cy.ts +38 -0
- package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-dark.snap.png +0 -0
- package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-default.snap.png +0 -0
- package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-plus.snap.png +0 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.spec.ts +4 -4
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
- package/src/components/HeaderLoading/tests/HeaderLoading.visual.cy.ts +34 -0
- package/src/components/HeaderLoading/tests/__snapshots__/header-loading-custom-size.snap.png +0 -0
- package/src/components/HeaderLoading/tests/__snapshots__/header-loading-default.snap.png +0 -0
- package/src/components/HeaderLoading/tests/__snapshots__/header-loading-standalone.snap.png +0 -0
- package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +4 -4
- package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.visual.cy.ts +34 -0
- package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-default.snap.png +0 -0
- package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-subtitle.snap.png +0 -0
- package/src/components/HeaderToolbar/tests/HeaderToolbar.visual.cy.ts +25 -0
- package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-custom.snap.png +0 -0
- package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-default.snap.png +0 -0
- package/src/components/LangBtn/tests/LangBtn.visual.cy.ts +33 -0
- package/src/components/LangBtn/tests/__snapshots__/lang-btn-default.snap.png +0 -0
- package/src/components/LangBtn/tests/__snapshots__/lang-btn-english.snap.png +0 -0
- package/src/components/LangBtn/tests/__snapshots__/lang-btn-no-arrow.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
- package/src/components/LogoBrandSection/tests/LogoBrandSection.visual.cy.ts +43 -0
- package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-default.snap.png +0 -0
- package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-mobile.snap.png +0 -0
- package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-reduced.snap.png +0 -0
- package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-with-title.snap.png +0 -0
- package/src/components/LunarCalendar/tests/LunarCalendar.visual.cy.ts +36 -0
- package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-default.snap.png +0 -0
- package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-required.snap.png +0 -0
- package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-with-value.snap.png +0 -0
- package/src/components/MaintenancePage/tests/MaintenancePage.visual.cy.ts +22 -0
- package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-custom.snap.png +0 -0
- package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-default.snap.png +0 -0
- package/src/components/MonthPicker/tests/MonthPicker.visual.cy.ts +37 -0
- package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +2 -0
- package/src/components/MonthPicker/tests/__snapshots__/month-picker-default.snap.png +0 -0
- package/src/components/MonthPicker/tests/__snapshots__/month-picker-disabled.snap.png +0 -0
- package/src/components/MonthPicker/tests/__snapshots__/month-picker-readonly.snap.png +0 -0
- package/src/components/MonthPicker/tests/__snapshots__/month-picker-with-value.snap.png +0 -0
- package/src/components/NirField/NirField.stories.ts +40 -682
- package/src/components/NirField/NirField.vue +98 -32
- package/src/components/NirField/tests/NirField.spec.ts +135 -14
- package/src/components/NirField/tests/NirField.visual.cy.ts +28 -0
- package/src/components/NirField/tests/__snapshots__/nir-field-complex.snap.png +0 -0
- package/src/components/NirField/tests/__snapshots__/nir-field-default.snap.png +0 -0
- package/src/components/NirField/tests/__snapshots__/nir-field-with-key.snap.png +0 -0
- package/src/components/NirField/tests/useNirValidation.spec.ts +168 -0
- package/src/components/NirField/useNirValidation.ts +28 -2
- package/src/components/NirField/validation/Validation.stories.ts +866 -0
- package/src/components/NotFoundPage/tests/NotFoundPage.visual.cy.ts +28 -0
- package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-custom-btn.snap.png +0 -0
- package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-default.snap.png +0 -0
- package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-no-btn.snap.png +0 -0
- package/src/components/NotificationBar/tests/NotificationBar.visual.cy.ts +54 -0
- package/src/components/NotificationBar/tests/__snapshots__/notification-bar-bottom.snap.png +0 -0
- package/src/components/NotificationBar/tests/__snapshots__/notification-bar-info.snap.png +0 -0
- package/src/components/NotificationBar/tests/__snapshots__/notification-bar-multiple.snap.png +0 -0
- package/src/components/PageContainer/tests/PageContainer.visual.cy.ts +33 -0
- package/src/components/PageContainer/tests/__snapshots__/page-container-color.snap.png +0 -0
- package/src/components/PageContainer/tests/__snapshots__/page-container-default.snap.png +0 -0
- package/src/components/PageContainer/tests/__snapshots__/page-container-md.snap.png +0 -0
- package/src/components/PaginatedTable/accessibilite/Accessibility.mdx +99 -7
- package/src/components/PaginatedTable/tests/PaginatedTable.visual.cy.ts +41 -0
- package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-default.snap.png +0 -0
- package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-server.snap.png +0 -0
- package/src/components/PasswordField/PasswordField.mdx +5 -52
- package/src/components/PasswordField/PasswordField.stories.ts +74 -931
- package/src/components/PasswordField/PasswordField.vue +120 -191
- package/src/components/PasswordField/Validation/Validation.stories.ts +1295 -0
- package/src/components/PasswordField/locales.ts +2 -0
- package/src/components/PasswordField/tests/PasswordField.spec.ts +144 -106
- package/src/components/PasswordField/tests/PasswordField.visual.cy.ts +49 -0
- package/src/components/PasswordField/tests/__snapshots__/password-field-default.snap.png +0 -0
- package/src/components/PasswordField/tests/__snapshots__/password-field-disabled.snap.png +0 -0
- package/src/components/PasswordField/tests/__snapshots__/password-field-required.snap.png +0 -0
- package/src/components/PasswordField/tests/__snapshots__/password-field-underlined.snap.png +0 -0
- package/src/components/PasswordField/types.ts +17 -0
- package/src/components/PasswordField/usePasswordFieldValidation.ts +100 -0
- package/src/components/PeriodField/PeriodField.stories.ts +3 -1
- package/src/components/PeriodField/PeriodField.vue +1 -1
- package/src/components/PeriodField/tests/PeriodField.visual.cy.ts +39 -0
- package/src/components/PeriodField/tests/__snapshots__/period-field-default.snap.png +0 -0
- package/src/components/PeriodField/tests/__snapshots__/period-field-no-calendar.snap.png +0 -0
- package/src/components/PeriodField/tests/__snapshots__/period-field-required.snap.png +0 -0
- package/src/components/PeriodField/tests/__snapshots__/period-field-with-value.snap.png +0 -0
- package/src/components/PhoneField/PhoneField.vue +2 -2
- package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
- package/src/components/PhoneField/tests/PhoneField.visual.cy.ts +28 -0
- package/src/components/PhoneField/tests/__snapshots__/phone-field-default.snap.png +0 -0
- package/src/components/PhoneField/tests/__snapshots__/phone-field-with-country-code.snap.png +0 -0
- package/src/components/PhoneField/tests/__snapshots__/phone-field-with-value.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
- package/src/components/RatingPicker/tests/RatingPicker.visual.cy.ts +52 -0
- package/src/components/RatingPicker/tests/__snapshots__/rating-picker-emotion.snap.png +0 -0
- package/src/components/RatingPicker/tests/__snapshots__/rating-picker-number.snap.png +0 -0
- package/src/components/RatingPicker/tests/__snapshots__/rating-picker-readonly.snap.png +0 -0
- package/src/components/RatingPicker/tests/__snapshots__/rating-picker-stars.snap.png +0 -0
- package/src/components/SearchListField/SearchListField.mdx +1 -1
- package/src/components/SearchListField/SearchListField.stories.ts +1 -1
- package/src/components/SearchListField/SearchListField.vue +9 -4
- package/src/components/SearchListField/tests/SearchListField.spec.ts +127 -0
- package/src/components/SearchListField/tests/SearchListField.visual.cy.ts +35 -0
- package/src/components/SearchListField/tests/__snapshots__/search-list-field-default.snap.png +0 -0
- package/src/components/SearchListField/tests/__snapshots__/search-list-field-with-selection.snap.png +0 -0
- package/src/components/SkipLink/tests/SkipLink.visual.cy.ts +16 -0
- package/src/components/SkipLink/tests/__snapshots__/skip-link-focused.snap.png +0 -0
- package/src/components/SocialMediaLinks/tests/SocialMediaLinks.visual.cy.ts +33 -0
- package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-default.snap.png +0 -0
- package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-no-native-heading.snap.png +0 -0
- package/src/components/StatusPage/tests/StatusPage.visual.cy.ts +47 -0
- package/src/components/StatusPage/tests/__snapshots__/status-page-default.snap.png +0 -0
- package/src/components/StatusPage/tests/__snapshots__/status-page-full.snap.png +0 -0
- package/src/components/StatusPage/tests/__snapshots__/status-page-no-btn.snap.png +0 -0
- package/src/components/SubHeader/tests/SubHeader.visual.cy.ts +48 -0
- package/src/components/SubHeader/tests/__snapshots__/sub-header-default.snap.png +0 -0
- package/src/components/SubHeader/tests/__snapshots__/sub-header-loading.snap.png +0 -0
- package/src/components/SubHeader/tests/__snapshots__/sub-header-no-back-btn.snap.png +0 -0
- package/src/components/SubHeader/tests/__snapshots__/sub-header-with-subtitle.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
- package/src/components/SyHeading/tests/SyHeading.visual.cy.ts +33 -0
- package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-1.snap.png +0 -0
- package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-2.snap.png +0 -0
- package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-3.snap.png +0 -0
- package/src/components/SyTextArea/SyTextArea.stories.ts +25 -0
- package/src/components/SyTextArea/SyTextArea.vue +7 -0
- package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +1 -1
- package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +18 -0
- package/src/components/SyTextArea/tests/SyTextArea.spec.ts +135 -1
- package/src/components/SyTextArea/tests/SyTextArea.visual.cy.ts +48 -0
- package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-default.snap.png +0 -0
- package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-filled.snap.png +0 -0
- package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-required.snap.png +0 -0
- package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-with-value.snap.png +0 -0
- package/src/components/SyTextArea/validation/Validation.stories.ts +6 -86
- package/src/components/TableToolbar/tests/TableToolbar.visual.cy.ts +49 -0
- package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-default.snap.png +0 -0
- package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-filtered.snap.png +0 -0
- package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-loading.snap.png +0 -0
- package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-with-add-btn.snap.png +0 -0
- package/src/components/Tables/SyServerTable/SyServerTable.vue +3 -3
- package/src/components/Tables/SyServerTable/accessibilite/Accessibility.mdx +114 -7
- package/src/components/Tables/SyServerTable/tests/SyServerTable.visual.cy.ts +58 -0
- package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-default.snap.png +0 -0
- package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-loading.snap.png +0 -0
- package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-with-select.snap.png +0 -0
- package/src/components/Tables/SyTable/accessibilite/Accessibility.mdx +116 -7
- package/src/components/Tables/SyTable/tests/SyTable.visual.cy.ts +70 -0
- package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-compact.snap.png +0 -0
- package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-default.snap.png +0 -0
- package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-striped.snap.png +0 -0
- package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-with-select.snap.png +0 -0
- package/src/components/Tables/common/tableStyles.scss +4 -4
- package/src/components/Tables/common/tests/SyTableFilter.spec.ts +8 -1
- package/src/components/Tables/common/tests/filterByRange.spec.ts +23 -22
- package/src/components/ToolbarContainer/tests/ToolbarContainer.visual.cy.ts +34 -0
- package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-default.snap.png +0 -0
- package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-links.snap.png +0 -0
- package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +1 -2
- package/src/components/UploadWorkflow/tests/UploadWorkflow.visual.cy.ts +39 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-default.snap.png +0 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-with-title.snap.png +0 -0
- package/src/components/UserMenuBtn/tests/UserMenuBtn.visual.cy.ts +42 -0
- package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-default.snap.png +0 -0
- package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-no-logout.snap.png +0 -0
- package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-with-name.snap.png +0 -0
- package/src/composables/unifyValidation/documentationValidationProps.ts +1 -1
- package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +2 -2
- package/src/composables/unifyValidation/useValidation.ts +17 -11
- package/src/composables/useFilterable/useFilterable.spec.ts +105 -142
- package/src/composables/useFilterable/useFilterable.ts +6 -17
- package/src/composables/useFormFieldErrorHandling.ts +1 -1
- package/src/composables/validation/tests/useFormValidation.spec.ts +11 -2
- package/src/composables/validation/tests/useValidatable.spec.ts +16 -6
- package/src/composables/validation/tests/useValidation.spec.ts +2 -2
- package/src/composables/validation/useValidation.ts +1 -1
- package/src/composantsVuetify/VCard/VCard.mdx +8 -0
- package/src/composantsVuetify/VCard/v-card.stories.ts +191 -1
- package/src/composantsVuetify/VStepper/VStepper.mdx +56 -0
- package/src/composantsVuetify/VStepper/v-stepper.stories.ts +563 -0
- package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -0
- package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
- package/src/designTokens/tokens/pa/paLightTheme.ts +1 -0
- package/src/stories/Accessibilite/DesignSystem/a11y-status.json +1 -1
- package/src/stories/Components/Components.stories.ts +61 -10
- package/src/stories/Demarrer/Releases.stories.ts +45 -2
- package/src/stories/DesignTokens/Colors.mdx +2 -0
- package/src/stories/DesignTokens/colors.stories.ts +13 -0
- package/src/stories/EcoConception/EcoBestPracticesDoc.vue +930 -0
- package/src/stories/EcoConception/EcoBestPratices.mdx +38 -0
- package/src/stories/EcoConception/Introduction.mdx +8 -1
- package/src/stories/EcoConception/datas/bonnes_pratiques_essentielles.json +1018 -0
- package/src/stories/EcoConception/ecoconception-best-practices.stories.ts +20 -0
- package/src/stories/GuideDuDev/Amelipro.mdx +9 -1
- package/src/stories/GuideDuDev/Amelipro.stories.ts +955 -168
- package/src/stories/GuideDuDev/PortailAgent.stories.ts +0 -1
- package/src/utils/functions/deepCopy/index.ts +2 -3
- package/dist/components/Customs/SyCheckbox/locales.d.ts +0 -3
- package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +0 -1
- package/dist/components/SyHeading/SyHeading.test.d.ts +0 -1
- package/src/components/Customs/SyCheckbox/locales.ts +0 -3
- package/src/components/Customs/SyTextField/types.d.ts +0 -4
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { locales } from './locales'
|
|
6
6
|
import { useValidation } from '@/composables/unifyValidation/useValidation'
|
|
7
7
|
import { useNirValidation, type NirValidationProps } from './useNirValidation'
|
|
8
|
+
import { useValidatable } from '@/composables/validation/useValidatable'
|
|
8
9
|
|
|
9
10
|
const props = withDefaults(defineProps<{
|
|
10
11
|
modelValue?: string | undefined | null
|
|
@@ -12,6 +13,7 @@
|
|
|
12
13
|
numberLabel?: string
|
|
13
14
|
keyLabel?: string
|
|
14
15
|
displayKey?: boolean
|
|
16
|
+
helpText?: string
|
|
15
17
|
nirTooltip?: string
|
|
16
18
|
keyTooltip?: string
|
|
17
19
|
nirTooltipPosition?: 'prepend' | 'append'
|
|
@@ -40,6 +42,7 @@
|
|
|
40
42
|
numberLabel: 'Numéro de sécurité sociale',
|
|
41
43
|
keyLabel: 'Clé de validation',
|
|
42
44
|
displayKey: true,
|
|
45
|
+
helpText: '',
|
|
43
46
|
nirTooltip: undefined,
|
|
44
47
|
keyRules: () => [],
|
|
45
48
|
keyTooltip: undefined,
|
|
@@ -52,7 +55,7 @@
|
|
|
52
55
|
customNumberWarningRules: () => [],
|
|
53
56
|
customKeyWarningRules: () => [],
|
|
54
57
|
customRulesPrecedence: false,
|
|
55
|
-
showSuccessMessages:
|
|
58
|
+
showSuccessMessages: false,
|
|
56
59
|
width: '100%',
|
|
57
60
|
bgColor: 'white',
|
|
58
61
|
disabled: false,
|
|
@@ -71,9 +74,17 @@
|
|
|
71
74
|
persistentPlaceholder: false,
|
|
72
75
|
disableErrorHandling: false,
|
|
73
76
|
numberRules: () => [],
|
|
77
|
+
useVuetifyValidation: false,
|
|
74
78
|
nirType: 'simple',
|
|
75
79
|
withoutFieldset: false,
|
|
76
80
|
customLocale: () => locales,
|
|
81
|
+
errorMessages: null,
|
|
82
|
+
warningMessages: null,
|
|
83
|
+
successMessages: null,
|
|
84
|
+
hasError: false,
|
|
85
|
+
hasWarning: false,
|
|
86
|
+
hasSuccess: false,
|
|
87
|
+
maxErrors: 1,
|
|
77
88
|
})
|
|
78
89
|
|
|
79
90
|
const emit = defineEmits(['update:modelValue'])
|
|
@@ -173,35 +184,6 @@
|
|
|
173
184
|
}
|
|
174
185
|
})
|
|
175
186
|
|
|
176
|
-
// Synchronisation avec modelValue
|
|
177
|
-
watch(modelValueRef, (newValue) => {
|
|
178
|
-
// Ignorer les mises à jour internes pour éviter les boucles infinies
|
|
179
|
-
if (isInternalUpdate.value) return
|
|
180
|
-
|
|
181
|
-
if (newValue === undefined || newValue === null) {
|
|
182
|
-
numberValue.value = ''
|
|
183
|
-
keyValue.value = ''
|
|
184
|
-
return
|
|
185
|
-
}
|
|
186
|
-
if (newValue.length === 15) {
|
|
187
|
-
const number = newValue.slice(0, -2)
|
|
188
|
-
const key = newValue.slice(-2)
|
|
189
|
-
numberValue.value = number
|
|
190
|
-
keyValue.value = key
|
|
191
|
-
}
|
|
192
|
-
if (newValue.length === 14) {
|
|
193
|
-
const number = newValue.slice(0, -1)
|
|
194
|
-
const key = newValue.slice(-1)
|
|
195
|
-
numberValue.value = number
|
|
196
|
-
keyValue.value = key
|
|
197
|
-
}
|
|
198
|
-
if (newValue.length <= 13) {
|
|
199
|
-
const number = newValue
|
|
200
|
-
numberValue.value = number
|
|
201
|
-
keyValue.value = ''
|
|
202
|
-
}
|
|
203
|
-
}, { immediate: true })
|
|
204
|
-
|
|
205
187
|
// Émission de la valeur
|
|
206
188
|
const emitValue = () => {
|
|
207
189
|
const number = unmaskedNumberValue.value
|
|
@@ -228,6 +210,7 @@
|
|
|
228
210
|
keyValidation,
|
|
229
211
|
validateFields,
|
|
230
212
|
hasFieldErrors,
|
|
213
|
+
clearValidation,
|
|
231
214
|
} = useNirValidation(
|
|
232
215
|
numberValue,
|
|
233
216
|
keyValue,
|
|
@@ -255,12 +238,59 @@
|
|
|
255
238
|
toRef(props, 'useVuetifyValidation'),
|
|
256
239
|
toRef(props, 'numberRules'),
|
|
257
240
|
toRef(props, 'keyRules'),
|
|
241
|
+
toRef(props, 'errorMessages'),
|
|
242
|
+
toRef(props, 'warningMessages'),
|
|
243
|
+
toRef(props, 'successMessages'),
|
|
244
|
+
toRef(props, 'hasError'),
|
|
245
|
+
toRef(props, 'hasWarning'),
|
|
246
|
+
toRef(props, 'hasSuccess'),
|
|
247
|
+
toRef(props, 'maxErrors'),
|
|
258
248
|
)
|
|
259
249
|
|
|
250
|
+
// Synchronisation avec modelValue — placé après useNirValidation pour éviter le TDZ sur clearValidation
|
|
251
|
+
watch(modelValueRef, (newValue) => {
|
|
252
|
+
if (isInternalUpdate.value) return
|
|
253
|
+
|
|
254
|
+
if (newValue === undefined || newValue === null) {
|
|
255
|
+
numberValue.value = ''
|
|
256
|
+
keyValue.value = ''
|
|
257
|
+
clearValidation()
|
|
258
|
+
return
|
|
259
|
+
}
|
|
260
|
+
if (newValue.length === 15) {
|
|
261
|
+
const number = newValue.slice(0, -2)
|
|
262
|
+
const key = newValue.slice(-2)
|
|
263
|
+
numberValue.value = number
|
|
264
|
+
keyValue.value = key
|
|
265
|
+
}
|
|
266
|
+
if (newValue.length === 14) {
|
|
267
|
+
const number = newValue.slice(0, -1)
|
|
268
|
+
const key = newValue.slice(-1)
|
|
269
|
+
numberValue.value = number
|
|
270
|
+
keyValue.value = key
|
|
271
|
+
}
|
|
272
|
+
if (newValue.length <= 13) {
|
|
273
|
+
const number = newValue
|
|
274
|
+
numberValue.value = number
|
|
275
|
+
keyValue.value = ''
|
|
276
|
+
}
|
|
277
|
+
}, { immediate: true })
|
|
278
|
+
|
|
260
279
|
const validateOnSubmit = () => {
|
|
261
280
|
return validateFields(true)
|
|
262
281
|
}
|
|
263
282
|
|
|
283
|
+
useValidatable(validateOnSubmit, clearValidation)
|
|
284
|
+
|
|
285
|
+
const hasMessages = computed(() => {
|
|
286
|
+
if (props.disableErrorHandling) return false
|
|
287
|
+
return hasFieldErrors.value
|
|
288
|
+
|| numberValidation.hasWarning.value
|
|
289
|
+
|| keyValidation.hasWarning.value
|
|
290
|
+
|| (numberValidation.hasSuccess.value && props.showSuccessMessages)
|
|
291
|
+
|| (keyValidation.hasSuccess.value && props.showSuccessMessages)
|
|
292
|
+
})
|
|
293
|
+
|
|
264
294
|
// Propriétés calculées pour les attributs ARIA et les états d'erreur
|
|
265
295
|
const ariaRequired = computed(() => props.required ? 'true' : undefined)
|
|
266
296
|
const ariaInvalidNumber = computed(() => hasFieldErrors.value ? 'true' : undefined)
|
|
@@ -339,12 +369,14 @@
|
|
|
339
369
|
|
|
340
370
|
defineExpose({
|
|
341
371
|
validateOnSubmit,
|
|
372
|
+
clearValidation,
|
|
342
373
|
numberMask,
|
|
343
374
|
keyMask,
|
|
344
375
|
numberValidation,
|
|
345
376
|
keyValidation,
|
|
346
377
|
} satisfies {
|
|
347
378
|
validateOnSubmit: () => Promise<boolean>
|
|
379
|
+
clearValidation: () => void
|
|
348
380
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
349
381
|
numberMask: { mask: string, preProcess: (value: string) => string, tokens: Record<string, any> }
|
|
350
382
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
@@ -390,7 +422,7 @@
|
|
|
390
422
|
:hide-spin-buttons="props.hideSpinButtons"
|
|
391
423
|
:placeholder="props.placeholder"
|
|
392
424
|
:readonly="props.readonly"
|
|
393
|
-
:clearable="props.clearable"
|
|
425
|
+
:is-clearable="props.clearable"
|
|
394
426
|
:counter="props.counter"
|
|
395
427
|
:hint="props.numberHint || locales.numberHint"
|
|
396
428
|
:persistent-hint="props.persistentHint"
|
|
@@ -428,7 +460,7 @@
|
|
|
428
460
|
:hide-spin-buttons="props.hideSpinButtons"
|
|
429
461
|
:placeholder="props.placeholder"
|
|
430
462
|
:readonly="props.readonly"
|
|
431
|
-
:clearable="props.clearable"
|
|
463
|
+
:is-clearable="props.clearable"
|
|
432
464
|
:counter="props.counter"
|
|
433
465
|
:hint="props.keyHint || locales.keyHint"
|
|
434
466
|
:persistent-hint="props.persistentHint"
|
|
@@ -448,6 +480,13 @@
|
|
|
448
480
|
@input="handleKeyInput"
|
|
449
481
|
/>
|
|
450
482
|
</div>
|
|
483
|
+
<div
|
|
484
|
+
v-if="helpText && !hasMessages && !hideDetails"
|
|
485
|
+
class="sy-nir-help-text"
|
|
486
|
+
style="flex: 1 0 100%;"
|
|
487
|
+
>
|
|
488
|
+
{{ helpText }}
|
|
489
|
+
</div>
|
|
451
490
|
<div
|
|
452
491
|
class="sy-messages"
|
|
453
492
|
style="flex: 1 0 100%;"
|
|
@@ -513,6 +552,13 @@
|
|
|
513
552
|
/>
|
|
514
553
|
</div>
|
|
515
554
|
</div>
|
|
555
|
+
<div
|
|
556
|
+
v-if="helpText && hasMessages && !hideDetails"
|
|
557
|
+
class="sy-nir-help-text"
|
|
558
|
+
style="flex: 1 0 100%;"
|
|
559
|
+
>
|
|
560
|
+
{{ helpText }}
|
|
561
|
+
</div>
|
|
516
562
|
</component>
|
|
517
563
|
</template>
|
|
518
564
|
|
|
@@ -566,6 +612,17 @@
|
|
|
566
612
|
width: 100%;
|
|
567
613
|
}
|
|
568
614
|
|
|
615
|
+
/* La zone de détails interne des champs ne sert qu'au hint au focus : on ne réserve
|
|
616
|
+
pas d'espace vide sous l'input (helpText/messages NirField gérés à part), pour coller
|
|
617
|
+
le helpText au champ comme SySelect. Elle grandit naturellement si un hint s'affiche au focus. */
|
|
618
|
+
.nir-field :deep(.v-input__details) {
|
|
619
|
+
min-height: 0 !important;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
.nir-field :deep(.v-input__details .v-messages) {
|
|
623
|
+
min-height: 0;
|
|
624
|
+
}
|
|
625
|
+
|
|
569
626
|
.key-field {
|
|
570
627
|
min-width: 110px;
|
|
571
628
|
flex-wrap: wrap;
|
|
@@ -592,6 +649,15 @@
|
|
|
592
649
|
padding-bottom: 6px;
|
|
593
650
|
}
|
|
594
651
|
|
|
652
|
+
.sy-nir-help-text {
|
|
653
|
+
font-size: var(--v-fontSize-liensEtLibelles);
|
|
654
|
+
font-weight: 400;
|
|
655
|
+
letter-spacing: 0.0333em;
|
|
656
|
+
line-height: 16px;
|
|
657
|
+
padding-inline: 16px;
|
|
658
|
+
color: rgba(var(--v-theme-onSurface), var(--v-medium-emphasis-opacity));
|
|
659
|
+
}
|
|
660
|
+
|
|
595
661
|
.sy-number-errors,
|
|
596
662
|
.sy-key-errors {
|
|
597
663
|
color: rgb(var(--v-theme-error));
|
|
@@ -397,28 +397,15 @@ describe('NirField.vue', () => {
|
|
|
397
397
|
})
|
|
398
398
|
|
|
399
399
|
it('respects showSuccessMessages prop', async () => {
|
|
400
|
-
// Par défaut, showSuccessMessages =
|
|
400
|
+
// Par défaut, showSuccessMessages = false
|
|
401
401
|
await wrapper.setProps({ showSuccessMessages: true })
|
|
402
|
-
|
|
403
|
-
// On ne peut pas tester facilement le DOM de VMessages dans ce contexte jsdom avec Vuetify
|
|
404
|
-
// On vérifie donc que la prop showSuccessMessages est bien transmise aux éléments enfants
|
|
405
|
-
// internes si applicable, ou que le comportement conditionnel est correctement câblé.
|
|
406
|
-
// La prop showSuccessMessages est utilisée dans v-show="numberValidation.hasSuccess.value && showSuccessMessages"
|
|
407
|
-
|
|
408
|
-
// Pour tester que Vue applique bien la condition, on vérifie l'état de notre wrapper
|
|
409
402
|
expect(wrapper.props('showSuccessMessages')).toBe(true)
|
|
410
403
|
|
|
411
|
-
// Avec showSuccessMessages = false
|
|
412
404
|
await wrapper.setProps({ showSuccessMessages: false })
|
|
413
405
|
await wrapper.vm.$nextTick()
|
|
414
406
|
await flushPromises()
|
|
415
407
|
|
|
416
408
|
expect(wrapper.props('showSuccessMessages')).toBe(false)
|
|
417
|
-
|
|
418
|
-
// On vérifie également que l'attribut est passé aux sous-composants s'ils l'utilisent
|
|
419
|
-
const textFields = wrapper.findAllComponents({ name: 'SyTextField' })
|
|
420
|
-
// SyTextField a showSuccessMessages false en dur dans NirField
|
|
421
|
-
expect(textFields[0]?.props('showSuccessMessages')).toBe(false)
|
|
422
409
|
})
|
|
423
410
|
|
|
424
411
|
it('respects disableErrorHandling prop', async () => {
|
|
@@ -452,6 +439,23 @@ describe('NirField.vue', () => {
|
|
|
452
439
|
expect(textFields[1]?.props('appendTooltip')).toBe(keyTooltip)
|
|
453
440
|
})
|
|
454
441
|
|
|
442
|
+
it('affiche les hints internes (numberHint/keyHint) quand persistentHint est true', async () => {
|
|
443
|
+
const w = mount(NirField, {
|
|
444
|
+
props: {
|
|
445
|
+
label: 'Identifiant',
|
|
446
|
+
numberHint: 'Indice numéro',
|
|
447
|
+
keyHint: 'Indice clé',
|
|
448
|
+
persistentHint: true,
|
|
449
|
+
},
|
|
450
|
+
})
|
|
451
|
+
activeWrappers.push(w)
|
|
452
|
+
await w.vm.$nextTick()
|
|
453
|
+
await flushPromises()
|
|
454
|
+
|
|
455
|
+
expect(w.text()).toContain('Indice numéro')
|
|
456
|
+
expect(w.text()).toContain('Indice clé')
|
|
457
|
+
})
|
|
458
|
+
|
|
455
459
|
it('renders asterisks correctly when displayAsterisk is true AND required is true', async () => {
|
|
456
460
|
// L'astérisque n'est affiché que si required = true ET displayAsterisk = true
|
|
457
461
|
await wrapper.setProps({ required: true, displayAsterisk: true, numberLabel: 'Numéro', keyLabel: 'Clé' })
|
|
@@ -622,4 +626,121 @@ describe('NirField.vue', () => {
|
|
|
622
626
|
focusSpy.mockRestore()
|
|
623
627
|
})
|
|
624
628
|
})
|
|
629
|
+
|
|
630
|
+
describe('helpText', () => {
|
|
631
|
+
it('affiche le helpText quand aucun message de validation', async () => {
|
|
632
|
+
const w = mount(NirField, { props: { label: 'Identifiant', helpText: 'Saisissez le NIR' } })
|
|
633
|
+
activeWrappers.push(w)
|
|
634
|
+
await w.vm.$nextTick()
|
|
635
|
+
await flushPromises()
|
|
636
|
+
|
|
637
|
+
const help = w.find('.sy-nir-help-text')
|
|
638
|
+
expect(help.exists()).toBe(true)
|
|
639
|
+
expect(help.text()).toBe('Saisissez le NIR')
|
|
640
|
+
})
|
|
641
|
+
|
|
642
|
+
it('n\'affiche pas le helpText quand hideDetails est true', async () => {
|
|
643
|
+
const w = mount(NirField, { props: { label: 'Identifiant', helpText: 'Saisissez le NIR', hideDetails: true } })
|
|
644
|
+
activeWrappers.push(w)
|
|
645
|
+
await w.vm.$nextTick()
|
|
646
|
+
await flushPromises()
|
|
647
|
+
|
|
648
|
+
expect(w.find('.sy-nir-help-text').exists()).toBe(false)
|
|
649
|
+
})
|
|
650
|
+
|
|
651
|
+
it('affiche toujours le helpText lorsqu\'une erreur est présente', async () => {
|
|
652
|
+
const w = mount(NirField, { props: { label: 'Identifiant', helpText: 'Saisissez le NIR', required: true } })
|
|
653
|
+
activeWrappers.push(w)
|
|
654
|
+
await w.vm.$nextTick()
|
|
655
|
+
await flushPromises()
|
|
656
|
+
|
|
657
|
+
// Déclenche l'erreur "requis" (champ vide)
|
|
658
|
+
await w.vm.validateOnSubmit()
|
|
659
|
+
await w.vm.$nextTick()
|
|
660
|
+
await flushPromises()
|
|
661
|
+
|
|
662
|
+
const help = w.find('.sy-nir-help-text')
|
|
663
|
+
expect(help.exists()).toBe(true)
|
|
664
|
+
expect(help.text()).toBe('Saisissez le NIR')
|
|
665
|
+
})
|
|
666
|
+
})
|
|
667
|
+
|
|
668
|
+
describe('clearable', () => {
|
|
669
|
+
it('affiche le bouton clear quand clearable et qu\'il y a une valeur', async () => {
|
|
670
|
+
const w = mount(NirField, { props: { label: 'Identifiant', clearable: true } })
|
|
671
|
+
activeWrappers.push(w)
|
|
672
|
+
await w.find('.number-field input').setValue('2940375120005')
|
|
673
|
+
await w.vm.$nextTick()
|
|
674
|
+
await flushPromises()
|
|
675
|
+
|
|
676
|
+
expect(w.find('.number-field .sy-text-field__clear').exists()).toBe(true)
|
|
677
|
+
})
|
|
678
|
+
|
|
679
|
+
it('n\'affiche pas le bouton clear quand clearable est false', async () => {
|
|
680
|
+
const w = mount(NirField, { props: { label: 'Identifiant', clearable: false } })
|
|
681
|
+
activeWrappers.push(w)
|
|
682
|
+
await w.find('.number-field input').setValue('2940375120005')
|
|
683
|
+
await w.vm.$nextTick()
|
|
684
|
+
await flushPromises()
|
|
685
|
+
|
|
686
|
+
expect(w.find('.number-field .sy-text-field__clear').exists()).toBe(false)
|
|
687
|
+
})
|
|
688
|
+
|
|
689
|
+
it('vide le champ au clic sur le bouton clear', async () => {
|
|
690
|
+
const w = mount(NirField, { props: { label: 'Identifiant', clearable: true } })
|
|
691
|
+
activeWrappers.push(w)
|
|
692
|
+
const numberInput = w.find('.number-field input')
|
|
693
|
+
await numberInput.setValue('2940375120005')
|
|
694
|
+
await w.vm.$nextTick()
|
|
695
|
+
await flushPromises()
|
|
696
|
+
|
|
697
|
+
await w.find('.number-field .sy-text-field__clear').trigger('click')
|
|
698
|
+
await w.vm.$nextTick()
|
|
699
|
+
await flushPromises()
|
|
700
|
+
|
|
701
|
+
expect((numberInput.element as HTMLInputElement).value).toBe('')
|
|
702
|
+
})
|
|
703
|
+
})
|
|
704
|
+
|
|
705
|
+
describe('validation Vuetify (numberRules / keyRules)', () => {
|
|
706
|
+
const numberRules = [(v: string) => (!!v && v.replace(/\s/g, '').length === 13) || 'Le numéro doit contenir 13 chiffres']
|
|
707
|
+
const keyRules = [(v: string) => (!!v && v.replace(/\s/g, '').length === 2) || 'La clé doit contenir 2 chiffres']
|
|
708
|
+
|
|
709
|
+
it('applique numberRules : un NIR partiel est invalide', async () => {
|
|
710
|
+
const w = mount(NirField, { props: { label: 'Identifiant', useVuetifyValidation: true, numberRules, keyRules } })
|
|
711
|
+
activeWrappers.push(w)
|
|
712
|
+
await w.find('.number-field input').setValue('12345')
|
|
713
|
+
await w.vm.$nextTick()
|
|
714
|
+
await flushPromises()
|
|
715
|
+
|
|
716
|
+
const isValid = await w.vm.validateOnSubmit()
|
|
717
|
+
await flushPromises()
|
|
718
|
+
expect(isValid).toBe(false)
|
|
719
|
+
})
|
|
720
|
+
|
|
721
|
+
it('applique keyRules : une clé vide invalide même si le numéro est complet', async () => {
|
|
722
|
+
const w = mount(NirField, { props: { label: 'Identifiant', useVuetifyValidation: true, numberRules, keyRules } })
|
|
723
|
+
activeWrappers.push(w)
|
|
724
|
+
await w.find('.number-field input').setValue('2940375120005')
|
|
725
|
+
await w.vm.$nextTick()
|
|
726
|
+
await flushPromises()
|
|
727
|
+
|
|
728
|
+
const isValid = await w.vm.validateOnSubmit()
|
|
729
|
+
await flushPromises()
|
|
730
|
+
expect(isValid).toBe(false)
|
|
731
|
+
})
|
|
732
|
+
|
|
733
|
+
it('valide quand le numéro (13 chiffres) et la clé (2 chiffres) respectent les règles', async () => {
|
|
734
|
+
const w = mount(NirField, { props: { label: 'Identifiant', useVuetifyValidation: true, numberRules, keyRules } })
|
|
735
|
+
activeWrappers.push(w)
|
|
736
|
+
await w.find('.number-field input').setValue('2940375120005')
|
|
737
|
+
await w.find('.key-field input').setValue('05')
|
|
738
|
+
await w.vm.$nextTick()
|
|
739
|
+
await flushPromises()
|
|
740
|
+
|
|
741
|
+
const isValid = await w.vm.validateOnSubmit()
|
|
742
|
+
await flushPromises()
|
|
743
|
+
expect(isValid).toBe(true)
|
|
744
|
+
})
|
|
745
|
+
})
|
|
625
746
|
})
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import NirField from '../NirField.vue'
|
|
2
|
+
|
|
3
|
+
describe('NirField - Visual regression tests', () => {
|
|
4
|
+
it('displays the NIR field by default', () => {
|
|
5
|
+
cy.mountWithVuetify(NirField)
|
|
6
|
+
|
|
7
|
+
cy.get('.v-application').should('be.visible')
|
|
8
|
+
cy.matchImageSnapshot('nir-field-default', cy.get('.v-application'))
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
it('displays the NIR field with key display', () => {
|
|
12
|
+
cy.mountWithVuetify(NirField, {
|
|
13
|
+
props: { displayKey: true },
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
cy.get('.v-application').should('be.visible')
|
|
17
|
+
cy.matchImageSnapshot('nir-field-with-key', cy.get('.v-application'))
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('displays the NIR field in complex mode', () => {
|
|
21
|
+
cy.mountWithVuetify(NirField, {
|
|
22
|
+
props: { nirType: 'complexe' },
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
cy.get('.v-application').should('be.visible')
|
|
26
|
+
cy.matchImageSnapshot('nir-field-complex', cy.get('.v-application'))
|
|
27
|
+
})
|
|
28
|
+
})
|
|
@@ -446,4 +446,172 @@ describe('useNirValidation via NirField component', () => {
|
|
|
446
446
|
const isValid = await wrapper.vm.validateOnSubmit()
|
|
447
447
|
expect(isValid).toBe(true)
|
|
448
448
|
})
|
|
449
|
+
|
|
450
|
+
it('ne devrait afficher aucune erreur ni état quand disableErrorHandling est vrai', async () => {
|
|
451
|
+
wrapper = await createWrapper({ required: true, disableErrorHandling: true })
|
|
452
|
+
|
|
453
|
+
await wrapper.find('.number-field input').trigger('focus')
|
|
454
|
+
await wrapper.find('.number-field input').trigger('blur')
|
|
455
|
+
await wrapper.vm.$nextTick()
|
|
456
|
+
await flushPromises()
|
|
457
|
+
|
|
458
|
+
expect(wrapper.vm.numberValidation.errors.value).toEqual([])
|
|
459
|
+
expect(wrapper.vm.numberValidation.hasError.value).toBe(false)
|
|
460
|
+
|
|
461
|
+
await wrapper.find('.key-field input').trigger('focus')
|
|
462
|
+
await wrapper.find('.key-field input').trigger('blur')
|
|
463
|
+
await wrapper.vm.$nextTick()
|
|
464
|
+
await flushPromises()
|
|
465
|
+
|
|
466
|
+
expect(wrapper.vm.keyValidation.errors.value).toEqual([])
|
|
467
|
+
expect(wrapper.vm.keyValidation.hasError.value).toBe(false)
|
|
468
|
+
})
|
|
469
|
+
|
|
470
|
+
it('devrait valider à chaque changement de valeur quand isValidateOnBlur est faux', async () => {
|
|
471
|
+
wrapper = await createWrapper({ required: true, isValidateOnBlur: false })
|
|
472
|
+
|
|
473
|
+
const numberInput = wrapper.find('.number-field input')
|
|
474
|
+
|
|
475
|
+
// Saisie d'une valeur invalide sans blur
|
|
476
|
+
await numberInput.setValue('123')
|
|
477
|
+
await wrapper.vm.$nextTick()
|
|
478
|
+
await flushPromises()
|
|
479
|
+
|
|
480
|
+
// L'erreur doit apparaître immédiatement, sans blur
|
|
481
|
+
expect(wrapper.vm.numberValidation.errors.value).toContain(locales.errorInvalidNumber)
|
|
482
|
+
|
|
483
|
+
// Correction vers une valeur valide
|
|
484
|
+
await numberInput.setValue('2940375120005')
|
|
485
|
+
await wrapper.vm.$nextTick()
|
|
486
|
+
await flushPromises()
|
|
487
|
+
|
|
488
|
+
expect(wrapper.vm.numberValidation.errors.value).toEqual([])
|
|
489
|
+
})
|
|
490
|
+
|
|
491
|
+
it('devrait afficher les errorMessages injectés depuis le parent', async () => {
|
|
492
|
+
const injectedError = 'Erreur injectée depuis le parent'
|
|
493
|
+
wrapper = await createWrapper({ errorMessages: [injectedError] })
|
|
494
|
+
|
|
495
|
+
await wrapper.vm.$nextTick()
|
|
496
|
+
await flushPromises()
|
|
497
|
+
|
|
498
|
+
// L'état d'erreur doit refléter le message injecté sans déclencher de validation
|
|
499
|
+
expect(wrapper.vm.numberValidation.hasError.value).toBe(true)
|
|
500
|
+
expect(wrapper.vm.numberValidation.errors.value).toContain(injectedError)
|
|
501
|
+
})
|
|
502
|
+
|
|
503
|
+
it('devrait réinitialiser la validation quand modelValue passe à null ou undefined', async () => {
|
|
504
|
+
// Partir d'un NIR invalide pour avoir une erreur
|
|
505
|
+
wrapper = await createWrapper({ required: true, modelValue: '199012345678' })
|
|
506
|
+
|
|
507
|
+
await wrapper.vm.validateOnSubmit()
|
|
508
|
+
await wrapper.vm.$nextTick()
|
|
509
|
+
await flushPromises()
|
|
510
|
+
|
|
511
|
+
expect(wrapper.vm.numberValidation.errors.value.length).toBeGreaterThan(0)
|
|
512
|
+
|
|
513
|
+
// Remettre modelValue à undefined simule un reset depuis le parent
|
|
514
|
+
await wrapper.setProps({ modelValue: undefined })
|
|
515
|
+
await wrapper.vm.$nextTick()
|
|
516
|
+
await flushPromises()
|
|
517
|
+
|
|
518
|
+
expect(wrapper.vm.numberValidation.errors.value).toEqual([])
|
|
519
|
+
expect(wrapper.vm.keyValidation.errors.value).toEqual([])
|
|
520
|
+
})
|
|
521
|
+
|
|
522
|
+
it('devrait afficher les warningMessages injectés depuis le parent', async () => {
|
|
523
|
+
const injectedWarning = 'Avertissement injecté depuis le parent'
|
|
524
|
+
wrapper = await createWrapper({ warningMessages: [injectedWarning] })
|
|
525
|
+
|
|
526
|
+
await wrapper.vm.$nextTick()
|
|
527
|
+
await flushPromises()
|
|
528
|
+
|
|
529
|
+
expect(wrapper.vm.numberValidation.hasWarning.value).toBe(true)
|
|
530
|
+
expect(wrapper.vm.numberValidation.warnings.value).toContain(injectedWarning)
|
|
531
|
+
})
|
|
532
|
+
|
|
533
|
+
it('devrait afficher les successMessages injectés depuis le parent', async () => {
|
|
534
|
+
const injectedSuccess = 'Succès injecté depuis le parent'
|
|
535
|
+
wrapper = await createWrapper({ successMessages: [injectedSuccess], showSuccessMessages: true })
|
|
536
|
+
|
|
537
|
+
await wrapper.vm.$nextTick()
|
|
538
|
+
await flushPromises()
|
|
539
|
+
|
|
540
|
+
expect(wrapper.vm.numberValidation.hasSuccess.value).toBe(true)
|
|
541
|
+
expect(wrapper.vm.numberValidation.successes.value).toContain(injectedSuccess)
|
|
542
|
+
})
|
|
543
|
+
|
|
544
|
+
it('devrait refléter l\'état d\'avertissement forcé via la prop hasWarning', async () => {
|
|
545
|
+
wrapper = await createWrapper({ hasWarning: true })
|
|
546
|
+
|
|
547
|
+
expect(wrapper.vm.numberValidation.hasWarning.value).toBe(true)
|
|
548
|
+
})
|
|
549
|
+
|
|
550
|
+
it('devrait refléter l\'état de succès forcé via la prop hasSuccess', async () => {
|
|
551
|
+
wrapper = await createWrapper({ hasSuccess: true })
|
|
552
|
+
|
|
553
|
+
expect(wrapper.vm.numberValidation.hasSuccess.value).toBe(true)
|
|
554
|
+
})
|
|
555
|
+
|
|
556
|
+
it('devrait retourner false sur validateOnSubmit quand le champ est requis et vide', async () => {
|
|
557
|
+
wrapper = await createWrapper({ required: true })
|
|
558
|
+
|
|
559
|
+
const isValid = await wrapper.vm.validateOnSubmit()
|
|
560
|
+
await wrapper.vm.$nextTick()
|
|
561
|
+
await flushPromises()
|
|
562
|
+
|
|
563
|
+
expect(isValid).toBe(false)
|
|
564
|
+
expect(wrapper.vm.numberValidation.hasError.value).toBe(true)
|
|
565
|
+
})
|
|
566
|
+
|
|
567
|
+
it('devrait retourner false sur validateOnSubmit quand le NIR est invalide', async () => {
|
|
568
|
+
wrapper = await createWrapper({ required: true })
|
|
569
|
+
await wrapper.find('.number-field input').setValue('1234567890123') // 13 chiffres mais NIR invalide
|
|
570
|
+
await wrapper.vm.$nextTick()
|
|
571
|
+
await flushPromises()
|
|
572
|
+
|
|
573
|
+
const isValid = await wrapper.vm.validateOnSubmit()
|
|
574
|
+
await wrapper.vm.$nextTick()
|
|
575
|
+
await flushPromises()
|
|
576
|
+
|
|
577
|
+
expect(isValid).toBe(false)
|
|
578
|
+
})
|
|
579
|
+
|
|
580
|
+
it('devrait plafonner le nombre d\'erreurs affichées via maxErrors', async () => {
|
|
581
|
+
const failingRules = [
|
|
582
|
+
{ type: 'custom', options: { validate: () => false, message: 'Erreur custom 1' } },
|
|
583
|
+
{ type: 'custom', options: { validate: () => false, message: 'Erreur custom 2' } },
|
|
584
|
+
]
|
|
585
|
+
|
|
586
|
+
const limited = await createWrapper({ customNumberRules: failingRules, maxErrors: 1, modelValue: '199012345678' })
|
|
587
|
+
await limited.vm.validateOnSubmit()
|
|
588
|
+
await limited.vm.$nextTick()
|
|
589
|
+
await flushPromises()
|
|
590
|
+
expect(limited.vm.numberValidation.errors.value.length).toBe(1)
|
|
591
|
+
|
|
592
|
+
const extended = await createWrapper({ customNumberRules: failingRules, maxErrors: 5, modelValue: '199012345678' })
|
|
593
|
+
await extended.vm.validateOnSubmit()
|
|
594
|
+
await extended.vm.$nextTick()
|
|
595
|
+
await flushPromises()
|
|
596
|
+
expect(extended.vm.numberValidation.errors.value.length).toBeGreaterThan(1)
|
|
597
|
+
})
|
|
598
|
+
|
|
599
|
+
it('ne devrait pas bloquer la soumission à cause d\'un avertissement (warning non bloquant)', async () => {
|
|
600
|
+
const warningMessage = 'Avertissement non bloquant'
|
|
601
|
+
// NIR complet et valide (13 chiffres) + clé valide, avec une règle d'avertissement qui se déclenche
|
|
602
|
+
wrapper = await createWrapper({
|
|
603
|
+
modelValue: '294037512000591',
|
|
604
|
+
customNumberWarningRules: [{ type: 'custom', options: { validate: () => warningMessage, message: warningMessage } }],
|
|
605
|
+
})
|
|
606
|
+
await wrapper.vm.$nextTick()
|
|
607
|
+
await flushPromises()
|
|
608
|
+
|
|
609
|
+
const isValid = await wrapper.vm.validateOnSubmit()
|
|
610
|
+
await wrapper.vm.$nextTick()
|
|
611
|
+
await flushPromises()
|
|
612
|
+
|
|
613
|
+
expect(wrapper.vm.numberValidation.hasWarning.value).toBe(true)
|
|
614
|
+
expect(wrapper.vm.numberValidation.hasError.value).toBe(false)
|
|
615
|
+
expect(isValid).toBe(true)
|
|
616
|
+
})
|
|
449
617
|
})
|