@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
@@ -1,8 +1,9 @@
1
- import type { StoryObj, Meta } from '@storybook/vue3'
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import { ref } from 'vue'
2
3
  import PasswordField from './PasswordField.vue'
3
4
 
4
5
  const meta = {
5
- title: 'Composants/Formulaires/PasswordField',
6
+ title: 'Composants/Formulaires/Passwordfield',
6
7
  component: PasswordField,
7
8
  decorators: [
8
9
  () => ({
@@ -11,57 +12,102 @@ const meta = {
11
12
  ],
12
13
  parameters: {
13
14
  layout: 'fullscreen',
15
+ docs: {
16
+ description: {
17
+ component: `PasswordField est un champ de saisie sécurisé pour les mots de passe`,
18
+ },
19
+ },
14
20
  },
15
21
  argTypes: {
16
22
  modelValue: {
17
- description: 'La valeur du modèle pour le champ.',
18
23
  control: 'text',
19
- default: null,
20
- table: {
21
- type: {
22
- summary: 'string | null',
23
- },
24
- },
24
+ description: 'Valeur du champ de mot de passe',
25
25
  },
26
- outlined: {
27
- description: 'Définit la variante du champ (outlined ou underlined).',
28
- control: 'boolean',
29
- default: true,
30
- table: {
31
- type: {
32
- summary: 'boolean',
33
- },
34
- },
26
+ variantStyle: {
27
+ control: 'select',
28
+ options: ['outlined', 'underlined'],
29
+ description: 'Style du champ (contour ou souligné)',
30
+ },
31
+ color: {
32
+ control: 'select',
33
+ options: ['primary', 'secondary', 'error', 'warning', 'success', 'info'],
34
+ description: 'Couleur principale du champ',
35
+ },
36
+ label: {
37
+ control: 'text',
38
+ description: 'Libellé du champ',
35
39
  },
36
40
  required: {
37
- description: 'Indique si le champ est requis.',
38
41
  control: 'boolean',
39
- default: false,
40
- table: {
41
- type: {
42
- summary: 'boolean',
43
- },
44
- },
42
+ description: 'Indique si le champ est obligatoire',
45
43
  },
46
- isValidateOnBlur: {
47
- description: 'Active ou non la validation lors du blur.',
44
+ errorMessages: {
45
+ control: 'object',
46
+ description: 'Messages d\'erreur à afficher',
47
+ },
48
+ warningMessages: {
49
+ control: 'object',
50
+ description: 'Messages d\'avertissement à afficher',
51
+ },
52
+ successMessages: {
53
+ control: 'object',
54
+ description: 'Messages de succès à afficher',
55
+ },
56
+ isReadOnly: {
48
57
  control: 'boolean',
49
- default: true,
50
- table: {
51
- type: {
52
- summary: 'boolean',
53
- },
54
- },
58
+ description: 'Indique si le champ est en lecture seule',
59
+ },
60
+ isDisabled: {
61
+ control: 'boolean',
62
+ description: 'Indique si le champ est désactivé',
63
+ },
64
+ placeholder: {
65
+ control: 'text',
66
+ description: 'Texte d\'indication affiché lorsque le champ est vide',
55
67
  },
56
68
  customRules: {
57
- description: 'Règles de validation personnalisées.',
58
69
  control: 'object',
59
- table: {
60
- type: {
61
- summary: 'array',
62
- },
63
- },
70
+ description: 'Règles de validation personnalisées',
71
+ },
72
+ customWarningRules: {
73
+ control: 'object',
74
+ description: 'Règles d\'avertissement personnalisées',
75
+ },
76
+ customSuccessRules: {
77
+ control: 'object',
78
+ description: 'Règles de succès personnalisées',
79
+ },
80
+ showSuccessMessages: {
81
+ control: 'boolean',
82
+ description: 'Indique si les messages de succès doivent être affichés',
83
+ },
84
+ displayAsterisk: {
85
+ control: 'boolean',
86
+ description: 'Affiche un astérisque à côté du libellé pour indiquer que le champ est obligatoire',
64
87
  },
88
+ isValidateOnBlur: {
89
+ control: 'boolean',
90
+ description: 'Indique si la validation doit être effectuée lors de la perte de focus',
91
+ },
92
+ },
93
+ args: {
94
+ modelValue: '',
95
+ variantStyle: 'outlined',
96
+ color: 'primary',
97
+ label: 'Mot de passe',
98
+ required: false,
99
+ errorMessages: null,
100
+ warningMessages: null,
101
+ successMessages: null,
102
+ isReadOnly: false,
103
+ isDisabled: false,
104
+ placeholder: 'Entrez votre mot de passe',
105
+ customRules: [],
106
+ customWarningRules: [],
107
+ customSuccessRules: [],
108
+ showSuccessMessages: true,
109
+ displayAsterisk: false,
110
+ isValidateOnBlur: true,
65
111
  },
66
112
  } satisfies Meta<typeof PasswordField>
67
113
 
@@ -70,144 +116,1089 @@ export default meta
70
116
  type Story = StoryObj<typeof meta>
71
117
 
72
118
  /**
73
- * Story par défaut
119
+ * Story par défaut montrant un champ de mot de passe basique.
74
120
  */
75
121
  export const Default: Story = {
76
- args: {
77
- modelValue: '',
78
- outlined: true,
79
- required: false,
80
- isValidateOnBlur: true,
81
- customRules: [],
82
- },
83
- render: (args) => {
84
- return {
85
- components: { PasswordField },
86
- setup() {
87
- return { args }
122
+ parameters: {
123
+ sourceCode: [
124
+ {
125
+ name: 'Template',
126
+ code: `
127
+ <template>
128
+ <PasswordField
129
+ v-model="password"
130
+ label="Mot de passe"
131
+ placeholder="Entrez votre mot de passe"
132
+ />
133
+ </template>
134
+ `,
88
135
  },
89
- template: `
90
- <PasswordField v-bind="args" v-model="args.modelValue"/>
91
- `,
92
- }
136
+ {
137
+ name: 'Script',
138
+ code: `
139
+ <script setup lang="ts">
140
+ import { ref } from 'vue'
141
+ import { PasswordField } from '@cnamts/synapse'
142
+
143
+ const password = ref('')
144
+ </script>
145
+ `,
146
+ },
147
+ ],
93
148
  },
149
+ render: args => ({
150
+ components: { PasswordField },
151
+ setup() {
152
+ const password = ref(args.modelValue)
153
+ return { args, password }
154
+ },
155
+ template: `
156
+ <PasswordField
157
+ v-model="password"
158
+ :variant-style="args.variantStyle"
159
+ :color="args.color"
160
+ :label="args.label"
161
+ :required="args.required"
162
+ :error-messages="args.errorMessages"
163
+ :warning-messages="args.warningMessages"
164
+ :success-messages="args.successMessages"
165
+ :is-read-only="args.isReadOnly"
166
+ :is-disabled="args.isDisabled"
167
+ :placeholder="args.placeholder"
168
+ :custom-rules="args.customRules"
169
+ :custom-warning-rules="args.customWarningRules"
170
+ :custom-success-rules="args.customSuccessRules"
171
+ :show-success-messages="args.showSuccessMessages"
172
+ :display-asterisk="args.displayAsterisk"
173
+ :is-validate-on-blur="args.isValidateOnBlur"
174
+ />
175
+ `,
176
+ }),
177
+ }
178
+
179
+ /**
180
+ * Champ de mot de passe avec validation requise.
181
+ */
182
+ export const Required: Story = {
94
183
  parameters: {
95
184
  sourceCode: [
96
185
  {
97
186
  name: 'Template',
98
187
  code: `
99
- <template>
100
- <PasswordField
101
- v-model="password"
102
- :required="false"
103
- :isValidateOnBlur="true"
104
- />
105
- </template>
106
- `,
188
+ <template>
189
+ <PasswordField
190
+ v-model="password"
191
+ label="Mot de passe"
192
+ :required="true"
193
+ />
194
+ </template>
195
+ `,
107
196
  },
108
197
  {
109
198
  name: 'Script',
110
199
  code: `
111
- <script setup lang="ts">
112
- import { ref } from 'vue'
113
- import PasswordField from '@cnamts/synapse'
114
-
115
- const password = ref('')
116
- </script>
117
- `,
200
+ <script setup lang="ts">
201
+ import { ref } from 'vue'
202
+ import { PasswordField } from '@cnamts/synapse'
203
+
204
+ const password = ref('')
205
+ </script>
206
+ `,
118
207
  },
119
208
  ],
120
209
  },
210
+ args: {
211
+ required: true,
212
+ displayAsterisk: false,
213
+ },
121
214
  }
122
215
 
123
216
  /**
124
- * Story avec champ requis
217
+ * Champ de mot de passe avec validation requise avec asterisk.
125
218
  */
126
- export const Required: Story = {
219
+ export const RequiredWithAsterisk: Story = {
220
+ parameters: {
221
+ sourceCode: [
222
+ {
223
+ name: 'Template',
224
+ code: `
225
+ <template>
226
+ <PasswordField
227
+ v-model="password"
228
+ label="Mot de passe"
229
+ :required="true"
230
+ :display-asterisk="true"
231
+ />
232
+ </template>
233
+ `,
234
+ },
235
+ {
236
+ name: 'Script',
237
+ code: `
238
+ <script setup lang="ts">
239
+ import { ref } from 'vue'
240
+ import { PasswordField } from '@cnamts/synapse'
241
+
242
+ const password = ref('')
243
+ </script>
244
+ `,
245
+ },
246
+ ],
247
+ },
127
248
  args: {
128
- ...Default.args,
129
249
  required: true,
250
+ displayAsterisk: true,
130
251
  },
252
+ }
253
+
254
+ /**
255
+ * Champ de mot de passe désactivé.
256
+ */
257
+ export const Disabled: Story = {
131
258
  parameters: {
132
- ...Default.parameters,
133
259
  sourceCode: [
134
260
  {
135
261
  name: 'Template',
136
262
  code: `
137
- <template>
138
- <PasswordField
139
- v-model="password"
140
- :required="true"
141
- :isValidateOnBlur="true"
142
- />
143
- </template>
144
- `,
263
+ <template>
264
+ <PasswordField
265
+ v-model="password"
266
+ label="Mot de passe"
267
+ :is-disabled="true"
268
+ />
269
+ </template>
270
+ `,
145
271
  },
146
272
  {
147
273
  name: 'Script',
148
274
  code: `
149
- <script setup lang="ts">
150
- import { ref } from 'vue'
151
- import PasswordField from '@cnamts/synapse'
275
+ <script setup lang="ts">
276
+ import { ref } from 'vue'
277
+ import { PasswordField } from '@cnamts/synapse'
278
+
279
+ const password = ref('MonMotDePasse123')
280
+ </script>
281
+ `,
282
+ },
283
+ ],
284
+ },
285
+ args: {
286
+ isDisabled: true,
287
+ modelValue: 'MonMotDePasse123',
288
+ },
289
+ }
152
290
 
153
- const password = ref('')
154
- </script>
155
- `,
291
+ /**
292
+ * Champ de mot de passe en lecture seule.
293
+ */
294
+ export const ReadOnly: Story = {
295
+ parameters: {
296
+ sourceCode: [
297
+ {
298
+ name: 'Template',
299
+ code: `
300
+ <template>
301
+ <PasswordField
302
+ v-model="password"
303
+ label="Mot de passe"
304
+ :is-read-only="true"
305
+ />
306
+ </template>
307
+ `,
308
+ },
309
+ {
310
+ name: 'Script',
311
+ code: `
312
+ <script setup lang="ts">
313
+ import { ref } from 'vue'
314
+ import { PasswordField } from '@cnamts/synapse'
315
+
316
+ const password = ref('MonMotDePasse123')
317
+ </script>
318
+ `,
156
319
  },
157
320
  ],
158
321
  },
322
+ args: {
323
+ isReadOnly: true,
324
+ modelValue: 'MonMotDePasse123',
325
+ },
159
326
  }
160
327
 
161
- export const WithCustomRules: Story = {
328
+ /**
329
+ * Champ de mot de passe avec règles de validation qui génèrent une erreur.
330
+ */
331
+ export const WithError: Story = {
332
+ parameters: {
333
+ sourceCode: [
334
+ {
335
+ name: 'Template',
336
+ code: `
337
+ <template>
338
+ <PasswordField
339
+ v-model="password"
340
+ label="Mot de passe"
341
+ :custom-rules="customRules"
342
+ />
343
+ </template>
344
+ `,
345
+ },
346
+ {
347
+ name: 'Script',
348
+ code: `
349
+ <script setup lang="ts">
350
+ import { ref } from 'vue'
351
+ import { PasswordField } from '@cnamts/synapse'
352
+
353
+ const password = ref('Mdp123')
354
+
355
+ const customRules = [
356
+ {
357
+ type: 'custom',
358
+ options: {
359
+ validate: (value: string) => {
360
+ if (!value || value.length < 8) {
361
+ return 'Le mot de passe doit contenir au moins 8 caractères'
362
+ }
363
+ return true
364
+ },
365
+ fieldIdentifier: 'password',
366
+ },
367
+ },
368
+ ]
369
+ </script>
370
+ `,
371
+ },
372
+ ],
373
+ },
162
374
  args: {
163
- ...Default.args,
375
+ modelValue: 'Mdp123',
164
376
  customRules: [
165
377
  {
166
- type: 'minLength',
378
+ type: 'custom',
167
379
  options: {
168
- length: 8,
169
- message: 'Le mot de passe doit comporter au moins 8 caractères.',
170
- successMessage: 'Le mot de passe est suffisamment long.',
380
+ validate: (value: string) => {
381
+ if (!value || value.length < 8) {
382
+ return 'Le mot de passe doit contenir au moins 8 caractères'
383
+ }
384
+ return true
385
+ },
386
+ fieldIdentifier: 'password',
171
387
  },
172
388
  },
173
389
  ],
174
390
  },
391
+ }
392
+
393
+ /**
394
+ * Champ de mot de passe avec règles de validation qui génèrent un avertissement.
395
+ */
396
+ export const WithWarning: Story = {
175
397
  parameters: {
176
- ...Default.parameters,
177
398
  sourceCode: [
178
399
  {
179
400
  name: 'Template',
180
401
  code: `
181
- <template>
182
- <PasswordField
183
- v-model="password"
184
- :required="false"
185
- :isValidateOnBlur="true"
186
- :customRules="[
187
- {
188
- type: 'minLength',
189
- options: {
190
- length: 8,
191
- message: 'Le mot de passe doit comporter au moins 8 caractères.',
192
- successMessage: 'Le mot de passe est suffisamment long.'
193
- }
194
- },
195
- ]"
196
- />
197
- </template>
198
- `,
402
+ <template>
403
+ <PasswordField
404
+ v-model="password"
405
+ label="Mot de passe"
406
+ :custom-warning-rules="customWarningRules"
407
+ />
408
+ </template>
409
+ `,
199
410
  },
200
411
  {
201
412
  name: 'Script',
202
413
  code: `
203
- <script setup lang="ts">
204
- import { ref } from 'vue'
205
- import PasswordField from '@cnamts/synapse'
414
+ <script setup lang="ts">
415
+ import { ref } from 'vue'
416
+ import { PasswordField } from '@cnamts/synapse'
417
+
418
+ const password = ref('MotDePasse123')
419
+
420
+ const customWarningRules = [
421
+ {
422
+ type: 'custom',
423
+ options: {
424
+ validate: (value: string) => {
425
+ const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(value)
426
+ if (!hasSpecialChar) {
427
+ return 'Le mot de passe pourrait être plus fort avec des caractères spéciaux'
428
+ }
429
+ return true
430
+ },
431
+ fieldIdentifier: 'password',
432
+ },
433
+ },
434
+ ]
435
+ </script>
436
+ `,
437
+ },
438
+ ],
439
+ },
440
+ args: {
441
+ modelValue: 'MotDePasse123',
442
+ customWarningRules: [
443
+ {
444
+ type: 'custom',
445
+ options: {
446
+ validate: (value: string) => {
447
+ const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(value)
448
+ if (!hasSpecialChar) {
449
+ return 'Le mot de passe pourrait être plus fort avec des caractères spéciaux'
450
+ }
451
+ return true
452
+ },
453
+ fieldIdentifier: 'password',
454
+ },
455
+ },
456
+ ],
457
+ },
458
+ }
459
+
460
+ /**
461
+ * Champ de mot de passe avec règles de validation qui génèrent un succès.
462
+ */
463
+ export const WithSuccess: Story = {
464
+ parameters: {
465
+ sourceCode: [
466
+ {
467
+ name: 'Template',
468
+ code: `
469
+ <template>
470
+ <PasswordField
471
+ v-model="password"
472
+ label="Mot de passe"
473
+ :custom-success-rules="customSuccessRules"
474
+ />
475
+ </template>
476
+ `,
477
+ },
478
+ {
479
+ name: 'Script',
480
+ code: `
481
+ <script setup lang="ts">
482
+ import { ref } from 'vue'
483
+ import { PasswordField } from '@cnamts/synapse'
484
+
485
+ const password = ref('MotDePasse123!@#')
486
+
487
+ const customSuccessRules = [
488
+ {
489
+ type: 'custom',
490
+ options: {
491
+ validate: (value: string) => {
492
+ const hasUpperCase = /[A-Z]/.test(value)
493
+ const hasLowerCase = /[a-z]/.test(value)
494
+ const hasNumber = /[0-9]/.test(value)
495
+ const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(value)
496
+ const hasMinLength = value.length >= 8
497
+
498
+ if (hasUpperCase && hasLowerCase && hasNumber && hasSpecialChar && hasMinLength) {
499
+ return 'Mot de passe fort'
500
+ }
501
+ return true
502
+ },
503
+ fieldIdentifier: 'password',
504
+ },
505
+ },
506
+ ]
507
+ </script>
508
+ `,
509
+ },
510
+ ],
511
+ },
512
+ args: {
513
+ modelValue: 'MotDePasse123!@#',
514
+ customSuccessRules: [
515
+ {
516
+ type: 'custom',
517
+ options: {
518
+ validate: (value: string) => {
519
+ const hasUpperCase = /[A-Z]/.test(value)
520
+ const hasLowerCase = /[a-z]/.test(value)
521
+ const hasNumber = /[0-9]/.test(value)
522
+ const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(value)
523
+ const isLongEnough = value.length >= 8
206
524
 
207
- const password = ref('')
208
- </script>
209
- `,
525
+ if (hasUpperCase && hasLowerCase && hasNumber && hasSpecialChar && isLongEnough) {
526
+ return 'Mot de passe fort'
527
+ }
528
+ return false
529
+ },
530
+ fieldIdentifier: 'password',
531
+ },
210
532
  },
211
533
  ],
212
534
  },
213
535
  }
536
+
537
+ /**
538
+ * Démonstration des différents types de validation (erreurs, avertissements, succès).
539
+ */
540
+ export const WithValidation: Story = {
541
+ parameters: {
542
+ sourceCode: [
543
+ {
544
+ name: 'Template',
545
+ code: `
546
+ <template>
547
+ <PasswordField
548
+ v-model="password"
549
+ label="Mot de passe"
550
+ :required="true"
551
+ :custom-rules="customRules"
552
+ :custom-warning-rules="customWarningRules"
553
+ :custom-success-rules="customSuccessRules"
554
+ :show-success-messages="true"
555
+ :display-asterisk="true"
556
+ :is-validate-on-blur="false"
557
+ />
558
+ </template>
559
+ `,
560
+ },
561
+ {
562
+ name: 'Script',
563
+ code: `
564
+ <script setup lang="ts">
565
+ import { ref } from 'vue'
566
+ import { PasswordField } from '@cnamts/synapse'
567
+
568
+ const password = ref('')
569
+
570
+ // Règles personnalisées pour la validation du mot de passe
571
+ const customRules = [
572
+ {
573
+ type: 'custom',
574
+ options: {
575
+ validate: (value: string) => {
576
+ if (!value || value.length < 8) {
577
+ return 'Le mot de passe doit contenir au moins 8 caractères'
578
+ }
579
+ return true
580
+ },
581
+ fieldIdentifier: 'password',
582
+ },
583
+ },
584
+ ]
585
+
586
+ const customWarningRules = [
587
+ {
588
+ type: 'custom',
589
+ options: {
590
+ validate: (value: string) => {
591
+ if (!value || !/[!@#$%^&*(),.?":{}|<>]/.test(value)) {
592
+ return 'Le mot de passe pourrait être plus fort avec des caractères spéciaux'
593
+ }
594
+ return true
595
+ },
596
+ fieldIdentifier: 'password',
597
+ },
598
+ },
599
+ ]
600
+
601
+ const customSuccessRules = [
602
+ {
603
+ type: 'custom',
604
+ options: {
605
+ validate: (value: string) => {
606
+ if (value && value.length >= 12
607
+ && /[A-Z]/.test(value)
608
+ && /[0-9]/.test(value)
609
+ && /[!@#$%^&*(),.?":{}|<>]/.test(value)) {
610
+ return 'Mot de passe très sécurisé !'
611
+ }
612
+ return true
613
+ },
614
+ fieldIdentifier: 'password',
615
+ },
616
+ },
617
+ ]
618
+ </script>
619
+ `,
620
+ },
621
+ ],
622
+ },
623
+ render: args => ({
624
+ components: { PasswordField },
625
+ setup() {
626
+ const password = ref('')
627
+
628
+ // Règles personnalisées pour la validation du mot de passe
629
+ const customRules = [
630
+ {
631
+ type: 'custom',
632
+ options: {
633
+ validate: (value: string) => {
634
+ if (!value || value.length < 8) {
635
+ return 'Le mot de passe doit contenir au moins 8 caractères'
636
+ }
637
+ return true
638
+ },
639
+ fieldIdentifier: 'password',
640
+ },
641
+ },
642
+ ]
643
+
644
+ const customWarningRules = [
645
+ {
646
+ type: 'custom',
647
+ options: {
648
+ validate: (value: string) => {
649
+ if (!value || !/[!@#$%^&*(),.?":{}|<>]/.test(value)) {
650
+ return 'Le mot de passe pourrait être plus fort avec des caractères spéciaux'
651
+ }
652
+ return true
653
+ },
654
+ fieldIdentifier: 'password',
655
+ },
656
+ },
657
+ ]
658
+
659
+ const customSuccessRules = [
660
+ {
661
+ type: 'custom',
662
+ options: {
663
+ validate: (value: string) => {
664
+ if (value && value.length >= 12
665
+ && /[A-Z]/.test(value)
666
+ && /[0-9]/.test(value)
667
+ && /[!@#$%^&*(),.?":{}|<>]/.test(value)) {
668
+ return true
669
+ }
670
+ return 'Pas encore un mot de passe fort'
671
+ },
672
+ successMessage: 'Mot de passe très sécurisé !',
673
+ fieldIdentifier: 'password',
674
+ },
675
+ },
676
+ ]
677
+
678
+ return { args, password, customRules, customWarningRules, customSuccessRules }
679
+ },
680
+ template: `
681
+ <div>
682
+ <p class="mb-2">Entrez un mot de passe pour voir les différents types de validation :</p>
683
+ <PasswordField
684
+ v-model="password"
685
+ :variant-style="args.variantStyle"
686
+ :color="args.color"
687
+ label="Mot de passe"
688
+ :required="true"
689
+ :custom-rules="customRules"
690
+ :custom-warning-rules="customWarningRules"
691
+ :custom-success-rules="customSuccessRules"
692
+ :show-success-messages="true"
693
+ :display-asterisk="true"
694
+ :is-validate-on-blur="false"
695
+ />
696
+ <div class="mt-4">
697
+ <p><strong>Conseils pour tester :</strong></p>
698
+ <ul>
699
+ <li>Laissez le champ vide pour voir l'erreur de champ requis</li>
700
+ <li>Entrez moins de 8 caractères pour voir l'erreur de longueur</li>
701
+ <li>Entrez un mot de passe sans caractères spéciaux pour voir l'avertissement</li>
702
+ <li>Entrez un mot de passe fort (12+ caractères avec majuscules, chiffres et caractères spéciaux) pour voir le message de succès</li>
703
+ </ul>
704
+ </div>
705
+ </div>
706
+ `,
707
+ }),
708
+ }
709
+
710
+ /**
711
+ * Champ de mot de passe avec règles de validation personnalisées.
712
+ */
713
+ export const WithCustomRules: Story = {
714
+ parameters: {
715
+ sourceCode: [
716
+ {
717
+ name: 'Template',
718
+ code: `
719
+ <template>
720
+ <PasswordField
721
+ v-model="password"
722
+ label="Mot de passe"
723
+ :custom-rules="customRules"
724
+ />
725
+ </template>
726
+ `,
727
+ },
728
+ {
729
+ name: 'Script',
730
+ code: `
731
+ <script setup lang="ts">
732
+ import { ref } from 'vue'
733
+ import { PasswordField } from '@cnamts/synapse'
734
+
735
+ const password = ref('')
736
+
737
+ // Règles personnalisées pour la validation du mot de passe
738
+ const customRules = [
739
+ {
740
+ type: 'custom',
741
+ options: {
742
+ validate: (value: string) => {
743
+ if (!value || value.length < 8) {
744
+ return 'Le mot de passe doit contenir au moins 8 caractères'
745
+ }
746
+ return true
747
+ },
748
+ fieldIdentifier: 'password',
749
+ },
750
+ },
751
+ {
752
+ type: 'custom',
753
+ options: {
754
+ validate: (value) => {
755
+ if (!value || !/[A-Z]/.test(value)) {
756
+ return 'Le mot de passe doit contenir au moins une lettre majuscule'
757
+ }
758
+ return true
759
+ },
760
+ fieldIdentifier: 'password',
761
+ },
762
+ },
763
+ {
764
+ type: 'custom',
765
+ options: {
766
+ validate: (value) => {
767
+ if (!value || !/[0-9]/.test(value)) {
768
+ return 'Le mot de passe doit contenir au moins un chiffre'
769
+ }
770
+ return true
771
+ },
772
+ fieldIdentifier: 'password',
773
+ },
774
+ },
775
+ ]
776
+ </script>
777
+ `,
778
+ },
779
+ ],
780
+ },
781
+ render: args => ({
782
+ components: { PasswordField },
783
+ setup() {
784
+ const password = ref(args.modelValue)
785
+
786
+ // Règles personnalisées pour la validation du mot de passe
787
+ const customRules = [
788
+ {
789
+ type: 'custom',
790
+ options: {
791
+ validate: (value: string) => {
792
+ if (!value || value.length < 8) {
793
+ return 'Le mot de passe doit contenir au moins 8 caractères'
794
+ }
795
+ return true
796
+ },
797
+ fieldIdentifier: 'password',
798
+ },
799
+ },
800
+ {
801
+ type: 'custom',
802
+ options: {
803
+ validate: (value: string) => {
804
+ if (!value || !/[A-Z]/.test(value)) {
805
+ return 'Le mot de passe doit contenir au moins une lettre majuscule'
806
+ }
807
+ return true
808
+ },
809
+ fieldIdentifier: 'password',
810
+ },
811
+ },
812
+ {
813
+ type: 'custom',
814
+ options: {
815
+ validate: (value: string) => {
816
+ if (!value || !/[0-9]/.test(value)) {
817
+ return 'Le mot de passe doit contenir au moins un chiffre'
818
+ }
819
+ return true
820
+ },
821
+ fieldIdentifier: 'password',
822
+ },
823
+ },
824
+ ]
825
+
826
+ return { args, password, customRules }
827
+ },
828
+ template: `
829
+ <PasswordField
830
+ v-model="password"
831
+ :variant-style="args.variantStyle"
832
+ :color="args.color"
833
+ :label="args.label"
834
+ :required="args.required"
835
+ :is-read-only="args.isReadOnly"
836
+ :is-disabled="args.isDisabled"
837
+ :placeholder="args.placeholder"
838
+ :custom-rules="customRules"
839
+ :show-success-messages="args.showSuccessMessages"
840
+ :display-asterisk="args.displayAsterisk"
841
+ :is-validate-on-blur="args.isValidateOnBlur"
842
+ />
843
+ `,
844
+ }),
845
+ }
846
+
847
+ /**
848
+ * Démonstration de la validation de formulaire avec la méthode validateOnSubmit.
849
+ */
850
+ export const WithFormValidation: Story = {
851
+ parameters: {
852
+ sourceCode: [
853
+ {
854
+ name: 'Template',
855
+ code: `
856
+ <template>
857
+ <form @submit.prevent="handleSubmit">
858
+ <PasswordField
859
+ ref="passwordFieldRef"
860
+ v-model="password"
861
+ label="Mot de passe"
862
+ :required="true"
863
+ :custom-rules="customRules"
864
+ :display-asterisk="true"
865
+ :is-validate-on-blur="false"
866
+ />
867
+ <button
868
+ type="submit"
869
+ class="mt-4 px-4 py-2 bg-primary text-white rounded"
870
+ >
871
+ Valider
872
+ </button>
873
+ </form>
874
+ <div v-if="formStatus" class="mt-4 p-4 rounded" :class="formStatus.includes('succès') ? 'bg-success-lighten5' : 'bg-error-lighten5'">
875
+ {{ formStatus }}
876
+ </div>
877
+ </template>
878
+ `,
879
+ },
880
+ {
881
+ name: 'Script',
882
+ code: `
883
+ <script setup lang="ts">
884
+ import { ref } from 'vue'
885
+ import { PasswordField } from '@cnamts/synapse'
886
+
887
+ const password = ref('')
888
+ const passwordFieldRef = ref(null)
889
+ const formStatus = ref('')
890
+
891
+ // Règles personnalisées pour la validation du mot de passe
892
+ const customRules = [
893
+ {
894
+ type: 'custom',
895
+ options: {
896
+ validate: (value) => {
897
+ if (!value || value.length < 8) {
898
+ return 'Le mot de passe doit contenir au moins 8 caractères'
899
+ }
900
+ return true
901
+ },
902
+ fieldIdentifier: 'password',
903
+ },
904
+ },
905
+ {
906
+ type: 'custom',
907
+ options: {
908
+ validate: (value) => {
909
+ if (!value || !/[A-Z]/.test(value)) {
910
+ return 'Le mot de passe doit contenir au moins une lettre majuscule'
911
+ }
912
+ return true
913
+ },
914
+ fieldIdentifier: 'password',
915
+ },
916
+ },
917
+ ]
918
+
919
+ // Fonction de soumission du formulaire
920
+ const handleSubmit = () => {
921
+ if (passwordFieldRef.value) {
922
+ const isValid = passwordFieldRef.value.validateOnSubmit()
923
+ if (isValid) {
924
+ formStatus.value = 'Formulaire soumis avec succès !'
925
+ } else {
926
+ formStatus.value = 'Erreur de validation, veuillez corriger les champs'
927
+ }
928
+ }
929
+ }
930
+ </script>
931
+ `,
932
+ },
933
+ ],
934
+ },
935
+ render: args => ({
936
+ components: { PasswordField },
937
+ setup() {
938
+ const password = ref('')
939
+ const passwordFieldRef = ref<InstanceType<typeof PasswordField> | null>(null)
940
+ const formStatus = ref('')
941
+
942
+ // Règles personnalisées pour la validation du mot de passe
943
+ const customRules = [
944
+ {
945
+ type: 'custom',
946
+ options: {
947
+ validate: (value: string) => {
948
+ if (!value || value.length < 8) {
949
+ return 'Le mot de passe doit contenir au moins 8 caractères'
950
+ }
951
+ return true
952
+ },
953
+ fieldIdentifier: 'password',
954
+ },
955
+ },
956
+ {
957
+ type: 'custom',
958
+ options: {
959
+ validate: (value: string) => {
960
+ if (!value || !/[A-Z]/.test(value)) {
961
+ return 'Le mot de passe doit contenir au moins une lettre majuscule'
962
+ }
963
+ return true
964
+ },
965
+ fieldIdentifier: 'password',
966
+ },
967
+ },
968
+ ]
969
+
970
+ // Fonction de soumission du formulaire
971
+ const handleSubmit = () => {
972
+ if (passwordFieldRef.value) {
973
+ const isValid = passwordFieldRef.value.validateOnSubmit()
974
+ if (isValid) {
975
+ formStatus.value = 'Formulaire soumis avec succès !'
976
+ }
977
+ else {
978
+ formStatus.value = 'Erreur de validation, veuillez corriger les champs'
979
+ }
980
+ }
981
+ }
982
+
983
+ return { args, password, passwordFieldRef, customRules, handleSubmit, formStatus }
984
+ },
985
+ template: `
986
+ <div>
987
+ <form @submit.prevent="handleSubmit" class="mb-4">
988
+ <PasswordField
989
+ ref="passwordFieldRef"
990
+ v-model="password"
991
+ :variant-style="args.variantStyle"
992
+ :color="args.color"
993
+ label="Mot de passe"
994
+ :required="true"
995
+ :custom-rules="customRules"
996
+ :display-asterisk="true"
997
+ :is-validate-on-blur="false"
998
+ />
999
+ <button
1000
+ type="submit"
1001
+ class="mt-4 px-4 py-2 bg-primary text-white rounded"
1002
+ >
1003
+ Valider
1004
+ </button>
1005
+ </form>
1006
+ <div v-if="formStatus" class="mt-4 p-4 rounded" :class="formStatus.includes('succès') ? 'bg-success-lighten5' : 'bg-error-lighten5'">
1007
+ {{ formStatus }}
1008
+ </div>
1009
+ <div class="mt-4">
1010
+ <p><strong>Instructions :</strong></p>
1011
+ <p>Ce formulaire utilise la méthode <code>validateOnSubmit()</code> pour valider le champ lors de la soumission.</p>
1012
+ <p>La validation ne se fait pas à la perte de focus (<code>isValidateOnBlur="false"</code>) mais uniquement lors du clic sur le bouton.</p>
1013
+ </div>
1014
+ </div>
1015
+ `,
1016
+ }),
1017
+ }
1018
+
1019
+ export const WithoutSuccessMessages: Story = {
1020
+ parameters: {
1021
+ docs: {
1022
+ description: {
1023
+ story: `
1024
+ ### Messages de succès
1025
+
1026
+ Cette story illustre l'utilisation de la propriété \`showSuccessMessages\` qui permet de contrôler
1027
+ l'affichage des messages de succès lors de la validation. Par défaut, cette propriété est à \`true\`.
1028
+
1029
+ Cela peut être utile pour réduire la verbosité de l'interface lorsque les messages de succès
1030
+ ne sont pas nécessaires dans certains contextes.
1031
+ `,
1032
+ },
1033
+ },
1034
+ sourceCode: [
1035
+ {
1036
+ name: 'Template',
1037
+ code: `<template>
1038
+ <!-- Champ avec messages de succès (par défaut) -->
1039
+ <PasswordField
1040
+ v-model="value1"
1041
+ label="Mot de passe avec messages de succès"
1042
+ required
1043
+ />
1044
+
1045
+ <!-- Champ sans messages de succès -->
1046
+ <PasswordField
1047
+ v-model="value2"
1048
+ label="Mot de passe sans messages de succès"
1049
+ required
1050
+ :showSuccessMessages="false"
1051
+ />
1052
+ </template>`,
1053
+ },
1054
+ ],
1055
+ },
1056
+ render: () => ({
1057
+ components: { PasswordField },
1058
+ setup() {
1059
+ const value1 = ref('P@ssw0rd123')
1060
+ const value2 = ref('P@ssw0rd123')
1061
+
1062
+ return { value1, value2 }
1063
+ },
1064
+ template: `
1065
+ <div>
1066
+ <p class="mb-4">Cette démonstration compare un PasswordField avec <code>showSuccessMessages=true</code> (par défaut) et un avec <code>showSuccessMessages=false</code>.</p>
1067
+
1068
+ <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-bottom: 16px;">
1069
+ <div>
1070
+ <p class="text-subtitle-2 mb-2">Avec messages de succès</p>
1071
+ <PasswordField
1072
+ v-model="value1"
1073
+ label="Mot de passe avec messages de succès"
1074
+ required
1075
+ showSuccessMessages
1076
+ />
1077
+ </div>
1078
+
1079
+ <div>
1080
+ <p class="text-subtitle-2 mb-2">Sans messages de succès</p>
1081
+ <PasswordField
1082
+ v-model="value2"
1083
+ label="Mot de passe sans messages de succès"
1084
+ required
1085
+ :showSuccessMessages="false"
1086
+ />
1087
+ </div>
1088
+ </div>
1089
+
1090
+ <div class="mt-4 text-body-2">
1091
+ <p>Observations :</p>
1092
+ <ul>
1093
+ <li class="ml-4">Les deux champs ont la même valeur valide</li>
1094
+ <li class="ml-4">Le champ de gauche affiche un message de succès et un indicateur visuel vert</li>
1095
+ <li class="ml-4">Le champ de droite n'affiche pas de message de succès, mais conserve l'indicateur visuel</li>
1096
+ <li class="ml-4">Essayez de modifier les valeurs puis de les rendre à nouveau valides</li>
1097
+ </ul>
1098
+ </div>
1099
+ </div>
1100
+ `,
1101
+ }),
1102
+ }
1103
+
1104
+ export const DisableErrorHandling: Story = {
1105
+ parameters: {
1106
+ docs: {
1107
+ description: {
1108
+ story: `
1109
+ ### Désactivation de la gestion des erreurs
1110
+
1111
+ Cette story illustre l'utilisation de la propriété \`disableErrorHandling\` qui permet de désactiver complètement
1112
+ la gestion et l'affichage des erreurs dans un champ, même si des règles de validation sont définies.
1113
+
1114
+ Cela peut être utile dans des cas particuliers où vous souhaitez définir des règles de validation
1115
+ mais gérer leur affichage différemment, ou utiliser la validation uniquement au niveau du formulaire parent.
1116
+ `,
1117
+ },
1118
+ },
1119
+ sourceCode: [
1120
+ {
1121
+ name: 'Template',
1122
+ code: `<template>
1123
+ <!-- Champ avec validation normale -->
1124
+ <PasswordField
1125
+ v-model="value1"
1126
+ label="Mot de passe avec validation"
1127
+ required
1128
+ :custom-rules="customRules"
1129
+ />
1130
+
1131
+ <!-- Champ avec gestion d'erreurs désactivée -->
1132
+ <PasswordField
1133
+ v-model="value2"
1134
+ label="Mot de passe sans gestion d'erreurs"
1135
+ required
1136
+ disableErrorHandling
1137
+ :custom-rules="customRules"
1138
+ />
1139
+ </template>`,
1140
+ },
1141
+ ],
1142
+ },
1143
+ render: () => ({
1144
+ components: { PasswordField },
1145
+ setup() {
1146
+ const value1 = ref('')
1147
+ const value2 = ref('')
1148
+
1149
+ const customRules = [
1150
+ {
1151
+ type: 'custom',
1152
+ options: {
1153
+ validate: (value: string) => {
1154
+ if (!value || value.length < 8) {
1155
+ return 'Le mot de passe doit contenir au moins 8 caractères'
1156
+ }
1157
+ return true
1158
+ },
1159
+ fieldIdentifier: 'password',
1160
+ },
1161
+ },
1162
+ ]
1163
+
1164
+ return { value1, value2, customRules }
1165
+ },
1166
+ template: `
1167
+ <div>
1168
+ <p class="mb-4">Cette démonstration compare un PasswordField standard et un avec \`disableErrorHandling=true\`.</p>
1169
+
1170
+ <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-bottom: 16px;">
1171
+ <div>
1172
+ <p class="text-subtitle-2 mb-2">Validation normale</p>
1173
+ <PasswordField
1174
+ v-model="value1"
1175
+ label="Mot de passe avec validation"
1176
+ required
1177
+ :custom-rules="customRules"
1178
+ />
1179
+ </div>
1180
+
1181
+ <div>
1182
+ <p class="text-subtitle-2 mb-2">Sans gestion d'erreurs</p>
1183
+ <PasswordField
1184
+ v-model="value2"
1185
+ label="Mot de passe sans gestion d'erreurs"
1186
+ required
1187
+ disableErrorHandling
1188
+ :custom-rules="customRules"
1189
+ />
1190
+ </div>
1191
+ </div>
1192
+
1193
+ <div class="mt-4 text-body-2">
1194
+ <p>Instructions :</p>
1195
+ <ol>
1196
+ <li class="ml-4">Cliquez dans un champ puis en dehors pour déclencher la validation</li>
1197
+ <li class="ml-4">Le champ de gauche affichera une erreur requise, mais pas celui de droite</li>
1198
+ <li class="ml-4">Vous pouvez également essayer de soumettre les deux champs pour voir la différence de comportement</li>
1199
+ </ol>
1200
+ </div>
1201
+ </div>
1202
+ `,
1203
+ }),
1204
+ }