@cnamts/synapse 0.0.12-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 (250) hide show
  1. package/dist/design-system-v3.js +4913 -4021
  2. package/dist/design-system-v3.umd.cjs +1 -1
  3. package/dist/src/components/Amelipro/types/types.d.ts +30 -57
  4. package/dist/src/components/Customs/SyTextField/SyTextField.d.ts +2 -0
  5. package/dist/src/components/DatePicker/DatePicker.d.ts +36 -44
  6. package/dist/src/components/DatePicker/DateTextInput.d.ts +33 -36
  7. package/dist/src/components/FilterInline/AccessibiliteItems.d.ts +30 -0
  8. package/dist/src/components/FilterInline/constants/ExpertiseLevelEnum.d.ts +4 -0
  9. package/dist/src/components/FilterSideBar/AccessibiliteItems.d.ts +29 -0
  10. package/dist/src/components/FilterSideBar/constants/ExpertiseLevelEnum.d.ts +4 -0
  11. package/dist/src/components/NirField/NirField.d.ts +14 -2
  12. package/dist/src/components/NotificationBar/NotificationBar.d.ts +5 -5
  13. package/dist/src/components/PasswordField/PasswordField.d.ts +2 -0
  14. package/dist/src/components/PeriodField/PeriodField.d.ts +159 -157
  15. package/dist/src/components/PhoneField/PhoneField.d.ts +22 -1
  16. package/dist/src/components/UploadWorkflow/AccessibiliteItems.d.ts +29 -0
  17. package/dist/src/components/UploadWorkflow/constants/ExpertiseLevelEnum.d.ts +4 -0
  18. package/dist/src/components/Usages/Usages.d.ts +10 -0
  19. package/dist/src/components/index.d.ts +3 -0
  20. package/dist/src/composables/date/tests/useDatePickerAccessibility.spec.d.ts +1 -0
  21. package/dist/src/composables/date/useDateFormat.d.ts +26 -0
  22. package/dist/src/composables/date/useDateInitialization.d.ts +18 -0
  23. package/dist/src/composables/date/useDatePickerAccessibility.d.ts +8 -0
  24. package/dist/src/composables/useFilterable/useFilterable.d.ts +1 -1
  25. package/dist/src/composables/validation/useValidation.d.ts +1 -0
  26. package/dist/src/main.d.ts +1 -0
  27. package/dist/src/utils/formatDate/index.d.ts +3 -0
  28. package/dist/src/utils/formatDate/tests/formatDate.spec.d.ts +1 -0
  29. package/dist/src/utils/functions/validation/isDateAfter/index.d.ts +2 -0
  30. package/dist/src/utils/functions/validation/isDateAfter/tests/isDateAfter.spec.d.ts +1 -0
  31. package/dist/src/utils/functions/validation/isDateBefore/index.d.ts +2 -0
  32. package/dist/src/utils/functions/validation/isDateBefore/tests/isDateBefore.spec.d.ts +1 -0
  33. package/dist/src/utils/functions/validation/isDateInRange/index.d.ts +3 -0
  34. package/dist/src/utils/functions/validation/isDateInRange/tests/isDateInRange.spec.d.ts +1 -0
  35. package/dist/src/utils/functions/validation/isDateValid/index.d.ts +9 -0
  36. package/dist/src/utils/functions/validation/isDateValid/tests/isDateValid.spec.d.ts +1 -0
  37. package/dist/src/utils/functions/validation/isEmailValid/tests/isEmailValid.spec.d.ts +1 -0
  38. package/dist/src/utils/functions/validation/isWeekend/index.d.ts +3 -0
  39. package/dist/src/utils/functions/validation/isWeekend/tests/isWeekend.spec.d.ts +1 -0
  40. package/dist/src/utils/parseDate/index.d.ts +3 -0
  41. package/dist/src/utils/parseDate/tests/parseDate.spec.d.ts +1 -0
  42. package/dist/src/utils/rules/doMatchPattern/index.d.ts +3 -0
  43. package/dist/src/utils/rules/doMatchPattern/tests/matchPattern.spec.d.ts +1 -0
  44. package/dist/src/utils/rules/index.d.ts +11 -0
  45. package/dist/src/utils/rules/isDateValid/index.d.ts +4 -0
  46. package/dist/src/utils/rules/isDateValid/tests/isDateValid.spec.d.ts +1 -0
  47. package/dist/src/utils/rules/isExactLength/index.d.ts +3 -0
  48. package/dist/src/utils/rules/isExactLength/locales.d.ts +2 -0
  49. package/dist/src/utils/rules/isExactLength/tests/exactLength.spec.d.ts +1 -0
  50. package/dist/src/utils/rules/isMaxLength/index.d.ts +3 -0
  51. package/dist/src/utils/rules/isMaxLength/locales.d.ts +2 -0
  52. package/dist/src/utils/rules/isMaxLength/tests/isMaxLength.spec.d.ts +1 -0
  53. package/dist/src/utils/rules/isMinLength/index.d.ts +3 -0
  54. package/dist/src/utils/rules/isMinLength/locales.d.ts +2 -0
  55. package/dist/src/utils/rules/isMinLength/tests/isMinLength.spec.d.ts +1 -0
  56. package/dist/src/utils/rules/isNotAfterDate/index.d.ts +3 -0
  57. package/dist/src/utils/rules/isNotAfterDate/tests/isNotAfterDate.spec.d.ts +1 -0
  58. package/dist/src/utils/rules/isNotAfterToday/index.d.ts +4 -0
  59. package/dist/src/utils/rules/isNotAfterToday/locales.d.ts +2 -0
  60. package/dist/src/utils/rules/isNotAfterToday/tests/isNotAfterToday.spec.d.ts +1 -0
  61. package/dist/src/utils/rules/isNotBeforeDate/index.d.ts +3 -0
  62. package/dist/src/utils/rules/isNotBeforeDate/locales.d.ts +2 -0
  63. package/dist/src/utils/rules/isNotBeforeDate/tests/IsNotBeforeDate.spec.d.ts +1 -0
  64. package/dist/src/utils/rules/isNotBeforeToday/index.d.ts +4 -0
  65. package/dist/src/utils/rules/isNotBeforeToday/locales.d.ts +2 -0
  66. package/dist/src/utils/rules/isNotBeforeToday/tests/notBeforeToday.spec.d.ts +1 -0
  67. package/dist/src/utils/rules/isRequired/index.d.ts +4 -0
  68. package/dist/src/utils/rules/isRequired/locales.d.ts +2 -0
  69. package/dist/src/utils/rules/isRequired/tests/isRequred.spec.d.ts +1 -0
  70. package/dist/src/utils/rules/isValidEmail/index.d.ts +4 -0
  71. package/dist/src/utils/rules/isValidEmail/locales.d.ts +2 -0
  72. package/dist/src/utils/rules/isValidEmail/tests/isValidEmail.spec.d.ts +1 -0
  73. package/dist/style.css +1 -1
  74. package/package.json +3 -1
  75. package/src/assets/_radius.scss +12 -6
  76. package/src/assets/settings.scss +8 -0
  77. package/src/components/Amelipro/types/types.ts +40 -0
  78. package/src/components/ChipList/ChipList.stories.ts +26 -27
  79. package/src/components/ChipList/ChipList.vue +5 -1
  80. package/src/components/ChipList/config.ts +1 -0
  81. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -2
  82. package/src/components/Customs/SyBtnSelect/SyBtnSelect.mdx +1 -1
  83. package/src/components/Customs/SyInputSelect/SyInputSelect.mdx +1 -1
  84. package/src/components/Customs/SySelect/SySelect.mdx +1 -1
  85. package/src/components/Customs/SySelect/SySelect.vue +19 -4
  86. package/src/components/Customs/SyTextField/SyTextField.mdx +2 -2
  87. package/src/components/Customs/SyTextField/SyTextField.stories.ts +239 -0
  88. package/src/components/Customs/SyTextField/SyTextField.vue +3 -0
  89. package/src/components/DatePicker/DatePicker.stories.ts +177 -5
  90. package/src/components/DatePicker/DatePicker.vue +148 -347
  91. package/src/components/DatePicker/DateTextInput.vue +91 -251
  92. package/src/components/DatePicker/tests/DatePicker.spec.ts +118 -48
  93. package/src/components/DatePicker/tests/DateTextInput.spec.ts +202 -6
  94. package/src/components/FileList/Accessibilite.stories.ts +1 -1
  95. package/src/components/FileList/AccessibiliteItems.ts +22 -0
  96. package/src/components/FileUpload/FileUpload.stories.ts +9 -7
  97. package/src/components/FilterInline/Accessibilite.mdx +14 -0
  98. package/src/components/FilterInline/Accessibilite.stories.ts +216 -0
  99. package/src/components/FilterInline/AccessibiliteItems.ts +132 -0
  100. package/src/components/FilterInline/constants/ExpertiseLevelEnum.ts +4 -0
  101. package/src/components/FilterSideBar/Accessibilite.mdx +14 -0
  102. package/src/components/FilterSideBar/Accessibilite.stories.ts +216 -0
  103. package/src/components/FilterSideBar/AccessibiliteItems.ts +153 -0
  104. package/src/components/FilterSideBar/constants/ExpertiseLevelEnum.ts +4 -0
  105. package/src/components/NirField/NirField.stories.ts +165 -0
  106. package/src/components/NirField/NirField.vue +6 -2
  107. package/src/components/NirField/tests/config.spec.ts +65 -0
  108. package/src/components/NotificationBar/NotificationBar.mdx +2 -2
  109. package/src/components/NotificationBar/NotificationBar.stories.ts +59 -11
  110. package/src/components/NotificationBar/NotificationBar.vue +42 -114
  111. package/src/components/NotificationBar/tests/NotificationBar.spec.ts +28 -33
  112. package/src/components/NotificationBar/tests/__snapshots__/NotificationBar.spec.ts.snap +1 -1
  113. package/src/components/PaginatedTable/PaginatedTable.vue +6 -10
  114. package/src/components/PaginatedTable/tests/__snapshots__/PaginatedTable.spec.ts.snap +4 -4
  115. package/src/components/PasswordField/PasswordField.stories.ts +191 -4
  116. package/src/components/PasswordField/PasswordField.vue +3 -0
  117. package/src/components/PeriodField/PeriodField.stories.ts +214 -118
  118. package/src/components/PeriodField/PeriodField.vue +195 -148
  119. package/src/components/PeriodField/tests/PeriodField.spec.ts +146 -0
  120. package/src/components/PhoneField/PhoneField.stories.ts +101 -0
  121. package/src/components/PhoneField/PhoneField.vue +73 -17
  122. package/src/components/PhoneField/tests/PhoneField.spec.ts +40 -0
  123. package/src/components/RatingPicker/RatingPicker.stories.ts +7 -7
  124. package/src/components/SearchListField/SearchListField.stories.ts +1 -1
  125. package/src/components/UploadWorkflow/Accessibilite.mdx +14 -0
  126. package/src/components/UploadWorkflow/Accessibilite.stories.ts +216 -0
  127. package/src/components/UploadWorkflow/AccessibiliteItems.ts +192 -0
  128. package/src/components/UploadWorkflow/UploadWorkflow.vue +2 -2
  129. package/src/components/UploadWorkflow/constants/ExpertiseLevelEnum.ts +4 -0
  130. package/src/components/Usages/tests/Usages.spec.ts +183 -0
  131. package/src/components/index.ts +3 -0
  132. package/src/composables/date/tests/useDateFormat.spec.ts +67 -0
  133. package/src/composables/date/tests/useDateInitialization.spec.ts +89 -0
  134. package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +102 -0
  135. package/src/composables/date/useDateFormat.ts +94 -0
  136. package/src/composables/date/useDateInitialization.ts +92 -0
  137. package/src/composables/date/useDatePickerAccessibility.ts +78 -0
  138. package/src/composables/rules/tests/useFieldValidation.spec.ts +385 -4
  139. package/src/composables/useFilterable/useFilterable.ts +5 -4
  140. package/src/composables/validation/useValidation.ts +15 -0
  141. package/src/main.ts +1 -0
  142. package/src/stories/Accessibilite/Aculturation/AuditDesignSystem.mdx +28 -0
  143. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +2 -2
  144. package/src/stories/Accessibilite/Audit/RGAA.mdx +6 -6
  145. package/src/stories/Accessibilite/Introduction.mdx +2 -1
  146. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +1 -1
  147. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +1 -1
  148. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +8 -11
  149. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +77 -0
  150. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru.mdx +9 -3
  151. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +2 -2
  152. package/src/stories/Demarrer/Introduction.stories.ts +3 -3
  153. package/src/stories/Demarrer/Releases.mdx +8 -0
  154. package/src/stories/Demarrer/Releases.stories.ts +66 -0
  155. package/src/stories/DesignTokens/Conteneurs.stories.ts +3 -3
  156. package/src/stories/GuideDuDev/LesBreackingChanges.mdx +36 -0
  157. package/src/stories/GuideDuDev/UtiliserLesRules.mdx +2 -2
  158. package/src/utils/formatDate/index.ts +6 -0
  159. package/src/utils/formatDate/tests/formatDate.spec.ts +18 -0
  160. package/src/utils/functions/validation/isDateAfter/index.ts +9 -0
  161. package/src/utils/functions/validation/isDateAfter/tests/isDateAfter.spec.ts +18 -0
  162. package/src/utils/functions/validation/isDateBefore/index.ts +9 -0
  163. package/src/utils/functions/validation/isDateBefore/tests/isDateBefore.spec.ts +23 -0
  164. package/src/utils/functions/validation/isDateInRange/index.ts +22 -0
  165. package/src/utils/functions/validation/isDateInRange/tests/isDateInRange.spec.ts +28 -0
  166. package/src/utils/functions/validation/isDateValid/index.ts +67 -0
  167. package/src/utils/functions/validation/isDateValid/tests/isDateValid.spec.ts +46 -0
  168. package/src/utils/functions/validation/isEmailValid/index.ts +9 -0
  169. package/src/utils/functions/validation/isWeekend/index.ts +10 -0
  170. package/src/utils/functions/validation/isWeekend/tests/isWeekend.spec.ts +16 -0
  171. package/src/utils/parseDate/index.ts +29 -0
  172. package/src/utils/parseDate/tests/parseDate.spec.ts +52 -0
  173. package/src/utils/rules/Rules.mdx +16 -0
  174. package/src/utils/rules/doMatchPattern/DoMachPattern.mdx +66 -0
  175. package/src/utils/rules/doMatchPattern/DoMatchPattern.stories.ts +106 -0
  176. package/src/utils/rules/doMatchPattern/index.ts +28 -0
  177. package/src/utils/rules/doMatchPattern/locales.ts +5 -0
  178. package/src/utils/rules/doMatchPattern/tests/matchPattern.spec.ts +38 -0
  179. package/src/utils/rules/index.ts +11 -0
  180. package/src/utils/rules/isDateValid/IsDateValid.mdx +87 -0
  181. package/src/utils/rules/isDateValid/IsDateValid.stories.ts +113 -0
  182. package/src/utils/rules/isDateValid/index.ts +32 -0
  183. package/src/utils/rules/isDateValid/locales.ts +10 -0
  184. package/src/utils/rules/isDateValid/tests/isDateValid.spec.ts +27 -0
  185. package/src/utils/rules/isExactLength/IsExactLenght.mdx +68 -0
  186. package/src/utils/rules/isExactLength/IsExactLength.stories.ts +151 -0
  187. package/src/utils/rules/{exactLength → isExactLength}/index.ts +2 -4
  188. package/src/utils/rules/isExactLength/tests/exactLength.spec.ts +48 -0
  189. package/src/utils/rules/isMaxLength/IsMaxLength.mdx +68 -0
  190. package/src/utils/rules/isMaxLength/IsMaxLength.stories.ts +152 -0
  191. package/src/utils/rules/isMaxLength/index.ts +30 -0
  192. package/src/utils/rules/isMaxLength/locales.ts +6 -0
  193. package/src/utils/rules/isMaxLength/tests/isMaxLength.spec.ts +42 -0
  194. package/src/utils/rules/isMinLength/IsMinLength.mdx +68 -0
  195. package/src/utils/rules/isMinLength/IsMinLength.stories.ts +152 -0
  196. package/src/utils/rules/isMinLength/index.ts +30 -0
  197. package/src/utils/rules/isMinLength/locales.ts +6 -0
  198. package/src/utils/rules/isMinLength/tests/isMinLength.spec.ts +42 -0
  199. package/src/utils/rules/isNotAfterDate/IsNotAfterDate.mdx +68 -0
  200. package/src/utils/rules/isNotAfterDate/IsNotAfterDate.stories.ts +109 -0
  201. package/src/utils/rules/isNotAfterDate/index.ts +25 -0
  202. package/src/utils/rules/isNotAfterDate/locales.ts +6 -0
  203. package/src/utils/rules/isNotAfterDate/tests/isNotAfterDate.spec.ts +25 -0
  204. package/src/utils/rules/isNotAfterToday/IsNotAfterToday.mdx +83 -0
  205. package/src/utils/rules/isNotAfterToday/IsNotAfterToday.stories.ts +110 -0
  206. package/src/utils/rules/isNotAfterToday/index.ts +28 -0
  207. package/src/utils/rules/isNotAfterToday/locales.ts +5 -0
  208. package/src/utils/rules/isNotAfterToday/tests/isNotAfterToday.spec.ts +30 -0
  209. package/src/utils/rules/isNotBeforeDate/IsNotBeforeDate.mdx +68 -0
  210. package/src/utils/rules/isNotBeforeDate/IsNotBeforeDate.stories.ts +114 -0
  211. package/src/utils/rules/isNotBeforeDate/index.ts +25 -0
  212. package/src/utils/rules/isNotBeforeDate/locales.ts +6 -0
  213. package/src/utils/rules/isNotBeforeDate/tests/IsNotBeforeDate.spec.ts +25 -0
  214. package/src/utils/rules/isNotBeforeToday/IsNotBeforeToday.mdx +83 -0
  215. package/src/utils/rules/isNotBeforeToday/IsNotBeforeToday.stories.ts +110 -0
  216. package/src/utils/rules/isNotBeforeToday/index.ts +28 -0
  217. package/src/utils/rules/isNotBeforeToday/locales.ts +5 -0
  218. package/src/utils/rules/isNotBeforeToday/tests/notBeforeToday.spec.ts +36 -0
  219. package/src/utils/rules/isRequired/IsRequired.mdx +81 -0
  220. package/src/utils/rules/isRequired/IsRequired.stories.ts +101 -0
  221. package/src/utils/rules/{required → isRequired}/index.ts +3 -3
  222. package/src/utils/rules/{required/tests/index.spec.ts → isRequired/tests/isRequred.spec.ts} +9 -9
  223. package/src/utils/rules/isValidEmail/IsValidEmail.mdx +81 -0
  224. package/src/utils/rules/isValidEmail/IsValidEmail.stories.ts +101 -0
  225. package/src/utils/rules/{email → isValidEmail}/index.ts +3 -5
  226. package/src/utils/rules/{email/tests/email.spec.ts → isValidEmail/tests/isValidEmail.spec.ts} +5 -5
  227. package/dist/src/components/Amelipro/types/languages.d.ts +0 -6
  228. package/dist/src/utils/rules/email/index.d.ts +0 -4
  229. package/dist/src/utils/rules/exactLength/index.d.ts +0 -4
  230. package/dist/src/utils/rules/required/index.d.ts +0 -4
  231. package/dist/src/utils/rules/required/ruleMessageHelper.d.ts +0 -3
  232. package/src/components/Amelipro/types/languages.d.ts +0 -6
  233. package/src/components/Amelipro/types/types.d.ts +0 -65
  234. package/src/components/Customs/SyTextField/tests/__snapshots__/SyTextField.spec.ts.snap +0 -58
  235. package/src/utils/functions/isEmailValid/index.ts +0 -8
  236. package/src/utils/rules/required/ruleMessageHelper.ts +0 -14
  237. package/src/utils/rules/required/tests/rulesMessageHelper.spec.ts +0 -22
  238. /package/dist/src/{utils/functions/isEmailValid/tests/isEmailValid.spec.d.ts → components/NirField/tests/config.spec.d.ts} +0 -0
  239. /package/dist/src/{utils/rules/email/tests/email.spec.d.ts → components/Usages/tests/Usages.spec.d.ts} +0 -0
  240. /package/dist/src/{utils/rules/required/tests/index.spec.d.ts → composables/date/tests/useDateFormat.spec.d.ts} +0 -0
  241. /package/dist/src/{utils/rules/required/tests/rulesMessageHelper.spec.d.ts → composables/date/tests/useDateInitialization.spec.d.ts} +0 -0
  242. /package/dist/src/utils/functions/{isEmailValid → validation/isEmailValid}/index.d.ts +0 -0
  243. /package/dist/src/utils/rules/{exactLength → doMatchPattern}/locales.d.ts +0 -0
  244. /package/dist/src/utils/rules/{email → isDateValid}/locales.d.ts +0 -0
  245. /package/dist/src/utils/rules/{required → isNotAfterDate}/locales.d.ts +0 -0
  246. /package/src/components/NirField/{tests → examples}//342/200/257dataset/342/200/257.md" +0 -0
  247. /package/src/utils/functions/{isEmailValid → validation/isEmailValid}/tests/isEmailValid.spec.ts +0 -0
  248. /package/src/utils/rules/{exactLength → isExactLength}/locales.ts +0 -0
  249. /package/src/utils/rules/{required → isRequired}/locales.ts +0 -0
  250. /package/src/utils/rules/{email → isValidEmail}/locales.ts +0 -0
