@cnamts/synapse 1.0.1 → 1.0.2

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 (217) hide show
  1. package/README.md +1 -1
  2. package/dist/{DateFilter-BmRuzQ9Z.js → DateFilter-YWOTbfeL.js} +1 -1
  3. package/dist/{NumberFilter-CnIPDHqx.js → NumberFilter-DMmMgALM.js} +1 -1
  4. package/dist/{PeriodFilter-CZwZ8CnQ.js → PeriodFilter-Bok5BHcn.js} +1 -1
  5. package/dist/SelectFilter-BKud2WhN.js +136 -0
  6. package/dist/{TextFilter-DTxZHJwX.js → TextFilter-DvMf2thH.js} +1 -1
  7. package/dist/components/Accordion/Accordion.d.ts +2 -1
  8. package/dist/components/Accordion/composables/useAccordionGroupCommunication.d.ts +5 -0
  9. package/dist/components/Accordion/composables/useAccordionKeyboardNavigation.d.ts +12 -0
  10. package/dist/components/Accordion/composables/useAccordionState.d.ts +13 -0
  11. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +85 -0
  12. package/dist/components/Customs/SyInputSelect/SyInputSelect.d.ts +2 -0
  13. package/dist/components/Customs/SySelect/SySelect.d.ts +33 -13
  14. package/dist/components/Customs/SyTextField/SyTextField.d.ts +2 -2
  15. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +1585 -1452
  16. package/dist/components/DatePicker/DatePicker/DatePicker.d.ts +16 -2
  17. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +3 -1
  18. package/dist/components/DatePicker/composables/index.d.ts +2 -0
  19. package/dist/components/DatePicker/composables/useAsteriskDisplay.d.ts +14 -0
  20. package/dist/components/DatePicker/composables/useDateAutoClamp.d.ts +16 -0
  21. package/dist/components/DatePicker/composables/useDateRangeInput.d.ts +1 -1
  22. package/dist/components/DatePicker/composables/useDisplayedDateString.d.ts +3 -0
  23. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +1 -0
  24. package/dist/components/DatePicker/composables/useMonthButtonCustomization.d.ts +5 -2
  25. package/dist/components/NirField/NirField.d.ts +7 -3
  26. package/dist/components/NirField/nirValidation.d.ts +1 -1
  27. package/dist/components/PasswordField/PasswordField.d.ts +2 -0
  28. package/dist/components/PeriodField/PeriodField.d.ts +52 -8
  29. package/dist/components/PhoneField/PhoneField.d.ts +2 -2
  30. package/dist/components/RangeField/RangeField.d.ts +2 -0
  31. package/dist/components/SearchListField/SearchListField.d.ts +9 -0
  32. package/dist/components/SyTextArea/SyTextArea.d.ts +2 -0
  33. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +14 -9
  34. package/dist/components/Tables/SyTable/SyTable.d.ts +12 -7
  35. package/dist/components/Tables/common/SyTablePagination.d.ts +1636 -0
  36. package/dist/components/Tables/common/TableHeader.d.ts +2 -20
  37. package/dist/components/Tables/common/filters/SelectFilter.d.ts +5 -5
  38. package/dist/components/Tables/common/filters/getFilterComponent.d.ts +1 -0
  39. package/dist/components/Tables/common/filters/locales.d.ts +4 -0
  40. package/dist/components/Tables/common/filters/logics/date.d.ts +1 -0
  41. package/dist/components/Tables/common/filters/logics/number.d.ts +1 -0
  42. package/dist/components/Tables/common/filters/logics/period.d.ts +1 -0
  43. package/dist/components/Tables/common/filters/logics/select.d.ts +1 -0
  44. package/dist/components/Tables/common/filters/logics/text.d.ts +1 -0
  45. package/dist/components/Tables/common/locales.d.ts +21 -0
  46. package/dist/components/Tables/common/organizeColumns/OrganizeColumns.d.ts +267 -0
  47. package/dist/components/Tables/common/organizeColumns/sortHeaders.d.ts +2 -0
  48. package/dist/components/Tables/common/tableFilterUtils.d.ts +1 -0
  49. package/dist/components/Tables/common/tableStorageUtils.d.ts +41 -1
  50. package/dist/components/Tables/common/tableUtils.d.ts +42 -5
  51. package/dist/components/Tables/common/types.d.ts +19 -8
  52. package/dist/components/Tables/common/usePagination.d.ts +22 -0
  53. package/dist/components/Tables/common/useTableCheckbox.d.ts +20 -0
  54. package/dist/components/Tables/common/useTableHeaders.d.ts +76 -0
  55. package/dist/components/Tables/common/useTableItems.d.ts +24 -0
  56. package/dist/components/Tables/common/useTableOptions.d.ts +18 -0
  57. package/dist/components/ToolbarContainer/ToolbarContainer.d.ts +11 -0
  58. package/dist/components/UserMenuBtn/UserMenuBtn.d.ts +9 -2
  59. package/dist/components/index.d.ts +8 -6
  60. package/dist/design-system-v3.js +58 -56
  61. package/dist/design-system-v3.umd.cjs +22 -22
  62. package/dist/main-Cx8qG7YR.js +16344 -0
  63. package/dist/stories/Accessibilite/Vuetify/VuetifyItems.d.ts +14 -2
  64. package/dist/stories/DesignTokens/StylesTypographiques.stories.new.d.ts +8 -0
  65. package/dist/stories/DesignTokens/TypographyDisplay.d.ts +28 -0
  66. package/dist/stories/DesignTokens/vue-shims.d.ts +6 -0
  67. package/dist/style.css +1 -1
  68. package/package.json +1 -1
  69. package/src/common/imgs/accessibility-svgrepo-com.svg +4 -0
  70. package/src/components/Accordion/Accessibilite/AccessibilityGuide.mdx +249 -0
  71. package/src/components/Accordion/Accordion.vue +48 -76
  72. package/src/components/Accordion/composables/__tests__/useAccordionGroupCommunication.spec.ts +146 -0
  73. package/src/components/Accordion/composables/__tests__/useAccordionKeyboardNavigation.spec.ts +209 -0
  74. package/src/components/Accordion/composables/__tests__/useAccordionState.spec.ts +144 -0
  75. package/src/components/Accordion/composables/useAccordionGroupCommunication.ts +52 -0
  76. package/src/components/Accordion/composables/useAccordionKeyboardNavigation.ts +111 -0
  77. package/src/components/Accordion/composables/useAccordionState.ts +59 -0
  78. package/src/components/Accordion/tests/__snapshots__/accordion.spec.ts.snap +3 -0
  79. package/src/components/Customs/SyCheckbox/Accessibilite.mdx +303 -0
  80. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +50 -0
  81. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +630 -0
  82. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +326 -0
  83. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +201 -0
  84. package/src/components/Customs/SyInputSelect/SyInputSelect.stories.ts +1 -0
  85. package/src/components/Customs/SyInputSelect/SyInputSelect.vue +8 -1
  86. package/src/components/Customs/SySelect/SySelect.stories.ts +160 -0
  87. package/src/components/Customs/SySelect/SySelect.vue +291 -32
  88. package/src/components/Customs/SySelect/tests/SySelect.spec.ts +230 -0
  89. package/src/components/Customs/SyTextField/SyTextField.stories.ts +3 -2
  90. package/src/components/Customs/SyTextField/SyTextField.vue +19 -8
  91. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +241 -31
  92. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +305 -57
  93. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.events.spec.ts +161 -0
  94. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +4 -2
  95. package/src/components/DatePicker/DatePicker/DatePicker.stories.ts +259 -137
  96. package/src/components/DatePicker/DatePicker/DatePicker.vue +153 -25
  97. package/src/components/DatePicker/DatePicker/tests/DatePicker.events.spec.ts +189 -0
  98. package/src/components/DatePicker/DatePicker/{DatePicker.spec.ts → tests/DatePicker.spec.ts} +1 -15
  99. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +24 -14
  100. package/src/components/DatePicker/DateTextInput/DateTextInput.events.spec.ts +148 -0
  101. package/src/components/DatePicker/DateTextInput/DateTextInput.spec.ts +3 -1
  102. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +200 -5
  103. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +241 -31
  104. package/src/components/DatePicker/composables/index.ts +2 -0
  105. package/src/components/DatePicker/composables/tests/useDateAutoClamp.spec.ts +190 -0
  106. package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +182 -4
  107. package/src/components/DatePicker/composables/tests/useMonthButtonCustomization.spec.ts +105 -80
  108. package/src/components/DatePicker/composables/useAsteriskDisplay.ts +31 -0
  109. package/src/components/DatePicker/composables/useDateAutoClamp.ts +136 -0
  110. package/src/components/DatePicker/composables/useDateRangeInput.ts +21 -18
  111. package/src/components/DatePicker/composables/useDisplayedDateString.ts +13 -1
  112. package/src/components/DatePicker/composables/useInputBlurHandler.ts +84 -20
  113. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +149 -51
  114. package/src/components/DiacriticPicker/DiacriticPicker.stories.ts +10 -0
  115. package/src/components/ErrorPage/Accessibilite.stories.ts +8 -0
  116. package/src/components/ErrorPage/ErrorPage.vue +12 -6
  117. package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +4 -4
  118. package/src/components/NirField/NirField.mdx +22 -9
  119. package/src/components/NirField/NirField.stories.ts +26 -2
  120. package/src/components/NirField/NirField.vue +209 -22
  121. package/src/components/NirField/nirValidation.ts +17 -3
  122. package/src/components/NirField/tests/NirField.spec.ts +2 -2
  123. package/src/components/NotFoundPage/Accessibilite.stories.ts +8 -0
  124. package/src/components/NotFoundPage/NotFoundPage.vue +2 -1
  125. package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +8 -6
  126. package/src/components/PaginatedTable/PaginatedTable.mdx +2 -0
  127. package/src/components/PasswordField/PasswordField.stories.ts +4 -0
  128. package/src/components/PasswordField/PasswordField.vue +3 -0
  129. package/src/components/PeriodField/PeriodField.vue +2 -0
  130. package/src/components/PhoneField/PhoneField.stories.ts +15 -15
  131. package/src/components/PhoneField/PhoneField.vue +1 -1
  132. package/src/components/RangeField/RangeField.stories.ts +9 -0
  133. package/src/components/RangeField/RangeField.vue +4 -0
  134. package/src/components/RangeField/tests/__snapshots__/RangeField.spec.ts.snap +12 -0
  135. package/src/components/SearchListField/SearchListField.vue +5 -0
  136. package/src/components/SyTextArea/SyTextArea.vue +3 -0
  137. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +0 -1
  138. package/src/components/Tables/SyServerTable/FilterRules.stories.ts +632 -15
  139. package/src/components/Tables/SyServerTable/SyServerTable.mdx +15 -5
  140. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +2844 -1377
  141. package/src/components/Tables/SyServerTable/SyServerTable.vue +155 -66
  142. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +256 -4
  143. package/src/components/Tables/SyTable/FilterRules.stories.ts +183 -0
  144. package/src/components/Tables/SyTable/SyTable.mdx +14 -4
  145. package/src/components/Tables/SyTable/SyTable.stories.ts +1265 -477
  146. package/src/components/Tables/SyTable/SyTable.vue +152 -72
  147. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +366 -4
  148. package/src/components/Tables/common/SyTableFilter.vue +3 -56
  149. package/src/components/Tables/common/SyTablePagination.vue +375 -0
  150. package/src/components/Tables/common/TableHeader.vue +10 -26
  151. package/src/components/Tables/common/filters/SelectFilter.vue +131 -22
  152. package/src/components/Tables/common/filters/getFilterComponent.ts +54 -0
  153. package/src/components/Tables/common/filters/locales.ts +4 -0
  154. package/src/components/Tables/common/filters/logics/date.ts +12 -0
  155. package/src/components/Tables/common/filters/logics/number.ts +48 -0
  156. package/src/components/Tables/common/filters/logics/period.ts +25 -0
  157. package/src/components/Tables/common/filters/logics/select.ts +27 -0
  158. package/src/components/Tables/common/filters/logics/tests/TextFilterLogic.spec.ts +177 -0
  159. package/src/components/Tables/common/filters/logics/text.ts +62 -0
  160. package/src/components/Tables/common/filters/tests/TextFilter.spec.ts +11 -11
  161. package/src/components/Tables/common/locales.ts +24 -0
  162. package/src/components/Tables/common/organizeColumns/OrganizeColumns.vue +269 -0
  163. package/src/components/Tables/common/organizeColumns/sortHeaders.ts +9 -0
  164. package/src/components/Tables/common/tableFilterUtils.ts +43 -295
  165. package/src/components/Tables/common/tableStorageUtils.ts +27 -2
  166. package/src/components/Tables/common/tableStyles.scss +26 -0
  167. package/src/components/Tables/common/tableUtils.ts +3 -16
  168. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +170 -0
  169. package/src/components/Tables/common/tests/filterByRange.spec.ts +215 -0
  170. package/src/components/Tables/common/tests/tableFilterUtils.spec.ts +0 -14
  171. package/src/components/Tables/common/tests/tableUtils.spec.ts +7 -51
  172. package/src/components/Tables/common/types.ts +17 -6
  173. package/src/components/Tables/common/usePagination.ts +83 -0
  174. package/src/components/Tables/common/useTableCheckbox.ts +58 -0
  175. package/src/components/Tables/common/useTableHeaders.ts +88 -0
  176. package/src/components/Tables/common/useTableItems.ts +87 -0
  177. package/src/components/Tables/common/useTableOptions.ts +93 -0
  178. package/src/components/ToolbarContainer/ToolbarContainer.mdx +16 -0
  179. package/src/components/ToolbarContainer/ToolbarContainer.stories.ts +675 -0
  180. package/src/components/ToolbarContainer/ToolbarContainer.vue +128 -0
  181. package/src/components/ToolbarContainer/tests/ToolbarContainer.spec.ts +156 -0
  182. package/src/components/UserMenuBtn/UserMenuBtn.stories.ts +74 -0
  183. package/src/components/UserMenuBtn/UserMenuBtn.vue +19 -17
  184. package/src/components/index.ts +8 -6
  185. package/src/stories/Accessibilite/Aculturation/AuditDesignSystem.mdx +293 -20
  186. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +448 -54
  187. package/src/stories/Accessibilite/Audit/RGAA.mdx +231 -23
  188. package/src/stories/Accessibilite/Avancement/Avancement.mdx +591 -7
  189. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +139 -38
  190. package/src/stories/Accessibilite/Introduction.mdx +258 -18
  191. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +221 -31
  192. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +204 -22
  193. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +537 -24
  194. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +577 -70
  195. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru.mdx +382 -31
  196. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +419 -81
  197. package/src/stories/Accessibilite/Vuetify/Vuetify.mdx +132 -6
  198. package/src/stories/Accessibilite/Vuetify/Vuetify.stories.ts +370 -146
  199. package/src/stories/Accessibilite/Vuetify/VuetifyItems.ts +35 -57
  200. package/src/stories/Demarrer/Accueil.stories.ts +20 -5
  201. package/src/stories/DesignTokens/StylesTypographiques.mdx +10 -9
  202. package/src/stories/DesignTokens/StylesTypographiques.stories.new.ts +397 -0
  203. package/src/stories/DesignTokens/StylesTypographiques.stories.ts +397 -0
  204. package/src/stories/DesignTokens/TypographyDisplay.vue +155 -0
  205. package/src/stories/DesignTokens/vue-shims.d.ts +6 -0
  206. package/src/stories/GuideDuDev/LesBreackingChanges.mdx +0 -2
  207. package/src/stories/GuideDuDev/MigrationDepuisBridge.mdx +1 -1
  208. package/src/stories/GuideDuDev/MigrationDepuisVue2.mdx +1 -1
  209. package/src/stories/GuideDuDev/PortailAgent.mdx +10 -0
  210. package/src/stories/GuideDuDev/PortailAgent.stories.ts +506 -0
  211. package/src/stories/GuideDuDev/Theme.mdx +41 -0
  212. package/dist/SelectFilter-Cj-GW2Cc.js +0 -97
  213. package/dist/main-WDqeoGM-.js +0 -14788
  214. package/src/components/PaginatedTable/tests/__snapshots__/PaginatedTable.spec.ts.snap +0 -886
  215. package/src/components/Tables/SyServerTable/tests/__snapshots__/SyServerTable.spec.ts.snap +0 -521
  216. package/src/components/Tables/SyTable/tests/__snapshots__/SyTable.spec.ts.snap +0 -521
  217. package/src/stories/DesignTokens/ThemePA.mdx +0 -35
