@cnamts/synapse 0.0.8-alpha → 0.0.9-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 (111) hide show
  1. package/dist/design-system-v3.d.ts +584 -128
  2. package/dist/design-system-v3.js +4176 -2694
  3. package/dist/design-system-v3.umd.cjs +1 -1
  4. package/dist/style.css +1 -1
  5. package/package.json +1 -1
  6. package/src/assets/settings.scss +1 -1
  7. package/src/components/ContextualMenu/Accessibilite.mdx +14 -0
  8. package/src/components/ContextualMenu/Accessibilite.stories.ts +191 -0
  9. package/src/components/ContextualMenu/AccessibiliteItems.ts +89 -0
  10. package/src/components/ContextualMenu/constants/ExpertiseLevelEnum.ts +4 -0
  11. package/src/components/Customs/SySelect/SySelect.stories.ts +7 -7
  12. package/src/components/Customs/SySelect/SySelect.vue +9 -4
  13. package/src/components/Customs/SySelect/tests/SySelect.spec.ts +2 -2
  14. package/src/components/Customs/SyTextField/SyTextField.stories.ts +187 -2
  15. package/src/components/Customs/SyTextField/SyTextField.vue +185 -16
  16. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +2 -4
  17. package/src/components/Customs/SyTextField/tests/__snapshots__/SyTextField.spec.ts.snap +18 -16
  18. package/src/components/Customs/SyTextField/types.d.ts +2 -2
  19. package/src/components/DatePicker/DatePicker.mdx +191 -0
  20. package/src/components/DatePicker/DatePicker.stories.ts +787 -0
  21. package/src/components/DatePicker/DatePicker.vue +560 -0
  22. package/src/components/DatePicker/DateTextInput.vue +409 -0
  23. package/src/components/DatePicker/tests/DatePicker.spec.ts +266 -0
  24. package/src/components/DialogBox/DialogBox.stories.ts +1 -1
  25. package/src/components/ExternalLinks/Accessibilite.mdx +14 -0
  26. package/src/components/ExternalLinks/Accessibilite.stories.ts +191 -0
  27. package/src/components/ExternalLinks/AccessibiliteItems.ts +197 -0
  28. package/src/components/ExternalLinks/constants/ExpertiseLevelEnum.ts +4 -0
  29. package/src/components/ExternalLinks/tests/__snapshots__/ExternalLinks.spec.ts.snap +9 -9
  30. package/src/components/FileUpload/FileUpload.mdx +165 -0
  31. package/src/components/FileUpload/FileUpload.stories.ts +429 -0
  32. package/src/components/FileUpload/FileUpload.vue +195 -0
  33. package/src/components/FileUpload/FileUploadContent.vue +109 -0
  34. package/src/components/FileUpload/locales.ts +10 -0
  35. package/src/components/FileUpload/tests/FileUpload.spec.ts +332 -0
  36. package/src/components/FileUpload/tests/__snapshots__/FileUpload.spec.ts.snap +7 -0
  37. package/src/components/FileUpload/useFileDrop.ts +23 -0
  38. package/src/components/FileUpload/validateFiles.ts +39 -0
  39. package/src/components/NirField/NirField.stories.ts +1 -1
  40. package/src/components/NirField/NirField.vue +2 -1
  41. package/src/components/PasswordField/Accessibilite.mdx +14 -0
  42. package/src/components/PasswordField/Accessibilite.stories.ts +191 -0
  43. package/src/components/PasswordField/AccessibiliteItems.ts +184 -0
  44. package/src/components/PasswordField/PasswordField.vue +3 -3
  45. package/src/components/PasswordField/constants/ExpertiseLevelEnum.ts +4 -0
  46. package/src/components/PhoneField/PhoneField.vue +44 -60
  47. package/src/components/PhoneField/tests/PhoneField.spec.ts +0 -15
  48. package/src/components/RangeField/RangeField.mdx +54 -0
  49. package/src/components/RangeField/RangeField.stories.ts +189 -0
  50. package/src/components/RangeField/RangeField.vue +157 -0
  51. package/src/components/RangeField/RangeSlider/RangeSlider.vue +387 -0
  52. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +64 -0
  53. package/src/components/RangeField/RangeSlider/tests/__snapshots__/rangeSlider.spec.ts.snap +27 -0
  54. package/src/components/RangeField/RangeSlider/tests/rangeSlider.spec.ts +100 -0
  55. package/src/components/RangeField/RangeSlider/tests/useDoubleSlider.spec.ts +246 -0
  56. package/src/components/RangeField/RangeSlider/tests/useMouseSlide.spec.ts +204 -0
  57. package/src/components/RangeField/RangeSlider/tests/useThumb.spec.ts +22 -0
  58. package/src/components/RangeField/RangeSlider/tests/useThumbKeyboard.spec.ts +233 -0
  59. package/src/components/RangeField/RangeSlider/tests/useTooltipsNudge.spec.ts +150 -0
  60. package/src/components/RangeField/RangeSlider/tests/useTrack.spec.ts +314 -0
  61. package/src/components/RangeField/RangeSlider/tests/vAnimateClick.spec.ts +32 -0
  62. package/src/components/RangeField/RangeSlider/types.ts +15 -0
  63. package/src/components/RangeField/RangeSlider/useMouseSlide.ts +109 -0
  64. package/src/components/RangeField/RangeSlider/useRangeSlider.ts +126 -0
  65. package/src/components/RangeField/RangeSlider/useThumb.ts +18 -0
  66. package/src/components/RangeField/RangeSlider/useThumbKeyboard.ts +84 -0
  67. package/src/components/RangeField/RangeSlider/useTooltipsNudge.ts +92 -0
  68. package/src/components/RangeField/RangeSlider/useTrack.ts +116 -0
  69. package/src/components/RangeField/RangeSlider/vAnimateClick.ts +19 -0
  70. package/src/components/RangeField/config.ts +7 -0
  71. package/src/components/RangeField/locales.ts +4 -0
  72. package/src/components/RangeField/tests/RangeField.spec.ts +224 -0
  73. package/src/components/RangeField/tests/__snapshots__/RangeField.spec.ts.snap +379 -0
  74. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +205 -0
  75. package/src/components/RatingPicker/EmotionPicker/locales.ts +3 -0
  76. package/src/components/RatingPicker/EmotionPicker/tests/EmotionPicker.spec.ts +104 -0
  77. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +66 -0
  78. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +159 -0
  79. package/src/components/RatingPicker/NumberPicker/locales.ts +4 -0
  80. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +73 -0
  81. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +105 -0
  82. package/src/components/RatingPicker/Rating.ts +45 -0
  83. package/src/components/RatingPicker/RatingPicker.mdx +56 -0
  84. package/src/components/RatingPicker/RatingPicker.stories.ts +515 -0
  85. package/src/components/RatingPicker/RatingPicker.vue +122 -0
  86. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +116 -0
  87. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +95 -0
  88. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +36 -0
  89. package/src/components/RatingPicker/locales.ts +3 -0
  90. package/src/components/RatingPicker/tests/Rating.spec.ts +104 -0
  91. package/src/components/RatingPicker/tests/RatingPicker.spec.ts +187 -0
  92. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +108 -0
  93. package/src/components/SearchListField/SearchListField.mdx +74 -0
  94. package/src/components/SearchListField/SearchListField.stories.ts +126 -0
  95. package/src/components/SearchListField/SearchListField.vue +194 -0
  96. package/src/components/SearchListField/locales.ts +5 -0
  97. package/src/components/SearchListField/tests/SearchListField.spec.ts +323 -0
  98. package/src/components/SearchListField/types.d.ts +4 -0
  99. package/src/components/SelectBtnField/SelectBtnField.mdx +50 -0
  100. package/src/components/SelectBtnField/SelectBtnField.stories.ts +763 -0
  101. package/src/components/SelectBtnField/SelectBtnField.vue +283 -0
  102. package/src/components/SelectBtnField/config.ts +11 -0
  103. package/src/components/SelectBtnField/tests/SelectBtnField.spec.ts +327 -0
  104. package/src/components/SelectBtnField/tests/__snapshots__/SelectBtnField.spec.ts.snap +125 -0
  105. package/src/components/SelectBtnField/types.d.ts +11 -0
  106. package/src/components/index.ts +8 -1
  107. package/src/composables/rules/useFieldValidation.ts +172 -44
  108. package/src/designTokens/index.ts +3 -3
  109. package/src/stories/Fondamentaux/CustomisationEtThemes.mdx +52 -2
  110. package/src/utils/calcHumanFileSize/index.ts +12 -0
  111. package/src/utils/calcHumanFileSize/tests/calcHumanFileSize.spec.ts +21 -0