@@ -3,11 +3,14 @@
3
3
  import SyTextField from '@/components/Customs/SyTextField/SyTextField.vue'
4
4
  import DateTextInput from './DateTextInput.vue'
5
5
  import { VDatePicker } from 'vuetify/components'
6
- import { useFieldValidation } from '@/composables/rules/useFieldValidation'
7
- import type { RuleOptions } from '@/composables/rules/useFieldValidation'
6
+ import { useValidation } from '@/composables/validation/useValidation'
7
+ import { useDateFormat } from '@/composables/date/useDateFormat'
8
+ import { useDateInitialization, type DateValue, type DateInput } from '@/composables/date/useDateInitialization'
9
+ import { useDatePickerAccessibility } from '@/composables/date/useDatePickerAccessibility'
8
10
 
9
- type DateValue = string | [string, string] | null
10
- type DateInput = string | string[] | null | object
11
+ const { parseDate, formatDate } = useDateFormat()
12
+ const { initializeSelectedDates } = useDateInitialization()
13
+ const { updateAccessibility } = useDatePickerAccessibility()
11
14
 
12
15
  const props = withDefaults(defineProps<{
13
16
  modelValue?: DateInput
@@ -21,14 +24,18 @@
21
24
  displayIcon?: boolean
22
25
  displayAppendIcon?: boolean
23
26
  displayPrependIcon?: boolean
24
- customRules?: { type: string, options: RuleOptions }[]
25
- customWarningRules?: { type: string, options: RuleOptions }[]
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- mock Axios headers
28
+ customRules?: { type: string, options: any }[]
29
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- mock Axios headers
30
+ customWarningRules?: { type: string, options: any }[]
26
31
  isDisabled?: boolean
27
32
  noIcon?: boolean
28
33
  noCalendar?: boolean
29
34
  isOutlined?: boolean
30
35
  isReadOnly?: boolean
31
36
  width?: string
37
+ disableErrorHandling?: boolean
38
+ showSuccessMessages?: boolean
32
39
  }>(), {
33
40
  modelValue: undefined,
34
41
  placeholder: 'Sélectionner une date',
@@ -49,6 +56,8 @@
49
56
  isOutlined: true,
50
57
  isReadOnly: false,
51
58
  width: '100%',
59
+ disableErrorHandling: false,
60
+ showSuccessMessages: true,
52
61
  })
