@wakastellar/ui 2.0.0 → 2.1.1

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 (291) hide show
  1. package/README.md +71 -8
  2. package/dist/cli/commands/add.d.ts +7 -0
  3. package/dist/cli/commands/init.d.ts +6 -0
  4. package/dist/cli/commands/list.d.ts +5 -0
  5. package/dist/cli/commands/search.d.ts +1 -0
  6. package/dist/cli/index.cjs +6014 -0
  7. package/dist/cli/index.d.ts +1 -0
  8. package/dist/cli/utils/config.d.ts +29 -0
  9. package/dist/cli/utils/logger.d.ts +20 -0
  10. package/dist/cli/utils/registry.d.ts +23 -0
  11. package/package.json +14 -3
  12. package/src/blocks/activity-timeline/index.tsx +586 -0
  13. package/src/blocks/calendar-view/index.tsx +756 -0
  14. package/src/blocks/chat/index.tsx +1018 -0
  15. package/src/blocks/chat/widget.tsx +504 -0
  16. package/src/blocks/dashboard/index.tsx +522 -0
  17. package/src/blocks/empty-states/index.tsx +452 -0
  18. package/src/blocks/error-pages/index.tsx +426 -0
  19. package/src/blocks/faq/index.tsx +479 -0
  20. package/src/blocks/file-manager/index.tsx +890 -0
  21. package/src/blocks/footer/index.tsx +133 -0
  22. package/src/blocks/header/index.tsx +357 -0
  23. package/src/blocks/headtab/index.tsx +139 -0
  24. package/src/blocks/i18n-editor/index.tsx +1016 -0
  25. package/src/blocks/index.ts +80 -0
  26. package/src/blocks/kanban-board/index.tsx +779 -0
  27. package/src/blocks/landing/index.tsx +677 -0
  28. package/src/blocks/language-selector/index.tsx +88 -0
  29. package/src/blocks/layout/index.tsx +159 -0
  30. package/src/blocks/login/index.tsx +339 -0
  31. package/src/blocks/login/types.ts +131 -0
  32. package/src/blocks/pricing/index.tsx +564 -0
  33. package/src/blocks/profile/index.tsx +746 -0
  34. package/src/blocks/settings/index.tsx +558 -0
  35. package/src/blocks/sidebar/index.tsx +713 -0
  36. package/src/blocks/theme-creator-block/index.tsx +835 -0
  37. package/src/blocks/user-management/index.tsx +1037 -0
  38. package/src/blocks/wizard/index.tsx +719 -0
  39. package/src/components/DataTable/DataTable.tsx +406 -0
  40. package/src/components/DataTable/DataTableAdvanced.tsx +720 -0
  41. package/src/components/DataTable/DataTableBody.tsx +216 -0
  42. package/src/components/DataTable/DataTableCell.tsx +172 -0
  43. package/src/components/DataTable/DataTableColumnResizer.tsx +62 -0
  44. package/src/components/DataTable/DataTableConflictResolver.tsx +478 -0
  45. package/src/components/DataTable/DataTableContextMenu.tsx +219 -0
  46. package/src/components/DataTable/DataTableEditCell.tsx +279 -0
  47. package/src/components/DataTable/DataTableFilterBuilder.tsx +519 -0
  48. package/src/components/DataTable/DataTableFilters.tsx +535 -0
  49. package/src/components/DataTable/DataTableGrouping.tsx +147 -0
  50. package/src/components/DataTable/DataTableHeader.tsx +172 -0
  51. package/src/components/DataTable/DataTablePagination.tsx +125 -0
  52. package/src/components/DataTable/DataTableSelection.tsx +269 -0
  53. package/src/components/DataTable/DataTableSyncStatus.tsx +281 -0
  54. package/src/components/DataTable/DataTableToolbar.tsx +262 -0
  55. package/src/components/DataTable/README.md +446 -0
  56. package/src/components/DataTable/__tests__/DataTableAdvanced.test.tsx +426 -0
  57. package/src/components/DataTable/__tests__/DataTableEdit.test.tsx +329 -0
  58. package/src/components/DataTable/__tests__/useDataTableAdvanced.test.ts +455 -0
  59. package/src/components/DataTable/examples/EditExample.tsx +166 -0
  60. package/src/components/DataTable/formatters/index.ts +335 -0
  61. package/src/components/DataTable/hooks/__tests__/useDataTableEdit.test.ts +239 -0
  62. package/src/components/DataTable/hooks/useDataTable.ts +145 -0
  63. package/src/components/DataTable/hooks/useDataTableAdvanced.ts +342 -0
  64. package/src/components/DataTable/hooks/useDataTableAdvancedFilters.ts +637 -0
  65. package/src/components/DataTable/hooks/useDataTableColumnTemplates.ts +186 -0
  66. package/src/components/DataTable/hooks/useDataTableEdit.ts +167 -0
  67. package/src/components/DataTable/hooks/useDataTableExport.ts +227 -0
  68. package/src/components/DataTable/hooks/useDataTableImport.ts +216 -0
  69. package/src/components/DataTable/hooks/useDataTableOffline.ts +481 -0
  70. package/src/components/DataTable/hooks/useDataTableTheme.ts +213 -0
  71. package/src/components/DataTable/hooks/useDataTableVirtualization.ts +99 -0
  72. package/src/components/DataTable/hooks/useTableLayout.ts +85 -0
  73. package/src/components/DataTable/index.ts +81 -0
  74. package/src/components/DataTable/services/IndexedDBService.ts +504 -0
  75. package/src/components/DataTable/templates/index.tsx +803 -0
  76. package/src/components/DataTable/types.ts +504 -0
  77. package/src/components/DataTable/utils.ts +164 -0
  78. package/src/components/DataTable/workers/exportWorker.ts +213 -0
  79. package/src/components/accordion/index.tsx +61 -0
  80. package/src/components/alert/index.tsx +61 -0
  81. package/src/components/alert-dialog/index.tsx +146 -0
  82. package/src/components/aspect-ratio/index.tsx +12 -0
  83. package/src/components/avatar/index.tsx +54 -0
  84. package/src/components/badge/Badge.stories.tsx +64 -0
  85. package/src/components/badge/index.tsx +38 -0
  86. package/src/components/button/Button.stories.tsx +173 -0
  87. package/src/components/button/index.tsx +56 -0
  88. package/src/components/calendar/index.tsx +73 -0
  89. package/src/components/card/index.tsx +78 -0
  90. package/src/components/checkbox/index.tsx +34 -0
  91. package/src/components/code/index.tsx +229 -0
  92. package/src/components/collapsible/index.tsx +16 -0
  93. package/src/components/command/index.tsx +162 -0
  94. package/src/components/context-menu/index.tsx +204 -0
  95. package/src/components/dialog/index.tsx +126 -0
  96. package/src/components/dropdown-menu/index.tsx +204 -0
  97. package/src/components/error-boundary/ErrorBoundary.tsx +281 -0
  98. package/src/components/error-boundary/index.ts +7 -0
  99. package/src/components/form/index.tsx +183 -0
  100. package/src/components/hover-card/index.tsx +33 -0
  101. package/src/components/index.ts +368 -0
  102. package/src/components/input/Input.stories.tsx +100 -0
  103. package/src/components/input/index.tsx +27 -0
  104. package/src/components/input-otp/index.tsx +277 -0
  105. package/src/components/label/index.tsx +30 -0
  106. package/src/components/language-selector/index.tsx +341 -0
  107. package/src/components/menubar/index.tsx +240 -0
  108. package/src/components/navigation-menu/index.tsx +134 -0
  109. package/src/components/popover/index.tsx +35 -0
  110. package/src/components/progress/index.tsx +32 -0
  111. package/src/components/radio-group/index.tsx +48 -0
  112. package/src/components/scroll-area/index.tsx +52 -0
  113. package/src/components/select/index.tsx +164 -0
  114. package/src/components/separator/index.tsx +35 -0
  115. package/src/components/sheet/index.tsx +147 -0
  116. package/src/components/skeleton/index.tsx +22 -0
  117. package/src/components/slider/index.tsx +32 -0
  118. package/src/components/switch/index.tsx +33 -0
  119. package/src/components/table/index.tsx +117 -0
  120. package/src/components/tabs/index.tsx +59 -0
  121. package/src/components/textarea/index.tsx +30 -0
  122. package/src/components/theme-selector/index.tsx +327 -0
  123. package/src/components/toast/index.tsx +133 -0
  124. package/src/components/toaster/index.tsx +34 -0
  125. package/src/components/toggle/index.tsx +49 -0
  126. package/src/components/tooltip/index.tsx +34 -0
  127. package/src/components/typography/index.tsx +276 -0
  128. package/src/components/waka-3d-pie-chart/index.tsx +486 -0
  129. package/src/components/waka-achievement-unlock/index.tsx +716 -0
  130. package/src/components/waka-activity-feed/index.tsx +686 -0
  131. package/src/components/waka-address-autocomplete/index.tsx +1202 -0
  132. package/src/components/waka-admincrumb/index.tsx +349 -0
  133. package/src/components/waka-alert-stack/index.tsx +827 -0
  134. package/src/components/waka-allocation-matrix/index.tsx +1278 -0
  135. package/src/components/waka-approval-chain/index.tsx +766 -0
  136. package/src/components/waka-audit-log/index.tsx +1475 -0
  137. package/src/components/waka-autocomplete/index.tsx +358 -0
  138. package/src/components/waka-badge-showcase/index.tsx +704 -0
  139. package/src/components/waka-barcode/index.tsx +260 -0
  140. package/src/components/waka-biometric-prompt/index.tsx +765 -0
  141. package/src/components/waka-bottom-sheet/index.tsx +495 -0
  142. package/src/components/waka-breadcrumb/index.tsx +376 -0
  143. package/src/components/waka-breadcrumb-path/index.tsx +513 -0
  144. package/src/components/waka-budget-burn/index.tsx +1234 -0
  145. package/src/components/waka-capacity-planner/index.tsx +1107 -0
  146. package/src/components/waka-carousel/index.tsx +893 -0
  147. package/src/components/waka-cart-summary/index.tsx +1055 -0
  148. package/src/components/waka-challenge-timer/index.tsx +1044 -0
  149. package/src/components/waka-charts/WakaAreaChart.tsx +251 -0
  150. package/src/components/waka-charts/WakaBarChart.tsx +222 -0
  151. package/src/components/waka-charts/WakaChart.tsx +124 -0
  152. package/src/components/waka-charts/WakaLineChart.tsx +219 -0
  153. package/src/components/waka-charts/WakaMiniChart.tsx +133 -0
  154. package/src/components/waka-charts/WakaPieChart.tsx +214 -0
  155. package/src/components/waka-charts/WakaSparkline.tsx +229 -0
  156. package/src/components/waka-charts/dataTableHelpers.ts +109 -0
  157. package/src/components/waka-charts/hooks/useChartTheme.ts +123 -0
  158. package/src/components/waka-charts/hooks/useRechartsLoader.ts +234 -0
  159. package/src/components/waka-charts/index.ts +90 -0
  160. package/src/components/waka-charts/types.ts +330 -0
  161. package/src/components/waka-chat-bubble/index.tsx +1060 -0
  162. package/src/components/waka-checklist/index.tsx +1067 -0
  163. package/src/components/waka-checkout-stepper/index.tsx +976 -0
  164. package/src/components/waka-cohort-table/index.tsx +1011 -0
  165. package/src/components/waka-color-picker/index.tsx +447 -0
  166. package/src/components/waka-combo-counter/index.tsx +864 -0
  167. package/src/components/waka-combobox/index.tsx +497 -0
  168. package/src/components/waka-command-bar/index.tsx +403 -0
  169. package/src/components/waka-compare-period/index.tsx +1230 -0
  170. package/src/components/waka-connection-matrix/index.tsx +1053 -0
  171. package/src/components/waka-contribution-graph/index.tsx +552 -0
  172. package/src/components/waka-cost-breakdown/index.tsx +1065 -0
  173. package/src/components/waka-coupon-input/index.tsx +592 -0
  174. package/src/components/waka-credit-card-input/index.tsx +982 -0
  175. package/src/components/waka-daily-reward/index.tsx +762 -0
  176. package/src/components/waka-date-range-picker/index.tsx +378 -0
  177. package/src/components/waka-datetime-picker/index.tsx +793 -0
  178. package/src/components/waka-datetime-picker.form-integration/index.tsx +402 -0
  179. package/src/components/waka-deployment-lane/index.tsx +673 -0
  180. package/src/components/waka-device-trust/index.tsx +1259 -0
  181. package/src/components/waka-dock/index.tsx +285 -0
  182. package/src/components/waka-drawer/index.tsx +319 -0
  183. package/src/components/waka-empty-state/index.tsx +545 -0
  184. package/src/components/waka-error-shake/index.tsx +398 -0
  185. package/src/components/waka-feature-announcement/index.tsx +991 -0
  186. package/src/components/waka-file-upload/index.tsx +437 -0
  187. package/src/components/waka-floating-nav/index.tsx +413 -0
  188. package/src/components/waka-flow-diagram/index.tsx +508 -0
  189. package/src/components/waka-funnel-chart/index.tsx +823 -0
  190. package/src/components/waka-glow-card/index.tsx +246 -0
  191. package/src/components/waka-goal-progress/index.tsx +1025 -0
  192. package/src/components/waka-haptic-button/index.tsx +388 -0
  193. package/src/components/waka-health-pulse/index.tsx +451 -0
  194. package/src/components/waka-heatmap/index.tsx +1026 -0
  195. package/src/components/waka-hotspot/index.tsx +682 -0
  196. package/src/components/waka-image/index.tsx +373 -0
  197. package/src/components/waka-incident-timeline/index.tsx +686 -0
  198. package/src/components/waka-invoice-preview/index.tsx +829 -0
  199. package/src/components/waka-kanban/index.tsx +646 -0
  200. package/src/components/waka-kpi-dashboard/index.tsx +755 -0
  201. package/src/components/waka-leaderboard/index.tsx +746 -0
  202. package/src/components/waka-level-progress/index.tsx +665 -0
  203. package/src/components/waka-liquid-button/index.tsx +520 -0
  204. package/src/components/waka-loading-orbit/index.tsx +478 -0
  205. package/src/components/waka-loot-box/index.tsx +1091 -0
  206. package/src/components/waka-magic-link/index.tsx +321 -0
  207. package/src/components/waka-magnetic-button/index.tsx +567 -0
  208. package/src/components/waka-mention-input/index.tsx +953 -0
  209. package/src/components/waka-metric-sparkline/index.tsx +627 -0
  210. package/src/components/waka-milestone-road/index.tsx +1064 -0
  211. package/src/components/waka-modal/index.tsx +374 -0
  212. package/src/components/waka-morph-button/index.tsx +495 -0
  213. package/src/components/waka-network-topology/index.tsx +801 -0
  214. package/src/components/waka-notifications/index.tsx +414 -0
  215. package/src/components/waka-number-input/index.tsx +373 -0
  216. package/src/components/waka-orbital-menu/index.tsx +445 -0
  217. package/src/components/waka-order-tracker/index.tsx +1041 -0
  218. package/src/components/waka-pagination/index.tsx +393 -0
  219. package/src/components/waka-password-strength/index.tsx +824 -0
  220. package/src/components/waka-payment-method-picker/index.tsx +715 -0
  221. package/src/components/waka-permission-matrix/index.tsx +1302 -0
  222. package/src/components/waka-phone-input/index.tsx +801 -0
  223. package/src/components/waka-pipeline-view/index.tsx +604 -0
  224. package/src/components/waka-player-card/index.tsx +691 -0
  225. package/src/components/waka-points-popup/index.tsx +366 -0
  226. package/src/components/waka-power-up/index.tsx +1155 -0
  227. package/src/components/waka-presence-indicator/index.tsx +1181 -0
  228. package/src/components/waka-pricing-table/index.tsx +755 -0
  229. package/src/components/waka-product-card/index.tsx +786 -0
  230. package/src/components/waka-progress-onboarding/index.tsx +878 -0
  231. package/src/components/waka-pull-to-refresh/index.tsx +451 -0
  232. package/src/components/waka-qrcode/index.tsx +232 -0
  233. package/src/components/waka-quest-card/index.tsx +1275 -0
  234. package/src/components/waka-quota-bar/index.tsx +693 -0
  235. package/src/components/waka-radar-score/index.tsx +512 -0
  236. package/src/components/waka-rank-badge/index.tsx +813 -0
  237. package/src/components/waka-rating-input/index.tsx +560 -0
  238. package/src/components/waka-reaction-picker/index.tsx +1062 -0
  239. package/src/components/waka-region-map/index.tsx +730 -0
  240. package/src/components/waka-resource-gauge/index.tsx +654 -0
  241. package/src/components/waka-resource-pool/index.tsx +1035 -0
  242. package/src/components/waka-rich-text-editor/index.tsx +594 -0
  243. package/src/components/waka-rollback-slider/index.tsx +891 -0
  244. package/src/components/waka-sankey-diagram/index.tsx +1032 -0
  245. package/src/components/waka-schedule-picker/index.tsx +1060 -0
  246. package/src/components/waka-scratch-card/index.tsx +914 -0
  247. package/src/components/waka-season-pass/index.tsx +886 -0
  248. package/src/components/waka-security-score/index.tsx +1126 -0
  249. package/src/components/waka-segmented-control/index.tsx +238 -0
  250. package/src/components/waka-server-rack/index.tsx +764 -0
  251. package/src/components/waka-session-manager/index.tsx +815 -0
  252. package/src/components/waka-signature-pad/index.tsx +744 -0
  253. package/src/components/waka-skeleton-wave/index.tsx +454 -0
  254. package/src/components/waka-skill-tree/index.tsx +1031 -0
  255. package/src/components/waka-sla-tracker/index.tsx +798 -0
  256. package/src/components/waka-slider-range/index.tsx +765 -0
  257. package/src/components/waka-spin-wheel/index.tsx +671 -0
  258. package/src/components/waka-spinner/index.tsx +284 -0
  259. package/src/components/waka-spotlight/index.tsx +410 -0
  260. package/src/components/waka-stat/index.tsx +428 -0
  261. package/src/components/waka-stats-hexagon/index.tsx +824 -0
  262. package/src/components/waka-status-matrix/index.tsx +565 -0
  263. package/src/components/waka-stepper/index.tsx +489 -0
  264. package/src/components/waka-streak-counter/index.tsx +334 -0
  265. package/src/components/waka-success-explosion/index.tsx +453 -0
  266. package/src/components/waka-swipe-card/index.tsx +574 -0
  267. package/src/components/waka-tabs-morph/index.tsx +509 -0
  268. package/src/components/waka-tag-input/index.tsx +877 -0
  269. package/src/components/waka-team-banner/index.tsx +1183 -0
  270. package/src/components/waka-terminal-output/index.tsx +836 -0
  271. package/src/components/waka-theme-creator/index.tsx +762 -0
  272. package/src/components/waka-theme-manager/index.tsx +654 -0
  273. package/src/components/waka-thread-view/index.tsx +874 -0
  274. package/src/components/waka-tilt-card/index.tsx +250 -0
  275. package/src/components/waka-time-picker/index.tsx +479 -0
  276. package/src/components/waka-timeline/index.tsx +385 -0
  277. package/src/components/waka-tooltip-tour/index.tsx +855 -0
  278. package/src/components/waka-tour-guide/index.tsx +920 -0
  279. package/src/components/waka-tournament-bracket/index.tsx +1276 -0
  280. package/src/components/waka-tree/index.tsx +557 -0
  281. package/src/components/waka-treemap-chart/index.tsx +1031 -0
  282. package/src/components/waka-two-factor-setup/index.tsx +995 -0
  283. package/src/components/waka-typewriter/index.tsx +566 -0
  284. package/src/components/waka-typing-indicator/index.tsx +649 -0
  285. package/src/components/waka-versus-card/index.tsx +1026 -0
  286. package/src/components/waka-video/index.tsx +557 -0
  287. package/src/components/waka-video-call/index.tsx +1087 -0
  288. package/src/components/waka-virtual-list/index.tsx +327 -0
  289. package/src/components/waka-voice-message/index.tsx +1019 -0
  290. package/src/components/waka-welcome-modal/index.tsx +790 -0
  291. package/src/components/waka-xp-bar/index.tsx +799 -0
