@cnamts/synapse 1.0.23 → 1.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/dist/AutocompleteFilter-BWLR3U7W.js +114 -0
  2. package/dist/AutocompleteFilter-D9jzRzAL.cjs +1 -0
  3. package/dist/{DateFilter-Dc-gSGwk.js → DateFilter-BpwFexzi.js} +1 -1
  4. package/dist/DateFilter-DTUl8hb1.cjs +1 -0
  5. package/dist/{NumberFilter-vP38Wp6j.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-Ba1uYUnT.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-B84dpnoq.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/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
  16. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
  17. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
  18. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
  19. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +60 -60
  20. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
  21. package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
  22. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7501 -10095
  23. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +21 -21
  24. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +41 -41
  25. package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
  26. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
  27. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +108 -146
  28. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +5 -5
  29. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -16
  30. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +8 -8
  31. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +28 -506
  32. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +28 -506
  33. package/dist/components/Customs/SyTextField/SyTextField.d.ts +65 -85
  34. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +627 -771
  35. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +315 -402
  36. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +112 -155
  37. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  38. package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
  39. package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
  40. package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
  41. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  42. package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
  43. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +4 -4
  44. package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
  45. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
  46. package/dist/components/MonthPicker/MonthPicker.d.ts +86 -122
  47. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +85 -121
  48. package/dist/components/NirField/NirField.d.ts +206 -270
  49. package/dist/components/NirField/locales.d.ts +10 -10
  50. package/dist/components/NirField/useNirValidation.d.ts +64 -0
  51. package/dist/components/PasswordField/PasswordField.d.ts +8 -9
  52. package/dist/components/PeriodField/PeriodField.d.ts +1352 -1640
  53. package/dist/components/PhoneField/PhoneField.d.ts +88 -124
  54. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
  55. package/dist/components/SyTextArea/SyTextArea.d.ts +34 -14
  56. package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
  57. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +9 -6
  58. package/dist/components/Tables/SyTable/SyTable.d.ts +9 -6
  59. package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
  60. package/dist/components/Tables/common/SyTablePagination.d.ts +17 -19
  61. package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
  62. package/dist/components/Tables/common/filters/locales.d.ts +0 -1
  63. package/dist/components/Tables/common/types.d.ts +19 -3
  64. package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
  65. package/dist/components/Tables/common/usePagination.d.ts +3 -1
  66. package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
  67. package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
  68. package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
  69. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +6 -6
  70. package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
  71. package/dist/composables/rules/useFieldValidation.d.ts +4 -4
  72. package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
  73. package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
  74. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
  75. package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
  76. package/dist/composables/validation/useFormValidation.d.ts +11 -2
  77. package/dist/composables/validation/useValidation.d.ts +15 -9
  78. package/dist/design-system-v3.d.ts +2 -0
  79. package/dist/design-system-v3.js +186 -187
  80. package/dist/design-system-v3.umd.cjs +1 -1066
  81. package/dist/{main-aLKwdMi1.js → main-BtTqyn4z.js} +16434 -15672
  82. package/dist/main-C1e3eoxd.cjs +1067 -0
  83. package/dist/main.d.ts +0 -1
  84. package/dist/synapse.css +1 -0
  85. package/dist/tooth-11-D3sLWv2n.cjs +1 -0
  86. package/dist/tooth-12-CXrLuH03.cjs +1 -0
  87. package/dist/tooth-13-BSfo5fpT.cjs +1 -0
  88. package/dist/tooth-14-DMzulx0h.cjs +1 -0
  89. package/dist/tooth-15-BKRFVi-9.cjs +1 -0
  90. package/dist/tooth-16-CpuxAbuM.cjs +1 -0
  91. package/dist/tooth-17-BPoahUdg.cjs +1 -0
  92. package/dist/tooth-18-DhHJz8sy.cjs +1 -0
  93. package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
  94. package/dist/tooth-22-C2Tn19sB.cjs +1 -0
  95. package/dist/tooth-23-C9uaaSGb.cjs +1 -0
  96. package/dist/tooth-24-BrK9UGpf.cjs +1 -0
  97. package/dist/tooth-25-CE_EfGNp.cjs +1 -0
  98. package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
  99. package/dist/tooth-27-C5J7JkWM.cjs +1 -0
  100. package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
  101. package/dist/tooth-31-BrYqmkTi.cjs +1 -0
  102. package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
  103. package/dist/tooth-33-DuxvqO2J.cjs +1 -0
  104. package/dist/tooth-34-BCSCXMB6.cjs +1 -0
  105. package/dist/tooth-35-BLUXkX88.cjs +1 -0
  106. package/dist/tooth-36-IrKHYqlA.cjs +1 -0
  107. package/dist/tooth-37-BYqpdMwo.cjs +1 -0
  108. package/dist/tooth-38-B_eNXXdu.cjs +1 -0
  109. package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
  110. package/dist/tooth-42-szcDqlM0.cjs +1 -0
  111. package/dist/tooth-43-B3ka6rQm.cjs +1 -0
  112. package/dist/tooth-44-CazyQucj.cjs +1 -0
  113. package/dist/tooth-45-B4HQtc8n.cjs +1 -0
  114. package/dist/tooth-46-BPM40gbG.cjs +1 -0
  115. package/dist/tooth-47-Dvr20dlh.cjs +1 -0
  116. package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
  117. package/dist/tooth-51-OBpwCOF3.cjs +1 -0
  118. package/dist/tooth-52-aKxyHcmq.cjs +1 -0
  119. package/dist/tooth-53-vCwJjTOc.cjs +1 -0
  120. package/dist/tooth-54-DsWu2iFy.cjs +1 -0
  121. package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
  122. package/dist/tooth-61-BbLvxMQi.cjs +1 -0
  123. package/dist/tooth-62-CmTkWczP.cjs +1 -0
  124. package/dist/tooth-63-DI7l_2qI.cjs +1 -0
  125. package/dist/tooth-64-B21sOsJh.cjs +1 -0
  126. package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
  127. package/dist/tooth-71-D473PPO5.cjs +1 -0
  128. package/dist/tooth-72-Drh1wnNu.cjs +1 -0
  129. package/dist/tooth-73-DzlwYI23.cjs +1 -0
  130. package/dist/tooth-74-8aGvcZPg.cjs +1 -0
  131. package/dist/tooth-75-BFK7At_r.cjs +1 -0
  132. package/dist/tooth-81-BZmR-I0M.cjs +1 -0
  133. package/dist/tooth-82-euVfUUZV.cjs +1 -0
  134. package/dist/tooth-83-KV010j64.cjs +1 -0
  135. package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
  136. package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
  137. package/dist/vuetifyConfig.js +561 -0
  138. package/dist/vuetifyConfig.umd.cjs +1 -0
  139. package/package.json +10 -4
  140. package/src/assets/overrides/_btns.scss +0 -6
  141. package/src/assets/overrides/_icons.scss +9 -1
  142. package/src/assets/overrides/_typography.scss +0 -10
  143. package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
  144. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
  145. package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
  146. package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
  147. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +12 -12
  148. package/src/components/ChipList/ChipList.stories.ts +0 -15
  149. package/src/components/ChipList/ChipList.vue +5 -1
  150. package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
  151. package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
  152. package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +0 -9
  153. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +22 -5
  154. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +143 -0
  155. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +14 -10
  156. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
  157. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +8 -9
  158. package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
  159. package/src/components/Customs/Selects/SySelect/SySelect.vue +14 -11
  160. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +54 -0
  161. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
  162. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
  163. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +16 -11
  164. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +35 -0
  165. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
  166. package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
  167. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
  168. package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
  169. package/src/components/Customs/SyTextField/SyTextField.stories.ts +29 -27
  170. package/src/components/Customs/SyTextField/SyTextField.vue +154 -157
  171. package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +32 -0
  172. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +120 -11
  173. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
  174. package/src/components/DatePicker/CalendarMode/DatePicker.vue +330 -223
  175. package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
  176. package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
  177. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
  178. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +195 -159
  179. package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
  180. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +10 -10
  181. package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
  182. package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
  183. package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
  184. package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
  185. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
  186. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +63 -57
  187. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
  188. package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
  189. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
  190. package/src/components/DatePicker/composables/index.ts +1 -0
  191. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
  192. package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
  193. package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
  194. package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
  195. package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
  196. package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
  197. package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
  198. package/src/components/DatePicker/composables/useDateTextField.ts +7 -6
  199. package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
  200. package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
  201. package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
  202. package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
  203. package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
  204. package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
  205. package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
  206. package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
  207. package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
  208. package/src/components/MonthPicker/tests/MonthPicker.spec.ts +2 -1
  209. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +7 -7
  210. package/src/components/NirField/NirField.stories.ts +4 -0
  211. package/src/components/NirField/NirField.vue +64 -260
  212. package/src/components/NirField/accessibilite/Accessibility.mdx +2 -2
  213. package/src/components/NirField/locales.ts +1 -1
  214. package/src/components/NirField/tests/NirField.spec.ts +6 -0
  215. package/src/components/NirField/useNirValidation.ts +271 -0
  216. package/src/components/PasswordField/PasswordField.stories.ts +4 -4
  217. package/src/components/PasswordField/PasswordField.vue +18 -24
  218. package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
  219. package/src/components/PeriodField/PeriodField.stories.ts +4 -4
  220. package/src/components/PeriodField/PeriodField.vue +57 -57
  221. package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
  222. package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
  223. package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
  224. package/src/components/PhoneField/PhoneField.vue +5 -6
  225. package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
  226. package/src/components/RangeField/RangeField.vue +6 -0
  227. package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
  228. package/src/components/SyTextArea/SyTextArea.vue +53 -23
  229. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
  230. package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
  231. package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
  232. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +673 -1
  233. package/src/components/Tables/SyServerTable/SyServerTable.vue +148 -91
  234. package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +58 -0
  235. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +122 -0
  236. package/src/components/Tables/SyTable/SyTable.mdx +25 -0
  237. package/src/components/Tables/SyTable/SyTable.stories.ts +452 -1
  238. package/src/components/Tables/SyTable/SyTable.vue +130 -56
  239. package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +57 -0
  240. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +108 -0
  241. package/src/components/Tables/common/SyTableFilter.vue +22 -2
  242. package/src/components/Tables/common/TableHeader.vue +5 -1
  243. package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
  244. package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
  245. package/src/components/Tables/common/filters/SelectFilter.vue +10 -11
  246. package/src/components/Tables/common/filters/TextFilter.vue +1 -1
  247. package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
  248. package/src/components/Tables/common/filters/locales.ts +0 -1
  249. package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
  250. package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
  251. package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
  252. package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
  253. package/src/components/Tables/common/tableFilterUtils.ts +3 -0
  254. package/src/components/Tables/common/tableStyles.scss +48 -4
  255. package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
  256. package/src/components/Tables/common/types.ts +13 -4
  257. package/src/components/Tables/common/useClickableTableRow.ts +103 -0
  258. package/src/components/Tables/common/usePagination.ts +13 -0
  259. package/src/components/Tables/common/usePinnedColumns.ts +237 -0
  260. package/src/components/Tables/common/useTableHeaders.ts +3 -3
  261. package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
  262. package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
  263. package/src/composables/date/useDatePickerAccessibility.ts +42 -207
  264. package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
  265. package/src/composables/rules/useFieldValidation.ts +34 -17
  266. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
  267. package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
  268. package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
  269. package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
  270. package/src/composables/unifyValidation/useValidation.ts +190 -0
  271. package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
  272. package/src/composables/useFormFieldErrorHandling.ts +4 -7
  273. package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
  274. package/src/composables/validation/tests/useValidation.spec.ts +116 -21
  275. package/src/composables/validation/useFormValidation.ts +20 -13
  276. package/src/composables/validation/useValidatable.ts +8 -1
  277. package/src/composables/validation/useValidation.ts +135 -99
  278. package/src/composantsVuetify/Introduction.mdx +48 -0
  279. package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
  280. package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
  281. package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
  282. package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
  283. package/src/designTokens/tokens/cnam/cnamSemantic.ts +2 -2
  284. package/src/main.ts +0 -2
  285. package/src/stories/Components/Components.stories.ts +74 -9
  286. package/src/stories/Demarrer/Accueil.stories.ts +3 -3
  287. package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
  288. package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
  289. package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
  290. package/dist/SelectFilter-BioGT6Nn.js +0 -136
  291. package/dist/style.css +0 -1
  292. package/src/components/DatePicker/Accessibilite.mdx +0 -14
@@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/vue3'
2
2
  import SyServerTable from './SyServerTable.vue'
3
3
  import { StateEnum } from '../common/constants/StateEnum'
4
4
  import type { DataOptions, FilterType } from '../common/types'
5
- import { ref, watch } from 'vue'
5
+ import { computed, defineComponent, ref, watch } from 'vue'
6
6
  import type { VDataTable } from 'vuetify/components'
7
7
  import dayjs from 'dayjs'
8
8
  import { fn } from '@storybook/test'
@@ -170,6 +170,35 @@ const meta = {
170
170
  type: { summary: 'boolean' },
171
171
  },
172
172
  },
