@cnamts/synapse 0.0.14-alpha → 0.0.16-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 (108) hide show
  1. package/dist/components/CookiesSelection/CookiesSelection.d.ts +26 -26
  2. package/dist/components/Customs/SyInputSelect/SyInputSelect.d.ts +2 -2
  3. package/dist/components/Customs/SySelect/SySelect.d.ts +24 -12
  4. package/dist/components/Customs/SySelect/locales.d.ts +3 -0
  5. package/dist/components/Customs/SyTextField/SyTextField.d.ts +1393 -3
  6. package/dist/components/DatePicker/DatePicker.d.ts +3532 -22
  7. package/dist/components/DatePicker/DateTextInput.d.ts +1408 -11
  8. package/dist/components/DialogBox/config.d.ts +1 -1
  9. package/dist/components/DownloadBtn/DownloadBtn.d.ts +2 -0
  10. package/dist/components/LangBtn/LangBtn.d.ts +467 -1
  11. package/dist/components/LangBtn/config.d.ts +1 -3
  12. package/dist/components/NirField/NirField.d.ts +2805 -15
  13. package/dist/components/PasswordField/PasswordField.d.ts +2 -2
  14. package/dist/components/PeriodField/PeriodField.d.ts +7345 -325
  15. package/dist/components/PhoneField/PhoneField.d.ts +3 -3
  16. package/dist/components/SelectBtnField/SelectBtnField.d.ts +1 -1
  17. package/dist/components/SkipLink/SkipLink.d.ts +3 -2
  18. package/dist/components/SyAlert/SyAlert.d.ts +72 -1
  19. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +26 -26
  20. package/dist/components/UserMenuBtn/UserMenuBtn.d.ts +2 -0
  21. package/dist/components/index.d.ts +2 -0
  22. package/dist/composables/date/useDateFormat.d.ts +2 -2
  23. package/dist/composables/date/useDateFormatDayjs.d.ts +23 -0
  24. package/dist/composables/date/useDateInitializationDayjs.d.ts +18 -0
  25. package/dist/design-system-v3.js +4314 -3987
  26. package/dist/design-system-v3.umd.cjs +1 -1
  27. package/dist/style.css +1 -1
  28. package/dist/vuetifyConfig.d.ts +1 -0
  29. package/package.json +1 -1
  30. package/src/components/BackBtn/Accessibilite.stories.ts +4 -0
  31. package/src/components/BackBtn/BackBtn.vue +2 -1
  32. package/src/components/BackToTopBtn/Accessibilite.stories.ts +4 -0
  33. package/src/components/BackToTopBtn/BackToTopBtn.stories.ts +78 -21
  34. package/src/components/BackToTopBtn/BackToTopBtn.vue +15 -0
  35. package/src/components/BackToTopBtn/config.ts +2 -2
  36. package/src/components/BackToTopBtn/tests/__snapshots__/BackToTopBtn.spec.ts.snap +4 -4
  37. package/src/components/CopyBtn/Accessibilite.stories.ts +4 -0
  38. package/src/components/Customs/SyBtnSelect/SyBtnSelect.stories.ts +2 -2
  39. package/src/components/Customs/SyBtnSelect/SyBtnSelect.vue +0 -1
  40. package/src/components/Customs/SyInputSelect/SyInputSelect.stories.ts +3 -3
  41. package/src/components/Customs/SyInputSelect/SyInputSelect.vue +4 -4
  42. package/src/components/Customs/SySelect/SySelect.stories.ts +4 -0
  43. package/src/components/Customs/SySelect/SySelect.vue +75 -10
  44. package/src/components/Customs/SySelect/locales.ts +3 -0
  45. package/src/components/Customs/SySelect/tests/SySelect.spec.ts +24 -2
  46. package/src/components/Customs/SyTextField/Accessibilite.stories.ts +7 -0
  47. package/src/components/Customs/SyTextField/SyTextField.stories.ts +14 -1
  48. package/src/components/Customs/SyTextField/SyTextField.vue +85 -20
  49. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +795 -0
  50. package/src/components/DatePicker/DatePicker.stories.ts +432 -1
  51. package/src/components/DatePicker/DatePicker.vue +143 -76
  52. package/src/components/DatePicker/DatePickerValidation.mdx +338 -0
  53. package/src/components/DatePicker/DatePickerValidation.stories.ts +30 -0
  54. package/src/components/DatePicker/DateTextInput.vue +87 -135
  55. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +282 -0
  56. package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +535 -0
  57. package/src/components/DatePicker/tests/DatePicker.spec.ts +33 -32
  58. package/src/components/DatePicker/tests/DateTextInput.spec.ts +83 -35
  59. package/src/components/DialogBox/DialogBox.stories.ts +5 -2
  60. package/src/components/DialogBox/DialogBox.vue +1 -1
  61. package/src/components/DialogBox/config.ts +1 -1
  62. package/src/components/DownloadBtn/Accessibilite.stories.ts +4 -0
  63. package/src/components/DownloadBtn/DownloadBtn.stories.ts +17 -8
  64. package/src/components/DownloadBtn/DownloadBtn.vue +13 -6
  65. package/src/components/DownloadBtn/tests/__snapshots__/DownloadBtn.spec.ts.snap +0 -2
  66. package/src/components/FranceConnectBtn/Accessibilite.stories.ts +4 -0
  67. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +3 -0
  68. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +3 -0
  69. package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +19 -0
  70. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +12 -2
  71. package/src/components/LangBtn/Accessibilite.stories.ts +4 -0
  72. package/src/components/LangBtn/LangBtn.stories.ts +1 -4
  73. package/src/components/LangBtn/LangBtn.vue +68 -9
  74. package/src/components/LangBtn/config.ts +0 -1
  75. package/src/components/LangBtn/tests/LangBtn.spec.ts +30 -2
  76. package/src/components/PageContainer/Accessibilite.stories.ts +36 -23
  77. package/src/components/PaginatedTable/PaginatedTable.stories.ts +144 -18
  78. package/src/components/PasswordField/PasswordField.stories.ts +6 -6
  79. package/src/components/PasswordField/PasswordField.vue +3 -3
  80. package/src/components/PeriodField/PeriodField.vue +4 -4
  81. package/src/components/PhoneField/PhoneField.stories.ts +216 -24
  82. package/src/components/PhoneField/PhoneField.vue +32 -2
  83. package/src/components/PhoneField/tests/PhoneField.spec.ts +161 -14
  84. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +2 -1
  85. package/src/components/RatingPicker/RatingPicker.stories.ts +1 -1
  86. package/src/components/SkipLink/Accessibilite.stories.ts +8 -0
  87. package/src/components/SkipLink/SkipLink.vue +11 -9
  88. package/src/components/SkipLink/tests/__snapshots__/skipLink.spec.ts.snap +7 -4
  89. package/src/components/SkipLink/tests/skipLink.spec.ts +120 -6
  90. package/src/components/SyAlert/Accessibilite.stories.ts +4 -0
  91. package/src/components/SyAlert/SyAlert.mdx +3 -7
  92. package/src/components/SyAlert/SyAlert.stories.ts +19 -12
  93. package/src/components/SyAlert/SyAlert.vue +88 -51
  94. package/src/components/SyAlert/tests/SyAlert.spec.ts +20 -2
  95. package/src/components/SyAlert/tests/__snapshots__/SyAlert.spec.ts.snap +83 -75
  96. package/src/components/UserMenuBtn/UserMenuBtn.stories.ts +56 -0
  97. package/src/components/UserMenuBtn/UserMenuBtn.vue +4 -2
  98. package/src/components/UserMenuBtn/tests/UserMenuBtn.spec.ts +41 -0
  99. package/src/components/index.ts +2 -0
  100. package/src/composables/date/useDateFormat.ts +17 -1
  101. package/src/composables/date/useDateFormatDayjs.ts +84 -0
  102. package/src/composables/date/useDateInitializationDayjs.ts +133 -0
  103. package/src/composables/rules/useFieldValidation.ts +26 -3
  104. package/src/stories/Accessibilite/Avancement/Avancement.mdx +12 -0
  105. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +134 -0
  106. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +1 -1
  107. package/src/stories/GuideDuDev/LesBreackingChanges.mdx +31 -2
  108. package/src/components/LangBtn/tests/Config.spec.ts +0 -24
