@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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=filters.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.test.d.ts","sourceRoot":"","sources":["../../../../../src/ai-table/components/__tests__/filters.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,400 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ /* eslint-disable @typescript-eslint/no-explicit-any */
15
+ const react_1 = require("@testing-library/react");
16
+ const React = require("react");
17
+ const vitest_1 = require("vitest");
18
+ const constants_1 = require("../../constants");
19
+ const filters_1 = require("../filters");
20
+ vitest_1.vi.mock('@akinon/icons', () => ({
21
+ Icon: (_a) => {
22
+ var { icon, className, color, size } = _a, props = __rest(_a, ["icon", "className", "color", "size"]);
23
+ return (React.createElement("div", Object.assign({ "data-testid": `icon-${icon}`, className: className, "data-color": color, "data-size": size }, props), icon));
24
+ }
25
+ }));
26
+ vitest_1.vi.mock('@akinon/ui-input', () => ({
27
+ Input: (_a) => {
28
+ var { onChange, value, className, placeholder, name } = _a, props = __rest(_a, ["onChange", "value", "className", "placeholder", "name"]);
29
+ return (React.createElement("input", Object.assign({ onChange: onChange, value: value, className: className, placeholder: placeholder, name: name, "data-testid": `input-${name}` }, props)));
30
+ }
31
+ }));
32
+ vitest_1.vi.mock('@akinon/ui-layout', () => ({
33
+ Flex: (_a) => {
34
+ var { children, align, rootClassName, gap, wrap, flex } = _a, props = __rest(_a, ["children", "align", "rootClassName", "gap", "wrap", "flex"]);
35
+ const testId = flex === 1 ? 'flex-container' : 'flex-filter';
36
+ return (React.createElement("div", Object.assign({ "data-testid": testId, "data-align": align, "data-gap": gap, "data-wrap": wrap, "data-flex": flex, className: rootClassName }, props), children));
37
+ }
38
+ }));
39
+ vitest_1.vi.mock('lodash-es', () => ({
40
+ debounce: (fn) => {
41
+ const debounced = (...args) => {
42
+ fn(...args);
43
+ };
44
+ debounced.cancel = vitest_1.vi.fn();
45
+ return debounced;
46
+ }
47
+ }));
48
+ (0, vitest_1.describe)('TableFilters', () => {
49
+ const mockOnFilterChange = vitest_1.vi.fn();
50
+ const defaultProps = {
51
+ filters: [
52
+ {
53
+ key: 'name',
54
+ placeholder: 'Search by name',
55
+ type: constants_1.FILTER_TYPES.INPUT
56
+ },
57
+ {
58
+ key: 'email',
59
+ placeholder: 'Search by email',
60
+ type: constants_1.FILTER_TYPES.INPUT
61
+ }
62
+ ],
63
+ filterValues: {},
64
+ onFilterChange: mockOnFilterChange
65
+ };
66
+ (0, vitest_1.beforeEach)(() => {
67
+ vitest_1.vi.clearAllMocks();
68
+ });
69
+ const renderComponent = (props = {}) => {
70
+ return (0, react_1.render)(React.createElement(filters_1.TableFilters, Object.assign({}, defaultProps, props)));
71
+ };
72
+ (0, vitest_1.describe)('Rendering', () => {
73
+ (0, vitest_1.it)('should render nothing when filters is null', () => {
74
+ const { container } = renderComponent({ filters: null });
75
+ (0, vitest_1.expect)(container.firstChild).toBeNull();
76
+ });
77
+ (0, vitest_1.it)('should render nothing when filters is undefined', () => {
78
+ const { container } = renderComponent({ filters: undefined });
79
+ (0, vitest_1.expect)(container.firstChild).toBeNull();
80
+ });
81
+ (0, vitest_1.it)('should render nothing when filters is empty array', () => {
82
+ const { container } = renderComponent({ filters: [] });
83
+ (0, vitest_1.expect)(container.firstChild).toBeNull();
84
+ });
85
+ (0, vitest_1.it)('should render Flex container when filters exist', () => {
86
+ renderComponent();
87
+ const flexContainer = react_1.screen.getByTestId('flex-container');
88
+ (0, vitest_1.expect)(flexContainer).toBeInTheDocument();
89
+ });
90
+ (0, vitest_1.it)('should render correct number of filters', () => {
91
+ renderComponent();
92
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-name')).toBeInTheDocument();
93
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-email')).toBeInTheDocument();
94
+ });
95
+ (0, vitest_1.it)('should apply correct Flex props', () => {
96
+ renderComponent();
97
+ const flexContainer = react_1.screen.getByTestId('flex-container');
98
+ (0, vitest_1.expect)(flexContainer).toHaveAttribute('data-flex', '1');
99
+ (0, vitest_1.expect)(flexContainer).toHaveAttribute('data-gap', '12');
100
+ (0, vitest_1.expect)(flexContainer).toHaveAttribute('data-wrap', 'true');
101
+ });
102
+ });
103
+ (0, vitest_1.describe)('Input Filters', () => {
104
+ (0, vitest_1.it)('should render input with correct placeholder', () => {
105
+ renderComponent();
106
+ (0, vitest_1.expect)(react_1.screen.getByPlaceholderText('Search by name')).toBeInTheDocument();
107
+ (0, vitest_1.expect)(react_1.screen.getByPlaceholderText('Search by email')).toBeInTheDocument();
108
+ });
109
+ (0, vitest_1.it)('should render input with correct name attribute', () => {
110
+ renderComponent();
111
+ const nameInput = react_1.screen.getByTestId('input-name');
112
+ (0, vitest_1.expect)(nameInput).toHaveAttribute('name', 'name');
113
+ });
114
+ (0, vitest_1.it)('should render input with correct className', () => {
115
+ renderComponent();
116
+ const nameInput = react_1.screen.getByTestId('input-name');
117
+ (0, vitest_1.expect)(nameInput).toHaveClass('h-9', 'w-44');
118
+ });
119
+ (0, vitest_1.it)('should render search icon for each input', () => {
120
+ renderComponent();
121
+ const searchIcons = react_1.screen.getAllByTestId('icon-search');
122
+ (0, vitest_1.expect)(searchIcons).toHaveLength(2);
123
+ });
124
+ (0, vitest_1.it)('should render search icon with correct props', () => {
125
+ renderComponent();
126
+ const searchIcon = react_1.screen.getAllByTestId('icon-search')[0];
127
+ (0, vitest_1.expect)(searchIcon).toHaveClass('absolute', 'cursor-pointer', 'right-2', 'top-2');
128
+ (0, vitest_1.expect)(searchIcon).toHaveAttribute('data-color', 'var(--color-gray-500)');
129
+ (0, vitest_1.expect)(searchIcon).toHaveAttribute('data-size', '16');
130
+ });
131
+ (0, vitest_1.it)('should render filter container with relative positioning', () => {
132
+ renderComponent();
133
+ const containers = react_1.screen.getAllByTestId('flex-filter');
134
+ (0, vitest_1.expect)(containers.length).toBeGreaterThan(0);
135
+ (0, vitest_1.expect)(containers[0]).toHaveClass('relative');
136
+ });
137
+ });
138
+ (0, vitest_1.describe)('Filter Values', () => {
139
+ (0, vitest_1.it)('should display initial filter values', () => {
140
+ const filterValues = {
141
+ name: 'John',
142
+ email: 'john@example.com'
143
+ };
144
+ renderComponent({ filterValues });
145
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-name')).toHaveValue('John');
146
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-email')).toHaveValue('john@example.com');
147
+ });
148
+ (0, vitest_1.it)('should display empty string when filter value is not set', () => {
149
+ renderComponent({ filterValues: {} });
150
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-name')).toHaveValue('');
151
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-email')).toHaveValue('');
152
+ });
153
+ (0, vitest_1.it)('should update when filterValues prop changes', () => {
154
+ const { rerender } = renderComponent({ filterValues: { name: 'John' } });
155
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-name')).toHaveValue('John');
156
+ rerender(React.createElement(filters_1.TableFilters, Object.assign({}, defaultProps, { filterValues: { name: 'Jane' } })));
157
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-name')).toHaveValue('Jane');
158
+ });
159
+ });
160
+ (0, vitest_1.describe)('Input Change Handling', () => {
161
+ (0, vitest_1.it)('should update local state on input change', () => {
162
+ renderComponent();
163
+ const nameInput = react_1.screen.getByTestId('input-name');
164
+ react_1.fireEvent.change(nameInput, { target: { value: 'Test' } });
165
+ (0, vitest_1.expect)(nameInput).toHaveValue('Test');
166
+ });
167
+ (0, vitest_1.it)('should call onFilterChange immediately (debounced)', () => {
168
+ renderComponent();
169
+ const nameInput = react_1.screen.getByTestId('input-name');
170
+ react_1.fireEvent.change(nameInput, { target: { value: 'Test' } });
171
+ (0, vitest_1.expect)(mockOnFilterChange).toHaveBeenCalledWith('name', 'Test');
172
+ });
173
+ (0, vitest_1.it)('should handle multiple rapid changes', () => {
174
+ renderComponent();
175
+ const nameInput = react_1.screen.getByTestId('input-name');
176
+ react_1.fireEvent.change(nameInput, { target: { value: 'T' } });
177
+ react_1.fireEvent.change(nameInput, { target: { value: 'Te' } });
178
+ react_1.fireEvent.change(nameInput, { target: { value: 'Test' } });
179
+ (0, vitest_1.expect)(mockOnFilterChange).toHaveBeenCalledTimes(3);
180
+ (0, vitest_1.expect)(mockOnFilterChange).toHaveBeenLastCalledWith('name', 'Test');
181
+ });
182
+ (0, vitest_1.it)('should handle changes for different filters independently', () => {
183
+ renderComponent();
184
+ const nameInput = react_1.screen.getByTestId('input-name');
185
+ const emailInput = react_1.screen.getByTestId('input-email');
186
+ react_1.fireEvent.change(nameInput, { target: { value: 'John' } });
187
+ react_1.fireEvent.change(emailInput, { target: { value: 'john@example.com' } });
188
+ (0, vitest_1.expect)(mockOnFilterChange).toHaveBeenCalledWith('name', 'John');
189
+ (0, vitest_1.expect)(mockOnFilterChange).toHaveBeenCalledWith('email', 'john@example.com');
190
+ });
191
+ (0, vitest_1.it)('should handle empty string input', () => {
192
+ renderComponent({ filterValues: { name: 'Test' } });
193
+ const nameInput = react_1.screen.getByTestId('input-name');
194
+ react_1.fireEvent.change(nameInput, { target: { value: '' } });
195
+ (0, vitest_1.expect)(mockOnFilterChange).toHaveBeenCalledWith('name', '');
196
+ });
197
+ (0, vitest_1.it)('should handle special characters in input', () => {
198
+ renderComponent();
199
+ const nameInput = react_1.screen.getByTestId('input-name');
200
+ react_1.fireEvent.change(nameInput, { target: { value: '@#$%^&*()' } });
201
+ (0, vitest_1.expect)(mockOnFilterChange).toHaveBeenCalledWith('name', '@#$%^&*()');
202
+ });
203
+ });
204
+ (0, vitest_1.describe)('Debounce Cleanup', () => {
205
+ (0, vitest_1.it)('should not throw error on unmount', () => {
206
+ const { unmount } = renderComponent();
207
+ const nameInput = react_1.screen.getByTestId('input-name');
208
+ react_1.fireEvent.change(nameInput, { target: { value: 'Test' } });
209
+ (0, vitest_1.expect)(() => unmount()).not.toThrow();
210
+ });
211
+ (0, vitest_1.it)('should recreate debounced function when onFilterChange changes', () => {
212
+ const firstOnFilterChange = vitest_1.vi.fn();
213
+ const secondOnFilterChange = vitest_1.vi.fn();
214
+ const { rerender } = (0, react_1.render)(React.createElement(filters_1.TableFilters, Object.assign({}, defaultProps, { onFilterChange: firstOnFilterChange })));
215
+ const nameInput = react_1.screen.getByTestId('input-name');
216
+ react_1.fireEvent.change(nameInput, { target: { value: 'Test1' } });
217
+ (0, vitest_1.expect)(firstOnFilterChange).toHaveBeenCalledWith('name', 'Test1');
218
+ rerender(React.createElement(filters_1.TableFilters, Object.assign({}, defaultProps, { onFilterChange: secondOnFilterChange })));
219
+ react_1.fireEvent.change(nameInput, { target: { value: 'Test2' } });
220
+ (0, vitest_1.expect)(secondOnFilterChange).toHaveBeenCalledWith('name', 'Test2');
221
+ });
222
+ });
223
+ (0, vitest_1.describe)('Multiple Filters', () => {
224
+ (0, vitest_1.it)('should render single filter correctly', () => {
225
+ const filters = [
226
+ {
227
+ key: 'search',
228
+ placeholder: 'Search',
229
+ type: constants_1.FILTER_TYPES.INPUT
230
+ }
231
+ ];
232
+ renderComponent({ filters });
233
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-search')).toBeInTheDocument();
234
+ (0, vitest_1.expect)(react_1.screen.getAllByTestId('icon-search')).toHaveLength(1);
235
+ });
236
+ (0, vitest_1.it)('should render multiple filters correctly', () => {
237
+ const filters = [
238
+ { key: 'name', placeholder: 'Name', type: constants_1.FILTER_TYPES.INPUT },
239
+ { key: 'email', placeholder: 'Email', type: constants_1.FILTER_TYPES.INPUT },
240
+ { key: 'phone', placeholder: 'Phone', type: constants_1.FILTER_TYPES.INPUT }
241
+ ];
242
+ renderComponent({ filters });
243
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-name')).toBeInTheDocument();
244
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-email')).toBeInTheDocument();
245
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-phone')).toBeInTheDocument();
246
+ (0, vitest_1.expect)(react_1.screen.getAllByTestId('icon-search')).toHaveLength(3);
247
+ });
248
+ (0, vitest_1.it)('should handle filter order correctly', () => {
249
+ const filters = [
250
+ { key: 'first', placeholder: 'First', type: constants_1.FILTER_TYPES.INPUT },
251
+ { key: 'second', placeholder: 'Second', type: constants_1.FILTER_TYPES.INPUT }
252
+ ];
253
+ renderComponent({ filters });
254
+ const inputs = react_1.screen.getAllByRole('textbox');
255
+ (0, vitest_1.expect)(inputs[0]).toHaveAttribute('name', 'first');
256
+ (0, vitest_1.expect)(inputs[1]).toHaveAttribute('name', 'second');
257
+ });
258
+ });
259
+ (0, vitest_1.describe)('Filter Types', () => {
260
+ (0, vitest_1.it)('should render INPUT type filter', () => {
261
+ const filters = [
262
+ {
263
+ key: 'test',
264
+ placeholder: 'Test',
265
+ type: constants_1.FILTER_TYPES.INPUT
266
+ }
267
+ ];
268
+ renderComponent({ filters });
269
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-test')).toBeInTheDocument();
270
+ });
271
+ (0, vitest_1.it)('should handle unknown filter type gracefully', () => {
272
+ const filters = [
273
+ {
274
+ key: 'test',
275
+ placeholder: 'Test',
276
+ type: 'unknown'
277
+ }
278
+ ];
279
+ renderComponent({ filters });
280
+ // Should still render the container but not the filter
281
+ (0, vitest_1.expect)(react_1.screen.getByTestId('flex-container')).toBeInTheDocument();
282
+ (0, vitest_1.expect)(react_1.screen.queryByTestId('input-test')).not.toBeInTheDocument();
283
+ });
284
+ (0, vitest_1.it)('should handle missing type property', () => {
285
+ const filters = [
286
+ {
287
+ key: 'test',
288
+ placeholder: 'Test'
289
+ }
290
+ ];
291
+ renderComponent({ filters });
292
+ // Should handle gracefully
293
+ (0, vitest_1.expect)(react_1.screen.getByTestId('flex-container')).toBeInTheDocument();
294
+ });
295
+ });
296
+ (0, vitest_1.describe)('Edge Cases', () => {
297
+ (0, vitest_1.it)('should handle filter with empty key', () => {
298
+ const filters = [
299
+ {
300
+ key: '',
301
+ placeholder: 'Empty key',
302
+ type: constants_1.FILTER_TYPES.INPUT
303
+ }
304
+ ];
305
+ renderComponent({ filters });
306
+ (0, vitest_1.expect)(react_1.screen.getByPlaceholderText('Empty key')).toBeInTheDocument();
307
+ });
308
+ (0, vitest_1.it)('should handle filter with empty placeholder', () => {
309
+ const filters = [
310
+ {
311
+ key: 'test',
312
+ placeholder: '',
313
+ type: constants_1.FILTER_TYPES.INPUT
314
+ }
315
+ ];
316
+ renderComponent({ filters });
317
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-test')).toBeInTheDocument();
318
+ });
319
+ (0, vitest_1.it)('should handle very long input values', () => {
320
+ renderComponent();
321
+ const nameInput = react_1.screen.getByTestId('input-name');
322
+ const longValue = 'a'.repeat(1000);
323
+ react_1.fireEvent.change(nameInput, { target: { value: longValue } });
324
+ (0, vitest_1.expect)(mockOnFilterChange).toHaveBeenCalledWith('name', longValue);
325
+ });
326
+ (0, vitest_1.it)('should handle unicode characters', () => {
327
+ renderComponent();
328
+ const nameInput = react_1.screen.getByTestId('input-name');
329
+ const unicodeValue = '你好世界 🌍 مرحبا';
330
+ react_1.fireEvent.change(nameInput, { target: { value: unicodeValue } });
331
+ (0, vitest_1.expect)(mockOnFilterChange).toHaveBeenCalledWith('name', unicodeValue);
332
+ });
333
+ (0, vitest_1.it)('should handle rapid mount/unmount', () => {
334
+ const { unmount } = renderComponent();
335
+ unmount();
336
+ (0, vitest_1.expect)(() => renderComponent()).not.toThrow();
337
+ });
338
+ });
339
+ (0, vitest_1.describe)('Filter Key Generation', () => {
340
+ (0, vitest_1.it)('should generate unique keys for each filter', () => {
341
+ renderComponent();
342
+ const filterContainers = react_1.screen.getAllByTestId('flex-filter');
343
+ (0, vitest_1.expect)(filterContainers.length).toBe(2);
344
+ });
345
+ (0, vitest_1.it)('should handle duplicate filter keys', () => {
346
+ const filters = [
347
+ { key: 'test', placeholder: 'First', type: constants_1.FILTER_TYPES.INPUT },
348
+ { key: 'test', placeholder: 'Second', type: constants_1.FILTER_TYPES.INPUT }
349
+ ];
350
+ renderComponent({ filters });
351
+ const inputs = react_1.screen.getAllByTestId('input-test');
352
+ (0, vitest_1.expect)(inputs).toHaveLength(2);
353
+ });
354
+ });
355
+ (0, vitest_1.describe)('Integration Tests', () => {
356
+ (0, vitest_1.it)('should handle complete user flow', () => {
357
+ const onFilterChange = vitest_1.vi.fn();
358
+ renderComponent({ onFilterChange });
359
+ const nameInput = react_1.screen.getByTestId('input-name');
360
+ const emailInput = react_1.screen.getByTestId('input-email');
361
+ // Type in name field
362
+ react_1.fireEvent.change(nameInput, { target: { value: 'John' } });
363
+ (0, vitest_1.expect)(nameInput).toHaveValue('John');
364
+ // Type in email field
365
+ react_1.fireEvent.change(emailInput, { target: { value: 'john@test.com' } });
366
+ (0, vitest_1.expect)(emailInput).toHaveValue('john@test.com');
367
+ (0, vitest_1.expect)(onFilterChange).toHaveBeenCalledWith('name', 'John');
368
+ (0, vitest_1.expect)(onFilterChange).toHaveBeenCalledWith('email', 'john@test.com');
369
+ });
370
+ (0, vitest_1.it)('should maintain state through prop updates', () => {
371
+ const { rerender } = renderComponent({
372
+ filterValues: { name: 'Initial' }
373
+ });
374
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-name')).toHaveValue('Initial');
375
+ rerender(React.createElement(filters_1.TableFilters, Object.assign({}, defaultProps, { filterValues: { name: 'Updated' } })));
376
+ (0, vitest_1.expect)(react_1.screen.getByTestId('input-name')).toHaveValue('Updated');
377
+ });
378
+ (0, vitest_1.it)('should handle multiple filters with different values', () => {
379
+ const onFilterChange = vitest_1.vi.fn();
380
+ const filters = [
381
+ { key: 'name', placeholder: 'Name', type: constants_1.FILTER_TYPES.INPUT },
382
+ { key: 'email', placeholder: 'Email', type: constants_1.FILTER_TYPES.INPUT },
383
+ { key: 'phone', placeholder: 'Phone', type: constants_1.FILTER_TYPES.INPUT }
384
+ ];
385
+ renderComponent({ filters, onFilterChange });
386
+ react_1.fireEvent.change(react_1.screen.getByTestId('input-name'), {
387
+ target: { value: 'John' }
388
+ });
389
+ react_1.fireEvent.change(react_1.screen.getByTestId('input-email'), {
390
+ target: { value: 'john@test.com' }
391
+ });
392
+ react_1.fireEvent.change(react_1.screen.getByTestId('input-phone'), {
393
+ target: { value: '1234567890' }
394
+ });
395
+ (0, vitest_1.expect)(onFilterChange).toHaveBeenCalledWith('name', 'John');
396
+ (0, vitest_1.expect)(onFilterChange).toHaveBeenCalledWith('email', 'john@test.com');
397
+ (0, vitest_1.expect)(onFilterChange).toHaveBeenCalledWith('phone', '1234567890');
398
+ });
399
+ });
400
+ });