53
62
 
54
63
  const emit = defineEmits<{
@@ -58,120 +67,23 @@
58
67
  (e: 'blur'): void
59
68
  }>()
60
69
 
61
- // Fonction pour parser les dates selon le format spécifié
62
- const parseDate = (dateString: string, format: string = props.format): Date | null => {
63
- if (!dateString) return null
64
-
65
- // Créer un mapping des positions des éléments de date selon le format
66
- const separator = format.includes('/') ? '/' : format.includes('-') ? '-' : '.'
67
- const parts = format.split(separator)
68
- const dateParts = dateString.split(separator)
69
-
70
- if (parts.length !== dateParts.length) return null
71
-
72
- let day = 0, month = 0, year = 0
73
-
74
- // Extraire les valeurs selon leur position dans le format
75
- parts.forEach((part, index) => {
76
- const value = parseInt(dateParts[index], 10)
77
- if (isNaN(value)) return
78
-
79
- if (part.includes('DD') || part.includes('D')) day = value
80
- else if (part.includes('MM') || part.includes('M')) month = value - 1 // Les mois en JS sont 0-indexés
81
- else if (part.includes('YYYY')) year = value
82
- else if (part.includes('YY')) {
83
- // Gestion intelligente des années à 2 chiffres
84
- // Si l'année est < 50, on considère qu'elle est dans le 21ème siècle
85
- // Sinon, elle est dans le 20ème siècle
86
- year = value < 50 ? 2000 + value : 1900 + value
87
- }
88
- })
89
-
90
- // Vérifier que nous avons toutes les parties nécessaires et qu'elles sont dans des plages valides
91
- if (day < 1 || day > 31 || month < 0 || month > 11 || year < 1000 || year > 9999) return null
92
-
93
- // Créer la date à midi (12:00) pour éviter les problèmes de décalage de fuseau horaire
94
- // Cela garantit que la date reste la même lors de la conversion en UTC
95
- const date = new Date(year, month, day, 12, 0, 0)
96
-
97
- // Vérifier que la date est valide (par exemple, 31 février n'existe pas)
98
- if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) return null
99
-
100
- return date
101
- }
102
-
103
- function initializeSelectedDates(
104
- modelValue: DateInput | null,
105
- ): Date | Date[] | null {
106
- if (!modelValue) return null
107
-
108
- // Déterminer le format à utiliser pour l'analyse
109
- const parseFormat = props.dateFormatReturn || props.format
110
-
111
- if (Array.isArray(modelValue)) {
112
- if (modelValue.length >= 2) {
113
- // Essayer d'abord avec le format de retour, puis avec le format d'affichage
114
- let dates = [parseDate(modelValue[0], parseFormat), parseDate(modelValue[1], parseFormat)]
115
-
116
- // Si l'une des dates est invalide avec le format de retour, essayer avec le format d'affichage
117
- if (dates.some(date => date === null) && props.dateFormatReturn) {
118
- dates = [parseDate(modelValue[0], props.format), parseDate(modelValue[1], props.format)]
119
- }
120
-
121
- // Vérifie si l'une des dates est toujours invalide
122
- if (dates.some(date => date === null)) {
123
- return []
124
- }
125
-
126
- // Vérifie si la première date est après la seconde
127
- if (dates[0] && dates[1] && dates[0] > dates[1]) {
128
- return []
129
- }
130
-
131
- // Filtrer les dates nulles et convertir en tableau de Date
132
- return dates.filter((date): date is Date => date !== null)
133
- }
134
-
135
- if (modelValue.length === 1) {
136
- // Essayer d'abord avec le format de retour, puis avec le format d'affichage
137
- let date = parseDate(modelValue[0], parseFormat)
138
-
139
- // Si la date est invalide avec le format de retour, essayer avec le format d'affichage
140
- if (date === null && props.dateFormatReturn) {
141
- date = parseDate(modelValue[0], props.format)
142
- }
143
-
144
- return date === null ? [] : [date]
145
- }
146
-
147
- return []
148
- }
149
-
150
- // Si modelValue est un objet, on le convertit en chaîne
151
- if (typeof modelValue === 'object') {
152
- return null
153
- }
154
-
155
- // Essayer d'abord avec le format de retour, puis avec le format d'affichage
156
- let date = parseDate(modelValue, parseFormat)
157
-
158
- // Si la date est invalide avec le format de retour, essayer avec le format d'affichage
159
- if (date === null && props.dateFormatReturn) {
160
- date = parseDate(modelValue, props.format)
161
- }
162
-
163
- return date === null ? null : date
164
- }
165
-
166
- // Utilisation de la fonction pour initialiser `selectedDates`
167
70
  const selectedDates = ref<Date | Date[] | null>(
168
- initializeSelectedDates(props.modelValue as DateInput | null),
71
+ initializeSelectedDates(props.modelValue as DateInput | null, props.format, props.dateFormatReturn),
169
72
  )