@@ -0,0 +1,535 @@
1
+ <script setup>
2
+ import { ref } from 'vue'
3
+ import DatePicker from '@/components/DatePicker/DatePicker.vue'
4
+
5
+ // Exemple 1: Validation de base (required)
6
+ const date1 = ref('')
7
+
8
+ // Exemple 2: notWeekend
9
+ const date2 = ref('')
10
+
11
+ // Exemple 3: notAfterToday
12
+ const date3 = ref('')
13
+
14
+ // Exemple 4: notBeforeToday
15
+ const date4 = ref('')
16
+
17
+ // Exemple 5: notBeforeDate
18
+ const date5 = ref('')
19
+
20
+ // Exemple 6: notAfterDate
21
+ const date6 = ref('')
22
+
23
+ // Exemple 7: dateExact
24
+ const date7 = ref('')
25
+
26
+ // Exemple 8: customRules (règle personnalisée)
27
+ const date8 = ref('')
28
+
29
+ // Exemple 9: customWarningRules
30
+ const date9 = ref('')
31
+
32
+ // Exemple 10: Combinaison de plusieurs règles
33
+ const date10 = ref('')
34
+
35
+ const today = new Date().toLocaleDateString('fr-FR', {
36
+ day: '2-digit',
37
+ month: '2-digit',
38
+ year: 'numeric',
39
+ })
40
+ const tomorrow = new Date(Date.now() + 86400000).toLocaleDateString('fr-FR', {
41
+ day: '2-digit',
42
+ month: '2-digit',
43
+ year: 'numeric',
44
+ })
45
+ const yesterday = new Date(Date.now() - 86400000).toLocaleDateString('fr-FR', {
46
+ day: '2-digit',
47
+ month: '2-digit',
48
+ year: 'numeric',
49
+ })
50
+ const nextYear = new Date(Date.now() + 31536000000).toLocaleDateString('fr-FR', {
51
+ day: '2-digit',
52
+ month: '2-digit',
53
+ year: 'numeric',
54
+ })
55
+ </script>
56
+
57
+ <template>
58
+ <div class="date-picker-validation-examples">
59
+ <h1 class="text-h5 mb-6">
60
+ Exemples de validation du DatePicker
61
+ </h1>
62
+
63
+ <!-- Exemple 1: Validation de base (required) -->
64
+ <section class="mb-10">
65
+ <h2 class="text-h6 mb-3">
66
+ Validation de base (required)
67
+ </h2>
68
+ <div class="mb-2">
69
+ <DatePicker
70
+ v-model="date1"
71
+ placeholder="Date requise"
72
+ required
73
+ />
74
+ </div>
75
+ <v-btn
76
+ size="small"
77
+ color="primary"
78
+ @click="date1 = ''"
79
+ >
80
+ Vider le champ
81
+ </v-btn>
82
+ <v-btn
83
+ size="small"
84
+ class="ml-2"
85
+ @click="date1 = today"
86
+ >
87
+ Remplir le champ
88
+ </v-btn>
89
+ <div class="mt-2">
90
+ Valeur actuelle: {{ date1 }}
91
+ </div>
92
+ </section>
93
+
94
+ <!-- Exemple 2: notWeekend -->
95
+ <section class="mb-10">
96
+ <h2 class="text-h6 mb-3">
97
+ Validation notWeekend
98
+ </h2>
99
+ <p class="text-body-2 mb-2">
100
+ Cette règle vérifie que la date n'est pas un weekend
101
+ </p>
102
+ <div class="mb-2">
103
+ <DatePicker
104
+ v-model="date2"
105
+ placeholder="Jour de semaine uniquement"
106
+ :custom-rules="[{
107
+ type: 'notWeekend',
108
+ options: {
109
+ message: 'La date ne peut pas être un weekend',
110
+ successMessage: 'Jour de semaine valide'
111
+ }
112
+ }]"
113
+ :show-success-messages="true"
114
+ />
115
+ </div>
116
+ <v-btn
117
+ size="small"
118
+ color="primary"
119
+ @click="date2 = '13/04/2025'"
120
+ >
121
+ Samedi (13/04/2025)
122
+ </v-btn>
123
+ <v-btn
124
+ size="small"
125
+ class="ml-2"
126
+ @click="date2 = '15/04/2025'"
127
+ >
128
+ Mardi (15/04/2025)
129
+ </v-btn>
130
+ <div class="mt-2">
131
+ Valeur actuelle: {{ date2 }}
132
+ </div>
133
+ </section>
134
+
135
+ <!-- Exemple 3: notAfterToday -->
136
+ <section class="mb-10">
137
+ <h2 class="text-h6 mb-3">
138
+ Validation notAfterToday
139
+ </h2>
140
+ <p class="text-body-2 mb-2">
141
+ Cette règle vérifie que la date n'est pas postérieure à aujourd'hui
142
+ </p>
143
+ <div class="mb-2">
144
+ <DatePicker
145
+ v-model="date3"
146
+ placeholder="Date passée ou aujourd'hui"
147
+ :custom-rules="[{
148
+ type: 'notAfterToday',
149
+ options: {
150
+ message: 'La date ne peut pas être dans le futur',
151
+ successMessage: 'Date passée ou aujourd\'hui valide'
152
+ }
153
+ }]"
154
+ :show-success-messages="true"
155
+ />
156
+ </div>
157
+ <v-btn
158
+ size="small"
159
+ color="primary"
160
+ @click="date3 = today"
161
+ >
162
+ Aujourd'hui
163
+ </v-btn>
164
+ <v-btn
165
+ size="small"
166
+ class="ml-2"
167
+ @click="date3 = tomorrow"
168
+ >
169
+ Demain
170
+ </v-btn>
171
+ <v-btn
172
+ size="small"
173
+ class="ml-2"
174
+ @click="date3 = yesterday"
175
+ >
176
+ Hier
177
+ </v-btn>
178
+ <div class="mt-2">
179
+ Valeur actuelle: {{ date3 }}
180
+ </div>
181
+ </section>
182
+
183
+ <!-- Exemple 4: notBeforeToday -->
184
+ <section class="mb-10">
185
+ <h2 class="text-h6 mb-3">
186
+ Validation notBeforeToday
187
+ </h2>
188
+ <p class="text-body-2 mb-2">
189
+ Cette règle vérifie que la date n'est pas antérieure à aujourd'hui
190
+ </p>
191
+ <div class="mb-2">
192
+ <DatePicker
193
+ v-model="date4"
194
+ placeholder="Date future ou aujourd'hui"
195
+ :custom-rules="[{
196
+ type: 'notBeforeToday',
197
+ options: {
198
+ message: 'La date ne peut pas être dans le passé',
199
+ successMessage: 'Date future ou aujourd\'hui valide'
200
+ }
201
+ }]"
202
+ :show-success-messages="true"
203
+ />
204
+ </div>
205
+ <v-btn
206
+ size="small"
207
+ color="primary"
208
+ @click="date4 = today"
209
+ >
210
+ Aujourd'hui
211
+ </v-btn>
212
+ <v-btn
213
+ size="small"
214
+ class="ml-2"
215
+ @click="date4 = tomorrow"
216
+ >
217
+ Demain
218
+ </v-btn>
219
+ <v-btn
220
+ size="small"
221
+ class="ml-2"
222
+ @click="date4 = yesterday"
223
+ >
224
+ Hier
225
+ </v-btn>
226
+ <div class="mt-2">
227
+ Valeur actuelle: {{ date4 }}
228
+ </div>
229
+ </section>
230
+
231
+ <!-- Exemple 5: notBeforeDate -->
232
+ <section class="mb-10">
233
+ <h2 class="text-h6 mb-3">
234
+ Validation notBeforeDate
235
+ </h2>
236
+ <p class="text-body-2 mb-2">
237
+ Cette règle vérifie que la date n'est pas antérieure à une date de référence
238
+ </p>
239
+ <div class="mb-2">
240
+ <DatePicker
241
+ v-model="date5"
242
+ placeholder="Date après le 01/01/2025"
243
+ :custom-rules="[{
244
+ type: 'notBeforeDate',
245
+ options: {
246
+ message: 'La date ne peut pas être antérieure au 01/01/2025',
247
+ successMessage: 'Date valide (après le 01/01/2025)',
248
+ date: '01/01/2025'
249
+ }
250
+ }]"
251
+ :show-success-messages="true"
252
+ />
253
+ </div>
254
+ <v-btn
255
+ size="small"
256
+ color="primary"
257
+ @click="date5 = '15/04/2025'"
258
+ >
259
+ 15/04/2025
260
+ </v-btn>
261
+ <v-btn
262
+ size="small"
263
+ class="ml-2"
264
+ @click="date5 = '31/12/2024'"
265
+ >
266
+ 31/12/2024
267
+ </v-btn>
268
+ <div class="mt-2">
269
+ Valeur actuelle: {{ date5 }}
270
+ </div>
271
+ </section>
272
+
273
+ <!-- Exemple 6: notAfterDate -->
274
+ <section class="mb-10">
275
+ <h2 class="text-h6 mb-3">
276
+ Validation notAfterDate
277
+ </h2>
278
+ <p class="text-body-2 mb-2">
279
+ Cette règle vérifie que la date n'est pas postérieure à une date de référence
280
+ </p>
281
+ <div class="mb-2">
282
+ <DatePicker
283
+ v-model="date6"
284
+ placeholder="Date avant le 31/12/2025"
285
+ :custom-rules="[{
286
+ type: 'notAfterDate',
287
+ options: {
288
+ message: 'La date ne peut pas être postérieure au 31/12/2025',
289
+ successMessage: 'Date valide (avant le 31/12/2025)',
290
+ date: '31/12/2025'
291
+ }
292
+ }]"
293
+ :show-success-messages="true"
294
+ />
295
+ </div>
296
+ <v-btn
297
+ size="small"
298
+ color="primary"
299
+ @click="date6 = '15/04/2025'"
300
+ >
301
+ 15/04/2025
302
+ </v-btn>
303
+ <v-btn
304
+ size="small"
305
+ class="ml-2"
306
+ @click="date6 = '01/01/2026'"
307
+ >
308
+ 01/01/2026
309
+ </v-btn>
310
+ <div class="mt-2">
311
+ Valeur actuelle: {{ date6 }}
312
+ </div>
313
+ </section>
314
+
315
+ <!-- Exemple 7: dateExact -->
316
+ <section class="mb-10">
317
+ <h2 class="text-h6 mb-3">
318
+ Validation dateExact
319
+ </h2>
320
+ <p class="text-body-2 mb-2">
321
+ Cette règle vérifie que la date est exactement égale à une date de référence
322
+ </p>
323
+ <div class="mb-2">
324
+ <DatePicker
325
+ v-model="date7"
326
+ placeholder="Date exacte: 25/12/2025"
327
+ :custom-rules="[{
328
+ type: 'dateExact',
329
+ options: {
330
+ message: 'La date doit être le 25/12/2025',
331
+ successMessage: 'Date correcte (25/12/2025)',
332
+ date: '25/12/2025'
333
+ }
334
+ }]"
335
+ :show-success-messages="true"
336
+ />
337
+ </div>
338
+ <v-btn
339
+ size="small"
340
+ color="primary"
341
+ @click="date7 = '25/12/2025'"
342
+ >
343
+ 25/12/2025
344
+ </v-btn>
345
+ <v-btn
346
+ size="small"
347
+ class="ml-2"
348
+ @click="date7 = '26/12/2025'"
349
+ >
350
+ 26/12/2025
351
+ </v-btn>
352
+ <div class="mt-2">
353
+ Valeur actuelle: {{ date7 }}
354
+ </div>
355
+ </section>
356
+
357
+ <!-- Exemple 8: customRules (règle personnalisée) -->
358
+ <section class="mb-10">
359
+ <h2 class="text-h6 mb-3">
360
+ Règle personnalisée (custom)
361
+ </h2>
362
+ <p class="text-body-2 mb-2">
363
+ Cette règle vérifie que la date n'est pas en 2024
364
+ </p>
365
+ <div class="mb-2">
366
+ <DatePicker
367
+ v-model="date8"
368
+ placeholder="Date hors 2024"
369
+ :custom-rules="[{
370
+ type: 'custom',
371
+ options: {
372
+ validate: (value) => {
373
+ // Si pas de valeur, c'est valide
374
+ if (!value) return true
375
+ // Convertir en chaîne si ce n'est pas déjà le cas
376
+ const dateStr = value.toString()
377
+ // Vérifier si c'est une Date et extraire l'année
378
+ if (value instanceof Date) {
379
+ return value.getFullYear() !== 2024
380
+ }
381
+ // Fallback sur la vérification de chaîne
382
+ return !dateStr.includes('2024')
383
+ },
384
+ message: 'Les dates en 2024 ne sont pas autorisées',
385
+ successMessage: 'Date valide (hors 2024)',
386
+ fieldIdentifier: 'date'
387
+ }
388
+ }]"
389
+ :show-success-messages="true"
390
+ />
391
+ </div>
392
+ <v-btn
393
+ size="small"
394
+ color="primary"
395
+ @click="date8 = '15/04/2025'"
396
+ >
397
+ 15/04/2025
398
+ </v-btn>
399
+ <v-btn
400
+ size="small"
401
+ class="ml-2"
402
+ @click="date8 = '15/12/2024'"
403
+ >
404
+ 15/12/2024
405
+ </v-btn>
406
+ <div class="mt-2">
407
+ Valeur actuelle: {{ date8 }}
408
+ </div>
409
+ </section>
410
+
411
+ <!-- Exemple 9: customWarningRules -->
412
+ <section class="mb-10">
413
+ <h2 class="text-h6 mb-3">
414
+ Règle d'avertissement
415
+ </h2>
416
+ <p class="text-body-2 mb-2">
417
+ Cette règle affiche un avertissement si la date est en 2025
418
+ </p>
419
+ <div class="mb-2">
420
+ <DatePicker
421
+ v-model="date9"
422
+ placeholder="Date (avertissement pour 2025)"
423
+ :custom-warning-rules="[{
424
+ type: 'custom',
425
+ options: {
426
+ validate: (value) => {
427
+ // Si pas de valeur, c'est valide
428
+ if (!value) return true
429
+
430
+ // Convertir en chaîne si ce n'est pas déjà le cas
431
+ const dateStr = value.toString()
432
+
433
+ // Vérifier si c'est une Date et extraire l'année
434
+ if (value instanceof Date) {
435
+ return value.getFullYear() !== 2025
436
+ }
437
+
438
+ // Fallback sur la vérification de chaîne
439
+ return !dateStr.includes('2025')
440
+ },
441
+ warningMessage: 'Attention : les dates en 2025 génèrent un avertissement',
442
+ successMessage: 'Date hors 2025',
443
+ fieldIdentifier: 'date',
444
+ isWarning: true
445
+ }
446
+ }]"
447
+ :show-success-messages="true"
448
+ />
449
+ </div>
450
+ <v-btn
451
+ size="small"
452
+ color="primary"
453
+ @click="date9 = '15/04/2025'"
454
+ >
455
+ 15/04/2025
456
+ </v-btn>
457
+ <v-btn
458
+ size="small"
459
+ class="ml-2"
460
+ @click="date9 = '15/12/2026'"
461
+ >
462
+ 15/12/2026
463
+ </v-btn>
464
+ <div class="mt-2">
465
+ Valeur actuelle: {{ date9 }}
466
+ </div>
467
+ </section>
468
+
469
+ <!-- Exemple 10: Combinaison de plusieurs règles -->
470
+ <section class="mb-10">
471
+ <h2 class="text-h6 mb-3">
472
+ Combinaison de plusieurs règles
473
+ </h2>
474
+ <p class="text-body-2 mb-2">
475
+ Exemple de DatePicker avec plusieurs règles de validation
476
+ </p>
477
+ <div class="mb-2">
478
+ <DatePicker
479
+ v-model="date10"
480
+ placeholder="Date de travail"
481
+ required
482
+ :custom-rules="[
483
+ {
484
+ type: 'notWeekend',
485
+ options: { message: 'La date ne peut pas être un weekend' }
486
+ },
487
+ {
488
+ type: 'notAfterToday',
489
+ options: { message: 'La date ne peut pas être dans le futur' }
490
+ }
491
+ ]"
492
+ :show-success-messages="true"
493
+ />
494
+ </div>
495
+ <v-btn
496
+ size="small"
497
+ color="primary"
498
+ @click="date10 = today"
499
+ >
500
+ Aujourd'hui
501
+ </v-btn>
502
+ <v-btn
503
+ size="small"
504
+ class="ml-2"
505
+ @click="date10 = '13/04/2025'"
506
+ >
507
+ Weekend
508
+ </v-btn>
509
+ <v-btn
510
+ size="small"
511
+ class="ml-2"
512
+ @click="date10 = nextYear"
513
+ >
514
+ Futur
515
+ </v-btn>
516
+ <div class="mt-2">
517
+ Valeur actuelle: {{ date10 }}
518
+ </div>
519
+ </section>
520
+ </div>
521
+ </template>
522
+
523
+ <style scoped>
524
+ .date-picker-validation-examples {
525
+ padding: 20px;
526
+ max-width: 800px;
527
+ margin: 0 auto;
528
+ }
529
+
530
+ section {
531
+ padding: 20px;
532
+ border: 1px solid #e0e0e0;
533
+ border-radius: 4px;
534
+ }
535
+ </style>
@@ -60,12 +60,6 @@ describe('DatePicker.vue', () => {
60
60
  expect(wrapper.emitted('update:modelValue')[0]).toEqual(['01/01/2023'])
61
61
  })
