@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.
Files changed (473) hide show
  1. package/README.md +1 -1
  2. package/dist/{AutocompleteFilter-C9eLKyW8.js → AutocompleteFilter-DXd4szWO.js} +3 -3
  3. package/dist/{DateFilter-y-GLkAkn.js → DateFilter-BD59Kgwf.js} +8 -8
  4. package/dist/{NumberFilter-DN6hIBS7.js → NumberFilter-BSMZE7uw.js} +1 -1
  5. package/dist/{PeriodFilter-MoUUp9qS.js → PeriodFilter-keUdSSk0.js} +1 -1
  6. package/dist/{SelectFilter-bCbrdLmu.js → SelectFilter-Dhvvwazl.js} +1 -1
  7. package/dist/{TextFilter-CvjgEaoM.js → TextFilter-CU8FpXz0.js} +4 -4
  8. package/dist/{apLightTheme2026-ug4Y23ns.js → apLightTheme2026-DbS7BPUf.js} +12 -11
  9. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +4 -4
  10. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +4 -4
  11. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +6 -6
  12. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +4 -4
  13. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +4 -4
  14. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +4 -4
  15. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +4 -4
  16. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +2 -2
  17. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +85 -313
  18. package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +2 -2
  19. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +1 -1
  20. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +9 -11
  21. package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +7 -7
  22. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +3 -3
  23. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +5 -5
  24. package/dist/components/Customs/SyIcon/SyIcon.d.ts +77 -1
  25. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +10 -10
  26. package/dist/components/Customs/SyTextField/SyTextField.d.ts +19 -79
  27. package/dist/components/Customs/SyTextField/locales.d.ts +7 -0
  28. package/dist/components/Customs/SyTextField/types.d.ts +67 -4
  29. package/dist/components/Customs/SyTextField/useNumberField.d.ts +23 -0
  30. package/dist/components/Customs/SyTextField/useSyTextFieldValidation.d.ts +38 -0
  31. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +170 -622
  32. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +85 -311
  33. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +39 -152
  34. package/dist/components/FilterInline/FilterInline.d.ts +3 -3
  35. package/dist/components/FilterSideBar/FilterSideBar.d.ts +4 -4
  36. package/dist/components/MonthPicker/MonthPicker.d.ts +37 -150
  37. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +37 -150
  38. package/dist/components/NirField/NirField.d.ts +90 -321
  39. package/dist/components/NirField/useNirValidation.d.ts +10 -20
  40. package/dist/components/PasswordField/PasswordField.d.ts +20 -39
  41. package/dist/components/PasswordField/locales.d.ts +2 -0
  42. package/dist/components/PasswordField/types.d.ts +16 -0
  43. package/dist/components/PasswordField/usePasswordFieldValidation.d.ts +38 -0
  44. package/dist/components/PeriodField/PeriodField.d.ts +349 -1253
  45. package/dist/components/PhoneField/PhoneField.d.ts +37 -150
  46. package/dist/components/SearchListField/SearchListField.d.ts +3 -3
  47. package/dist/components/SyTextArea/SyTextArea.d.ts +14 -11
  48. package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +7 -7
  49. package/dist/components/Tables/common/SyTablePagination.d.ts +19 -20
  50. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +1 -1
  51. package/dist/composables/unifyValidation/useValidation.d.ts +1 -9
  52. package/dist/composables/useFilterable/useFilterable.d.ts +1 -2
  53. package/dist/design-system-v3.js +19 -19
  54. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +1 -0
  55. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +1 -0
  56. package/dist/{main-CI6Q9nmO.js → main-D8ryUoS5.js} +13605 -13358
  57. package/dist/synapse.css +1 -1
  58. package/dist/vuetifyConfig.js +27 -25
  59. package/package.json +6 -5
  60. package/src/components/Accordion/tests/Accordion.visual.cy.ts +44 -0
  61. package/src/components/Accordion/tests/__snapshots__/accordion-default.snap.png +0 -0
  62. package/src/components/Accordion/tests/__snapshots__/accordion-disabled-item.snap.png +0 -0
  63. package/src/components/Accordion/tests/__snapshots__/accordion-open-first.snap.png +0 -0
  64. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  65. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  66. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  67. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  68. package/src/components/BackToTopBtn/tests/BackToTopBtn.visual.cy.ts +34 -0
  69. package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-custom-nudge.snap.png +0 -0
  70. package/src/components/BackToTopBtn/tests/__snapshots__/back-to-top-btn-default.snap.png +0 -0
  71. package/src/components/Captcha/tests/Captcha.visual.cy.ts +45 -0
  72. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +4 -0
  73. package/src/components/Captcha/tests/__snapshots__/captcha-audio-type.snap.png +0 -0
  74. package/src/components/Captcha/tests/__snapshots__/captcha-image-type.snap.png +0 -0
  75. package/src/components/Captcha/tests/__snapshots__/captcha-no-helpdesk.snap.png +0 -0
  76. package/src/components/ChipList/tests/ChipList.visual.cy.ts +46 -0
  77. package/src/components/ChipList/tests/__snapshots__/chip-list-default.snap.png +0 -0
  78. package/src/components/ChipList/tests/__snapshots__/chip-list-readonly.snap.png +0 -0
  79. package/src/components/ChipList/tests/__snapshots__/chip-list-state-icons.snap.png +0 -0
  80. package/src/components/CollapsibleList/tests/CollapsibleList.visual.cy.ts +33 -0
  81. package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-default.snap.png +0 -0
  82. package/src/components/CollapsibleList/tests/__snapshots__/collapsible-list-no-title.snap.png +0 -0
  83. package/src/components/ContextualMenu/tests/ContextualMenu.visual.cy.ts +35 -0
  84. package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-default.snap.png +0 -0
  85. package/src/components/ContextualMenu/tests/__snapshots__/contextual-menu-selected.snap.png +0 -0
  86. package/src/components/CookieBanner/tests/CookieBanner.visual.cy.ts +29 -0
  87. package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-default.snap.png +0 -0
  88. package/src/components/CookieBanner/tests/__snapshots__/cookie-banner-with-items.snap.png +0 -0
  89. package/src/components/CookiesSelection/tests/CookiesSelection.visual.cy.ts +21 -0
  90. package/src/components/CookiesSelection/tests/__snapshots__/cookies-selection-default.snap.png +0 -0
  91. package/src/components/CopyBtn/tests/CopyBtn.visual.cy.ts +24 -0
  92. package/src/components/CopyBtn/tests/__snapshots__/copy-btn-default.snap.png +0 -0
  93. package/src/components/CopyBtn/tests/__snapshots__/copy-btn-no-tooltip.snap.png +0 -0
  94. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.visual.cy.ts +60 -0
  95. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-default.snap.png +0 -0
  96. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-inline.snap.png +0 -0
  97. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-readonly.snap.png +0 -0
  98. package/src/components/Customs/Selects/SelectBtnField/tests/__snapshots__/select-btn-field-selected.snap.png +0 -0
  99. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +1 -1
  100. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +2 -0
  101. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.visual.cy.ts +63 -0
  102. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-default.snap.png +0 -0
  103. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-loading.snap.png +0 -0
  104. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-multiple.snap.png +0 -0
  105. package/src/components/Customs/Selects/SyAutocomplete/tests/__snapshots__/sy-autocomplete-with-value.snap.png +0 -0
  106. package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +0 -93
  107. package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.visual.cy.ts +48 -0
  108. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-default.snap.png +0 -0
  109. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-required.snap.png +0 -0
  110. package/src/components/Customs/Selects/SyInputSelect/tests/__snapshots__/sy-input-select-with-value.snap.png +0 -0
  111. package/src/components/Customs/Selects/SySelect/SySelect.vue +22 -47
  112. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +3 -3
  113. package/src/components/Customs/Selects/SySelect/tests/SySelect.visual.cy.ts +77 -0
  114. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-clearable.snap.png +0 -0
  115. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-default.snap.png +0 -0
  116. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-multiple-chips.snap.png +0 -0
  117. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-required.snap.png +0 -0
  118. package/src/components/Customs/Selects/SySelect/tests/__snapshots__/sy-select-with-value.snap.png +0 -0
  119. package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +1 -92
  120. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +1 -1
  121. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.visual.cy.ts +55 -0
  122. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-default.snap.png +0 -0
  123. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-disabled.snap.png +0 -0
  124. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-selected.snap.png +0 -0
  125. package/src/components/Customs/SyCheckBoxGroup/tests/__snapshots__/sy-checkbox-group-with-label.snap.png +0 -0
  126. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +1 -9
  127. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.visual.cy.ts +61 -0
  128. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-checked.snap.png +0 -0
  129. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-disabled.snap.png +0 -0
  130. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-indeterminate.snap.png +0 -0
  131. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-required.snap.png +0 -0
  132. package/src/components/Customs/SyCheckbox/tests/__snapshots__/sy-checkbox-unchecked.snap.png +0 -0
  133. package/src/components/Customs/SyIcon/SyIcon.vue +19 -1
  134. package/src/components/Customs/SyIcon/tests/SyIcon.visual.cy.ts +83 -0
  135. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-color-error.snap.png +0 -0
  136. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-decorative.snap.png +0 -0
  137. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-informative.snap.png +0 -0
  138. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-role-button.snap.png +0 -0
  139. package/src/components/Customs/SyIcon/tests/__snapshots__/sy-icon-size-large.snap.png +0 -0
  140. package/src/components/Customs/SyIconButton/tests/SyIconButton.visual.cy.ts +55 -0
  141. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-default.snap.png +0 -0
  142. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-disabled.snap.png +0 -0
  143. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-error.snap.png +0 -0
  144. package/src/components/Customs/SyIconButton/tests/__snapshots__/sy-icon-button-large.snap.png +0 -0
  145. package/src/components/Customs/SyPagination/tests/SyPagination.visual.cy.ts +40 -0
  146. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-first-page.snap.png +0 -0
  147. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-middle-page.snap.png +0 -0
  148. package/src/components/Customs/SyPagination/tests/__snapshots__/sy-pagination-with-label.snap.png +0 -0
  149. package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +0 -1
  150. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -3
  151. package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +1 -1
  152. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-asterisk.snap.png +0 -0
  153. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-comfortable.snap.png +0 -0
  154. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-compact.snap.png +0 -0
  155. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-default.snap.png +0 -0
  156. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-disabled.snap.png +0 -0
  157. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-error.snap.png +0 -0
  158. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-no-details.snap.png +0 -0
  159. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-readonly.snap.png +0 -0
  160. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-selected.snap.png +0 -0
  161. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-success.snap.png +0 -0
  162. package/src/components/Customs/SyRadioGroup/tests/__snapshots__/sy-radio-group-warning.snap.png +0 -0
  163. package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +63 -27
  164. package/src/components/Customs/SyTabs/tests/SyTabs.visual.cy.ts +30 -0
  165. package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-default.snap.png +0 -0
  166. package/src/components/Customs/SyTabs/tests/__snapshots__/sy-tabs-second-active.snap.png +0 -0
  167. package/src/components/Customs/SyTextField/SyTextField.stories.ts +160 -778
  168. package/src/components/Customs/SyTextField/SyTextField.vue +168 -153
  169. package/src/components/Customs/SyTextField/Validation/Validation.stories.ts +1164 -0
  170. package/src/components/Customs/SyTextField/locales.ts +12 -0
  171. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +174 -8
  172. package/src/components/Customs/SyTextField/tests/SyTextField.visual.cy.ts +116 -0
  173. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-clearable.snap.png +0 -0
  174. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-default.snap.png +0 -0
  175. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-disabled.snap.png +0 -0
  176. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number-no-spinner.snap.png +0 -0
  177. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-number.snap.png +0 -0
  178. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-prepend-icon.snap.png +0 -0
  179. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-readonly.snap.png +0 -0
  180. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-required.snap.png +0 -0
  181. package/src/components/Customs/SyTextField/tests/__snapshots__/sy-text-field-with-value.snap.png +0 -0
  182. package/src/components/Customs/SyTextField/types.ts +70 -0
  183. package/src/components/Customs/SyTextField/useNumberField.ts +93 -0
  184. package/src/components/Customs/SyTextField/useSyTextFieldValidation.ts +104 -0
  185. package/src/components/DataList/tests/DataList.visual.cy.ts +85 -0
  186. package/src/components/DataList/tests/__snapshots__/data-list-default.snap.png +0 -0
  187. package/src/components/DataList/tests/__snapshots__/data-list-loading.snap.png +0 -0
  188. package/src/components/DataList/tests/__snapshots__/data-list-row.snap.png +0 -0
  189. package/src/components/DataList/tests/__snapshots__/data-list-with-icons.snap.png +0 -0
  190. package/src/components/DataList/tests/__snapshots__/data-list-with-title.snap.png +0 -0
  191. package/src/components/DataListGroup/tests/DataListGroup.visual.cy.ts +51 -0
  192. package/src/components/DataListGroup/tests/__snapshots__/data-list-group-default.snap.png +0 -0
  193. package/src/components/DataListGroup/tests/__snapshots__/data-list-group-loading.snap.png +0 -0
  194. package/src/components/DataListItem/tests/DataListItem.visual.cy.ts +53 -0
  195. package/src/components/DataListItem/tests/__snapshots__/data-list-item-chip.snap.png +0 -0
  196. package/src/components/DataListItem/tests/__snapshots__/data-list-item-default.snap.png +0 -0
  197. package/src/components/DataListItem/tests/__snapshots__/data-list-item-placeholder.snap.png +0 -0
  198. package/src/components/DataListItem/tests/__snapshots__/data-list-item-row.snap.png +0 -0
  199. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  200. package/src/components/DatePicker/CalendarMode/DatePicker.vue +7 -7
  201. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  202. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +7 -8
  203. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +1 -1
  204. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +2 -2
  205. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  206. package/src/components/DatePicker/composables/tests/useTodayButton.spec.ts +10 -10
  207. package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +11 -2
  208. package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.visual.cy.ts +35 -0
  209. package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-default.snap.png +0 -0
  210. package/src/components/DeclarationAccessibilityPage/tests/__snapshots__/declaration-a11y-page-full.snap.png +0 -0
  211. package/src/components/DiacriticPicker/tests/DiacriticPicker.visual.cy.ts +24 -0
  212. package/src/components/DiacriticPicker/tests/__snapshots__/diacritic-picker-custom-title.snap.png +0 -0
  213. package/src/components/DiacriticPicker/tests/__snapshots__/diacritic-picker-default.snap.png +0 -0
  214. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  215. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  216. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  217. package/src/components/DownloadBtn/tests/DownloadBtn.spec.ts +2 -2
  218. package/src/components/DownloadBtn/tests/DownloadBtn.visual.cy.ts +38 -0
  219. package/src/components/DownloadBtn/tests/__snapshots__/download-btn-dark.snap.png +0 -0
  220. package/src/components/DownloadBtn/tests/__snapshots__/download-btn-idle.snap.png +0 -0
  221. package/src/components/ErrorPage/tests/ErrorPage.visual.cy.ts +32 -0
  222. package/src/components/ErrorPage/tests/__snapshots__/error-page-custom.snap.png +0 -0
  223. package/src/components/ErrorPage/tests/__snapshots__/error-page-default.snap.png +0 -0
  224. package/src/components/ErrorPage/tests/__snapshots__/error-page-no-btn.snap.png +0 -0
  225. package/src/components/ExternalLinks/tests/ExternalLinks.visual.cy.ts +30 -0
  226. package/src/components/ExternalLinks/tests/__snapshots__/external-links-default.snap.png +0 -0
  227. package/src/components/ExternalLinks/tests/__snapshots__/external-links-fixed.snap.png +0 -0
  228. package/src/components/FileList/tests/FileList.visual.cy.ts +31 -0
  229. package/src/components/FileList/tests/__snapshots__/file-list-default.snap.png +0 -0
  230. package/src/components/FileList/tests/__snapshots__/file-list-with-delete.snap.png +0 -0
  231. package/src/components/FilePreview/accessibilite/Accessibility.mdx +86 -8
  232. package/src/components/FileUpload/tests/FileUpload.visual.cy.ts +36 -0
  233. package/src/components/FileUpload/tests/__snapshots__/file-upload-default.snap.png +0 -0
  234. package/src/components/FileUpload/tests/__snapshots__/file-upload-disabled.snap.png +0 -0
  235. package/src/components/FileUpload/tests/__snapshots__/file-upload-multiple.snap.png +0 -0
  236. package/src/components/FilterInline/FilterInline.stories.ts +2 -0
  237. package/src/components/FilterInline/FilterInline.vue +10 -5
  238. package/src/components/FilterInline/tests/FilterInline.visual.cy.ts +25 -0
  239. package/src/components/FilterInline/tests/__snapshots__/filter-inline-default.snap.png +0 -0
  240. package/src/components/FilterSideBar/FilterSideBar.stories.ts +4 -1
  241. package/src/components/FilterSideBar/FilterSideBar.vue +11 -6
  242. package/src/components/FilterSideBar/tests/FilterSideBar.visual.cy.ts +37 -0
  243. package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-default.snap.png +0 -0
  244. package/src/components/FilterSideBar/tests/__snapshots__/filter-sidebar-modale.snap.png +0 -0
  245. package/src/components/FooterBar/tests/FooterBar.visual.cy.ts +37 -0
  246. package/src/components/FooterBar/tests/__snapshots__/footer-bar-default.snap.png +0 -0
  247. package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-logo.snap.png +0 -0
  248. package/src/components/FooterBar/tests/__snapshots__/footer-bar-no-social.snap.png +0 -0
  249. package/src/components/FooterBar/tests/__snapshots__/footer-bar-version.snap.png +0 -0
  250. package/src/components/FranceConnectBtn/tests/FranceConnectBtn.visual.cy.ts +38 -0
  251. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-dark.snap.png +0 -0
  252. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-default.snap.png +0 -0
  253. package/src/components/FranceConnectBtn/tests/__snapshots__/france-connect-btn-plus.snap.png +0 -0
  254. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.spec.ts +4 -4
  255. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  256. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  257. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  258. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  259. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  260. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  261. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  262. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  263. package/src/components/HeaderLoading/tests/HeaderLoading.visual.cy.ts +34 -0
  264. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-custom-size.snap.png +0 -0
  265. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-default.snap.png +0 -0
  266. package/src/components/HeaderLoading/tests/__snapshots__/header-loading-standalone.snap.png +0 -0
  267. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +4 -4
  268. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.visual.cy.ts +34 -0
  269. package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-default.snap.png +0 -0
  270. package/src/components/HeaderNavigationBar/tests/__snapshots__/header-navigation-bar-subtitle.snap.png +0 -0
  271. package/src/components/HeaderToolbar/tests/HeaderToolbar.visual.cy.ts +25 -0
  272. package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-custom.snap.png +0 -0
  273. package/src/components/HeaderToolbar/tests/__snapshots__/header-toolbar-default.snap.png +0 -0
  274. package/src/components/LangBtn/tests/LangBtn.visual.cy.ts +33 -0
  275. package/src/components/LangBtn/tests/__snapshots__/lang-btn-default.snap.png +0 -0
  276. package/src/components/LangBtn/tests/__snapshots__/lang-btn-english.snap.png +0 -0
  277. package/src/components/LangBtn/tests/__snapshots__/lang-btn-no-arrow.snap.png +0 -0
  278. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  279. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  280. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  281. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  282. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  283. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  284. package/src/components/LogoBrandSection/tests/LogoBrandSection.visual.cy.ts +43 -0
  285. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-default.snap.png +0 -0
  286. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-mobile.snap.png +0 -0
  287. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-reduced.snap.png +0 -0
  288. package/src/components/LogoBrandSection/tests/__snapshots__/logo-brand-section-with-title.snap.png +0 -0
  289. package/src/components/LunarCalendar/tests/LunarCalendar.visual.cy.ts +36 -0
  290. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-default.snap.png +0 -0
  291. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-required.snap.png +0 -0
  292. package/src/components/LunarCalendar/tests/__snapshots__/lunar-calendar-with-value.snap.png +0 -0
  293. package/src/components/MaintenancePage/tests/MaintenancePage.visual.cy.ts +22 -0
  294. package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-custom.snap.png +0 -0
  295. package/src/components/MaintenancePage/tests/__snapshots__/maintenance-page-default.snap.png +0 -0
  296. package/src/components/MonthPicker/tests/MonthPicker.visual.cy.ts +37 -0
  297. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +2 -0
  298. package/src/components/MonthPicker/tests/__snapshots__/month-picker-default.snap.png +0 -0
  299. package/src/components/MonthPicker/tests/__snapshots__/month-picker-disabled.snap.png +0 -0
  300. package/src/components/MonthPicker/tests/__snapshots__/month-picker-readonly.snap.png +0 -0
  301. package/src/components/MonthPicker/tests/__snapshots__/month-picker-with-value.snap.png +0 -0
  302. package/src/components/NirField/NirField.stories.ts +40 -682
  303. package/src/components/NirField/NirField.vue +98 -32
  304. package/src/components/NirField/tests/NirField.spec.ts +135 -14
  305. package/src/components/NirField/tests/NirField.visual.cy.ts +28 -0
  306. package/src/components/NirField/tests/__snapshots__/nir-field-complex.snap.png +0 -0
  307. package/src/components/NirField/tests/__snapshots__/nir-field-default.snap.png +0 -0
  308. package/src/components/NirField/tests/__snapshots__/nir-field-with-key.snap.png +0 -0
  309. package/src/components/NirField/tests/useNirValidation.spec.ts +168 -0
  310. package/src/components/NirField/useNirValidation.ts +28 -2
  311. package/src/components/NirField/validation/Validation.stories.ts +866 -0
  312. package/src/components/NotFoundPage/tests/NotFoundPage.visual.cy.ts +28 -0
  313. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-custom-btn.snap.png +0 -0
  314. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-default.snap.png +0 -0
  315. package/src/components/NotFoundPage/tests/__snapshots__/not-found-page-no-btn.snap.png +0 -0
  316. package/src/components/NotificationBar/tests/NotificationBar.visual.cy.ts +54 -0
  317. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-bottom.snap.png +0 -0
  318. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-info.snap.png +0 -0
  319. package/src/components/NotificationBar/tests/__snapshots__/notification-bar-multiple.snap.png +0 -0
  320. package/src/components/PageContainer/tests/PageContainer.visual.cy.ts +33 -0
  321. package/src/components/PageContainer/tests/__snapshots__/page-container-color.snap.png +0 -0
  322. package/src/components/PageContainer/tests/__snapshots__/page-container-default.snap.png +0 -0
  323. package/src/components/PageContainer/tests/__snapshots__/page-container-md.snap.png +0 -0
  324. package/src/components/PaginatedTable/accessibilite/Accessibility.mdx +99 -7
  325. package/src/components/PaginatedTable/tests/PaginatedTable.visual.cy.ts +41 -0
  326. package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-default.snap.png +0 -0
  327. package/src/components/PaginatedTable/tests/__snapshots__/paginated-table-server.snap.png +0 -0
  328. package/src/components/PasswordField/PasswordField.mdx +5 -52
  329. package/src/components/PasswordField/PasswordField.stories.ts +74 -931
  330. package/src/components/PasswordField/PasswordField.vue +120 -191
  331. package/src/components/PasswordField/Validation/Validation.stories.ts +1295 -0
  332. package/src/components/PasswordField/locales.ts +2 -0
  333. package/src/components/PasswordField/tests/PasswordField.spec.ts +144 -106
  334. package/src/components/PasswordField/tests/PasswordField.visual.cy.ts +49 -0
  335. package/src/components/PasswordField/tests/__snapshots__/password-field-default.snap.png +0 -0
  336. package/src/components/PasswordField/tests/__snapshots__/password-field-disabled.snap.png +0 -0
  337. package/src/components/PasswordField/tests/__snapshots__/password-field-required.snap.png +0 -0
  338. package/src/components/PasswordField/tests/__snapshots__/password-field-underlined.snap.png +0 -0
  339. package/src/components/PasswordField/types.ts +17 -0
  340. package/src/components/PasswordField/usePasswordFieldValidation.ts +100 -0
  341. package/src/components/PeriodField/PeriodField.stories.ts +3 -1
  342. package/src/components/PeriodField/PeriodField.vue +1 -1
  343. package/src/components/PeriodField/tests/PeriodField.visual.cy.ts +39 -0
  344. package/src/components/PeriodField/tests/__snapshots__/period-field-default.snap.png +0 -0
  345. package/src/components/PeriodField/tests/__snapshots__/period-field-no-calendar.snap.png +0 -0
  346. package/src/components/PeriodField/tests/__snapshots__/period-field-required.snap.png +0 -0
  347. package/src/components/PeriodField/tests/__snapshots__/period-field-with-value.snap.png +0 -0
  348. package/src/components/PhoneField/PhoneField.vue +2 -2
  349. package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
  350. package/src/components/PhoneField/tests/PhoneField.visual.cy.ts +28 -0
  351. package/src/components/PhoneField/tests/__snapshots__/phone-field-default.snap.png +0 -0
  352. package/src/components/PhoneField/tests/__snapshots__/phone-field-with-country-code.snap.png +0 -0
  353. package/src/components/PhoneField/tests/__snapshots__/phone-field-with-value.snap.png +0 -0
  354. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  355. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  356. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  357. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  358. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  359. package/src/components/RatingPicker/tests/RatingPicker.visual.cy.ts +52 -0
  360. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-emotion.snap.png +0 -0
  361. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-number.snap.png +0 -0
  362. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-readonly.snap.png +0 -0
  363. package/src/components/RatingPicker/tests/__snapshots__/rating-picker-stars.snap.png +0 -0
  364. package/src/components/SearchListField/SearchListField.mdx +1 -1
  365. package/src/components/SearchListField/SearchListField.stories.ts +1 -1
  366. package/src/components/SearchListField/SearchListField.vue +9 -4
  367. package/src/components/SearchListField/tests/SearchListField.spec.ts +127 -0
  368. package/src/components/SearchListField/tests/SearchListField.visual.cy.ts +35 -0
  369. package/src/components/SearchListField/tests/__snapshots__/search-list-field-default.snap.png +0 -0
  370. package/src/components/SearchListField/tests/__snapshots__/search-list-field-with-selection.snap.png +0 -0
  371. package/src/components/SkipLink/tests/SkipLink.visual.cy.ts +16 -0
  372. package/src/components/SkipLink/tests/__snapshots__/skip-link-focused.snap.png +0 -0
  373. package/src/components/SocialMediaLinks/tests/SocialMediaLinks.visual.cy.ts +33 -0
  374. package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-default.snap.png +0 -0
  375. package/src/components/SocialMediaLinks/tests/__snapshots__/social-media-links-no-native-heading.snap.png +0 -0
  376. package/src/components/StatusPage/tests/StatusPage.visual.cy.ts +47 -0
  377. package/src/components/StatusPage/tests/__snapshots__/status-page-default.snap.png +0 -0
  378. package/src/components/StatusPage/tests/__snapshots__/status-page-full.snap.png +0 -0
  379. package/src/components/StatusPage/tests/__snapshots__/status-page-no-btn.snap.png +0 -0
  380. package/src/components/SubHeader/tests/SubHeader.visual.cy.ts +48 -0
  381. package/src/components/SubHeader/tests/__snapshots__/sub-header-default.snap.png +0 -0
  382. package/src/components/SubHeader/tests/__snapshots__/sub-header-loading.snap.png +0 -0
  383. package/src/components/SubHeader/tests/__snapshots__/sub-header-no-back-btn.snap.png +0 -0
  384. package/src/components/SubHeader/tests/__snapshots__/sub-header-with-subtitle.snap.png +0 -0
  385. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  386. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  387. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  388. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  389. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  390. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  391. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  392. package/src/components/SyHeading/tests/SyHeading.visual.cy.ts +33 -0
  393. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-1.snap.png +0 -0
  394. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-2.snap.png +0 -0
  395. package/src/components/SyHeading/tests/__snapshots__/sy-heading-level-3.snap.png +0 -0
  396. package/src/components/SyTextArea/SyTextArea.stories.ts +25 -0
  397. package/src/components/SyTextArea/SyTextArea.vue +7 -0
  398. package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +1 -1
  399. package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +18 -0
  400. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +135 -1
  401. package/src/components/SyTextArea/tests/SyTextArea.visual.cy.ts +48 -0
  402. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-default.snap.png +0 -0
  403. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-filled.snap.png +0 -0
  404. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-required.snap.png +0 -0
  405. package/src/components/SyTextArea/tests/__snapshots__/sy-textarea-with-value.snap.png +0 -0
  406. package/src/components/SyTextArea/validation/Validation.stories.ts +6 -86
  407. package/src/components/TableToolbar/tests/TableToolbar.visual.cy.ts +49 -0
  408. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-default.snap.png +0 -0
  409. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-filtered.snap.png +0 -0
  410. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-loading.snap.png +0 -0
  411. package/src/components/TableToolbar/tests/__snapshots__/table-toolbar-with-add-btn.snap.png +0 -0
  412. package/src/components/Tables/SyServerTable/SyServerTable.vue +3 -3
  413. package/src/components/Tables/SyServerTable/accessibilite/Accessibility.mdx +114 -7
  414. package/src/components/Tables/SyServerTable/tests/SyServerTable.visual.cy.ts +58 -0
  415. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-default.snap.png +0 -0
  416. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-loading.snap.png +0 -0
  417. package/src/components/Tables/SyServerTable/tests/__snapshots__/sy-server-table-with-select.snap.png +0 -0
  418. package/src/components/Tables/SyTable/accessibilite/Accessibility.mdx +116 -7
  419. package/src/components/Tables/SyTable/tests/SyTable.visual.cy.ts +70 -0
  420. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-compact.snap.png +0 -0
  421. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-default.snap.png +0 -0
  422. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-striped.snap.png +0 -0
  423. package/src/components/Tables/SyTable/tests/__snapshots__/sy-table-with-select.snap.png +0 -0
  424. package/src/components/Tables/common/tableStyles.scss +4 -4
  425. package/src/components/Tables/common/tests/SyTableFilter.spec.ts +8 -1
  426. package/src/components/Tables/common/tests/filterByRange.spec.ts +23 -22
  427. package/src/components/ToolbarContainer/tests/ToolbarContainer.visual.cy.ts +34 -0
  428. package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-default.snap.png +0 -0
  429. package/src/components/ToolbarContainer/tests/__snapshots__/toolbar-container-links.snap.png +0 -0
  430. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +1 -2
  431. package/src/components/UploadWorkflow/tests/UploadWorkflow.visual.cy.ts +39 -0
  432. package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-default.snap.png +0 -0
  433. package/src/components/UploadWorkflow/tests/__snapshots__/upload-workflow-with-title.snap.png +0 -0
  434. package/src/components/UserMenuBtn/tests/UserMenuBtn.visual.cy.ts +42 -0
  435. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-default.snap.png +0 -0
  436. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-no-logout.snap.png +0 -0
  437. package/src/components/UserMenuBtn/tests/__snapshots__/user-menu-btn-with-name.snap.png +0 -0
  438. package/src/composables/unifyValidation/documentationValidationProps.ts +1 -1
  439. package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +2 -2
  440. package/src/composables/unifyValidation/useValidation.ts +17 -11
  441. package/src/composables/useFilterable/useFilterable.spec.ts +105 -142
  442. package/src/composables/useFilterable/useFilterable.ts +6 -17
  443. package/src/composables/useFormFieldErrorHandling.ts +1 -1
  444. package/src/composables/validation/tests/useFormValidation.spec.ts +11 -2
  445. package/src/composables/validation/tests/useValidatable.spec.ts +16 -6
  446. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  447. package/src/composables/validation/useValidation.ts +1 -1
  448. package/src/composantsVuetify/VCard/VCard.mdx +8 -0
  449. package/src/composantsVuetify/VCard/v-card.stories.ts +191 -1
  450. package/src/composantsVuetify/VStepper/VStepper.mdx +56 -0
  451. package/src/composantsVuetify/VStepper/v-stepper.stories.ts +563 -0
  452. package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -0
  453. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  454. package/src/designTokens/tokens/pa/paLightTheme.ts +1 -0
  455. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +1 -1
  456. package/src/stories/Components/Components.stories.ts +61 -10
  457. package/src/stories/Demarrer/Releases.stories.ts +45 -2
  458. package/src/stories/DesignTokens/Colors.mdx +2 -0
  459. package/src/stories/DesignTokens/colors.stories.ts +13 -0
  460. package/src/stories/EcoConception/EcoBestPracticesDoc.vue +930 -0
  461. package/src/stories/EcoConception/EcoBestPratices.mdx +38 -0
  462. package/src/stories/EcoConception/Introduction.mdx +8 -1
  463. package/src/stories/EcoConception/datas/bonnes_pratiques_essentielles.json +1018 -0
  464. package/src/stories/EcoConception/ecoconception-best-practices.stories.ts +20 -0
  465. package/src/stories/GuideDuDev/Amelipro.mdx +9 -1
  466. package/src/stories/GuideDuDev/Amelipro.stories.ts +955 -168
  467. package/src/stories/GuideDuDev/PortailAgent.stories.ts +0 -1
  468. package/src/utils/functions/deepCopy/index.ts +2 -3
  469. package/dist/components/Customs/SyCheckbox/locales.d.ts +0 -3
  470. package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +0 -1
  471. package/dist/components/SyHeading/SyHeading.test.d.ts +0 -1
  472. package/src/components/Customs/SyCheckbox/locales.ts +0 -3
  473. package/src/components/Customs/SyTextField/types.d.ts +0 -4