170
73
 
171
74
  const isDatePickerVisible = ref(false)
172
- const errorMessages = ref<string[]>([])
173
- const successMessages = ref<string[]>([])
174
- const warningMessages = ref<string[]>([])
75
+ const validation = useValidation({
76
+ showSuccessMessages: props.showSuccessMessages,
77
+ fieldIdentifier: 'Date',
78
+ customRules: props.customRules,
79
+ warningRules: props.customWarningRules,
80
+ disableErrorHandling: props.disableErrorHandling,
81
+ })
82
+ const { errors, warnings, successes, validateField, clearValidation } = validation
83
+
84
+ const errorMessages = errors
85
+ const warningMessages = warnings
86
+ const successMessages = successes
175
87
  const displayFormattedDate = ref('')
176
88
 
177
89
  const textInputValue = ref<string>('')
@@ -179,31 +91,25 @@
179
91
  // Variable pour éviter les mises à jour récursives
180
92
  const isUpdatingFromInternal = ref(false)
181
93
 
182
- // Déclaration des règles de validation
183
- type Rule = { type: string, options: RuleOptions }
184
- const customRules = ref<Rule[]>(props.customRules || [])
185
- const customWarningRules = ref<Rule[]>(props.customWarningRules || [])
186
-
187
- const { generateRules } = useFieldValidation()
188
- const validationRules = generateRules(customRules.value)
189
- const warningValidationRules = generateRules(customWarningRules.value)
190
-
191
94
  // Déclaration de la fonction validateDates avant son utilisation