62
62
 
63
- it('toggles the date picker visibility on focus', async () => {
64
- const input = wrapper.find('input')
65
- await input.trigger('focus')
66
- expect(wrapper.vm.isDatePickerVisible).toBe(true)
67
- })
68
-
69
63
  it('renders the date picker with proper structure', async () => {
70
64
  // Ouvrir le DatePicker pour que les éléments soient dans le DOM
71
65
  wrapper.vm.isDatePickerVisible = true
@@ -151,17 +145,15 @@ describe('DatePicker.vue', () => {
151
145
  plugins: [vuetify],
152
146
  },
153
147
  props: {
154
- required: true, // Le champ est requis
148
+ required: true,
155
149
  },
156
150
  })
157
151
 
158
- // Simule une date valide
159
152
  wrapper.vm.selectedDates = [new Date('2023-01-01')]
160
153
  await nextTick()
161
154
 
162
155
  const result = wrapper.vm.validateOnSubmit()
163
156
 
164
- // Vérifie que validateOnSubmit retourne true et qu'il n'y a pas d'erreurs
165
157
  expect(result).toBe(true)
166
158
  expect(wrapper.vm.errorMessages).toEqual([])
167
159
  })
@@ -172,34 +164,32 @@ describe('DatePicker.vue', () => {
172
164
  plugins: [vuetify],
173
165
  },
174
166
  props: {
175
- required: true, // Le champ est requis
167
+ required: true,
176
168
  },
177
169
  })
