@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,291 @@
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 user_event_1 = require("@testing-library/user-event");
17
+ const React = require("react");
18
+ const vitest_1 = require("vitest");
19
+ const constants_1 = require("../../../constants");
20
+ const index_1 = require("../index");
21
+ // Mock Input to avoid theming issues in tests
22
+ vitest_1.vi.mock('@akinon/ui-input', () => {
23
+ const MockInput = React.forwardRef((_a, ref) => {
24
+ var { value, onChange } = _a, props = __rest(_a, ["value", "onChange"]);
25
+ return (React.createElement("input", Object.assign({ ref: ref, type: "text", value: value || '', onChange: onChange }, props)));
26
+ });
27
+ MockInput.displayName = 'MockInput';
28
+ return {
29
+ Input: MockInput
30
+ };
31
+ });
32
+ // Mock Select to avoid theming issues in tests
33
+ vitest_1.vi.mock('@akinon/ui-select', () => ({
34
+ Select: (_a) => {
35
+ var { value, options, onChange } = _a, props = __rest(_a, ["value", "options", "onChange"]);
36
+ const handleChange = React.useCallback((e) => {
37
+ const newValue = e.target.value;
38
+ onChange === null || onChange === void 0 ? void 0 : onChange(newValue);
39
+ }, [onChange]);
40
+ return (React.createElement("select", Object.assign({ value: value || '', onChange: handleChange, "data-testid": "mock-select" }, props),
41
+ React.createElement("option", { value: "" }, "-- Select --"), options === null || options === void 0 ? void 0 :
42
+ options.map((opt) => (React.createElement("option", { key: opt.value, value: opt.value }, opt.label)))));
43
+ }
44
+ }));
45
+ (0, vitest_1.describe)('renderMapperRow', () => {
46
+ (0, vitest_1.it)('renders text input items correctly', () => {
47
+ var _a;
48
+ const handleItemChange = vitest_1.vi.fn();
49
+ const row = {
50
+ firstName: {
51
+ type: constants_1.MAPPER_ITEM_TYPES.TEXT,
52
+ value: 'John'
53
+ }
54
+ };
55
+ const { container } = (0, react_1.render)(React.createElement("div", null, (0, index_1.renderMapperRow)({
56
+ row,
57
+ index: 0,
58
+ handleItemChange
59
+ })));
60
+ const input = react_1.screen.getByDisplayValue('John');
61
+ (0, vitest_1.expect)(input).toBeInTheDocument();
62
+ (0, vitest_1.expect)(input).toHaveClass('w-40');
63
+ // Verify structure: container with input present
64
+ const divElements = container.querySelectorAll('div');
65
+ (0, vitest_1.expect)(divElements.length).toBeGreaterThan(0);
66
+ (0, vitest_1.expect)((_a = input.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement).toBeInTheDocument();
67
+ });
68
+ (0, vitest_1.it)('renders select items with options as select element', () => {
69
+ var _a;
70
+ const handleItemChange = vitest_1.vi.fn();
71
+ const row = {
72
+ country: {
73
+ type: constants_1.MAPPER_ITEM_TYPES.SELECT,
74
+ value: 'TR',
75
+ options: [
76
+ { label: 'Turkey', value: 'TR' },
77
+ { label: 'USA', value: 'US' }
78
+ ]
79
+ }
80
+ };
81
+ const { container } = (0, react_1.render)(React.createElement("div", null, (0, index_1.renderMapperRow)({
82
+ row,
83
+ index: 0,
84
+ handleItemChange
85
+ })));
86
+ const selectElement = react_1.screen.getByTestId('mock-select');
87
+ (0, vitest_1.expect)(selectElement).toBeInTheDocument();
88
+ (0, vitest_1.expect)(selectElement.options).toHaveLength(3); // incl. "-- Select --"
89
+ // Verify structure: container with select present
90
+ const divElements = container.querySelectorAll('div');
91
+ (0, vitest_1.expect)(divElements.length).toBeGreaterThan(0);
92
+ (0, vitest_1.expect)((_a = selectElement.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement).toBeInTheDocument();
93
+ });
94
+ (0, vitest_1.it)('renders multiple items with dividers between them', () => {
95
+ const handleItemChange = vitest_1.vi.fn();
96
+ const row = {
97
+ firstName: {
98
+ type: constants_1.MAPPER_ITEM_TYPES.TEXT,
99
+ value: 'John'
100
+ },
101
+ lastName: {
102
+ type: constants_1.MAPPER_ITEM_TYPES.TEXT,
103
+ value: 'Doe'
104
+ }
105
+ };
106
+ const { container } = (0, react_1.render)(React.createElement("div", null, (0, index_1.renderMapperRow)({
107
+ row,
108
+ index: 0,
109
+ handleItemChange
110
+ })));
111
+ (0, vitest_1.expect)(react_1.screen.getByDisplayValue('John')).toBeInTheDocument();
112
+ (0, vitest_1.expect)(react_1.screen.getByDisplayValue('Doe')).toBeInTheDocument();
113
+ // Check for divider (children of flex)
114
+ const dividers = container.querySelectorAll('.w-3.h-1.bg-ebonyClay-550');
115
+ (0, vitest_1.expect)(dividers.length).toBe(1); // One divider between two items
116
+ });
117
+ (0, vitest_1.it)('calls handleItemChange when text input changes', async () => {
118
+ const user = user_event_1.default.setup();
119
+ const handleItemChange = vitest_1.vi.fn();
120
+ const row = {
121
+ firstName: {
122
+ type: constants_1.MAPPER_ITEM_TYPES.TEXT,
123
+ value: ''
124
+ }
125
+ };
126
+ (0, react_1.render)(React.createElement("div", null, (0, index_1.renderMapperRow)({
127
+ row,
128
+ index: 0,
129
+ handleItemChange
130
+ })));
131
+ const input = react_1.screen.getByRole('textbox');
132
+ await user.type(input, 'Jane');
133
+ // Verify the handler was called for each character
134
+ (0, vitest_1.expect)(handleItemChange).toHaveBeenCalled();
135
+ // Verify the final call includes "Jane"
136
+ (0, vitest_1.expect)(handleItemChange).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
137
+ index: 0,
138
+ key: 'firstName'
139
+ }));
140
+ });
141
+ (0, vitest_1.it)('calls handleItemChange when select value changes', async () => {
142
+ const user = user_event_1.default.setup();
143
+ const handleItemChange = vitest_1.vi.fn();
144
+ const row = {
145
+ country: {
146
+ type: constants_1.MAPPER_ITEM_TYPES.SELECT,
147
+ value: 'TR',
148
+ options: [
149
+ { label: 'Turkey', value: 'TR' },
150
+ { label: 'USA', value: 'US' }
151
+ ]
152
+ }
153
+ };
154
+ (0, react_1.render)(React.createElement("div", null, (0, index_1.renderMapperRow)({
155
+ row,
156
+ index: 0,
157
+ handleItemChange
158
+ })));
159
+ const selectElement = react_1.screen.getByTestId('mock-select');
160
+ await user.selectOptions(selectElement, 'US');
161
+ (0, vitest_1.expect)(handleItemChange).toHaveBeenCalledWith({
162
+ index: 0,
163
+ key: 'country',
164
+ value: 'US'
165
+ });
166
+ });
167
+ (0, vitest_1.it)('handles empty mapper row', () => {
168
+ const handleItemChange = vitest_1.vi.fn();
169
+ const row = {};
170
+ const { container } = (0, react_1.render)(React.createElement("div", null, (0, index_1.renderMapperRow)({
171
+ row,
172
+ index: 0,
173
+ handleItemChange
174
+ })));
175
+ (0, vitest_1.expect)(container.querySelectorAll('input').length).toBe(0);
176
+ });
177
+ (0, vitest_1.it)('renders mixed item types in single row', () => {
178
+ const handleItemChange = vitest_1.vi.fn();
179
+ const row = {
180
+ firstName: {
181
+ type: constants_1.MAPPER_ITEM_TYPES.TEXT,
182
+ value: 'John'
183
+ },
184
+ country: {
185
+ type: constants_1.MAPPER_ITEM_TYPES.SELECT,
186
+ value: 'TR',
187
+ options: [
188
+ { label: 'Turkey', value: 'TR' },
189
+ { label: 'USA', value: 'US' }
190
+ ]
191
+ }
192
+ };
193
+ const { container } = (0, react_1.render)(React.createElement("div", null, (0, index_1.renderMapperRow)({
194
+ row,
195
+ index: 0,
196
+ handleItemChange
197
+ })));
198
+ (0, vitest_1.expect)(react_1.screen.getByDisplayValue('John')).toBeInTheDocument();
199
+ (0, vitest_1.expect)(react_1.screen.getByTestId('mock-select')).toBeInTheDocument();
200
+ // Check for divider between items
201
+ const dividers = container.querySelectorAll('.w-3.h-1.bg-ebonyClay-550');
202
+ (0, vitest_1.expect)(dividers.length).toBe(1);
203
+ });
204
+ (0, vitest_1.it)('passes correct index to handleItemChange', async () => {
205
+ const user = user_event_1.default.setup();
206
+ const handleItemChange = vitest_1.vi.fn();
207
+ const row = {
208
+ field: {
209
+ type: constants_1.MAPPER_ITEM_TYPES.TEXT,
210
+ value: ''
211
+ }
212
+ };
213
+ (0, react_1.render)(React.createElement("div", null, (0, index_1.renderMapperRow)({
214
+ row,
215
+ index: 5,
216
+ handleItemChange
217
+ })));
218
+ const input = react_1.screen.getByRole('textbox');
219
+ await user.type(input, 'test');
220
+ (0, vitest_1.expect)(handleItemChange).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
221
+ index: 5
222
+ }));
223
+ });
224
+ (0, vitest_1.it)('renders with unknown type as text input', () => {
225
+ const handleItemChange = vitest_1.vi.fn();
226
+ const row = {
227
+ field: {
228
+ type: 'unknown_type',
229
+ value: 'test'
230
+ }
231
+ };
232
+ (0, react_1.render)(React.createElement("div", null, (0, index_1.renderMapperRow)({
233
+ row,
234
+ index: 0,
235
+ handleItemChange
236
+ })));
237
+ const input = react_1.screen.getByDisplayValue('test');
238
+ (0, vitest_1.expect)(input).toBeInTheDocument();
239
+ });
240
+ (0, vitest_1.it)('does not render divider after last item', () => {
241
+ const handleItemChange = vitest_1.vi.fn();
242
+ const row = {
243
+ field1: {
244
+ type: constants_1.MAPPER_ITEM_TYPES.TEXT,
245
+ value: 'value1'
246
+ },
247
+ field2: {
248
+ type: constants_1.MAPPER_ITEM_TYPES.TEXT,
249
+ value: 'value2'
250
+ },
251
+ field3: {
252
+ type: constants_1.MAPPER_ITEM_TYPES.TEXT,
253
+ value: 'value3'
254
+ }
255
+ };
256
+ const { container } = (0, react_1.render)(React.createElement("div", null, (0, index_1.renderMapperRow)({
257
+ row,
258
+ index: 0,
259
+ handleItemChange
260
+ })));
261
+ // Should have 2 dividers (between 3 items)
262
+ const dividers = container.querySelectorAll('.w-3.h-1.bg-ebonyClay-550');
263
+ (0, vitest_1.expect)(dividers.length).toBe(2);
264
+ });
265
+ (0, vitest_1.it)('handles text input change correctly with multiple fields', async () => {
266
+ const user = user_event_1.default.setup();
267
+ const handleItemChange = vitest_1.vi.fn();
268
+ const row = {
269
+ field1: {
270
+ type: constants_1.MAPPER_ITEM_TYPES.TEXT,
271
+ value: ''
272
+ },
273
+ field2: {
274
+ type: constants_1.MAPPER_ITEM_TYPES.TEXT,
275
+ value: 'value'
276
+ }
277
+ };
278
+ (0, react_1.render)(React.createElement("div", null, (0, index_1.renderMapperRow)({
279
+ row,
280
+ index: 2,
281
+ handleItemChange
282
+ })));
283
+ const inputs = react_1.screen.getAllByRole('textbox');
284
+ await user.type(inputs[0], 'updated');
285
+ (0, vitest_1.expect)(handleItemChange).toHaveBeenCalled();
286
+ (0, vitest_1.expect)(handleItemChange).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
287
+ index: 2,
288
+ key: 'field1'
289
+ }));
290
+ });
291
+ });
@@ -0,0 +1,399 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { render, screen } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import * as React from 'react';
5
+ import { describe, expect, it, vi } from 'vitest';
6
+
7
+ import type { MapperRow } from '../../../../types';
8
+ import { MAPPER_ITEM_TYPES } from '../../../constants';
9
+ import { renderMapperRow } from '../index';
10
+
11
+ // Mock Input to avoid theming issues in tests
12
+ vi.mock('@akinon/ui-input', () => {
13
+ const MockInput = React.forwardRef(
14
+ ({ value, onChange, ...props }: any, ref: any) => (
15
+ <input
16
+ ref={ref}
17
+ type="text"
18
+ value={value || ''}
19
+ onChange={onChange}
20
+ {...props}
21
+ />
22
+ )
23
+ );
24
+
25
+ MockInput.displayName = 'MockInput';
26
+
27
+ return {
28
+ Input: MockInput
29
+ };
30
+ });
31
+
32
+ // Mock Select to avoid theming issues in tests
33
+ vi.mock('@akinon/ui-select', () => ({
34
+ Select: ({ value, options, onChange, ...props }: any) => {
35
+ const handleChange = React.useCallback(
36
+ (e: React.ChangeEvent<HTMLSelectElement>) => {
37
+ const newValue = e.target.value;
38
+ onChange?.(newValue);
39
+ },
40
+ [onChange]
41
+ );
42
+
43
+ return (
44
+ <select
45
+ value={value || ''}
46
+ onChange={handleChange}
47
+ data-testid="mock-select"
48
+ {...props}
49
+ >
50
+ <option value="">-- Select --</option>
51
+ {options?.map((opt: any) => (
52
+ <option key={opt.value} value={opt.value}>
53
+ {opt.label}
54
+ </option>
55
+ ))}
56
+ </select>
57
+ );
58
+ }
59
+ }));
60
+
61
+ describe('renderMapperRow', () => {
62
+ it('renders text input items correctly', () => {
63
+ const handleItemChange = vi.fn();
64
+ const row: MapperRow = {
65
+ firstName: {
66
+ type: MAPPER_ITEM_TYPES.TEXT,
67
+ value: 'John'
68
+ }
69
+ };
70
+
71
+ const { container } = render(
72
+ <div>
73
+ {renderMapperRow({
74
+ row,
75
+ index: 0,
76
+ handleItemChange
77
+ })}
78
+ </div>
79
+ );
80
+
81
+ const input = screen.getByDisplayValue('John') as HTMLInputElement;
82
+ expect(input).toBeInTheDocument();
83
+ expect(input).toHaveClass('w-40');
84
+
85
+ // Verify structure: container with input present
86
+ const divElements = container.querySelectorAll('div');
87
+ expect(divElements.length).toBeGreaterThan(0);
88
+ expect(input.parentElement?.parentElement).toBeInTheDocument();
89
+ });
90
+
91
+ it('renders select items with options as select element', () => {
92
+ const handleItemChange = vi.fn();
93
+ const row: MapperRow = {
94
+ country: {
95
+ type: MAPPER_ITEM_TYPES.SELECT,
96
+ value: 'TR',
97
+ options: [
98
+ { label: 'Turkey', value: 'TR' },
99
+ { label: 'USA', value: 'US' }
100
+ ]
101
+ }
102
+ };
103
+
104
+ const { container } = render(
105
+ <div>
106
+ {renderMapperRow({
107
+ row,
108
+ index: 0,
109
+ handleItemChange
110
+ })}
111
+ </div>
112
+ );
113
+
114
+ const selectElement = screen.getByTestId(
115
+ 'mock-select'
116
+ ) as HTMLSelectElement;
117
+ expect(selectElement).toBeInTheDocument();
118
+ expect(selectElement.options).toHaveLength(3); // incl. "-- Select --"
119
+
120
+ // Verify structure: container with select present
121
+ const divElements = container.querySelectorAll('div');
122
+ expect(divElements.length).toBeGreaterThan(0);
123
+ expect(selectElement.parentElement?.parentElement).toBeInTheDocument();
124
+ });
125
+
126
+ it('renders multiple items with dividers between them', () => {
127
+ const handleItemChange = vi.fn();
128
+ const row: MapperRow = {
129
+ firstName: {
130
+ type: MAPPER_ITEM_TYPES.TEXT,
131
+ value: 'John'
132
+ },
133
+ lastName: {
134
+ type: MAPPER_ITEM_TYPES.TEXT,
135
+ value: 'Doe'
136
+ }
137
+ };
138
+
139
+ const { container } = render(
140
+ <div>
141
+ {renderMapperRow({
142
+ row,
143
+ index: 0,
144
+ handleItemChange
145
+ })}
146
+ </div>
147
+ );
148
+
149
+ expect(screen.getByDisplayValue('John')).toBeInTheDocument();
150
+ expect(screen.getByDisplayValue('Doe')).toBeInTheDocument();
151
+
152
+ // Check for divider (children of flex)
153
+ const dividers = container.querySelectorAll('.w-3.h-1.bg-ebonyClay-550');
154
+ expect(dividers.length).toBe(1); // One divider between two items
155
+ });
156
+
157
+ it('calls handleItemChange when text input changes', async () => {
158
+ const user = userEvent.setup();
159
+ const handleItemChange = vi.fn();
160
+ const row: MapperRow = {
161
+ firstName: {
162
+ type: MAPPER_ITEM_TYPES.TEXT,
163
+ value: ''
164
+ }
165
+ };
166
+
167
+ render(
168
+ <div>
169
+ {renderMapperRow({
170
+ row,
171
+ index: 0,
172
+ handleItemChange
173
+ })}
174
+ </div>
175
+ );
176
+
177
+ const input = screen.getByRole('textbox') as HTMLInputElement;
178
+ await user.type(input, 'Jane');
179
+
180
+ // Verify the handler was called for each character
181
+ expect(handleItemChange).toHaveBeenCalled();
182
+ // Verify the final call includes "Jane"
183
+ expect(handleItemChange).toHaveBeenCalledWith(
184
+ expect.objectContaining({
185
+ index: 0,
186
+ key: 'firstName'
187
+ })
188
+ );
189
+ });
190
+
191
+ it('calls handleItemChange when select value changes', async () => {
192
+ const user = userEvent.setup();
193
+ const handleItemChange = vi.fn();
194
+ const row: MapperRow = {
195
+ country: {
196
+ type: MAPPER_ITEM_TYPES.SELECT,
197
+ value: 'TR',
198
+ options: [
199
+ { label: 'Turkey', value: 'TR' },
200
+ { label: 'USA', value: 'US' }
201
+ ]
202
+ }
203
+ };
204
+
205
+ render(
206
+ <div>
207
+ {renderMapperRow({
208
+ row,
209
+ index: 0,
210
+ handleItemChange
211
+ })}
212
+ </div>
213
+ );
214
+
215
+ const selectElement = screen.getByTestId(
216
+ 'mock-select'
217
+ ) as HTMLSelectElement;
218
+ await user.selectOptions(selectElement, 'US');
219
+
220
+ expect(handleItemChange).toHaveBeenCalledWith({
221
+ index: 0,
222
+ key: 'country',
223
+ value: 'US'
224
+ });
225
+ });
226
+
227
+ it('handles empty mapper row', () => {
228
+ const handleItemChange = vi.fn();
229
+ const row: MapperRow = {};
230
+
231
+ const { container } = render(
232
+ <div>
233
+ {renderMapperRow({
234
+ row,
235
+ index: 0,
236
+ handleItemChange
237
+ })}
238
+ </div>
239
+ );
240
+
241
+ expect(container.querySelectorAll('input').length).toBe(0);
242
+ });
243
+
244
+ it('renders mixed item types in single row', () => {
245
+ const handleItemChange = vi.fn();
246
+ const row: MapperRow = {
247
+ firstName: {
248
+ type: MAPPER_ITEM_TYPES.TEXT,
249
+ value: 'John'
250
+ },
251
+ country: {
252
+ type: MAPPER_ITEM_TYPES.SELECT,
253
+ value: 'TR',
254
+ options: [
255
+ { label: 'Turkey', value: 'TR' },
256
+ { label: 'USA', value: 'US' }
257
+ ]
258
+ }
259
+ };
260
+
261
+ const { container } = render(
262
+ <div>
263
+ {renderMapperRow({
264
+ row,
265
+ index: 0,
266
+ handleItemChange
267
+ })}
268
+ </div>
269
+ );
270
+
271
+ expect(screen.getByDisplayValue('John')).toBeInTheDocument();
272
+ expect(screen.getByTestId('mock-select')).toBeInTheDocument();
273
+
274
+ // Check for divider between items
275
+ const dividers = container.querySelectorAll('.w-3.h-1.bg-ebonyClay-550');
276
+ expect(dividers.length).toBe(1);
277
+ });
278
+
279
+ it('passes correct index to handleItemChange', async () => {
280
+ const user = userEvent.setup();
281
+ const handleItemChange = vi.fn();
282
+ const row: MapperRow = {
283
+ field: {
284
+ type: MAPPER_ITEM_TYPES.TEXT,
285
+ value: ''
286
+ }
287
+ };
288
+
289
+ render(
290
+ <div>
291
+ {renderMapperRow({
292
+ row,
293
+ index: 5,
294
+ handleItemChange
295
+ })}
296
+ </div>
297
+ );
298
+
299
+ const input = screen.getByRole('textbox') as HTMLInputElement;
300
+ await user.type(input, 'test');
301
+
302
+ expect(handleItemChange).toHaveBeenCalledWith(
303
+ expect.objectContaining({
304
+ index: 5
305
+ })
306
+ );
307
+ });
308
+
309
+ it('renders with unknown type as text input', () => {
310
+ const handleItemChange = vi.fn();
311
+ const row: MapperRow = {
312
+ field: {
313
+ type: 'unknown_type' as any,
314
+ value: 'test'
315
+ }
316
+ };
317
+
318
+ render(
319
+ <div>
320
+ {renderMapperRow({
321
+ row,
322
+ index: 0,
323
+ handleItemChange
324
+ })}
325
+ </div>
326
+ );
327
+
328
+ const input = screen.getByDisplayValue('test');
329
+ expect(input).toBeInTheDocument();
330
+ });
331
+
332
+ it('does not render divider after last item', () => {
333
+ const handleItemChange = vi.fn();
334
+ const row: MapperRow = {
335
+ field1: {
336
+ type: MAPPER_ITEM_TYPES.TEXT,
337
+ value: 'value1'
338
+ },
339
+ field2: {
340
+ type: MAPPER_ITEM_TYPES.TEXT,
341
+ value: 'value2'
342
+ },
343
+ field3: {
344
+ type: MAPPER_ITEM_TYPES.TEXT,
345
+ value: 'value3'
346
+ }
347
+ };
348
+
349
+ const { container } = render(
350
+ <div>
351
+ {renderMapperRow({
352
+ row,
353
+ index: 0,
354
+ handleItemChange
355
+ })}
356
+ </div>
357
+ );
358
+
359
+ // Should have 2 dividers (between 3 items)
360
+ const dividers = container.querySelectorAll('.w-3.h-1.bg-ebonyClay-550');
361
+ expect(dividers.length).toBe(2);
362
+ });
363
+
364
+ it('handles text input change correctly with multiple fields', async () => {
365
+ const user = userEvent.setup();
366
+ const handleItemChange = vi.fn();
367
+ const row: MapperRow = {
368
+ field1: {
369
+ type: MAPPER_ITEM_TYPES.TEXT,
370
+ value: ''
371
+ },
372
+ field2: {
373
+ type: MAPPER_ITEM_TYPES.TEXT,
374
+ value: 'value'
375
+ }
376
+ };
377
+
378
+ render(
379
+ <div>
380
+ {renderMapperRow({
381
+ row,
382
+ index: 2,
383
+ handleItemChange
384
+ })}
385
+ </div>
386
+ );
387
+
388
+ const inputs = screen.getAllByRole('textbox');
389
+ await user.type(inputs[0], 'updated');
390
+
391
+ expect(handleItemChange).toHaveBeenCalled();
392
+ expect(handleItemChange).toHaveBeenCalledWith(
393
+ expect.objectContaining({
394
+ index: 2,
395
+ key: 'field1'
396
+ })
397
+ );
398
+ });
399
+ });
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ import type { HandleMapperItemChange, MapperRow } from '../../../types';
3
+ type RenderMapperRow = ({ row, index, handleItemChange }: {
4
+ row: MapperRow;
5
+ index: number;
6
+ handleItemChange: HandleMapperItemChange;
7
+ }) => React.ReactNode;
8
+ export declare const renderMapperRow: RenderMapperRow;
9
+ export {};
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/ai-table/utils/render-mapper-fields/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EACV,sBAAsB,EAEtB,SAAS,EAEV,MAAM,gBAAgB,CAAC;AA2GxB,KAAK,eAAe,GAAG,CAAC,EACtB,GAAG,EACH,KAAK,EACL,gBAAgB,EACjB,EAAE;IACD,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,sBAAsB,CAAC;CAC1C,KAAK,KAAK,CAAC,SAAS,CAAC;AACtB,eAAO,MAAM,eAAe,EAAE,eAoB7B,CAAC"}