192
95
  const validateDates = (forceValidation = false) => {
193
- // Réinitialiser tous les messages
194
- errorMessages.value = []
195
- successMessages.value = []
196
- warningMessages.value = []
197
-
198
96
  if (props.noCalendar) {
199
97
  // En mode no-calendar, on délègue la validation au DateTextInput
200
98
  return
201
99
  }
202
100
 
101
+ // Réinitialiser la validation
102
+ clearValidation()
103
+
104
+ // Si la gestion des erreurs est désactivée, on effectue la validation interne
105
+ // mais on n'ajoute pas les messages d'erreur
106
+ const shouldDisplayErrors = !props.disableErrorHandling
107
+
203
108
  // Vérifier si le champ est requis et vide
204
- // Si forceValidation est true, on ignore les conditions de validation interactive
205
109
  if ((forceValidation || !isUpdatingFromInternal.value) && props.required && (!selectedDates.value || (Array.isArray(selectedDates.value) && selectedDates.value.length === 0))) {
206
- errorMessages.value.push('La date est requise.')
110
+ if (shouldDisplayErrors) {
111
+ errors.value.push('La date est requise.')
112
+ }
207
113
  return
208
114
  }
209
115
 
@@ -214,32 +120,21 @@
214
120
  ? selectedDates.value
215
121
  : [selectedDates.value]
216
122
 
217
- // Collecter tous les messages
218
- const allErrors: string[] = []
219
- const allWarnings: string[] = []
220
- const allSuccess: string[] = []
221
-
222
- // Appliquer les règles de validation
223
- datesToValidate.forEach((date) => {
224
- // Appliquer d'abord les règles de validation standard
225
- validationRules.forEach((rule) => {
226
- const result = rule(date)
227
- if (result?.error) allErrors.push(result.error)
228
- else if (result?.success) allSuccess.push(result.success)
123
+ // Valider chaque date
124
+ if (shouldDisplayErrors) {
125
+ datesToValidate.forEach((date) => {
126
+ validateField(
127
+ date,
128
+ props.customRules,
129
+ props.customWarningRules,
130
+ )
229
131
  })
230
132
 
231
- // Ensuite appliquer les règles d'avertissement
232
- warningValidationRules.forEach((rule) => {
233
- const result = rule(date)
234
- if (result?.warning) allWarnings.push(result.warning)
235
- else if (result?.success && !allErrors.length) allSuccess.push(result.success)
236
- })
237
- })
238
-
239
- // Dédoublonner et assigner les messages
240
- errorMessages.value = [...new Set(allErrors)]
241
- warningMessages.value = [...new Set(allWarnings)]
242
- successMessages.value = [...new Set(allSuccess)]
133
+ // Dédoublonner les messages (au cas où plusieurs dates auraient les mêmes messages)
134
+ errors.value = [...new Set(errors.value)]
135
+ warnings.value = [...new Set(warnings.value)]
136
+ successes.value = [...new Set(successes.value)]
137
+ }
243
138
  }
244
139
 
245
140
  // Fonction centralisée pour mettre à jour le modèle
@@ -293,18 +188,6 @@
293
188
  // Réinitialiser textInputValue
294
189
  textInputValue.value = ''
295
190
  }
296
-
297
- // Gérer la visibilité du date picker
298
- if (props.displayRange) {
299
- if (Array.isArray(newValue) && newValue.length >= 2) {
300
- isDatePickerVisible.value = false
301
- emit('closed')
302
- }
303
- }
304
- else {
305
- isDatePickerVisible.value = false
306
- emit('closed')
307
- }
308
191
  })
