@cnamts/synapse 0.0.11-alpha → 0.0.13-alpha

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 (315) hide show
  1. package/dist/design-system-v3.js +5394 -3813
  2. package/dist/design-system-v3.umd.cjs +1 -1
  3. package/dist/src/components/Amelipro/types/types.d.ts +38 -0
  4. package/dist/src/components/CookieBanner/CookieBanner.d.ts +1 -1
  5. package/dist/src/components/Customs/SyInputSelect/SyInputSelect.d.ts +2 -0
  6. package/dist/src/components/Customs/SyTextField/SyTextField.d.ts +31 -23
  7. package/dist/src/components/Customs/SyTextField/types.d.ts +1 -0
  8. package/dist/src/components/DatePicker/DatePicker.d.ts +105 -102
  9. package/dist/src/components/DatePicker/DateTextInput.d.ts +82 -74
  10. package/dist/src/components/ErrorPage/ErrorPage.d.ts +1 -1
  11. package/dist/src/components/FileList/FileList.d.ts +1 -0
  12. package/dist/src/components/FileList/UploadItem/UploadItem.d.ts +1 -1
  13. package/dist/src/components/FilterInline/AccessibiliteItems.d.ts +30 -0
  14. package/dist/src/components/FilterInline/constants/ExpertiseLevelEnum.d.ts +4 -0
  15. package/dist/src/components/FilterSideBar/AccessibiliteItems.d.ts +29 -0
  16. package/dist/src/components/FilterSideBar/FilterSideBar.d.ts +31 -0
  17. package/dist/src/components/FilterSideBar/constants/ExpertiseLevelEnum.d.ts +4 -0
  18. package/dist/src/components/FilterSideBar/locales.d.ts +7 -0
  19. package/dist/src/components/LangBtn/LangBtn.d.ts +2 -2
  20. package/dist/src/components/NirField/NirField.d.ts +952 -0
  21. package/dist/src/components/NotificationBar/NotificationBar.d.ts +6 -6
  22. package/dist/src/components/PasswordField/PasswordField.d.ts +42 -8
  23. package/dist/src/components/PeriodField/PeriodField.d.ts +259 -235
  24. package/dist/src/components/PhoneField/PhoneField.d.ts +33 -3
  25. package/dist/src/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +1 -1
  26. package/dist/src/components/RatingPicker/NumberPicker/NumberPicker.d.ts +1 -1
  27. package/dist/src/components/RatingPicker/StarsPicker/StarsPicker.d.ts +1 -1
  28. package/dist/src/components/UploadWorkflow/AccessibiliteItems.d.ts +29 -0
  29. package/dist/src/components/UploadWorkflow/config.d.ts +29 -0
  30. package/dist/src/components/UploadWorkflow/constants/ExpertiseLevelEnum.d.ts +4 -0
  31. package/dist/src/components/UploadWorkflow/locales.d.ts +7 -0
  32. package/dist/src/components/UploadWorkflow/types.d.ts +19 -0
  33. package/dist/src/components/UploadWorkflow/useFileList.d.ts +10 -0
  34. package/dist/src/components/UploadWorkflow/useFileUploadJourney.d.ts +9 -0
  35. package/dist/src/components/Usages/Usages.d.ts +10 -0
  36. package/dist/src/components/index.d.ts +5 -0
  37. package/dist/src/composables/date/tests/useDateFormat.spec.d.ts +1 -0
  38. package/dist/src/composables/date/tests/useDateInitialization.spec.d.ts +1 -0
  39. package/dist/src/composables/date/tests/useDatePickerAccessibility.spec.d.ts +1 -0
  40. package/dist/src/composables/date/useDateFormat.d.ts +26 -0
  41. package/dist/src/composables/date/useDateInitialization.d.ts +18 -0
  42. package/dist/src/composables/date/useDatePickerAccessibility.d.ts +8 -0
  43. package/dist/src/composables/rules/useFieldValidation.d.ts +1 -0
  44. package/dist/src/composables/useFilterable/useFilterable.d.ts +1 -1
  45. package/dist/src/composables/validation/tests/useValidation.spec.d.ts +1 -0
  46. package/dist/src/composables/validation/useValidation.d.ts +40 -0
  47. package/dist/src/designTokens/index.d.ts +3 -1
  48. package/dist/src/main.d.ts +1 -0
  49. package/dist/src/utils/formatDate/index.d.ts +3 -0
  50. package/dist/src/utils/formatDate/tests/formatDate.spec.d.ts +1 -0
  51. package/dist/src/utils/functions/validation/isDateAfter/index.d.ts +2 -0
  52. package/dist/src/utils/functions/validation/isDateAfter/tests/isDateAfter.spec.d.ts +1 -0
  53. package/dist/src/utils/functions/validation/isDateBefore/index.d.ts +2 -0
  54. package/dist/src/utils/functions/validation/isDateBefore/tests/isDateBefore.spec.d.ts +1 -0
  55. package/dist/src/utils/functions/validation/isDateInRange/index.d.ts +3 -0
  56. package/dist/src/utils/functions/validation/isDateInRange/tests/isDateInRange.spec.d.ts +1 -0
  57. package/dist/src/utils/functions/validation/isDateValid/index.d.ts +9 -0
  58. package/dist/src/utils/functions/validation/isDateValid/tests/isDateValid.spec.d.ts +1 -0
  59. package/dist/src/utils/functions/validation/isEmailValid/tests/isEmailValid.spec.d.ts +1 -0
  60. package/dist/src/utils/functions/validation/isWeekend/index.d.ts +3 -0
  61. package/dist/src/utils/functions/validation/isWeekend/tests/isWeekend.spec.d.ts +1 -0
  62. package/dist/src/utils/parseDate/index.d.ts +3 -0
  63. package/dist/src/utils/parseDate/tests/parseDate.spec.d.ts +1 -0
  64. package/dist/src/utils/rules/doMatchPattern/index.d.ts +3 -0
  65. package/dist/src/utils/rules/doMatchPattern/tests/matchPattern.spec.d.ts +1 -0
  66. package/dist/src/utils/rules/index.d.ts +11 -0
  67. package/dist/src/utils/rules/isDateValid/index.d.ts +4 -0
  68. package/dist/src/utils/rules/isDateValid/tests/isDateValid.spec.d.ts +1 -0
  69. package/dist/src/utils/rules/isExactLength/index.d.ts +3 -0
  70. package/dist/src/utils/rules/isExactLength/locales.d.ts +2 -0
  71. package/dist/src/utils/rules/isExactLength/tests/exactLength.spec.d.ts +1 -0
  72. package/dist/src/utils/rules/isMaxLength/index.d.ts +3 -0
  73. package/dist/src/utils/rules/isMaxLength/locales.d.ts +2 -0
  74. package/dist/src/utils/rules/isMaxLength/tests/isMaxLength.spec.d.ts +1 -0
  75. package/dist/src/utils/rules/isMinLength/index.d.ts +3 -0
  76. package/dist/src/utils/rules/isMinLength/locales.d.ts +2 -0
  77. package/dist/src/utils/rules/isMinLength/tests/isMinLength.spec.d.ts +1 -0
  78. package/dist/src/utils/rules/isNotAfterDate/index.d.ts +3 -0
  79. package/dist/src/utils/rules/isNotAfterDate/tests/isNotAfterDate.spec.d.ts +1 -0
  80. package/dist/src/utils/rules/isNotAfterToday/index.d.ts +4 -0
  81. package/dist/src/utils/rules/isNotAfterToday/locales.d.ts +2 -0
  82. package/dist/src/utils/rules/isNotAfterToday/tests/isNotAfterToday.spec.d.ts +1 -0
  83. package/dist/src/utils/rules/isNotBeforeDate/index.d.ts +3 -0
  84. package/dist/src/utils/rules/isNotBeforeDate/locales.d.ts +2 -0
  85. package/dist/src/utils/rules/isNotBeforeDate/tests/IsNotBeforeDate.spec.d.ts +1 -0
  86. package/dist/src/utils/rules/isNotBeforeToday/index.d.ts +4 -0
  87. package/dist/src/utils/rules/isNotBeforeToday/locales.d.ts +2 -0
  88. package/dist/src/utils/rules/isNotBeforeToday/tests/notBeforeToday.spec.d.ts +1 -0
  89. package/dist/src/utils/rules/isRequired/index.d.ts +4 -0
  90. package/dist/src/utils/rules/isRequired/locales.d.ts +2 -0
  91. package/dist/src/utils/rules/isRequired/tests/isRequred.spec.d.ts +1 -0
  92. package/dist/src/utils/rules/isValidEmail/index.d.ts +4 -0
  93. package/dist/src/utils/rules/isValidEmail/locales.d.ts +2 -0
  94. package/dist/src/utils/rules/isValidEmail/tests/isValidEmail.spec.d.ts +1 -0
  95. package/dist/src/vuetifyConfig.d.ts +81 -0
  96. package/dist/style.css +1 -1
  97. package/package.json +3 -1
  98. package/src/assets/_elevations.scss +89 -0
  99. package/src/assets/_fonts.scss +6 -0
  100. package/src/assets/_radius.scss +92 -0
  101. package/src/assets/_spacers.scss +149 -0
  102. package/src/assets/settings.scss +15 -3
  103. package/src/assets/tokens.scss +32 -29
  104. package/src/components/Amelipro/types/types.ts +40 -0
  105. package/src/components/ChipList/ChipList.stories.ts +26 -27
  106. package/src/components/ChipList/ChipList.vue +5 -1
  107. package/src/components/ChipList/config.ts +1 -0
  108. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -2
  109. package/src/components/Customs/SyBtnSelect/SyBtnSelect.mdx +1 -1
  110. package/src/components/Customs/SyInputSelect/SyInputSelect.mdx +1 -1
  111. package/src/components/Customs/SyInputSelect/SyInputSelect.stories.ts +65 -0
  112. package/src/components/Customs/SyInputSelect/SyInputSelect.vue +13 -3
  113. package/src/components/Customs/SySelect/SySelect.mdx +1 -1
  114. package/src/components/Customs/SySelect/SySelect.stories.ts +88 -5
  115. package/src/components/Customs/SySelect/SySelect.vue +55 -14
  116. package/src/components/Customs/SySelect/tests/SySelect.spec.ts +135 -2
  117. package/src/components/Customs/SyTextField/SyTextField.mdx +2 -2
  118. package/src/components/Customs/SyTextField/SyTextField.stories.ts +809 -79
  119. package/src/components/Customs/SyTextField/SyTextField.vue +135 -104
  120. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +190 -38
  121. package/src/components/Customs/SyTextField/types.d.ts +1 -0
  122. package/src/components/DatePicker/DatePicker.stories.ts +177 -5
  123. package/src/components/DatePicker/DatePicker.vue +302 -233
  124. package/src/components/DatePicker/DateTextInput.vue +101 -246
  125. package/src/components/DatePicker/tests/DatePicker.spec.ts +123 -60
  126. package/src/components/DatePicker/tests/DateTextInput.spec.ts +202 -6
  127. package/src/components/FileList/Accessibilite.stories.ts +1 -1
  128. package/src/components/FileList/AccessibiliteItems.ts +22 -0
  129. package/src/components/FileList/FileList.vue +2 -1
  130. package/src/components/FileList/UploadItem/UploadItem.vue +10 -0
  131. package/src/components/FileUpload/FileUpload.stories.ts +93 -7
  132. package/src/components/FileUpload/FileUpload.vue +1 -0
  133. package/src/components/FileUpload/tests/FileUpload.spec.ts +4 -4
  134. package/src/components/FilterInline/Accessibilite.mdx +14 -0
  135. package/src/components/FilterInline/Accessibilite.stories.ts +216 -0
  136. package/src/components/FilterInline/AccessibiliteItems.ts +132 -0
  137. package/src/components/FilterInline/FilterInline.mdx +180 -34
  138. package/src/components/FilterInline/FilterInline.stories.ts +363 -6
  139. package/src/components/FilterInline/constants/ExpertiseLevelEnum.ts +4 -0
  140. package/src/components/FilterSideBar/Accessibilite.mdx +14 -0
  141. package/src/components/FilterSideBar/Accessibilite.stories.ts +216 -0
  142. package/src/components/FilterSideBar/AccessibiliteItems.ts +153 -0
  143. package/src/components/FilterSideBar/FilterSideBar.mdx +237 -0
  144. package/src/components/FilterSideBar/FilterSideBar.stories.ts +798 -0
  145. package/src/components/FilterSideBar/FilterSideBar.vue +193 -0
  146. package/src/components/FilterSideBar/constants/ExpertiseLevelEnum.ts +4 -0
  147. package/src/components/FilterSideBar/locales.ts +8 -0
  148. package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +305 -0
  149. package/src/components/FilterSideBar/tests/__snapshots__/FilterSideBar.spec.ts.snap +39 -0
  150. package/src/components/HeaderBar/Usages.mdx +1 -1
  151. package/src/components/NirField/NirField.stories.ts +738 -29
  152. package/src/components/NirField/NirField.vue +401 -359
  153. package/src/components/NirField/examples//342/200/257dataset/342/200/257.md +12 -0
  154. package/src/components/NirField/tests/NirField.spec.ts +88 -52
  155. package/src/components/NirField/tests/config.spec.ts +65 -0
  156. package/src/components/NotificationBar/Accessibilite.stories.ts +4 -0
  157. package/src/components/NotificationBar/NotificationBar.mdx +2 -2
  158. package/src/components/NotificationBar/NotificationBar.stories.ts +66 -13
  159. package/src/components/NotificationBar/NotificationBar.vue +42 -114
  160. package/src/components/NotificationBar/tests/NotificationBar.spec.ts +28 -33
  161. package/src/components/NotificationBar/tests/__snapshots__/NotificationBar.spec.ts.snap +1 -1
  162. package/src/components/PaginatedTable/PaginatedTable.vue +6 -10
  163. package/src/components/PaginatedTable/tests/__snapshots__/PaginatedTable.spec.ts.snap +4 -4
  164. package/src/components/PasswordField/PasswordField.mdx +129 -47
  165. package/src/components/PasswordField/PasswordField.stories.ts +1111 -120
  166. package/src/components/PasswordField/PasswordField.vue +212 -99
  167. package/src/components/PasswordField/tests/PasswordField.spec.ts +138 -9
  168. package/src/components/PeriodField/PeriodField.stories.ts +214 -118
  169. package/src/components/PeriodField/PeriodField.vue +238 -190
  170. package/src/components/PeriodField/tests/PeriodField.spec.ts +146 -0
  171. package/src/components/PhoneField/PhoneField.stories.ts +170 -0
  172. package/src/components/PhoneField/PhoneField.vue +76 -17
  173. package/src/components/PhoneField/indicatifs.ts +1 -1
  174. package/src/components/PhoneField/tests/PhoneField.spec.ts +40 -0
  175. package/src/components/RatingPicker/RatingPicker.stories.ts +7 -7
  176. package/src/components/SearchListField/SearchListField.stories.ts +1 -1
  177. package/src/components/UploadWorkflow/Accessibilite.mdx +14 -0
  178. package/src/components/UploadWorkflow/Accessibilite.stories.ts +216 -0
  179. package/src/components/UploadWorkflow/AccessibiliteItems.ts +192 -0
  180. package/src/components/UploadWorkflow/UploadWorkflow.mdx +75 -0
  181. package/src/components/UploadWorkflow/UploadWorkflow.stories.ts +943 -0
  182. package/src/components/UploadWorkflow/UploadWorkflow.vue +230 -0
  183. package/src/components/UploadWorkflow/config.ts +29 -0
  184. package/src/components/UploadWorkflow/constants/ExpertiseLevelEnum.ts +4 -0
  185. package/src/components/UploadWorkflow/locales.ts +8 -0
  186. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +257 -0
  187. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +54 -0
  188. package/src/components/UploadWorkflow/types.ts +21 -0
  189. package/src/components/UploadWorkflow/useFileList.ts +84 -0
  190. package/src/components/UploadWorkflow/useFileUploadJourney.ts +18 -0
  191. package/src/components/Usages/tests/Usages.spec.ts +183 -0
  192. package/src/components/index.ts +5 -0
  193. package/src/composables/date/tests/useDateFormat.spec.ts +67 -0
  194. package/src/composables/date/tests/useDateInitialization.spec.ts +89 -0
  195. package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +102 -0
  196. package/src/composables/date/useDateFormat.ts +94 -0
  197. package/src/composables/date/useDateInitialization.ts +92 -0
  198. package/src/composables/date/useDatePickerAccessibility.ts +78 -0
  199. package/src/composables/rules/tests/useFieldValidation.spec.ts +385 -4
  200. package/src/composables/rules/useFieldValidation.ts +5 -2
  201. package/src/composables/useFilterable/useFilterable.ts +5 -4
  202. package/src/composables/validation/tests/useValidation.spec.ts +154 -0
  203. package/src/composables/validation/useValidation.ts +180 -0
  204. package/src/designTokens/index.ts +4 -0
  205. package/src/main.ts +1 -0
  206. package/src/stories/Accessibilite/Aculturation/AuditDesignSystem.mdx +28 -0
  207. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +2 -2
  208. package/src/stories/Accessibilite/Audit/RGAA.mdx +6 -6
  209. package/src/stories/Accessibilite/Introduction.mdx +2 -1
  210. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +1 -1
  211. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +1 -1
  212. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +8 -11
  213. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +77 -0
  214. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru.mdx +9 -3
  215. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +2 -2
  216. package/src/stories/Demarrer/Accueil.mdx +1 -1
  217. package/src/stories/Demarrer/Introduction.stories.ts +3 -3
  218. package/src/stories/Demarrer/Releases.mdx +8 -0
  219. package/src/stories/Demarrer/Releases.stories.ts +66 -0
  220. package/src/stories/DesignTokens/Conteneurs.stories.ts +3 -3
  221. package/src/stories/DesignTokens/ThemePA.mdx +4 -30
  222. package/src/stories/GuideDuDev/LesBreackingChanges.mdx +36 -0
  223. package/src/stories/GuideDuDev/UtiliserLesRules.mdx +321 -78
  224. package/src/stories/GuideDuDev/moduleDeNotification.mdx +1 -1
  225. package/src/utils/formatDate/index.ts +6 -0
  226. package/src/utils/formatDate/tests/formatDate.spec.ts +18 -0
  227. package/src/utils/functions/validation/isDateAfter/index.ts +9 -0
  228. package/src/utils/functions/validation/isDateAfter/tests/isDateAfter.spec.ts +18 -0
  229. package/src/utils/functions/validation/isDateBefore/index.ts +9 -0
  230. package/src/utils/functions/validation/isDateBefore/tests/isDateBefore.spec.ts +23 -0
  231. package/src/utils/functions/validation/isDateInRange/index.ts +22 -0
  232. package/src/utils/functions/validation/isDateInRange/tests/isDateInRange.spec.ts +28 -0
  233. package/src/utils/functions/validation/isDateValid/index.ts +67 -0
  234. package/src/utils/functions/validation/isDateValid/tests/isDateValid.spec.ts +46 -0
  235. package/src/utils/functions/validation/isEmailValid/index.ts +9 -0
  236. package/src/utils/functions/validation/isWeekend/index.ts +10 -0
  237. package/src/utils/functions/validation/isWeekend/tests/isWeekend.spec.ts +16 -0
  238. package/src/utils/parseDate/index.ts +29 -0
  239. package/src/utils/parseDate/tests/parseDate.spec.ts +52 -0
  240. package/src/utils/rules/Rules.mdx +16 -0
  241. package/src/utils/rules/doMatchPattern/DoMachPattern.mdx +66 -0
  242. package/src/utils/rules/doMatchPattern/DoMatchPattern.stories.ts +106 -0
  243. package/src/utils/rules/doMatchPattern/index.ts +28 -0
  244. package/src/utils/rules/doMatchPattern/locales.ts +5 -0
  245. package/src/utils/rules/doMatchPattern/tests/matchPattern.spec.ts +38 -0
  246. package/src/utils/rules/index.ts +11 -0
  247. package/src/utils/rules/isDateValid/IsDateValid.mdx +87 -0
  248. package/src/utils/rules/isDateValid/IsDateValid.stories.ts +113 -0
  249. package/src/utils/rules/isDateValid/index.ts +32 -0
  250. package/src/utils/rules/isDateValid/locales.ts +10 -0
  251. package/src/utils/rules/isDateValid/tests/isDateValid.spec.ts +27 -0
  252. package/src/utils/rules/isExactLength/IsExactLenght.mdx +68 -0
  253. package/src/utils/rules/isExactLength/IsExactLength.stories.ts +151 -0
  254. package/src/utils/rules/{exactLength → isExactLength}/index.ts +2 -4
  255. package/src/utils/rules/isExactLength/tests/exactLength.spec.ts +48 -0
  256. package/src/utils/rules/isMaxLength/IsMaxLength.mdx +68 -0
  257. package/src/utils/rules/isMaxLength/IsMaxLength.stories.ts +152 -0
  258. package/src/utils/rules/isMaxLength/index.ts +30 -0
  259. package/src/utils/rules/isMaxLength/locales.ts +6 -0
  260. package/src/utils/rules/isMaxLength/tests/isMaxLength.spec.ts +42 -0
  261. package/src/utils/rules/isMinLength/IsMinLength.mdx +68 -0
  262. package/src/utils/rules/isMinLength/IsMinLength.stories.ts +152 -0
  263. package/src/utils/rules/isMinLength/index.ts +30 -0
  264. package/src/utils/rules/isMinLength/locales.ts +6 -0
  265. package/src/utils/rules/isMinLength/tests/isMinLength.spec.ts +42 -0
  266. package/src/utils/rules/isNotAfterDate/IsNotAfterDate.mdx +68 -0
  267. package/src/utils/rules/isNotAfterDate/IsNotAfterDate.stories.ts +109 -0
  268. package/src/utils/rules/isNotAfterDate/index.ts +25 -0
  269. package/src/utils/rules/isNotAfterDate/locales.ts +6 -0
  270. package/src/utils/rules/isNotAfterDate/tests/isNotAfterDate.spec.ts +25 -0
  271. package/src/utils/rules/isNotAfterToday/IsNotAfterToday.mdx +83 -0
  272. package/src/utils/rules/isNotAfterToday/IsNotAfterToday.stories.ts +110 -0
  273. package/src/utils/rules/isNotAfterToday/index.ts +28 -0
  274. package/src/utils/rules/isNotAfterToday/locales.ts +5 -0
  275. package/src/utils/rules/isNotAfterToday/tests/isNotAfterToday.spec.ts +30 -0
  276. package/src/utils/rules/isNotBeforeDate/IsNotBeforeDate.mdx +68 -0
  277. package/src/utils/rules/isNotBeforeDate/IsNotBeforeDate.stories.ts +114 -0
  278. package/src/utils/rules/isNotBeforeDate/index.ts +25 -0
  279. package/src/utils/rules/isNotBeforeDate/locales.ts +6 -0
  280. package/src/utils/rules/isNotBeforeDate/tests/IsNotBeforeDate.spec.ts +25 -0
  281. package/src/utils/rules/isNotBeforeToday/IsNotBeforeToday.mdx +83 -0
  282. package/src/utils/rules/isNotBeforeToday/IsNotBeforeToday.stories.ts +110 -0
  283. package/src/utils/rules/isNotBeforeToday/index.ts +28 -0
  284. package/src/utils/rules/isNotBeforeToday/locales.ts +5 -0
  285. package/src/utils/rules/isNotBeforeToday/tests/notBeforeToday.spec.ts +36 -0
  286. package/src/utils/rules/isRequired/IsRequired.mdx +81 -0
  287. package/src/utils/rules/isRequired/IsRequired.stories.ts +101 -0
  288. package/src/utils/rules/{required → isRequired}/index.ts +3 -3
  289. package/src/utils/rules/{required/tests/index.spec.ts → isRequired/tests/isRequred.spec.ts} +9 -9
  290. package/src/utils/rules/isValidEmail/IsValidEmail.mdx +81 -0
  291. package/src/utils/rules/isValidEmail/IsValidEmail.stories.ts +101 -0
  292. package/src/utils/rules/{email → isValidEmail}/index.ts +3 -5
  293. package/src/utils/rules/{email/tests/email.spec.ts → isValidEmail/tests/isValidEmail.spec.ts} +5 -5
  294. package/src/vuetifyConfig.ts +61 -0
  295. package/dist/src/utils/rules/email/index.d.ts +0 -4
  296. package/dist/src/utils/rules/exactLength/index.d.ts +0 -4
  297. package/dist/src/utils/rules/required/index.d.ts +0 -4
  298. package/dist/src/utils/rules/required/ruleMessageHelper.d.ts +0 -3
  299. package/src/components/Customs/SyTextField/tests/__snapshots__/SyTextField.spec.ts.snap +0 -58
  300. package/src/composables/useFilterable/__snapshots__/useFilterable.spec.ts.snap +0 -3
  301. package/src/utils/functions/isEmailValid/index.ts +0 -8
  302. package/src/utils/rules/required/ruleMessageHelper.ts +0 -14
  303. package/src/utils/rules/required/tests/rulesMessageHelper.spec.ts +0 -22
  304. /package/dist/src/{utils/functions/isEmailValid/tests/isEmailValid.spec.d.ts → components/FilterSideBar/tests/FilterSideBar.spec.d.ts} +0 -0
  305. /package/dist/src/{utils/rules/email/tests/email.spec.d.ts → components/NirField/tests/config.spec.d.ts} +0 -0
  306. /package/dist/src/{utils/rules/required/tests/index.spec.d.ts → components/UploadWorkflow/tests/UploadWorkflow.spec.d.ts} +0 -0
  307. /package/dist/src/{utils/rules/required/tests/rulesMessageHelper.spec.d.ts → components/Usages/tests/Usages.spec.d.ts} +0 -0
  308. /package/dist/src/utils/functions/{isEmailValid → validation/isEmailValid}/index.d.ts +0 -0
  309. /package/dist/src/utils/rules/{exactLength → doMatchPattern}/locales.d.ts +0 -0
  310. /package/dist/src/utils/rules/{email → isDateValid}/locales.d.ts +0 -0
  311. /package/dist/src/utils/rules/{required → isNotAfterDate}/locales.d.ts +0 -0
  312. /package/src/utils/functions/{isEmailValid → validation/isEmailValid}/tests/isEmailValid.spec.ts +0 -0
  313. /package/src/utils/rules/{exactLength → isExactLength}/locales.ts +0 -0
  314. /package/src/utils/rules/{required → isRequired}/locales.ts +0 -0
  315. /package/src/utils/rules/{email → isValidEmail}/locales.ts +0 -0
