@cnamts/synapse 0.0.9-alpha → 0.0.10-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 (55) hide show
  1. package/dist/design-system-v3.d.ts +631 -62
  2. package/dist/design-system-v3.js +3451 -2650
  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/components/DatePicker/Accessibilite.mdx +14 -0
  7. package/src/components/DatePicker/Accessibilite.stories.ts +191 -0
  8. package/src/components/DatePicker/AccessibiliteItems.ts +233 -0
  9. package/src/components/DatePicker/DatePicker.mdx +1 -6
  10. package/src/components/DatePicker/DatePicker.stories.ts +16 -16
  11. package/src/components/DatePicker/DatePicker.vue +20 -6
  12. package/src/components/DatePicker/constants/ExpertiseLevelEnum.ts +4 -0
  13. package/src/components/FileList/FileList.mdx +103 -0
  14. package/src/components/FileList/FileList.stories.ts +562 -0
  15. package/src/components/FileList/FileList.vue +78 -0
  16. package/src/components/FileList/UploadItem/UploadItem.vue +270 -0
  17. package/src/components/FileList/UploadItem/locales.ts +9 -0
  18. package/src/components/FileList/tests/FileList.spec.ts +176 -0
  19. package/src/components/FilePreview/FilePreview.mdx +82 -0
  20. package/src/components/FilePreview/FilePreview.stories.ts +242 -0
  21. package/src/components/FilePreview/FilePreview.vue +68 -0
  22. package/src/components/FilePreview/config.ts +10 -0
  23. package/src/components/FilePreview/locales.ts +4 -0
  24. package/src/components/FilePreview/tests/FilePreview.spec.ts +124 -0
  25. package/src/components/FilePreview/tests/__snapshots__/FilePreview.spec.ts.snap +11 -0
  26. package/src/components/PeriodField/PeriodField.mdx +32 -0
  27. package/src/components/PeriodField/PeriodField.stories.ts +807 -0
  28. package/src/components/PeriodField/PeriodField.vue +355 -0
  29. package/src/components/PeriodField/tests/PeriodField.spec.ts +348 -0
  30. package/src/components/RangeField/Accessibilite.mdx +14 -0
  31. package/src/components/RangeField/Accessibilite.stories.ts +191 -0
  32. package/src/components/RangeField/AccessibiliteItems.ts +179 -0
  33. package/src/components/RangeField/constants/ExpertiseLevelEnum.ts +4 -0
  34. package/src/components/RatingPicker/Accessibilite.mdx +14 -0
  35. package/src/components/RatingPicker/Accessibilite.stories.ts +191 -0
  36. package/src/components/RatingPicker/AccessibiliteItems.ts +208 -0
  37. package/src/components/RatingPicker/constants/ExpertiseLevelEnum.ts +4 -0
  38. package/src/components/SearchListField/Accessibilite.mdx +14 -0
  39. package/src/components/SearchListField/Accessibilite.stories.ts +191 -0
  40. package/src/components/SearchListField/AccessibiliteItems.ts +310 -0
  41. package/src/components/SearchListField/constants/ExpertiseLevelEnum.ts +4 -0
  42. package/src/components/SelectBtnField/Accessibilite.mdx +14 -0
  43. package/src/components/SelectBtnField/Accessibilite.stories.ts +191 -0
  44. package/src/components/SelectBtnField/AccessibiliteItems.ts +191 -0
  45. package/src/components/SelectBtnField/constants/ExpertiseLevelEnum.ts +4 -0
  46. package/src/components/SyAlert/SyAlert.vue +11 -9
  47. package/src/components/TableToolbar/TableToolbar.mdx +130 -0
  48. package/src/components/TableToolbar/TableToolbar.stories.ts +935 -0
  49. package/src/components/TableToolbar/TableToolbar.vue +168 -0
  50. package/src/components/TableToolbar/config.ts +24 -0
  51. package/src/components/TableToolbar/locales.ts +6 -0
  52. package/src/components/TableToolbar/tests/TableToolbar.spec.ts +166 -0
  53. package/src/components/TableToolbar/tests/__snapshots__/TableToolbar.spec.ts.snap +359 -0
  54. package/src/components/index.ts +3 -0
  55. package/src/composables/rules/useFieldValidation.ts +17 -15
