@akinon/ai-modal-table 1.0.0

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 (185) hide show
  1. package/dist/cjs/__tests__/index.test.d.ts +2 -0
  2. package/dist/cjs/__tests__/index.test.d.ts.map +1 -0
  3. package/dist/cjs/__tests__/index.test.js +82 -0
  4. package/dist/cjs/__tests__/index.test.tsx +94 -0
  5. package/dist/cjs/ai-modal-table/__tests__/index.test.d.ts +2 -0
  6. package/dist/cjs/ai-modal-table/__tests__/index.test.d.ts.map +1 -0
  7. package/dist/cjs/ai-modal-table/__tests__/index.test.js +59 -0
  8. package/dist/cjs/ai-modal-table/__tests__/index.test.tsx +98 -0
  9. package/dist/cjs/ai-modal-table/index.d.ts +4 -0
  10. package/dist/cjs/ai-modal-table/index.d.ts.map +1 -0
  11. package/dist/cjs/ai-modal-table/index.js +54 -0
  12. package/dist/cjs/ai-table/__tests__/index.test.d.ts +2 -0
  13. package/dist/cjs/ai-table/__tests__/index.test.d.ts.map +1 -0
  14. package/dist/cjs/ai-table/__tests__/index.test.js +348 -0
  15. package/dist/cjs/ai-table/__tests__/index.test.tsx +572 -0
  16. package/dist/cjs/ai-table/components/__tests__/content.test.d.ts +2 -0
  17. package/dist/cjs/ai-table/components/__tests__/content.test.d.ts.map +1 -0
  18. package/dist/cjs/ai-table/components/__tests__/content.test.js +1349 -0
  19. package/dist/cjs/ai-table/components/__tests__/content.test.tsx +1637 -0
  20. package/dist/cjs/ai-table/components/__tests__/filters.test.d.ts +2 -0
  21. package/dist/cjs/ai-table/components/__tests__/filters.test.d.ts.map +1 -0
  22. package/dist/cjs/ai-table/components/__tests__/filters.test.js +400 -0
  23. package/dist/cjs/ai-table/components/__tests__/filters.test.tsx +534 -0
  24. package/dist/cjs/ai-table/components/__tests__/footer.test.d.ts +2 -0
  25. package/dist/cjs/ai-table/components/__tests__/footer.test.d.ts.map +1 -0
  26. package/dist/cjs/ai-table/components/__tests__/footer.test.js +465 -0
  27. package/dist/cjs/ai-table/components/__tests__/footer.test.tsx +597 -0
  28. package/dist/cjs/ai-table/components/__tests__/mapper.test.d.ts +2 -0
  29. package/dist/cjs/ai-table/components/__tests__/mapper.test.d.ts.map +1 -0
  30. package/dist/cjs/ai-table/components/__tests__/mapper.test.js +453 -0
  31. package/dist/cjs/ai-table/components/__tests__/mapper.test.tsx +601 -0
  32. package/dist/cjs/ai-table/components/__tests__/pagination.test.d.ts +2 -0
  33. package/dist/cjs/ai-table/components/__tests__/pagination.test.d.ts.map +1 -0
  34. package/dist/cjs/ai-table/components/__tests__/pagination.test.js +430 -0
  35. package/dist/cjs/ai-table/components/__tests__/pagination.test.tsx +629 -0
  36. package/dist/cjs/ai-table/components/__tests__/row-actions.test.d.ts +2 -0
  37. package/dist/cjs/ai-table/components/__tests__/row-actions.test.d.ts.map +1 -0
  38. package/dist/cjs/ai-table/components/__tests__/row-actions.test.js +382 -0
  39. package/dist/cjs/ai-table/components/__tests__/row-actions.test.tsx +507 -0
  40. package/dist/cjs/ai-table/components/content.d.ts +11 -0
  41. package/dist/cjs/ai-table/components/content.d.ts.map +1 -0
  42. package/dist/cjs/ai-table/components/content.js +309 -0
  43. package/dist/cjs/ai-table/components/filters.d.ts +10 -0
  44. package/dist/cjs/ai-table/components/filters.d.ts.map +1 -0
  45. package/dist/cjs/ai-table/components/filters.js +55 -0
  46. package/dist/cjs/ai-table/components/footer.d.ts +12 -0
  47. package/dist/cjs/ai-table/components/footer.d.ts.map +1 -0
  48. package/dist/cjs/ai-table/components/footer.js +24 -0
  49. package/dist/cjs/ai-table/components/mapper.d.ts +11 -0
  50. package/dist/cjs/ai-table/components/mapper.d.ts.map +1 -0
  51. package/dist/cjs/ai-table/components/mapper.js +21 -0
  52. package/dist/cjs/ai-table/components/pagination.d.ts +11 -0
  53. package/dist/cjs/ai-table/components/pagination.d.ts.map +1 -0
  54. package/dist/cjs/ai-table/components/pagination.js +106 -0
  55. package/dist/cjs/ai-table/components/row-actions.d.ts +14 -0
  56. package/dist/cjs/ai-table/components/row-actions.d.ts.map +1 -0
  57. package/dist/cjs/ai-table/components/row-actions.js +52 -0
  58. package/dist/cjs/ai-table/constants/index.d.ts +17 -0
  59. package/dist/cjs/ai-table/constants/index.d.ts.map +1 -0
  60. package/dist/cjs/ai-table/constants/index.js +19 -0
  61. package/dist/cjs/ai-table/i18n/index.d.ts +3 -0
  62. package/dist/cjs/ai-table/i18n/index.d.ts.map +1 -0
  63. package/dist/cjs/ai-table/i18n/index.js +14 -0
  64. package/dist/cjs/ai-table/i18n/translations/en.d.ts +8 -0
  65. package/dist/cjs/ai-table/i18n/translations/en.d.ts.map +1 -0
  66. package/dist/cjs/ai-table/i18n/translations/en.js +9 -0
  67. package/dist/cjs/ai-table/i18n/translations/tr.d.ts +8 -0
  68. package/dist/cjs/ai-table/i18n/translations/tr.d.ts.map +1 -0
  69. package/dist/cjs/ai-table/i18n/translations/tr.js +9 -0
  70. package/dist/cjs/ai-table/index.d.ts +4 -0
  71. package/dist/cjs/ai-table/index.d.ts.map +1 -0
  72. package/dist/cjs/ai-table/index.js +71 -0
  73. package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.d.ts +2 -0
  74. package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.d.ts.map +1 -0
  75. package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.js +146 -0
  76. package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.ts +184 -0
  77. package/dist/cjs/ai-table/utils/data-format/index.d.ts +7 -0
  78. package/dist/cjs/ai-table/utils/data-format/index.d.ts.map +1 -0
  79. package/dist/cjs/ai-table/utils/data-format/index.js +43 -0
  80. package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts +2 -0
  81. package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts.map +1 -0
  82. package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.js +291 -0
  83. package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.tsx +399 -0
  84. package/dist/cjs/ai-table/utils/render-mapper-fields/index.d.ts +10 -0
  85. package/dist/cjs/ai-table/utils/render-mapper-fields/index.d.ts.map +1 -0
  86. package/dist/cjs/ai-table/utils/render-mapper-fields/index.js +48 -0
  87. package/dist/cjs/index.d.ts +4 -0
  88. package/dist/cjs/index.d.ts.map +1 -0
  89. package/dist/cjs/index.js +7 -0
  90. package/dist/cjs/types/index.d.ts +134 -0
  91. package/dist/cjs/types/index.d.ts.map +1 -0
  92. package/dist/cjs/types/index.js +2 -0
  93. package/dist/esm/__tests__/index.test.d.ts +2 -0
  94. package/dist/esm/__tests__/index.test.d.ts.map +1 -0
  95. package/dist/esm/__tests__/index.test.js +80 -0
  96. package/dist/esm/__tests__/index.test.tsx +94 -0
  97. package/dist/esm/ai-modal-table/__tests__/index.test.d.ts +2 -0
  98. package/dist/esm/ai-modal-table/__tests__/index.test.d.ts.map +1 -0
  99. package/dist/esm/ai-modal-table/__tests__/index.test.js +57 -0
  100. package/dist/esm/ai-modal-table/__tests__/index.test.tsx +98 -0
  101. package/dist/esm/ai-modal-table/index.d.ts +4 -0
  102. package/dist/esm/ai-modal-table/index.d.ts.map +1 -0
  103. package/dist/esm/ai-modal-table/index.js +50 -0
  104. package/dist/esm/ai-table/__tests__/index.test.d.ts +2 -0
  105. package/dist/esm/ai-table/__tests__/index.test.d.ts.map +1 -0
  106. package/dist/esm/ai-table/__tests__/index.test.js +346 -0
  107. package/dist/esm/ai-table/__tests__/index.test.tsx +572 -0
  108. package/dist/esm/ai-table/components/__tests__/content.test.d.ts +2 -0
  109. package/dist/esm/ai-table/components/__tests__/content.test.d.ts.map +1 -0
  110. package/dist/esm/ai-table/components/__tests__/content.test.js +1347 -0
  111. package/dist/esm/ai-table/components/__tests__/content.test.tsx +1637 -0
  112. package/dist/esm/ai-table/components/__tests__/filters.test.d.ts +2 -0
  113. package/dist/esm/ai-table/components/__tests__/filters.test.d.ts.map +1 -0
  114. package/dist/esm/ai-table/components/__tests__/filters.test.js +398 -0
  115. package/dist/esm/ai-table/components/__tests__/filters.test.tsx +534 -0
  116. package/dist/esm/ai-table/components/__tests__/footer.test.d.ts +2 -0
  117. package/dist/esm/ai-table/components/__tests__/footer.test.d.ts.map +1 -0
  118. package/dist/esm/ai-table/components/__tests__/footer.test.js +463 -0
  119. package/dist/esm/ai-table/components/__tests__/footer.test.tsx +597 -0
  120. package/dist/esm/ai-table/components/__tests__/mapper.test.d.ts +2 -0
  121. package/dist/esm/ai-table/components/__tests__/mapper.test.d.ts.map +1 -0
  122. package/dist/esm/ai-table/components/__tests__/mapper.test.js +451 -0
  123. package/dist/esm/ai-table/components/__tests__/mapper.test.tsx +601 -0
  124. package/dist/esm/ai-table/components/__tests__/pagination.test.d.ts +2 -0
  125. package/dist/esm/ai-table/components/__tests__/pagination.test.d.ts.map +1 -0
  126. package/dist/esm/ai-table/components/__tests__/pagination.test.js +428 -0
  127. package/dist/esm/ai-table/components/__tests__/pagination.test.tsx +629 -0
  128. package/dist/esm/ai-table/components/__tests__/row-actions.test.d.ts +2 -0
  129. package/dist/esm/ai-table/components/__tests__/row-actions.test.d.ts.map +1 -0
  130. package/dist/esm/ai-table/components/__tests__/row-actions.test.js +380 -0
  131. package/dist/esm/ai-table/components/__tests__/row-actions.test.tsx +507 -0
  132. package/dist/esm/ai-table/components/content.d.ts +11 -0
  133. package/dist/esm/ai-table/components/content.d.ts.map +1 -0
  134. package/dist/esm/ai-table/components/content.js +305 -0
  135. package/dist/esm/ai-table/components/filters.d.ts +10 -0
  136. package/dist/esm/ai-table/components/filters.d.ts.map +1 -0
  137. package/dist/esm/ai-table/components/filters.js +51 -0
  138. package/dist/esm/ai-table/components/footer.d.ts +12 -0
  139. package/dist/esm/ai-table/components/footer.d.ts.map +1 -0
  140. package/dist/esm/ai-table/components/footer.js +20 -0
  141. package/dist/esm/ai-table/components/mapper.d.ts +11 -0
  142. package/dist/esm/ai-table/components/mapper.d.ts.map +1 -0
  143. package/dist/esm/ai-table/components/mapper.js +17 -0
  144. package/dist/esm/ai-table/components/pagination.d.ts +11 -0
  145. package/dist/esm/ai-table/components/pagination.d.ts.map +1 -0
  146. package/dist/esm/ai-table/components/pagination.js +102 -0
  147. package/dist/esm/ai-table/components/row-actions.d.ts +14 -0
  148. package/dist/esm/ai-table/components/row-actions.d.ts.map +1 -0
  149. package/dist/esm/ai-table/components/row-actions.js +48 -0
  150. package/dist/esm/ai-table/constants/index.d.ts +17 -0
  151. package/dist/esm/ai-table/constants/index.d.ts.map +1 -0
  152. package/dist/esm/ai-table/constants/index.js +16 -0
  153. package/dist/esm/ai-table/i18n/index.d.ts +3 -0
  154. package/dist/esm/ai-table/i18n/index.d.ts.map +1 -0
  155. package/dist/esm/ai-table/i18n/index.js +11 -0
  156. package/dist/esm/ai-table/i18n/translations/en.d.ts +8 -0
  157. package/dist/esm/ai-table/i18n/translations/en.d.ts.map +1 -0
  158. package/dist/esm/ai-table/i18n/translations/en.js +7 -0
  159. package/dist/esm/ai-table/i18n/translations/tr.d.ts +8 -0
  160. package/dist/esm/ai-table/i18n/translations/tr.d.ts.map +1 -0
  161. package/dist/esm/ai-table/i18n/translations/tr.js +7 -0
  162. package/dist/esm/ai-table/index.d.ts +4 -0
  163. package/dist/esm/ai-table/index.d.ts.map +1 -0
  164. package/dist/esm/ai-table/index.js +67 -0
  165. package/dist/esm/ai-table/utils/data-format/__tests__/index.test.d.ts +2 -0
  166. package/dist/esm/ai-table/utils/data-format/__tests__/index.test.d.ts.map +1 -0
  167. package/dist/esm/ai-table/utils/data-format/__tests__/index.test.js +144 -0
  168. package/dist/esm/ai-table/utils/data-format/__tests__/index.test.ts +184 -0
  169. package/dist/esm/ai-table/utils/data-format/index.d.ts +7 -0
  170. package/dist/esm/ai-table/utils/data-format/index.d.ts.map +1 -0
  171. package/dist/esm/ai-table/utils/data-format/index.js +38 -0
  172. package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts +2 -0
  173. package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts.map +1 -0
  174. package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.js +289 -0
  175. package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.tsx +399 -0
  176. package/dist/esm/ai-table/utils/render-mapper-fields/index.d.ts +10 -0
  177. package/dist/esm/ai-table/utils/render-mapper-fields/index.d.ts.map +1 -0
  178. package/dist/esm/ai-table/utils/render-mapper-fields/index.js +44 -0
  179. package/dist/esm/index.d.ts +4 -0
  180. package/dist/esm/index.d.ts.map +1 -0
  181. package/dist/esm/index.js +2 -0
  182. package/dist/esm/types/index.d.ts +134 -0
  183. package/dist/esm/types/index.d.ts.map +1 -0
  184. package/dist/esm/types/index.js +1 -0
  185. package/package.json +60 -0
