@cnamts/synapse 0.0.8-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 (156) hide show
  1. package/dist/design-system-v3.d.ts +1152 -127
  2. package/dist/design-system-v3.js +4888 -2605
  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/Accessibilite.mdx +14 -0
  20. package/src/components/DatePicker/Accessibilite.stories.ts +191 -0
  21. package/src/components/DatePicker/AccessibiliteItems.ts +233 -0
  22. package/src/components/DatePicker/DatePicker.mdx +186 -0
  23. package/src/components/DatePicker/DatePicker.stories.ts +787 -0
  24. package/src/components/DatePicker/DatePicker.vue +574 -0
  25. package/src/components/DatePicker/DateTextInput.vue +409 -0
  26. package/src/components/DatePicker/constants/ExpertiseLevelEnum.ts +4 -0
  27. package/src/components/DatePicker/tests/DatePicker.spec.ts +266 -0
  28. package/src/components/DialogBox/DialogBox.stories.ts +1 -1
  29. package/src/components/ExternalLinks/Accessibilite.mdx +14 -0
  30. package/src/components/ExternalLinks/Accessibilite.stories.ts +191 -0
  31. package/src/components/ExternalLinks/AccessibiliteItems.ts +197 -0
  32. package/src/components/ExternalLinks/constants/ExpertiseLevelEnum.ts +4 -0
  33. package/src/components/ExternalLinks/tests/__snapshots__/ExternalLinks.spec.ts.snap +9 -9
  34. package/src/components/FileList/FileList.mdx +103 -0
  35. package/src/components/FileList/FileList.stories.ts +562 -0
  36. package/src/components/FileList/FileList.vue +78 -0
  37. package/src/components/FileList/UploadItem/UploadItem.vue +270 -0
  38. package/src/components/FileList/UploadItem/locales.ts +9 -0
  39. package/src/components/FileList/tests/FileList.spec.ts +176 -0
  40. package/src/components/FilePreview/FilePreview.mdx +82 -0
  41. package/src/components/FilePreview/FilePreview.stories.ts +242 -0
  42. package/src/components/FilePreview/FilePreview.vue +68 -0
  43. package/src/components/FilePreview/config.ts +10 -0
  44. package/src/components/FilePreview/locales.ts +4 -0
  45. package/src/components/FilePreview/tests/FilePreview.spec.ts +124 -0
  46. package/src/components/FilePreview/tests/__snapshots__/FilePreview.spec.ts.snap +11 -0
  47. package/src/components/FileUpload/FileUpload.mdx +165 -0
  48. package/src/components/FileUpload/FileUpload.stories.ts +429 -0
  49. package/src/components/FileUpload/FileUpload.vue +195 -0
  50. package/src/components/FileUpload/FileUploadContent.vue +109 -0
  51. package/src/components/FileUpload/locales.ts +10 -0
  52. package/src/components/FileUpload/tests/FileUpload.spec.ts +332 -0
  53. package/src/components/FileUpload/tests/__snapshots__/FileUpload.spec.ts.snap +7 -0
  54. package/src/components/FileUpload/useFileDrop.ts +23 -0
  55. package/src/components/FileUpload/validateFiles.ts +39 -0
  56. package/src/components/NirField/NirField.stories.ts +1 -1
  57. package/src/components/NirField/NirField.vue +2 -1
  58. package/src/components/PasswordField/Accessibilite.mdx +14 -0
  59. package/src/components/PasswordField/Accessibilite.stories.ts +191 -0
  60. package/src/components/PasswordField/AccessibiliteItems.ts +184 -0
  61. package/src/components/PasswordField/PasswordField.vue +3 -3
  62. package/src/components/PasswordField/constants/ExpertiseLevelEnum.ts +4 -0
  63. package/src/components/PeriodField/PeriodField.mdx +32 -0
  64. package/src/components/PeriodField/PeriodField.stories.ts +807 -0
  65. package/src/components/PeriodField/PeriodField.vue +355 -0
  66. package/src/components/PeriodField/tests/PeriodField.spec.ts +348 -0
  67. package/src/components/PhoneField/PhoneField.vue +44 -60
  68. package/src/components/PhoneField/tests/PhoneField.spec.ts +0 -15
  69. package/src/components/RangeField/Accessibilite.mdx +14 -0
  70. package/src/components/RangeField/Accessibilite.stories.ts +191 -0
  71. package/src/components/RangeField/AccessibiliteItems.ts +179 -0
  72. package/src/components/RangeField/RangeField.mdx +54 -0
  73. package/src/components/RangeField/RangeField.stories.ts +189 -0
  74. package/src/components/RangeField/RangeField.vue +157 -0
  75. package/src/components/RangeField/RangeSlider/RangeSlider.vue +387 -0
  76. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +64 -0
  77. package/src/components/RangeField/RangeSlider/tests/__snapshots__/rangeSlider.spec.ts.snap +27 -0
  78. package/src/components/RangeField/RangeSlider/tests/rangeSlider.spec.ts +100 -0
  79. package/src/components/RangeField/RangeSlider/tests/useDoubleSlider.spec.ts +246 -0
  80. package/src/components/RangeField/RangeSlider/tests/useMouseSlide.spec.ts +204 -0
  81. package/src/components/RangeField/RangeSlider/tests/useThumb.spec.ts +22 -0
  82. package/src/components/RangeField/RangeSlider/tests/useThumbKeyboard.spec.ts +233 -0
  83. package/src/components/RangeField/RangeSlider/tests/useTooltipsNudge.spec.ts +150 -0
  84. package/src/components/RangeField/RangeSlider/tests/useTrack.spec.ts +314 -0
  85. package/src/components/RangeField/RangeSlider/tests/vAnimateClick.spec.ts +32 -0
  86. package/src/components/RangeField/RangeSlider/types.ts +15 -0
  87. package/src/components/RangeField/RangeSlider/useMouseSlide.ts +109 -0
  88. package/src/components/RangeField/RangeSlider/useRangeSlider.ts +126 -0
  89. package/src/components/RangeField/RangeSlider/useThumb.ts +18 -0
  90. package/src/components/RangeField/RangeSlider/useThumbKeyboard.ts +84 -0
  91. package/src/components/RangeField/RangeSlider/useTooltipsNudge.ts +92 -0
  92. package/src/components/RangeField/RangeSlider/useTrack.ts +116 -0
  93. package/src/components/RangeField/RangeSlider/vAnimateClick.ts +19 -0
  94. package/src/components/RangeField/config.ts +7 -0
  95. package/src/components/RangeField/constants/ExpertiseLevelEnum.ts +4 -0
  96. package/src/components/RangeField/locales.ts +4 -0
  97. package/src/components/RangeField/tests/RangeField.spec.ts +224 -0
  98. package/src/components/RangeField/tests/__snapshots__/RangeField.spec.ts.snap +379 -0
  99. package/src/components/RatingPicker/Accessibilite.mdx +14 -0
  100. package/src/components/RatingPicker/Accessibilite.stories.ts +191 -0
  101. package/src/components/RatingPicker/AccessibiliteItems.ts +208 -0
  102. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +205 -0
  103. package/src/components/RatingPicker/EmotionPicker/locales.ts +3 -0
  104. package/src/components/RatingPicker/EmotionPicker/tests/EmotionPicker.spec.ts +104 -0
  105. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +66 -0
  106. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +159 -0
  107. package/src/components/RatingPicker/NumberPicker/locales.ts +4 -0
  108. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +73 -0
  109. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +105 -0
  110. package/src/components/RatingPicker/Rating.ts +45 -0
  111. package/src/components/RatingPicker/RatingPicker.mdx +56 -0
  112. package/src/components/RatingPicker/RatingPicker.stories.ts +515 -0
  113. package/src/components/RatingPicker/RatingPicker.vue +122 -0
  114. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +116 -0
  115. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +95 -0
  116. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +36 -0
  117. package/src/components/RatingPicker/constants/ExpertiseLevelEnum.ts +4 -0
  118. package/src/components/RatingPicker/locales.ts +3 -0
  119. package/src/components/RatingPicker/tests/Rating.spec.ts +104 -0
  120. package/src/components/RatingPicker/tests/RatingPicker.spec.ts +187 -0
  121. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +108 -0
  122. package/src/components/SearchListField/Accessibilite.mdx +14 -0
  123. package/src/components/SearchListField/Accessibilite.stories.ts +191 -0
  124. package/src/components/SearchListField/AccessibiliteItems.ts +310 -0
  125. package/src/components/SearchListField/SearchListField.mdx +74 -0
  126. package/src/components/SearchListField/SearchListField.stories.ts +126 -0
  127. package/src/components/SearchListField/SearchListField.vue +194 -0
  128. package/src/components/SearchListField/constants/ExpertiseLevelEnum.ts +4 -0
  129. package/src/components/SearchListField/locales.ts +5 -0
  130. package/src/components/SearchListField/tests/SearchListField.spec.ts +323 -0
  131. package/src/components/SearchListField/types.d.ts +4 -0
  132. package/src/components/SelectBtnField/Accessibilite.mdx +14 -0
  133. package/src/components/SelectBtnField/Accessibilite.stories.ts +191 -0
  134. package/src/components/SelectBtnField/AccessibiliteItems.ts +191 -0
  135. package/src/components/SelectBtnField/SelectBtnField.mdx +50 -0
  136. package/src/components/SelectBtnField/SelectBtnField.stories.ts +763 -0
  137. package/src/components/SelectBtnField/SelectBtnField.vue +283 -0
  138. package/src/components/SelectBtnField/config.ts +11 -0
  139. package/src/components/SelectBtnField/constants/ExpertiseLevelEnum.ts +4 -0
  140. package/src/components/SelectBtnField/tests/SelectBtnField.spec.ts +327 -0
  141. package/src/components/SelectBtnField/tests/__snapshots__/SelectBtnField.spec.ts.snap +125 -0
  142. package/src/components/SelectBtnField/types.d.ts +11 -0
  143. package/src/components/SyAlert/SyAlert.vue +11 -9
  144. package/src/components/TableToolbar/TableToolbar.mdx +130 -0
  145. package/src/components/TableToolbar/TableToolbar.stories.ts +935 -0
  146. package/src/components/TableToolbar/TableToolbar.vue +168 -0
  147. package/src/components/TableToolbar/config.ts +24 -0
  148. package/src/components/TableToolbar/locales.ts +6 -0
  149. package/src/components/TableToolbar/tests/TableToolbar.spec.ts +166 -0
  150. package/src/components/TableToolbar/tests/__snapshots__/TableToolbar.spec.ts.snap +359 -0
  151. package/src/components/index.ts +11 -1
  152. package/src/composables/rules/useFieldValidation.ts +174 -44
  153. package/src/designTokens/index.ts +3 -3
  154. package/src/stories/Fondamentaux/CustomisationEtThemes.mdx +52 -2
  155. package/src/utils/calcHumanFileSize/index.ts +12 -0
  156. package/src/utils/calcHumanFileSize/tests/calcHumanFileSize.spec.ts +21 -0
@@ -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
+ }