@cnamts/synapse 1.0.22 → 1.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/dist/AutocompleteFilter-BWLR3U7W.js +114 -0
  2. package/dist/AutocompleteFilter-D9jzRzAL.cjs +1 -0
  3. package/dist/{DateFilter-B5n-ZkLi.js → DateFilter-BpwFexzi.js} +1 -1
  4. package/dist/DateFilter-DTUl8hb1.cjs +1 -0
  5. package/dist/{NumberFilter-CtiZ9uj8.js → NumberFilter-Bz_NTdX9.js} +3 -3
  6. package/dist/NumberFilter-MAEojdk0.cjs +1 -0
  7. package/dist/PeriodFilter-CC4WgIhl.cjs +1 -0
  8. package/dist/{PeriodFilter-DzqiMb-b.js → PeriodFilter-DX_wy9g-.js} +1 -1
  9. package/dist/SelectFilter-BR3fvl-a.cjs +1 -0
  10. package/dist/SelectFilter-xqiPtPgX.js +135 -0
  11. package/dist/{TextFilter-BOFRNfcX.js → TextFilter-BBl3JFqK.js} +7 -7
  12. package/dist/TextFilter-CCfYFl5F.cjs +1 -0
  13. package/dist/apLightTheme-CFSRrjv2.cjs +1 -0
  14. package/dist/apLightTheme-D1P4jcD0.js +1231 -0
  15. package/dist/components/Accordion/Accordion.d.ts +13 -2
  16. package/dist/components/Accordion/composables/useAccordionState.d.ts +2 -1
  17. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
  18. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
  19. package/dist/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.d.ts +1 -1
  20. package/dist/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.d.ts +1 -1
  21. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
  22. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
  23. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +61 -61
  24. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
  25. package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
  26. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7506 -10100
  27. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +22 -22
  28. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +42 -42
  29. package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
  30. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
  31. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +130 -147
  32. package/dist/components/Customs/Selects/SyAutocomplete/locales.d.ts +5 -0
  33. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +6 -6
  34. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +13 -17
  35. package/dist/components/Customs/Selects/SySelect/locales.d.ts +1 -0
  36. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +9 -9
  37. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +29 -507
  38. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +29 -507
  39. package/dist/components/Customs/SyTextField/SyTextField.d.ts +64 -81
  40. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +640 -780
  41. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +322 -407
  42. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +114 -156
  43. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  44. package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
  45. package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
  46. package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
  47. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  48. package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
  49. package/dist/components/ErrorPage/ErrorPage.d.ts +3 -1
  50. package/dist/components/FileList/UploadItem/UploadItem.d.ts +6 -0
  51. package/dist/components/FileList/UploadItem/locales.d.ts +1 -4
  52. package/dist/components/FileUpload/FileUploadContent.d.ts +2 -0
  53. package/dist/components/FileUpload/validateFiles.d.ts +2 -1
  54. package/dist/components/HeaderBar/HeaderBar.d.ts +2 -1
  55. package/dist/components/HeaderBar/HeaderLogo/HeaderLogo.d.ts +2 -1
  56. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +6 -5
  57. package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
  58. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
  59. package/dist/components/MonthPicker/MonthPicker.d.ts +1903 -0
  60. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1863 -0
  61. package/dist/components/MonthPicker/MonthPickerText/useTextField.d.ts +21 -0
  62. package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.d.ts +21 -0
  63. package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.d.ts +12 -0
  64. package/dist/components/MonthPicker/MonthPickerVisual/MonthSelector.d.ts +11 -0
  65. package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.d.ts +6 -0
  66. package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.d.ts +14 -0
  67. package/dist/components/MonthPicker/MonthPickerVisual/YearSelector.d.ts +14 -0
  68. package/dist/components/MonthPicker/MonthPickerVisual/useMonthGrid.d.ts +9 -0
  69. package/dist/components/MonthPicker/MonthPickerVisual/useYearGrid.d.ts +8 -0
  70. package/dist/components/MonthPicker/MonthPickerVisual/utils.d.ts +8 -0
  71. package/dist/components/MonthPicker/locales.d.ts +12 -0
  72. package/dist/components/MonthPicker/useMonthPickerValidation.d.ts +25 -0
  73. package/dist/components/NirField/NirField.d.ts +209 -271
  74. package/dist/components/NirField/locales.d.ts +10 -10
  75. package/dist/components/NirField/useNirValidation.d.ts +64 -0
  76. package/dist/components/NotificationBar/Notification/Notification.d.ts +3 -0
  77. package/dist/components/PasswordField/PasswordField.d.ts +9 -10
  78. package/dist/components/PeriodField/PeriodField.d.ts +1379 -1659
  79. package/dist/components/PhoneField/PhoneField.d.ts +90 -125
  80. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
  81. package/dist/components/SyBtnMenu/SyBtnMenu.d.ts +1 -1
  82. package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +1 -0
  83. package/dist/components/SyHeading/SyHeading.d.ts +4 -2
  84. package/dist/components/SyHeading/SyHeading.test.d.ts +1 -0
  85. package/dist/components/SyTextArea/SyTextArea.d.ts +35 -15
  86. package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
  87. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +11 -8
  88. package/dist/components/Tables/SyTable/SyTable.d.ts +11 -8
  89. package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
  90. package/dist/components/Tables/common/SyTablePagination.d.ts +21 -23
  91. package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
  92. package/dist/components/Tables/common/filters/locales.d.ts +0 -1
  93. package/dist/components/Tables/common/types.d.ts +19 -3
  94. package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
  95. package/dist/components/Tables/common/usePagination.d.ts +3 -1
  96. package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
  97. package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
  98. package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
  99. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +6 -6
  100. package/dist/components/index.d.ts +1 -0
  101. package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
  102. package/dist/composables/rules/useFieldValidation.d.ts +4 -4
  103. package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
  104. package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
  105. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
  106. package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
  107. package/dist/composables/validation/useFormValidation.d.ts +11 -2
  108. package/dist/composables/validation/useValidation.d.ts +15 -9
  109. package/dist/design-system-v3.d.ts +2 -0
  110. package/dist/design-system-v3.js +196 -194
  111. package/dist/design-system-v3.umd.cjs +1 -1066
  112. package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +5 -0
  113. package/dist/{main-CEl4J8_T.js → main-BtTqyn4z.js} +16983 -15576
  114. package/dist/main-C1e3eoxd.cjs +1067 -0
  115. package/dist/synapse.css +1 -0
  116. package/dist/tooth-11-D3sLWv2n.cjs +1 -0
  117. package/dist/tooth-12-CXrLuH03.cjs +1 -0
  118. package/dist/tooth-13-BSfo5fpT.cjs +1 -0
  119. package/dist/tooth-14-DMzulx0h.cjs +1 -0
  120. package/dist/tooth-15-BKRFVi-9.cjs +1 -0
  121. package/dist/tooth-16-CpuxAbuM.cjs +1 -0
  122. package/dist/tooth-17-BPoahUdg.cjs +1 -0
  123. package/dist/tooth-18-DhHJz8sy.cjs +1 -0
  124. package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
  125. package/dist/tooth-22-C2Tn19sB.cjs +1 -0
  126. package/dist/tooth-23-C9uaaSGb.cjs +1 -0
  127. package/dist/tooth-24-BrK9UGpf.cjs +1 -0
  128. package/dist/tooth-25-CE_EfGNp.cjs +1 -0
  129. package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
  130. package/dist/tooth-27-C5J7JkWM.cjs +1 -0
  131. package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
  132. package/dist/tooth-31-BrYqmkTi.cjs +1 -0
  133. package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
  134. package/dist/tooth-33-DuxvqO2J.cjs +1 -0
  135. package/dist/tooth-34-BCSCXMB6.cjs +1 -0
  136. package/dist/tooth-35-BLUXkX88.cjs +1 -0
  137. package/dist/tooth-36-IrKHYqlA.cjs +1 -0
  138. package/dist/tooth-37-BYqpdMwo.cjs +1 -0
  139. package/dist/tooth-38-B_eNXXdu.cjs +1 -0
  140. package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
  141. package/dist/tooth-42-szcDqlM0.cjs +1 -0
  142. package/dist/tooth-43-B3ka6rQm.cjs +1 -0
  143. package/dist/tooth-44-CazyQucj.cjs +1 -0
  144. package/dist/tooth-45-B4HQtc8n.cjs +1 -0
  145. package/dist/tooth-46-BPM40gbG.cjs +1 -0
  146. package/dist/tooth-47-Dvr20dlh.cjs +1 -0
  147. package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
  148. package/dist/tooth-51-OBpwCOF3.cjs +1 -0
  149. package/dist/tooth-52-aKxyHcmq.cjs +1 -0
  150. package/dist/tooth-53-vCwJjTOc.cjs +1 -0
  151. package/dist/tooth-54-DsWu2iFy.cjs +1 -0
  152. package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
  153. package/dist/tooth-61-BbLvxMQi.cjs +1 -0
  154. package/dist/tooth-62-CmTkWczP.cjs +1 -0
  155. package/dist/tooth-63-DI7l_2qI.cjs +1 -0
  156. package/dist/tooth-64-B21sOsJh.cjs +1 -0
  157. package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
  158. package/dist/tooth-71-D473PPO5.cjs +1 -0
  159. package/dist/tooth-72-Drh1wnNu.cjs +1 -0
  160. package/dist/tooth-73-DzlwYI23.cjs +1 -0
  161. package/dist/tooth-74-8aGvcZPg.cjs +1 -0
  162. package/dist/tooth-75-BFK7At_r.cjs +1 -0
  163. package/dist/tooth-81-BZmR-I0M.cjs +1 -0
  164. package/dist/tooth-82-euVfUUZV.cjs +1 -0
  165. package/dist/tooth-83-KV010j64.cjs +1 -0
  166. package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
  167. package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
  168. package/dist/vuetifyConfig.js +561 -0
  169. package/dist/vuetifyConfig.umd.cjs +1 -0
  170. package/package.json +18 -6
  171. package/src/assets/apTokens.scss +2 -2
  172. package/src/assets/overrides/_btns.scss +2 -0
  173. package/src/assets/overrides/_forms.scss +9 -0
  174. package/src/assets/overrides/_icons.scss +41 -4
  175. package/src/assets/overrides/_tables.scss +19 -0
  176. package/src/assets/overrides/_typography.scss +0 -10
  177. package/src/components/Accordion/Accordion.mdx +23 -9
  178. package/src/components/Accordion/Accordion.stories.ts +153 -3
  179. package/src/components/Accordion/Accordion.vue +7 -6
  180. package/src/components/Accordion/composables/__tests__/useAccordionState.spec.ts +40 -12
  181. package/src/components/Accordion/composables/useAccordionState.ts +3 -4
  182. package/src/components/Accordion/tests/accordion.spec.ts +131 -19
  183. package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
  184. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
  185. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.mdx +3 -1
  186. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.stories.ts +8 -0
  187. package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
  188. package/src/components/BackBtn/accessibilite/Accessibility.mdx +62 -10
  189. package/src/components/BackToTopBtn/BackToTopBtn.stories.ts +9 -3
  190. package/src/components/BackToTopBtn/accessibilite/Accessibility.mdx +86 -6
  191. package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
  192. package/src/components/Captcha/tests/Captcha.spec.ts +0 -29
  193. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +14 -122
  194. package/src/components/ChipList/ChipList.stories.ts +0 -15
  195. package/src/components/ChipList/ChipList.vue +5 -1
  196. package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
  197. package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
  198. package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +124 -10
  199. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +379 -93
  200. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +162 -84
  201. package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibilite.stories.ts +40 -1
  202. package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibility.mdx +7 -1
  203. package/src/components/Customs/Selects/SyAutocomplete/locales.ts +5 -0
  204. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +96 -0
  205. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +377 -9
  206. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +27 -13
  207. package/src/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.ts +9 -10
  208. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
  209. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +8 -9
  210. package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
  211. package/src/components/Customs/Selects/SySelect/SySelect.vue +60 -14
  212. package/src/components/Customs/Selects/SySelect/locales.ts +1 -0
  213. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +54 -0
  214. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
  215. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
  216. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +16 -11
  217. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +35 -0
  218. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
  219. package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
  220. package/src/components/Customs/SyIcon/SyIcon.vue +1 -1
  221. package/src/components/Customs/SyIcon/tests/SyIcon.a11y.spec.ts +20 -0
  222. package/src/components/Customs/SyIconButton/SyIconButton.mdx +46 -0
  223. package/src/components/Customs/SyIconButton/SyIconButton.stories.ts +184 -0
  224. package/src/components/Customs/SyIconButton/SyIconButton.vue +38 -0
  225. package/src/components/Customs/SyIconButton/accessibilite/Accessibility.mdx +64 -0
  226. package/src/components/Customs/SyIconButton/tests/SyIconButton.a11y.spec.ts +87 -0
  227. package/src/components/Customs/SyIconButton/tests/SyIconButton.spec.ts +152 -0
  228. package/src/components/Customs/SyIconButton/tests/__snapshots__/SyIconButton.spec.ts.snap +61 -0
  229. package/src/components/Customs/SyPagination/SyPagination.vue +5 -5
  230. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
  231. package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
  232. package/src/components/Customs/SyTextField/SyTextField.stories.ts +29 -27
  233. package/src/components/Customs/SyTextField/SyTextField.vue +174 -159
  234. package/src/components/Customs/SyTextField/accessibilite/Accessibility.mdx +67 -9
  235. package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +47 -0
  236. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +155 -10
  237. package/src/components/DataList/accessibilite/Accessibility.mdx +79 -11
  238. package/src/components/DataListGroup/accessibilite/Accessibility.mdx +80 -11
  239. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
  240. package/src/components/DatePicker/CalendarMode/DatePicker.vue +330 -223
  241. package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
  242. package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
  243. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
  244. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +195 -159
  245. package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
  246. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +10 -10
  247. package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
  248. package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
  249. package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
  250. package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
  251. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
  252. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +63 -57
  253. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
  254. package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
  255. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
  256. package/src/components/DatePicker/composables/index.ts +1 -0
  257. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
  258. package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
  259. package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
  260. package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
  261. package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
  262. package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
  263. package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
  264. package/src/components/DatePicker/composables/useDateTextField.ts +7 -6
  265. package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
  266. package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
  267. package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
  268. package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
  269. package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +25 -0
  270. package/src/components/ErrorPage/ErrorPage.stories.ts +113 -19
  271. package/src/components/ErrorPage/ErrorPage.vue +17 -2
  272. package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +17 -0
  273. package/src/components/ErrorPage/tests/ErrorPage.spec.ts +21 -1
  274. package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +0 -1
  275. package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +23 -0
  276. package/src/components/FileList/FileList.stories.ts +51 -1
  277. package/src/components/FileList/UploadItem/UploadItem.vue +13 -6
  278. package/src/components/FileList/UploadItem/locales.ts +3 -12
  279. package/src/components/FileList/accessibilite/Accessibility.mdx +3 -0
  280. package/src/components/FileUpload/FileUpload.vue +2 -1
  281. package/src/components/FileUpload/FileUploadContent.vue +2 -1
  282. package/src/components/FileUpload/tests/FileUpload.spec.ts +47 -0
  283. package/src/components/FileUpload/validateFiles.ts +5 -2
  284. package/src/components/FranceConnectBtn/accessibilite/Accessibility.mdx +62 -9
  285. package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
  286. package/src/components/HeaderBar/HeaderBar.vue +2 -1
  287. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +2 -1
  288. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +2 -1
  289. package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
  290. package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
  291. package/src/components/LunarCalendar/accessibilite/Accessibility.mdx +74 -8
  292. package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +163 -0
  293. package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
  294. package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
  295. package/src/components/MaintenancePage/MaintenancePage.vue +1 -1
  296. package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +4 -5
  297. package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +0 -1
  298. package/src/components/MonthPicker/MonthPicker.mdx +35 -0
  299. package/src/components/MonthPicker/MonthPicker.stories.ts +527 -0
  300. package/src/components/MonthPicker/MonthPicker.vue +79 -0
  301. package/src/components/MonthPicker/MonthPickerText/MonthPickerInput.vue +89 -0
  302. package/src/components/MonthPicker/MonthPickerText/useTextField.ts +27 -0
  303. package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.vue +154 -0
  304. package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.ts +13 -0
  305. package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +137 -0
  306. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +60 -0
  307. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +149 -0
  308. package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +143 -0
  309. package/src/components/MonthPicker/MonthPickerVisual/useMonthGrid.ts +45 -0
  310. package/src/components/MonthPicker/MonthPickerVisual/useYearGrid.ts +45 -0
  311. package/src/components/MonthPicker/MonthPickerVisual/utils.ts +17 -0
  312. package/src/components/MonthPicker/accessibilite/Accessibility.mdx +59 -0
  313. package/src/components/MonthPicker/locales.ts +12 -0
  314. package/src/components/MonthPicker/tests/MonthPicker.a11y.spec.ts +71 -0
  315. package/src/components/MonthPicker/tests/MonthPicker.spec.ts +1249 -0
  316. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +2545 -0
  317. package/src/components/MonthPicker/useMonthPickerValidation.ts +30 -0
  318. package/src/components/NirField/NirField.mdx +1 -2
  319. package/src/components/NirField/NirField.stories.ts +70 -6
  320. package/src/components/NirField/NirField.vue +64 -260
  321. package/src/components/NirField/accessibilite/Accessibility.mdx +2 -2
  322. package/src/components/NirField/locales.ts +1 -1
  323. package/src/components/NirField/tests/NirField.spec.ts +6 -0
  324. package/src/components/NirField/useNirValidation.ts +271 -0
  325. package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +2 -3
  326. package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +22 -14
  327. package/src/components/NotificationBar/Notification/Notification.vue +3 -1
  328. package/src/components/NotificationBar/NotificationBar.stories.ts +154 -0
  329. package/src/components/NotificationBar/tests/NotificationBar.a11y.spec.ts +26 -0
  330. package/src/components/NotificationBar/tests/NotificationBar.spec.ts +60 -0
  331. package/src/components/PasswordField/PasswordField.stories.ts +4 -4
  332. package/src/components/PasswordField/PasswordField.vue +18 -24
  333. package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
  334. package/src/components/PeriodField/PeriodField.stories.ts +4 -4
  335. package/src/components/PeriodField/PeriodField.vue +57 -57
  336. package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
  337. package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
  338. package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
  339. package/src/components/PhoneField/PhoneField.vue +5 -6
  340. package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
  341. package/src/components/RangeField/RangeField.vue +6 -0
  342. package/src/components/RangeField/accessibilite/Accessibility.mdx +79 -11
  343. package/src/components/SkipLink/tests/SkipLink.a11y.spec.ts +23 -0
  344. package/src/components/StatusPage/StatusPage.stories.ts +118 -0
  345. package/src/components/StatusPage/StatusPage.vue +5 -3
  346. package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +22 -0
  347. package/src/components/StatusPage/tests/StatusPage.spec.ts +22 -0
  348. package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +22 -14
  349. package/src/components/SubHeader/tests/SubHeader.a11y.spec.ts +20 -0
  350. package/src/components/SyAlert/SyAlert.vue +1 -0
  351. package/src/components/SyAlert/accessibilite/Accessibility.mdx +79 -9
  352. package/src/components/SyAlert/tests/SyAlert.a11y.spec.ts +23 -0
  353. package/src/components/SyHeading/SyHeading.a11y.test.ts +149 -0
  354. package/src/components/SyHeading/SyHeading.test.ts +115 -0
  355. package/src/components/SyHeading/SyHeading.vue +5 -3
  356. package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
  357. package/src/components/SyTextArea/SyTextArea.vue +53 -23
  358. package/src/components/SyTextArea/accessibilite/Accessibility.mdx +80 -8
  359. package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +151 -0
  360. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
  361. package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
  362. package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
  363. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +673 -1
  364. package/src/components/Tables/SyServerTable/SyServerTable.vue +148 -91
  365. package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +58 -0
  366. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +122 -0
  367. package/src/components/Tables/SyTable/SyTable.mdx +25 -0
  368. package/src/components/Tables/SyTable/SyTable.stories.ts +452 -1
  369. package/src/components/Tables/SyTable/SyTable.vue +130 -56
  370. package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +57 -0
  371. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +108 -0
  372. package/src/components/Tables/common/SyTableFilter.vue +22 -2
  373. package/src/components/Tables/common/TableHeader.vue +5 -1
  374. package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
  375. package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
  376. package/src/components/Tables/common/filters/SelectFilter.vue +10 -11
  377. package/src/components/Tables/common/filters/TextFilter.vue +1 -1
  378. package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
  379. package/src/components/Tables/common/filters/locales.ts +0 -1
  380. package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
  381. package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
  382. package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
  383. package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
  384. package/src/components/Tables/common/tableFilterUtils.ts +3 -0
  385. package/src/components/Tables/common/tableStyles.scss +48 -4
  386. package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
  387. package/src/components/Tables/common/types.ts +13 -4
  388. package/src/components/Tables/common/useClickableTableRow.ts +103 -0
  389. package/src/components/Tables/common/usePagination.ts +13 -0
  390. package/src/components/Tables/common/usePinnedColumns.ts +237 -0
  391. package/src/components/Tables/common/useTableHeaders.ts +3 -3
  392. package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
  393. package/src/components/ToolbarContainer/tests/ToolbarContainer.a11y.spec.ts +126 -0
  394. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +2 -2
  395. package/src/components/index.ts +1 -0
  396. package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
  397. package/src/composables/date/useDatePickerAccessibility.ts +42 -207
  398. package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
  399. package/src/composables/rules/useFieldValidation.ts +34 -17
  400. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
  401. package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
  402. package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
  403. package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
  404. package/src/composables/unifyValidation/useValidation.ts +190 -0
  405. package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
  406. package/src/composables/useFormFieldErrorHandling.ts +15 -9
  407. package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
  408. package/src/composables/validation/tests/useValidation.spec.ts +116 -21
  409. package/src/composables/validation/useFormValidation.ts +20 -13
  410. package/src/composables/validation/useValidatable.ts +8 -1
  411. package/src/composables/validation/useValidation.ts +135 -99
  412. package/src/composantsVuetify/Introduction.mdx +48 -0
  413. package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
  414. package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
  415. package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
  416. package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
  417. package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -1
  418. package/src/designTokens/tokens/cnam/cnamSemantic.ts +2 -2
  419. package/src/stories/Components/Components.stories.ts +74 -9
  420. package/src/stories/Demarrer/Accueil.stories.ts +3 -3
  421. package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
  422. package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
  423. package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
  424. package/dist/SelectFilter-BOYlF7rX.js +0 -136
  425. package/dist/style.css +0 -1
  426. package/src/components/DatePicker/Accessibilite.mdx +0 -14
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { computed, nextTick, onMounted, onUnmounted, provide, ref, toRef, useAttrs, watch } from 'vue'
2
+ import { computed, onMounted, provide, ref, toRef, useAttrs, watch } from 'vue'
3
3
  import type { VDataTable } from 'vuetify/components'