@@ -0,0 +1,426 @@
1
+ import { render, screen, fireEvent, waitFor } from "@testing-library/react"
2
+ import { describe, it, expect, vi, beforeEach } from "vitest"
3
+ import { DataTableAdvanced } from "../DataTableAdvanced"
4
+ import { ColumnDef } from "@tanstack/react-table"
5
+
6
+ // Mock des hooks
7
+ vi.mock("../hooks/useDataTableAdvanced", () => ({
8
+ useDataTableAdvanced: () => ({
9
+ table: {
10
+ getHeaderGroups: () => [
11
+ {
12
+ id: "header-group-1",
13
+ headers: [
14
+ {
15
+ id: "name",
16
+ column: {
17
+ getCanSort: () => true,
18
+ getToggleSortingHandler: () => vi.fn(),
19
+ getIsSorted: () => false,
20
+ columnDef: { header: "Name" },
21
+ },
22
+ isPlaceholder: false,
23
+ getContext: () => ({}),
24
+ },
25
+ ],
26
+ },
27
+ ],
28
+ getRowModel: () => ({
29
+ rows: [
30
+ {
31
+ id: "row-1",
32
+ original: { id: 1, name: "John Doe", email: "john@example.com" },
33
+ getVisibleCells: () => [
34
+ {
35
+ id: "cell-1",
36
+ column: { id: "name", columnDef: { cell: () => "John Doe" } },
37
+ getContext: () => ({}),
38
+ getValue: () => "John Doe",
39
+ },
40
+ ],
41
+ getIsSelected: () => false,
42
+ },
43
+ ],
44
+ }),
45
+ getFilteredSelectedRowModel: () => ({
46
+ rows: [],
47
+ }),
48
+ },
49
+ sorting: [],
50
+ setSorting: vi.fn(),
51
+ columnFilters: [],
52
+ setColumnFilters: vi.fn(),
53
+ columnVisibility: {},
54
+ setColumnVisibility: vi.fn(),
55
+ columnOrder: [],
56
+ setColumnOrder: vi.fn(),
57
+ expanded: {},
58
+ setExpanded: vi.fn(),
59
+ grouping: [],
60
+ setGrouping: vi.fn(),
61
+ rowSelection: {},
62
+ setRowSelection: vi.fn(),
63
+ globalFilter: "",
64
+ setGlobalFilter: vi.fn(),
65
+ pagination: { pageIndex: 0, pageSize: 10 },
66
+ setPagination: vi.fn(),
67
+ selectedRows: [],
68
+ resetFilters: vi.fn(),
69
+ resetSelection: vi.fn(),
70
+ resetAll: vi.fn(),
71
+ exportData: vi.fn(() => []),
72
+ getGroupedData: vi.fn(() => []),
73
+ getExpandedData: vi.fn(() => []),
74
+ toggleGrouping: vi.fn(),
75
+ clearGrouping: vi.fn(),
76
+ toggleRowExpansion: vi.fn(),
77
+ expandAll: vi.fn(),
78
+ collapseAll: vi.fn(),
79
+ }),
80
+ }))
81
+
82
+ vi.mock("../hooks/useDataTableVirtualization", () => ({
83
+ useDataTableVirtualization: () => ({
84
+ isVirtualized: false,
85
+ virtualItems: [],
86
+ totalSize: 0,
87
+ scrollToIndex: vi.fn(),
88
+ scrollToOffset: vi.fn(),
89
+ }),
90
+ }))
91
+
92
+ vi.mock("../hooks/useDataTableExport", () => ({
93
+ useDataTableExport: () => ({
94
+ exportData: vi.fn(),
95
+ exportAll: vi.fn(),
96
+ exportSelected: vi.fn(),
97
+ supportedFormats: ["csv", "json"],
98
+ isExportSupported: vi.fn(() => true),
99
+ }),
100
+ }))
101
+
102
+ vi.mock("../hooks/useDataTableImport", () => ({
103
+ useDataTableImport: () => ({
104
+ importData: vi.fn(),
105
+ importWithUI: vi.fn(),
106
+ supportedFormats: [".csv", ".json"],
107
+ isFormatSupported: vi.fn(() => true),
108
+ }),
109
+ }))
110
+
111
+ vi.mock("../hooks/useDataTableTheme", () => ({
112
+ useDataTableTheme: () => ({
113
+ theme: {},
114
+ variantClasses: "w-full border rounded-lg",
115
+ densityClasses: {
116
+ table: "text-sm",
117
+ header: "px-4 py-3",
118
+ cell: "px-4 py-3",
119
+ },
120
+ customStyles: {},
121
+ getThemedClass: vi.fn((cls) => cls),
122
+ getThemedStyles: vi.fn(() => ({})),
123
+ }),
124
+ }))
125
+
126
+ vi.mock("../hooks/useTableLayout", () => ({
127
+ useTableLayout: () => ({
128
+ layout: "standard",
129
+ setLayout: vi.fn(),
130
+ density: "comfortable",
131
+ setDensity: vi.fn(),
132
+ densityClasses: {
133
+ table: "text-sm",
134
+ header: "px-4 py-3",
135
+ cell: "px-4 py-3",
136
+ },
137
+ }),
138
+ }))
139
+
140
+ vi.mock("../hooks/useDataTableEdit", () => ({
141
+ useDataTableEdit: () => [
142
+ {
143
+ editingRowId: null,
144
+ hasChanges: false,
145
+ },
146
+ {
147
+ startEdit: vi.fn(),
148
+ saveEdit: vi.fn(),
149
+ cancelEdit: vi.fn(),
150
+ updateField: vi.fn(),
151
+ },
152
+ ],
153
+ }))
154
+
155
+ vi.mock("react-i18next", () => ({
156
+ useTranslation: () => ({
157
+ t: (key: string, options?: any) => {
158
+ const translations: Record<string, string> = {
159
+ "datatable.loading": "Loading...",
160
+ "datatable.noData": "No data",
161
+ "datatable.noDataDescription": "There are no results to display",
162
+ "datatable.selectAll": "Select all",
163
+ "datatable.selectRow": "Select row",
164
+ "datatable.actions": "Actions",
165
+ "datatable.save": "Save",
166
+ "datatable.cancel": "Cancel",
167
+ "datatable.edit": "Edit",
168
+ }
169
+ return translations[key] || key
170
+ },
171
+ }),
172
+ }))
173
+
174
+ describe("DataTableAdvanced", () => {
175
+ const mockData = [
176
+ { id: 1, name: "John Doe", email: "john@example.com" },
177
+ { id: 2, name: "Jane Smith", email: "jane@example.com" },
178
+ ]
179
+
180
+ const mockColumns: ColumnDef<any>[] = [
181
+ {
182
+ accessorKey: "name",
183
+ header: "Name",
184
+ },
185
+ {
186
+ accessorKey: "email",
187
+ header: "Email",
188
+ },
189
+ ]
190
+
191
+ beforeEach(() => {
192
+ vi.clearAllMocks()
193
+ })
194
+
195
+ it("should render the table with data", () => {
196
+ render(
197
+ <DataTableAdvanced
198
+ data={mockData}
199
+ columns={mockColumns}
200
+ />
201
+ )
202
+
203
+ expect(screen.getByText("Name")).toBeInTheDocument()
204
+ expect(screen.getByText("Email")).toBeInTheDocument()
205
+ })
206
+
207
+ it("should show loading state", () => {
208
+ render(
209
+ <DataTableAdvanced
210
+ data={mockData}
211
+ columns={mockColumns}
212
+ loading={true}
213
+ />
214
+ )
215
+
216
+ expect(screen.getByText("Loading...")).toBeInTheDocument()
217
+ })
218
+
219
+ it("should show error state", () => {
220
+ render(
221
+ <DataTableAdvanced
222
+ data={mockData}
223
+ columns={mockColumns}
224
+ error="Something went wrong"
225
+ />
226
+ )
227
+
228
+ expect(screen.getByText("Something went wrong")).toBeInTheDocument()
229
+ })
230
+
231
+ it("should show empty state when no data", () => {
232
+ render(
233
+ <DataTableAdvanced
234
+ data={[]}
235
+ columns={mockColumns}
236
+ />
237
+ )
238
+
239
+ expect(screen.getByText("No data")).toBeInTheDocument()
240
+ expect(screen.getByText("There are no results to display")).toBeInTheDocument()
241
+ })
242
+
243
+ it("should render with selection enabled", () => {
244
+ render(
245
+ <DataTableAdvanced
246
+ data={mockData}
247
+ columns={mockColumns}
248
+ selection="multiple"
249
+ />
250
+ )
251
+
252
+ // Vérifier que les checkboxes de sélection sont présentes
253
+ const checkboxes = screen.getAllByRole("checkbox")
254
+ expect(checkboxes).toHaveLength(3) // 1 pour "select all" + 2 pour les lignes
255
+ })
256
+
257
+ it("should render with grouping enabled", () => {
258
+ render(
259
+ <DataTableAdvanced
260
+ data={mockData}
261
+ columns={mockColumns}
262
+ grouping={{
263
+ columns: ["name"],
264
+ showTotals: true,
265
+ }}
266
+ />
267
+ )
268
+
269
+ expect(screen.getByText("Name")).toBeInTheDocument()
270
+ })
271
+
272
+ it("should render with row expansion enabled", () => {
273
+ render(
274
+ <DataTableAdvanced
275
+ data={mockData}
276
+ columns={mockColumns}
277
+ rowExpansion={{
278
+ enabled: true,
279
+ renderExpanded: (row) => <div>Expanded content for {row.name}</div>,
280
+ }}
281
+ />
282
+ )
283
+
284
+ expect(screen.getByText("Name")).toBeInTheDocument()
285
+ })
286
+
287
+ it("should render with virtualization enabled", () => {
288
+ render(
289
+ <DataTableAdvanced
290
+ data={mockData}
291
+ columns={mockColumns}
292
+ virtualization={{
293
+ type: "dynamic",
294
+ estimatedItemHeight: 60,
295
+ }}
296
+ />
297
+ )
298
+
299
+ expect(screen.getByText("Name")).toBeInTheDocument()
300
+ })
301
+
302
+ it("should render with custom theme", () => {
303
+ const customTheme = {
304
+ colors: {
305
+ primary: "#3b82f6",
306
+ secondary: "#64748b",
307
+ },
308
+ spacing: {
309
+ md: "1.5rem",
310
+ },
311
+ }
312
+
313
+ render(
314
+ <DataTableAdvanced
315
+ data={mockData}
316
+ columns={mockColumns}
317
+ theme={customTheme}
318
+ />
319
+ )
320
+
321
+ expect(screen.getByText("Name")).toBeInTheDocument()
322
+ })
323
+
324
+ it("should handle row clicks", () => {
325
+ const onRowClick = vi.fn()
326
+
327
+ render(
328
+ <DataTableAdvanced
329
+ data={mockData}
330
+ columns={mockColumns}
331
+ onRowClick={onRowClick}
332
+ />
333
+ )
334
+
335
+ // Simuler un clic sur une ligne
336
+ const rows = screen.getAllByRole("row")
337
+ fireEvent.click(rows[1]) // Première ligne de données
338
+
339
+ expect(onRowClick).toHaveBeenCalledWith(mockData[0])
340
+ })
341
+
342
+ it("should handle double clicks", () => {
343
+ const onRowDoubleClick = vi.fn()
344
+
345
+ render(
346
+ <DataTableAdvanced
347
+ data={mockData}
348
+ columns={mockColumns}
349
+ onRowDoubleClick={onRowDoubleClick}
350
+ />
351
+ )
352
+
353
+ // Simuler un double-clic sur une ligne
354
+ const rows = screen.getAllByRole("row")
355
+ fireEvent.doubleClick(rows[1]) // Première ligne de données
356
+
357
+ expect(onRowDoubleClick).toHaveBeenCalledWith(mockData[0])
358
+ })
359
+
360
+ it("should render with export functionality", () => {
361
+ render(
362
+ <DataTableAdvanced
363
+ data={mockData}
364
+ columns={mockColumns}
365
+ enableExport={{
366
+ formats: ["csv", "json"],
367
+ filename: "export",
368
+ }}
369
+ />
370
+ )
371
+
372
+ expect(screen.getByText("Name")).toBeInTheDocument()
373
+ })
374
+
375
+ it("should render with import functionality", () => {
376
+ render(
377
+ <DataTableAdvanced
378
+ data={mockData}
379
+ columns={mockColumns}
380
+ enableImport={{
381
+ accept: ".csv,.json",
382
+ }}
383
+ />
384
+ )
385
+
386
+ expect(screen.getByText("Name")).toBeInTheDocument()
387
+ })
388
+
389
+ it("should render with edit functionality", () => {
390
+ render(
391
+ <DataTableAdvanced
392
+ data={mockData}
393
+ columns={mockColumns}
394
+ edit={{
395
+ editableColumns: [
396
+ {
397
+ field: "name",
398
+ config: {
399
+ type: "text",
400
+ placeholder: "Enter name",
401
+ },
402
+ },
403
+ ],
404
+ }}
405
+ />
406
+ )
407
+
408
+ expect(screen.getByText("Name")).toBeInTheDocument()
409
+ })
410
+
411
+ it("should render with performance options", () => {
412
+ render(
413
+ <DataTableAdvanced
414
+ data={mockData}
415
+ columns={mockColumns}
416
+ performance={{
417
+ disableAnimations: true,
418
+ renderLimit: 100,
419
+ filterDebounceMs: 500,
420
+ }}
421
+ />
422
+ )
423
+
424
+ expect(screen.getByText("Name")).toBeInTheDocument()
425
+ })
426
+ })