309
192
 
310
193
  const getMessageClasses = () => ({
@@ -318,32 +201,6 @@
318
201
  'min-width': '100%',
319
202
  }))
320
203
 
321
- // Formate une date unique au format spécifié
322
- const formatDate = (date: Date, format: string): string => {
323
- if (!date) return ''
324
-
325
- // Formats de base
326
- const day = date.getDate().toString().padStart(2, '0')
327
- const month = (date.getMonth() + 1).toString().padStart(2, '0')
328
- const year = date.getFullYear().toString()
329
- const shortYear = year.slice(-2)
330
-
331
- // Formats sans padding
332
- const dayNoPad = date.getDate().toString()
333
- const monthNoPad = (date.getMonth() + 1).toString()
334
-
335
- // Remplacer les tokens dans l'ordre correct (du plus spécifique au moins spécifique)
336
- let result = format
337
- .replace(/YYYY/g, year)
338
- .replace(/YY/g, shortYear)
339
- .replace(/MM/g, month)
340
- .replace(/M/g, monthNoPad)
341
- .replace(/DD/g, day)
342
- .replace(/D/g, dayNoPad)
343
-
344
- return result
345
- }
346
-
347
204
  // Date(s) formatée(s) en chaîne de caractères pour la valeur de retour
348
205
  const formattedDate = computed<DateValue>(() => {
349
206
  if (!selectedDates.value) return ''
@@ -455,16 +312,6 @@
455
312
  return formatDate(selectedDates.value, props.format)
456
313
  })
457
314
 
458
- // const validateDateValue = (value: DateValue): DateValue => {
459
- // if (Array.isArray(value)) {
460
- // if (value.length >= 2) {
461
- // return [value[0], value[1]] as [string, string]
462
- // }
463
- // return value[0] || ''
464
- // }
465
- // return value
466
- // }
467
-
468
315
  watch(displayFormattedDateComputed, (newValue) => {
469
316
  if (!props.noCalendar && newValue) {
470
317
  displayFormattedDate.value = newValue
@@ -474,7 +321,7 @@
474
321
  const updateSelectedDates = (input: DateValue) => {
475
322
  if (Array.isArray(input)) {
476
323
  const dates = input
477
- .map(date => (date ? parseDate(date) : null))
324
+ .map(date => (date ? parseDate(date, props.format) : null))
478
325
  .filter((date): date is Date => date !== null)
479
326
 
480
327
  if (dates.length === 0) {
@@ -486,7 +333,7 @@
486
333
  return
487
334
  }
488
335
 
489
- const date = input ? parseDate(input) : null
336
+ const date = input ? parseDate(input, props.format) : null
490
337
  selectedDates.value = date === null ? null : date
491
338
  }
492
339
 
@@ -512,40 +359,6 @@
512
359
  })).replace(/\b\w/g, l => l.toUpperCase())
513
360
  })
514
361
 