4
4
  import SyCheckbox from '@/components/Customs/SyCheckbox/SyCheckbox.vue'
5
5
  import SyTableFilter from '../common/SyTableFilter.vue'
@@ -18,6 +18,10 @@
18
18
  import { useTableAria } from '../common/useTableAria'
19
19
  import { useTableAccessibility } from '../common/tableAccessibilityUtils'
20
20
  import useStoredOptions from '../common/useStoredOptions'
21
+ import { usePinnedColumns } from '../common/usePinnedColumns'
22
+ import { useClickableTableRow } from '../common/useClickableTableRow'
23
+ import { useTableRowCheckboxAccessibility } from '../common/useTableRowCheckboxAccessibility'
24
+ import type { ClickableTableRowPropsInput } from '../common/useClickableTableRow'
21
25
 
22
26
  const props = withDefaults(defineProps<SyTableProps>(), {
23
27
  caption: '',
@@ -30,12 +34,18 @@
30
34
  striped: false,
31
35
  showSelect: false,
32
36
  showSelectSingle: false,
37
+ stickySelect: false,
33
38
  multiSort: false,
34
39
  mustSort: false,
35
40
  itemsPerPageOptions: undefined,
36
41
  headingLevel: 2,
42
+ clickableRow: false,
37
43
  })
