@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,16 @@
1
+ export const FILTER_TYPES = {
2
+ INPUT: 'text'
3
+ };
4
+ export const DEBOUNCE_DELAY = 300;
5
+ export const DEFAULT_PAGE_SIZE = 20;
6
+ export const DEFAULT_CURRENT_PAGE = 1;
7
+ export const PAGE_SIZE_OPTIONS = [20, 50, 100, 250].map(item => ({
8
+ label: item,
9
+ value: item
10
+ }));
11
+ export const DEFAULT_ROW_KEY = 'pk';
12
+ export const IS_EDITING_INITIAL_VALUE = null;
13
+ export const MAPPER_ITEM_TYPES = {
14
+ SELECT: 'select',
15
+ TEXT: 'text'
16
+ };
@@ -0,0 +1,3 @@
1
+ import { type AkilocaleInstance } from '@akinon/akilocale';
2
+ export declare const i18n: AkilocaleInstance;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ai-table/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAKtE,eAAO,MAAM,IAAI,EAAE,iBAOjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Akilocale } from '@akinon/akilocale';
2
+ import en from './translations/en';
3
+ import tr from './translations/tr';
4
+ export const i18n = Akilocale.createInstance({
5
+ debug: false,
6
+ fallbackLng: 'en',
7
+ translations: {
8
+ en,
9
+ tr
10
+ }
11
+ });
@@ -0,0 +1,8 @@
1
+ declare const translations: {
2
+ readonly 'show.value': "Show Value";
3
+ readonly 'filter.no.match': "No matching results found";
4
+ readonly 'expand.all': "Expand All";
5
+ readonly 'collapse.all': "Collapse All";
6
+ };
7
+ export default translations;
8
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../../../src/ai-table/i18n/translations/en.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,YAAY;;;;;CAKR,CAAC;AAEX,eAAe,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ const translations = {
2
+ 'show.value': 'Show Value',
3
+ 'filter.no.match': 'No matching results found',
4
+ 'expand.all': 'Expand All',
5
+ 'collapse.all': 'Collapse All'
6
+ };
7
+ export default translations;
@@ -0,0 +1,8 @@
1
+ declare const translations: {
2
+ readonly 'show.value': "Değer Göster";
3
+ readonly 'filter.no.match': "Filtreye uygun sonuç bulunamadı";
4
+ readonly 'expand.all': "Tümünü Genişlet";
5
+ readonly 'collapse.all': "Tümünü Daralt";
6
+ };
7
+ export default translations;
8
+ //# sourceMappingURL=tr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tr.d.ts","sourceRoot":"","sources":["../../../../../src/ai-table/i18n/translations/tr.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,YAAY;;;;;CAKR,CAAC;AAEX,eAAe,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ const translations = {
2
+ 'show.value': 'Değer Göster',
3
+ 'filter.no.match': 'Filtreye uygun sonuç bulunamadı',
4
+ 'expand.all': 'Tümünü Genişlet',
5
+ 'collapse.all': 'Tümünü Daralt'
6
+ };
7
+ export default translations;
@@ -0,0 +1,4 @@
1
+ import * as React from 'react';
2
+ import type { AiTableProps } from '../types';
3
+ export declare const AiTable: ({ columns, customActionButtons, data, editDataIndexes, filters, isLoading, isSubmitting, onChangeSelectedRows, onEdit, onSubmitAllData, onSubmitSelectedData, rowKey, selectedRows, submitAllLabel, submitSelectedLabel, mapperConfig, tableClassName }: AiTableProps) => React.JSX.Element;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai-table/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAe7C,eAAO,MAAM,OAAO,GAAI,yPAkBrB,YAAY,sBA4Hd,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { AiSpinner } from '@akinon/ui-ai-spinner';
2
+ import { Button } from '@akinon/ui-button';
3
+ import { Flex } from '@akinon/ui-layout';
4
+ import * as React from 'react';
5
+ import { TableContent } from './components/content';
6
+ import { TableFilters } from './components/filters';
7
+ import { TableFooter } from './components/footer';
8
+ import { TablePagination } from './components/pagination';
9
+ import { DEFAULT_CURRENT_PAGE, DEFAULT_PAGE_SIZE, DEFAULT_ROW_KEY } from './constants';
10
+ import { i18n } from './i18n';
11
+ import { filterDataByFilters, paginateData } from './utils/data-format';
12
+ const { t } = i18n;
13
+ export const AiTable = ({ columns = [], customActionButtons, data = [], editDataIndexes, filters = [], isLoading, isSubmitting, onChangeSelectedRows, onEdit, onSubmitAllData, onSubmitSelectedData, rowKey = DEFAULT_ROW_KEY, selectedRows, submitAllLabel, submitSelectedLabel, mapperConfig, tableClassName }) => {
14
+ const [currentPage, setCurrentPage] = React.useState(DEFAULT_CURRENT_PAGE);
15
+ const [pageSize, setPageSize] = React.useState(DEFAULT_PAGE_SIZE);
16
+ const [filterValues, setFilterValues] = React.useState({});
17
+ const [expandedRows, setExpandedRows] = React.useState([]);
18
+ const hasMapper = !!mapperConfig;
19
+ const filteredData = React.useMemo(() => {
20
+ return filterDataByFilters(data, filterValues);
21
+ }, [data, filterValues]);
22
+ const paginatedData = React.useMemo(() => {
23
+ return paginateData({ currentPage, data: filteredData, pageSize });
24
+ }, [filteredData, currentPage, pageSize]);
25
+ const handleFilterChange = (key, value) => {
26
+ if (currentPage !== DEFAULT_CURRENT_PAGE) {
27
+ setCurrentPage(DEFAULT_CURRENT_PAGE);
28
+ }
29
+ setFilterValues(prev => (Object.assign(Object.assign({}, prev), { [key]: value })));
30
+ };
31
+ const handleToggleSelection = React.useCallback((rowId) => {
32
+ const newSelectedRows = selectedRows.includes(rowId)
33
+ ? selectedRows.filter(id => id !== rowId)
34
+ : [...selectedRows, rowId];
35
+ onChangeSelectedRows(newSelectedRows);
36
+ }, [selectedRows, onChangeSelectedRows]);
37
+ const handlePageChange = (page) => {
38
+ setCurrentPage(page);
39
+ };
40
+ const handlePageSizeChange = (size) => {
41
+ setPageSize(size);
42
+ };
43
+ const handleToggleExpand = React.useCallback((rowId) => {
44
+ setExpandedRows(prev => prev.includes(rowId) ? prev.filter(id => id !== rowId) : [...prev, rowId]);
45
+ }, []);
46
+ const handleExpandAll = React.useCallback(() => {
47
+ const allRowIds = data.map(row => row[rowKey]);
48
+ setExpandedRows(allRowIds);
49
+ }, [data, rowKey]);
50
+ const handleCollapseAll = React.useCallback(() => {
51
+ setExpandedRows([]);
52
+ }, []);
53
+ if (isLoading) {
54
+ return (React.createElement("div", { className: "w-full h-80" },
55
+ React.createElement(AiSpinner, null)));
56
+ }
57
+ return (React.createElement(Flex, { gap: 10, vertical: true, className: tableClassName },
58
+ React.createElement(Flex, { justify: "space-between", align: "center" },
59
+ React.createElement(Flex, { align: "center", gap: 22 },
60
+ React.createElement(TableFilters, { filters: filters, filterValues: filterValues, onFilterChange: handleFilterChange }),
61
+ hasMapper && (React.createElement(Flex, { gap: 8 },
62
+ React.createElement(Button, { size: "small", onClick: handleExpandAll }, t('expand.all')),
63
+ React.createElement(Button, { size: "small", onClick: handleCollapseAll }, t('collapse.all'))))),
64
+ React.createElement(TablePagination, { currentPage: currentPage, onPageChange: handlePageChange, onPageSizeChange: handlePageSizeChange, pageSize: pageSize, total: filteredData.length })),
65
+ React.createElement(TableContent, { columns: columns, customActionButtons: customActionButtons, data: paginatedData, editDataIndexes: editDataIndexes, expandedRows: expandedRows, onEdit: onEdit, onToggleExpand: handleToggleExpand, onToggleSelection: handleToggleSelection, rowKey: rowKey, selectedRows: selectedRows, mapperConfig: mapperConfig }),
66
+ React.createElement(TableFooter, { isSubmitting: isSubmitting, selectedCount: selectedRows.length, submitAllLabel: submitAllLabel, submitSelectedLabel: submitSelectedLabel, onSubmitAll: onSubmitAllData, onSubmitSelected: onSubmitSelectedData })));
67
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-table/utils/data-format/__tests__/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,144 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { filterDataByFilters, paginateData } from '../index';
3
+ describe('filterDataByFilters', () => {
4
+ const mockData = [
5
+ { id: 1, name: 'Ali', category: 'Electronics' },
6
+ { id: 2, name: 'Ayşe', category: 'Clothing' },
7
+ { id: 3, name: 'Mehmet', category: 'Electronics' }
8
+ ];
9
+ it('should return all data when filter values are empty', () => {
10
+ const result = filterDataByFilters(mockData, {});
11
+ expect(result).toEqual(mockData);
12
+ });
13
+ it('should return all data when filter values is null or undefined', () => {
14
+ const result1 = filterDataByFilters(mockData, {});
15
+ expect(result1).toEqual(mockData);
16
+ });
17
+ it('should filter data by single field', () => {
18
+ const result = filterDataByFilters(mockData, { category: 'Electronics' });
19
+ expect(result).toHaveLength(2);
20
+ expect(result).toEqual([
21
+ { id: 1, name: 'Ali', category: 'Electronics' },
22
+ { id: 3, name: 'Mehmet', category: 'Electronics' }
23
+ ]);
24
+ });
25
+ it('should filter data by multiple fields', () => {
26
+ const result = filterDataByFilters(mockData, {
27
+ category: 'Electronics',
28
+ name: 'Ali'
29
+ });
30
+ expect(result).toHaveLength(1);
31
+ expect(result[0]).toEqual({ id: 1, name: 'Ali', category: 'Electronics' });
32
+ });
33
+ it('should be case insensitive', () => {
34
+ const result = filterDataByFilters(mockData, { category: 'electronics' });
35
+ expect(result).toHaveLength(2);
36
+ });
37
+ it('should handle Turkish characters correctly', () => {
38
+ const turkishData = [
39
+ { id: 1, name: 'Çağlar' },
40
+ { id: 2, name: 'Şahan' },
41
+ { id: 3, name: 'Züleyha' }
42
+ ];
43
+ const result = filterDataByFilters(turkishData, { name: 'çağ' });
44
+ expect(result).toHaveLength(1);
45
+ expect(result[0].name).toBe('Çağlar');
46
+ });
47
+ it('should ignore empty string filter values', () => {
48
+ const result = filterDataByFilters(mockData, {
49
+ category: 'Electronics',
50
+ name: ''
51
+ });
52
+ expect(result).toHaveLength(2);
53
+ });
54
+ it('should ignore whitespace-only filter values', () => {
55
+ const result = filterDataByFilters(mockData, {
56
+ category: 'Electronics',
57
+ name: ' '
58
+ });
59
+ expect(result).toHaveLength(2);
60
+ });
61
+ it('should handle nested property paths', () => {
62
+ const nestedData = [
63
+ { id: 1, user: { name: 'Ali', role: 'admin' } },
64
+ { id: 2, user: { name: 'Ayşe', role: 'user' } }
65
+ ];
66
+ const result = filterDataByFilters(nestedData, { 'user.name': 'Ali' });
67
+ expect(result).toHaveLength(1);
68
+ expect(result[0].id).toBe(1);
69
+ });
70
+ it('should return empty array when no matches found', () => {
71
+ const result = filterDataByFilters(mockData, { name: 'Nonexistent' });
72
+ expect(result).toHaveLength(0);
73
+ });
74
+ });
75
+ describe('paginateData', () => {
76
+ const mockData = Array.from({ length: 25 }, (_, i) => ({
77
+ id: i + 1,
78
+ title: `Item ${i + 1}`
79
+ }));
80
+ it('should return first page correctly', () => {
81
+ const result = paginateData({
82
+ data: mockData,
83
+ currentPage: 1,
84
+ pageSize: 10
85
+ });
86
+ expect(result).toHaveLength(10);
87
+ expect(result[0].id).toBe(1);
88
+ expect(result[9].id).toBe(10);
89
+ });
90
+ it('should return second page correctly', () => {
91
+ const result = paginateData({
92
+ data: mockData,
93
+ currentPage: 2,
94
+ pageSize: 10
95
+ });
96
+ expect(result).toHaveLength(10);
97
+ expect(result[0].id).toBe(11);
98
+ expect(result[9].id).toBe(20);
99
+ });
100
+ it('should return last page with remaining items', () => {
101
+ const result = paginateData({
102
+ data: mockData,
103
+ currentPage: 3,
104
+ pageSize: 10
105
+ });
106
+ expect(result).toHaveLength(5);
107
+ expect(result[0].id).toBe(21);
108
+ expect(result[4].id).toBe(25);
109
+ });
110
+ it('should return empty array when page is beyond data length', () => {
111
+ const result = paginateData({
112
+ data: mockData,
113
+ currentPage: 10,
114
+ pageSize: 10
115
+ });
116
+ expect(result).toHaveLength(0);
117
+ });
118
+ it('should handle single item per page', () => {
119
+ const result = paginateData({
120
+ data: mockData,
121
+ currentPage: 1,
122
+ pageSize: 1
123
+ });
124
+ expect(result).toHaveLength(1);
125
+ expect(result[0].id).toBe(1);
126
+ });
127
+ it('should handle data length less than page size', () => {
128
+ const smallData = mockData.slice(0, 5);
129
+ const result = paginateData({
130
+ data: smallData,
131
+ currentPage: 1,
132
+ pageSize: 10
133
+ });
134
+ expect(result).toHaveLength(5);
135
+ });
136
+ it('should return empty array for empty data', () => {
137
+ const result = paginateData({
138
+ data: [],
139
+ currentPage: 1,
140
+ pageSize: 10
141
+ });
142
+ expect(result).toHaveLength(0);
143
+ });
144
+ });
@@ -0,0 +1,184 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { filterDataByFilters, paginateData } from '../index';
4
+
5
+ describe('filterDataByFilters', () => {
6
+ const mockData = [
7
+ { id: 1, name: 'Ali', category: 'Electronics' },
8
+ { id: 2, name: 'Ayşe', category: 'Clothing' },
9
+ { id: 3, name: 'Mehmet', category: 'Electronics' }
10
+ ];
11
+
12
+ it('should return all data when filter values are empty', () => {
13
+ const result = filterDataByFilters(mockData, {});
14
+
15
+ expect(result).toEqual(mockData);
16
+ });
17
+
18
+ it('should return all data when filter values is null or undefined', () => {
19
+ const result1 = filterDataByFilters(mockData, {});
20
+
21
+ expect(result1).toEqual(mockData);
22
+ });
23
+
24
+ it('should filter data by single field', () => {
25
+ const result = filterDataByFilters(mockData, { category: 'Electronics' });
26
+
27
+ expect(result).toHaveLength(2);
28
+ expect(result).toEqual([
29
+ { id: 1, name: 'Ali', category: 'Electronics' },
30
+ { id: 3, name: 'Mehmet', category: 'Electronics' }
31
+ ]);
32
+ });
33
+
34
+ it('should filter data by multiple fields', () => {
35
+ const result = filterDataByFilters(mockData, {
36
+ category: 'Electronics',
37
+ name: 'Ali'
38
+ });
39
+
40
+ expect(result).toHaveLength(1);
41
+ expect(result[0]).toEqual({ id: 1, name: 'Ali', category: 'Electronics' });
42
+ });
43
+
44
+ it('should be case insensitive', () => {
45
+ const result = filterDataByFilters(mockData, { category: 'electronics' });
46
+
47
+ expect(result).toHaveLength(2);
48
+ });
49
+
50
+ it('should handle Turkish characters correctly', () => {
51
+ const turkishData = [
52
+ { id: 1, name: 'Çağlar' },
53
+ { id: 2, name: 'Şahan' },
54
+ { id: 3, name: 'Züleyha' }
55
+ ];
56
+
57
+ const result = filterDataByFilters(turkishData, { name: 'çağ' });
58
+
59
+ expect(result).toHaveLength(1);
60
+ expect(result[0].name).toBe('Çağlar');
61
+ });
62
+
63
+ it('should ignore empty string filter values', () => {
64
+ const result = filterDataByFilters(mockData, {
65
+ category: 'Electronics',
66
+ name: ''
67
+ });
68
+
69
+ expect(result).toHaveLength(2);
70
+ });
71
+
72
+ it('should ignore whitespace-only filter values', () => {
73
+ const result = filterDataByFilters(mockData, {
74
+ category: 'Electronics',
75
+ name: ' '
76
+ });
77
+
78
+ expect(result).toHaveLength(2);
79
+ });
80
+
81
+ it('should handle nested property paths', () => {
82
+ const nestedData = [
83
+ { id: 1, user: { name: 'Ali', role: 'admin' } },
84
+ { id: 2, user: { name: 'Ayşe', role: 'user' } }
85
+ ];
86
+
87
+ const result = filterDataByFilters(nestedData, { 'user.name': 'Ali' });
88
+
89
+ expect(result).toHaveLength(1);
90
+ expect(result[0].id).toBe(1);
91
+ });
92
+
93
+ it('should return empty array when no matches found', () => {
94
+ const result = filterDataByFilters(mockData, { name: 'Nonexistent' });
95
+
96
+ expect(result).toHaveLength(0);
97
+ });
98
+ });
99
+
100
+ describe('paginateData', () => {
101
+ const mockData = Array.from({ length: 25 }, (_, i) => ({
102
+ id: i + 1,
103
+ title: `Item ${i + 1}`
104
+ }));
105
+
106
+ it('should return first page correctly', () => {
107
+ const result = paginateData({
108
+ data: mockData,
109
+ currentPage: 1,
110
+ pageSize: 10
111
+ });
112
+
113
+ expect(result).toHaveLength(10);
114
+ expect(result[0].id).toBe(1);
115
+ expect(result[9].id).toBe(10);
116
+ });
117
+
118
+ it('should return second page correctly', () => {
119
+ const result = paginateData({
120
+ data: mockData,
121
+ currentPage: 2,
122
+ pageSize: 10
123
+ });
124
+
125
+ expect(result).toHaveLength(10);
126
+ expect(result[0].id).toBe(11);
127
+ expect(result[9].id).toBe(20);
128
+ });
129
+
130
+ it('should return last page with remaining items', () => {
131
+ const result = paginateData({
132
+ data: mockData,
133
+ currentPage: 3,
134
+ pageSize: 10
135
+ });
136
+
137
+ expect(result).toHaveLength(5);
138
+ expect(result[0].id).toBe(21);
139
+ expect(result[4].id).toBe(25);
140
+ });
141
+
142
+ it('should return empty array when page is beyond data length', () => {
143
+ const result = paginateData({
144
+ data: mockData,
145
+ currentPage: 10,
146
+ pageSize: 10
147
+ });
148
+
149
+ expect(result).toHaveLength(0);
150
+ });
151
+
152
+ it('should handle single item per page', () => {
153
+ const result = paginateData({
154
+ data: mockData,
155
+ currentPage: 1,
156
+ pageSize: 1
157
+ });
158
+
159
+ expect(result).toHaveLength(1);
160
+ expect(result[0].id).toBe(1);
161
+ });
162
+
163
+ it('should handle data length less than page size', () => {
164
+ const smallData = mockData.slice(0, 5);
165
+
166
+ const result = paginateData({
167
+ data: smallData,
168
+ currentPage: 1,
169
+ pageSize: 10
170
+ });
171
+
172
+ expect(result).toHaveLength(5);
173
+ });
174
+
175
+ it('should return empty array for empty data', () => {
176
+ const result = paginateData({
177
+ data: [],
178
+ currentPage: 1,
179
+ pageSize: 10
180
+ });
181
+
182
+ expect(result).toHaveLength(0);
183
+ });
184
+ });
@@ -0,0 +1,7 @@
1
+ export declare const filterDataByFilters: (data: Record<string, any>[], filterValues: Record<string, string>) => Record<string, any>[];
2
+ export declare const paginateData: ({ currentPage, data, pageSize }: {
3
+ data: Record<string, any>[];
4
+ currentPage: number;
5
+ pageSize: number;
6
+ }) => Record<string, any>[];
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/ai-table/utils/data-format/index.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,mBAAmB,GAC9B,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAC3B,cAAc,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,0BAgBrC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,iCAI1B;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,0BAIA,CAAC"}
@@ -0,0 +1,38 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { get } from 'lodash-es';
3
+ const includesMultiLocale = (sourceText, searchText) => {
4
+ const locale1 = 'tr-TR';
5
+ const locale2 = 'en-US';
6
+ return (sourceText
7
+ .toLocaleLowerCase(locale1)
8
+ .includes(searchText.toLocaleLowerCase(locale1)) ||
9
+ sourceText
10
+ .toLocaleLowerCase(locale2)
11
+ .includes(searchText.toLocaleLowerCase(locale2)) ||
12
+ // Additional cross-locale matching for better Turkish character handling
13
+ sourceText
14
+ .toLocaleLowerCase(locale1)
15
+ .includes(searchText.toLocaleLowerCase(locale2)) ||
16
+ sourceText
17
+ .toLocaleLowerCase(locale2)
18
+ .includes(searchText.toLocaleLowerCase(locale1)));
19
+ };
20
+ export const filterDataByFilters = (data, filterValues) => {
21
+ if (!filterValues || Object.keys(filterValues).length === 0) {
22
+ return data;
23
+ }
24
+ return data.filter(item => {
25
+ return Object.entries(filterValues).every(([dataIndex, filterValue]) => {
26
+ if (!filterValue || filterValue.trim() === '') {
27
+ return true;
28
+ }
29
+ const itemValue = get(item, dataIndex, '');
30
+ return includesMultiLocale(String(itemValue), filterValue.trim());
31
+ });
32
+ });
33
+ };
34
+ export const paginateData = ({ currentPage, data, pageSize }) => {
35
+ const startIndex = (currentPage - 1) * pageSize;
36
+ const endIndex = startIndex + pageSize;
37
+ return data.slice(startIndex, endIndex);
38
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-table/utils/render-mapper-fields/__tests__/index.test.tsx"],"names":[],"mappings":""}