515
- // Watcher pour le modelValue pour synchroniser les dates sélectionnées
516
- watch(() => props.modelValue, (newValue) => {
517
- // Éviter les mises à jour récursives
518
- if (isUpdatingFromInternal.value) return
519
-
520
- try {
521
- isUpdatingFromInternal.value = true
522
-
523
- if (!newValue || newValue === '') {
524
- // Réinitialiser les valeurs
525
- selectedDates.value = null
526
- textInputValue.value = ''
527
- displayFormattedDate.value = ''
528
- }
529
- else {
530
- // Initialiser les dates sélectionnées
531
- selectedDates.value = initializeSelectedDates(newValue)
532
-
533
- // Mettre à jour l'affichage
534
- if (selectedDates.value) {
535
- displayFormattedDate.value = displayFormattedDateComputed.value || ''
536
- }
537
- }
538
-
539
- // Valider les dates
540
- validateDates()
541
- }
542
- finally {
543
- setTimeout(() => {
544
- isUpdatingFromInternal.value = false
545
- }, 0)
546
- }
547
- }, { immediate: true })
548
-
549
362
  onMounted(() => {
550
363
  document.addEventListener('click', handleClickOutside)
551
364
 
@@ -570,96 +383,60 @@
570
383
  }
571
384
  // Forcer la validation pour ignorer les conditions de validation interactive
572
385
  validateDates(true)
573
- return errorMessages.value.length === 0
386
+ // Retourner directement un booléen pour maintenir la compatibilité avec les tests existants
387
+ return errors.value.length === 0
574
388
  }
575
389
 
