@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.
- package/dist/components/CookiesSelection/CookiesSelection.d.ts +26 -26
- package/dist/components/Customs/SyInputSelect/SyInputSelect.d.ts +2 -2
- package/dist/components/Customs/SySelect/SySelect.d.ts +24 -12
- package/dist/components/Customs/SySelect/locales.d.ts +3 -0
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +1393 -3
- package/dist/components/DatePicker/DatePicker.d.ts +3532 -22
- package/dist/components/DatePicker/DateTextInput.d.ts +1408 -11
- package/dist/components/DialogBox/config.d.ts +1 -1
- package/dist/components/DownloadBtn/DownloadBtn.d.ts +2 -0
- package/dist/components/LangBtn/LangBtn.d.ts +467 -1
- package/dist/components/LangBtn/config.d.ts +1 -3
- package/dist/components/NirField/NirField.d.ts +2805 -15
- package/dist/components/PasswordField/PasswordField.d.ts +2 -2
- package/dist/components/PeriodField/PeriodField.d.ts +7345 -325
- package/dist/components/PhoneField/PhoneField.d.ts +3 -3
- package/dist/components/SelectBtnField/SelectBtnField.d.ts +1 -1
- package/dist/components/SkipLink/SkipLink.d.ts +3 -2
- package/dist/components/SyAlert/SyAlert.d.ts +72 -1
- package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +26 -26
- package/dist/components/UserMenuBtn/UserMenuBtn.d.ts +2 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/composables/date/useDateFormat.d.ts +2 -2
- package/dist/composables/date/useDateFormatDayjs.d.ts +23 -0
- package/dist/composables/date/useDateInitializationDayjs.d.ts +18 -0
- package/dist/design-system-v3.js +4314 -3987
- package/dist/design-system-v3.umd.cjs +1 -1
- package/dist/style.css +1 -1
- package/dist/vuetifyConfig.d.ts +1 -0
- package/package.json +1 -1
- package/src/components/BackBtn/Accessibilite.stories.ts +4 -0
- package/src/components/BackBtn/BackBtn.vue +2 -1
- package/src/components/BackToTopBtn/Accessibilite.stories.ts +4 -0
- package/src/components/BackToTopBtn/BackToTopBtn.stories.ts +78 -21
- package/src/components/BackToTopBtn/BackToTopBtn.vue +15 -0
- package/src/components/BackToTopBtn/config.ts +2 -2
- package/src/components/BackToTopBtn/tests/__snapshots__/BackToTopBtn.spec.ts.snap +4 -4
- package/src/components/CopyBtn/Accessibilite.stories.ts +4 -0
- package/src/components/Customs/SyBtnSelect/SyBtnSelect.stories.ts +2 -2
- package/src/components/Customs/SyBtnSelect/SyBtnSelect.vue +0 -1
- package/src/components/Customs/SyInputSelect/SyInputSelect.stories.ts +3 -3
- package/src/components/Customs/SyInputSelect/SyInputSelect.vue +4 -4
- package/src/components/Customs/SySelect/SySelect.stories.ts +4 -0
- package/src/components/Customs/SySelect/SySelect.vue +75 -10
- package/src/components/Customs/SySelect/locales.ts +3 -0
- package/src/components/Customs/SySelect/tests/SySelect.spec.ts +24 -2
- package/src/components/Customs/SyTextField/Accessibilite.stories.ts +7 -0
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +14 -1
- package/src/components/Customs/SyTextField/SyTextField.vue +85 -20
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +795 -0
- package/src/components/DatePicker/DatePicker.stories.ts +432 -1
- package/src/components/DatePicker/DatePicker.vue +143 -76
- package/src/components/DatePicker/DatePickerValidation.mdx +338 -0
- package/src/components/DatePicker/DatePickerValidation.stories.ts +30 -0
- package/src/components/DatePicker/DateTextInput.vue +87 -135
- package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +282 -0
- package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +535 -0
- package/src/components/DatePicker/tests/DatePicker.spec.ts +33 -32
- package/src/components/DatePicker/tests/DateTextInput.spec.ts +83 -35
- package/src/components/DialogBox/DialogBox.stories.ts +5 -2
- package/src/components/DialogBox/DialogBox.vue +1 -1
- package/src/components/DialogBox/config.ts +1 -1
- package/src/components/DownloadBtn/Accessibilite.stories.ts +4 -0
- package/src/components/DownloadBtn/DownloadBtn.stories.ts +17 -8
- package/src/components/DownloadBtn/DownloadBtn.vue +13 -6
- package/src/components/DownloadBtn/tests/__snapshots__/DownloadBtn.spec.ts.snap +0 -2
- package/src/components/FranceConnectBtn/Accessibilite.stories.ts +4 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +3 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +3 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +19 -0
- package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +12 -2
- package/src/components/LangBtn/Accessibilite.stories.ts +4 -0
- package/src/components/LangBtn/LangBtn.stories.ts +1 -4
- package/src/components/LangBtn/LangBtn.vue +68 -9
- package/src/components/LangBtn/config.ts +0 -1
- package/src/components/LangBtn/tests/LangBtn.spec.ts +30 -2
- package/src/components/PageContainer/Accessibilite.stories.ts +36 -23
- package/src/components/PaginatedTable/PaginatedTable.stories.ts +144 -18
- package/src/components/PasswordField/PasswordField.stories.ts +6 -6
- package/src/components/PasswordField/PasswordField.vue +3 -3
- package/src/components/PeriodField/PeriodField.vue +4 -4
- package/src/components/PhoneField/PhoneField.stories.ts +216 -24
- package/src/components/PhoneField/PhoneField.vue +32 -2
- package/src/components/PhoneField/tests/PhoneField.spec.ts +161 -14
- package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +2 -1
- package/src/components/RatingPicker/RatingPicker.stories.ts +1 -1
- package/src/components/SkipLink/Accessibilite.stories.ts +8 -0
- package/src/components/SkipLink/SkipLink.vue +11 -9
- package/src/components/SkipLink/tests/__snapshots__/skipLink.spec.ts.snap +7 -4
- package/src/components/SkipLink/tests/skipLink.spec.ts +120 -6
- package/src/components/SyAlert/Accessibilite.stories.ts +4 -0
- package/src/components/SyAlert/SyAlert.mdx +3 -7
- package/src/components/SyAlert/SyAlert.stories.ts +19 -12
- package/src/components/SyAlert/SyAlert.vue +88 -51
- package/src/components/SyAlert/tests/SyAlert.spec.ts +20 -2
- package/src/components/SyAlert/tests/__snapshots__/SyAlert.spec.ts.snap +83 -75
- package/src/components/UserMenuBtn/UserMenuBtn.stories.ts +56 -0
- package/src/components/UserMenuBtn/UserMenuBtn.vue +4 -2
- package/src/components/UserMenuBtn/tests/UserMenuBtn.spec.ts +41 -0
- package/src/components/index.ts +2 -0
- package/src/composables/date/useDateFormat.ts +17 -1
- package/src/composables/date/useDateFormatDayjs.ts +84 -0
- package/src/composables/date/useDateInitializationDayjs.ts +133 -0
- package/src/composables/rules/useFieldValidation.ts +26 -3
- package/src/stories/Accessibilite/Avancement/Avancement.mdx +12 -0
- package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +134 -0
- package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +1 -1
- package/src/stories/GuideDuDev/LesBreackingChanges.mdx +31 -2
- 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,
|
|
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,
|
|
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'
|
|
181
|
+
const modelValue = '15/01/2023'
|
|
192
182
|
const result = wrapper.vm.initializeSelectedDates(modelValue, 'DD/MM/YYYY')
|
|
193
183
|
|
|
194
|
-
expect(result).toBeInstanceOf(Date)
|
|
195
|
-
expect(result.toISOString().split('T')[0]).toBe('2023-01-15')
|
|
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()
|
|
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('')
|
|
203
|
+
wrapper.vm.updateSelectedDates('')
|
|
214
204
|
|
|
215
|
-
expect(wrapper.vm.selectedDates).toBeNull()
|
|
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)
|
|
210
|
+
wrapper.vm.updateSelectedDates(validInput)
|
|
221
211
|
|
|
222
|
-
expect(wrapper.vm.selectedDates).toBeInstanceOf(Date)
|
|
223
|
-
expect(wrapper.vm.selectedDates.toISOString().split('T')[0]).toBe('2023-01-15')
|
|
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)
|
|
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
|
})
|