@@ -1,4 +1,4 @@
1
- import { describe, it, expect, vi, afterEach } from 'vitest'
1
+ import { describe, it, expect, vi, afterEach, beforeAll } from 'vitest'
2
2
  import { mount } from '@vue/test-utils'
3
3
 
4
4
  import { vuetify } from '@tests/unit/setup'
@@ -6,6 +6,7 @@ import { LocalStorageUtility } from '@/utils/localStorageUtility'
6
6
  import type { DataOptions, FilterOption } from '@/components/Tables/common/types'
7
7
 
8
8
  import SyTable from '../SyTable.vue'
9
+ import { VCard } from 'vuetify/components'
9
10
 
10
11
  vi.mock('@/utils/localStorageUtility')
11
12
 
@@ -27,7 +28,15 @@ const fakeItems = [
27
28
  },
28
29
  ]
29
30
 
30
- const headers = [
31
+ // Define a more complete DataTableHeaders type for testing
32
+ interface TestDataTableHeaders {
33
+ title: string
34
+ key: string
35
+ hidden?: boolean
36
+ order?: number
37
+ }
38
+
39
+ const headers: TestDataTableHeaders[] = [
31
40
  {
32
41
  title: 'ID',
33
42
  key: 'id',
@@ -43,8 +52,27 @@ const headers = [
43
52
  ]
44
53
 
45
54
  describe('SyTable', () => {
55
+ beforeAll(() => {
56
+ // Mock visualViewport for Vuetify's VMenu component
57
+ global.visualViewport = {
58
+ width: 1024,
59
+ height: 768,
60
+ scale: 1,
61
+ offsetLeft: 0,
62
+ offsetTop: 0,
63
+ pageLeft: 0,
64
+ pageTop: 0,
65
+ onresize: null,
66
+ onscroll: null,
67
+ addEventListener: vi.fn(),
68
+ removeEventListener: vi.fn(),
69
+ dispatchEvent: vi.fn(),
70
+ }
71
+ })
72
+
46
73
  afterEach(() => {
47
74
  vi.resetAllMocks()
75
+ document.body.innerHTML = ''
48
76
  })
49
77
 
50
78
  it('renders correctly with default props', () => {
@@ -162,8 +190,7 @@ describe('SyTable', () => {
162
190
  it('passes itemsPerPage prop correctly', () => {
163
191
  const wrapper = mount(SyTable, {
164
192
  props: {
165
- options: {} as DataOptions,
166
- itemsPerPage: 5,
193
+ options: { itemsPerPage: 5 } as DataOptions,
167
194
  suffix: 'test',
168
195
  },
169
196
  attrs: {
@@ -342,4 +369,339 @@ describe('SyTable', () => {
342
369
  await wrapper.vm.$nextTick()
343
370
  expect(wrapper.text()).toContain('Aucune donnée disponible')
344
371
  })
372
+
373
+ it('enables selection when showSelect is true', async () => {
374
+ const wrapper = mount(SyTable, {
375
+ props: {
376
+ headers,
377
+ items: fakeItems,
378
+ showSelect: true,
379
+ suffix: '',
380
+ },
381
+ global: {
382
+ plugins: [vuetify],
383
+ },
384
+ })
385
+
386
+ // Check that the VDataTable has showSelect prop set to true
387
+ const dataTable = wrapper.findComponent({ name: 'VDataTable' })
388
+ expect(dataTable.props('showSelect')).toBe(true)
389
+ })
390
+
391
+ it('disables selection when showSelect is false', async () => {
392
+ const wrapper = mount(SyTable, {
393
+ props: {
394
+ headers,
395
+ items: fakeItems,
396
+ showSelect: false,
397
+ suffix: '',
398
+ },
399
+ global: {
400
+ plugins: [vuetify],
401
+ },
402
+ })
403
+
404
+ // Check that the VDataTable has showSelect prop set to false
405
+ const dataTable = wrapper.findComponent({ name: 'VDataTable' })
406
+ expect(dataTable.props('showSelect')).toBe(false)
407
+ })
408
+
409
+ it('passes the correct item-value function to the data table', async () => {
410
+ const wrapper = mount(SyTable, {
411
+ props: {
412
+ headers,
413
+ items: fakeItems,
414
+ showSelect: true,
415
+ suffix: '',
416
+ },
417
+ global: {
418
+ plugins: [vuetify],
419
+ },
420
+ })
421
+
422
+ // Access the internal getItemValue function
423
+ // Since it's not exposed, we'll test the selection behavior instead
424
+ const dataTable = wrapper.findComponent({ name: 'VDataTable' })
425
+ expect(dataTable.props('itemValue')).toBeDefined()
426
+
427
+ // Instead of testing the internal function directly, we'll verify the component works correctly
428
+ // by checking if the data table has the correct props
429
+ expect(dataTable.props('showSelect')).toBe(true)
430
+ })
431
+
432
+ it('properly binds the v-model for selection', async () => {
433
+ const selectedItems = [fakeItems[0].id, fakeItems[2].id]
434
+ const wrapper = mount(SyTable, {
435
+ props: {
436
+ headers,
437
+ items: fakeItems,
438
+ showSelect: true,
439
+ modelValue: selectedItems,
440
+ suffix: '',
441
+ },
442
+ global: {
443
+ plugins: [vuetify],
444
+ },
445
+ })
446
+
447
+ // Check that the VDataTable has the correct model value
448
+ const dataTable = wrapper.findComponent({ name: 'VDataTable' })
449
+ expect(dataTable.props('modelValue')).toEqual(selectedItems)
450
+ })
451
+
452
+ it('exposes the toggleAllRows method', async () => {
453
+ const wrapper = mount(SyTable, {
454
+ props: {
455
+ headers,
456
+ 'items': fakeItems,
457
+ 'showSelect': true,
458
+ 'modelValue': [],
459
+ 'suffix': '',
460
+ 'onUpdate:modelValue': (val: unknown[]) => {
461
+ wrapper.setProps({ modelValue: val })
462
+ },
463
+ },
464
+ global: {
465
+ plugins: [vuetify],
466
+ },
467
+ })
468
+
469
+ // Since toggleAllRows is not exposed, we'll test if the component renders correctly
470
+ // and has the expected structure for selection
471
+ const dataTable = wrapper.findComponent({ name: 'VDataTable' })
472
+ expect(dataTable.props('showSelect')).toBe(true)
473
+ })
474
+
475
+ it('shoulds hide a column when hideColumn is called', async () => {
476
+ // Create a mock for OrganizeColumns component
477
+ const mockOrganizeColumns = {
478
+ name: 'OrganizeColumns',
479
+ props: ['headers'],
480
+ template: '<div></div>',
481
+ emits: ['update:headers'],
482
+ }
483
+
484
+ // Create test items that will ensure all columns are rendered
485
+ const testItems = [
486
+ { id: 1, name: 'Test 1', age: 25 },
487
+ { id: 2, name: 'Test 2', age: 30 },
488
+ ]
489
+
490
+ const wrapper = mount(SyTable, {
491
+ props: {
492
+ options: {} as DataOptions,
493
+ suffix: 'test',
494
+ headers: JSON.parse(JSON.stringify(headers)), // Use a copy to avoid mutation issues
495
+ items: testItems,
496
+ enableColumnControls: true,
497
+ },
498
+ global: {
499
+ plugins: [vuetify],
500
+ stubs: {
501
+ OrganizeColumns: mockOrganizeColumns,
502
+ },
503
+ },
504
+ attachTo: document.body, // Attach to DOM for better rendering
505
+ })
506
+
507
+ // Get the OrganizeColumns component
508
+ const organizeColumnsComponent = wrapper.findComponent({ name: 'OrganizeColumns' })
509
+ expect(organizeColumnsComponent.exists()).toBe(true)
510
+
511
+ // Verify initial column count
512
+ let columns = wrapper.findAll('th')
513
+ expect(columns.length).toBe(3)
514
+
515
+ // Simulate hiding a column by directly updating the headers
516
+ const updatedHeaders = JSON.parse(JSON.stringify(headers)) as TestDataTableHeaders[]
517
+ updatedHeaders[1].hidden = true // Hide the Name column
518
+ organizeColumnsComponent.vm.$emit('update:headers', updatedHeaders)
519
+ await wrapper.vm.$nextTick()
520
+
521
+ // Check that the column is hidden
522
+ columns = wrapper.findAll('th')
523
+ expect(columns.length).toBe(2) // One less column should be visible
524
+
525
+ wrapper.unmount()
526
+ })
527
+
528
+ it('shoulds move the column ID to the bottom', async () => {
529
+ // Import the sortHeaders function directly
530
+ const { sortHeaders } = await import('../../common/organizeColumns/sortHeaders')
531
+
532
+ // Add order property to headers for proper sorting
533
+ const headersWithOrder = JSON.parse(JSON.stringify(headers)).map((header, index) => ({
534
+ ...header,
535
+ order: index + 1,
536
+ }))
537
+
538
+ // Verify initial order after sorting
539
+ let sortedHeaders = sortHeaders([...headersWithOrder])
540
+ expect(sortedHeaders.length).toBe(3)
541
+ expect(sortedHeaders[0].title).toBe('ID')
542
+ expect(sortedHeaders[1].title).toBe('Name')
543
+ expect(sortedHeaders[2].title).toBe('Age')
544
+
545
+ // Update the headers to move ID to the bottom
546
+ const updatedHeaders = [
547
+ { ...headersWithOrder[0], order: 3 }, // ID moves to position 3
548
+ { ...headersWithOrder[1], order: 1 }, // Name stays at position 1
549
+ { ...headersWithOrder[2], order: 2 }, // Age moves to position 2
550
+ ]
551
+
552
+ // Check that the columns are in the correct order after sorting
553
+ sortedHeaders = sortHeaders(updatedHeaders)
554
+ expect(sortedHeaders.length).toBe(3)
555
+ expect(sortedHeaders[0].title).toBe('Name')
556
+ expect(sortedHeaders[1].title).toBe('Age')
557
+ expect(sortedHeaders[2].title).toBe('ID')
558
+ })
559
+
560
+ it('shoulds move the column age to the top', async () => {
561
+ // Import the sortHeaders function directly
562
+ const { sortHeaders } = await import('../../common/organizeColumns/sortHeaders')
563
+
564
+ // Add order property to headers for proper sorting
565
+ const headersWithOrder = JSON.parse(JSON.stringify(headers)).map((header, index) => ({
566
+ ...header,
567
+ order: index + 1,
568
+ }))
569
+
570
+ // Verify initial order after sorting
571
+ let sortedHeaders = sortHeaders([...headersWithOrder])
572
+ expect(sortedHeaders.length).toBe(3)
573
+ expect(sortedHeaders[0].title).toBe('ID')
574
+ expect(sortedHeaders[1].title).toBe('Name')
575
+ expect(sortedHeaders[2].title).toBe('Age')
576
+
577
+ // Update the headers to move Age to the top
578
+ const updatedHeaders = [
579
+ { ...headersWithOrder[0], order: 2 }, // ID moves to position 2
580
+ { ...headersWithOrder[1], order: 3 }, // Name moves to position 3
581
+ { ...headersWithOrder[2], order: 1 }, // Age moves to position 1
582
+ ]
583
+
584
+ // Check that the columns are in the correct order after sorting
585
+ sortedHeaders = sortHeaders(updatedHeaders)
586
+ expect(sortedHeaders.length).toBe(3)
587
+ expect(sortedHeaders[0].title).toBe('Age')
588
+ expect(sortedHeaders[1].title).toBe('ID')
589
+ expect(sortedHeaders[2].title).toBe('Name')
590
+ })
591
+
592
+ it('shoulds move the column ID to the bottom using the dom', async () => {
593
+ vi.useFakeTimers()
594
+ const wrapper = mount(SyTable, {
595
+ props: {
596
+ options: {} as DataOptions,
597
+ suffix: 'test',
598
+ headers: JSON.parse(JSON.stringify(headers)),
599
+ items: fakeItems,
600
+ enableColumnControls: true,
601
+ },
602
+ global: {
603
+ plugins: [vuetify],
604
+ },
605
+ attachTo: document.body,
606
+ })
607
+
608
+ const btnMenuColumns = wrapper.find('[title="Gestion des colonnes"]')
609
+ await btnMenuColumns.trigger('click')
610
+
611
+ const menuColumns = wrapper.findComponent(VCard)
612
+ expect(menuColumns.exists()).toBe(true)
613
+
614
+ let bottomButton = menuColumns.find('[title="Déplacer la colonne ID vers la droite"]')
615
+ expect(bottomButton.exists()).toBe(true)
616
+
617
+ await bottomButton.trigger('click')
618
+ vi.runAllTimers()
619
+ await wrapper.vm.$nextTick()
620
+
621
+ bottomButton = menuColumns.find('[title="Déplacer la colonne ID vers la droite"]')
622
+
623
+ await bottomButton.trigger('click')
624
+ vi.runAllTimers()
625
+ await wrapper.vm.$nextTick()
626
+
627
+ const columns = wrapper.findAll('th')
628
+ expect(columns.length).toBe(3)
629
+ expect(columns[0].text()).toBe('Name')
630
+ expect(columns[1].text()).toBe('Age')
631
+ expect(columns[2].text()).toBe('ID')
632
+
633
+ wrapper.unmount()
634
+ })
635
+
636
+ it('shoulds move the column age to the top using the dom', async () => {
637
+ vi.useFakeTimers()
638
+ const wrapper = mount(SyTable, {
639
+ props: {
640
+ options: {} as DataOptions,
641
+ suffix: 'test',
642
+ headers: JSON.parse(JSON.stringify(headers)),
643
+ items: fakeItems,
644
+ enableColumnControls: true,
645
+ },
646
+ global: {
647
+ plugins: [vuetify],
648
+ },
649
+ attachTo: document.body,
650
+ })
651
+
652
+ const btnMenuColumns = wrapper.find('[title="Gestion des colonnes"]')
653
+ await btnMenuColumns.trigger('click')
654
+
655
+ const menuColumns = wrapper.findComponent(VCard)
656
+ expect(menuColumns.exists()).toBe(true)
657
+
658
+ let topButton = menuColumns.find('[title="Déplacer la colonne Age vers la gauche"]')
659
+ expect(topButton.exists()).toBe(true)
660
+
661
+ await topButton.trigger('click')
662
+ vi.runAllTimers()
663
+ await wrapper.vm.$nextTick()
664
+
665
+ topButton = menuColumns.find('[title="Déplacer la colonne Age vers la gauche"]')
666
+
667
+ await topButton.trigger('click')
668
+ vi.runAllTimers()
669
+ await wrapper.vm.$nextTick()
670
+
671
+ const columns = wrapper.findAll('th')
672
+ expect(columns.length).toBe(3)
673
+ expect(columns[0].text()).toBe('Age')
674
+ expect(columns[1].text()).toBe('ID')
675
+ expect(columns[2].text()).toBe('Name')
676
+
677
+ wrapper.unmount()
678
+ })
679
+
680
+ it('shoulds hide a column when hideColumn is called using the dom', async () => {
681
+ const wrapper = mount(SyTable, {
682
+ props: {
683
+ options: {} as DataOptions,
684
+ suffix: 'test',
685
+ headers: JSON.parse(JSON.stringify(headers)),
686
+ items: fakeItems,
687
+ enableColumnControls: true,
688
+ },
689
+ global: {
690
+ plugins: [vuetify],
691
+ },
692
+ attachTo: document.body,
693
+ })
694
+ const btnMenuColumns = wrapper.find('[title="Gestion des colonnes"]')
695
+ await btnMenuColumns.trigger('click')
696
+ const menuColumns = wrapper.findComponent(VCard)
697
+ expect(menuColumns.exists()).toBe(true)
698
+ const firstHideButton = menuColumns.find('[title="Masquer la colonne Name"]')
699
+ expect(firstHideButton.exists()).toBe(true)
700
+ await firstHideButton.trigger('click')
701
+ expect(firstHideButton.attributes('title')).toBe('Afficher la colonne Name')
702
+ const columns = wrapper.findAll('th')
703
+ expect(columns.length).toBe(2)
704
+
705
+ wrapper.unmount()
706
+ })
345
707
  })
@@ -1,63 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { ref, watch, provide, defineAsyncComponent, markRaw, shallowRef, computed } from 'vue'
2
+ import { ref, watch, provide, computed } from 'vue'
3
3
  import type { FilterOption, TableColumnHeader } from './types'
4
4
  import { filterItems } from './tableFilterUtils'
5
5
  import type { DateValue } from '@/composables/date/useDateInitializationDayjs'
6
-
7
- // Utilisation de shallowRef pour stocker les composants chargés dynamiquement
8
- const loadedComponents = shallowRef<Record<string, unknown>>({})
9
-
10
- // Fonction pour charger et récupérer un composant de filtre à la demande
11
- function getFilterComponent(filterType?: string, filterOptions?: unknown) {
12
- // Déterminer le type de composant à charger
13
- let componentType = 'text'
14
-
15
- if (filterType === 'select' || filterOptions) {
16
- componentType = 'select'
17
- }
18
- else if (filterType === 'date') {
19
- componentType = 'date'
20
- }
21
- else if (filterType === 'period') {
22
- componentType = 'period'
23
- }
24
- else if (filterType === 'number') {
25
- componentType = 'number'
26
- }
27
-
28
- // Si le composant est déjà chargé, le retourner
29
- if (loadedComponents.value[componentType]) {
30
- return loadedComponents.value[componentType]
31
- }
32
-
33
- // Sinon, charger le composant de manière asynchrone
34
- let asyncComponent
35
- switch (componentType) {
36
- case 'select':
37
- asyncComponent = markRaw(defineAsyncComponent(() => import('./filters/SelectFilter.vue')))
38
- Object.defineProperty(asyncComponent, 'name', { value: 'SelectFilter' })
39
- break
40
- case 'date':
41
- asyncComponent = markRaw(defineAsyncComponent(() => import('./filters/DateFilter.vue')))
42
- Object.defineProperty(asyncComponent, 'name', { value: 'DateFilter' })
43
- break
44
- case 'period':
45
- asyncComponent = markRaw(defineAsyncComponent(() => import('./filters/PeriodFilter.vue')))
46
- Object.defineProperty(asyncComponent, 'name', { value: 'PeriodFilter' })
47
- break
48
- case 'number':
49
- asyncComponent = markRaw(defineAsyncComponent(() => import('./filters/NumberFilter.vue')))
50
- Object.defineProperty(asyncComponent, 'name', { value: 'NumberFilter' })
51
- break
52
- default:
53
- asyncComponent = markRaw(defineAsyncComponent(() => import('./filters/TextFilter.vue')))
54
- Object.defineProperty(asyncComponent, 'name', { value: 'TextFilter' })
55
- }
56
-
57
- // Stocker le composant pour éviter de le recharger
58
- loadedComponents.value[componentType] = asyncComponent
59
- return asyncComponent
60
- }
6
+ import getFilterComponent from './filters/getFilterComponent'
61
7
 
62
8
  const props = defineProps({
63
9
  header: {
@@ -339,4 +285,5 @@
339
285
  flex: 1;
340
286
  }
341
287
  }
288
+
342
289
  </style>