576
- defineExpose({
577
- validateOnSubmit,
578
- isDatePickerVisible,
579
- selectedDates,
580
- errorMessages,
581
- handleClickOutside,
582
- initializeSelectedDates,
583
- })
584
-
585
- // Fonction pour améliorer l'accessibilité du DatePicker
586
- const updateAccessibility = async () => {
587
- await nextTick()
390
+ const showDatePicker = () => {
391
+ if (props.isDisabled || props.isReadOnly) return
588
392
 
589
- // Utiliser des attributs data pour sélectionner les éléments, ce qui est plus stable que les classes CSS
590
- const datePickerEl = document.querySelector('.v-date-picker')
591
- if (!datePickerEl) return
592
-
593
- // Ajouter un attribut role="application" au conteneur principal
594
- datePickerEl.setAttribute('role', 'application')
595
- datePickerEl.setAttribute('aria-label', 'Sélecteur de date')
393
+ isDatePickerVisible.value = true
596
394
 
597
- // Sélectionner tous les boutons de navigation
598
- const navigationButtons = datePickerEl.querySelectorAll('button')
395
+ // Mettre à jour l'accessibilité après l'ouverture du DatePicker
396
+ nextTick(() => {
397
+ updateAccessibility()
398
+ })
399
+ }
599
400
 
600
- // Attribuer des labels significatifs basés sur la position ou l'icône
601
- navigationButtons.forEach((button) => {
602
- const iconEl = button.querySelector('.v-icon')
603
- if (!iconEl) return
401
+ const openDatePicker = () => {
402
+ showDatePicker()
403
+ }
604
404
 
605
- // Utiliser le contenu de l'icône pour déterminer sa fonction
606
- const iconContent = iconEl.textContent || ''
607
- const iconClasses = iconEl.className || ''
405
+ type ViewMode = 'month' | 'year' | 'months' | undefined
608
406
 
609
- if (iconClasses.includes('mdi-chevron-left') || iconContent.includes('chevron-left')) {
610
- button.setAttribute('aria-label', 'Mois précédent')
611
- }
612
- else if (iconClasses.includes('mdi-chevron-right') || iconContent.includes('chevron-right')) {
613
- button.setAttribute('aria-label', 'Mois suivant')
614
- }
615
- else if (iconClasses.includes('mdi-chevron-down') || iconContent.includes('chevron-down')
616
- || iconClasses.includes('mdi-menu-down') || iconContent.includes('menu-down')) {
617
- button.setAttribute('aria-label', 'Changer de vue')
618
- }
619
- })
407
+ // Variable pour suivre le mode d'affichage actuel du DatePicker
408
+ const currentViewMode = ref<ViewMode>(props.isBirthDate ? 'year' : 'month')
620
409
 
621
- // Ajouter des instructions pour les lecteurs d'écran
622
- let srOnlyEl = datePickerEl.querySelector('.sr-only-instructions')
623
- if (!srOnlyEl) {
624
- srOnlyEl = document.createElement('span')
625
- srOnlyEl.className = 'sr-only-instructions'
626
- srOnlyEl.setAttribute('aria-live', 'polite')
627
- // Utiliser HTMLElement pour accéder aux propriétés de style
628
- const srOnlyHtmlEl = srOnlyEl as HTMLElement
629
- srOnlyHtmlEl.style.position = 'absolute'
630
- srOnlyHtmlEl.style.width = '1px'
631
- srOnlyHtmlEl.style.height = '1px'
632
- srOnlyHtmlEl.style.padding = '0'
633
- srOnlyHtmlEl.style.margin = '-1px'
634
- srOnlyHtmlEl.style.overflow = 'hidden'
635
- srOnlyHtmlEl.style.clip = 'rect(0, 0, 0, 0)'
636
- srOnlyHtmlEl.style.whiteSpace = 'nowrap'
637
- srOnlyHtmlEl.style.border = '0'
638
- srOnlyEl.textContent = 'Utilisez les flèches pour naviguer entre les dates et Entrée pour sélectionner une date'
639
-
640
- datePickerEl.prepend(srOnlyEl)
641
- }
410
+ // Fonction pour gérer le changement de mode d'affichage
411
+ const handleViewModeUpdate = (newMode: ViewMode) => {
412
+ currentViewMode.value = newMode
642
413
  }
643
414
 
644
- // Appliquer les améliorations d'accessibilité quand le DatePicker devient visible
645
- watch(isDatePickerVisible, async (newValue) => {
646
- if (newValue) {
647
- await updateAccessibility()
415
+ // Fonction pour gérer la sélection de l'année quand isBirthDate est true
416
+ const handleYearUpdate = () => {
417
+ if (props.isBirthDate) {
418
+ // Après la sélection de l'année, passer automatiquement à la sélection du mois
419
+ currentViewMode.value = 'months'
648
420
  }
649
- })
650
-
651
- const handlePrependIconClick = () => {
652
- isDatePickerVisible.value = true
653
421
  }
654
422
 
655
- const handleAppendIconClick = () => {
656
- isDatePickerVisible.value = true
423
+ // Fonction pour gérer la sélection du mois quand isBirthDate est true
424
+ const handleMonthUpdate = () => {
425
+ if (props.isBirthDate) {
426
+ // Après la sélection du mois, passer automatiquement à la sélection du jour
427
+ currentViewMode.value = undefined
428
+ }
657
429
  }
658
430
 
659
- // Fonctions et constantes déjà déclarées plus haut dans le code
431
+ watch(isDatePickerVisible, (isVisible) => {
432
+ if (!isVisible && props.isBirthDate) {
433
+ // Réinitialiser le mode d'affichage au type birthdate
434
+ currentViewMode.value = 'year'
435
+ }
436
+ })
660
437
 
661
438
  const getIcon = () => {
662
- if (props.noCalendar) {
439
+ if (props.noCalendar || props.disableErrorHandling) {
663
440
  return
664
441
  }
665
442
  switch (true) {
@@ -674,40 +451,47 @@
674
451
  }
675
452
  }
676
453
 
677
- // Watch sur modelValue pour gérer les changements externes
678
- watch(() => props.modelValue, (newValue) => {
679
- // Éviter les mises à jour récursives
680
- if (isUpdatingFromInternal.value) return
454
+ const syncFromModelValue = (newValue: DateInput | undefined) => {
455
+ if (!newValue || newValue === '') {
456
+ selectedDates.value = null
457
+ textInputValue.value = ''
458
+ displayFormattedDate.value = ''
459
+ validateDates()
460
+ return
461
+ }
681
462
 
682
- try {
683
- isUpdatingFromInternal.value = true
463
+ selectedDates.value = initializeSelectedDates(newValue, props.format, props.dateFormatReturn)
684
464
 
685
- if (!newValue || newValue === '') {
686
- selectedDates.value = null
687
- textInputValue.value = ''
688
- displayFormattedDate.value = ''
465
+ if (selectedDates.value) {
466
+ const firstDate = Array.isArray(selectedDates.value)
467
+ ? selectedDates.value[0]
468
+ : selectedDates.value
469
+
470
+ textInputValue.value = formatDate(firstDate, props.format)
471
+ displayFormattedDate.value = displayFormattedDateComputed.value || ''
472
+ }
473
+
474
+ validateDates()
475
+ }
476
+
477
+ watch(() => props.modelValue, (newValue) => {
478
+ if (isUpdatingFromInternal.value) {
479
+ if (props.displayRange) {
480
+ if (Array.isArray(newValue) && newValue.length >= 2) {
481
+ isDatePickerVisible.value = false
482
+ emit('closed')
483
+ }
689
484
  }
690
485
  else {
691
- // Initialiser les dates sélectionnées
692
- selectedDates.value = initializeSelectedDates(newValue)
693
-
694
- // Mettre à jour l'affichage et le textInputValue
695
- if (selectedDates.value) {
696
- if (Array.isArray(selectedDates.value)) {
697
- if (selectedDates.value.length > 0) {
698
- textInputValue.value = formatDate(selectedDates.value[0], props.format)
699
- displayFormattedDate.value = displayFormattedDateComputed.value || ''
700
- }
701
- }
702
- else {
703
- textInputValue.value = formatDate(selectedDates.value, props.format)
704
- displayFormattedDate.value = displayFormattedDateComputed.value || ''
705
- }
706
- }
486
+ isDatePickerVisible.value = false
487
+ emit('closed')
707
488
  }
489
+ return
490
+ }
708
491
 
709
- // Valider les dates
710
- validateDates()
492
+ try {
493
+ isUpdatingFromInternal.value = true
494
+ syncFromModelValue(newValue)
711
495
  }
712
496
  finally {
713
497
  setTimeout(() => {
@@ -715,6 +499,17 @@
715
499
  }, 0)
716
500
  }
717
501
  }, { immediate: true })
502
+
503
+ defineExpose({
504
+ validateOnSubmit,
505
+ isDatePickerVisible,
506
+ selectedDates,
507
+ errorMessages,
508
+ handleClickOutside,
509
+ initializeSelectedDates,
510
+ updateAccessibility,
511
+ openDatePicker,
512
+ })
718
513
  </script>
719
514
 
720
515
  <template>
@@ -741,6 +536,8 @@
741
536
  :display-append-icon="props.displayAppendIcon"
742
537
  :display-prepend-icon="props.displayPrependIcon"
743
538
  :no-icon="props.noIcon"
539
+ :disable-error-handling="props.disableErrorHandling"
540
+ :show-success-messages="props.showSuccessMessages"
744
541
  title="Date text input"
745
542
  @focus="emit('focus')"
746
543
  @blur="emit('blur')"
@@ -754,7 +551,7 @@
754
551
  :class="[getMessageClasses(), 'label-hidden-on-focus']"
755
552
  :error-messages="errorMessages"
756
553
  :warning-messages="warningMessages"
757
- :success-messages="successMessages"
554
+ :success-messages="props.showSuccessMessages ? successMessages : []"
758
555
  :is-disabled="props.isDisabled"
759
556
  :is-read-only="true"
760
557
  :label="props.placeholder"
@@ -762,12 +559,13 @@
762
559
  :prepend-icon="displayIcon && !displayAppendIcon ? 'calendar' : undefined"
763
560
  :variant-style="props.isOutlined ? 'outlined' : 'underlined'"
764
561
  color="primary"
562
+ :show-success-messages="props.showSuccessMessages"
765
563
  is-clearable
766
564
  title="Date Picker"
767
- @focus="isDatePickerVisible = true"
565
+ @focus="openDatePicker"
768
566
  @update:model-value="updateSelectedDates"
769
- @prepend-icon-click="handlePrependIconClick"
770
- @append-icon-click="handleAppendIconClick"
567
+ @prepend-icon-click="openDatePicker"
568
+ @append-icon-click="openDatePicker"
771
569
  />
772
570
  </template>
773
571
  <div>
@@ -787,12 +585,15 @@
787
585
  <VDatePicker
788
586
  v-if="isDatePickerVisible && !props.noCalendar"
789
587
  v-model="selectedDates"
588
+ color="primary"
790
589
  :first-day-of-week="1"
791
590
  :multiple="props.displayRange ? 'range' : false"
792
591
  :show-adjacent-months="true"
793
592
  :show-week="props.showWeekNumber"
794
- :view-mode="props.isBirthDate ? 'year' : 'month'"
795
- color="primary"
593
+ :view-mode="currentViewMode"
594
+ @update:view-mode="handleViewModeUpdate"
595
+ @update:year="handleYearUpdate"
596
+ @update:month="handleMonthUpdate"
796
597
  >
797
598
  <template #title>
798
599
  Sélectionnez une date