173
+ 'stickySelect': {
174
+ description: 'Rend la colonne de sélection (cases à cocher) sticky à gauche quand showSelect ou showSelectSingle est activé.',
175
+ control: { type: 'boolean' },
176
+ table: {
177
+ category: 'props',
178
+ type: { summary: 'boolean' },
179
+ defaultValue: {
180
+ summary: 'false',
181
+ },
182
+ },
183
+ },
184
+ 'pinnedColumns': {
185
+ description: 'Liste des colonnes à épingler (sticky). Chaque entrée peut être une clé de colonne (string) ou un objet `{ key: string, side?: \'left\' | \'right\' }`. Par défaut, les colonnes sont épinglées à gauche.',
186
+ control: { type: 'object' },
187
+ table: {
188
+ category: 'props',
189
+ type: { summary: 'Array<string | { key: string, side?: \'left\' | \'right\' }>' },
190
+ defaultValue: { summary: 'undefined' },
191
+ },
192
+ },
193
+ 'pinnedColumnKey': {
194
+ description: 'Raccourci pour épingler une seule colonne à gauche. Équivalent à `pinnedColumns: [key]`. Ignoré si `pinnedColumns` est défini.',
195
+ control: { type: 'text' },
196
+ table: {
197
+ category: 'props',
198
+ type: { summary: 'string' },
199
+ defaultValue: { summary: 'undefined' },
200
+ },
201
+ },
173
202
  'selectionKey': {
174
203
  description: 'Clé utilisée pour identifier chaque ligne lors de la sélection. Par défaut, utilise "id" si présent, sinon l\'objet complet.',
175
204
  control: { type: 'text' },
@@ -179,6 +208,15 @@ const meta = {
179
208
  defaultValue: { summary: 'undefined (fallback: id | objet complet)' },
180
209
  },
181
210
  },