38
44
 
45
+ const emit = defineEmits<{
46
+ 'row-click': [item: Record<string, unknown>]
47
+ }>()
48
+
39
49
  const options = defineModel<Partial<DataOptions>>('options', {
40
50
  required: false,
41
51
  default: () => ({}),
@@ -59,7 +69,7 @@
59
69
  const componentAttributes = useAttrs()
60
70
 
61
71
  // Generate a unique ID for this table instance
62
- const uniqueTableId = ref(`sy-table-${Math.random().toString(36).substr(2, 9)}`)
72
+ const uniqueTableId = ref(`sy-table-${Math.random().toString(36).substring(2, 11)}`)
63
73
 
64
74
  const { storedOptions, storeOptions } = useStoredOptions({
65
75
  key: computed(() => props.suffix ? `table-${props.suffix}` : 'table'),
@@ -75,6 +85,16 @@
75
85
  storedOptions: storedOptions.options,
76
86
  })
77
87
 
88
+ const forwardedRowProps = computed<ClickableTableRowPropsInput>(() => {
89
+ return (propsFacade.value.rowProps ?? propsFacade.value['row-props']) as ClickableTableRowPropsInput
90
+ })
91
+
92
+ const { clickableRowProps } = useClickableTableRow({
93
+ clickableRow: toRef(props, 'clickableRow'),
94
+ rowProps: forwardedRowProps,
95
+ onRowClick: item => emit('row-click', item),
96
+ })
97
+
78
98
  const { setupAccessibility } = useTableAccessibility({
79
99
  tableId: uniqueTableId.value,
80
100
  })
@@ -96,25 +116,12 @@
96
116
 
97
117
  // Use the pagination composable
98
118
  const itemsLength = computed(() => filteredItems.value.length)
99
- const { page, pageCount, itemsPerPageValue, updateItemsPerPage, isUpdatingItemsPerPage } = usePagination({
119
+ const { page, pageCount, itemsPerPageValue, updateItemsPerPage, onUpdateOptions } = usePagination({
100
120
  options,
101
121
  itemsLength,
122
+ updateOptions,
102
123
  })
103
124
 
104
- // Defines a function to handle updating the data table options
105
- function onUpdateOptions(newOptions: Partial<DataOptions>) {
106
- if (isUpdatingItemsPerPage.value && typeof newOptions.itemsPerPage !== 'undefined') {
107
- // Creates a copy of the received options
108
- const rest = { ...newOptions }
109
- delete (rest as Record<string, unknown>).itemsPerPage
110
- // Updates the other options without modifying itemsPerPage
111
- updateOptions(rest)
112
- return
113
- }
114
- // In all other cases, simply updates the options with the new values
115
- updateOptions(newOptions)
116
- }
117
-
118
125
  // Use the table checkbox composable
119
126
  const { toggleAllRows, getItemValue } = useTableCheckbox({
120
127
  items: filteredItems,
@@ -147,55 +154,41 @@
147
154
  // Initialize generic accessibility adjustments (tabbable elements, etc.)
148
155
  setupAccessibility()
149
156
 
150
- // Timeout management for cleanup
151
- const timeouts = ref<ReturnType<typeof setTimeout>[]>([])
152
-
153
- // Function to add accessibility attributes to row checkboxes
154
- const accessibilityRowCheckboxes = () => {
155
- nextTick(() => {
156
- const timeoutId = setTimeout(() => {
157
- // Check if document is available (for test environment)
158
- if (typeof document === 'undefined') return
159
-
160
- const tableElement = document.getElementById(uniqueTableId.value)
161
- if (!tableElement) return
162
-
163
- // Find all row checkboxes
164
- const rowCheckboxes = tableElement.querySelectorAll('td .v-selection-control input[type="checkbox"]')
165
- rowCheckboxes.forEach((checkbox, index) => {
166
- const rowLabel = `${locales.selectRow} ${index + 1}`
167
- checkbox.setAttribute('aria-label', rowLabel)
168
- checkbox.setAttribute('title', rowLabel)
169
- })
170
- }, 100) // Small delay to ensure DOM is updated
171
-
172
- // Track timeout for cleanup
173
- timeouts.value.push(timeoutId)
174
- })
175
- }
157
+ const { accessibilityRowCheckboxes } = useTableRowCheckboxAccessibility({
158
+ uniqueTableId: uniqueTableId.value,
159
+ })
176
160
 
177
161
  // Watch for changes that might affect the table and update accessibility
178
162
  watch(() => props.items, accessibilityRowCheckboxes, { deep: true })
179
163
  watch(() => filteredItems.value, accessibilityRowCheckboxes)
180
164
  watch(() => page.value, accessibilityRowCheckboxes)
165
+ watch(() => itemsPerPageValue.value, accessibilityRowCheckboxes)
181
166
 
182
- // Apply accessibility attributes when component is mounted
183
167
  onMounted(() => {
184
- accessibilityRowCheckboxes()
185
168
  setupAria()
186
169
  })
187
170
 
188
- // Clean up timeouts on unmount to prevent unhandled errors
189
- onUnmounted(() => {
190
- timeouts.value.forEach((timeoutId) => {
191
- clearTimeout(timeoutId)
192
- })
193
- timeouts.value = []
194
- })
195
-
196
171
  // Create a reactive reference to column widths that will be provided to children
197
172
  const reactiveColumnWidths = ref(storedOptions.columnWidths || {})
198
173
 
174
+ const {
175
+ showPinnedLeftShadow,
176
+ showPinnedRightShadow,
177
+ hasPinnedSelectLeft,
178
+ pinnedMeta,
179
+ pinnedEdgeVars,
180
+ displayHeadersWithPinned,
181
+ } = usePinnedColumns({
182
+ displayHeaders,
183
+ reactiveColumnWidths,
184
+ pinnedColumns: toRef(props, 'pinnedColumns'),
185
+ pinnedColumnKey: toRef(props, 'pinnedColumnKey'),
186
+ stickySelect: toRef(props, 'stickySelect'),
187
+ showSelect: toRef(props, 'showSelect'),
188
+ showSelectSingle: toRef(props, 'showSelectSingle'),
189
+ tableRef: table,
190
+ })
191
+
199
192
  // Provide column widths and update function to child components
200
193
  provide('columnWidths', reactiveColumnWidths)
201
194
  provide('updateColumnWidth', (key: string, width: number | string) => {
@@ -224,7 +217,17 @@
224
217
  <template>
225
218
  <div
226
219
  :id="uniqueTableId"
227
- :class="['sy-table', { 'sy-table--striped': props.striped }]"
220
+ :class="[
221
+ 'sy-table',
222
+ {
223
+ 'sy-table--striped': props.striped,
224
+ 'sy-table--pinned-left-shadow': showPinnedLeftShadow,
225
+ 'sy-table--pinned-right-shadow': showPinnedRightShadow,
226
+ 'sy-table--pinned-select-left': hasPinnedSelectLeft,
227
+ 'sy-table--select-single': props.showSelectSingle,
228
+ },
229
+ ]"
230
+ :style="pinnedEdgeVars"
228
231
  >
229
232
  <!-- ARIA status region for row count announcements -->
230
233
  <div
@@ -239,8 +242,9 @@
239
242
  ref="table"
240
243
  v-model="model"
241
244
  color="primary"
242
- :headers="displayHeaders"
245
+ :headers="displayHeadersWithPinned"
243
246
  v-bind="propsFacade"
247
+ :row-props="clickableRowProps"
244
248
  :items="filteredItems"
245
249
  :density="props.density"
246
250
  :show-select="props.showSelect || props.showSelectSingle"
@@ -269,11 +273,25 @@
269
273
  :key="column.key!"
270
274
  >
271
275
  <th
272
- :class="{ 'checkbox-column': column.key === 'data-table-select' }"
276
+ :class="[
277
+ { 'checkbox-column': column.key === 'data-table-select' },
278
+ {
279
+ 'sy-table__pinned': pinnedMeta.left[column.key!] !== undefined || pinnedMeta.right[column.key!] !== undefined,
280
+ 'sy-table__pinned--left': pinnedMeta.left[column.key!] !== undefined,
281
+ 'sy-table__pinned--right': pinnedMeta.right[column.key!] !== undefined,
282
+ 'v-data-table-column--fixed': pinnedMeta.left[column.key!] !== undefined || pinnedMeta.right[column.key!] !== undefined,
283
+ },
284
+ ]"
273
285
  :style="{
274
286
  ...(getHeaderForColumn(column)?.maxWidth ? { maxWidth: getHeaderForColumn(column)?.maxWidth as any } : {}),
275
287
  ...(getHeaderForColumn(column)?.minWidth ? { minWidth: getHeaderForColumn(column)?.minWidth as any } : {}),
276
288
  ...(getHeaderForColumn(column)?.width ? { width: getHeaderForColumn(column)?.width as any } : {}),
289
+ ...(pinnedMeta.left[column.key!] !== undefined
290
+ ? { position: 'sticky', left: `${pinnedMeta.left[column.key!] }px`, zIndex: 'var(--sy-table-z-pinned-header)', background: 'var(--sy-table-header-bg-pinned)' }
291
+ : {}),
292
+ ...(pinnedMeta.right[column.key!] !== undefined
293
+ ? { position: 'sticky', right: `${pinnedMeta.right[column.key!] }px`, zIndex: 'var(--sy-table-z-pinned-header)', background: 'var(--sy-table-header-bg-pinned)' }
294
+ : {}),
277
295
  }"
278
296
  >
279
297
  <template v-if="column.key === 'data-table-select' && props.showSelect && !props.showSelectSingle">
@@ -459,6 +477,7 @@
459
477
 
460
478
  .sy-table :deep() {
461
479
  @include tablestyles;
480
+ @include clickable-row-styles;
462
481
  }
463
482
 
464
483
  @mixin striped-rows {
@@ -475,4 +494,59 @@
475
494
  max-width: fit-content;
476
495
  }
477
496
 
497
+ .sy-table :deep(.sy-table__pinned) {
498
+ box-shadow: none;
499
+ opacity: 1 !important;
500
+ }
501
+
502
+ .sy-table--pinned-left-shadow :deep(.sy-table__pinned--left) {
503
+ box-shadow: 2px 0 6px -4px rgba(tokens.$grey-base, 0.6);
504
+ }
505
+
506
+ .sy-table--pinned-right-shadow :deep(.sy-table__pinned--right) {
507
+ box-shadow: -2px 0 6px -4px rgba(tokens.$grey-base, 0.6);
508
+ }
509
+
510
+ .sy-table--pinned-select-left :deep(.v-data-table__th--select),
511
+ .sy-table--pinned-select-left :deep(.v-data-table__td--select-row) {
512
+ opacity: 1 !important;
513
+ }
514
+
515
+ .sy-table--pinned-select-left :deep(.v-data-table__th--select) {
516
+ position: sticky;
517
+ left: 0;
518
+ z-index: 5;
519
+ background: var(--sy-table-header-bg-pinned);
520
+ }
521
+
522
+ .sy-table--select-single.sy-table--pinned-select-left :deep(.v-data-table__th--select) {
523
+ box-shadow: none !important;
524
+ background: transparent !important;
525
+ }
526
+
527
+ /* stylelint-disable @stylistic/max-line-length */
528
+ .sy-table--select-single.sy-table--pinned-left-shadow.sy-table--pinned-select-left :deep(.v-table__wrapper > table > thead > tr > th:first-child) {
529
+ box-shadow: none !important;
530
+ background: transparent !important;
531
+ }
532
+
533
+ .sy-table--pinned-select-left :deep(.v-table__wrapper > table > tbody > tr:not(.v-data-table-rows-loading) > td:first-child),
534
+ .sy-table--pinned-select-left :deep(.v-table__wrapper > table > tbody > tr:not(.v-data-table-rows-loading) > .v-data-table__td:first-child),
535
+ .sy-table--pinned-select-left :deep(.v-data-table__tbody .v-data-table__tr:not(.v-data-table-rows-loading) > .v-data-table__td:first-child),
536
+ .sy-table--pinned-select-left :deep(.v-data-table__tbody tr:not(.v-data-table-rows-loading) > td:first-child) {
537
+ position: sticky !important;
538
+ left: 0 !important;
539
+ z-index: 3;
540
+ background: rgb(var(--v-theme-surface)) !important;
541
+ }
542
+
543
+ .sy-table--pinned-left-shadow.sy-table--pinned-select-left:not(.sy-table--select-single) :deep(.v-data-table__th--select),
544
+ .sy-table--pinned-left-shadow.sy-table--pinned-select-left :deep(.v-table__wrapper > table > tbody > tr:not(.v-data-table-rows-loading) > td:first-child),
545
+ .sy-table--pinned-left-shadow.sy-table--pinned-select-left :deep(.v-table__wrapper > table > tbody > tr:not(.v-data-table-rows-loading) > .v-data-table__td:first-child),
546
+ .sy-table--pinned-left-shadow.sy-table--pinned-select-left :deep(.v-data-table__tbody .v-data-table__tr:not(.v-data-table-rows-loading) > .v-data-table__td:first-child),
547
+ .sy-table--pinned-left-shadow.sy-table--pinned-select-left :deep(.v-data-table__tbody tr:not(.v-data-table-rows-loading) > td:first-child) {
548
+ box-shadow: 2px 0 6px -4px rgba(tokens.$grey-base, 0.6);
549
+ }
550
+ /* stylelint-enable @stylistic/max-line-length */
551
+
478
552
  </style>
@@ -0,0 +1,57 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { beforeAll, describe, it } from 'vitest'
4
+ import { mount } from '@vue/test-utils'
5
+ import { axe } from 'vitest-axe'
6
+ import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
7
+ import type { DataOptions } from '@/components/Tables/common/types'
8
+ import SyTable from '../SyTable.vue'
9
+
10
+ const items = [
11
+ { id: 1, name: 'John Doe', age: 25 },
12
+ { id: 2, name: 'Jane Doe', age: 30 },
13
+ ]
14
+
15
+ const headers = [
16
+ { title: 'ID', key: 'id' },
17
+ { title: 'Name', key: 'name' },
18
+ { title: 'Age', key: 'age' },
19
+ ]
20
+
21
+ describe('SyTable - accessibility (axe)', () => {
22
+ beforeAll(() => {
23
+ global.visualViewport = {
24
+ width: 1024,
25
+ height: 768,
26
+ scale: 1,
27
+ offsetLeft: 0,
28
+ offsetTop: 0,
29
+ pageLeft: 0,
30
+ pageTop: 0,
31
+ onresize: null,
32
+ onscroll: null,
33
+ addEventListener: () => {},
34
+ removeEventListener: () => {},
35
+ dispatchEvent: () => true,
36
+ }
37
+ })
38
+
39
+ it('has no obvious axe violations when rows are clickable and contain nested actions', async () => {
40
+ const wrapper = mount(SyTable, {
41
+ props: {
42
+ options: {} as DataOptions,
43
+ suffix: 'a11y-clickable-row-test',
44
+ clickableRow: true,
45
+ showSelect: true,
46
+ headers,
47
+ items,
48
+ },
49
+ attachTo: document.body,
50
+ })
51
+
52
+ const results = await axe(wrapper.element as HTMLElement)
53
+ assertNoA11yViolations(results, 'SyTable - clickableRow', {
54
+ ignoreRules: ['region', 'aria-allowed-attr', 'aria-prohibited-attr', 'label'],
55
+ })
56
+ })
57
+ })
@@ -191,6 +191,57 @@ describe('SyTable', () => {
191
191
  expect(dataTable.props('itemsPerPage')).toBe(5)
192
192
  })
193
193
 
194
+ it('makes rows clickable and emits row-click events', async () => {
195
+ const wrapper = mount(SyTable, {
196
+ props: {
197
+ options: {} as DataOptions,
198
+ suffix: 'clickable-row-test',
199
+ clickableRow: true,
200
+ headers,
201
+ items: fakeItems,
202
+ },
203
+ attachTo: document.body,
204
+ })
205
+
206
+ await wrapper.vm.$nextTick()
207
+
208
+ const firstRow = wrapper.find('tbody tr')
209
+
210
+ expect(firstRow.classes()).toContain('v-data-table__tr--clickable')
211
+ expect(firstRow.classes()).toContain('sy-table__clickable-row')
212
+ expect(firstRow.attributes('data-clickable-row')).toBe('true')
213
+ expect(firstRow.attributes('tabindex')).toBe('0')
214
+ expect(firstRow.attributes('role')).toBeUndefined()
215
+
216
+ await firstRow.trigger('click')
217
+
218
+ expect(wrapper.emitted('row-click')).toEqual([[fakeItems[0]]])
219
+ })
220
+
221
+ it('does not emit row-click when an interactive element inside the row is clicked', async () => {
222
+ const wrapper = mount(SyTable, {
223
+ props: {
224
+ options: {} as DataOptions,
225
+ suffix: 'clickable-row-nested-interactive-test',
226
+ clickableRow: true,
227
+ showSelect: true,
228
+ headers,
229
+ items: fakeItems,
230
+ },
231
+ attachTo: document.body,
232
+ })
233
+
234
+ await wrapper.vm.$nextTick()
235
+
236
+ const nestedCheckbox = wrapper.find('tbody .v-selection-control input')
237
+
238
+ expect(nestedCheckbox.exists()).toBe(true)
239
+
240
+ await nestedCheckbox.trigger('click')
241
+
242
+ expect(wrapper.emitted('row-click')).toBeUndefined()
243
+ })
244
+
194
245
  it('should show filters when showFilters prop is true', async () => {
195
246
  const wrapper = mount(SyTable, {
196
247
  props: {
@@ -348,6 +399,41 @@ describe('SyTable', () => {
348
399
  expect(wrapper.text()).toContain('No data available')
349
400
  })
350
401
 
402
+ it('applies sticky styles for pinnedColumns (left/right) including data-table-select', async () => {
403
+ const wrapper = mount(SyTable, {
404
+ props: {
405
+ options: { itemsPerPage: 5 } as DataOptions,
406
+ suffix: 'pinned-columns-test',
407
+ showSelect: true,
408
+ pinnedColumns: [
409
+ 'data-table-select',
410
+ { key: 'name', side: 'left' },
411
+ { key: 'age', side: 'right' },
412
+ ],
413
+ },
414
+ attrs: {
415
+ items: fakeItems,
416
+ headers: headers,
417
+ },
418
+ attachTo: document.body,
419
+ })
420
+
421
+ await wrapper.vm.$nextTick()
422
+ await vi.dynamicImportSettled()
423
+
424
+ const pinnedTh = wrapper.findAll('th[style*="position: sticky"]')
425
+ expect(pinnedTh.length).toBeGreaterThan(0)
426
+ expect(pinnedTh.some(th => (th.attributes('style') || '').includes('left:'))).toBe(true)
427
+ expect(pinnedTh.some(th => (th.attributes('style') || '').includes('right:'))).toBe(true)
428
+ expect(pinnedTh.every(th => (th.attributes('style') || '').includes('background: var(--sy-table-header-bg-pinned)'))).toBe(true)
429
+
430
+ const pinnedTd = wrapper.findAll('tbody td[style*="position: sticky"]')
431
+ expect(pinnedTd.length).toBeGreaterThan(0)
432
+ expect(pinnedTd.some(td => (td.attributes('style') || '').includes('left:'))).toBe(true)
433
+ expect(pinnedTd.some(td => (td.attributes('style') || '').includes('right:'))).toBe(true)
434
+ expect(pinnedTd.every(td => (td.attributes('style') || '').includes('background: rgb(var(--v-theme-surface))'))).toBe(true)
435
+ })
436
+
351
437
  it('enables selection when showSelect is true', async () => {
352
438
  const wrapper = mount(SyTable, {
353
439
  props: {
@@ -378,6 +464,28 @@ describe('SyTable', () => {
378
464
  expect(dataTable.props('showSelect')).toBe(false)
379
465
  })
380
466
 
467
+ it('makes selection column sticky when stickySelect is true', async () => {
468
+ const wrapper = mount(SyTable, {
469
+ props: {
470
+ options: { itemsPerPage: 5 } as DataOptions,
471
+ suffix: 'sticky-select-test',
472
+ showSelect: true,
473
+ stickySelect: true,
474
+ pinnedColumns: [{ key: 'age', side: 'right' }],
475
+ },
476
+ attrs: {
477
+ items: fakeItems,
478
+ headers: headers,
479
+ },
480
+ attachTo: document.body,
481
+ })
482
+
483
+ await wrapper.vm.$nextTick()
484
+ await vi.dynamicImportSettled()
485
+
486
+ expect(wrapper.classes()).toContain('sy-table--pinned-select-left')
487
+ })
488
+
381
489
  it('passes the correct item-value function to the data table', async () => {
382
490
  const wrapper = mount(SyTable, {
383
491
  props: {
@@ -62,12 +62,14 @@
62
62
  date: Record<string, DateValue>
63
63
  period: Record<string, { from: string | null, to: string | null }>
64
64
  select: Record<string, string | number | Record<string, unknown> | undefined>
65
+ autocomplete: Record<string, string | number | Record<string, unknown> | Array<string | number | Record<string, unknown>> | undefined>
65
66
  }>({
66
67
  text: {},
67
68
  number: {},
68
69
  date: {},
69
70
  period: {},
70
71
  select: {},
72
+ autocomplete: {},
71
73
  })
72
74
 
73
75
  // Computed properties pour accéder aux différents types de filtres
@@ -76,6 +78,7 @@
76
78
  const dateFilters = computed(() => filtersMap.value.date)
77
79
  const periodFilters = computed(() => filtersMap.value.period)
78
80
  const selectFilters = computed(() => filtersMap.value.select)
81
+ const autocompleteFilters = computed(() => filtersMap.value.autocomplete)
79
82
 
80
83
  // Fonction pour traiter un filtre individuel
81
84
  function processFilter(filter: FilterOption) {
@@ -110,6 +113,9 @@
110
113
  case 'select':
111
114
  filtersMap.value.select[key] = value !== null ? value as string | number | Record<string, unknown> : undefined
112
115
  break
116
+ case 'autocomplete':
117
+ filtersMap.value.autocomplete[key] = value !== null ? value as string | number | Record<string, unknown> | Array<string | number | Record<string, unknown>> : undefined
118
+ break
113
119
  }
114
120
  }
115
121
 
@@ -123,6 +129,7 @@
123
129
  date: {},
124
130
  period: {},
125
131
  select: {},
132
+ autocomplete: {},
126
133
  }
127
134
  return
128
135
  }
@@ -146,7 +153,10 @@
146
153
  function getFilterValue(header: TableColumnHeader) {
147
154
  const key = String(header.key || header.value || '')
148
155
 
149
- if (header.filterType === 'select' || header.filterOptions) {
156
+ if (header.filterType === 'autocomplete') {
157
+ return autocompleteFilters.value[key]
158
+ }
159
+ else if (header.filterType === 'select' || header.filterOptions) {
150
160
  return selectFilters.value[key]
151
161
  }
152
162
  else if (header.filterType === 'date') {
@@ -167,7 +177,10 @@
167
177
  function updateFilter(header: TableColumnHeader, value: unknown) {
168
178
  const key = String(header.key || header.value || '')
169
179
 
170
- if (header.filterType === 'select' || header.filterOptions) {
180
+ if (header.filterType === 'autocomplete') {
181
+ filtersMap.value.autocomplete[key] = value as string | number | Record<string, unknown> | Array<string | number | Record<string, unknown>> | undefined
182
+ }
183
+ else if (header.filterType === 'select' || header.filterOptions) {
171
184
  filtersMap.value.select[key] = value as string | number | Record<string, unknown> | undefined
172
185
  }
173
186
  else if (header.filterType === 'date') {
@@ -229,6 +242,13 @@
229
242
  }
230
243
  })
231
244
 
245
+ // Ajouter les filtres autocomplete
246
+ Object.entries(filtersMap.value.autocomplete).forEach(([filterKey, filterValue]) => {
247
+ if (filterValue !== undefined && filterValue !== null && !(Array.isArray(filterValue) && filterValue.length === 0)) {
248
+ newFilters.push({ key: filterKey, value: filterValue, type: 'autocomplete' })
249
+ }
250
+ })
251
+
232
252
  updateFilters(newFilters)
233
253
  }
234
254
  </script>
@@ -217,7 +217,7 @@
217
217
  <div
218
218
  class="col-title"
219
219
  :class="[textAlignClass, headerClassRaw]"
220
- :style="[{ width: '100%' }, headerStyle]"
220
+ :style="headerStyle"
221
221
  >
222
222
  {{ column.title }}
223
223
  </div>
@@ -266,6 +266,10 @@
266
266
  </template>
267
267
 
268
268
  <style lang="scss" scoped>
269
+ .v-data-table-header__content {
270
+ column-gap: 4px;
271
+ }
272
+
269
273
  .sort-order-indicator {
270
274
  font-size: 0.75rem;
271
275
  font-weight: bold;