@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,453 @@
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 mapper_1 = require("../mapper");
19
+ vitest_1.vi.mock('@akinon/icons', () => ({
20
+ Icon: (_a) => {
21
+ var { icon, size, color, className, onClick } = _a, props = __rest(_a, ["icon", "size", "color", "className", "onClick"]);
22
+ return (React.createElement("div", Object.assign({ "data-testid": `icon-${icon}`, "data-size": size, "data-color": color, className: className, onClick: onClick }, props), icon));
23
+ }
24
+ }));
25
+ vitest_1.vi.mock('@akinon/ui-input', () => ({
26
+ Input: (_a) => {
27
+ var { onChange, value, className, size } = _a, props = __rest(_a, ["onChange", "value", "className", "size"]);
28
+ return (React.createElement("input", Object.assign({ onChange: onChange, value: value, className: className, "data-size": size, "data-testid": `input-${value || 'empty'}` }, props)));
29
+ }
30
+ }));
31
+ vitest_1.vi.mock('@akinon/ui-layout', () => ({
32
+ Flex: (_a) => {
33
+ var { children, gap, vertical, align, rootClassName } = _a, props = __rest(_a, ["children", "gap", "vertical", "align", "rootClassName"]);
34
+ return (React.createElement("div", Object.assign({ "data-testid": vertical ? 'flex-vertical' : 'flex-horizontal', "data-gap": gap, "data-vertical": vertical, "data-align": align, className: rootClassName }, props), children));
35
+ }
36
+ }));
37
+ (0, vitest_1.describe)('TableMapper', () => {
38
+ const mockHandleAddItem = vitest_1.vi.fn();
39
+ const mockHandleRemoveItem = vitest_1.vi.fn(() => vitest_1.vi.fn());
40
+ const mockHandleItemChange = vitest_1.vi.fn();
41
+ const defaultValues = [
42
+ {
43
+ key: { type: 'text', value: 'key1' },
44
+ value: { type: 'text', value: 'value1' }
45
+ },
46
+ {
47
+ key: { type: 'text', value: 'key2' },
48
+ value: { type: 'text', value: 'value2' }
49
+ },
50
+ {
51
+ key: { type: 'text', value: 'key3' },
52
+ value: { type: 'text', value: 'value3' }
53
+ }
54
+ ];
55
+ const defaultProps = {
56
+ values: defaultValues,
57
+ handleAddItem: mockHandleAddItem,
58
+ handleRemoveItem: mockHandleRemoveItem,
59
+ handleItemChange: mockHandleItemChange
60
+ };
61
+ (0, vitest_1.beforeEach)(() => {
62
+ vitest_1.vi.clearAllMocks();
63
+ });
64
+ const renderComponent = (props = {}) => {
65
+ return (0, react_1.render)(React.createElement(mapper_1.TableMapper, Object.assign({ values: defaultProps.values, handleAddItem: mockHandleAddItem, handleRemoveItem: mockHandleRemoveItem, handleItemChange: mockHandleItemChange }, props)));
66
+ };
67
+ (0, vitest_1.describe)('Rendering', () => {
68
+ (0, vitest_1.it)('should render Flex container with vertical layout', () => {
69
+ renderComponent();
70
+ (0, vitest_1.expect)(react_1.screen.getByTestId('flex-vertical')).toBeInTheDocument();
71
+ });
72
+ (0, vitest_1.it)('should have correct Flex props on main container', () => {
73
+ renderComponent();
74
+ const mainFlex = react_1.screen.getByTestId('flex-vertical');
75
+ (0, vitest_1.expect)(mainFlex).toHaveAttribute('data-gap', '5');
76
+ (0, vitest_1.expect)(mainFlex).toHaveAttribute('data-vertical', 'true');
77
+ });
78
+ (0, vitest_1.it)('should render all rows regardless of previous state', () => {
79
+ renderComponent();
80
+ const horizontalFlexes = react_1.screen.getAllByTestId('flex-horizontal');
81
+ // Should have rows (each row with items) + icon containers
82
+ (0, vitest_1.expect)(horizontalFlexes.length).toBeGreaterThan(0);
83
+ });
84
+ (0, vitest_1.it)('should render inputs for all values', () => {
85
+ renderComponent();
86
+ const inputs = react_1.screen.getAllByRole('textbox');
87
+ (0, vitest_1.expect)(inputs.length).toBe(6); // 3 values * 2 inputs (key + value)
88
+ });
89
+ (0, vitest_1.it)('should render correct number of plus/minus icons', () => {
90
+ renderComponent();
91
+ const plusIcons = react_1.screen.getAllByTestId('icon-plus');
92
+ const minusIcons = react_1.screen.getAllByTestId('icon-minus');
93
+ (0, vitest_1.expect)(plusIcons).toHaveLength(3); // One per row
94
+ (0, vitest_1.expect)(minusIcons).toHaveLength(3); // One per row
95
+ });
96
+ });
97
+ (0, vitest_1.describe)('All Values Display', () => {
98
+ (0, vitest_1.it)('should display all values from props', () => {
99
+ renderComponent();
100
+ const inputs = react_1.screen.getAllByRole('textbox');
101
+ (0, vitest_1.expect)(inputs).toHaveLength(6); // 3 items * 2 inputs
102
+ });
103
+ (0, vitest_1.it)('should display all values in correct order', () => {
104
+ renderComponent();
105
+ const inputs = react_1.screen.getAllByRole('textbox');
106
+ (0, vitest_1.expect)(inputs[0]).toHaveValue('key1');
107
+ (0, vitest_1.expect)(inputs[1]).toHaveValue('value1');
108
+ (0, vitest_1.expect)(inputs[2]).toHaveValue('key2');
109
+ (0, vitest_1.expect)(inputs[3]).toHaveValue('value2');
110
+ (0, vitest_1.expect)(inputs[4]).toHaveValue('key3');
111
+ (0, vitest_1.expect)(inputs[5]).toHaveValue('value3');
112
+ });
113
+ (0, vitest_1.it)('should render correct number of rows', () => {
114
+ renderComponent();
115
+ const horizontalFlexes = react_1.screen.getAllByTestId('flex-horizontal');
116
+ // Should have: 3 rows (each with items) + 3 icon containers = at least 6
117
+ (0, vitest_1.expect)(horizontalFlexes.length).toBeGreaterThanOrEqual(6);
118
+ });
119
+ });
120
+ (0, vitest_1.describe)('Single Value', () => {
121
+ (0, vitest_1.it)('should display single value correctly', () => {
122
+ renderComponent({
123
+ values: [
124
+ {
125
+ key: { type: 'text', value: 'singleKey' },
126
+ value: { type: 'text', value: 'singleValue' }
127
+ }
128
+ ]
129
+ });
130
+ const inputs = react_1.screen.getAllByRole('textbox');
131
+ (0, vitest_1.expect)(inputs).toHaveLength(2);
132
+ (0, vitest_1.expect)(inputs[0]).toHaveValue('singleKey');
133
+ (0, vitest_1.expect)(inputs[1]).toHaveValue('singleValue');
134
+ });
135
+ (0, vitest_1.it)('should render add/remove icons for single value', () => {
136
+ renderComponent({
137
+ values: [
138
+ {
139
+ key: { type: 'text', value: 'singleKey' },
140
+ value: { type: 'text', value: 'singleValue' }
141
+ }
142
+ ]
143
+ });
144
+ const plusIcons = react_1.screen.getAllByTestId('icon-plus');
145
+ const minusIcons = react_1.screen.getAllByTestId('icon-minus');
146
+ (0, vitest_1.expect)(plusIcons).toHaveLength(1);
147
+ (0, vitest_1.expect)(minusIcons).toHaveLength(1);
148
+ });
149
+ });
150
+ (0, vitest_1.describe)('Input Changes', () => {
151
+ (0, vitest_1.it)('should call handleItemChange when input changes', () => {
152
+ renderComponent();
153
+ const inputs = react_1.screen.getAllByRole('textbox');
154
+ react_1.fireEvent.change(inputs[0], { target: { value: 'newKey' } });
155
+ (0, vitest_1.expect)(mockHandleItemChange).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
156
+ index: 0
157
+ }));
158
+ });
159
+ (0, vitest_1.it)('should call handleItemChange for value input', () => {
160
+ renderComponent();
161
+ const inputs = react_1.screen.getAllByRole('textbox');
162
+ react_1.fireEvent.change(inputs[1], { target: { value: 'newValue' } });
163
+ (0, vitest_1.expect)(mockHandleItemChange).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
164
+ index: 0
165
+ }));
166
+ });
167
+ (0, vitest_1.it)('should call handleItemChange for correct item', () => {
168
+ renderComponent();
169
+ const inputs = react_1.screen.getAllByRole('textbox');
170
+ // Update second item's key (index 2)
171
+ react_1.fireEvent.change(inputs[2], { target: { value: 'newKey2' } });
172
+ (0, vitest_1.expect)(mockHandleItemChange).toHaveBeenCalled();
173
+ });
174
+ (0, vitest_1.it)('should handle empty input values', () => {
175
+ renderComponent();
176
+ const inputs = react_1.screen.getAllByRole('textbox');
177
+ react_1.fireEvent.change(inputs[0], { target: { value: '' } });
178
+ (0, vitest_1.expect)(mockHandleItemChange).toHaveBeenCalled();
179
+ });
180
+ (0, vitest_1.it)('should handle special characters in input', () => {
181
+ renderComponent();
182
+ const inputs = react_1.screen.getAllByRole('textbox');
183
+ react_1.fireEvent.change(inputs[0], { target: { value: '@#$%^&*' } });
184
+ (0, vitest_1.expect)(mockHandleItemChange).toHaveBeenCalled();
185
+ });
186
+ });
187
+ (0, vitest_1.describe)('Add Field', () => {
188
+ (0, vitest_1.it)('should render plus icon for each row', () => {
189
+ renderComponent();
190
+ (0, vitest_1.expect)(react_1.screen.getAllByTestId('icon-plus')).toHaveLength(3); // One for each row
191
+ });
192
+ (0, vitest_1.it)('should have correct color on plus icon', () => {
193
+ renderComponent();
194
+ const plusIcons = react_1.screen.getAllByTestId('icon-plus');
195
+ (0, vitest_1.expect)(plusIcons[0]).toHaveAttribute('data-color', 'var(--color-green-500)');
196
+ });
197
+ (0, vitest_1.it)('should call handleAddItem when plus icon clicked', () => {
198
+ renderComponent();
199
+ const plusIcons = react_1.screen.getAllByTestId('icon-plus');
200
+ react_1.fireEvent.click(plusIcons[0]);
201
+ (0, vitest_1.expect)(mockHandleAddItem).toHaveBeenCalled();
202
+ });
203
+ (0, vitest_1.it)('should handle multiple plus clicks', () => {
204
+ renderComponent();
205
+ const plusIcons = react_1.screen.getAllByTestId('icon-plus');
206
+ react_1.fireEvent.click(plusIcons[0]);
207
+ react_1.fireEvent.click(plusIcons[0]);
208
+ (0, vitest_1.expect)(mockHandleAddItem).toHaveBeenCalledTimes(2);
209
+ });
210
+ (0, vitest_1.it)('should handle handleAddItem undefined', () => {
211
+ renderComponent({ handleAddItem: undefined });
212
+ const plusIcons = react_1.screen.getAllByTestId('icon-plus');
213
+ (0, vitest_1.expect)(() => {
214
+ react_1.fireEvent.click(plusIcons[0]);
215
+ }).not.toThrow();
216
+ });
217
+ });
218
+ (0, vitest_1.describe)('Remove Field', () => {
219
+ (0, vitest_1.it)('should render minus icons for each row', () => {
220
+ renderComponent();
221
+ const minusIcons = react_1.screen.getAllByTestId('icon-minus');
222
+ (0, vitest_1.expect)(minusIcons).toHaveLength(3);
223
+ });
224
+ (0, vitest_1.it)('should have correct color on minus icon', () => {
225
+ renderComponent();
226
+ const minusIcons = react_1.screen.getAllByTestId('icon-minus');
227
+ (0, vitest_1.expect)(minusIcons[0]).toHaveAttribute('data-color', 'var(--color-red-425)');
228
+ });
229
+ (0, vitest_1.it)('should call handleRemoveItem when rendering (to get onClick)', () => {
230
+ renderComponent();
231
+ // handleRemoveItem is called during render to get the onClick handler for each row
232
+ (0, vitest_1.expect)(mockHandleRemoveItem).toHaveBeenCalled();
233
+ (0, vitest_1.expect)(mockHandleRemoveItem.mock.calls.length).toBeGreaterThanOrEqual(3);
234
+ });
235
+ (0, vitest_1.it)('should handle minus icon clicks without throwing', () => {
236
+ renderComponent();
237
+ const minusIcons = react_1.screen.getAllByTestId('icon-minus');
238
+ (0, vitest_1.expect)(() => {
239
+ react_1.fireEvent.click(minusIcons[0]);
240
+ react_1.fireEvent.click(minusIcons[1]);
241
+ }).not.toThrow();
242
+ });
243
+ });
244
+ (0, vitest_1.describe)('Icons', () => {
245
+ (0, vitest_1.it)('should have cursor-pointer class on plus and minus icons', () => {
246
+ renderComponent();
247
+ const plusIcons = react_1.screen.getAllByTestId('icon-plus');
248
+ const minusIcons = react_1.screen.getAllByTestId('icon-minus');
249
+ (0, vitest_1.expect)(plusIcons[0]).toHaveClass('cursor-pointer');
250
+ (0, vitest_1.expect)(minusIcons[0]).toHaveClass('cursor-pointer');
251
+ });
252
+ (0, vitest_1.it)('should have correct size on icons', () => {
253
+ renderComponent();
254
+ const plusIcons = react_1.screen.getAllByTestId('icon-plus');
255
+ const minusIcons = react_1.screen.getAllByTestId('icon-minus');
256
+ (0, vitest_1.expect)(plusIcons[0]).toHaveAttribute('data-size', '20');
257
+ (0, vitest_1.expect)(minusIcons[0]).toHaveAttribute('data-size', '20');
258
+ });
259
+ });
260
+ (0, vitest_1.describe)('Empty Values', () => {
261
+ (0, vitest_1.it)('should render with empty array', () => {
262
+ renderComponent({ values: [] });
263
+ (0, vitest_1.expect)(react_1.screen.getByTestId('flex-vertical')).toBeInTheDocument();
264
+ });
265
+ (0, vitest_1.it)('should not render any rows with empty array', () => {
266
+ renderComponent({ values: [] });
267
+ const inputs = react_1.screen.queryAllByRole('textbox');
268
+ (0, vitest_1.expect)(inputs).toHaveLength(0);
269
+ });
270
+ });
271
+ (0, vitest_1.describe)('Prop Updates', () => {
272
+ (0, vitest_1.it)('should use values from props', () => {
273
+ renderComponent({
274
+ values: [
275
+ {
276
+ key: { type: 'text', value: 'initialKey' },
277
+ value: { type: 'text', value: 'initialValue' }
278
+ }
279
+ ]
280
+ });
281
+ const inputs = react_1.screen.getAllByRole('textbox');
282
+ (0, vitest_1.expect)(inputs[0]).toHaveValue('initialKey');
283
+ (0, vitest_1.expect)(inputs[1]).toHaveValue('initialValue');
284
+ });
285
+ (0, vitest_1.it)('should render different values when props change', () => {
286
+ const { rerender } = (0, react_1.render)(React.createElement(mapper_1.TableMapper, { values: [
287
+ {
288
+ key: { type: 'text', value: 'key1' },
289
+ value: { type: 'text', value: 'value1' }
290
+ }
291
+ ], handleAddItem: mockHandleAddItem, handleRemoveItem: mockHandleRemoveItem, handleItemChange: mockHandleItemChange }));
292
+ let inputs = react_1.screen.getAllByRole('textbox');
293
+ (0, vitest_1.expect)(inputs).toHaveLength(2);
294
+ rerender(React.createElement(mapper_1.TableMapper, { values: [
295
+ {
296
+ key: { type: 'text', value: 'key1' },
297
+ value: { type: 'text', value: 'value1' }
298
+ },
299
+ {
300
+ key: { type: 'text', value: 'key2' },
301
+ value: { type: 'text', value: 'value2' }
302
+ }
303
+ ], handleAddItem: mockHandleAddItem, handleRemoveItem: mockHandleRemoveItem, handleItemChange: mockHandleItemChange }));
304
+ inputs = react_1.screen.getAllByRole('textbox');
305
+ (0, vitest_1.expect)(inputs).toHaveLength(4);
306
+ });
307
+ (0, vitest_1.it)('should always render all values (controlled by parent)', () => {
308
+ renderComponent({
309
+ values: [
310
+ {
311
+ key: { type: 'text', value: 'key1' },
312
+ value: { type: 'text', value: 'value1' }
313
+ },
314
+ {
315
+ key: { type: 'text', value: 'key2' },
316
+ value: { type: 'text', value: 'value2' }
317
+ },
318
+ {
319
+ key: { type: 'text', value: 'key3' },
320
+ value: { type: 'text', value: 'value3' }
321
+ }
322
+ ]
323
+ });
324
+ const inputs = react_1.screen.getAllByRole('textbox');
325
+ (0, vitest_1.expect)(inputs).toHaveLength(6);
326
+ });
327
+ });
328
+ (0, vitest_1.describe)('Integration Tests', () => {
329
+ (0, vitest_1.it)('should handle edit, add, and remove operations', () => {
330
+ renderComponent();
331
+ const inputs = react_1.screen.getAllByRole('textbox');
332
+ // Edit first item
333
+ react_1.fireEvent.change(inputs[0], { target: { value: 'edited1' } });
334
+ (0, vitest_1.expect)(mockHandleItemChange).toHaveBeenCalled();
335
+ // Add new field
336
+ const plusIcons = react_1.screen.getAllByTestId('icon-plus');
337
+ (0, vitest_1.expect)(() => {
338
+ react_1.fireEvent.click(plusIcons[0]);
339
+ }).not.toThrow();
340
+ (0, vitest_1.expect)(mockHandleAddItem).toHaveBeenCalled();
341
+ // Remove an item
342
+ const minusIcons = react_1.screen.getAllByTestId('icon-minus');
343
+ (0, vitest_1.expect)(() => {
344
+ react_1.fireEvent.click(minusIcons[1]);
345
+ }).not.toThrow();
346
+ });
347
+ (0, vitest_1.it)('should handle rapid add operations', () => {
348
+ renderComponent();
349
+ const plusIcons = react_1.screen.getAllByTestId('icon-plus');
350
+ (0, vitest_1.expect)(() => {
351
+ react_1.fireEvent.click(plusIcons[0]);
352
+ react_1.fireEvent.click(plusIcons[1]);
353
+ react_1.fireEvent.click(plusIcons[2]);
354
+ }).not.toThrow();
355
+ });
356
+ (0, vitest_1.it)('should handle rapid remove operations', () => {
357
+ renderComponent();
358
+ const minusIcons = react_1.screen.getAllByTestId('icon-minus');
359
+ (0, vitest_1.expect)(() => {
360
+ react_1.fireEvent.click(minusIcons[0]);
361
+ react_1.fireEvent.click(minusIcons[1]);
362
+ react_1.fireEvent.click(minusIcons[2]);
363
+ }).not.toThrow();
364
+ });
365
+ (0, vitest_1.it)('should render updated values after prop changes', () => {
366
+ const { rerender } = (0, react_1.render)(React.createElement(mapper_1.TableMapper, { values: [
367
+ {
368
+ key: { type: 'text', value: 'k1' },
369
+ value: { type: 'text', value: 'v1' }
370
+ }
371
+ ], handleAddItem: mockHandleAddItem, handleRemoveItem: mockHandleRemoveItem, handleItemChange: mockHandleItemChange }));
372
+ // Re-render with new values
373
+ rerender(React.createElement(mapper_1.TableMapper, { values: [
374
+ {
375
+ key: { type: 'text', value: 'k1' },
376
+ value: { type: 'text', value: 'v1' }
377
+ },
378
+ {
379
+ key: { type: 'text', value: 'k2' },
380
+ value: { type: 'text', value: 'v2' }
381
+ }
382
+ ], handleAddItem: mockHandleAddItem, handleRemoveItem: mockHandleRemoveItem, handleItemChange: mockHandleItemChange }));
383
+ const inputs = react_1.screen.getAllByRole('textbox');
384
+ (0, vitest_1.expect)(inputs).toHaveLength(4);
385
+ });
386
+ (0, vitest_1.it)('should handle very long values', () => {
387
+ const longValue = 'a'.repeat(500);
388
+ renderComponent({
389
+ values: [
390
+ {
391
+ key: { type: 'text', value: longValue },
392
+ value: { type: 'text', value: longValue }
393
+ }
394
+ ]
395
+ });
396
+ const inputs = react_1.screen.getAllByRole('textbox');
397
+ (0, vitest_1.expect)(inputs[0]).toHaveValue(longValue);
398
+ (0, vitest_1.expect)(inputs[1]).toHaveValue(longValue);
399
+ });
400
+ (0, vitest_1.it)('should handle unicode characters', () => {
401
+ const unicodeKey = '你好键';
402
+ const unicodeValue = '🚀 مرحبا';
403
+ renderComponent({
404
+ values: [
405
+ {
406
+ key: { type: 'text', value: unicodeKey },
407
+ value: { type: 'text', value: unicodeValue }
408
+ }
409
+ ]
410
+ });
411
+ const inputs = react_1.screen.getAllByRole('textbox');
412
+ (0, vitest_1.expect)(inputs[0]).toHaveValue(unicodeKey);
413
+ (0, vitest_1.expect)(inputs[1]).toHaveValue(unicodeValue);
414
+ });
415
+ });
416
+ (0, vitest_1.describe)('Edge Cases', () => {
417
+ (0, vitest_1.it)('should handle many items', () => {
418
+ const manyItems = Array.from({ length: 10 }, (_, i) => ({
419
+ [`key${i}`]: { type: 'text', value: `key${i}` },
420
+ [`value${i}`]: { type: 'text', value: `value${i}` }
421
+ }));
422
+ renderComponent({ values: manyItems });
423
+ const inputs = react_1.screen.getAllByRole('textbox');
424
+ (0, vitest_1.expect)(inputs).toHaveLength(20); // 10 items * 2 inputs
425
+ });
426
+ (0, vitest_1.it)('should handle many icons', () => {
427
+ const manyItems = Array.from({ length: 10 }, (_, i) => ({
428
+ [`key${i}`]: { type: 'text', value: `key${i}` },
429
+ [`value${i}`]: { type: 'text', value: `value${i}` }
430
+ }));
431
+ renderComponent({ values: manyItems });
432
+ const plusIcons = react_1.screen.getAllByTestId('icon-plus');
433
+ const minusIcons = react_1.screen.getAllByTestId('icon-minus');
434
+ (0, vitest_1.expect)(plusIcons).toHaveLength(10);
435
+ (0, vitest_1.expect)(minusIcons).toHaveLength(10);
436
+ });
437
+ (0, vitest_1.it)('should handle unicode characters', () => {
438
+ const unicodeKey = '你好键';
439
+ const unicodeValue = '🚀 مرحبا';
440
+ renderComponent({
441
+ values: [
442
+ {
443
+ key: { type: 'text', value: unicodeKey },
444
+ value: { type: 'text', value: unicodeValue }
445
+ }
446
+ ]
447
+ });
448
+ const inputs = react_1.screen.getAllByRole('textbox');
449
+ (0, vitest_1.expect)(inputs[0]).toHaveValue(unicodeKey);
450
+ (0, vitest_1.expect)(inputs[1]).toHaveValue(unicodeValue);
451
+ });
452
+ });
453
+ });