@@ -0,0 +1,18 @@
1
+ import { computed, ref, type Ref } from 'vue'
2
+ import type { UploadItem } from './types'
3
+
4
+ export default function useFileUploadJourney(
5
+ fileListItems: Ref<UploadItem[]>,
6
+ ) {
7
+ const selectItems = computed(() => fileListItems.value.map(item => ({
8
+ value: item.id,
9
+ text: item.title,
10
+ })))
11
+
12
+ const selectedItem = ref<string>()
13
+
14
+ return ({
15
+ selectItems,
16
+ selectedItem,
17
+ })
18
+ }
@@ -0,0 +1,183 @@
1
+ import { mount } from '@vue/test-utils'
2
+ import { describe, it, expect } from 'vitest'
3
+ import { vuetify } from '@tests/unit/setup'
4
+ import Usages from '../Usages.vue'
5
+
6
+ describe('Usages.vue', () => {
7
+ it('renders the component with default props', () => {
8
+ const wrapper = mount(Usages, {
9
+ global: {
10
+ plugins: [vuetify],
11
+ },
12
+ })
13
+
14
+ // Vérifier que le composant est rendu
15
+ expect(wrapper.exists()).toBe(true)
16
+
17
+ // Vérifier que les colonnes sont rendues
18
+ expect(wrapper.findAll('.v-col-auto').length).toBe(2)
19
+
20
+ // Vérifier que les icônes sont rendues
21
+ expect(wrapper.findAll('.v-icon').length).toBe(2)
22
+
23
+ // Vérifier les titres des colonnes
24
+ expect(wrapper.text()).toContain('À faire')
25
+ expect(wrapper.text()).toContain('À ne pas faire')
26
+
27
+ // Vérifier qu'il n'y a pas d'éléments de liste par défaut
28
+ expect(wrapper.findAll('li').length).toBe(0)
29
+ })
30
+
31
+ it('renders items in both columns when provided', () => {
32
+ const items1 = ['Item 1', 'Item 2', 'Item 3']
33
+ const items2 = ['Item A', 'Item B']
34
+
35
+ const wrapper = mount(Usages, {
36
+ global: {
37
+ plugins: [vuetify],
38
+ },
39
+ props: {
40
+ items1,
41
+ items2,
42
+ },
43
+ })
44
+
45
+ // Vérifier que tous les éléments de la première liste sont rendus
46
+ const firstColumnItems = wrapper.findAll('.check li')
47
+ expect(firstColumnItems.length).toBe(items1.length)
48
+ items1.forEach((item, index) => {
49
+ expect(firstColumnItems[index].text()).toContain(item)
50
+ })
51
+
52
+ // Vérifier que tous les éléments de la deuxième liste sont rendus
53
+ const secondColumnItems = wrapper.findAll('.not-check li')
54
+ expect(secondColumnItems.length).toBe(items2.length)
55
+ items2.forEach((item, index) => {
56
+ expect(secondColumnItems[index].text()).toContain(item)
57
+ })
58
+ })
59
+
60
+ it('renders only the first column items when only items1 is provided', () => {
61
+ const items1 = ['Item 1', 'Item 2']
62
+
63
+ const wrapper = mount(Usages, {
64
+ global: {
65
+ plugins: [vuetify],
66
+ },
67
+ props: {
68
+ items1,
69
+ },
70
+ })
71
+
72
+ // Vérifier que les éléments de la première liste sont rendus
73
+ const firstColumnItems = wrapper.findAll('.check li')
74
+ expect(firstColumnItems.length).toBe(items1.length)
75
+
76
+ // Vérifier qu'il n'y a pas d'éléments dans la deuxième liste
77
+ const secondColumnItems = wrapper.findAll('.not-check li')
78
+ expect(secondColumnItems.length).toBe(0)
79
+ })
80
+
81
+ it('renders only the second column items when only items2 is provided', () => {
82
+ const items2 = ['Item A', 'Item B', 'Item C']
83
+
84
+ const wrapper = mount(Usages, {
85
+ global: {
86
+ plugins: [vuetify],
87
+ },
88
+ props: {
89
+ items2,
90
+ },
91
+ })
92
+
93
+ // Vérifier qu'il n'y a pas d'éléments dans la première liste
94
+ const firstColumnItems = wrapper.findAll('.check li')
95
+ expect(firstColumnItems.length).toBe(0)
96
+
97
+ // Vérifier que les éléments de la deuxième liste sont rendus
98
+ const secondColumnItems = wrapper.findAll('.not-check li')
99
+ expect(secondColumnItems.length).toBe(items2.length)
100
+ })
101
+
102
+ it('uses the correct icons', () => {
103
+ const wrapper = mount(Usages, {
104
+ global: {
105
+ plugins: [vuetify],
106
+ },
107
+ })
108
+
109
+ const icons = wrapper.findAll('.v-icon')
110
+
111
+ // Vérifier que les icônes sont correctement définies
112
+ // Note: Nous ne pouvons pas vérifier directement les propriétés des icônes,
113
+ // mais nous pouvons vérifier que les icônes sont présentes dans le bon ordre
114
+ expect(icons.length).toBe(2)
115
+
116
+ // Vérifier que les classes CSS sont correctement appliquées
117
+ expect(wrapper.find('.check')).toBeTruthy()
118
+ expect(wrapper.find('.not-check')).toBeTruthy()
119
+ })
120
+
121
+ it('applies the correct styling to columns', () => {
122
+ const wrapper = mount(Usages, {
123
+ global: {
124
+ plugins: [vuetify],
125
+ },
126
+ })
127
+
128
+ // Vérifier les classes CSS pour la première colonne
129
+ const checkColumn = wrapper.find('.check')
130
+ expect(checkColumn.exists()).toBe(true)
131
+
132
+ // Vérifier les classes CSS pour la deuxième colonne
133
+ const notCheckColumn = wrapper.find('.not-check')
134
+ expect(notCheckColumn.exists()).toBe(true)
135
+
136
+ // Vérifier que les styles sont appliqués (indirectement via les classes)
137
+ expect(checkColumn.classes()).toContain('check')
138
+ expect(notCheckColumn.classes()).toContain('not-check')
139
+ })
140
+
141
+ it('handles empty arrays for both item lists', () => {
142
+ const wrapper = mount(Usages, {
143
+ global: {
144
+ plugins: [vuetify],
145
+ },
146
+ props: {
147
+ items1: [],
148
+ items2: [],
149
+ },
150
+ })
151
+
152
+ // Vérifier qu'il n'y a pas d'éléments de liste
153
+ expect(wrapper.findAll('li').length).toBe(0)
154
+
155
+ // Mais les colonnes et titres doivent toujours être présents
156
+ expect(wrapper.findAll('.v-col-auto').length).toBe(2)
157
+ expect(wrapper.text()).toContain('À faire')
158
+ expect(wrapper.text()).toContain('À ne pas faire')
159
+ })
160
+
161
+ it('renders with custom props from CustomizableOptions', () => {
162
+ const wrapper = mount(Usages, {
163
+ global: {
164
+ plugins: [vuetify],
165
+ },
166
+ props: {
167
+ color: 'primary',
168
+ disabled: true,
169
+ readonly: true,
170
+ dense: true,
171
+ items1: ['Item 1'],
172
+ items2: ['Item A'],
173
+ },
174
+ })
175
+
176
+ // Vérifier que le composant est rendu malgré les props supplémentaires
177
+ expect(wrapper.exists()).toBe(true)
178
+
179
+ // Vérifier que les éléments de liste sont toujours rendus correctement
180
+ expect(wrapper.findAll('.check li').length).toBe(1)
181
+ expect(wrapper.findAll('.not-check li').length).toBe(1)
182
+ })
183
+ })
@@ -5,6 +5,7 @@ export { useNotificationService } from '../services/NotificationService'
5
5
  export { default as BackBtn } from './BackBtn/BackBtn.vue'