@@ -0,0 +1,935 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import TableToolbar from './TableToolbar.vue'
3
+ import { VDataTable } from 'vuetify/components'
4
+ import { ref } from 'vue'
5
+ import { fn } from '@storybook/test'
6
+
7
+ const meta = {
8
+ title: 'Composants/Tableaux/TableToolbar',
9
+ component: TableToolbar,
10
+ argTypes: {
11
+ 'nbTotal': {
12
+ description: 'Le nombre total de résultats',
13
+ type: 'number',
14
+ control: {
15
+ type: 'number',
16
+ },
17
+ table: {
18
+ category: 'props',
19
+ },
20
+ },
21
+ 'nbFiltered': {
22
+ description: 'Le nombre de résultats filtrés.',
23
+ type: 'number',
24
+ control: {
25
+ type: 'number',
26
+ },
27
+ },
28
+ 'search': {
29
+ description: 'La valeur du champ de recherche',
30
+ type: 'string',
31
+ control: {
32
+ type: 'text',
33
+ },
34
+ },
35
+ 'searchLabel': {
36
+ description: 'Le label du champ de recherche',
37
+ type: 'string',
38
+ control: {
39
+ type: 'text',
40
+ },
41
+ defaultValue: 'Rechercher',
42
+ },
43
+ 'showAddButton': {
44
+ description: 'Affiche le bouton d\'ajout',
45
+ type: 'boolean',
46
+ control: {
47
+ type: 'boolean',
48
+ },
49
+ },
50
+ 'addButtonLabel': {
51
+ description: 'Le label du bouton d\'ajout',
52
+ type: 'string',
53
+ control: {
54
+ type: 'text',
55
+ },
56
+ defaultValue: 'Ajouter',
57
+ },
58
+ 'loading': {
59
+ description: 'Désactive les éléments interactifs',
60
+ type: 'boolean',
61
+ control: {
62
+ type: 'boolean',
63
+ },
64
+ defaultValue: false,
65
+ },
66
+ 'locales': {
67
+ description: 'Traductions',
68
+ control: {
69
+ type: 'object',
70
+ },
71
+ table: {
72
+ type: {
73
+ summary: 'object',
74
+ },
75
+ defaultValue: {
76
+ summary: 'Locales',
77
+ detail: `{
78
+ rowText: (lignes: string, plural: boolean): string =>
79
+ \`\${lignes} ligne\${plural ? 's' : ''}\`,
80
+ search: 'Rechercher',
81
+ addBtnLabel: 'Ajouter',
82
+ }`,
83
+ },
84
+ },
85
+ },
86
+ 'vuetifyOptions': {
87
+ control: 'object',
88
+ description: 'Personnalisation des composants Vuetify internes',
89
+ table: {
90
+ category: 'props',
91
+ defaultValue: {
92
+ summary: 'object',
93
+ detail: `
94
+ {
95
+ toolbar: {
96
+ flat: true,
97
+ color: '#FFFFFF',
98
+ height: 'auto',
99
+ minHeight: '56px',
100
+ class: 'd-flex',
101
+ },
102
+ addBtn: {
103
+ variant: 'outlined',
104
+ color: 'primary',
105
+ class: 'my-1 px-2 px-md-4',
106
+ minWidth: '44px',
107
+ },
108
+ addIconLabel: {
109
+ class: 'mr-1',
110
+ },
111
+ textField: {
112
+ variant: 'underlined',
113
+ clearable: true,
114
+ singleLine: true,
115
+ hideDetails: true,
116
+ },
117
+ }`,
118
+ },
119
+ },
120
+ },
121
+ 'search-left': {
122
+ control: 'text',
123
+ description: 'Slot pour le contenu à gauche du champ de recherche',
124
+ },
125
+ 'search-right': {
126
+ control: 'text',
127
+ description: 'Slot pour le contenu à droite du champ de recherche',
128
+ },
129
+ 'onAdd': {
130
+ description: 'Événement émis lors du clic sur le bouton d\'ajout',
131
+ table: {
132
+ category: 'events',
133
+ },
134
+ },
135
+ 'onUpdate:search': {
136
+ description: 'Événement émis lors de la modification du champ de recherche',
137
+ table: {
138
+ category: 'events',
139
+ },
140
+ },
141
+ },
142
+ parameters: {
143
+ controls: {
144
+ exclude: ['add', 'update:search'],
145
+ },
146
+ },
147
+ } satisfies Meta<typeof TableToolbar>
148
+
149
+ export default meta
150
+
151
+ type Story = StoryObj<typeof meta>
152
+
153
+ export const Default: Story = {
154
+ args: {
155
+ 'nbFiltered': 5,
156
+ 'nbTotal': 10,
157
+ 'onAdd': fn(),
158
+ 'onUpdate:search': fn(),
159
+ },
160
+ parameters: {
161
+ sourceCode: [
162
+ {
163
+ name: 'Template',
164
+ code: `
165
+ <template>
166
+ <TableToolbar
167
+ v-model="search"
168
+ :nb-total="10"
169
+ :nb-filtered="5"
170
+ />
171
+ </template>
172
+ `,
173
+ },
174
+ {
175
+ name: 'Script',
176
+ code: `
177
+ <script setup lang="ts">
178
+ import { TableToolbar } from '@cnamts/synapse'
179
+ import { ref } from 'vue'
180
+
181
+ const search = ref('')
182
+ </script>
183
+ `,
184
+ },
185
+ ],
186
+ },
187
+ }
188
+
189
+ export const AddButton: Story = {
190
+ args: {
191
+ 'nbTotal': 2,
192
+ 'onAdd': fn(),
193
+ 'onUpdate:search': fn(),
194
+ },
195
+ render: (args) => {
196
+ return {
197
+ components: { TableToolbar, VDataTable },
198
+ setup() {
199
+ const headers = [
200
+ {
201
+ title: 'Nom',
202
+ value: 'lastname',
203
+ },
204
+ {
205
+ title: 'Prénom',
206
+ value: 'firstname',
207
+ },
208
+ {
209
+ title: 'Email',
210
+ value: 'email',
211
+ },
212
+ ]
213
+
214
+ const items = [
215
+ {
216
+ firstname: 'Virginie',
217
+ lastname: 'Beauchesne',
218
+ email: 'virginie.beauchesne@example.com',
219
+ },
220
+ {
221
+ firstname: 'Étienne',
222
+ lastname: 'Salois',
223
+ email: 'etienne.salois@example.com',
224
+ },
225
+ ]
226
+
227
+ const search = ref('')
228
+
229
+ return { args, headers, items, search }
230
+ },
231
+ template: `
232
+ <VDataTable
233
+ :headers="headers"
234
+ :items="items"
235
+ hide-default-footer
236
+ >
237
+ <template #top>
238
+ <TableToolbar
239
+ v-bind="args"
240
+ v-model="search"
241
+ :nb-total="items.length"
242
+ show-add-button
243
+ />
244
+ </template>
245
+ </VDataTable>
246
+ `,
247
+ }
248
+ },
249
+ parameters: {
250
+ sourceCode: [
251
+ {
252
+ name: 'Template',
253
+ code: `
254
+ <template>
255
+ <VDataTable
256
+ :headers="headers"
257
+ :items="items"
258
+ hide-default-footer
259
+ >
260
+ <template #top>
261
+ <TableToolbar
262
+ v-model="search"
263
+ :nb-total="items.length"
264
+ show-add-button
265
+ />
266
+ </template>
267
+ </VDataTable>
268
+ </template>
269
+ `,
270
+ },
271
+ {
272
+ name: 'Script',
273
+ code: `
274
+ <script setup lang="ts">
275
+ import { TableToolbar } from '@cnamts/synapse'
276
+ import { VDataTable } from 'vuetify/components'
277
+ import { ref } from 'vue'
278
+
279
+ const headers = [
280
+ {
281
+ title: 'Nom',
282
+ value: 'lastname',
283
+ },
284
+ {
285
+ title: 'Prénom',
286
+ value: 'firstname',
287
+ },
288
+ {
289
+ title: 'Email',
290
+ value: 'email',
291
+ },
292
+ ]
293
+
294
+ const items = [
295
+ {
296
+ firstname: 'Virginie',
297
+ lastname: 'Beauchesne',
298
+ email: 'virginie.beauchesne@example.com',
299
+ },
300
+ {
301
+ firstname: 'Étienne',
302
+ lastname: 'Salois',
303
+ email: 'etienne.salois@example.com',
304
+ },
305
+ ]
306
+
307
+ const search = ref('')
308
+ </script>
309
+ `,
310
+ },
311
+ ],
312
+ },
313
+ }
314
+
315
+ export const Labels: Story = {
316
+ args: {
317
+ 'nbTotal': 2,
318
+ 'onAdd': fn(),
319
+ 'onUpdate:search': fn(),
320
+ 'showAddButton': true,
321
+ 'addButtonLabel': 'Ajouter un patient',
322
+ 'searchLabel': 'Rechercher un patient',
323
+ },
324
+ render: (args) => {
325
+ return {
326
+ components: { TableToolbar, VDataTable },
327
+ setup() {
328
+ const headers = [
329
+ {
330
+ title: 'Nom',
331
+ value: 'lastname',
332
+ },
333
+ {
334
+ title: 'Prénom',
335
+ value: 'firstname',
336
+ },
337
+ {
338
+ title: 'Email',
339
+ value: 'email',
340
+ },
341
+ ]
342
+
343
+ const items = [
344
+ {
345
+ firstname: 'Virginie',
346
+ lastname: 'Beauchesne',
347
+ email: 'virginie.beauchesne@example.com',
348
+ },
349
+ {
350
+ firstname: 'Étienne',
351
+ lastname: 'Salois',
352
+ email: 'etienne.salois@example.com',
353
+ },
354
+ ]
355
+
356
+ const search = ref('')
357
+
358
+ return { args, headers, items, search }
359
+ },
360
+ template: `
361
+ <VDataTable
362
+ :headers="headers"
363
+ :items="items"
364
+ hide-default-footer
365
+ >
366
+ <template #top>
367
+ <TableToolbar
368
+ v-bind="args"
369
+ v-model="search"
370
+ />
371
+ </template>
372
+ </VDataTable>
373
+ `,
374
+ }
375
+ },
376
+ parameters: {
377
+ sourceCode: [
378
+ {
379
+ name: 'Template',
380
+ code: `
381
+ <template>
382
+ <VDataTable
383
+ :headers="headers"
384
+ :items="items"
385
+ hide-default-footer
386
+ >
387
+ <template #top>
388
+ <TableToolbar
389
+ v-model="search"
390
+ :nb-total="items.length"
391
+ show-add-button
392
+ showAddButton
393
+ addButtonLabel="Ajouter un patient"
394
+ searchLabel="Rechercher un patient"
395
+ />
396
+ </template>
397
+ </VDataTable>
398
+ </template>
399
+ `,
400
+ },
401
+ {
402
+ name: 'Script',
403
+ code: `
404
+ <script setup lang="ts">
405
+ import { TableToolbar } from '@cnamts/synapse'
406
+ import { VDataTable } from 'vuetify/components'
407
+ import { ref } from 'vue'
408
+
409
+ const headers = [
410
+ {
411
+ title: 'Nom',
412
+ value: 'lastname',
413
+ },
414
+ {
415
+ title: 'Prénom',
416
+ value: 'firstname',
417
+ },
418
+ {
419
+ title: 'Email',
420
+ value: 'email',
421
+ },
422
+ ]
423
+
424
+ const items = [
425
+ {
426
+ firstname: 'Virginie',
427
+ lastname: 'Beauchesne',
428
+ email: 'virginie.beauchesne@example.com',
429
+ },
430
+ {
431
+ firstname: 'Étienne',
432
+ lastname: 'Salois',
433
+ email: 'etienne.salois@example.com',
434
+ },
435
+ ]
436
+
437
+ const search = ref('')
438
+ </script>
439
+ `,
440
+ },
441
+ ],
442
+ },
443
+ }
444
+
445
+ export const Loading: Story = {
446
+ args: {
447
+ 'nbTotal': 2,
448
+ 'onAdd': fn(),
449
+ 'onUpdate:search': fn(),
450
+ 'loading': true,
451
+ },
452
+ render: (args) => {
453
+ return {
454
+ components: { TableToolbar, VDataTable },
455
+ setup() {
456
+ const headers = [
457
+ {
458
+ title: 'Nom',
459
+ value: 'lastname',
460
+ },
461
+ {
462
+ title: 'Prénom',
463
+ value: 'firstname',
464
+ },
465
+ {
466
+ title: 'Email',
467
+ value: 'email',
468
+ },
469
+ ]
470
+
471
+ const items = [
472
+ {
473
+ firstname: 'Virginie',
474
+ lastname: 'Beauchesne',
475
+ email: 'virginie.beauchesne@example.com',
476
+ },
477
+ {
478
+ firstname: 'Étienne',
479
+ lastname: 'Salois',
480
+ email: 'etienne.salois@example.com',
481
+ },
482
+ ]
483
+
484
+ const search = ref('')
485
+
486
+ return { args, headers, items, search }
487
+ },
488
+ template: `
489
+ <VDataTable
490
+ :headers="headers"
491
+ :items="items"
492
+ loading
493
+ hide-default-footer
494
+ >
495
+ <template #top>
496
+ <TableToolbar
497
+ v-bind="args"
498
+ v-model="search"
499
+ />
500
+ </template>
501
+ </VDataTable>
502
+ `,
503
+ }
504
+ },
505
+ }
506
+
507
+ export const NbFiltered: Story = {
508
+ args: {
509
+ 'nbTotal': 10,
510
+ 'nbFiltered': 5,
511
+ 'onAdd': fn(),
512
+ 'onUpdate:search': fn(),
513
+ },
514
+ render: (args) => {
515
+ return {
516
+ components: { TableToolbar, VDataTable },
517
+ setup() {
518
+ const headers = [
519
+ {
520
+ title: 'Nom',
521
+ value: 'lastname',
522
+ },
523
+ {
524
+ title: 'Prénom',
525
+ value: 'firstname',
526
+ },
527
+ {
528
+ title: 'Email',
529
+ value: 'email',
530
+ },
531
+ ]
532
+
533
+ const items = [
534
+ {
535
+ firstname: 'Virginie',
536
+ lastname: 'Beauchesne',
537
+ email: 'virginie.beauchesne@example.com',
538
+ },
539
+ {
540
+ firstname: 'Étienne',
541
+ lastname: 'Salois',
542
+ email: 'etienne.salois@example.com',
543
+ },
544
+ ]
545
+
546
+ const search = ref('')
547
+
548
+ return { args, headers, items, search }
549
+ },
550
+ template: `
551
+ <VDataTable
552
+ :headers="headers"
553
+ :items="items"
554
+ hide-default-footer
555
+ >
556
+ <template #top>
557
+ <TableToolbar
558
+ v-bind="args"
559
+ v-model="search"
560
+ />
561
+ </template>
562
+ </VDataTable>
563
+ `,
564
+ }
565
+ },
566
+ parameters: {
567
+ sourceCode: [
568
+ {
569
+ name: 'Template',
570
+ code: `
571
+ <template>
572
+ <VDataTable
573
+ :headers="headers"
574
+ :items="items"
575
+ hide-default-footer
576
+ >
577
+ <template #top>
578
+ <TableToolbar
579
+ v-model="search"
580
+ :nbTotal="10"
581
+ :nbFiltered="5"
582
+ />
583
+ </template>
584
+ </VDataTable>
585
+ </template>
586
+ `,
587
+ },
588
+ {
589
+ name: 'Script',
590
+ code: `
591
+ <script setup lang="ts">
592
+ import { TableToolbar } from '@cnamts/synapse'
593
+ import { VDataTable } from 'vuetify/components'
594
+ import { ref } from 'vue'
595
+
596
+ const headers = [
597
+ {
598
+ title: 'Nom',
599
+ value: 'lastname',
600
+ },
601
+ {
602
+ title: 'Prénom',
603
+ value: 'firstname',
604
+ },
605
+ {
606
+ title: 'Email',
607
+ value: 'email',
608
+ },
609
+ ]
610
+
611
+ const items = [
612
+ {
613
+ firstname: 'Virginie',
614
+ lastname: 'Beauchesne',
615
+ email: 'virginie.beauchesne@example.com',
616
+ },
617
+ {
618
+ firstname: 'Étienne',
619
+ lastname: 'Salois',
620
+ email: 'etienne.salois@example.com',
621
+ },
622
+ ]
623
+
624
+ const search = ref('')
625
+ </script>
626
+ `,
627
+ },
628
+ ],
629
+ },
630
+ }
631
+
632
+ export const Customization: Story = {
633
+ args: {
634
+ 'nbTotal': 10,
635
+ 'onAdd': fn(),
636
+ 'onUpdate:search': fn(),
637
+ 'showAddButton': true,
638
+ 'vuetifyOptions': {
639
+ toolbar: {
640
+ class: 'py-2',
641
+ },
642
+ textField: {
643
+ variant: 'outlined',
644
+ density: 'compact',
645
+ },
646
+ addBtn: {
647
+ height: '40px',
648
+ color: '#663399',
649
+ },
650
+ addIcon: {
651
+ class: 'd-none',
652
+ },
653
+ },
654
+ },
655
+ render: (args) => {
656
+ return {
657
+ components: { TableToolbar, VDataTable },
658
+ setup() {
659
+ const headers = [
660
+ {
661
+ title: 'Nom',
662
+ value: 'lastname',
663
+ },
664
+ {
665
+ title: 'Prénom',
666
+ value: 'firstname',
667
+ },
668
+ {
669
+ title: 'Email',
670
+ value: 'email',
671
+ },
672
+ ]
673
+
674
+ const items = [
675
+ {
676
+ firstname: 'Virginie',
677
+ lastname: 'Beauchesne',
678
+ email: 'virginie.beauchesne@example.com',
679
+ },
680
+ {
681
+ firstname: 'Étienne',
682
+ lastname: 'Salois',
683
+ email: 'etienne.salois@example.com',
684
+ },
685
+ ]
686
+
687
+ const search = ref('')
688
+
689
+ return { args, headers, items, search }
690
+ },
691
+ template: `
692
+ <VDataTable
693
+ :headers="headers"
694
+ :items="items"
695
+ hide-default-footer
696
+ >
697
+ <template #top>
698
+ <TableToolbar
699
+ v-bind="args"
700
+ v-model="search"
701
+ />
702
+ </template>
703
+ </VDataTable>
704
+ `,
705
+ }
706
+ },
707
+ parameters: {
708
+ sourceCode: [
709
+ {
710
+ name: 'Template',
711
+ code: `
712
+ <template>
713
+ <VDataTable
714
+ :headers="headers"
715
+ :items="items"
716
+ hide-default-footer
717
+ >
718
+ <template #top>
719
+ <TableToolbar
720
+ v-model="search"
721
+ :nb-total="10"
722
+ show-add-button
723
+ :vuetifyOptions
724
+ />
725
+ </template>
726
+ </VDataTable>
727
+ </template>
728
+ `,
729
+ },
730
+ {
731
+ name: 'Script',
732
+ code: `
733
+ <script setup lang="ts">
734
+ import { TableToolbar } from '@cnamts/synapse'
735
+ import { VDataTable } from 'vuetify/components'
736
+ import { ref } from 'vue'
737
+
738
+ const headers = [
739
+ {
740
+ title: 'Nom',
741
+ value: 'lastname',
742
+ },
743
+ {
744
+ title: 'Prénom',
745
+ value: 'firstname',
746
+ },
747
+ {
748
+ title: 'Email',
749
+ value: 'email',
750
+ },
751
+ ]
752
+
753
+ const items = [
754
+ {
755
+ firstname: 'Virginie',
756
+ lastname: 'Beauchesne',
757
+ email: 'virginie.beauchesne@example.com',
758
+ },
759
+ {
760
+ firstname: 'Étienne',
761
+ lastname: 'Salois',
762
+ email: 'etienne.salois@example.com',
763
+ },
764
+ ]
765
+
766
+ const vuetifyOptions = {
767
+ toolbar: {
768
+ class: 'py-2',
769
+ },
770
+ textField: {
771
+ variant: 'outlined',
772
+ density: 'compact',
773
+ },
774
+ addBtn: {
775
+ height: '40px',
776
+ color: '#663399',
777
+ },
778
+ addIcon: {
779
+ class: 'd-none',
780
+ },
781
+ }
782
+
783
+ const search = ref('')
784
+ </script>
785
+ `,
786
+ },
787
+ ],
788
+ },
789
+ }
790
+
791
+ export const Slots: Story = {
792
+ args: {
793
+ 'nbTotal': 2,
794
+ 'onAdd': fn(),
795
+ 'onUpdate:search': fn(),
796
+ },
797
+ render: (args) => {
798
+ return {
799
+ components: { TableToolbar, VDataTable },
800
+ setup() {
801
+ const headers = [
802
+ {
803
+ title: 'Nom',
804
+ value: 'lastname',
805
+ },
806
+ {
807
+ title: 'Prénom',
808
+ value: 'firstname',
809
+ },
810
+ {
811
+ title: 'Email',
812
+ value: 'email',
813
+ },
814
+ ]
815
+
816
+ const items = [
817
+ {
818
+ firstname: 'Virginie',
819
+ lastname: 'Beauchesne',
820
+ email: 'virginie.beauchesne@example.com',
821
+ },
822
+ {
823
+ firstname: 'Étienne',
824
+ lastname: 'Salois',
825
+ email: 'etienne.salois@example.com',
826
+ },
827
+ ]
828
+
829
+ const search = ref('')
830
+
831
+ return { args, headers, items, search }
832
+ },
833
+ template: `
834
+ <VDataTable
835
+ :headers="headers"
836
+ :items="items"
837
+ hide-default-footer
838
+ >
839
+ <template #top>
840
+ <TableToolbar
841
+ v-bind="args"
842
+ v-model="search"
843
+ >
844
+ <template #search-left>
845
+ <VBtn
846
+ color="primary"
847
+ variant="outlined"
848
+ size="small"
849
+ class="mx-5"
850
+ >
851
+ Exemple
852
+ </VBtn>
853
+ </template>
854
+ </TableToolbar>
855
+ </template>
856
+ </VDataTable>
857
+ `,
858
+ }
859
+ },
860
+ parameters: {
861
+ sourceCode: [
862
+ {
863
+ name: 'Template',
864
+ code: `
865
+ <template>
866
+ <VDataTable
867
+ :headers="headers"
868
+ :items="items"
869
+ hide-default-footer
870
+ >
871
+ <template #top>
872
+ <TableToolbar
873
+ v-model="search"
874
+ :nb-total="2"
875
+ show-add-button
876
+ >
877
+ <template #search-left>
878
+ <VBtn
879
+ color="primary"
880
+ variant="outlined"
881
+ size="small"
882
+ class="mx-5"
883
+ >
884
+ Exemple
885
+ </VBtn>
886
+ </template>
887
+ </TableToolbar>
888
+ </template>
889
+ </VDataTable>
890
+ </template>
891
+ `,
892
+ },
893
+ {
894
+ name: 'Script',
895
+ code: `
896
+ <script setup lang="ts">
897
+ import { TableToolbar } from '@cnamts/synapse'
898
+ import { VDataTable } from 'vuetify/components'
899
+ import { ref } from 'vue'
900
+
901
+ const headers = [
902
+ {
903
+ title: 'Nom',
904
+ value: 'lastname',
905
+ },
906
+ {
907
+ title: 'Prénom',
908
+ value: 'firstname',
909
+ },
910
+ {
911
+ title: 'Email',
912
+ value: 'email',
913
+ },
914
+ ]
915
+
916
+ const items = [
917
+ {
918
+ firstname: 'Virginie',
919
+ lastname: 'Beauchesne',
920
+ email: 'virginie.beauchesne@example.com',
921
+ },
922
+ {
923
+ firstname: 'Étienne',
924
+ lastname: 'Salois',
925
+ email: 'etienne.salois@example.com',
926
+ },
927
+ ]
928
+
929
+ const search = ref('')
930
+ </script>
931
+ `,
932
+ },
933
+ ],
934
+ },
935
+ }