@@ -0,0 +1,12 @@
1
+ export const locales = {
2
+ // Bouton d'incrément du mode number (spinner ↑)
3
+ increment: (label?: string) => (label ? `Augmenter ${label}` : 'Augmenter'),
4
+ // Bouton de décrément du mode number (spinner ↓)
5
+ decrement: (label?: string) => (label ? `Diminuer ${label}` : 'Diminuer'),
6
+ // Bouton de réinitialisation du champ
7
+ clear: (label?: string) => (label ? `Vider ${label}` : 'Vider'),
8
+ // Barre de progression affichée pendant le chargement
9
+ loading: (label?: string) => (label ? `Chargement de ${label}` : 'Chargement en cours'),
10
+ }
11
+
12
+ export type SyTextFieldLocales = typeof locales
@@ -1,9 +1,16 @@
1
1
  import { describe, it, expect, beforeEach, vi } from 'vitest'
2
2
  import { mount, flushPromises } from '@vue/test-utils'
3
3
  import { VIcon } from 'vuetify/components'
4
+ import { ref } from 'vue'
4
5
 
5
6
  import SyTextField from '../SyTextField.vue'
6
- import type { IconType } from '../types'
7
+ import type { IconType, SyTextFieldProps } from '../types'
8
+ import { SyForm } from '@/components'
9
+
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ interface SyFormInstance extends Record<string, any> {
12
+ validate: () => Promise<boolean>
13
+ }
7
14
 