211
+ 'clickableRow': {
212
+ description: 'Rend chaque ligne cliquable. Quand cette prop est activée, la ligne devient focusable au clavier et émet `row-click` sur clic, `Entrée` ou `Espace`, sans interférer avec les éléments interactifs imbriqués.',
213
+ control: { type: 'boolean' },
214
+ table: {
215
+ category: 'props',
216
+ type: { summary: 'boolean' },
217
+ defaultValue: { summary: 'false' },
218
+ },
219
+ },
182
220
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
183
221
  // @ts-ignore - 'cookie-description-${cookieName}' storybook can't infer dynamic slot name
184
222
  'header.<columnKey>': {
@@ -200,6 +238,13 @@ const meta = {
200
238
  },
201
239
  },
202
240
  },
241
+ 'onRow-click': {
242
+ description: 'Émis lorsqu\'une ligne est activée alors que `clickableRow` est à `true`. Reçoit l\'objet de la ligne en paramètre. Les interactions avec des éléments déjà interactifs dans la ligne ne déclenchent pas cet événement.',
243
+ table: {
244
+ category: 'events',
245
+ type: { summary: '(item: Record<string, unknown>) => void' },
246
+ },
247
+ },
203
248
  },
204
249
  } satisfies Meta<typeof SyServerTable & typeof VDataTable>
205
250
 
