@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,283 @@
1
+ <script lang="ts" setup>
2
+ import useCustomizableOptions, { type CustomizableOptions } from '@/composables/useCustomizableOptions'
3
+ import { mdiCheck } from '@mdi/js'
4
+ import { ref, computed, watch } from 'vue'
5
+ import { useTheme } from 'vuetify'
6
+ import { config } from './config'
7
+ import type { SelectBtnItem, SelectBtnValue } from './types'
8
+
9
+ const props = withDefaults(defineProps<CustomizableOptions & {
10
+ modelValue?: SelectBtnValue
11
+ items?: SelectBtnItem[]
12
+ label?: string
13
+ multiple?: boolean
14
+ inline?: boolean
15
+ hint?: string
16
+ error?: boolean
17
+ errorMessages?: string[]
18
+ readonly?: boolean
19
+
20
+ }>(), {
21
+ modelValue: null,
22
+ items: () => [],
23
+ label: undefined,
24
+ multiple: false,
25
+ inline: false,
26
+ hint: undefined,
27
+ error: false,
28
+ errorMessages: undefined,
29
+ readonly: false,
30
+ })
31
+ const options = useCustomizableOptions(config, props)
32
+
33
+ const emits = defineEmits(['update:modelValue', 'update:error', 'update:error-messages'])
34
+ const checkIcon = ref(mdiCheck)
35
+ const internalValue = ref<SelectBtnValue>(null)
36
+ const darktheme = ref<boolean>(useTheme().current.value.dark)
37
+
38
+ watch(() => props.modelValue, (value) => {
39
+ if (value === null && props.multiple) {
40
+ internalValue.value = []
41
+ return
42
+ }
43
+ internalValue.value = value
44
+ }, {
45
+ immediate: true,
46
+ deep: true,
47
+ })
48
+ const filteredItems = computed(() => props.items.filter((item) => {
49
+ return item.value !== null && item.value !== undefined
50
+ }))
51
+
52
+ function isSelected(value: number | string): boolean {
53
+ if (props.multiple) {
54
+ return (
55
+ Array.isArray(internalValue.value)
56
+ && internalValue.value.includes(value)
57
+ )
58
+ }
59
+ return internalValue.value === value
60
+ }
61
+
62
+ function getIconStyles(item: SelectBtnItem): Record<string, string> {
63
+ return {
64
+ visibility: isSelected(item.value) ? 'visible' : 'hidden',
65
+ }
66
+ }
67
+
68
+ function getNewValue(item: SelectBtnItem): SelectBtnValue {
69
+ if (props.multiple) {
70
+ const typedValue = internalValue.value as Array<string | number>
71
+
72
+ // If the item is unique, remove all other items from the array
73
+ const hasUniqueItemSelected = filteredItems.value.some(
74
+ filteredItem =>
75
+ filteredItem.unique
76
+ && typedValue.includes(filteredItem.value),
77
+ )
78
+
79
+ if (item.unique || hasUniqueItemSelected) {
80
+ return [item.value]
81
+ }
82
+
83
+ // If the item is not already selected, add it to the array
84
+ if (!typedValue.includes(item.value)) {
85
+ return [...typedValue, item.value]
86
+ }
87
+
88
+ // If the item is already selected, remove it from the array
89
+ return typedValue.filter(value => value !== item.value)
90
+ }
91
+
92
+ // If the item is already selected, deselect it
93
+ if (internalValue.value === item.value) {
94
+ return null
95
+ }
96
+
97
+ // Select the item
98
+ return item.value
99
+ }
100
+
101
+ function toggleItem(item: SelectBtnItem): void {
102
+ internalValue.value = getNewValue(item)
103
+ emits('update:error', false)
104
+ emits('update:error-messages', undefined)
105
+ emits('update:modelValue', internalValue.value)
106
+ }
107
+
108
+ </script>
109
+
110
+ <template>
111
+ <div
112
+ :class="{ 'form-input': !inline }"
113
+ class="select-btn-field"
114
+ >
115
+ <VBtnToggle
116
+ v-bind="options.btnToggle"
117
+ tag="ul"
118
+ :model-value="internalValue"
119
+ :multiple="multiple"
120
+ :aria-label="label"
121
+ :class="{ 'd-flex flex-column': !inline }"
122
+ class="select-btn-field-toggle d-flex flex-wrap text-primary"
123
+ >
124
+ <li
125
+ v-for="(item, index) in filteredItems"
126
+ :key="`${index} + ${item.value}`"
127
+ class="select-list-item"
128
+ >
129
+ <VBtn
130
+ v-bind="options.btn"
131
+ :aria-expanded="true"
132
+ :value="item.value"
133
+ :disabled="readonly"
134
+ :variant="isSelected(item.value) ? 'flat' : 'outlined'"
135
+ :elevation="0"
136
+ :color="error ? 'error' : 'primary'"
137
+ :class="{
138
+ 'text-error': error && !isSelected(item.value),
139
+ 'justify-start': !isSelected(item.value),
140
+ 'justify-space-between': isSelected(item.value),
141
+ }"
142
+ :label="isSelected(item.value) ? 'Sélectionné' : ''"
143
+ @click="toggleItem(item)"
144
+ >
145
+ <span class="text-body-1">
146
+ {{ item.text }}
147
+ </span>
148
+
149
+ <VIcon
150
+ v-bind="options.icon"
151
+ :style="getIconStyles(item)"
152
+ role="img"
153
+ :aria-hidden="!isSelected(item.value)"
154
+ aria-label="Sélectionné"
155
+ >
156
+ {{ checkIcon }}
157
+ </VIcon>
158
+ </VBtn>
159
+ </li>
160
+ </VBtnToggle>
161
+
162
+ <template v-if="errorMessages">
163
+ <p
164
+ v-for="(errorMessage, index) in errorMessages"
165
+ :key="index"
166
+ :class="darktheme ? 'theme--dark' : 'theme--light'"
167
+ class="v-messages text-error px-3 mt-2 mb-0 opacity-100"
168
+ >
169
+ {{ errorMessage }}
170
+ </p>
171
+ </template>
172
+
173
+ <p
174
+ v-else-if="hint"
175
+ :class="darktheme ? 'theme--dark' : 'theme--light'"
176
+ class="v-messages px-3 mt-2 mb-0 opacity-100"
177
+ >
178
+ {{ hint }}
179
+ </p>
180
+ </div>
181
+ </template>
182
+
183
+ <style lang="scss" scoped>
184
+ @use '@/assets/tokens';
185
+
186
+ :deep(.v-btn-group) {
187
+ height: auto !important;
188
+
189
+ .v-btn__content {
190
+ display: flex;
191
+ width: 100%;
192
+ justify-content: space-between;
193
+ }
194
+
195
+ .v-btn:not(:first-child) {
196
+ border-inline-start: inherit;
197
+ }
198
+
199
+ .v-btn:last-child {
200
+ border-end-end-radius: 4px;
201
+ border-start-end-radius: 4px;
202
+ margin-right: 0;
203
+ }
204
+
205
+ .v-btn:first-child {
206
+ border-start-start-radius: 4px;
207
+ border-end-start-radius: 4px;
208
+ margin-right: 8px;
209
+ }
210
+ }
211
+
212
+ .select-btn-field-toggle {
213
+ background: none !important;
214
+ padding-left: 0 !important;
215
+
216
+ .v-btn {
217
+ background: #fff;
218
+ border-width: 1px !important;
219
+ min-width: 48px !important;
220
+ text-wrap: auto;
221
+ text-align: left;
222
+ padding-top: 0 !important;
223
+ padding-bottom: 0 !important;
224
+
225
+ &.v-btn--active::before {
226
+ opacity: 0 !important;
227
+ }
228
+
229
+ :deep(.v-btn__content) {
230
+ flex-shrink: 1 !important;
231
+ padding: 5px 0 !important;
232
+ }
233
+ }
234
+
235
+ .v-icon {
236
+ height: 1.5rem;
237
+ width: 1.5rem;
238
+ }
239
+
240
+ &.flex-column {
241
+ .v-btn {
242
+ border-radius: 4px !important;
243
+ border-width: 1px !important;
244
+ }
245
+
246
+ .select-list-item + .select-list-item .v-btn {
247
+ margin-top: 8px;
248
+ }
249
+ }
250
+
251
+ .select-list-item {
252
+ all: unset;
253
+ display: contents;
254
+ }
255
+
256
+ &.theme--dark {
257
+ .v-btn {
258
+ background: #1e1e1e;
259
+ }
260
+ }
261
+
262
+ &:not(.v-btn-toggle--group) .v-btn.v-btn {
263
+ border-color: tokens.$primary-base !important;
264
+
265
+ &.text-error {
266
+ border-color: tokens.$colors-text-error !important;
267
+ }
268
+ }
269
+
270
+ // Disable the fade effect when the button is disabled
271
+ :deep(.v-btn--disabled) {
272
+ opacity: 1;
273
+ }
274
+
275
+ :deep(.v-btn--disabled.v-btn--variant-flat .v-btn__overlay) {
276
+ opacity: 0;
277
+ }
278
+
279
+ :deep(.bg-primary) {
280
+ --v-theme-overlay-multiplier: 1;
281
+ }
282
+ }
283
+ </style>
@@ -0,0 +1,11 @@
1
+ export const config = {
2
+ btn: {
3
+ height: 'auto',
4
+ minHeight: '40px',
5
+ activeClass: 'text-white',
6
+ class: 'py-2 d-flex align-items-center',
7
+ },
8
+ icon: {
9
+ class: 'text-white flex-shrink-0 ml-1',
10
+ },
11
+ }
@@ -0,0 +1,4 @@
1
+ export enum ExpertiseLevelEnum {
2
+ DEV = 'dev',
3
+ DESIGN = 'design',
4
+ }
@@ -0,0 +1,327 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import { vuetify } from '@tests/unit/setup'
4
+
5
+ import SelectBtnField from '../SelectBtnField.vue'
6
+
7
+ describe('SelectBtnField', () => {
8
+ it('renders correctly', () => {
9
+ const wrapper = mount(SelectBtnField, {
10
+ global: {
11
+ plugins: [vuetify],
12
+ },
13
+ })
14
+
15
+ expect(wrapper.html()).toMatchSnapshot()
16
+ })
17
+
18
+ it('renders correctly with props', () => {
19
+ const wrapper = mount(SelectBtnField, {
20
+ props: {
21
+ label: 'Test',
22
+ hint: 'Test',
23
+ items: [
24
+ {
25
+ text: 'Test',
26
+ value: 'test',
27
+ },
28
+ {
29
+ text: 'Test 2',
30
+ value: '',
31
+ },
32
+ {
33
+ text: 'Test 3',
34
+ value: 'test3',
35
+ },
36
+ ],
37
+ },
38
+ global: {
39
+ plugins: [vuetify],
40
+ },
41
+ })
42
+
43
+ expect(wrapper.html()).toMatchSnapshot()
44
+ })
45
+
46
+ it('render correctly in multiple mode', () => {
47
+ const wrapper = mount(SelectBtnField, {
48
+ props: {
49
+ label: 'Test',
50
+ hint: 'Test',
51
+ items: [
52
+ {
53
+ text: 'Test',
54
+ value: 'test',
55
+ },
56
+ {
57
+ text: 'Test 2',
58
+ value: '',
59
+ },
60
+ {
61
+ text: 'Test 3',
62
+ value: 'test3',
63
+ },
64
+ ],
65
+ multiple: true,
66
+ },
67
+ global: {
68
+ plugins: [vuetify],
69
+ },
70
+ })
71
+
72
+ expect(wrapper.html()).toMatchSnapshot()
73
+ })
74
+
75
+ it('emits an update event when the value change in single mode', async () => {
76
+ const wrapper = mount(SelectBtnField, {
77
+ props: {
78
+ label: 'Test',
79
+ hint: 'Test',
80
+ items: [
81
+ {
82
+ text: 'Test',
83
+ value: 'test',
84
+ },
85
+ ],
86
+ },
87
+ global: {
88
+ plugins: [vuetify],
89
+ },
90
+ })
91
+
92
+ await wrapper.find('.v-btn').trigger('click')
93
+
94
+ expect(wrapper.emitted()).toHaveProperty('update:modelValue')
95
+
96
+ await wrapper.find('.v-btn').trigger('click')
97
+
98
+ expect(wrapper.emitted('update:modelValue')).toEqual([['test'], [null]])
99
+ })
100
+
101
+ it(`emits an array of values when the value changes in multiple mode`, async () => {
102
+ const wrapper = mount(SelectBtnField, {
103
+ props: {
104
+ label: 'Test',
105
+ hint: 'Test',
106
+ items: [
107
+ {
108
+ text: 'Test',
109
+ value: 'test',
110
+ },
111
+ {
112
+ text: 'Test 2',
113
+ value: 'test2',
114
+ },
115
+ {
116
+ text: 'Test 3',
117
+ value: 'test3',
118
+ },
119
+ ],
120
+ multiple: true,
121
+ },
122
+ global: {
123
+ plugins: [vuetify],
124
+ },
125
+ })
126
+
127
+ await wrapper.find('li:nth-child(2) .v-btn').trigger('click')
128
+ await wrapper.find('li:nth-child(3) .v-btn').trigger('click')
129
+ await wrapper.find('li:nth-child(2) .v-btn').trigger('click')
130
+
131
+ expect(wrapper.emitted('update:modelValue')).toEqual([
132
+ [['test2']],
133
+ [['test2', 'test3']],
134
+ [['test3']],
135
+ ])
136
+ })
137
+
138
+ it(`display correctly with an error`, () => {
139
+ const wrapper = mount(SelectBtnField, {
140
+ props: {
141
+ label: 'Test',
142
+ hint: 'Test',
143
+ items: [
144
+ {
145
+ text: 'Test',
146
+ value: 'test',
147
+ },
148
+ {
149
+ text: 'Test 2',
150
+ value: 'test2',
151
+ },
152
+ {
153
+ text: 'Test 3',
154
+ value: 'test3',
155
+ },
156
+ ],
157
+ error: true,
158
+ errorMessages: ['Test'],
159
+ },
160
+ global: {
161
+ plugins: [vuetify],
162
+ },
163
+ })
164
+
165
+ expect(wrapper.html()).toMatchSnapshot()
166
+ })
167
+
168
+ it(`clear the others values when defined to unique`, async () => {
169
+ const wrapper = mount(SelectBtnField, {
170
+ props: {
171
+ label: 'Test',
172
+ items: [
173
+ {
174
+ text: 'Test 1',
175
+ value: 'test1',
176
+ },
177
+ {
178
+ text: 'Test 2',
179
+ value: 'test2',
180
+ },
181
+ {
182
+ text: 'Other',
183
+ value: 'other',
184
+ unique: true,
185
+ },
186
+ ],
187
+ multiple: true,
188
+ },
189
+ global: {
190
+ plugins: [vuetify],
191
+ },
192
+ })
193
+
194
+ await wrapper.find('li:nth-child(1) .v-btn').trigger('click')
195
+ await wrapper.find('li:nth-child(2) .v-btn').trigger('click')
196
+ await wrapper.find('li:nth-child(3) .v-btn').trigger('click')
197
+ await wrapper.find('li:nth-child(2) .v-btn').trigger('click')
198
+
199
+ expect(wrapper.emitted('update:modelValue')).toEqual([
200
+ [['test1']],
201
+ [['test1', 'test2']],
202
+ [['other']],
203
+ [['test2']],
204
+ ])
205
+ })
206
+
207
+ it(`display correctly in dark mode with an error`, () => {
208
+ const DarkMode = {
209
+ template: `
210
+ <v-app>
211
+ <v-theme-provider theme="dark">
212
+ <div>
213
+ <SelectBtnField v-bind="props" />
214
+ </div>
215
+ </v-theme-provider>
216
+ </v-app>
217
+ `,
218
+ components: {
219
+ SelectBtnField,
220
+ },
221
+ data() {
222
+ return {
223
+ props: {
224
+ label: 'Test',
225
+ hint: 'Test',
226
+ items: [
227
+ {
228
+ text: 'Test 1',
229
+ value: 'test1',
230
+ },
231
+ {
232
+ text: 'Test 2',
233
+ value: 'test2',
234
+ },
235
+ ],
236
+ error: true,
237
+ errorMessages: ['Test'],
238
+ multiple: true,
239
+ inline: true,
240
+ },
241
+ }
242
+ },
243
+ }
244
+
245
+ const wrapper = mount(DarkMode, {
246
+ global: {
247
+ plugins: [vuetify],
248
+ },
249
+ })
250
+
251
+ wrapper.find('li:nth-child(1) .v-btn').trigger('click')
252
+ wrapper.find('li:nth-child(2) .v-btn').trigger('click')
253
+
254
+ expect(wrapper.html()).toMatchSnapshot()
255
+ })
256
+
257
+ it(`display correctly with in dark mode with an hint`, () => {
258
+ const DarkMode = {
259
+ template: `
260
+ <v-app>
261
+ <v-theme-provider theme="dark">
262
+ <div>
263
+ <SelectBtnField v-bind="props" />
264
+ </div>
265
+ </v-theme-provider>
266
+ </v-app>
267
+ `,
268
+ components: {
269
+ SelectBtnField,
270
+ },
271
+ data() {
272
+ return {
273
+ props: {
274
+ label: 'Test',
275
+ hint: 'Test',
276
+ items: [
277
+ {
278
+ text: 'Test 1',
279
+ value: 'test1',
280
+ },
281
+ {
282
+ text: 'Test 2',
283
+ value: 'test2',
284
+ },
285
+ ],
286
+ multiple: true,
287
+ inline: true,
288
+ },
289
+ }
290
+ },
291
+ }
292
+
293
+ const wrapper = mount(DarkMode, {
294
+ global: {
295
+ plugins: [vuetify],
296
+ },
297
+ })
298
+
299
+ expect(wrapper.html()).toMatchSnapshot()
300
+ })
301
+
302
+ it('do not allow to select an item when the readonly prop is defined', async () => {
303
+ const wrapper = mount(SelectBtnField, {
304
+ props: {
305
+ label: 'Test',
306
+ hint: 'Test',
307
+ items: [
308
+ {
309
+ text: 'Test 1',
310
+ value: 'test1',
311
+ },
312
+ {
313
+ text: 'Test 2',
314
+ value: 'test2',
315
+ },
316
+ ],
317
+ readonly: true,
318
+ },
319
+ global: {
320
+ plugins: [vuetify],
321
+ },
322
+ })
323
+
324
+ await wrapper.find('.v-btn').trigger('click')
325
+ expect(wrapper.emitted()).not.toHaveProperty('update:modelValue')
326
+ })
327
+ })