8
15
  describe('SyTextField', () => {
9
16
  let wrapper: ReturnType<typeof mount<typeof SyTextField>>
@@ -71,28 +78,28 @@ describe('SyTextField', () => {
71
78
  wrapper = mount(SyTextField, {
72
79
  props: { appendInnerIcon: 'success' as IconType, label: 'Test Field' },
73
80
  })
74
- expect(wrapper.props('appendInnerIcon')).toBe('success')
81
+ expect((wrapper.vm.$props as SyTextFieldProps).appendInnerIcon).toBe('success')
75
82
  })
76
83
 
77
84
  it('should update icon when validation state changes with warning', async () => {
78
85
  wrapper = mount(SyTextField, {
79
86
  props: { appendInnerIcon: 'warning' as IconType, label: 'Test Field' },
80
87
  })
81
- expect(wrapper.props('appendInnerIcon')).toBe('warning')
88
+ expect((wrapper.vm.$props as SyTextFieldProps).appendInnerIcon).toBe('warning')
82
89
  })
83
90
 
84
91
  it('should update icon when validation state changes with error', async () => {
85
92
  wrapper = mount(SyTextField, {
86
93
  props: { appendInnerIcon: 'error' as IconType, label: 'Test Field' },
87
94
  })
88
- expect(wrapper.props('appendInnerIcon')).toBe('error')
95
+ expect((wrapper.vm.$props as SyTextFieldProps).appendInnerIcon).toBe('error')
89
96
  })
90
97
 
91
98
  it('should update icon when validation state changes with success', async () => {
92
99
  wrapper = mount(SyTextField, {
93
100
  props: { appendInnerIcon: 'success' as IconType, label: 'Test Field' },
94
101
  })
95
- expect(wrapper.props('appendInnerIcon')).toBe('success')
102
+ expect((wrapper.vm.$props as SyTextFieldProps).appendInnerIcon).toBe('success')
96
103
  })
97
104
 
98
105
  it('emits prepend-icon-click event when prepend icon is clicked', async () => {
@@ -181,7 +188,7 @@ describe('SyTextField', () => {
181
188
  props: { customRules: [customRule], label: 'Test Field' },
182
189
  })
183
190
 
184
- await wrapper.setProps({ modelValue: 'ab' })
191
+ await wrapper.setProps({ modelValue: 'ab' } as Parameters<typeof wrapper.setProps>[0])
185
192
  await wrapper.find('input').trigger('focus')
186
193
  await wrapper.vm.$nextTick()
187
194
  await wrapper.find('input').trigger('blur')
@@ -297,6 +304,7 @@ describe('SyTextField', () => {
297
304
  })
298
305
 
299
306
  const input = wrapper.find('input')
307
+ const inputElement = input.element as HTMLInputElement
300
308
  const event = new InputEvent('beforeinput', {
301
309
  data: 'a',
302
310
  cancelable: true,
@@ -304,8 +312,109 @@ describe('SyTextField', () => {
304
312
  })
305
313
 
306
314
  input.element.dispatchEvent(event)
315
+ await wrapper.vm.$nextTick()
307
316
 
308
317
  expect(event.defaultPrevented).toBe(true)
318
+ // Le caractère interdit n'est pas inséré : le champ reste vide
319
+ expect(inputElement.value).toBe('')
320
+ })
321
+
322
+ it('allows multi-character beforeinput data when type is number (spinner increment / paste)', async () => {
323
+ wrapper = mount(SyTextField, {
324
+ props: {
325
+ label: 'Test Field',
326
+ type: 'number',
327
+ },
328
+ })
329
+
330
+ const input = wrapper.find('input')
331
+ const inputElement = input.element as HTMLInputElement
332
+ // Ex. incrément du spinner 9 -> 10, ou collage d'un nombre : data = "10"
333
+ const event = new InputEvent('beforeinput', {
334
+ data: '10',
335
+ cancelable: true,
336
+ bubbles: true,
337
+ })
338
+
339
+ input.element.dispatchEvent(event)
340
+
341
+ expect(event.defaultPrevented).toBe(false)
342
+
343
+ // La saisie n'étant pas bloquée, le navigateur l'applique : le champ la conserve telle quelle
344
+ inputElement.value = '10'
345
+ await input.trigger('input')
346
+ await wrapper.vm.$nextTick()
347
+
348
+ expect(inputElement.value).toBe('10')
349
+ expect(wrapper.emitted('update:modelValue')?.at(-1)).toEqual(['10'])
350
+ })
351
+
352
+ it('collapses multiple decimal separators when type is number', async () => {
353
+ wrapper = mount(SyTextField, {
354
+ props: { label: 'Test Field', type: 'number' },
355
+ })
356
+
357
+ const input = wrapper.find('input')
358
+ const inputElement = input.element as HTMLInputElement
359
+ inputElement.value = '32323.....2332...32.32.323'
360
+
361
+ await input.trigger('input')
362
+
363
+ // Un seul séparateur décimal conservé (préfixe de nombre valide)
364
+ expect(inputElement.value).toBe('32323.')
365
+ expect(wrapper.emitted('update:modelValue')?.at(-1)).toEqual(['32323.'])
366
+ })
367
+
368
+ it('renders as a text input (with inputmode decimal) when type is number', () => {
369
+ wrapper = mount(SyTextField, {
370
+ props: { label: 'Test Field', type: 'number' },
371
+ })
372
+ const input = wrapper.find('input')
373
+ expect(input.attributes('type')).toBe('text')
374
+ expect(input.attributes('inputmode')).toBe('decimal')
375
+ })
376
+
377
+ describe('number increment buttons', () => {
378
+ it('increments via the up button', async () => {
379
+ wrapper = mount(SyTextField, {
380
+ props: { label: 'Test Field', type: 'number', modelValue: '5' },
381
+ })
382
+ await wrapper.find('button[aria-label="Augmenter Test Field"]').trigger('click')
383
+ expect(wrapper.emitted('update:modelValue')?.at(-1)).toEqual(['6'])
384
+ })
385
+
386
+ it('decrements via the down button', async () => {
387
+ wrapper = mount(SyTextField, {
388
+ props: { label: 'Test Field', type: 'number', modelValue: '5' },
389
+ })
390
+ await wrapper.find('button[aria-label="Diminuer Test Field"]').trigger('click')
391
+ expect(wrapper.emitted('update:modelValue')?.at(-1)).toEqual(['4'])
392
+ })
393
+
394
+ it('increments with the ArrowUp key', async () => {
395
+ wrapper = mount(SyTextField, {
396
+ props: { label: 'Test Field', type: 'number', modelValue: '5' },
397
+ })
398
+ await wrapper.find('input').trigger('keydown', { key: 'ArrowUp' })
399
+ expect(wrapper.emitted('update:modelValue')?.at(-1)).toEqual(['6'])
400
+ })
401
+
402
+ it('respects step and clamps to max', async () => {
403
+ wrapper = mount(SyTextField, {
404
+ props: { label: 'Test Field', type: 'number', modelValue: '0.2' },
405
+ attrs: { step: 0.1, max: 0.25 },
406
+ })
407
+ await wrapper.find('button[aria-label="Augmenter Test Field"]').trigger('click')
408
+ // 0.2 + 0.1 = 0.3 -> plafonné à 0.25
409
+ expect(wrapper.emitted('update:modelValue')?.at(-1)).toEqual(['0.25'])
410
+ })
411
+
412
+ it('hides the increment buttons when areSpinButtonsHidden is true', () => {
413
+ wrapper = mount(SyTextField, {
414
+ props: { label: 'Test Field', type: 'number', areSpinButtonsHidden: true },
415
+ })
416
+ expect(wrapper.find('button[aria-label="Augmenter Test Field"]').exists()).toBe(false)
417
+ })
309
418
  })
310
419
 
311
420
  it('filters alphabetic characters when type is tel', async () => {
@@ -346,6 +455,26 @@ describe('SyTextField', () => {
346
455
  expect(event.defaultPrevented).toBe(true)
347
456
  })
348
457
 
458
+ it('allows multi-character beforeinput data when type is tel (paste)', () => {
459
+ wrapper = mount(SyTextField, {
460
+ props: {
461
+ label: 'Telephone',
462
+ type: 'tel',
463
+ },
464
+ })
465
+
466
+ const input = wrapper.find('input')
467
+ const event = new InputEvent('beforeinput', {
468
+ data: '+33 6 12',
469
+ cancelable: true,
470
+ bubbles: true,
471
+ })
472
+
473
+ input.element.dispatchEvent(event)
474
+
475
+ expect(event.defaultPrevented).toBe(false)
476
+ })
477
+
349
478
  it('validates field immediately when isValidateOnBlur is false', async () => {
350
479
  const customRule = {
351
480
  type: 'custom',
@@ -364,7 +493,7 @@ describe('SyTextField', () => {
364
493
  },
365
494
  })
366
495
 
367
- await wrapper.setProps({ modelValue: 'ab' })
496
+ await wrapper.setProps({ modelValue: 'ab' } as Parameters<typeof wrapper.setProps>[0])
368
497
  await wrapper.vm.$nextTick()
369
498
 
370
499
  // settle all pending promises to ensure validation has completed
@@ -377,7 +506,7 @@ describe('SyTextField', () => {
377
506
  expect(messages.text()).toContain('Test error message')
378
507
 
379
508
  // Vérifie que l'erreur disparaît quand la valeur devient valide
380
- await wrapper.setProps({ modelValue: 'abc' })
509
+ await wrapper.setProps({ modelValue: 'abc' } as Parameters<typeof wrapper.setProps>[0])
381
510
  await wrapper.vm.$nextTick()
382
511
 
383
512
  // the async validation should have updated the error messages, so we wait for the next tick before checking the messages again
@@ -390,4 +519,41 @@ describe('SyTextField', () => {
390
519
 
391
520
  expect(messages.text()).not.toContain('Test error message')
392
521
  })
522
+
523
+ it('s\'enregistre auprès d\'un SyForm parent et déclenche la validation à la soumission', async () => {
524
+ const wrapper = mount({
525
+ components: { SyForm, SyTextField },
526
+ template: `
527
+ <SyForm ref="form">
528
+ <SyTextField v-model="value" label="Nom" required />
529
+ </SyForm>
530
+ `,
531
+ setup() {
532
+ return { value: ref('') }
533
+ },
534
+ })
535
+
536
+ const form = wrapper.getComponent(SyForm)
537
+ const isValid = await (form.vm as unknown as SyFormInstance).validate()
538
+ await flushPromises()
539
+
540
+ expect(isValid).toBe(false) // champ requis vide
541
+ expect(wrapper.find('.v-messages__message').exists()).toBe(true)
542
+ })
543
+
544
+ it('does not show error messages when hideDetails is true even with validation errors', async () => {
545
+ const wrapper = mount(SyTextField, {
546
+ props: {
547
+ modelValue: null,
548
+ label: 'Test hideDetails + erreur',
549
+ hideDetails: true,
550
+ hasError: true,
551
+ errorMessages: ['Erreur de validation'],
552
+ },
553
+ })
554
+
555
+ await wrapper.vm.$nextTick()
556
+ expect(wrapper.find('.v-input__details').exists()).toBe(false)
557
+ expect(wrapper.find('.v-messages').exists()).toBe(false)
558
+ })
393
559
  })
@@ -0,0 +1,116 @@
1
+ import SyTextField from '../SyTextField.vue'
2
+
3
+ describe('SyTextField - Visual regression tests', () => {
4
+ it('displays the text field by default', () => {
5
+ cy.mountWithVuetify(SyTextField, {
6
+ props: { label: 'Prénom' },
7
+ })
8
+
9
+ cy.get('.v-text-field').should('be.visible')
10
+ cy.matchImageSnapshot('sy-text-field-default', cy.get('.v-text-field'))
11
+ })
12
+
13
+ it('displays the text field with a value', () => {
14
+ cy.mountWithVuetify(SyTextField, {
15
+ props: {
16
+ label: 'Prénom',
17
+ modelValue: 'Jean',
18
+ },
19
+ })
20
+
21
+ cy.get('.v-text-field').should('be.visible')
22
+ cy.matchImageSnapshot('sy-text-field-with-value', cy.get('.v-text-field'))
23
+ })
24
+
25
+ it('displays the text field as required', () => {
26
+ cy.mountWithVuetify(SyTextField, {
27
+ props: {
28
+ label: 'Prénom',
29
+ required: true,
30
+ displayAsterisk: true,
31
+ },
32
+ })
33
+
34
+ cy.get('.v-text-field').should('be.visible')
35
+ cy.matchImageSnapshot('sy-text-field-required', cy.get('.v-text-field'))
36
+ })
37
+
38
+ it('displays the text field in readonly state', () => {
39
+ cy.mountWithVuetify(SyTextField, {
40
+ props: {
41
+ label: 'Prénom',
42
+ modelValue: 'Jean',
43
+ readonly: true,
44
+ },
45
+ })
46
+
47
+ cy.get('.v-text-field').should('be.visible')
48
+ cy.matchImageSnapshot('sy-text-field-readonly', cy.get('.v-text-field'))
49
+ })
50
+
51
+ it('displays the text field with clearable', () => {
52
+ cy.mountWithVuetify(SyTextField, {
53
+ props: {
54
+ label: 'Prénom',
55
+ modelValue: 'Jean',
56
+ isClearable: true,
57
+ },
58
+ })
59
+
60
+ cy.get('.v-text-field').should('be.visible')
61
+ cy.matchImageSnapshot('sy-text-field-clearable', cy.get('.v-text-field'))
62
+ })
63
+
64
+ it('displays the text field with prepend icon', () => {
65
+ cy.mountWithVuetify(SyTextField, {
66
+ props: {
67
+ label: 'Recherche',
68
+ prependInnerIcon: 'info',
69
+ },
70
+ })
71
+
72
+ cy.get('.v-text-field').should('be.visible')
73
+ cy.matchImageSnapshot('sy-text-field-prepend-icon', cy.get('.v-text-field'))
74
+ })
75
+
76
+ it('displays the number field with the custom spin buttons', () => {
77
+ cy.mountWithVuetify(SyTextField, {
78
+ props: {
79
+ label: 'Quantité',
80
+ type: 'number',
81
+ modelValue: '42',
82
+ },
83
+ })
84
+
85
+ cy.get('.sy-text-field__spinner').should('be.visible')
86
+ cy.matchImageSnapshot('sy-text-field-number', cy.get('.v-text-field'))
87
+ })
88
+
89
+ it('displays the number field without the spin buttons when hidden', () => {
90
+ cy.mountWithVuetify(SyTextField, {
91
+ props: {
92
+ label: 'Quantité',
93
+ type: 'number',
94
+ modelValue: '42',
95
+ areSpinButtonsHidden: true,
96
+ },
97
+ })
98
+
99
+ cy.get('.sy-text-field__spinner').should('not.exist')
100
+ cy.matchImageSnapshot('sy-text-field-number-no-spinner', cy.get('.v-text-field'))
101
+ })
102
+
103
+ it('displays the number field disabled without the spin buttons', () => {
104
+ cy.mountWithVuetify(SyTextField, {
105
+ props: {
106
+ label: 'Quantité',
107
+ type: 'number',
108
+ modelValue: '42',
109
+ disabled: true,
110
+ },
111
+ })
112
+
113
+ cy.get('.sy-text-field__spinner').should('not.exist')
114
+ cy.matchImageSnapshot('sy-text-field-number-disabled', cy.get('.v-text-field'))
115
+ })
116
+ })
@@ -0,0 +1,70 @@
1
+ import type { FieldValidationProps } from '@/composables/unifyValidation/useValidation'
2
+ import type { SyTextFieldLocales } from './locales'
3
+
4
+ export type IconType = 'info' | 'success' | 'warning' | 'error' | 'close' | 'calendar' | undefined
5
+ export type VariantStyle = 'outlined' | 'plain' | 'underlined' | 'filled' | 'solo' | 'solo-inverted' | 'solo-filled'
6
+ export type ColorType = 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'error'
7
+ export type ValidateOnType = 'eager' | 'lazy' | 'blur' | 'input' | 'submit' | 'invalid-input' | 'blur lazy' | 'input lazy' | 'submit lazy' | 'invalid-input lazy' | 'blur eager' | 'input eager' | 'submit eager' | 'invalid-input eager' | 'lazy blur' | 'lazy input' | 'lazy submit' | 'lazy invalid-input' | 'eager blur' | 'eager input' | 'eager submit' | 'eager invalid-input' | undefined
8
+
9
+ export type SyTextFieldProps = {
10
+ modelValue?: string | number | null | undefined
11
+ prependIcon?: IconType
12
+ appendIcon?: IconType
13
+ prependInnerIcon?: IconType
14
+ appendInnerIcon?: IconType
15
+ prependTooltip?: string
16
+ appendTooltip?: string
17
+ tooltipLocation?: 'top' | 'bottom' | 'start' | 'end'
18
+ variantStyle?: VariantStyle
19
+ color?: ColorType
20
+ isClearable?: boolean
21
+ showDivider?: boolean
22
+ label?: string
23
+ readonly?: boolean
24
+ isActive?: boolean
25
+ baseColor?: string
26
+ bgColor?: string
27
+ centerAffix?: boolean
28
+ counter?: string | number | boolean
29
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
30
+ counterValue?: number | ((value: any) => number)
31
+ density?: 'default' | 'comfortable' | 'compact'
32
+ direction?: 'horizontal' | 'vertical'
33
+ isDirty?: boolean
34
+ disabled?: boolean
35
+ isFlat?: boolean
36
+ isFocused?: boolean
37
+ areSpinButtonsHidden?: boolean
38
+ hint?: string
39
+ id?: string
40
+ loading?: string | boolean
41
+ maxWidth?: string | number
42
+ messages?: string | string[]
43
+ minWidth?: string | number
44
+ name?: string
45
+ displayPersistentClear?: boolean
46
+ displayPersistentCounter?: boolean
47
+ displayPersistentHint?: boolean
48
+ displayPersistentPlaceholder?: boolean
49
+ placeholder?: string
50
+ prefix?: string
51
+ isReversed?: boolean
52
+ role?: string
53
+ rounded?: string | number | boolean
54
+ isOnSingleLine?: boolean
55
+ suffix?: string
56
+ theme?: string
57
+ isTiled?: boolean
58
+ type?: string
59
+ width?: string | number
60
+ displayAsterisk?: boolean
61
+ noIcon?: boolean
62
+ disableClickButton?: boolean
63
+ autocomplete?: string
64
+ helpText?: string
65
+ maxlength?: string | number
66
+ title?: string | false
67
+ hideDetails?: boolean | 'auto'
68
+ /** Surcharge des libellés d'accessibilité (boutons +/-, vider, chargement). */
69
+ locales?: Partial<SyTextFieldLocales>
70
+ } & FieldValidationProps
@@ -0,0 +1,93 @@
1
+ import { computed, type Ref } from 'vue'
2
+
3
+ // Caractères autorisés dans un champ number : chiffres, exposant, signes et séparateur décimal.
4
+ const NUMBER_ALLOWED_CHARACTERS_PATTERN = /[^0-9eE+.-]/g
5
+ const NUMBER_ALLOWED_SINGLE_CHARACTER_PATTERN = /^[0-9eE+.-]$/
6
+ // Préfixe de nombre valide : un seul séparateur décimal, un seul exposant, signes bien placés.
7
+ const NUMBER_PREFIX_PATTERN = /^[+-]?\d*\.?\d*(?:[eE][+-]?\d*)?/
8
+
9
+ /**
10
+ * Regroupe la logique propre au mode `type="number"` de SyTextField.
11
+ *
12
+ * Un champ number est rendu en `type=text` (+ `inputmode=decimal`) pour que `input.value`
13
+ * reste lisible et corrigeable sur tous les navigateurs (Chrome comme Firefox). L'incrément
14
+ * natif étant alors perdu, il est réimplémenté ici (flèches ↑/↓ + boutons +/-).
15
+ */
16
+ export function useNumberField(params: {
17
+ type: Ref<string | undefined>
18
+ disabled: Ref<boolean | undefined>
19
+ readonly: Ref<boolean | undefined>
20
+ model: Ref<string | number | null | undefined>
21
+ attrs: Record<string, unknown>
22
+ }) {
23
+ const isNumberField = computed(() => params.type.value === 'number')
24
+
25
+ const nativeInputType = computed(() => (isNumberField.value ? 'text' : params.type.value))
26
+
27
+ // Retire les caractères interdits puis ne conserve qu'un préfixe de nombre valide.
28
+ const sanitizeNumberValue = (value: string | number | null | undefined) => {
29
+ if (!isNumberField.value || typeof value !== 'string') {
30
+ return value
31
+ }
32
+
33
+ const cleaned = value.replace(NUMBER_ALLOWED_CHARACTERS_PATTERN, '')
34
+ const match = cleaned.match(NUMBER_PREFIX_PATTERN)
35
+ return match ? match[0] : ''
36
+ }
37
+
38
+ // Un seul caractère saisi est-il autorisé dans un champ number ? (filtrage clavier)
39
+ const isAllowedNumberCharacter = (char: string) => NUMBER_ALLOWED_SINGLE_CHARACTER_PATTERN.test(char)
40
+
41
+ // Une donnée (collage, multi-caractères) contient-elle un caractère interdit ? (beforeinput)
42
+ const hasDisallowedNumberCharacter = (data: string) => data.replace(NUMBER_ALLOWED_CHARACTERS_PATTERN, '') !== data
43
+
44
+ const stepValue = (direction: 1 | -1) => {
45
+ if (params.disabled.value || params.readonly.value) {
46
+ return
47
+ }
48
+
49
+ const rawStep = Number(params.attrs.step ?? 1)
50
+ const step = Number.isFinite(rawStep) && rawStep > 0 ? rawStep : 1
51
+
52
+ const currentNum = Number(params.model.value)
53
+ const base = Number.isFinite(currentNum) ? currentNum : 0
54
+
55
+ // Arrondit l'addition AVANT le clamp pour éviter les imprécisions flottantes
56
+ // (ex. pas de 0.1) sans altérer la précision de min/max.
57
+ const decimals = (String(step).split('.')[1] ?? '').length
58
+ let next = Number((base + direction * step).toFixed(decimals))
59
+
60
+ const min = params.attrs.min !== undefined && params.attrs.min !== '' ? Number(params.attrs.min) : undefined
61
+ const max = params.attrs.max !== undefined && params.attrs.max !== '' ? Number(params.attrs.max) : undefined
62
+ if (min !== undefined && Number.isFinite(min) && next < min) {
63
+ next = min
64
+ }
65
+ if (max !== undefined && Number.isFinite(max) && next > max) {
66
+ next = max
67
+ }
68
+
69
+ params.model.value = String(next)
70
+ }
71
+
72
+ // type=number rendu en type=text : on réimplémente l'incrément clavier ↑/↓.
73
+ // Retourne true si la touche a été prise en charge (défaut empêché).
74
+ const handleStepKeydown = (event: KeyboardEvent) => {
75
+ if (!isNumberField.value || (event.key !== 'ArrowUp' && event.key !== 'ArrowDown')) {
76
+ return false
77
+ }
78
+
79
+ event.preventDefault()
80
+ stepValue(event.key === 'ArrowUp' ? 1 : -1)
81
+ return true
82
+ }
83
+
84
+ return {
85
+ isNumberField,
86
+ nativeInputType,
87
+ sanitizeNumberValue,
88
+ isAllowedNumberCharacter,
89
+ hasDisallowedNumberCharacter,
90
+ stepValue,
91
+ handleStepKeydown,
92
+ }
93
+ }
@@ -0,0 +1,104 @@
1
+ import { computed, type Ref } from 'vue'
2
+ import { useValidation } from '@/composables/unifyValidation/useValidation'
3
+ import type { ValidationRule as SyValidationRule, VuetifyValidationRule } from '@/composables/unifyValidation/useValidation'
4
+ import { mdiAlertOutline, mdiCheck, mdiAlertCircle } from '@mdi/js'
5
+
6
+ export function useSyTextFieldValidation(params: {
7
+ modelValue: Ref<string | number | null | undefined>
8
+ readonly: Ref<boolean>
9
+ disabled: Ref<boolean>
10
+ required: Ref<boolean>
11
+ isValidateOnBlur: Ref<boolean>
12
+ showSuccessMessages: Ref<boolean>
13
+ disableErrorHandling: Ref<boolean>
14
+ useVuetifyValidation: Ref<boolean>
15
+ label: Ref<string | undefined>
16
+ focused: Ref<boolean>
17
+ customRules: Ref<SyValidationRule[]>
18
+ customWarningRules: Ref<SyValidationRule[] | undefined>
19
+ customSuccessRules: Ref<SyValidationRule[] | undefined>
20
+ rules: Ref<VuetifyValidationRule[] | undefined>
21
+ errorMessages: Ref<string[] | null | undefined>
22
+ warningMessages: Ref<string[] | null | undefined>
23
+ successMessages: Ref<string[] | null | undefined>
24
+ hasErrorProp: Ref<boolean>
25
+ hasWarningProp: Ref<boolean>
26
+ hasSuccessProp: Ref<boolean>
27
+ maxErrors: Ref<number>
28
+ }) {
29
+ const defaultRules = computed<SyValidationRule[]>(() =>
30
+ params.required.value
31
+ ? [{
32
+ type: 'required',
33
+ options: {
34
+ message: `Le champ ${params.label.value || 'ce champ'} est requis.`,
35
+ fieldIdentifier: params.label.value,
36
+ },
37
+ }]
38
+ : [],
39
+ )
40
+
41
+ const { validate, errors, warnings, successes, hasError, hasWarning, hasSuccess, clearValidation } = useValidation({
42
+ modelValue: params.modelValue,
43
+ readonly: params.readonly,
44
+ disabled: params.disabled,
45
+ required: params.required,
46
+ isValidateOnBlur: params.isValidateOnBlur,
47
+ showSuccessMessages: params.showSuccessMessages,
48
+ disableErrorHandling: params.disableErrorHandling,
49
+ useVuetifyValidation: params.useVuetifyValidation,
50
+ label: params.label,
51
+ rules: params.rules,
52
+ customRules: computed(() => [
53
+ ...defaultRules.value,
54
+ ...(params.customRules.value ?? []),
55
+ ]),
56
+ customWarningRules: params.customWarningRules as Ref<SyValidationRule[]>,
57
+ customSuccessRules: params.customSuccessRules as Ref<SyValidationRule[]>,
58
+ errorMessages: params.errorMessages,
59
+ warningMessages: params.warningMessages,
60
+ successMessages: params.successMessages,
61
+ hasErrorProp: params.hasErrorProp,
62
+ hasWarningProp: params.hasWarningProp,
63
+ hasSuccessProp: params.hasSuccessProp,
64
+ maxErrors: params.maxErrors,
65
+ focused: params.focused,
66
+ })
67
+
68
+ const iconColor = computed(() => {
69
+ if (hasError.value) return 'error'
70
+ if (hasWarning.value) return 'warning'
71
+ if (hasSuccess.value) return 'success'
72
+ return 'rgba(0, 0, 0, 1)'
73
+ })
74
+
75
+ // Le bouton clear garde toujours une couleur neutre, quel que soit l'état de validation
76
+ const clearButtonColorClass = computed(() => 'text-iconBase')
77
+
78
+ const validationIcon = computed(() => {
79
+ if (hasError.value) return mdiAlertCircle
80
+ if (hasWarning.value) return mdiAlertOutline
81
+ if (hasSuccess.value) return mdiCheck
82
+ return null
83
+ })
84
+
85
+ const hasMessages = computed(() => {
86
+ if (params.disableErrorHandling.value) return false
87
+ return (params.errorMessages.value?.length ?? 0) > 0 || hasError.value || hasWarning.value || (hasSuccess.value && params.showSuccessMessages.value)
88
+ })
89
+
90
+ return {
91
+ errors,
92
+ warnings,
93
+ successes,
94
+ hasError,
95
+ hasWarning,
96
+ hasSuccess,
97
+ iconColor,
98
+ clearButtonColorClass,
99
+ validationIcon,
100
+ hasMessages,
101
+ validate,
102
+ clearValidation,
103
+ }
104
+ }