@@ -1635,6 +1680,8 @@ export const ServerFilterBySelect: Story = {
1635
1680
  key: 'department',
1636
1681
  filterable: true,
1637
1682
  filterType: 'select',
1683
+ multiple: false,
1684
+ chips: false,
1638
1685
  hideMessages: true,
1639
1686
  filterOptions: [
1640
1687
  { text: 'RH', value: 'RH' },
@@ -1648,6 +1695,8 @@ export const ServerFilterBySelect: Story = {
1648
1695
  key: 'status',
1649
1696
  filterable: true,
1650
1697
  filterType: 'select',
1698
+ multiple: false,
1699
+ chips: false,
1651
1700
  hideMessages: true,
1652
1701
  filterOptions: [
1653
1702
  { text: 'Actif', value: 'Actif' },
@@ -1754,6 +1803,8 @@ export const ServerFilterBySelect: Story = {
1754
1803
  key: 'department',
1755
1804
  filterable: true,
1756
1805
  filterType: 'select',
1806
+ multiple: false,
1807
+ chips: false,
1757
1808
  hideMessages: true,
1758
1809
  filterOptions: [
1759
1810
  { text: 'RH', value: 'RH' },
@@ -1767,6 +1818,8 @@ export const ServerFilterBySelect: Story = {
1767
1818
  key: 'status',
1768
1819
  filterable: true,
1769
1820
  filterType: 'select',
1821
+ multiple: false,
1822
+ chips: false,
1770
1823
  hideMessages: true,
1771
1824
  filterOptions: [
1772
1825
  { text: 'Actif', value: 'Actif' },
@@ -2232,6 +2285,245 @@ export const ServerFilterBySelectMultiple: Story = {
2232
2285
  },
2233
2286
  }
2234
2287
 
2288
+ export const ServerFilterByAutocomplete: Story = {
2289
+ parameters: {
2290
+ a11y: {
2291
+ disable: true,
2292
+ },
2293
+ sourceCode: [
2294
+ {
2295
+ name: 'Template',
2296
+ code: `
2297
+ <template>
2298
+ <SyServerTable
2299
+ v-model:options="options"
2300
+ :items="filteredUsers"
2301
+ :headers="headers"
2302
+ :server-items-length="totalFilteredUsers"
2303
+ :loading="state === StateEnum.PENDING"
2304
+ suffix="server-filter-autocomplete"
2305
+ :show-filters="true"
2306
+ @update:options="fetchData"
2307
+ />
2308
+ </template>
2309
+ `,
2310
+ },
2311
+ {
2312
+ name: 'Script',
2313
+ code: `
2314
+ <script setup lang="ts">
2315
+ import { ref } from 'vue'
2316
+ import { SyServerTable } from '@cnamts/synapse'
2317
+ import { StateEnum } from '@cnamts/synapse/components/Tables/common/constants/StateEnum'
2318
+ import type { DataOptions, FilterOption } from '@cnamts/synapse/components/Tables/common/types'
2319
+
2320
+ interface User {
2321
+ name: string
2322
+ department: string
2323
+ status: string
2324
+ }
2325
+
2326
+ const totalFilteredUsers = ref(0)
2327
+ const filteredUsers = ref<User[]>([])
2328
+ const state = ref(StateEnum.IDLE)
2329
+
2330
+ const options = ref<DataOptions>({
2331
+ itemsPerPage: 5,
2332
+ page: 1,
2333
+ filters: [],
2334
+ })
2335
+
2336
+ const headers = [
2337
+ {
2338
+ title: 'Nom',
2339
+ key: 'name',
2340
+ filterable: true,
2341
+ filterType: 'text' as const,
2342
+ },
2343
+ {
2344
+ title: 'Département',
2345
+ key: 'department',
2346
+ filterable: true,
2347
+ filterType: 'autocomplete' as const,
2348
+ filterOptions: [
2349
+ { text: 'RH', value: 'RH' },
2350
+ { text: 'IT', value: 'IT' },
2351
+ { text: 'Finance', value: 'Finance' },
2352
+ { text: 'Marketing', value: 'Marketing' },
2353
+ ],
2354
+ },
2355
+ {
2356
+ title: 'Statut',
2357
+ key: 'status',
2358
+ filterable: true,
2359
+ filterType: 'autocomplete' as const,
2360
+ multiple: true,
2361
+ chips: true,
2362
+ filterOptions: [
2363
+ { text: 'Actif', value: 'Actif' },
2364
+ { text: 'En congé', value: 'En congé' },
2365
+ { text: 'Inactif', value: 'Inactif' },
2366
+ ],
2367
+ },
2368
+ ]
2369
+
2370
+ const getUsers = (): User[] => [
2371
+ { name: 'Jean Dupont', department: 'RH', status: 'Actif' },
2372
+ { name: 'Marie Martin', department: 'IT', status: 'En congé' },
2373
+ { name: 'Pierre Durand', department: 'Finance', status: 'Actif' },
2374
+ { name: 'Sophie Petit', department: 'Marketing', status: 'Actif' },
2375
+ { name: 'Thomas Leroy', department: 'IT', status: 'Inactif' },
2376
+ ]
2377
+
2378
+ const fetchData = async (): Promise<void> => {
2379
+ state.value = StateEnum.PENDING
2380
+ await new Promise(resolve => setTimeout(resolve, 500))
2381
+ let items = getUsers()
2382
+ if (options.value.filters?.length) {
2383
+ options.value.filters.forEach((filter: FilterOption) => {
2384
+ const { key, value, type } = filter
2385
+ items = items.filter((item) => {
2386
+ const itemValue = item[key as keyof User]
2387
+ if (type === 'autocomplete') {
2388
+ if (Array.isArray(value)) {
2389
+ return value.length === 0 || value.includes(itemValue)
2390
+ }
2391
+ return itemValue === value
2392
+ }
2393
+ return String(itemValue).toLowerCase().includes(String(value).toLowerCase())
2394
+ })
2395
+ })
2396
+ }
2397
+ totalFilteredUsers.value = items.length
2398
+ const { page = 1, itemsPerPage = 5 } = options.value
2399
+ filteredUsers.value = itemsPerPage > 0
2400
+ ? items.slice((page - 1) * itemsPerPage, page * itemsPerPage)
2401
+ : items
2402
+ state.value = StateEnum.RESOLVED
2403
+ }
2404
+
2405
+ fetchData()
2406
+ </script>
2407
+ `,
2408
+ },
2409
+ ],
2410
+ },
2411
+ args: {
2412
+ 'headers': [
2413
+ {
2414
+ title: 'Nom',
2415
+ key: 'name',
2416
+ filterable: true,
2417
+ filterType: 'text' as FilterType,
2418
+ },
2419
+ {
2420
+ title: 'Département',
2421
+ key: 'department',
2422
+ filterable: true,
2423
+ filterType: 'autocomplete' as FilterType,
2424
+ filterOptions: [
2425
+ { text: 'RH', value: 'RH' },
2426
+ { text: 'IT', value: 'IT' },
2427
+ { text: 'Finance', value: 'Finance' },
2428
+ { text: 'Marketing', value: 'Marketing' },
2429
+ ],
2430
+ },
2431
+ {
2432
+ title: 'Statut',
2433
+ key: 'status',
2434
+ filterable: true,
2435
+ filterType: 'autocomplete' as FilterType,
2436
+ multiple: true,
2437
+ chips: true,
2438
+ filterOptions: [
2439
+ { text: 'Actif', value: 'Actif' },
2440
+ { text: 'En congé', value: 'En congé' },
2441
+ { text: 'Inactif', value: 'Inactif' },
2442
+ ],
2443
+ },
2444
+ ],
2445
+ 'serverItemsLength': 0,
2446
+ 'suffix': 'server-filter-autocomplete',
2447
+ 'showFilters': true,
2448
+ 'onUpdate:options': fn(),
2449
+ },
2450
+ render: (args) => {
2451
+ return {
2452
+ components: { SyServerTable },
2453
+ setup() {
2454
+ const options = ref<DataOptions>({
2455
+ itemsPerPage: 5,
2456
+ page: 1,
2457
+ sortBy: [],
2458
+ filters: [],
2459
+ })
2460
+ const filteredUsers = ref<Record<string, unknown>[]>([])
2461
+ const totalFilteredUsers = ref(0)
2462
+ const state = ref(StateEnum.IDLE)
2463
+
2464
+ const getUsers = () => [
2465
+ { name: 'Jean Dupont', department: 'RH', status: 'Actif' },
2466
+ { name: 'Marie Martin', department: 'IT', status: 'En congé' },
2467
+ { name: 'Pierre Durand', department: 'Finance', status: 'Actif' },
2468
+ { name: 'Sophie Petit', department: 'Marketing', status: 'Actif' },
2469
+ { name: 'Thomas Leroy', department: 'IT', status: 'Inactif' },
2470
+ ]
2471
+
2472
+ const fetchData = async () => {
2473
+ state.value = StateEnum.PENDING
2474
+ await new Promise(resolve => setTimeout(resolve, 500))
2475
+ let items = getUsers()
2476
+ if (options.value.filters?.length) {
2477
+ options.value.filters.forEach((filter) => {
2478
+ const { key, value, type } = filter
2479
+ items = items.filter((item) => {
2480
+ const itemValue = item[key as keyof typeof item]
2481
+ if (type === 'autocomplete') {
2482
+ if (Array.isArray(value)) {
2483
+ return value.length === 0 || value.includes(itemValue)
2484
+ }
2485
+ return itemValue === value
2486
+ }
2487
+ return String(itemValue).toLowerCase().includes(String(value).toLowerCase())
2488
+ })
2489
+ })
2490
+ }
2491
+ totalFilteredUsers.value = items.length
2492
+ const { page = 1, itemsPerPage = 5 } = options.value
2493
+ filteredUsers.value = itemsPerPage > 0
2494
+ ? items.slice((page - 1) * itemsPerPage, page * itemsPerPage)
2495
+ : items
2496
+ state.value = StateEnum.RESOLVED
2497
+ }
2498
+
2499
+ fetchData()
2500
+
2501
+ return {
2502
+ args,
2503
+ filteredUsers,
2504
+ totalFilteredUsers,
2505
+ options,
2506
+ state,
2507
+ fetchData,
2508
+ StateEnum,
2509
+ }
2510
+ },
2511
+ template: `
2512
+ <div>
2513
+ <SyServerTable
2514
+ v-bind="args"
2515
+ v-model:options="options"
2516
+ :items="filteredUsers"
2517
+ :server-items-length="totalFilteredUsers"
2518
+ :loading="state === StateEnum.PENDING"
2519
+ @update:options="fetchData"
2520
+ />
2521
+ </div>
2522
+ `,
2523
+ }
2524
+ },
2525
+ }
2526
+
2235
2527
  export const ServerFilterByExacteDate: Story = {
2236
2528
  parameters: {
2237
2529
  a11y: {
@@ -4302,6 +4594,210 @@ export const ResizableColumns: Story = {
4302
4594
  },
4303
4595
  }
4304
4596
 
4597
+ export const ClickableRow: Story = {
4598
+ parameters: {
4599
+ a11y: {
4600
+ disable: true,
4601
+ },
4602
+ sourceCode: [
4603
+ {
4604
+ name: 'Template',
4605
+ code: `
4606
+ <template>
4607
+ <div>
4608
+ <SyServerTable
4609
+ v-model:options="options"
4610
+ :headers="headers"
4611
+ :items="users"
4612
+ :server-items-length="totalUsers"
4613
+ :loading="state === StateEnum.PENDING"
4614
+ clickable-row
4615
+ suffix="clickable-row-server-table"
4616
+ @update:options="fetchData"
4617
+ @row-click="selectedRow = $event"
4618
+ />
4619
+ <div v-if="selectedRow" class="mt-4 pa-4 bg-grey-lighten-4">
4620
+ <h3 class="text-h6 mb-3">Ligne cliquée</h3>
4621
+ <div class="pa-2 bg-grey-lighten-3">
4622
+ <div><strong>Nom:</strong> {{ selectedRow.lastname }}</div>
4623
+ <div><strong>Prénom:</strong> {{ selectedRow.firstname }}</div>
4624
+ <div><strong>Email:</strong> {{ selectedRow.email }}</div>
4625
+ </div>
4626
+ </div>
4627
+ </div>
4628
+ </template>
4629
+ `,
4630
+ },
4631
+ {
4632
+ name: 'Script',
4633
+ code: `
4634
+ <script setup lang="ts">
4635
+ import { ref } from 'vue'
4636
+ import { SyServerTable } from '@cnamts/synapse'
4637
+ import { StateEnum } from '@cnamts/synapse/src/components/Tables/common/constants/StateEnum'
4638
+ import type { DataOptions } from '@cnamts/synapse/src/components/Tables/common/types'
4639
+
4640
+ const options = ref({ itemsPerPage: 5, filters: [] })
4641
+ const selectedRow = ref(null)
4642
+ const state = ref(StateEnum.IDLE)
4643
+ const totalUsers = ref(0)
4644
+ const users = ref([])
4645
+
4646
+ const headers = [
4647
+ { title: 'Nom', key: 'lastname' },
4648
+ { title: 'Prénom', key: 'firstname' },
4649
+ { title: 'Email', key: 'email' },
4650
+ ]
4651
+
4652
+ const allUsers = [
4653
+ { firstname: 'Virginie', lastname: 'Beauchesne', email: 'virginie.beauchesne@example.com' },
4654
+ { firstname: 'Étienne', lastname: 'Salois', email: 'etienne.salois@example.com' },
4655
+ { firstname: 'Alice', lastname: 'Dupont', email: 'alice.dupont@example.com' },
4656
+ { firstname: 'Marc', lastname: 'Lefevre', email: 'marc.lefevre@example.com' },
4657
+ ]
4658
+
4659
+ const fetchData = async (): Promise<void> => {
4660
+ state.value = StateEnum.PENDING
4661
+ await new Promise(resolve => setTimeout(resolve, 500))
4662
+
4663
+ const { page = 1, itemsPerPage = 5 } = options.value as DataOptions
4664
+ totalUsers.value = allUsers.length
4665
+ users.value = itemsPerPage > 0
4666
+ ? allUsers.slice((page - 1) * itemsPerPage, page * itemsPerPage)
4667
+ : allUsers
4668
+
4669
+ state.value = StateEnum.RESOLVED
4670
+ }
4671
+
4672
+ fetchData()
4673
+ </script>
4674
+ `,
4675
+ },
4676
+ ],
4677
+ },
4678
+ args: {
4679
+ 'headers': [
4680
+ { title: 'Nom', key: 'lastname' },
4681
+ { title: 'Prénom', key: 'firstname' },
4682
+ { title: 'Email', key: 'email' },
4683
+ ],
4684
+ 'items': [
4685
+ { firstname: 'Virginie', lastname: 'Beauchesne', email: 'virginie.beauchesne@example.com' },
4686
+ { firstname: 'Étienne', lastname: 'Salois', email: 'etienne.salois@example.com' },
4687
+ { firstname: 'Alice', lastname: 'Dupont', email: 'alice.dupont@example.com' },
4688
+ { firstname: 'Marc', lastname: 'Lefevre', email: 'marc.lefevre@example.com' },
4689
+ ],
4690
+ 'serverItemsLength': 4,
4691
+ 'options': { itemsPerPage: 5, filters: [] },
4692
+ 'clickableRow': true,
4693
+ 'suffix': 'clickable-row-server-table',
4694
+ 'density': 'default',
4695
+ 'striped': false,
4696
+ 'onUpdate:options': fn(),
4697
+ 'onRow-click': fn(),
4698
+ },
4699
+ render: (args) => {
4700
+ return {
4701
+ components: {
4702
+ ClickableRowServerTableCanvas: defineComponent({
4703
+ components: { SyServerTable },
4704
+ emits: ['row-click'],
4705
+ setup() {
4706
+ const options = ref<DataOptions>({
4707
+ itemsPerPage: 5,
4708
+ page: 1,
4709
+ sortBy: [],
4710
+ filters: [],
4711
+ ...(args.options ?? {}),
4712
+ })
4713
+ const state = ref(StateEnum.IDLE)
4714
+ const totalUsers = ref(0)
4715
+ const users = ref<Record<string, unknown>[]>([])
4716
+ const allUsers = [
4717
+ { firstname: 'Virginie', lastname: 'Beauchesne', email: 'virginie.beauchesne@example.com' },
4718
+ { firstname: 'Étienne', lastname: 'Salois', email: 'etienne.salois@example.com' },
4719
+ { firstname: 'Alice', lastname: 'Dupont', email: 'alice.dupont@example.com' },
4720
+ { firstname: 'Marc', lastname: 'Lefevre', email: 'marc.lefevre@example.com' },
4721
+ ]
4722
+ const boundArgs = computed(() => {
4723
+ return Object.fromEntries(
4724
+ Object.entries(args).filter(([key]) => !['items', 'options', 'serverItemsLength', 'onRow-click'].includes(key)),
4725
+ )
4726
+ })
4727
+
4728
+ const fetchData = async (nextOptions?: DataOptions) => {
4729
+ if (nextOptions) {
4730
+ options.value = { ...options.value, ...nextOptions }
4731
+ }
4732
+
4733
+ state.value = StateEnum.PENDING
4734
+ await new Promise(resolve => setTimeout(resolve, 500))
4735
+
4736
+ const items = [...allUsers]
4737
+ const { page = 1, itemsPerPage = 5, sortBy = [] } = options.value
4738
+
4739
+ if (sortBy.length > 0) {
4740
+ const [firstSort] = sortBy
4741
+ if (firstSort?.key && firstSort.order) {
4742
+ items.sort((a, b) => {
4743
+ const left = String(a[firstSort.key] ?? '')
4744
+ const right = String(b[firstSort.key] ?? '')
4745
+ return firstSort.order === 'asc'
4746
+ ? left.localeCompare(right)
4747
+ : right.localeCompare(left)
4748
+ })
4749
+ }
4750
+ }
4751
+
4752
+ totalUsers.value = items.length
4753
+ users.value = itemsPerPage > 0
4754
+ ? items.slice((page - 1) * itemsPerPage, page * itemsPerPage)
4755
+ : items
4756
+
4757
+ state.value = StateEnum.RESOLVED
4758
+ }
4759
+
4760
+ fetchData()
4761
+
4762
+ return { boundArgs, fetchData, options, state, totalUsers, users, StateEnum }
4763
+ },
4764
+ template: `
4765
+ <SyServerTable
4766
+ v-model:options="options"
4767
+ v-bind="boundArgs"
4768
+ :items="users"
4769
+ :server-items-length="totalUsers"
4770
+ :loading="state === StateEnum.PENDING"
4771
+ @update:options="[fetchData, boundArgs['onUpdate:options']]"
4772
+ @row-click="$emit('row-click', $event)"
4773
+ />
4774
+ `,
4775
+ }),
4776
+ },
4777
+ setup() {
4778
+ const selectedRow = ref<Record<string, unknown> | null>(null)
4779
+ const handleRowClick = (item: Record<string, unknown>) => {
4780
+ selectedRow.value = item
4781
+ args['onRow-click']?.(item)
4782
+ }
4783
+ return { selectedRow, handleRowClick }
4784
+ },
4785
+ template: `
4786
+ <div>
4787
+ <ClickableRowServerTableCanvas @row-click="handleRowClick" />
4788
+ <div v-if="selectedRow" class="mt-4 pa-4 bg-grey-lighten-4">
4789
+ <h3 class="text-h6 mb-3">Ligne cliquée</h3>
4790
+ <div class="pa-2 bg-grey-lighten-3">
4791
+ <div><strong>Nom:</strong> {{ selectedRow.lastname }}</div>
4792
+ <div><strong>Prénom:</strong> {{ selectedRow.firstname }}</div>
4793
+ <div><strong>Email:</strong> {{ selectedRow.email }}</div>
4794
+ </div>
4795
+ </div>
4796
+ </div>
4797
+ `,
4798
+ }
4799
+ },
4800
+ }
4305
4801
  export const RowSelection: Story = {
4306
4802
  name: 'Row Selection',
4307
4803
  parameters: {
@@ -4898,6 +5394,182 @@ fetchData()
4898
5394
  },
4899
5395
  }
4900
5396
 
5397
+ export const PinnedColumns: Story = {
5398
+ parameters: {
5399
+ a11y: {
5400
+ disable: true,
5401
+ },
5402
+ sourceCode: [
5403
+ {
5404
+ name: 'Template',
5405
+ code: `
5406
+ <template>
5407
+ <div style="max-width: 900px; overflow: auto;">
5408
+ <SyServerTable
5409
+ v-model:options="options"
5410
+ :headers="headers"
5411
+ :items="items"
5412
+ :server-items-length="serverItemsLength"
5413
+ :loading="state === StateEnum.PENDING"
5414
+ show-select
5415
+ sticky-select
5416
+ :pinned-columns="pinnedColumns"
5417
+ suffix="server-pinned-columns"
5418
+ @update:options="fetchData"
5419
+ />
5420
+ </div>
5421
+ </template>
5422
+ `,
5423
+ },
5424
+ {
5425
+ name: 'Script',
5426
+ code: `
5427
+ <script setup lang="ts">
5428
+ import { ref, watch } from 'vue'
5429
+ import { SyServerTable } from '@cnamts/synapse'
5430
+ import { StateEnum } from '@cnamts/synapse/src/components/Tables/common/constants/StateEnum'
5431
+ import type { DataOptions } from '@cnamts/synapse/src/components/Tables/common/types'
5432
+ import dayjs from 'dayjs'
5433
+
5434
+ const headers = ref([
5435
+ { title: 'ID', key: 'id', width: 80 },
5436
+ { title: 'Nom', key: 'lastname', width: 160 },
5437
+ { title: 'Prénom', key: 'firstname', width: 160 },
5438
+ { title: 'Email', key: 'email', width: 240 },
5439
+ { title: 'Ville', key: 'city', width: 160 },
5440
+ { title: 'Pays', key: 'country', width: 160 },
5441
+ { title: 'Téléphone', key: 'phone', width: 180 },
5442
+ { title: 'Statut', key: 'status', width: 140 },
5443
+ { title: 'Dernière connexion', key: 'lastLogin', width: 200 },
5444
+ { title: 'Actions', key: 'actions', width: 140 },
5445
+ ])
5446
+ const pinnedColumns = ref([
5447
+ { key: 'actions', side: 'right' },
5448
+ ])
5449
+ const serverItemsLength = ref(30)
5450
+ const items = ref<any[]>([])
5451
+ const state = ref(StateEnum.IDLE)
5452
+ const options = ref<DataOptions>({ itemsPerPage: 5, page: 1, sortBy: [] })
5453
+
5454
+ const getAll = () => Array.from({ length: 30 }).map((_, i) => ({
5455
+ id: i + 1,
5456
+ lastname: 'Nom ' + (i + 1),
5457
+ firstname: 'Prénom ' + (i + 1),
5458
+ email: 'user' + (i + 1) + '@example.com',
5459
+ city: 'Paris',
5460
+ country: 'France',
5461
+ phone: '01 02 03 04 05',
5462
+ status: i % 2 === 0 ? 'Actif' : 'Inactif',
5463
+ lastLogin: dayjs().subtract(i, 'day').format('DD/MM/YYYY'),
5464
+ actions: '…',
5465
+ }))
5466
+
5467
+ const fetchData = async () => {
5468
+ state.value = StateEnum.PENDING
5469
+ await new Promise(r => setTimeout(r, 1000))
5470
+ const all = getAll()
5471
+ const start = (options.value.page - 1) * options.value.itemsPerPage
5472
+ items.value = all.slice(start, start + options.value.itemsPerPage)
5473
+ serverItemsLength.value = all.length
5474
+ state.value = StateEnum.RESOLVED
5475
+ }
5476
+
5477
+ watch(options, fetchData, { deep: true, immediate: true })
5478
+ </script>
5479
+ `,
5480
+ },
5481
+ ],
5482
+ },
5483
+ args: {
5484
+ 'options': {
5485
+ itemsPerPage: 5,
5486
+ page: 1,
5487
+ },
5488
+ 'headers': [
5489
+ { title: 'ID', key: 'id', width: 80 },
5490
+ { title: 'Nom', key: 'lastname', width: 160 },
5491
+ { title: 'Prénom', key: 'firstname', width: 160 },
5492
+ { title: 'Email', key: 'email', width: 240 },
5493
+ { title: 'Ville', key: 'city', width: 160 },
5494
+ { title: 'Pays', key: 'country', width: 160 },
5495
+ { title: 'Téléphone', key: 'phone', width: 180 },
5496
+ { title: 'Statut', key: 'status', width: 140 },
5497
+ { title: 'Dernière connexion', key: 'lastLogin', width: 200 },
5498
+ { title: 'Actions', key: 'actions', width: 140 },
5499
+ ],
5500
+ 'serverItemsLength': 30,
5501
+ 'suffix': 'server-pinned-columns',
5502
+ 'showSelect': true,
5503
+ 'stickySelect': true,
5504
+ 'pinnedColumns': [
5505
+ { key: 'actions', side: 'right' },
5506
+ ],
5507
+ 'onUpdate:options': fn(),
5508
+ },
5509
+ render: (args) => {
5510
+ return {
5511
+ components: { SyServerTable },
5512
+ setup() {
5513
+ const argsWithoutOptions = Object.fromEntries(
5514
+ Object.entries(args as Record<string, unknown>).filter(([k]) => k !== 'options'),
5515
+ )
5516
+ const users = ref<Record<string, unknown>[]>([])
5517
+ const totalUsers = ref(args.serverItemsLength)
5518
+ const state = ref(StateEnum.IDLE)
5519
+ const options = ref({ ...args.options } as DataOptions)
5520
+
5521
+ const getUsers = (): Record<string, unknown>[] => {
5522
+ return Array.from({ length: 30 }).map((_, i) => ({
5523
+ id: i + 1,
5524
+ lastname: 'Nom ' + (i + 1),
5525
+ firstname: 'Prénom ' + (i + 1),
5526
+ email: 'user' + (i + 1) + '@example.com',
5527
+ city: 'Paris',
5528
+ country: 'France',
5529
+ phone: '01 02 03 04 05',
5530
+ status: i % 2 === 0 ? 'Actif' : 'Inactif',
5531
+ lastLogin: dayjs().subtract(i, 'day').format('DD/MM/YYYY'),
5532
+ actions: '…',
5533
+ }))
5534
+ }
5535
+
5536
+ const fetchData = async (): Promise<void> => {
5537
+ state.value = StateEnum.PENDING
5538
+ await new Promise(resolve => setTimeout(resolve, 1000))
5539
+ const all = getUsers()
5540
+ const start = ((options.value.page ?? 1) - 1) * (options.value.itemsPerPage ?? 5)
5541
+ const end = start + (options.value.itemsPerPage ?? 5)
5542
+ users.value = all.slice(start, end)
5543
+ totalUsers.value = all.length
5544
+ state.value = StateEnum.RESOLVED
5545
+ }
5546
+
5547
+ watch(options, (newVal) => {
5548
+ if (args.options) {
5549
+ Object.assign(args.options, JSON.parse(JSON.stringify(newVal)))
5550
+ }
5551
+ fetchData()
5552
+ }, { deep: true, immediate: true })
5553
+
5554
+ return { args: argsWithoutOptions, users, totalUsers, state, options, fetchData, StateEnum }
5555
+ },
5556
+ template: `
5557
+ <div style="max-width: 900px; overflow: auto;">
5558
+ <SyServerTable
5559
+ v-model:options="options"
5560
+ :items="users"
5561
+ :server-items-length="totalUsers"
5562
+ :loading="state === StateEnum.PENDING"
5563
+ suffix="server-pinned-columns"
5564
+ v-bind="args"
5565
+ @update:options="fetchData"
5566
+ />
5567
+ </div>
5568
+ `,
5569
+ }
5570
+ },
5571
+ }
5572
+
4901
5573
  export const ColumnControls: StoryObj<typeof SyServerTable> = {
4902
5574
  parameters: {
4903
5575
  a11y: {