178
170
 
179
- // Simule l'absence de date sélectionnée
180
171
  wrapper.vm.selectedDates = null
181
172
  await nextTick()
182
173
 
183
174
  const result = wrapper.vm.validateOnSubmit()
184
175
 
185
- // Vérifie que validateOnSubmit retourne false et qu'il y a des erreurs
186
176
  expect(result).toBe(false)
187
177
  expect(wrapper.vm.errorMessages).toContain('La date est requise.')
188
178
  })
189
179
 
190
180
  it('parses a valid date string into a Date instance', () => {
191
- const modelValue = '15/01/2023' // Chaîne valide
181
+ const modelValue = '15/01/2023'
192
182
  const result = wrapper.vm.initializeSelectedDates(modelValue, 'DD/MM/YYYY')
193
183
 
194
- expect(result).toBeInstanceOf(Date) // Doit retourner une instance de Date
195
- expect(result.toISOString().split('T')[0]).toBe('2023-01-15') // Correspond à la date attendue
184
+ expect(result).toBeInstanceOf(Date)
185
+ expect(result.toISOString().split('T')[0]).toBe('2023-01-15')
196
186
  })
197
187
 
198
188
  it('returns null if modelValue is null or undefined', () => {
199
189
  const modelValue = null
200
190
  const result = wrapper.vm.initializeSelectedDates(modelValue, 'DD/MM/YYYY')
201
191
 
202
- expect(result).toBeNull() // Doit retourner null
192
+ expect(result).toBeNull()
203
193
  })