@@ -0,0 +1,763 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import SelectBtnField from './SelectBtnField.vue'
3
+ import SyAlert from '../SyAlert/SyAlert.vue'
4
+ import { VBtn } from 'vuetify/components'
5
+ import { ref } from 'vue'
6
+
7
+ const meta = {
8
+ title: 'Composants/Formulaires/SelectBtnField',
9
+ component: SelectBtnField,
10
+ decorators: [
11
+ () => ({
12
+ template: '<div style="padding: 20px;"><story/></div>',
13
+ }),
14
+ ],
15
+ parameters: {
16
+ layout: 'fullscreen',
17
+ controls: { exclude: ['copy'] },
18
+ },
19
+ argTypes: {
20
+ modelValue: {
21
+ control: { SelectBtnField },
22
+ default: null,
23
+ },
24
+ items: {
25
+ control: { Array },
26
+ default: [],
27
+ },
28
+ label: {
29
+ control: { type: 'text' },
30
+ default: null,
31
+ },
32
+ multiple: {
33
+ control: { type: 'boolean' },
34
+ default: false,
35
+ },
36
+ inline: {
37
+ control: { type: 'boolean' },
38
+ default: false,
39
+ },
40
+ hint: {
41
+ control: { type: 'text' },
42
+ default: undefined,
43
+ },
44
+ error: {
45
+ control: { type: 'boolean' },
46
+ default: false,
47
+ },
48
+ errorMessages: {
49
+ control: { type: 'text' },
50
+ default: undefined,
51
+ },
52
+ readonly: {
53
+ control: { type: 'boolean' },
54
+ default: false,
55
+ },
56
+ vuetifyOptions: {
57
+ control: { type: 'object' },
58
+ description: 'Options pour personnaliser les composants Vuetify utilisés en interne.',
59
+ table: {
60
+ type: {
61
+ summary: 'object',
62
+ detail: `{
63
+ btnToggle: 'VBtnToggle',
64
+ btn: 'VBtn',
65
+ spacer: 'VSpacer',
66
+ icon: 'VIcon'
67
+ }`,
68
+ },
69
+ defaultValue: {
70
+ summary: 'config',
71
+ detail: ` {
72
+ btn: {
73
+ height: 'auto',
74
+ minHeight: '40px',
75
+ activeClass: 'text-white',
76
+ class: 'py-2 d-flex align-items-center',
77
+ },
78
+ icon: {
79
+ class: 'text-white flex-shrink-0 ml-1',
80
+ },
81
+ }`,
82
+ },
83
+ category: 'props',
84
+ },
85
+ },
86
+ },
87
+ } satisfies Meta<typeof SelectBtnField>
88
+
89
+ export default meta
90
+
91
+ type Story = StoryObj<typeof meta>
92
+
93
+ export const Default: Story = {
94
+ parameters: {
95
+ sourceCode: [
96
+ {
97
+ name: 'Template',
98
+ code: `<template>
99
+ <div style="max-width: 400px">
100
+ <SelectBtnField
101
+ v-model="args.modelValue"
102
+ :items="args.items"
103
+ label="Moyen de contact"
104
+ />
105
+ </div>
106
+ </template>
107
+ `,
108
+ },
109
+ {
110
+ name: 'Script',
111
+ code: `<script setup lang="ts">
112
+ import { SelectBtnField } from '@cnamts/synapse'
113
+ import { ref } from 'vue'
114
+
115
+ const value = ref([])
116
+ const items = [
117
+ {
118
+ text: 'Email',
119
+ value: 'email',
120
+ },
121
+ {
122
+ text: 'Courrier',
123
+ value: 'courrier',
124
+ },
125
+ {
126
+ text: 'SMS',
127
+ value: 'sms',
128
+ },
129
+ ]
130
+
131
+ </script>
132
+ `,
133
+ },
134
+ ],
135
+ },
136
+ args: {
137
+ modelValue: null,
138
+ items: [
139
+ {
140
+ text: 'Email',
141
+ value: 'email',
142
+ },
143
+ {
144
+ text: 'Courrier',
145
+ value: 'courrier',
146
+ },
147
+ {
148
+ text: 'SMS',
149
+ value: 'sms',
150
+ },
151
+ ],
152
+ label: 'Moyen de contact',
153
+ multiple: false,
154
+ inline: false,
155
+ hint: undefined,
156
+ error: false,
157
+ errorMessages: undefined,
158
+ readonly: false,
159
+ },
160
+ render: (args) => {
161
+ return {
162
+ components: { SelectBtnField },
163
+ setup() {
164
+ return { args }
165
+ },
166
+ template: `
167
+ <div style="max-width: 400px">
168
+ <SelectBtnField
169
+ v-model="args.modelValue"
170
+ :items="args.items"
171
+ :label="args.label"
172
+ :multiple="args.multiple"
173
+ :inline="args.inline"
174
+ :hint="args.hint"
175
+ :error="args.error"
176
+ :error-messages="args.errorMessages"
177
+ :readonly="args.readonly"
178
+ />
179
+ </div>
180
+ `,
181
+ }
182
+ },
183
+ }
184
+
185
+ export const Multiple: Story = {
186
+ parameters: {
187
+ sourceCode: [
188
+ {
189
+ name: 'Template',
190
+ code: `<template>
191
+ <div style="max-width: 400px">
192
+ <SelectBtnField
193
+ v-model="args.modelValue"
194
+ :items="args.items"
195
+ label="Moyen de contact"
196
+ multiple
197
+ />
198
+ </div>
199
+ </template>
200
+ `,
201
+ },
202
+ {
203
+ name: 'Script',
204
+ code: `<script setup lang="ts">
205
+ import { SelectBtnField } from '@cnamts/synapse'
206
+ import { ref } from 'vue'
207
+
208
+ const value = ref([])
209
+ const items = [
210
+ {
211
+ text: 'Email',
212
+ value: 'email',
213
+ },
214
+ {
215
+ text: 'Courrier',
216
+ value: 'courrier',
217
+ },
218
+ {
219
+ text: 'SMS',
220
+ value: 'sms',
221
+ },
222
+ ]
223
+ </script>
224
+ `,
225
+ },
226
+ ],
227
+ },
228
+ args: {
229
+ modelValue: null,
230
+ items: [
231
+ {
232
+ text: 'Email',
233
+ value: 'email',
234
+ },
235
+ {
236
+ text: 'Courrier',
237
+ value: 'courrier',
238
+ },
239
+ {
240
+ text: 'SMS',
241
+ value: 'sms',
242
+ },
243
+ ],
244
+ label: 'Moyen de contact',
245
+ multiple: true,
246
+ },
247
+ render: (args) => {
248
+ return {
249
+ components: { SelectBtnField },
250
+ setup() {
251
+ return { args }
252
+ },
253
+ template: `
254
+ <div style="max-width: 400px">
255
+ <SelectBtnField
256
+ v-model="args.modelValue"
257
+ :items="args.items"
258
+ label="Moyen de contact"
259
+ :multiple="args.multiple"
260
+ />
261
+ </div>
262
+ `,
263
+ }
264
+ },
265
+ }
266
+
267
+ export const inline: Story = {
268
+ parameters: {
269
+ sourceCode: [
270
+ {
271
+ name: 'Template',
272
+ code: `<template>
273
+ <div style="max-width: 400px">
274
+ <SelectBtnField
275
+ v-model="args.modelValue"
276
+ :items="args.items"
277
+ label="Moyen de contact"
278
+ inline
279
+ />
280
+ </div>
281
+ </template>
282
+ `,
283
+ },
284
+ {
285
+ name: 'Script',
286
+ code: `<script setup lang="ts">
287
+ import { SelectBtnField } from '@cnamts/synapse'
288
+ import { ref } from 'vue'
289
+
290
+ const value = ref([])
291
+ const items = [
292
+ {
293
+ text: 'Email',
294
+ value: 'email',
295
+ },
296
+ {
297
+ text: 'Courrier',
298
+ value: 'courrier',
299
+ },
300
+ {
301
+ text: 'SMS',
302
+ value: 'sms',
303
+ },
304
+ ]
305
+ </script>
306
+ `,
307
+ },
308
+ ],
309
+ },
310
+ args: {
311
+ modelValue: null,
312
+ items: [
313
+ {
314
+ text: 'Email',
315
+ value: 'email',
316
+ },
317
+ {
318
+ text: 'Courrier',
319
+ value: 'courrier',
320
+ },
321
+ {
322
+ text: 'SMS',
323
+ value: 'sms',
324
+ },
325
+ ],
326
+ label: 'Moyen de contact',
327
+ inline: true,
328
+ },
329
+ render: (args) => {
330
+ return {
331
+ components: { SelectBtnField },
332
+ setup() {
333
+ return { args }
334
+ },
335
+ template: `
336
+ <div style="max-width: 400px">
337
+ <SelectBtnField
338
+ v-model="args.modelValue"
339
+ :items="args.items"
340
+ label="Moyen de contact"
341
+ :inline="args.inline"
342
+ />
343
+ </div>
344
+ `,
345
+ }
346
+ },
347
+ }
348
+
349
+ export const itemUnique: Story = {
350
+ parameters: {
351
+ sourceCode: [
352
+ {
353
+ name: 'Template',
354
+ code: `<template>
355
+ <div style="max-width: 400px">
356
+ <SelectBtnField
357
+ v-model="args.modelValue"
358
+ :items="args.items"
359
+ label="Moyen de contact"
360
+ multiple
361
+ />
362
+ </div>
363
+ </template>
364
+ `,
365
+ },
366
+ {
367
+ name: 'Script',
368
+ code: `<script setup lang="ts">
369
+ import { SelectBtnField } from '@cnamts/synapse'
370
+ import { ref } from 'vue'
371
+
372
+ const value = ref([])
373
+ const items = [
374
+ {
375
+ text: 'Email',
376
+ value: 'email',
377
+ },
378
+ {
379
+ text: 'Courrier',
380
+ value: 'courrier',
381
+ },
382
+ {
383
+ text: 'SMS',
384
+ value: 'sms',
385
+ },
386
+ {
387
+ text: 'Autre',
388
+ value: 'other',
389
+ unique: true
390
+ }
391
+ ]
392
+ </script>
393
+ `,
394
+ },
395
+ ],
396
+ },
397
+ args: {
398
+ modelValue: null,
399
+ items: [
400
+ {
401
+ text: 'Email',
402
+ value: 'email',
403
+ },
404
+ {
405
+ text: 'Courrier',
406
+ value: 'courrier',
407
+ },
408
+ {
409
+ text: 'SMS',
410
+ value: 'sms',
411
+ },
412
+ {
413
+ text: 'Autre',
414
+ value: 'other',
415
+ unique: true,
416
+ },
417
+ ],
418
+ label: 'Moyen de contact',
419
+ multiple: true,
420
+ },
421
+ render: (args) => {
422
+ return {
423
+ components: { SelectBtnField },
424
+ setup() {
425
+ return { args }
426
+ },
427
+ template: `
428
+ <div style="max-width: 400px">
429
+ <SelectBtnField
430
+ v-model="args.modelValue"
431
+ :items="args.items"
432
+ label="Moyen de contact"
433
+ :multiple="args.multiple"
434
+ />
435
+ </div>
436
+ `,
437
+ }
438
+ },
439
+ }
440
+
441
+ export const messageAide: Story = {
442
+ parameters: {
443
+ sourceCode: [
444
+ {
445
+ name: 'Template',
446
+ code: `<template>
447
+ <div style="max-width: 400px">
448
+ <SelectBtnField
449
+ v-model="args.modelValue"
450
+ :items="args.items"
451
+ label="Moyen de contact"
452
+ hint="Par défaut, le moyen de contact est l’email."
453
+ />
454
+ </div>
455
+ </template>
456
+ `,
457
+ },
458
+ {
459
+ name: 'Script',
460
+ code: `<script setup lang="ts">
461
+ import { SelectBtnField } from '@cnamts/synapse'
462
+ import { ref } from 'vue'
463
+
464
+ const value = ref([])
465
+ const items = [
466
+ {
467
+ text: 'Email',
468
+ value: 'email',
469
+ },
470
+ {
471
+ text: 'Courrier',
472
+ value: 'courrier',
473
+ },
474
+ {
475
+ text: 'SMS',
476
+ value: 'sms',
477
+ },
478
+ ]
479
+ </script>
480
+ `,
481
+ },
482
+ ],
483
+ },
484
+ args: {
485
+ modelValue: null,
486
+ items: [
487
+ {
488
+ text: 'Email',
489
+ value: 'email',
490
+ },
491
+ {
492
+ text: 'Courrier',
493
+ value: 'courrier',
494
+ },
495
+ {
496
+ text: 'SMS',
497
+ value: 'sms',
498
+ },
499
+ ],
500
+ label: 'Moyen de contact',
501
+ hint: 'Par défaut, le moyen de contact est l’email.',
502
+ },
503
+ render: (args) => {
504
+ return {
505
+ components: { SelectBtnField },
506
+ setup() {
507
+ return { args }
508
+ },
509
+ template: `
510
+ <div style="max-width: 400px">
511
+ <SelectBtnField
512
+ v-model="args.modelValue"
513
+ :items="args.items"
514
+ label="Moyen de contact"
515
+ :hint="args.hint"
516
+ />
517
+ </div>
518
+ `,
519
+ }
520
+ },
521
+ }
522
+
523
+ export const erreur: Story = {
524
+ parameters: {
525
+ sourceCode: [
526
+ {
527
+ name: 'Template',
528
+ code: `<template>
529
+ <div style="max-width: 400px">
530
+ <SelectBtnField
531
+ v-model="args.modelValue"
532
+ :items="args.items"
533
+ label="Moyen de contact"
534
+ v-model:error="true"
535
+ />
536
+ <VBtn
537
+ color="primary"
538
+ class="mt-3"
539
+ @click="resetExample"
540
+ >
541
+ Réinitialiser
542
+ </VBtn>
543
+ </div>
544
+ </template>
545
+ `,
546
+ },
547
+ {
548
+ name: 'Script',
549
+ code: `<script setup lang="ts">
550
+ import { SelectBtnField } from '@cnamts/synapse'
551
+ import { ref } from 'vue'
552
+ const value = ref([])
553
+ const error = ref(true)
554
+ const items = [
555
+ {
556
+ text: 'Email',
557
+ value: 'email',
558
+ },
559
+ {
560
+ text: 'Courrier',
561
+ value: 'courrier',
562
+ },
563
+ {
564
+ text: 'SMS',
565
+ value: 'sms',
566
+ },
567
+ ]
568
+ function resetExample() {
569
+ value.value = null
570
+ error.value = true
571
+ }
572
+ </script>
573
+ `,
574
+ },
575
+ ],
576
+ },
577
+ args: {
578
+ modelValue: null,
579
+ items: [
580
+ {
581
+ text: 'Email',
582
+ value: 'email',
583
+ },
584
+ {
585
+ text: 'Courrier',
586
+ value: 'courrier',
587
+ },
588
+ {
589
+ text: 'SMS',
590
+ value: 'sms',
591
+ },
592
+ ],
593
+ label: 'Moyen de contact',
594
+ error: true,
595
+ },
596
+ render: (args) => {
597
+ return {
598
+ components: { SelectBtnField, VBtn },
599
+ setup() {
600
+ const error = ref(args.error)
601
+ const value = ref(args.modelValue)
602
+
603
+ function resetExample() {
604
+ error.value = true
605
+ value.value = null
606
+ }
607
+ return { args, resetExample, error, value }
608
+ },
609
+ template: `
610
+ <div style="max-width: 400px">
611
+ <SelectBtnField
612
+ v-model="value"
613
+ :items="args.items"
614
+ label="Moyen de contact"
615
+ v-model:error="error"
616
+ />
617
+ <VBtn
618
+ color="primary"
619
+ class="mt-3"
620
+ @click="resetExample"
621
+ >
622
+ Réinitialiser
623
+ </VBtn>
624
+ </div>
625
+ `,
626
+ }
627
+ },
628
+ }
629
+
630
+ export const messageErreur: Story = {
631
+ parameters: {
632
+ sourceCode: [
633
+ {
634
+ name: 'Template',
635
+ code: `<template>
636
+ <div style="max-width: 400px">
637
+ <SelectBtnField
638
+ v-model="args.modelValue"
639
+ :items="args.items"
640
+ label="Moyen de contact"
641
+ v-model:error="true"
642
+ v-model:error-messages="Le champ est requis."
643
+ />
644
+ <VBtn
645
+ color="primary"
646
+ class="mt-3"
647
+ @click="resetExample"
648
+ >
649
+ Réinitialiser
650
+ </VBtn>
651
+ </div>
652
+ </template>
653
+ `,
654
+ },
655
+ {
656
+ name: 'Script',
657
+ code: `<script setup lang="ts">
658
+ import { SelectBtnField } from '@cnamts/synapse'
659
+ import { ref } from 'vue'
660
+ const value = ref([])
661
+ const error = ref(true)
662
+ const errorMessages = ref(['Le champ est requis.'])
663
+ const items = [
664
+ {
665
+ text: 'Email',
666
+ value: 'email',
667
+ },
668
+ {
669
+ text: 'Courrier',
670
+ value: 'courrier',
671
+ },
672
+ {
673
+ text: 'SMS',
674
+ value: 'sms',
675
+ },
676
+ ]
677
+ function resetExample() {
678
+ value.value = null
679
+ error.value = true
680
+ errorMessages.value = [
681
+ 'Le champ est requis.',
682
+ ]
683
+ }
684
+ </script>
685
+ `,
686
+ },
687
+ ],
688
+ },
689
+ args: {
690
+ modelValue: null,
691
+ items: [
692
+ {
693
+ text: 'Email',
694
+ value: 'email',
695
+ },
696
+ {
697
+ text: 'Courrier',
698
+ value: 'courrier',
699
+ },
700
+ {
701
+ text: 'SMS',
702
+ value: 'sms',
703
+ },
704
+ ],
705
+ label: 'Moyen de contact',
706
+ error: true,
707
+ errorMessages: [
708
+ 'Le champ est requis.',
709
+ ],
710
+ },
711
+ render: (args) => {
712
+ return {
713
+ components: { SelectBtnField, VBtn },
714
+ setup() {
715
+ const error = ref(args.error)
716
+ const value = ref(args.modelValue)
717
+ const errorMessages = ref(args.errorMessages)
718
+
719
+ function resetExample() {
720
+ error.value = true
721
+ value.value = null
722
+ errorMessages.value = ['Le champ est requis.']
723
+ }
724
+ return { args, resetExample, error, value, errorMessages }
725
+ },
726
+ template: `
727
+ <div style="max-width: 400px">
728
+ <SelectBtnField
729
+ v-model="value"
730
+ :items="args.items"
731
+ label="Moyen de contact"
732
+ v-model:error="error"
733
+ v-model:error-messages="errorMessages"
734
+ />
735
+ <VBtn
736
+ color="primary"
737
+ class="mt-3"
738
+ @click="resetExample"
739
+ >
740
+ Réinitialiser
741
+ </VBtn>
742
+ </div>
743
+ `,
744
+ }
745
+ },
746
+ }
747
+ export const Info: Story = {
748
+ render: (args) => {
749
+ return {
750
+ components: { SyAlert },
751
+ setup() {
752
+ return { args }
753
+ },
754
+ template: `
755
+ <SyAlert v-model="args.modelValue" :type="args.type" :variant="tonal" :closable="false">
756
+ <template #default>Vous pouvez utiliser le modificateur v-model:error pour réinitialiser l’erreur lorsque l’utilisateur modifie la valeur du champ.
757
+ </template>
758
+ </SyAlert>
759
+ `,
760
+ }
761
+ },
762
+ tags: ['!dev'],
763
+ }