@cnamts/synapse 0.0.14-alpha → 0.0.15-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/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 +2 -2
- package/dist/components/DatePicker/DatePicker.d.ts +732 -16
- package/dist/components/DatePicker/DateTextInput.d.ts +8 -8
- 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 +13 -13
- package/dist/components/PasswordField/PasswordField.d.ts +2 -2
- package/dist/components/PeriodField/PeriodField.d.ts +1462 -30
- 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/UserMenuBtn/UserMenuBtn.d.ts +2 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/design-system-v3.js +3038 -2936
- 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/SyTextField.stories.ts +1 -1
- package/src/components/Customs/SyTextField/SyTextField.vue +3 -3
- package/src/components/DatePicker/DatePicker.vue +82 -57
- package/src/components/DatePicker/DatePickerValidation.mdx +338 -0
- package/src/components/DatePicker/DatePickerValidation.stories.ts +22 -0
- package/src/components/DatePicker/DatePickerValidationExamples.vue +535 -0
- package/src/components/DatePicker/DateTextInput.vue +3 -3
- package/src/components/DatePicker/tests/DateTextInput.spec.ts +2 -2
- 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/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 +1 -0
- package/src/composables/rules/useFieldValidation.ts +26 -3
- 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>
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
label?: string
|
|
18
18
|
required?: boolean
|
|
19
19
|
disabled?: boolean
|
|
20
|
-
|
|
20
|
+
readonly?: boolean
|
|
21
21
|
isOutlined?: boolean
|
|
22
22
|
displayIcon?: boolean
|
|
23
23
|
displayAppendIcon?: boolean
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
label: undefined,
|
|
36
36
|
required: false,
|
|
37
37
|
disabled: false,
|
|
38
|
-
|
|
38
|
+
readonly: false,
|
|
39
39
|
isOutlined: true,
|
|
40
40
|
displayIcon: true,
|
|
41
41
|
displayAppendIcon: false,
|
|
@@ -455,7 +455,7 @@
|
|
|
455
455
|
:success-messages="showSuccessMessages ? successMessages : []"
|
|
456
456
|
:is-on-error="isOnError"
|
|
457
457
|
:disabled="disabled"
|
|
458
|
-
:
|
|
458
|
+
:readonly="readonly"
|
|
459
459
|
:display-icon="displayIcon"
|
|
460
460
|
:display-append-icon="displayAppendIcon"
|
|
461
461
|
:no-icon="noIcon"
|
|
@@ -227,9 +227,9 @@ describe('DateTextInput.vue', () => {
|
|
|
227
227
|
})
|
|
228
228
|
|
|
229
229
|
it('handles readonly state', async () => {
|
|
230
|
-
await wrapper.setProps({
|
|
230
|
+
await wrapper.setProps({ readonly: true })
|
|
231
231
|
const textField = wrapper.findComponent(SyTextField)
|
|
232
|
-
expect(textField.props('
|
|
232
|
+
expect(textField.props('readonly')).toBe(true)
|
|
233
233
|
})
|
|
234
234
|
|
|
235
235
|
it('emits focus and blur events', async () => {
|
|
@@ -121,7 +121,7 @@ const meta: Meta<typeof DialogBox> = {
|
|
|
121
121
|
height: '32px',
|
|
122
122
|
class: 'mt-n2 mr-n2 ml-4',
|
|
123
123
|
},
|
|
124
|
-
|
|
124
|
+
cardActions: {
|
|
125
125
|
class: 'd-flex flex-wrap mt-6',
|
|
126
126
|
},
|
|
127
127
|
cancelBtn: {
|
|
@@ -139,8 +139,11 @@ const meta: Meta<typeof DialogBox> = {
|
|
|
139
139
|
{
|
|
140
140
|
card?: Record<string, any>,
|
|
141
141
|
cardTitle?: Record<string, any>,
|
|
142
|
+
spacer?: Record<string, any>,
|
|
142
143
|
closeBtn?: Record<string, any>,
|
|
143
|
-
|
|
144
|
+
icon?: Record<string, any>,
|
|
145
|
+
actionsBtn?: Record<string, any>,
|
|
146
|
+
actionsSpacer?: Record<string, any>,
|
|
144
147
|
cancelBtn?: Record<string, any>,
|
|
145
148
|
confirmBtn?: Record<string, any>,
|
|
146
149
|
}
|
|
@@ -159,6 +159,10 @@ export const Legende: StoryObj = {
|
|
|
159
159
|
</div>
|
|
160
160
|
</div>
|
|
161
161
|
</div>
|
|
162
|
+
<div class="mt-4">
|
|
163
|
+
<p>Rapport d’audit manuel : <a href="/audits/DownloadBtn.xlsx" style="color:#0C41BD;">Voir le rapport</a></p>
|
|
164
|
+
<p style="color: grey; font-size: 14px">Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system/issues/4007" target="_blank" style="color:#0C41BD;">issue #4007</a>)</p>
|
|
165
|
+
</div>
|
|
162
166
|
`,
|
|
163
167
|
}
|
|
164
168
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { fn, userEvent, within } from '@storybook/test'
|
|
2
2
|
import type { Meta, StoryObj } from '@storybook/vue3'
|
|
3
3
|
import axios from 'axios'
|
|
4
|
-
import {
|
|
4
|
+
import { VSheet } from 'vuetify/components'
|
|
5
5
|
import DownloadBtn from './DownloadBtn.vue'
|
|
6
6
|
import NotificationBar from '../NotificationBar/NotificationBar.vue'
|
|
7
7
|
import { useNotificationService } from '@/services/NotificationService'
|
|
@@ -22,6 +22,15 @@ const meta = {
|
|
|
22
22
|
category: 'slots',
|
|
23
23
|
},
|
|
24
24
|
},
|
|
25
|
+
dark: {
|
|
26
|
+
control: 'boolean',
|
|
27
|
+
description: 'Applique le thème sombre.',
|
|
28
|
+
table: {
|
|
29
|
+
type: {
|
|
30
|
+
summary: 'boolean',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
25
34
|
filePromise: {
|
|
26
35
|
control: false,
|
|
27
36
|
description: 'Une fonction retournant une valeur de retour de Axios `Promise<AxiosResponse>`. <br>Exemple: `() => axios.get("https://run.mocky.io/v3/884c25f5-6dc2-4c01-b8d9-26c54042f94f")`',
|
|
@@ -231,16 +240,16 @@ export const Dark: Story = {
|
|
|
231
240
|
{
|
|
232
241
|
name: 'Template',
|
|
233
242
|
code: `<template>
|
|
234
|
-
<
|
|
243
|
+
<VSheet color="primary" class="pa-4">
|
|
235
244
|
<DownloadBtn
|
|
245
|
+
dark
|
|
236
246
|
:file-promise="download"
|
|
237
|
-
background-color="black"
|
|
238
247
|
@error="console.log('error')"
|
|
239
248
|
@success="console.log('success')"
|
|
240
249
|
>
|
|
241
250
|
Télécharger
|
|
242
251
|
</DownloadBtn>
|
|
243
|
-
</
|
|
252
|
+
</VSheet>
|
|
244
253
|
</template>
|
|
245
254
|
`,
|
|
246
255
|
},
|
|
@@ -259,20 +268,20 @@ export const Dark: Story = {
|
|
|
259
268
|
],
|
|
260
269
|
},
|
|
261
270
|
render: args => ({
|
|
262
|
-
components: {
|
|
271
|
+
components: { VSheet, DownloadBtn },
|
|
263
272
|
setup() {
|
|
264
273
|
return { args }
|
|
265
274
|
},
|
|
266
275
|
template: `
|
|
267
|
-
<
|
|
276
|
+
<VSheet color="primary" class="pa-4">
|
|
268
277
|
<DownloadBtn v-bind="args">{{ args.default }}</DownloadBtn>
|
|
269
|
-
</
|
|
278
|
+
</VSheet>
|
|
270
279
|
`,
|
|
271
280
|
}),
|
|
272
281
|
args: {
|
|
282
|
+
dark: true,
|
|
273
283
|
filePromise: () => axios.get('https://run.mocky.io/v3/884c25f5-6dc2-4c01-b8d9-26c54042f94f'),
|
|
274
284
|
default: 'Télécharger',
|
|
275
|
-
backgroundColor: 'black',
|
|
276
285
|
onError: fn(),
|
|
277
286
|
onSuccess: fn(),
|
|
278
287
|
},
|