204
194
 
205
195
  it('handles an invalid date string gracefully', () => {
@@ -210,24 +200,23 @@ describe('DatePicker.vue', () => {
210
200
  })
211
201
 
212
202
  it('sets selectedDates to null when input is empty', () => {
213
- wrapper.vm.updateSelectedDates('') // Simule un input vide
203
+ wrapper.vm.updateSelectedDates('')
214
204
 
215
- expect(wrapper.vm.selectedDates).toBeNull() // Vérifie que selectedDates est null
205
+ expect(wrapper.vm.selectedDates).toBeNull()
216
206
  })
217
207
 
218
208
  it('parses a valid date string and updates selectedDates', () => {
219
209
  const validInput = '15/01/2023'
220
- wrapper.vm.updateSelectedDates(validInput) // Simule un input valide
210
+ wrapper.vm.updateSelectedDates(validInput)
221
211
 
222
- expect(wrapper.vm.selectedDates).toBeInstanceOf(Date) // Vérifie que selectedDates est une instance de Date
223
- expect(wrapper.vm.selectedDates.toISOString().split('T')[0]).toBe('2023-01-15') // Vérifie la date exacte
212
+ expect(wrapper.vm.selectedDates).toBeInstanceOf(Date)
213
+ expect(wrapper.vm.selectedDates.toISOString().split('T')[0]).toBe('2023-01-15')
224
214
  })
225
215
 
226
216
  it('does not update selectedDates for invalid date string', () => {
227
217
  const invalidInput = 'invalid-date'
228
- wrapper.vm.updateSelectedDates(invalidInput) // Simule un input invalide
229
-
230
- expect(wrapper.vm.selectedDates).toBeNull() // Vérifie que selectedDates reste null
218
+ wrapper.vm.updateSelectedDates(invalidInput)
219
+ expect(wrapper.vm.selectedDates).toBeNull()
231
220
  })
232
221
 
233
222
  it('toggles date picker visibility correctly', async () => {
@@ -235,15 +224,12 @@ describe('DatePicker.vue', () => {
235
224
  global: { plugins: [vuetify] },
236
225
  })
237
226
 
238
- // État initial : le date picker est caché
239
227
  expect(wrapper.vm.isDatePickerVisible).toBe(false)
240
228
 
241
- // Ouvrir le date picker
242
229
  wrapper.vm.openDatePicker()
243
230
  await nextTick()
244
231
  expect(wrapper.vm.isDatePickerVisible).toBe(true)
245
232
 
246
- // Fermer le date picker
247
233
  wrapper.vm.isDatePickerVisible = false
248
234
  await nextTick()
249
235
  expect(wrapper.vm.isDatePickerVisible).toBe(false)
@@ -257,7 +243,6 @@ describe('DatePicker.vue', () => {
257
243
  },
258
244
  })
259
245
 
260
- // Valider sans date (devrait échouer)
261
246
  const result = await wrapper.vm.validateOnSubmit()
262
247
  expect(result).toBe(false)
263
248
  expect(wrapper.vm.errorMessages.length).toBeGreaterThan(0)
@@ -299,11 +284,9 @@ describe('DatePicker.vue', () => {
299
284
  },
300
285
  })
301
286
 
302
- // Valider sans date pour générer une erreur
303
287
  await wrapper.vm.validateOnSubmit()
304
288
  await nextTick()
305
289
 
306
- // Vérifier que l'erreur est ajoutée à errorMessages
307
290
  expect(wrapper.vm.errorMessages.length).toBeGreaterThan(0)
308
291
  const errorMessage = wrapper.find('.v-messages__message')
309
292
  expect(errorMessage.exists()).toBe(true)
@@ -318,12 +301,30 @@ describe('DatePicker.vue', () => {
318
301
  },
319
302
  })
320
303
 
321
- // Vérifier que le mode birth date est appliqué
322
304
  expect(wrapper.props('isBirthDate')).toBe(true)
323
305
 
324
- // Ouvrir le picker et vérifier qu'il est visible
325
306
  wrapper.vm.openDatePicker()
326
307
  await nextTick()
327
308
  expect(wrapper.vm.isDatePickerVisible).toBe(true)
328
309
  })
310
+
311
+ it('takes into account disabled and readonly limitations', async () => {
312
+ const wrapper = mount(DatePicker, {
313
+ global: { plugins: [vuetify] },
314
+ props: {
315
+ disabled: true,
316
+ },
317
+ })
318
+
319
+ wrapper.vm.openDatePicker()
320
+ await nextTick()
321
+
322
+ expect(wrapper.vm.isDatePickerVisible).toBe(false)
323
+
324
+ await wrapper.setProps({ disabled: false, readonly: true })
325
+ wrapper.vm.openDatePicker()
326
+ await nextTick()
327
+
328
+ expect(wrapper.vm.isDatePickerVisible).toBe(false)
329
+ })
329
330
  })