6
6
  export { default as BackToTopBtn } from './BackToTopBtn/BackToTopBtn.vue'
7
7
  export { default as ChipList } from './ChipList/ChipList.vue'
8
+ export * from './ChipList/types'
8
9
  export { default as CollapsibleList } from './CollapsibleList/CollapsibleList.vue'
9
10
  export { default as ContextualMenu } from './ContextualMenu/ContextualMenu.vue'
10
11
  export { default as CookieBanner } from './CookieBanner/CookieBanner.vue'
@@ -27,6 +28,7 @@ export { default as FileList } from './FileList/FileList.vue'
27
28
  export { default as FilePreview } from './FilePreview/FilePreview.vue'
28
29
  export { default as FileUpload } from './FileUpload/FileUpload.vue'
29
30
  export { default as FilterInline } from './FilterInline/FilterInline.vue'
31
+ export { default as FilterSideBar } from './FilterSideBar/FilterSideBar.vue'
30
32
  export { default as FooterBar } from './FooterBar/FooterBar.vue'
31
33
  export { default as FranceConnectBtn } from './FranceConnectBtn/FranceConnectBtn.vue'
32
34
  export { default as HeaderBar } from './HeaderBar/HeaderBar.vue'
@@ -55,9 +57,12 @@ export { default as PeriodField } from './PeriodField/PeriodField.vue'
55
57
  export { default as PhoneField } from './PhoneField/PhoneField.vue'