@@ -0,0 +1,346 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { render, screen, within } from '@testing-library/react';
13
+ import userEvent from '@testing-library/user-event';
14
+ import * as React from 'react';
15
+ import { describe, expect, it, vi } from 'vitest';
16
+ import { AiTable } from '../index';
17
+ // Mock sub-components
18
+ vi.mock('../components/content', () => ({
19
+ TableContent: ({ data, selectedRows, onToggleSelection, rowKey }) => (React.createElement("div", { "data-testid": "table-content" },
20
+ data.map((row) => {
21
+ const customId = rowKey
22
+ ? row[rowKey]
23
+ : row.id;
24
+ return (React.createElement("div", { key: customId, "data-testid": `row-${customId}`, onClick: () => onToggleSelection(customId) }, JSON.stringify(row)));
25
+ }),
26
+ React.createElement("div", { "data-testid": "selected-count" }, selectedRows.length)))
27
+ }));
28
+ vi.mock('../components/filters', () => ({
29
+ TableFilters: ({ filters, onFilterChange }) => (React.createElement("div", { "data-testid": "table-filters" }, filters.map(filter => (React.createElement("input", { key: filter.key, "data-testid": `filter-${filter.key}`, onChange: e => onFilterChange(filter.key, e.target.value), placeholder: filter.key })))))
30
+ }));
31
+ vi.mock('../components/footer', () => ({
32
+ TableFooter: ({ selectedCount, isSubmitting, onSubmitAll, onSubmitSelected }) => (React.createElement("div", { "data-testid": "table-footer" },
33
+ React.createElement("div", { "data-testid": "selected-count" }, selectedCount),
34
+ React.createElement("button", { "data-testid": "submit-all", onClick: onSubmitAll, disabled: isSubmitting }, "Submit All"),
35
+ React.createElement("button", { "data-testid": "submit-selected", onClick: onSubmitSelected, disabled: isSubmitting || selectedCount === 0 }, "Submit Selected")))
36
+ }));
37
+ vi.mock('../components/pagination', () => ({
38
+ TablePagination: ({ currentPage, pageSize, total, onPageChange, onPageSizeChange }) => (React.createElement("div", { "data-testid": "table-pagination" },
39
+ React.createElement("div", { "data-testid": "current-page" }, currentPage),
40
+ React.createElement("div", { "data-testid": "page-size" }, pageSize),
41
+ React.createElement("div", { "data-testid": "total" }, total),
42
+ React.createElement("button", { "data-testid": "prev-page", onClick: () => onPageChange(currentPage - 1) }, "Prev"),
43
+ React.createElement("button", { "data-testid": "next-page", onClick: () => onPageChange(currentPage + 1) }, "Next"),
44
+ React.createElement("select", { "data-testid": "page-size-select", onChange: e => onPageSizeChange(Number(e.target.value)), value: pageSize },
45
+ React.createElement("option", { value: "10" }, "10"),
46
+ React.createElement("option", { value: "20" }, "20"))))
47
+ }));
48
+ vi.mock('@akinon/ui-ai-spinner', () => ({
49
+ AiSpinner: () => React.createElement("div", { "data-testid": "ai-spinner" }, "Loading...")
50
+ }));
51
+ vi.mock('@akinon/ui-button', () => ({
52
+ Button: (_a) => {
53
+ var { children, onClick } = _a, props = __rest(_a, ["children", "onClick"]);
54
+ return (React.createElement("button", Object.assign({ onClick: onClick }, props), children));
55
+ }
56
+ }));
57
+ vi.mock('@akinon/ui-layout', () => ({
58
+ Flex: (_a) => {
59
+ var { children } = _a, props = __rest(_a, ["children"]);
60
+ return (React.createElement("div", Object.assign({}, props), children));
61
+ }
62
+ }));
63
+ describe('AiTable', () => {
64
+ const mockData = [
65
+ { pk: 1, id: 1, name: 'Ali', category: 'Electronics' },
66
+ { pk: 2, id: 2, name: 'Ayşe', category: 'Clothing' },
67
+ { pk: 3, id: 3, name: 'Mehmet', category: 'Electronics' }
68
+ ];
69
+ const mockColumns = [
70
+ { title: 'ID', dataIndex: 'id' },
71
+ { title: 'Name', dataIndex: 'name' },
72
+ { title: 'Category', dataIndex: 'category' }
73
+ ];
74
+ const defaultProps = {
75
+ data: mockData,
76
+ columns: mockColumns,
77
+ selectedRows: [],
78
+ onChangeSelectedRows: vi.fn(),
79
+ onEdit: vi.fn(),
80
+ onSubmitAllData: vi.fn(),
81
+ onSubmitSelectedData: vi.fn(),
82
+ isLoading: false,
83
+ isSubmitting: false,
84
+ submitAllLabel: 'Submit All',
85
+ submitSelectedLabel: 'Submit Selected',
86
+ filters: []
87
+ };
88
+ describe('Rendering', () => {
89
+ it('should render loading spinner when isLoading is true', () => {
90
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { isLoading: true })));
91
+ expect(screen.getByTestId('ai-spinner')).toBeInTheDocument();
92
+ });
93
+ it('should render all components when data is loaded', () => {
94
+ render(React.createElement(AiTable, Object.assign({}, defaultProps)));
95
+ expect(screen.getByTestId('table-filters')).toBeInTheDocument();
96
+ expect(screen.getByTestId('table-content')).toBeInTheDocument();
97
+ expect(screen.getByTestId('table-footer')).toBeInTheDocument();
98
+ expect(screen.getByTestId('table-pagination')).toBeInTheDocument();
99
+ });
100
+ it('should render custom class name when provided', () => {
101
+ const { container } = render(React.createElement(AiTable, Object.assign({}, defaultProps, { tableClassName: "custom-class" })));
102
+ expect(container.querySelector('.custom-class')).toBeInTheDocument();
103
+ });
104
+ it('should render expand/collapse buttons when mapperConfig is provided', () => {
105
+ const mapperConfig = {
106
+ dataIndex: 'attributes',
107
+ onAddItem: vi.fn(),
108
+ onRemoveItem: vi.fn(),
109
+ onItemChange: vi.fn()
110
+ };
111
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { mapperConfig: mapperConfig })));
112
+ expect(screen.getByText('Expand All')).toBeInTheDocument();
113
+ expect(screen.getByText('Collapse All')).toBeInTheDocument();
114
+ });
115
+ it('should not render expand/collapse buttons when mapperConfig is not provided', () => {
116
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { mapperConfig: undefined })));
117
+ expect(screen.queryByText('Expand All')).not.toBeInTheDocument();
118
+ expect(screen.queryByText('Collapse All')).not.toBeInTheDocument();
119
+ });
120
+ });
121
+ describe('Data Display', () => {
122
+ it('should display all data on initial render', () => {
123
+ render(React.createElement(AiTable, Object.assign({}, defaultProps)));
124
+ expect(screen.getByTestId('row-1')).toBeInTheDocument();
125
+ expect(screen.getByTestId('row-2')).toBeInTheDocument();
126
+ expect(screen.getByTestId('row-3')).toBeInTheDocument();
127
+ });
128
+ it('should display empty table when data is empty', () => {
129
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { data: [] })));
130
+ expect(screen.getByTestId('table-content')).toBeInTheDocument();
131
+ expect(screen.queryByTestId('row-1')).not.toBeInTheDocument();
132
+ });
133
+ it('should use custom rowKey when provided', () => {
134
+ const customKeyData = [
135
+ { userId: 'user-1', name: 'Ali' },
136
+ { userId: 'user-2', name: 'Ayşe' }
137
+ ];
138
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { data: customKeyData, rowKey: "userId" })));
139
+ expect(screen.getByTestId('row-user-1')).toBeInTheDocument();
140
+ expect(screen.getByTestId('row-user-2')).toBeInTheDocument();
141
+ });
142
+ });
143
+ describe('Filtering', () => {
144
+ it('should call onFilterChange when filter input changes', async () => {
145
+ const user = userEvent.setup();
146
+ const mockFilters = [{ key: 'name', type: 'text' }];
147
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { filters: mockFilters })));
148
+ const filterInput = screen.getByTestId('filter-name');
149
+ await user.type(filterInput, 'Ali');
150
+ expect(screen.getByTestId('row-1')).toBeInTheDocument();
151
+ });
152
+ it('should reset to first page when filter changes', async () => {
153
+ const user = userEvent.setup();
154
+ const mockFilters = [{ key: 'category', type: 'text' }];
155
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { filters: mockFilters })));
156
+ // First change page
157
+ const nextPageBtn = screen.getByTestId('next-page');
158
+ await user.click(nextPageBtn);
159
+ let currentPage = screen.getAllByTestId('current-page')[0];
160
+ expect(currentPage).toHaveTextContent('2');
161
+ // Then apply filter
162
+ const filterInput = screen.getByTestId('filter-category');
163
+ await user.type(filterInput, 'Electronics');
164
+ // Should reset to page 1
165
+ currentPage = screen.getAllByTestId('current-page')[0];
166
+ expect(currentPage).toHaveTextContent('1');
167
+ });
168
+ it('should handle multiple filters simultaneously', async () => {
169
+ const user = userEvent.setup();
170
+ const mockFilters = [
171
+ { key: 'name', type: 'text' },
172
+ { key: 'category', type: 'text' }
173
+ ];
174
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { filters: mockFilters })));
175
+ const nameFilter = screen.getByTestId('filter-name');
176
+ const categoryFilter = screen.getByTestId('filter-category');
177
+ await user.type(nameFilter, 'Ali');
178
+ await user.type(categoryFilter, 'Electronics');
179
+ expect(screen.getByTestId('row-1')).toBeInTheDocument();
180
+ });
181
+ });
182
+ describe('Pagination', () => {
183
+ const largeData = Array.from({ length: 25 }, (_, i) => ({
184
+ id: i + 1,
185
+ name: `Item ${i + 1}`,
186
+ category: 'Test'
187
+ }));
188
+ it('should display total count correctly', () => {
189
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { data: largeData })));
190
+ expect(screen.getByTestId('total')).toHaveTextContent('25');
191
+ });
192
+ it('should change page when next page button is clicked', async () => {
193
+ const user = userEvent.setup();
194
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { data: largeData })));
195
+ const nextPageBtn = screen.getByTestId('next-page');
196
+ await user.click(nextPageBtn);
197
+ expect(screen.getAllByTestId('current-page')[0]).toHaveTextContent('2');
198
+ });
199
+ it('should change page size when page size select changes', async () => {
200
+ const user = userEvent.setup();
201
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { data: largeData })));
202
+ const pageSizeSelect = screen.getByTestId('page-size-select');
203
+ await user.selectOptions(pageSizeSelect, '20');
204
+ expect(screen.getByTestId('page-size')).toHaveTextContent('20');
205
+ });
206
+ it('should handle edge case when on last page', () => {
207
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { data: largeData })));
208
+ expect(screen.getByTestId('total')).toHaveTextContent('25');
209
+ expect(screen.getByTestId('current-page')).toHaveTextContent('1');
210
+ });
211
+ });
212
+ describe('Row Selection', () => {
213
+ it('should call onChangeSelectedRows when row selection changes', async () => {
214
+ const user = userEvent.setup();
215
+ const onChangeSelectedRows = vi.fn();
216
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { onChangeSelectedRows: onChangeSelectedRows })));
217
+ const row1 = screen.getByTestId('row-1');
218
+ await user.click(row1);
219
+ expect(onChangeSelectedRows).toHaveBeenCalled();
220
+ });
221
+ it('should maintain selected rows state', () => {
222
+ const selectedRows = [1];
223
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { selectedRows: selectedRows })));
224
+ const footerElement = screen.getByTestId('table-footer');
225
+ const selectedCountElement = within(footerElement).getByTestId('selected-count');
226
+ expect(selectedCountElement).toHaveTextContent('1');
227
+ });
228
+ it('should display correct selected count in footer', () => {
229
+ const selectedRows = [1, 2];
230
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { selectedRows: selectedRows })));
231
+ const footerSelectedCount = screen
232
+ .getAllByTestId('selected-count')
233
+ .find(el => { var _a; return ((_a = el.parentElement) === null || _a === void 0 ? void 0 : _a.getAttribute('data-testid')) === 'table-footer'; });
234
+ expect(footerSelectedCount).toHaveTextContent('2');
235
+ });
236
+ it('should disable submit selected button when no rows are selected', () => {
237
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { selectedRows: [] })));
238
+ const submitSelectedBtn = screen.getByTestId('submit-selected');
239
+ expect(submitSelectedBtn).toBeDisabled();
240
+ });
241
+ it('should enable submit selected button when rows are selected', () => {
242
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { selectedRows: [1, 2] })));
243
+ const submitSelectedBtn = screen.getByTestId('submit-selected');
244
+ expect(submitSelectedBtn).toBeEnabled();
245
+ });
246
+ });
247
+ describe('Form Submission', () => {
248
+ it('should call onSubmitAllData when submit all is clicked', async () => {
249
+ const user = userEvent.setup();
250
+ const onSubmitAllData = vi.fn();
251
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { onSubmitAllData: onSubmitAllData })));
252
+ const submitAllBtn = screen.getByTestId('submit-all');
253
+ await user.click(submitAllBtn);
254
+ expect(onSubmitAllData).toHaveBeenCalled();
255
+ });
256
+ it('should call onSubmitSelectedData when submit selected is clicked', async () => {
257
+ const user = userEvent.setup();
258
+ const onSubmitSelectedData = vi.fn();
259
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { selectedRows: [1, 2], onSubmitSelectedData: onSubmitSelectedData })));
260
+ const submitSelectedBtn = screen.getByTestId('submit-selected');
261
+ await user.click(submitSelectedBtn);
262
+ expect(onSubmitSelectedData).toHaveBeenCalled();
263
+ });
264
+ it('should disable submit buttons when isSubmitting is true', () => {
265
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { isSubmitting: true })));
266
+ expect(screen.getByTestId('submit-all')).toBeDisabled();
267
+ expect(screen.getByTestId('submit-selected')).toBeDisabled();
268
+ });
269
+ it('should display custom submit labels when provided', () => {
270
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { submitAllLabel: "Save All", submitSelectedLabel: "Save Selected" })));
271
+ expect(screen.getByText('Submit All')).toBeInTheDocument();
272
+ expect(screen.getByText('Submit Selected')).toBeInTheDocument();
273
+ });
274
+ });
275
+ describe('Custom Action Buttons', () => {
276
+ it('should render custom action buttons when provided', () => {
277
+ const customActionButtons = (rowId) => (React.createElement("button", { key: "edit", onClick: vi.fn() },
278
+ "Edit ",
279
+ rowId));
280
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { customActionButtons: customActionButtons })));
281
+ // Note: Since TableContent is mocked, we're verifying the prop is passed
282
+ const tableContent = screen.getByTestId('table-content');
283
+ expect(tableContent).toBeInTheDocument();
284
+ });
285
+ });
286
+ describe('Mapper Configuration', () => {
287
+ it('should pass mapper configuration to table content', () => {
288
+ const mapperConfig = {
289
+ dataIndex: 'attributes',
290
+ onAddItem: vi.fn(),
291
+ onRemoveItem: vi.fn(),
292
+ onItemChange: vi.fn()
293
+ };
294
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { mapperConfig: mapperConfig })));
295
+ expect(screen.getByTestId('table-content')).toBeInTheDocument();
296
+ });
297
+ it('should handle expand all button click', async () => {
298
+ const user = userEvent.setup();
299
+ const mapperConfig = {
300
+ dataIndex: 'attributes',
301
+ onAddItem: vi.fn(),
302
+ onRemoveItem: vi.fn(),
303
+ onItemChange: vi.fn()
304
+ };
305
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { mapperConfig: mapperConfig })));
306
+ const expandAllBtn = screen.getByText('Expand All');
307
+ await user.click(expandAllBtn);
308
+ expect(expandAllBtn).toBeInTheDocument();
309
+ });
310
+ it('should handle collapse all button click', async () => {
311
+ const user = userEvent.setup();
312
+ const mapperConfig = {
313
+ dataIndex: 'attributes',
314
+ onAddItem: vi.fn(),
315
+ onRemoveItem: vi.fn(),
316
+ onItemChange: vi.fn()
317
+ };
318
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { mapperConfig: mapperConfig })));
319
+ const collapseAllBtn = screen.getByText('Collapse All');
320
+ await user.click(collapseAllBtn);
321
+ expect(collapseAllBtn).toBeInTheDocument();
322
+ });
323
+ });
324
+ describe('Edit Functionality', () => {
325
+ it('should pass onEdit callback to table content', () => {
326
+ const onEdit = vi.fn();
327
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { onEdit: onEdit })));
328
+ expect(screen.getByTestId('table-content')).toBeInTheDocument();
329
+ });
330
+ it('should pass editDataIndexes to table content', () => {
331
+ const editDataIndexes = ['0', '2'];
332
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { editDataIndexes: editDataIndexes })));
333
+ expect(screen.getByTestId('table-content')).toBeInTheDocument();
334
+ });
335
+ });
336
+ describe('Edge Cases', () => {
337
+ it('should handle empty columns array', () => {
338
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { columns: [] })));
339
+ expect(screen.getByTestId('table-content')).toBeInTheDocument();
340
+ });
341
+ it('should handle zero columns', () => {
342
+ render(React.createElement(AiTable, Object.assign({}, defaultProps, { columns: [], data: [{ id: 1 }] })));
343
+ expect(screen.getByTestId('table-content')).toBeInTheDocument();
344
+ });
345
+ });
346
+ });