@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,230 @@
1
+ <script setup lang="ts">
2
+ import useCustomizableOptions, {
3
+ type CustomizableOptions,
4
+ } from '@/composables/useCustomizableOptions'
5
+ import { useWidthable, type Widthable } from '@/composables/widthable'
6
+ import { isRequired } from '@/utils/rules/isRequired'
7
+ import { computed, reactive, ref, toRef, watch } from 'vue'
8
+ import DialogBox from '../DialogBox/DialogBox.vue'
9
+ import FileList from '../FileList/FileList.vue'
10
+ import FilePreview from '../FilePreview/FilePreview.vue'
11
+ import FileUpload from '../FileUpload/FileUpload.vue'
12
+ import { config } from './config'
13
+ import { locales as defaultLocales } from './locales'
14
+ import type { FileItem, SelectedFile, UploadItem } from './types'
15
+ import useFileUploadJourney from './useFileUploadJourney'
16
+ import useFileList from './useFileList'
17
+
18
+ const props = withDefaults(
19
+ defineProps<
20
+ Widthable &
21
+ CustomizableOptions & {
22
+ uploadList: UploadItem[]
23
+ sectionTitle?: string
24
+ showFilePreview?: boolean
25
+ locales?: typeof defaultLocales
26
+ }
27
+ >(),
28
+ {
29
+ sectionTitle: undefined,
30
+ showFilePreview: false,
31
+ locales: () => defaultLocales,
32
+ },
33
+ )
34
+
35
+ const emits = defineEmits<{
36
+ (e: 'error', value: string[]): void
37
+ (e: 'update:modelValue', value: SelectedFile[]): void
38
+ }>()
39
+
40
+ const selectedFiles = defineModel<SelectedFile[]>({
41
+ type: Array,
42
+ default: reactive([]),
43
+ })
44
+ watch(
45
+ selectedFiles,
46
+ (value) => {
47
+ emits('update:modelValue', value)
48
+ },
49
+ { deep: true },
50
+ )
51
+
52
+ const { widthStyles } = useWidthable(props)
53
+ const options = useCustomizableOptions(config, props)
54
+
55
+ const fileUpload = ref<typeof FileUpload>()
56
+ const { selectItems, selectedItem } = useFileUploadJourney(
57
+ toRef(props, 'uploadList'),
58
+ )
59
+
60
+ const title = computed(
61
+ () => props.sectionTitle ?? props.locales.title(!!props.uploadList.length),
62
+ )
63
+
64
+ const { addOrReplaceFile, resetFile, setItemOnError, filledUploadList }
65
+ = useFileList(selectedFiles, toRef(props, 'uploadList'))
66
+
67
+ // handle FileList
68
+ let inlineSelectedItemId: string | undefined = undefined
69
+ function uploadInline(item: FileItem) {
70
+ inlineSelectedItemId = item.id
71
+
72
+ fileUpload.value!.fileInput!.click()
73
+ }
74
+ function previewFile(file: FileItem & { file?: File }) {
75
+ showPreviewDialog.value = true
76
+ fileToPreview.value = file.file
77
+ }
78
+
79
+ // handle FileUpload
80
+ const uploadedFiles = ref<File[]>([])
81
+
82
+ const showFileUpload = computed(
83
+ () => (
84
+ selectedFiles.value.length < props.uploadList.length
85
+ || props.uploadList.find(uploadItem => uploadItem.state === 'error') !== undefined
86
+ ),
87
+ )
88
+
89
+ function fileSelected(files: File[]) {
90
+ const fileId
91
+ = inlineSelectedItemId ?? (props.uploadList.length === 1
92
+ ? props.uploadList[0].id
93
+ : undefined)
94
+ inlineSelectedItemId = undefined
95
+
96
+ if (props.showFilePreview || fileId === undefined) {
97
+ showSelectDialog.value = true
98
+ selectedItem.value = fileId
99
+
100
+ return
101
+ }
102
+
103
+ addOrReplaceFile(files[0], fileId)
104
+ }
105
+
106
+ function uploadError(errors: string[]) {
107
+ emits('error', errors)
108
+ if (!inlineSelectedItemId) {
109
+ return
110
+ }
111
+ setItemOnError(inlineSelectedItemId)
112
+ inlineSelectedItemId = undefined
113
+ }
114
+
115
+ // handle DialogBox
116
+ const showSelectDialog = ref(false)
117
+
118
+ function dialogConfirm() {
119
+ if (!selectedItem.value) {
120
+ return
121
+ }
122
+
123
+ addOrReplaceFile(uploadedFiles.value[0], selectedItem.value)
124
+
125
+ showSelectDialog.value = false
126
+ selectedItem.value = undefined
127
+ }
128
+
129
+ // handle preview
130
+ const fileToPreview = ref<File>()
131
+ const showPreviewDialog = ref(false)
132
+ </script>
133
+
134
+ <template>
135
+ <div
136
+ :style="widthStyles"
137
+ class="sy-upload-workflow white"
138
+ >
139
+ <slot name="title">
140
+ <h4 class="text-h6 mb-2">
141
+ {{ title }}
142
+ </h4>
143
+ </slot>
144
+
145
+ <FileList
146
+ v-bind="options.fileList"
147
+ :upload-list="filledUploadList"
148
+ @upload="uploadInline"
149
+ @retry="uploadInline"
150
+ @delete="resetFile"
151
+ @preview="previewFile"
152
+ />
153
+
154
+ <Transition>
155
+ <FileUpload
156
+ v-if="showFileUpload"
157
+ ref="fileUpload"
158
+ v-bind="options.fileUpload"
159
+ v-model="uploadedFiles"
160
+ @error="uploadError"
161
+ @update:model-value="fileSelected"
162
+ />
163
+ </Transition>
164
+
165
+ <DialogBox
166
+ v-model="showSelectDialog"
167
+ v-bind="options.dialog"
168
+ @cancel="showSelectDialog = false"
169
+ @confirm="dialogConfirm"
170
+ >
171
+ <template #title>
172
+ <slot name="modal-title">
173
+ {{ locales.modalTitle }}
174
+ </slot>
175
+ </template>
176
+ <slot name="modal-description" />
177
+
178
+ <VForm
179
+ v-if="true"
180
+ ref="form"
181
+ v-bind="options.form"
182
+ class="mb-2"
183
+ >
184
+ <VSelect
185
+ v-model="selectedItem"
186
+ v-bind="options.select"
187
+ :items="selectItems"
188
+ item-title="text"
189
+ item-value="value"
190
+ :rules="[isRequired]"
191
+ color="primary"
192
+ />
193
+ </VForm>
194
+
195
+ <FilePreview
196
+ v-if="showFilePreview"
197
+ :options="options.filePreview"
198
+ :file="uploadedFiles[0]"
199
+ />
200
+ </DialogBox>
201
+
202
+ <DialogBox
203
+ v-model="showPreviewDialog"
204
+ v-bind="options.previewDialog"
205
+ hide-actions
206
+ >
207
+ <slot name="preview-description" />
208
+
209
+ <FilePreview
210
+ :options="options.filePreview"
211
+ :file="fileToPreview"
212
+ />
213
+ </DialogBox>
214
+ </div>
215
+ </template>
216
+
217
+ <style lang="scss" scoped>
218
+ .v-enter-active,
219
+ .v-leave-active {
220
+ interpolate-size: allow-keywords;
221
+ transition: height 0.2s ease, opacity 0.2s ease;
222
+ overflow: hidden;
223
+ }
224
+
225
+ .v-enter-from,
226
+ .v-leave-to {
227
+ height: 0;
228
+ opacity: 0;
229
+ }
230
+ </style>
@@ -0,0 +1,29 @@
1
+ export const config = {
2
+ fileUpload: {
3
+ class: 'mt-6',
4
+ },
5
+ dialog: {
6
+ persistent: true,
7
+ width: '550',
8
+ },
9
+ card: {
10
+ class: 'pa-4',
11
+ },
12
+ select: {
13
+ variant: 'outlined',
14
+ validateOnBlur: true,
15
+ label: 'Nature du fichier',
16
+ },
17
+ layout: {
18
+ wrap: true,
19
+ class: 'mt-2',
20
+ },
21
+ cancelBtn: {
22
+ text: true,
23
+ class: 'mr-4',
24
+ color: 'accent',
25
+ },
26
+ confirmBtn: {
27
+ color: 'accent',
28
+ },
29
+ } as const
@@ -0,0 +1,4 @@
1
+ export enum ExpertiseLevelEnum {
2
+ DEV = 'dev',
3
+ DESIGN = 'design',
4
+ }
@@ -0,0 +1,8 @@
1
+ export const locales = {
2
+ title: (plural: boolean): string =>
3
+ `Document${plural ? 's' : ''} à nous transmettre`,
4
+ importTitle: 'Importer des fichiers',
5
+ modalTitle: 'Fichier transmis',
6
+ cancelBtn: 'Retour',
7
+ confirmBtn: 'Confirmer',
8
+ } as const
@@ -0,0 +1,257 @@
1
+ import { describe, it, expect, vi } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import { vuetify } from '@tests/unit/setup'
4
+
5
+ import UploadWorkflow from '../UploadWorkflow.vue'
6
+ import { locales as fileListLocales } from '@/components/FileList/UploadItem/locales'
7
+ import { locales as FileUploadLocales } from '@/components/FileUpload/locales'
8
+ import { afterEach } from 'node:test'
9
+ import { VSelect } from 'vuetify/components'
10
+
11
+ describe('UploadWorkflow', () => {
12
+ afterEach(() => {
13
+ vi.clearAllMocks()
14
+ document.body.innerHTML = ''
15
+ })
16
+
17
+ it('render the upload list', async () => {
18
+ const wrapper = mount(UploadWorkflow, {
19
+ props: {
20
+ uploadList: [
21
+ {
22
+ id: 'ID',
23
+ title: 'Carte d\'identité',
24
+ },
25
+ {
26
+ id: 'bill',
27
+ title: 'Facture de soin',
28
+ },
29
+ ],
30
+ },
31
+ global: {
32
+ plugins: [vuetify],
33
+ },
34
+ })
35
+
36
+ expect(wrapper.html()).toMatchSnapshot()
37
+ expect(wrapper.findAll('.file-item')).toHaveLength(2)
38
+ expect(wrapper.find('.sy-file-upload').isVisible()).toBeTruthy()
39
+ })
40
+
41
+ it('shows the file in the list when set with the list button', async () => {
42
+ const wrapper = mount(UploadWorkflow, {
43
+ props: {
44
+ uploadList: [
45
+ {
46
+ id: 'ID',
47
+ title: 'Carte d\'identité',
48
+ },
49
+ {
50
+ id: 'bill',
51
+ title: 'Facture de soin',
52
+ },
53
+ ],
54
+ },
55
+ global: {
56
+ plugins: [vuetify],
57
+ },
58
+ })
59
+
60
+ await wrapper.find('.file-item button').trigger('click')
61
+
62
+ const file: File = new File([''], 'theFilename.pdf', {
63
+ type: 'application/pdf',
64
+ })
65
+
66
+ await wrapper.find('input').trigger('drop', {
67
+ dataTransfer: {
68
+ files: [file],
69
+ },
70
+ })
71
+
72
+ expect(wrapper.find('.file-item').text()).toContain('theFilename.pdf')
73
+ expect(wrapper.emitted('update:modelValue')).toBeTruthy()
74
+ })
75
+
76
+ it('shows the item as error in the list when set with the list button', async () => {
77
+ const wrapper = mount(UploadWorkflow, {
78
+ props: {
79
+ uploadList: [
80
+ {
81
+ id: 'ID',
82
+ title: 'Carte d\'identité',
83
+ },
84
+ {
85
+ id: 'bill',
86
+ title: 'Facture de soin',
87
+ },
88
+ ],
89
+ },
90
+ global: {
91
+ plugins: [vuetify],
92
+ },
93
+ })
94
+
95
+ await wrapper.findAll('.file-item button')[1].trigger('click')
96
+
97
+ const file: File = new File([''], 'theFilename.invalid', {
98
+ type: 'application/invalid',
99
+ })
100
+
101
+ const input = wrapper.find('input')
102
+ input.element.files = [file] as unknown as FileList
103
+ await input.trigger('change')
104
+
105
+ expect(wrapper.emitted('error')).toEqual([
106
+ [
107
+ [
108
+ FileUploadLocales.errorExtension('theFilename.invalid', [
109
+ 'pdf',
110
+ 'jpg',
111
+ 'jpeg',
112
+ 'png',
113
+ ]),
114
+ ],
115
+ ],
116
+ ])
117
+ expect(wrapper.findAll('.file-item')[1].text()).toContain(
118
+ fileListLocales.error,
119
+ )
120
+ })
121
+
122
+ it('accept the file when we use the FileUpload component with many items in the uploadList', async () => {
123
+ const wrapper = mount(UploadWorkflow, {
124
+ props: {
125
+ uploadList: [
126
+ {
127
+ id: 'ID',
128
+ title: 'Carte d\'identité',
129
+ },
130
+ {
131
+ id: 'bill',
132
+ title: 'Facture de soin',
133
+ },
134
+ ],
135
+ },
136
+ global: {
137
+ plugins: [vuetify],
138
+ stubs: {
139
+ VDialog: {
140
+ template: '<div><slot /></div>',
141
+ },
142
+ },
143
+ },
144
+ })
145
+
146
+ const file: File = new File([''], 'uploadInField.pdf', {
147
+ type: 'application/pdf',
148
+ })
149
+
150
+ await wrapper.find('input').trigger('drop', {
151
+ dataTransfer: {
152
+ files: [file],
153
+ },
154
+ })
155
+
156
+ wrapper.find('.v-select input').setValue('bill')
157
+ wrapper.findComponent(VSelect).vm.$emit('update:modelValue', 'bill')
158
+
159
+ await wrapper.find('[data-test-id="confirm-btn"]').trigger('click')
160
+
161
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
162
+ expect((wrapper.emitted('update:modelValue')?.[0][0] as any[]).find(item => item.fileName === 'uploadInField.pdf')).toBeTruthy()
163
+
164
+ expect(wrapper.findAll('.file-item')[1].text()).toContain('uploadInField.pdf')
165
+ })
166
+
167
+ it('replace the selected file', async () => {
168
+ const wrapper = mount(UploadWorkflow, {
169
+ props: {
170
+ uploadList: [
171
+ {
172
+ id: 'ID',
173
+ title: 'Carte d\'identité',
174
+ },
175
+ {
176
+ id: 'bill',
177
+ title: 'Facture de soin',
178
+ },
179
+ ],
180
+ modelValue: [
181
+ {
182
+ fileName: 'file1.pdf',
183
+ file: new File([''], 'file1.pdf', {
184
+ type: 'application/pdf',
185
+ }),
186
+ id: 'ID',
187
+ title: 'Carte d\'identité',
188
+ },
189
+ ],
190
+ },
191
+ global: {
192
+ plugins: [vuetify],
193
+ },
194
+ })
195
+
196
+ await wrapper.find('.file-item button').trigger('click')
197
+
198
+ const file: File = new File([''], 'file2.pdf', {
199
+ type: 'application/pdf',
200
+ })
201
+
202
+ await wrapper.find('input').trigger('drop', {
203
+ dataTransfer: {
204
+ files: [file],
205
+ },
206
+ })
207
+
208
+ expect(wrapper.find('.file-item').text()).toContain('file2.pdf')
209
+ })
210
+
211
+ it('show the preview of an image', async () => {
212
+ const wrapper = mount(UploadWorkflow, {
213
+ props: {
214
+ modelValue: [],
215
+ uploadList: [
216
+ {
217
+ id: 'CERFA1',
218
+ title: 'CERFA 1',
219
+ showPreviewBtn: true,
220
+ },
221
+ {
222
+ id: 'CERFA2',
223
+ title: 'CERFA 2',
224
+ showPreviewBtn: true,
225
+ },
226
+ ],
227
+ showFilePreview: false,
228
+ },
229
+ global: {
230
+ plugins: [vuetify],
231
+ stubs: {
232
+ VDialog: {
233
+ template: '<div><slot /></div>',
234
+ },
235
+ },
236
+ },
237
+ })
238
+
239
+ const image = new File(
240
+ [Buffer.from([100, 97, 116, 97, 58, 14, 79, 8, 113, 97, 65, 43, 57, 55, 89, 69, 88, 51, 66, 101, 70, 86, 112, 121, 112, 121, 121, 121, 80, 81, 104])],
241
+ 'image.png',
242
+ { type: 'image/png' },
243
+ )
244
+
245
+ await wrapper.find('.file-item button').trigger('click')
246
+
247
+ await wrapper.find('input').trigger('drop', {
248
+ dataTransfer: {
249
+ files: [image],
250
+ },
251
+ })
252
+
253
+ await wrapper.find('.file-item__action-preview').trigger('click')
254
+
255
+ expect(wrapper.find('.sy-file-preview img').exists()).toBeTruthy()
256
+ })
257
+ })
@@ -0,0 +1,54 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`UploadWorkflow > render the upload list 1`] = `
4
+ "<div data-v-2a35ee7d="" style="width: 100%;" class="sy-upload-workflow white">
5
+ <h4 data-v-2a35ee7d="" class="text-h6 mb-2">Documents à nous transmettre</h4>
6
+ <ul data-v-1c29bdca="" data-v-2a35ee7d="" class="upload-list" style="width: 100%;">
7
+ <li data-v-55f3ab7e="" data-v-1c29bdca="" class="file-item">
8
+ <div data-v-55f3ab7e="" class="file-item__description">
9
+ <div data-v-55f3ab7e="" class="file-item__content"><span data-v-55f3ab7e="" class="file-item__icon"><!--v-if--><i data-v-55f3ab7e="" class="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z mdi v-icon notranslate v-theme--light text-primary" style="font-size: 24px; height: 24px; width: 24px;" aria-hidden="true"></i></span>
10
+ <div data-v-55f3ab7e="">
11
+ <div data-v-55f3ab7e="" class="file-item__title">Carte d'identité</div>
12
+ <div data-v-55f3ab7e="" class="file-item__name text-base"></div>
13
+ <!--v-if-->
14
+ <!--v-if-->
15
+ </div>
16
+ </div>
17
+ <div data-v-55f3ab7e="" class="file-item__actions"><button data-v-55f3ab7e="" type="button" class="v-btn v-theme--light v-btn--density-default v-btn--size-default v-btn--variant-text file-item__action file-item__action-upload text-primary"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span><span class="v-btn__prepend"><i data-v-55f3ab7e="" class="M2 12H4V17H20V12H22V17C22 18.11 21.11 19 20 19H4C2.9 19 2 18.11 2 17V12M12 2L6.46 7.46L7.88 8.88L11 5.75V15H13V5.75L16.13 8.88L17.55 7.45L12 2Z mdi v-icon notranslate v-theme--light v-icon--size-default text-primary" aria-hidden="true"></i></span><span class="v-btn__content" data-no-activator=""><span data-v-55f3ab7e="">Importer</span></span>
18
+ <!---->
19
+ <!---->
20
+ </button>
21
+ <!--v-if-->
22
+ <!--v-if-->
23
+ </div>
24
+ </div>
25
+ <!--v-if-->
26
+ </li>
27
+ <li data-v-55f3ab7e="" data-v-1c29bdca="" class="file-item">
28
+ <div data-v-55f3ab7e="" class="file-item__description">
29
+ <div data-v-55f3ab7e="" class="file-item__content"><span data-v-55f3ab7e="" class="file-item__icon"><!--v-if--><i data-v-55f3ab7e="" class="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z mdi v-icon notranslate v-theme--light text-primary" style="font-size: 24px; height: 24px; width: 24px;" aria-hidden="true"></i></span>
30
+ <div data-v-55f3ab7e="">
31
+ <div data-v-55f3ab7e="" class="file-item__title">Facture de soin</div>
32
+ <div data-v-55f3ab7e="" class="file-item__name text-base"></div>
33
+ <!--v-if-->
34
+ <!--v-if-->
35
+ </div>
36
+ </div>
37
+ <div data-v-55f3ab7e="" class="file-item__actions"><button data-v-55f3ab7e="" type="button" class="v-btn v-theme--light v-btn--density-default v-btn--size-default v-btn--variant-text file-item__action file-item__action-upload text-primary"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span><span class="v-btn__prepend"><i data-v-55f3ab7e="" class="M2 12H4V17H20V12H22V17C22 18.11 21.11 19 20 19H4C2.9 19 2 18.11 2 17V12M12 2L6.46 7.46L7.88 8.88L11 5.75V15H13V5.75L16.13 8.88L17.55 7.45L12 2Z mdi v-icon notranslate v-theme--light v-icon--size-default text-primary" aria-hidden="true"></i></span><span class="v-btn__content" data-no-activator=""><span data-v-55f3ab7e="">Importer</span></span>
38
+ <!---->
39
+ <!---->
40
+ </button>
41
+ <!--v-if-->
42
+ <!--v-if-->
43
+ </div>
44
+ </div>
45
+ <!--v-if-->
46
+ </li>
47
+ </ul>
48
+ <transition-stub data-v-2a35ee7d="" appear="false" persisted="false" css="true"><label data-v-3451b201="" data-v-2a35ee7d="" for="file-upload-v-0" class="sy-file-upload d-block pa-4 mt-6" style="width: 100%;"><input data-v-3451b201="" id="file-upload-v-0" type="file" accept=".pdf, .jpg, .jpeg, .png" class="sy-file-upload-input"><span data-v-5bd3b751="" data-v-3451b201="" class="sy-file-upload-placeholder"><i data-v-5bd3b751="" class="M11 20H6.5Q4.22 20 2.61 18.43 1 16.85 1 14.58 1 12.63 2.17 11.1 3.35 9.57 5.25 9.15 5.88 6.85 7.75 5.43 9.63 4 12 4 14.93 4 16.96 6.04 19 8.07 19 11 20.73 11.2 21.86 12.5 23 13.78 23 15.5 23 17.38 21.69 18.69 20.38 20 18.5 20H13V12.85L14.6 14.4L16 13L12 9L8 13L9.4 14.4L11 12.85Z mdi v-icon notranslate v-theme--light text-primary" style="font-size: 40px; height: 40px; width: 40px;" aria-hidden="true"></i><span data-v-5bd3b751="" class="mt-1 font-weight-medium text-black"><span data-v-5bd3b751="">Déposer votre fichier ici</span></span><span data-v-5bd3b751="" class="mb-2 sy-file-upload-caption">Ou</span><span data-v-5bd3b751="" class="sy-file-upload-btn bg-primary text-white elevation-2">Choisir un fichier</span><span data-v-5bd3b751="" class="mt-4 sy-file-upload-caption">Taille max. : 10 Mo. Formats acceptés : pdf, jpg, jpeg, png</span></span></label></transition-stub>
49
+ <!---->
50
+ <!---->
51
+ <!---->
52
+ <!---->
53
+ </div>"
54
+ `;
@@ -0,0 +1,21 @@
1
+ import type { FileState } from '@/components/FileList/FileList.vue'
2
+ export type { Item as FileItem } from '@/components/FileList/FileList.vue'
3
+
4
+ export type UploadItem = {
5
+ id: string
6
+ title: string
7
+ state?: FileState | string
8
+ optional?: boolean
9
+ showPreviewBtn?: boolean
10
+ }
11
+
12
+ export type SelectedFile = {
13
+ id: string
14
+ title: string
15
+ state?: FileState
16
+ progress?: number
17
+ optional?: boolean
18
+ showPreviewBtn?: boolean
19
+ fileName: string
20
+ file: File
21
+ }
@@ -0,0 +1,84 @@
1
+ import { computed, ref, type DeepReadonly, type Ref } from 'vue'
2
+ import type { FileState, Item as FileListItem } from '../FileList/FileList.vue'
3
+ import type { FileItem, SelectedFile, UploadItem } from './types'
4
+
5
+ export default function useFileList(
6
+ selectedFiles: Ref<SelectedFile[]>,
7
+ uploadList: DeepReadonly<Ref<UploadItem[]>>,
8
+ ) {
9
+ const errorSelectedFiles = ref<string[]>([])
10
+
11
+ function removeFromErrorList(fileId: string) {
12
+ const errorIndex = errorSelectedFiles.value.findIndex(item => item === fileId)
13
+ if (errorIndex !== -1) {
14
+ errorSelectedFiles.value.splice(errorIndex, 1)
15
+ }
16
+ }
17
+
18
+ function findSelectedFile(fileId: string) {
19
+ return selectedFiles.value.find(item => item.id === fileId)
20
+ }
21
+
22
+ function resetFile(fileItem: FileListItem | SelectedFile) {
23
+ const itemIndex = selectedFiles.value.findIndex(item => item.id === fileItem.id)
24
+ selectedFiles.value.splice(itemIndex, 1)
25
+ }
26
+
27
+ function replaceFile(file: File, item: SelectedFile, state: FileState = 'success') {
28
+ item.file = file
29
+ item.fileName = file.name
30
+ item.state = state
31
+ }
32
+
33
+ function addOrReplaceFile(file: File, fileId: string, state: FileState = 'success') {
34
+ const selectedFile = findSelectedFile(fileId)
35
+
36
+ if (selectedFile) {
37
+ replaceFile(file, selectedFile, state)
38
+ }
39
+ else {
40
+ const uploadItemIndex = uploadList.value.findIndex(item => item.id === fileId)
41
+
42
+ selectedFiles.value.push({
43
+ id: uploadList.value[uploadItemIndex].id,
44
+ title: uploadList.value[uploadItemIndex].title,
45
+ state: state,
46
+ optional: !!uploadList.value[uploadItemIndex].optional,
47
+ showPreviewBtn: !!uploadList.value[uploadItemIndex].showPreviewBtn,
48
+ fileName: file.name,
49
+ file,
50
+ })
51
+ removeFromErrorList(fileId)
52
+ }
53
+ }
54
+
55
+ function setItemOnError(fileId: string) {
56
+ const selectedFile = findSelectedFile(fileId)
57
+ if (selectedFile) {
58
+ resetFile(selectedFile)
59
+ }
60
+ errorSelectedFiles.value.push(fileId)
61
+ }
62
+
63
+ const filledUploadList = computed<FileItem[]>(() => {
64
+ return uploadList.value.map((uploadItem) => {
65
+ const matchingUploadedItem = findSelectedFile(uploadItem.id)
66
+ const error = errorSelectedFiles.value.includes(uploadItem.id)
67
+ const state = uploadItem.state ?? (error ? 'error' : 'initial')
68
+
69
+ return ({
70
+ ...uploadItem,
71
+ state,
72
+ ...matchingUploadedItem,
73
+ })
74
+ })
75
+ })
76
+
77
+ return {
78
+ addOrReplaceFile,
79
+ replaceFile,
80
+ resetFile,
81
+ setItemOnError,
82
+ filledUploadList,
83
+ }
84
+ }