56
58
  export { default as RangeField } from './RangeField/RangeField.vue'
57
59
  export { default as RatingPicker } from './RatingPicker/RatingPicker.vue'
60
+ export { default as SearchListField } from './SearchListField/SearchListField.vue'
58
61
  export { default as SelectBtnField } from './SelectBtnField/SelectBtnField.vue'
59
62
  export { default as SkipLink } from './SkipLink/SkipLink.vue'
60
63
  export { default as SocialMediaLinks } from './SocialMediaLinks/SocialMediaLinks.vue'
61
64
  export { default as SubHeader } from './SubHeader/SubHeader.vue'
62
65
  export { default as SyAlert } from './SyAlert/SyAlert.vue'
66
+ export { default as TableToolbar } from './TableToolbar/TableToolbar.vue'
67
+ export { default as UploadWorkflow } from './UploadWorkflow/UploadWorkflow.vue'
63
68
  export { default as UserMenuBtn } from './UserMenuBtn/UserMenuBtn.vue'
@@ -0,0 +1,67 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { formatDate, parseDate } from '../useDateFormat'
3
+
4
+ describe('useDateFormat', () => {
5
+ describe('formatDate', () => {
6
+ it('formats a Date object to string according to the specified format', () => {
7
+ const date = new Date(2023, 0, 15) // 15 janvier 2023
8
+ expect(formatDate(date, 'DD/MM/YYYY')).toBe('15/01/2023')
9
+ expect(formatDate(date, 'YYYY-MM-DD')).toBe('2023-01-15')
10
+ expect(formatDate(date, 'MM.DD.YYYY')).toBe('01.15.2023')
11
+ })
12
+
13
+ it('returns empty string when date is null or undefined', () => {
14
+ expect(formatDate(null as unknown as Date, 'DD/MM/YYYY')).toBe('')
15
+ expect(formatDate(undefined as unknown as Date, 'DD/MM/YYYY')).toBe('')
16
+ })
17
+
18
+ it('handles different date formats correctly', () => {
19
+ const date = new Date(2023, 11, 31) // 31 décembre 2023
20
+ expect(formatDate(date, 'DD/MM/YYYY')).toBe('31/12/2023')
21
+ expect(formatDate(date, 'D/M/YYYY')).toBe('31/12/2023')
22
+ expect(formatDate(date, 'YYYY-MM-DD')).toBe('2023-12-31')
23
+ expect(formatDate(date, 'MM/DD/YYYY')).toBe('12/31/2023')
24
+ })
25
+
26
+ it('handles custom separators correctly', () => {
27
+ const date = new Date(2023, 0, 15) // 15 janvier 2023
28
+ expect(formatDate(date, 'DD.MM.YYYY')).toBe('15.01.2023')
29
+ expect(formatDate(date, 'DD-MM-YYYY')).toBe('15-01-2023')
30
+ expect(formatDate(date, 'YYYY/MM/DD')).toBe('2023/01/15')
31
+ })
32
+ })
33
+
34
+ describe('parseDate', () => {
35
+ it('parses a date string to a Date object according to the specified format', () => {
36
+ const dateStr = '15/01/2023'
37
+ const date = parseDate(dateStr, 'DD/MM/YYYY')
38
+ expect(date).toBeInstanceOf(Date)
39
+ expect(date?.getFullYear()).toBe(2023)
40
+ expect(date?.getMonth()).toBe(0) // Janvier = 0
41
+ expect(date?.getDate()).toBe(15)
42
+ })
43
+
44
+ it('returns null for invalid date strings', () => {
45
+ expect(parseDate('invalid', 'DD/MM/YYYY')).toBeNull()
46
+ expect(parseDate('31/02/2023', 'DD/MM/YYYY')).toBeNull() // 31 février n'existe pas
47
+ })
48
+
49
+ it('handles different date formats correctly', () => {
50
+ expect(parseDate('2023-01-15', 'YYYY-MM-DD')?.getDate()).toBe(15)
51
+ expect(parseDate('01/15/2023', 'MM/DD/YYYY')?.getDate()).toBe(15)
52
+ expect(parseDate('15.01.2023', 'DD.MM.YYYY')?.getDate()).toBe(15)
53
+ })
54
+
55
+ it('returns null when input is null or empty', () => {
56
+ expect(parseDate(null as unknown as string, 'DD/MM/YYYY')).toBeNull()
57
+ expect(parseDate('', 'DD/MM/YYYY')).toBeNull()
58
+ })
59
+
60
+ it('handles leap years correctly', () => {
61
+ // 2020 était une année bissextile
62
+ expect(parseDate('29/02/2020', 'DD/MM/YYYY')).not.toBeNull()
63
+ // 2023 n'est pas une année bissextile
64
+ expect(parseDate('29/02/2023', 'DD/MM/YYYY')).toBeNull()
65
+ })
66
+ })
67
+ })
@@ -0,0 +1,89 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { initializeSelectedDates, type DateInput } from '../useDateInitialization'
3
+
4
+ describe('useDateInitialization', () => {
5
+ describe('initializeSelectedDates', () => {
6
+ it('returns null when modelValue is null or undefined', () => {
7
+ expect(initializeSelectedDates(null, 'DD/MM/YYYY')).toBeNull()
8
+ expect(initializeSelectedDates(null as unknown as DateInput, 'DD/MM/YYYY')).toBeNull()
9
+ })
10
+
11
+ it('parses a single date string correctly', () => {
12
+ const result = initializeSelectedDates('15/01/2023', 'DD/MM/YYYY')
13
+ expect(result).toBeInstanceOf(Date)
14
+
15
+ const date = result as Date
16
+ expect(date.getFullYear()).toBe(2023)
17
+ expect(date.getMonth()).toBe(0) // Janvier = 0
18
+ expect(date.getDate()).toBe(15)
19
+ })
20
+
21
+ it('parses an array of date strings correctly', () => {
22
+ const result = initializeSelectedDates(['15/01/2023', '20/01/2023'], 'DD/MM/YYYY')
23
+ expect(Array.isArray(result)).toBe(true)
24
+
25
+ const dates = result as Date[]
26
+ expect(dates.length).toBe(2)
27
+
28
+ expect(dates[0].getFullYear()).toBe(2023)
29
+ expect(dates[0].getMonth()).toBe(0)
30
+ expect(dates[0].getDate()).toBe(15)
31
+
32
+ expect(dates[1].getFullYear()).toBe(2023)
33
+ expect(dates[1].getMonth()).toBe(0)
34
+ expect(dates[1].getDate()).toBe(20)
35
+ })
36
+
37
+ it('returns empty array when dates are invalid', () => {
38
+ const result = initializeSelectedDates(['invalid', '20/01/2023'], 'DD/MM/YYYY')
39
+ expect(Array.isArray(result)).toBe(true)
40
+ expect(result).toHaveLength(0)
41
+ })
42
+
43
+ it('returns empty array when first date is after second date', () => {
44
+ const result = initializeSelectedDates(['25/01/2023', '20/01/2023'], 'DD/MM/YYYY')
45
+ expect(Array.isArray(result)).toBe(true)
46
+ expect(result).toHaveLength(0)
47
+ })
48
+
49
+ it('handles single element array correctly', () => {
50
+ const result = initializeSelectedDates(['15/01/2023'], 'DD/MM/YYYY')
51
+ expect(Array.isArray(result)).toBe(true)
52
+
53
+ const dates = result as Date[]
54
+ expect(dates.length).toBe(1)
55
+
56
+ expect(dates[0].getFullYear()).toBe(2023)
57
+ expect(dates[0].getMonth()).toBe(0)
58
+ expect(dates[0].getDate()).toBe(15)
59
+ })
60
+
61
+ it('returns empty array for empty array input', () => {
62
+ const result = initializeSelectedDates([], 'DD/MM/YYYY')
63
+ expect(Array.isArray(result)).toBe(true)
64
+ expect(result).toHaveLength(0)
65
+ })
66
+
67
+ it('handles different display and return formats correctly', () => {
68
+ // Date au format de retour
69
+ const result1 = initializeSelectedDates('2023-01-15', 'DD/MM/YYYY', 'YYYY-MM-DD')
70
+ expect(result1).toBeInstanceOf(Date)
71
+ expect((result1 as Date).getDate()).toBe(15)
72
+
73
+ // Date au format d'affichage quand le format de retour est différen
74
+ const result2 = initializeSelectedDates('15/01/2023', 'DD/MM/YYYY', 'YYYY-MM-DD')
75
+ expect(result2).toBeInstanceOf(Date)
76
+ expect((result2 as Date).getDate()).toBe(15)
77
+ })
78
+
79
+ it('returns null for object input', () => {
80
+ const result = initializeSelectedDates({}, 'DD/MM/YYYY')
81
+ expect(result).toBeNull()
82
+ })
83
+
84
+ it('handles invalid date strings correctly', () => {
85
+ const result = initializeSelectedDates('invalid', 'DD/MM/YYYY')
86
+ expect(result).toBeNull()
87
+ })
88
+ })
89
+ })
@@ -0,0 +1,102 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest'
2
+ import { useDatePickerAccessibility } from '../useDatePickerAccessibility'
3
+
4
+ describe('useDatePickerAccessibility', () => {
5
+ let { updateAccessibility } = useDatePickerAccessibility()
6
+
7
+ beforeEach(() => {
8
+ // Réinitialiser la fonction pour chaque tes
9
+ const { updateAccessibility: newUpdateAccessibility } = useDatePickerAccessibility()
10
+ updateAccessibility = newUpdateAccessibility
11
+
12
+ // Créer une structure DOM simulée pour les tests
13
+ document.body.innerHTML = `
14
+ <div class="v-date-picker">
15
+ <div class="v-date-picker-header">
16
+ <button class="v-btn v-btn--icon">
17
+ <span class="v-btn__content">
18
+ <i class="v-icon mdi mdi-chevron-left"></i>
19
+ </span>
20
+ </button>
21
+ <button class="v-btn v-btn--icon">
22
+ <span class="v-btn__content">
23
+ <div>Janvier 2023</div>
24
+ </span>
25
+ </button>
26
+ <button class="v-btn v-btn--icon">
27
+ <span class="v-btn__content">
28
+ <i class="v-icon mdi mdi-chevron-right"></i>
29
+ </span>
30
+ </button>
31
+ </div>
32
+ </div>
33
+ `
34
+ })
35
+
36
+ it('sets correct aria-label attributes on navigation buttons', async () => {
37
+ // Appeler la fonction updateAccessibility
38
+ await updateAccessibility()
39
+
40
+ // Récupérer les boutons
41
+ const buttons = document.querySelectorAll('.v-date-picker-header button')
42
+
43
+ // Vérifier que les attributs aria-label sont correctement définis
44
+ expect(buttons[0].getAttribute('aria-label')).toBe('Mois précédent')
45
+ expect(buttons[1].getAttribute('aria-label')).toBe(null) // Pas d'icône, donc pas d'attribu
46
+ expect(buttons[2].getAttribute('aria-label')).toBe('Mois suivant')
47
+ })
48
+
49
+ it('handles missing elements gracefully', async () => {
50
+ // Supprimer les éléments du DOM
51
+ document.body.innerHTML = ''
52
+
53
+ // La fonction ne devrait pas générer d'erreur même si les éléments n'existent pas
54
+ await expect(updateAccessibility()).resolves.not.toThrow()
55
+ })
56
+
57
+ it('handles different icons correctly', async () => {
58
+ // Modifier les icônes
59
+ document.body.innerHTML = `
60
+ <div class="v-date-picker">
61
+ <div class="v-date-picker-header">
62
+ <button class="v-btn v-btn--icon">
63
+ <span class="v-btn__content">
64
+ <i class="v-icon mdi mdi-arrow-left"></i>
65
+ </span>
66
+ </button>
67
+ <button class="v-btn v-btn--icon">
68
+ <span class="v-btn__content">
69
+ <div>Janvier 2023</div>
70
+ </span>
71
+ </button>
72
+ <button class="v-btn v-btn--icon">
73
+ <span class="v-btn__content">
74
+ <i class="v-icon mdi mdi-arrow-right"></i>
75
+ </span>
76
+ </button>
77
+ </div>
78
+ </div>
79
+ `
80
+
81
+ // Appeler la fonction updateAccessibility
82
+ await updateAccessibility()
83
+
84
+ // Récupérer les boutons
85
+ const buttons = document.querySelectorAll('.v-date-picker-header button')
86
+
87
+ // Vérifier que les attributs aria-label sont correctement définis
88
+ expect(buttons[0].getAttribute('aria-label')).toBe(null) // Pas de chevron-lef
89
+ expect(buttons[1].getAttribute('aria-label')).toBe(null) // Pas d'icône
90
+ expect(buttons[2].getAttribute('aria-label')).toBe(null) // Pas de chevron-righ
91
+ })
92
+
93
+ it('adds sr-only instructions to the DatePicker', async () => {
94
+ // Appeler updateAccessibility
95
+ await updateAccessibility()
96
+
97
+ // Vérifier que les instructions pour les lecteurs d'écran ont été ajoutées
98
+ const srOnlyEl = document.querySelector('.sr-only-instructions')
99
+ expect(srOnlyEl).not.toBeNull()
100
+ expect(srOnlyEl?.textContent).toBe('Utilisez les flèches pour naviguer entre les dates et Entrée pour sélectionner une date')
101
+ })
102
+ })
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Composable pour le formatage et le parsing des dates
3
+ */
4
+
5
+ /**
6
+ * Parse une chaîne de caractères en objet Date selon un format spécifié
7
+ * @param dateString - La chaîne de caractères à parser
8
+ * @param format - Le format de la date (ex: 'DD/MM/YYYY')
9
+ * @returns Un objet Date ou null si la chaîne n'est pas valide
10
+ */
11
+ export const parseDate = (dateString: string, format: string): Date | null => {
12
+ if (!dateString) return null
13
+
14
+ // Créer un mapping des positions des éléments de date selon le format
15
+ const separator = format.includes('/') ? '/' : format.includes('-') ? '-' : '.'
16
+ const parts = format.split(separator)
17
+ const dateParts = dateString.split(separator)
18
+
19
+ if (parts.length !== dateParts.length) return null
20
+
21
+ let day = 0, month = 0, year = 0
22
+
23
+ // Extraire les valeurs selon leur position dans le format
24
+ parts.forEach((part, index) => {
25
+ const value = parseInt(dateParts[index], 10)
26
+ if (isNaN(value)) return
27
+
28
+ if (part.includes('DD') || part.includes('D')) day = value
29
+ else if (part.includes('MM') || part.includes('M')) month = value - 1 // Les mois en JS sont 0-indexés
30
+ else if (part.includes('YYYY')) year = value
31
+ else if (part.includes('YY')) {
32
+ // Gestion intelligente des années à 2 chiffres
33
+ // Si l'année est < 50, on considère qu'elle est dans le 21ème siècle
34
+ // Sinon, elle est dans le 20ème siècle
35
+ year = value < 50 ? 2000 + value : 1900 + value
36
+ }
37
+ })
38
+
39
+ // Vérifier que nous avons toutes les parties nécessaires et qu'elles sont dans des plages valides
40
+ if (day < 1 || day > 31 || month < 0 || month > 11 || year < 1000 || year > 9999) return null
41
+
42
+ // Créer la date à midi (12:00) pour éviter les problèmes de décalage de fuseau horaire
43
+ // Cela garantit que la date reste la même lors de la conversion en UTC
44
+ const date = new Date(year, month, day, 12, 0, 0)
45
+
46
+ // Vérifier que la date est valide (par exemple, 31 février n'existe pas)
47
+ if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) return null
48
+
49
+ return date
50
+ }
51
+
52
+ /**
53
+ * Formate une date selon un format spécifié
54
+ * @param date - La date à formater
55
+ * @param format - Le format de sortie (ex: 'DD/MM/YYYY')
56
+ * @returns La date formatée en chaîne de caractères
57
+ */
58
+ export const formatDate = (date: Date, format: string): string => {
59
+ if (!date) return ''
60
+
61
+ // Formats de base
62
+ const day = date.getDate().toString().padStart(2, '0')
63
+ const month = (date.getMonth() + 1).toString().padStart(2, '0')
64
+ const year = date.getFullYear().toString()
65
+ const shortYear = year.slice(-2)
66
+
67
+ // Formats sans padding
68
+ const dayNoPad = date.getDate().toString()
69
+ const monthNoPad = (date.getMonth() + 1).toString()
70
+
71
+ // Remplacer les tokens dans l'ordre correct (du plus spécifique au moins spécifique)
72
+ const result = format
73
+ .replace(/YYYY/g, year)
74
+ .replace(/YY/g, shortYear)
75
+ .replace(/MM/g, month)
76
+ .replace(/M/g, monthNoPad)
77
+ .replace(/DD/g, day)
78
+ .replace(/D/g, dayNoPad)
79
+
80
+ return result
81
+ }
82
+
83
+ /**
84
+ * Hook composable pour le formatage et le parsing des dates
85
+ * @returns Fonctions de formatage et parsing de dates
86
+ */
87
+ export function useDateFormat() {
88
+ return {
89
+ parseDate,
90
+ formatDate,
91
+ }
92
+ }
93
+
94
+ export default useDateFormat
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Composable pour l'initialisation des dates dans le DatePicker
3
+ */
4
+ import { parseDate } from './useDateFormat'
5
+
6
+ // Types
7
+ export type DateValue = string | [string, string] | null
8
+ export type DateInput = string | string[] | null | object
9
+
10
+ /**
11
+ * Initialise les dates sélectionnées à partir d'une valeur d'entrée
12
+ * @param modelValue - La valeur d'entrée (peut être une chaîne, un tableau, null ou un objet)
13
+ * @param displayFormat - Le format d'affichage des dates
14
+ * @param returnFormat - Le format de retour des dates (optionnel)
15
+ * @returns Une date, un tableau de dates ou null
16
+ */
17
+ export const initializeSelectedDates = (
18
+ modelValue: DateInput | null,
19
+ displayFormat: string,
20
+ returnFormat: string = '',
21
+ ): Date | Date[] | null => {
22
+ if (!modelValue) return null
23
+
24
+ // Déterminer le format à utiliser pour l'analyse
25
+ const parseFormat = returnFormat || displayFormat
26
+
27
+ if (Array.isArray(modelValue)) {
28
+ if (modelValue.length >= 2) {
29
+ // Essayer d'abord avec le format de retour, puis avec le format d'affichage
30
+ let dates = [parseDate(modelValue[0], parseFormat), parseDate(modelValue[1], parseFormat)]
31
+
32
+ // Si l'une des dates est invalide avec le format de retour, essayer avec le format d'affichage
33
+ if (dates.some(date => date === null) && returnFormat) {
34
+ dates = [parseDate(modelValue[0], displayFormat), parseDate(modelValue[1], displayFormat)]
35
+ }
36
+
37
+ // Vérifie si l'une des dates est toujours invalide
38
+ if (dates.some(date => date === null)) {
39
+ return []
40
+ }
41
+
42
+ // Vérifie si la première date est après la seconde
43
+ if (dates[0] && dates[1] && dates[0] > dates[1]) {
44
+ return []
45
+ }
46
+
47
+ // Filtrer les dates nulles et convertir en tableau de Date
48
+ return dates.filter((date): date is Date => date !== null)
49
+ }
50
+
51
+ if (modelValue.length === 1) {
52
+ // Essayer d'abord avec le format de retour, puis avec le format d'affichage
53
+ let date = parseDate(modelValue[0], parseFormat)
54
+
55
+ // Si la date est invalide avec le format de retour, essayer avec le format d'affichage
56
+ if (date === null && returnFormat) {
57
+ date = parseDate(modelValue[0], displayFormat)
58
+ }
59
+
60
+ return date === null ? [] : [date]
61
+ }
62
+
63
+ return []
64
+ }
65
+
66
+ // Si modelValue est un objet, on le convertit en chaîne
67
+ if (typeof modelValue === 'object') {
68
+ return null
69
+ }
70
+
71
+ // Essayer d'abord avec le format de retour, puis avec le format d'affichage
72
+ let date = parseDate(modelValue, parseFormat)
73
+
74
+ // Si la date est invalide avec le format de retour, essayer avec le format d'affichage
75
+ if (date === null && returnFormat) {
76
+ date = parseDate(modelValue, displayFormat)
77
+ }
78
+
79
+ return date === null ? null : date
80
+ }
81
+
82
+ /**
83
+ * Hook composable pour l'initialisation des dates
84
+ * @returns Fonction d'initialisation des dates
85
+ */
86
+ export function useDateInitialization() {
87
+ return {
88
+ initializeSelectedDates,
89
+ }
90
+ }
91
+
92
+ export default useDateInitialization