@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,289 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ /* eslint-disable @typescript-eslint/no-explicit-any */
13
+ import { render, screen } from '@testing-library/react';
14
+ import userEvent from '@testing-library/user-event';
15
+ import * as React from 'react';
16
+ import { describe, expect, it, vi } from 'vitest';
17
+ import { MAPPER_ITEM_TYPES } from '../../../constants';
18
+ import { renderMapperRow } from '../index';
19
+ // Mock Input to avoid theming issues in tests
20
+ vi.mock('@akinon/ui-input', () => {
21
+ const MockInput = React.forwardRef((_a, ref) => {
22
+ var { value, onChange } = _a, props = __rest(_a, ["value", "onChange"]);
23
+ return (React.createElement("input", Object.assign({ ref: ref, type: "text", value: value || '', onChange: onChange }, props)));
24
+ });
25
+ MockInput.displayName = 'MockInput';
26
+ return {
27
+ Input: MockInput
28
+ };
29
+ });
30
+ // Mock Select to avoid theming issues in tests
31
+ vi.mock('@akinon/ui-select', () => ({
32
+ Select: (_a) => {
33
+ var { value, options, onChange } = _a, props = __rest(_a, ["value", "options", "onChange"]);
34
+ const handleChange = React.useCallback((e) => {
35
+ const newValue = e.target.value;
36
+ onChange === null || onChange === void 0 ? void 0 : onChange(newValue);
37
+ }, [onChange]);
38
+ return (React.createElement("select", Object.assign({ value: value || '', onChange: handleChange, "data-testid": "mock-select" }, props),
39
+ React.createElement("option", { value: "" }, "-- Select --"), options === null || options === void 0 ? void 0 :
40
+ options.map((opt) => (React.createElement("option", { key: opt.value, value: opt.value }, opt.label)))));
41
+ }
42
+ }));
43
+ describe('renderMapperRow', () => {
44
+ it('renders text input items correctly', () => {
45
+ var _a;
46
+ const handleItemChange = vi.fn();
47
+ const row = {
48
+ firstName: {
49
+ type: MAPPER_ITEM_TYPES.TEXT,
50
+ value: 'John'
51
+ }
52
+ };
53
+ const { container } = render(React.createElement("div", null, renderMapperRow({
54
+ row,
55
+ index: 0,
56
+ handleItemChange
57
+ })));
58
+ const input = screen.getByDisplayValue('John');
59
+ expect(input).toBeInTheDocument();
60
+ expect(input).toHaveClass('w-40');
61
+ // Verify structure: container with input present
62
+ const divElements = container.querySelectorAll('div');
63
+ expect(divElements.length).toBeGreaterThan(0);
64
+ expect((_a = input.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement).toBeInTheDocument();
65
+ });
66
+ it('renders select items with options as select element', () => {
67
+ var _a;
68
+ const handleItemChange = vi.fn();
69
+ const row = {
70
+ country: {
71
+ type: MAPPER_ITEM_TYPES.SELECT,
72
+ value: 'TR',
73
+ options: [
74
+ { label: 'Turkey', value: 'TR' },
75
+ { label: 'USA', value: 'US' }
76
+ ]
77
+ }
78
+ };
79
+ const { container } = render(React.createElement("div", null, renderMapperRow({
80
+ row,
81
+ index: 0,
82
+ handleItemChange
83
+ })));
84
+ const selectElement = screen.getByTestId('mock-select');
85
+ expect(selectElement).toBeInTheDocument();
86
+ expect(selectElement.options).toHaveLength(3); // incl. "-- Select --"
87
+ // Verify structure: container with select present
88
+ const divElements = container.querySelectorAll('div');
89
+ expect(divElements.length).toBeGreaterThan(0);
90
+ expect((_a = selectElement.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement).toBeInTheDocument();
91
+ });
92
+ it('renders multiple items with dividers between them', () => {
93
+ const handleItemChange = vi.fn();
94
+ const row = {
95
+ firstName: {
96
+ type: MAPPER_ITEM_TYPES.TEXT,
97
+ value: 'John'
98
+ },
99
+ lastName: {
100
+ type: MAPPER_ITEM_TYPES.TEXT,
101
+ value: 'Doe'
102
+ }
103
+ };
104
+ const { container } = render(React.createElement("div", null, renderMapperRow({
105
+ row,
106
+ index: 0,
107
+ handleItemChange
108
+ })));
109
+ expect(screen.getByDisplayValue('John')).toBeInTheDocument();
110
+ expect(screen.getByDisplayValue('Doe')).toBeInTheDocument();
111
+ // Check for divider (children of flex)
112
+ const dividers = container.querySelectorAll('.w-3.h-1.bg-ebonyClay-550');
113
+ expect(dividers.length).toBe(1); // One divider between two items
114
+ });
115
+ it('calls handleItemChange when text input changes', async () => {
116
+ const user = userEvent.setup();
117
+ const handleItemChange = vi.fn();
118
+ const row = {
119
+ firstName: {
120
+ type: MAPPER_ITEM_TYPES.TEXT,
121
+ value: ''
122
+ }
123
+ };
124
+ render(React.createElement("div", null, renderMapperRow({
125
+ row,
126
+ index: 0,
127
+ handleItemChange
128
+ })));
129
+ const input = screen.getByRole('textbox');
130
+ await user.type(input, 'Jane');
131
+ // Verify the handler was called for each character
132
+ expect(handleItemChange).toHaveBeenCalled();
133
+ // Verify the final call includes "Jane"
134
+ expect(handleItemChange).toHaveBeenCalledWith(expect.objectContaining({
135
+ index: 0,
136
+ key: 'firstName'
137
+ }));
138
+ });
139
+ it('calls handleItemChange when select value changes', async () => {
140
+ const user = userEvent.setup();
141
+ const handleItemChange = vi.fn();
142
+ const row = {
143
+ country: {
144
+ type: MAPPER_ITEM_TYPES.SELECT,
145
+ value: 'TR',
146
+ options: [
147
+ { label: 'Turkey', value: 'TR' },
148
+ { label: 'USA', value: 'US' }
149
+ ]
150
+ }
151
+ };
152
+ render(React.createElement("div", null, renderMapperRow({
153
+ row,
154
+ index: 0,
155
+ handleItemChange
156
+ })));
157
+ const selectElement = screen.getByTestId('mock-select');
158
+ await user.selectOptions(selectElement, 'US');
159
+ expect(handleItemChange).toHaveBeenCalledWith({
160
+ index: 0,
161
+ key: 'country',
162
+ value: 'US'
163
+ });
164
+ });
165
+ it('handles empty mapper row', () => {
166
+ const handleItemChange = vi.fn();
167
+ const row = {};
168
+ const { container } = render(React.createElement("div", null, renderMapperRow({
169
+ row,
170
+ index: 0,
171
+ handleItemChange
172
+ })));
173
+ expect(container.querySelectorAll('input').length).toBe(0);
174
+ });
175
+ it('renders mixed item types in single row', () => {
176
+ const handleItemChange = vi.fn();
177
+ const row = {
178
+ firstName: {
179
+ type: MAPPER_ITEM_TYPES.TEXT,
180
+ value: 'John'
181
+ },
182
+ country: {
183
+ type: MAPPER_ITEM_TYPES.SELECT,
184
+ value: 'TR',
185
+ options: [
186
+ { label: 'Turkey', value: 'TR' },
187
+ { label: 'USA', value: 'US' }
188
+ ]
189
+ }
190
+ };
191
+ const { container } = render(React.createElement("div", null, renderMapperRow({
192
+ row,
193
+ index: 0,
194
+ handleItemChange
195
+ })));
196
+ expect(screen.getByDisplayValue('John')).toBeInTheDocument();
197
+ expect(screen.getByTestId('mock-select')).toBeInTheDocument();
198
+ // Check for divider between items
199
+ const dividers = container.querySelectorAll('.w-3.h-1.bg-ebonyClay-550');
200
+ expect(dividers.length).toBe(1);
201
+ });
202
+ it('passes correct index to handleItemChange', async () => {
203
+ const user = userEvent.setup();
204
+ const handleItemChange = vi.fn();
205
+ const row = {
206
+ field: {
207
+ type: MAPPER_ITEM_TYPES.TEXT,
208
+ value: ''
209
+ }
210
+ };
211
+ render(React.createElement("div", null, renderMapperRow({
212
+ row,
213
+ index: 5,
214
+ handleItemChange
215
+ })));
216
+ const input = screen.getByRole('textbox');
217
+ await user.type(input, 'test');
218
+ expect(handleItemChange).toHaveBeenCalledWith(expect.objectContaining({
219
+ index: 5
220
+ }));
221
+ });
222
+ it('renders with unknown type as text input', () => {
223
+ const handleItemChange = vi.fn();
224
+ const row = {
225
+ field: {
226
+ type: 'unknown_type',
227
+ value: 'test'
228
+ }
229
+ };
230
+ render(React.createElement("div", null, renderMapperRow({
231
+ row,
232
+ index: 0,
233
+ handleItemChange
234
+ })));
235
+ const input = screen.getByDisplayValue('test');
236
+ expect(input).toBeInTheDocument();
237
+ });
238
+ it('does not render divider after last item', () => {
239
+ const handleItemChange = vi.fn();
240
+ const row = {
241
+ field1: {
242
+ type: MAPPER_ITEM_TYPES.TEXT,
243
+ value: 'value1'
244
+ },
245
+ field2: {
246
+ type: MAPPER_ITEM_TYPES.TEXT,
247
+ value: 'value2'
248
+ },
249
+ field3: {
250
+ type: MAPPER_ITEM_TYPES.TEXT,
251
+ value: 'value3'
252
+ }
253
+ };
254
+ const { container } = render(React.createElement("div", null, renderMapperRow({
255
+ row,
256
+ index: 0,
257
+ handleItemChange
258
+ })));
259
+ // Should have 2 dividers (between 3 items)
260
+ const dividers = container.querySelectorAll('.w-3.h-1.bg-ebonyClay-550');
261
+ expect(dividers.length).toBe(2);
262
+ });
263
+ it('handles text input change correctly with multiple fields', async () => {
264
+ const user = userEvent.setup();
265
+ const handleItemChange = vi.fn();
266
+ const row = {
267
+ field1: {
268
+ type: MAPPER_ITEM_TYPES.TEXT,
269
+ value: ''
270
+ },
271
+ field2: {
272
+ type: MAPPER_ITEM_TYPES.TEXT,
273
+ value: 'value'
274
+ }
275
+ };
276
+ render(React.createElement("div", null, renderMapperRow({
277
+ row,
278
+ index: 2,
279
+ handleItemChange
280
+ })));
281
+ const inputs = screen.getAllByRole('textbox');
282
+ await user.type(inputs[0], 'updated');
283
+ expect(handleItemChange).toHaveBeenCalled();
284
+ expect(handleItemChange).toHaveBeenCalledWith(expect.objectContaining({
285
+ index: 2,
286
+ key: 'field1'
287
+ }));
288
+ });
289
+ });
@@ -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"}