@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.
- package/dist/cjs/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/__tests__/index.test.js +82 -0
- package/dist/cjs/__tests__/index.test.tsx +94 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.js +59 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.tsx +98 -0
- package/dist/cjs/ai-modal-table/index.d.ts +4 -0
- package/dist/cjs/ai-modal-table/index.d.ts.map +1 -0
- package/dist/cjs/ai-modal-table/index.js +54 -0
- package/dist/cjs/ai-table/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/__tests__/index.test.js +348 -0
- package/dist/cjs/ai-table/__tests__/index.test.tsx +572 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.js +1349 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.tsx +1637 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.js +400 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.tsx +534 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.js +465 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.tsx +597 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.js +453 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.tsx +601 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.js +430 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.tsx +629 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.js +382 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.tsx +507 -0
- package/dist/cjs/ai-table/components/content.d.ts +11 -0
- package/dist/cjs/ai-table/components/content.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/content.js +309 -0
- package/dist/cjs/ai-table/components/filters.d.ts +10 -0
- package/dist/cjs/ai-table/components/filters.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/filters.js +55 -0
- package/dist/cjs/ai-table/components/footer.d.ts +12 -0
- package/dist/cjs/ai-table/components/footer.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/footer.js +24 -0
- package/dist/cjs/ai-table/components/mapper.d.ts +11 -0
- package/dist/cjs/ai-table/components/mapper.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/mapper.js +21 -0
- package/dist/cjs/ai-table/components/pagination.d.ts +11 -0
- package/dist/cjs/ai-table/components/pagination.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/pagination.js +106 -0
- package/dist/cjs/ai-table/components/row-actions.d.ts +14 -0
- package/dist/cjs/ai-table/components/row-actions.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/row-actions.js +52 -0
- package/dist/cjs/ai-table/constants/index.d.ts +17 -0
- package/dist/cjs/ai-table/constants/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/constants/index.js +19 -0
- package/dist/cjs/ai-table/i18n/index.d.ts +3 -0
- package/dist/cjs/ai-table/i18n/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/i18n/index.js +14 -0
- package/dist/cjs/ai-table/i18n/translations/en.d.ts +8 -0
- package/dist/cjs/ai-table/i18n/translations/en.d.ts.map +1 -0
- package/dist/cjs/ai-table/i18n/translations/en.js +9 -0
- package/dist/cjs/ai-table/i18n/translations/tr.d.ts +8 -0
- package/dist/cjs/ai-table/i18n/translations/tr.d.ts.map +1 -0
- package/dist/cjs/ai-table/i18n/translations/tr.js +9 -0
- package/dist/cjs/ai-table/index.d.ts +4 -0
- package/dist/cjs/ai-table/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/index.js +71 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.js +146 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.ts +184 -0
- package/dist/cjs/ai-table/utils/data-format/index.d.ts +7 -0
- package/dist/cjs/ai-table/utils/data-format/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/data-format/index.js +43 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.js +291 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.tsx +399 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/index.d.ts +10 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/index.js +48 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/types/index.d.ts +134 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +2 -0
- package/dist/esm/__tests__/index.test.d.ts +2 -0
- package/dist/esm/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/__tests__/index.test.js +80 -0
- package/dist/esm/__tests__/index.test.tsx +94 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.js +57 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.tsx +98 -0
- package/dist/esm/ai-modal-table/index.d.ts +4 -0
- package/dist/esm/ai-modal-table/index.d.ts.map +1 -0
- package/dist/esm/ai-modal-table/index.js +50 -0
- package/dist/esm/ai-table/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-table/__tests__/index.test.js +346 -0
- package/dist/esm/ai-table/__tests__/index.test.tsx +572 -0
- package/dist/esm/ai-table/components/__tests__/content.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/content.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/content.test.js +1347 -0
- package/dist/esm/ai-table/components/__tests__/content.test.tsx +1637 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.js +398 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.tsx +534 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.js +463 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.tsx +597 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.js +451 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.tsx +601 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.js +428 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.tsx +629 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.js +380 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.tsx +507 -0
- package/dist/esm/ai-table/components/content.d.ts +11 -0
- package/dist/esm/ai-table/components/content.d.ts.map +1 -0
- package/dist/esm/ai-table/components/content.js +305 -0
- package/dist/esm/ai-table/components/filters.d.ts +10 -0
- package/dist/esm/ai-table/components/filters.d.ts.map +1 -0
- package/dist/esm/ai-table/components/filters.js +51 -0
- package/dist/esm/ai-table/components/footer.d.ts +12 -0
- package/dist/esm/ai-table/components/footer.d.ts.map +1 -0
- package/dist/esm/ai-table/components/footer.js +20 -0
- package/dist/esm/ai-table/components/mapper.d.ts +11 -0
- package/dist/esm/ai-table/components/mapper.d.ts.map +1 -0
- package/dist/esm/ai-table/components/mapper.js +17 -0
- package/dist/esm/ai-table/components/pagination.d.ts +11 -0
- package/dist/esm/ai-table/components/pagination.d.ts.map +1 -0
- package/dist/esm/ai-table/components/pagination.js +102 -0
- package/dist/esm/ai-table/components/row-actions.d.ts +14 -0
- package/dist/esm/ai-table/components/row-actions.d.ts.map +1 -0
- package/dist/esm/ai-table/components/row-actions.js +48 -0
- package/dist/esm/ai-table/constants/index.d.ts +17 -0
- package/dist/esm/ai-table/constants/index.d.ts.map +1 -0
- package/dist/esm/ai-table/constants/index.js +16 -0
- package/dist/esm/ai-table/i18n/index.d.ts +3 -0
- package/dist/esm/ai-table/i18n/index.d.ts.map +1 -0
- package/dist/esm/ai-table/i18n/index.js +11 -0
- package/dist/esm/ai-table/i18n/translations/en.d.ts +8 -0
- package/dist/esm/ai-table/i18n/translations/en.d.ts.map +1 -0
- package/dist/esm/ai-table/i18n/translations/en.js +7 -0
- package/dist/esm/ai-table/i18n/translations/tr.d.ts +8 -0
- package/dist/esm/ai-table/i18n/translations/tr.d.ts.map +1 -0
- package/dist/esm/ai-table/i18n/translations/tr.js +7 -0
- package/dist/esm/ai-table/index.d.ts +4 -0
- package/dist/esm/ai-table/index.d.ts.map +1 -0
- package/dist/esm/ai-table/index.js +67 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.js +144 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.ts +184 -0
- package/dist/esm/ai-table/utils/data-format/index.d.ts +7 -0
- package/dist/esm/ai-table/utils/data-format/index.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/data-format/index.js +38 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.js +289 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.tsx +399 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/index.d.ts +10 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/index.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/index.js +44 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/types/index.d.ts +134 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderMapperRow = void 0;
|
|
4
|
+
const ui_input_1 = require("@akinon/ui-input");
|
|
5
|
+
const ui_layout_1 = require("@akinon/ui-layout");
|
|
6
|
+
const ui_select_1 = require("@akinon/ui-select");
|
|
7
|
+
const React = require("react");
|
|
8
|
+
const constants_1 = require("../../constants");
|
|
9
|
+
const renderDivider = (row, index) => {
|
|
10
|
+
const isLastItem = Object.keys(row).length - 1 === index;
|
|
11
|
+
if (isLastItem)
|
|
12
|
+
return null;
|
|
13
|
+
return React.createElement("div", { className: "w-3 h-1 bg-ebonyClay-550" });
|
|
14
|
+
};
|
|
15
|
+
const renderSelectItem = ({ key, value, index, options, handleItemChange }) => (React.createElement(ui_select_1.Select, { value: value || undefined, rootClassName: "w-40", size: "large", options: options || [], onChange: selectedValue => handleItemChange({
|
|
16
|
+
index,
|
|
17
|
+
key,
|
|
18
|
+
value: selectedValue
|
|
19
|
+
}) }));
|
|
20
|
+
const renderTextItem = ({ key, value, index, handleItemChange }) => (React.createElement(ui_input_1.Input, { value: value, className: "w-40", size: "large", onChange: e => handleItemChange({ index, key, value: e.target.value }) }));
|
|
21
|
+
const renderItemByType = ({ key, index, item, handleItemChange }) => {
|
|
22
|
+
const { type, options, value } = item;
|
|
23
|
+
switch (type) {
|
|
24
|
+
case constants_1.MAPPER_ITEM_TYPES.SELECT:
|
|
25
|
+
return renderSelectItem({
|
|
26
|
+
key,
|
|
27
|
+
value,
|
|
28
|
+
index,
|
|
29
|
+
options,
|
|
30
|
+
handleItemChange
|
|
31
|
+
});
|
|
32
|
+
case constants_1.MAPPER_ITEM_TYPES.TEXT:
|
|
33
|
+
return renderTextItem({ key, value, index, handleItemChange });
|
|
34
|
+
default:
|
|
35
|
+
return renderTextItem({ key, value, index, handleItemChange });
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const renderMapperRow = ({ row, index, handleItemChange }) => {
|
|
39
|
+
return (React.createElement(ui_layout_1.Flex, { align: "center" }, Object.entries(row).map(([fieldKey, item], itemIndex) => (React.createElement(React.Fragment, { key: itemIndex },
|
|
40
|
+
renderItemByType({
|
|
41
|
+
key: fieldKey,
|
|
42
|
+
index,
|
|
43
|
+
item,
|
|
44
|
+
handleItemChange
|
|
45
|
+
}),
|
|
46
|
+
renderDivider(row, itemIndex))))));
|
|
47
|
+
};
|
|
48
|
+
exports.renderMapperRow = renderMapperRow;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AiTable = exports.AiModalTable = void 0;
|
|
4
|
+
var ai_modal_table_1 = require("./ai-modal-table");
|
|
5
|
+
Object.defineProperty(exports, "AiModalTable", { enumerable: true, get: function () { return ai_modal_table_1.AiModalTable; } });
|
|
6
|
+
var ai_table_1 = require("./ai-table");
|
|
7
|
+
Object.defineProperty(exports, "AiTable", { enumerable: true, get: function () { return ai_table_1.AiTable; } });
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import type { ModalProps } from '@akinon/ui-modal';
|
|
2
|
+
import { MAPPER_ITEM_TYPES } from '../ai-table/constants';
|
|
3
|
+
type MapperItemTypes = (typeof MAPPER_ITEM_TYPES)[keyof typeof MAPPER_ITEM_TYPES];
|
|
4
|
+
export type HandleMapperItemChange = ({ index, key, value }: {
|
|
5
|
+
index: number;
|
|
6
|
+
key: string;
|
|
7
|
+
value: MapperItemValue;
|
|
8
|
+
}) => void;
|
|
9
|
+
export type MapperItemValue = string | number;
|
|
10
|
+
export type MapperSelectItemOption = {
|
|
11
|
+
label: string;
|
|
12
|
+
value: MapperItemValue;
|
|
13
|
+
};
|
|
14
|
+
export interface MapperRow {
|
|
15
|
+
[key: string]: {
|
|
16
|
+
value: MapperItemValue;
|
|
17
|
+
type: MapperItemTypes;
|
|
18
|
+
options?: MapperSelectItemOption[];
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
type Filter = {
|
|
22
|
+
key: string;
|
|
23
|
+
type: string;
|
|
24
|
+
placeholder?: string;
|
|
25
|
+
};
|
|
26
|
+
type Column = {
|
|
27
|
+
title: string;
|
|
28
|
+
dataIndex: string;
|
|
29
|
+
hasSparkle?: boolean;
|
|
30
|
+
hasGradientLine?: boolean;
|
|
31
|
+
render?: (value: unknown, record: Record<string, unknown>) => React.ReactNode;
|
|
32
|
+
};
|
|
33
|
+
export interface MapperConfig {
|
|
34
|
+
/**
|
|
35
|
+
* Callback fired when items are added to a mapper field. Receives the row ID, the dataIndex of the mapper field, and the new item to be added. The new item is an object containing 'key' and 'value' properties.
|
|
36
|
+
*/
|
|
37
|
+
onAddItem: (pk: string | number, dataIndex: string) => void;
|
|
38
|
+
/**
|
|
39
|
+
* Callback fired when items are removed from a mapper field. Receives the row ID, the dataIndex of the mapper field, and the index of the item to be removed.
|
|
40
|
+
*/
|
|
41
|
+
onRemoveItem: ({ pk, dataIndex, index }: {
|
|
42
|
+
pk: string | number;
|
|
43
|
+
dataIndex: string;
|
|
44
|
+
index: number;
|
|
45
|
+
}) => void;
|
|
46
|
+
/**
|
|
47
|
+
* Callback fired when a mapper item is changed. Receives the row ID, the dataIndex of the mapper field, the key of the item, the index of the item in the array, and the new value.
|
|
48
|
+
*/
|
|
49
|
+
onItemChange: (pk: string | number, payload: Record<string, MapperRow[]>) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Column data indexes that have mapper functionality.
|
|
52
|
+
*/
|
|
53
|
+
dataIndex: string;
|
|
54
|
+
}
|
|
55
|
+
export interface TableBaseProps {
|
|
56
|
+
/**
|
|
57
|
+
* The unique key field name for identifying rows
|
|
58
|
+
*/
|
|
59
|
+
rowKey?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Array of data objects to display in the table
|
|
62
|
+
*/
|
|
63
|
+
data: Record<string, unknown>[];
|
|
64
|
+
/**
|
|
65
|
+
* Array of column configurations defining table structure and appearance
|
|
66
|
+
*/
|
|
67
|
+
columns: Column[];
|
|
68
|
+
/**
|
|
69
|
+
* Array of filter configurations for filtering the table data
|
|
70
|
+
*/
|
|
71
|
+
filters: Filter[];
|
|
72
|
+
/**
|
|
73
|
+
* Array of data keys that should be editable in the table
|
|
74
|
+
*/
|
|
75
|
+
editDataIndexes?: string[];
|
|
76
|
+
/**
|
|
77
|
+
* Callback fired when a row is edited. Returns the row ID and the modified data. To work properly, editDataIndexes prop must be provided
|
|
78
|
+
*/
|
|
79
|
+
onEdit?: (pk: number | string, payload: Record<string, string>) => void;
|
|
80
|
+
/**
|
|
81
|
+
* Function to render custom action buttons for each row. Receives the row ID.
|
|
82
|
+
*/
|
|
83
|
+
customActionButtons?: (rowId: number | string) => React.ReactNode;
|
|
84
|
+
/**
|
|
85
|
+
* Array of currently selected row IDs
|
|
86
|
+
*/
|
|
87
|
+
selectedRows: Array<number | string>;
|
|
88
|
+
/**
|
|
89
|
+
* Callback fired when the selection of rows changes
|
|
90
|
+
*/
|
|
91
|
+
onChangeSelectedRows: (rows: Array<number | string>) => void;
|
|
92
|
+
/**
|
|
93
|
+
* Configuration for mapper functionality. If provided, the table will render mapper fields based on the specified dataIndex and use the provided callbacks to manage adding, removing, and changing items in the mapper fields.
|
|
94
|
+
*/
|
|
95
|
+
mapperConfig?: MapperConfig;
|
|
96
|
+
/**
|
|
97
|
+
* CSS class name to apply to the table wrapper element
|
|
98
|
+
*/
|
|
99
|
+
tableClassName?: string;
|
|
100
|
+
}
|
|
101
|
+
export interface AiTableProps extends TableBaseProps {
|
|
102
|
+
/**
|
|
103
|
+
* Shows loading state for the table data
|
|
104
|
+
*/
|
|
105
|
+
isLoading: boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Shows loading state for the submit buttons
|
|
108
|
+
*/
|
|
109
|
+
isSubmitting: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Label text for the "Submit All" button
|
|
112
|
+
*/
|
|
113
|
+
submitAllLabel: string;
|
|
114
|
+
/**
|
|
115
|
+
* Label text for the "Submit Selected" button
|
|
116
|
+
*/
|
|
117
|
+
submitSelectedLabel: string;
|
|
118
|
+
/**
|
|
119
|
+
* Callback fired when "Submit All" button is clicked.
|
|
120
|
+
*/
|
|
121
|
+
onSubmitAllData: () => void;
|
|
122
|
+
/**
|
|
123
|
+
* Callback fired when "Submit Selected" button is clicked.
|
|
124
|
+
*/
|
|
125
|
+
onSubmitSelectedData: () => void;
|
|
126
|
+
}
|
|
127
|
+
export interface AiModalTableProps extends AiTableProps, ModalProps {
|
|
128
|
+
/**
|
|
129
|
+
* Description text displayed in the modal header
|
|
130
|
+
*/
|
|
131
|
+
description: string;
|
|
132
|
+
}
|
|
133
|
+
export {};
|
|
134
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/index.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { AiModalTable, AiTable } from '../index';
|
|
4
|
+
import * as indexModule from '../index';
|
|
5
|
+
describe('index.tsx - Public API', () => {
|
|
6
|
+
describe('Component Exports', () => {
|
|
7
|
+
it('should export AiModalTable and AiTable components', () => {
|
|
8
|
+
expect(indexModule).toHaveProperty('AiModalTable');
|
|
9
|
+
expect(indexModule).toHaveProperty('AiTable');
|
|
10
|
+
expect(typeof indexModule.AiModalTable).toBe('function');
|
|
11
|
+
expect(typeof indexModule.AiTable).toBe('function');
|
|
12
|
+
});
|
|
13
|
+
it('should have only named exports (no default export)', () => {
|
|
14
|
+
const exports = Object.keys(indexModule).sort();
|
|
15
|
+
expect(exports).toContain('AiModalTable');
|
|
16
|
+
expect(exports).toContain('AiTable');
|
|
17
|
+
expect(indexModule.default).toBeUndefined();
|
|
18
|
+
});
|
|
19
|
+
it('should maintain export consistency', () => {
|
|
20
|
+
expect(indexModule.AiModalTable).toBe(AiModalTable);
|
|
21
|
+
expect(indexModule.AiTable).toBe(AiTable);
|
|
22
|
+
});
|
|
23
|
+
it('should export components as separate instances', () => {
|
|
24
|
+
const { AiModalTable, AiTable } = indexModule;
|
|
25
|
+
expect(AiModalTable).not.toBe(AiTable);
|
|
26
|
+
expect(typeof AiModalTable).toBe('function');
|
|
27
|
+
expect(typeof AiTable).toBe('function');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('Module Structure', () => {
|
|
31
|
+
it('should be importable as ES module with all exports', () => {
|
|
32
|
+
expect(Object.keys(indexModule).length).toBeGreaterThanOrEqual(2);
|
|
33
|
+
});
|
|
34
|
+
it('should have React components with proper names', () => {
|
|
35
|
+
const getComponentName = (comp) => comp.name || comp.displayName || 'Unknown';
|
|
36
|
+
expect(getComponentName(indexModule.AiModalTable)).toBeDefined();
|
|
37
|
+
expect(getComponentName(indexModule.AiTable)).toBeDefined();
|
|
38
|
+
});
|
|
39
|
+
it('should not have circular or broken dependencies', () => {
|
|
40
|
+
// Should be able to destructure without errors
|
|
41
|
+
expect(() => {
|
|
42
|
+
const { AiModalTable: ModalTable, AiTable: Table } = indexModule;
|
|
43
|
+
if (!ModalTable || !Table)
|
|
44
|
+
throw new Error('Missing export');
|
|
45
|
+
}).not.toThrow();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('Export Stability', () => {
|
|
49
|
+
it('should maintain stable export references across multiple imports', () => {
|
|
50
|
+
const import1 = indexModule.AiModalTable;
|
|
51
|
+
const import2 = indexModule.AiModalTable;
|
|
52
|
+
const import3 = indexModule.AiTable;
|
|
53
|
+
const import4 = indexModule.AiTable;
|
|
54
|
+
expect(import1).toBe(import2);
|
|
55
|
+
expect(import3).toBe(import4);
|
|
56
|
+
});
|
|
57
|
+
it('should support destructuring without errors', () => {
|
|
58
|
+
// Common user pattern - destructuring from index
|
|
59
|
+
const { AiModalTable, AiTable } = indexModule;
|
|
60
|
+
expect(AiModalTable).toBeDefined();
|
|
61
|
+
expect(AiTable).toBeDefined();
|
|
62
|
+
expect(typeof AiModalTable).toBe('function');
|
|
63
|
+
expect(typeof AiTable).toBe('function');
|
|
64
|
+
});
|
|
65
|
+
it('should support namespace import pattern', () => {
|
|
66
|
+
// Common user pattern - namespace import
|
|
67
|
+
const exports = indexModule;
|
|
68
|
+
expect(exports.AiModalTable).toBeDefined();
|
|
69
|
+
expect(exports.AiTable).toBeDefined();
|
|
70
|
+
});
|
|
71
|
+
it('should export both wrapper and content components', () => {
|
|
72
|
+
// Verify architectural separation:
|
|
73
|
+
// - AiModalTable wraps content (modal + AiTable)
|
|
74
|
+
// - AiTable provides table functionality independently
|
|
75
|
+
const { AiModalTable, AiTable } = indexModule;
|
|
76
|
+
expect(AiModalTable).not.toBe(AiTable);
|
|
77
|
+
expect(AiModalTable !== AiTable).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
|
|
4
|
+
import { AiModalTable, AiTable } from '../index';
|
|
5
|
+
import * as indexModule from '../index';
|
|
6
|
+
|
|
7
|
+
describe('index.tsx - Public API', () => {
|
|
8
|
+
describe('Component Exports', () => {
|
|
9
|
+
it('should export AiModalTable and AiTable components', () => {
|
|
10
|
+
expect(indexModule).toHaveProperty('AiModalTable');
|
|
11
|
+
expect(indexModule).toHaveProperty('AiTable');
|
|
12
|
+
expect(typeof indexModule.AiModalTable).toBe('function');
|
|
13
|
+
expect(typeof indexModule.AiTable).toBe('function');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should have only named exports (no default export)', () => {
|
|
17
|
+
const exports = Object.keys(indexModule).sort();
|
|
18
|
+
expect(exports).toContain('AiModalTable');
|
|
19
|
+
expect(exports).toContain('AiTable');
|
|
20
|
+
expect((indexModule as Record<string, any>).default).toBeUndefined();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('should maintain export consistency', () => {
|
|
24
|
+
expect(indexModule.AiModalTable).toBe(AiModalTable);
|
|
25
|
+
expect(indexModule.AiTable).toBe(AiTable);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('should export components as separate instances', () => {
|
|
29
|
+
const { AiModalTable, AiTable } = indexModule;
|
|
30
|
+
expect(AiModalTable).not.toBe(AiTable);
|
|
31
|
+
expect(typeof AiModalTable).toBe('function');
|
|
32
|
+
expect(typeof AiTable).toBe('function');
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('Module Structure', () => {
|
|
37
|
+
it('should be importable as ES module with all exports', () => {
|
|
38
|
+
expect(Object.keys(indexModule).length).toBeGreaterThanOrEqual(2);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should have React components with proper names', () => {
|
|
42
|
+
const getComponentName = (comp: any) =>
|
|
43
|
+
comp.name || comp.displayName || 'Unknown';
|
|
44
|
+
|
|
45
|
+
expect(getComponentName(indexModule.AiModalTable)).toBeDefined();
|
|
46
|
+
expect(getComponentName(indexModule.AiTable)).toBeDefined();
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('should not have circular or broken dependencies', () => {
|
|
50
|
+
// Should be able to destructure without errors
|
|
51
|
+
expect(() => {
|
|
52
|
+
const { AiModalTable: ModalTable, AiTable: Table } = indexModule;
|
|
53
|
+
if (!ModalTable || !Table) throw new Error('Missing export');
|
|
54
|
+
}).not.toThrow();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe('Export Stability', () => {
|
|
59
|
+
it('should maintain stable export references across multiple imports', () => {
|
|
60
|
+
const import1 = indexModule.AiModalTable;
|
|
61
|
+
const import2 = indexModule.AiModalTable;
|
|
62
|
+
const import3 = indexModule.AiTable;
|
|
63
|
+
const import4 = indexModule.AiTable;
|
|
64
|
+
|
|
65
|
+
expect(import1).toBe(import2);
|
|
66
|
+
expect(import3).toBe(import4);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should support destructuring without errors', () => {
|
|
70
|
+
// Common user pattern - destructuring from index
|
|
71
|
+
const { AiModalTable, AiTable } = indexModule;
|
|
72
|
+
expect(AiModalTable).toBeDefined();
|
|
73
|
+
expect(AiTable).toBeDefined();
|
|
74
|
+
expect(typeof AiModalTable).toBe('function');
|
|
75
|
+
expect(typeof AiTable).toBe('function');
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('should support namespace import pattern', () => {
|
|
79
|
+
// Common user pattern - namespace import
|
|
80
|
+
const exports = indexModule;
|
|
81
|
+
expect(exports.AiModalTable).toBeDefined();
|
|
82
|
+
expect(exports.AiTable).toBeDefined();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('should export both wrapper and content components', () => {
|
|
86
|
+
// Verify architectural separation:
|
|
87
|
+
// - AiModalTable wraps content (modal + AiTable)
|
|
88
|
+
// - AiTable provides table functionality independently
|
|
89
|
+
const { AiModalTable, AiTable } = indexModule;
|
|
90
|
+
expect(AiModalTable).not.toBe(AiTable);
|
|
91
|
+
expect(AiModalTable !== AiTable).toBe(true);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../src/ai-modal-table/__tests__/index.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
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 { fireEvent, render, screen } from '@testing-library/react';
|
|
14
|
+
import React from 'react';
|
|
15
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
16
|
+
vi.mock('@akinon/ui-theme', async (importOriginal) => {
|
|
17
|
+
const actual = (await importOriginal());
|
|
18
|
+
return Object.assign(Object.assign({}, actual), { useToken: () => ({ token: {}, hashId: 'hash123' }) });
|
|
19
|
+
});
|
|
20
|
+
vi.mock('@akinon/ui-layout', () => ({
|
|
21
|
+
Flex: ({ children }) => React.createElement("div", { "data-testid": "flex" }, children)
|
|
22
|
+
}));
|
|
23
|
+
vi.mock('@akinon/ui-modal', () => ({
|
|
24
|
+
Modal: (_a) => {
|
|
25
|
+
var { children, onCancel, className } = _a, rest = __rest(_a, ["children", "onCancel", "className"]);
|
|
26
|
+
return (React.createElement("div", Object.assign({ "data-testid": "modal", className: className }, rest),
|
|
27
|
+
React.createElement("button", { "data-testid": "close-button", onClick: onCancel }),
|
|
28
|
+
children));
|
|
29
|
+
}
|
|
30
|
+
}));
|
|
31
|
+
vi.mock('../ai-table', () => ({
|
|
32
|
+
AiTable: (props) => (React.createElement("div", { "data-testid": "ai-table" },
|
|
33
|
+
React.createElement("pre", { "data-testid": "ai-table-props" }, JSON.stringify({
|
|
34
|
+
columns: props.columns,
|
|
35
|
+
data: props.data,
|
|
36
|
+
isLoading: props.isLoading
|
|
37
|
+
})))),
|
|
38
|
+
DEFAULT_ROW_KEY: 'id'
|
|
39
|
+
}));
|
|
40
|
+
import { AiModalTable } from '../index';
|
|
41
|
+
describe('AiModalTable', () => {
|
|
42
|
+
it('renders description and passes props to AiTable', () => {
|
|
43
|
+
const columns = [{ title: 'Name', dataIndex: 'name' }];
|
|
44
|
+
const data = [{ id: 1, name: 'Alice' }];
|
|
45
|
+
render(React.createElement(AiModalTable, { description: "My description", columns: columns, data: data, isLoading: true, submitAllLabel: "Submit All", submitSelectedLabel: "Submit Selected", filters: [], selectedRows: [], onChangeSelectedRows: () => { }, isSubmitting: false, onSubmitAllData: () => { }, onSubmitSelectedData: () => { } }));
|
|
46
|
+
expect(screen.getByText('My description')).toBeInTheDocument();
|
|
47
|
+
});
|
|
48
|
+
it('calls onCancel when modal close clicked and applies class names', () => {
|
|
49
|
+
const onCancel = vi.fn();
|
|
50
|
+
render(React.createElement(AiModalTable, { description: "My description", columns: [], data: [], isLoading: true, submitAllLabel: "Submit All", submitSelectedLabel: "Submit Selected", filters: [], selectedRows: [], onChangeSelectedRows: () => { }, isSubmitting: false, onSubmitAllData: () => { }, onSubmitSelectedData: () => { }, onCancel: onCancel }));
|
|
51
|
+
const modal = screen.getByTestId('modal');
|
|
52
|
+
expect(modal.className).toContain('ai-modal-table');
|
|
53
|
+
expect(modal.className).toContain('hash123');
|
|
54
|
+
fireEvent.click(screen.getByTestId('close-button'));
|
|
55
|
+
expect(onCancel).toHaveBeenCalledTimes(1);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { fireEvent, render, screen } from '@testing-library/react';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
5
|
+
|
|
6
|
+
vi.mock('@akinon/ui-theme', async importOriginal => {
|
|
7
|
+
const actual = (await importOriginal()) as Record<string, any>;
|
|
8
|
+
|
|
9
|
+
return {
|
|
10
|
+
...actual,
|
|
11
|
+
useToken: () => ({ token: {}, hashId: 'hash123' })
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
vi.mock('@akinon/ui-layout', () => ({
|
|
16
|
+
Flex: ({ children }: any) => <div data-testid="flex">{children}</div>
|
|
17
|
+
}));
|
|
18
|
+
|
|
19
|
+
vi.mock('@akinon/ui-modal', () => ({
|
|
20
|
+
Modal: ({ children, onCancel, className, ...rest }: any) => (
|
|
21
|
+
<div data-testid="modal" className={className} {...rest}>
|
|
22
|
+
<button data-testid="close-button" onClick={onCancel} />
|
|
23
|
+
{children}
|
|
24
|
+
</div>
|
|
25
|
+
)
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
vi.mock('../ai-table', () => ({
|
|
29
|
+
AiTable: (props: any) => (
|
|
30
|
+
<div data-testid="ai-table">
|
|
31
|
+
<pre data-testid="ai-table-props">
|
|
32
|
+
{JSON.stringify({
|
|
33
|
+
columns: props.columns,
|
|
34
|
+
data: props.data,
|
|
35
|
+
isLoading: props.isLoading
|
|
36
|
+
})}
|
|
37
|
+
</pre>
|
|
38
|
+
</div>
|
|
39
|
+
),
|
|
40
|
+
DEFAULT_ROW_KEY: 'id'
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
import { AiModalTable } from '../index';
|
|
44
|
+
|
|
45
|
+
describe('AiModalTable', () => {
|
|
46
|
+
it('renders description and passes props to AiTable', () => {
|
|
47
|
+
const columns = [{ title: 'Name', dataIndex: 'name' }];
|
|
48
|
+
const data = [{ id: 1, name: 'Alice' }];
|
|
49
|
+
|
|
50
|
+
render(
|
|
51
|
+
<AiModalTable
|
|
52
|
+
description="My description"
|
|
53
|
+
columns={columns}
|
|
54
|
+
data={data}
|
|
55
|
+
isLoading={true}
|
|
56
|
+
submitAllLabel="Submit All"
|
|
57
|
+
submitSelectedLabel="Submit Selected"
|
|
58
|
+
filters={[]}
|
|
59
|
+
selectedRows={[]}
|
|
60
|
+
onChangeSelectedRows={() => {}}
|
|
61
|
+
isSubmitting={false}
|
|
62
|
+
onSubmitAllData={() => {}}
|
|
63
|
+
onSubmitSelectedData={() => {}}
|
|
64
|
+
/>
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
expect(screen.getByText('My description')).toBeInTheDocument();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('calls onCancel when modal close clicked and applies class names', () => {
|
|
71
|
+
const onCancel = vi.fn();
|
|
72
|
+
|
|
73
|
+
render(
|
|
74
|
+
<AiModalTable
|
|
75
|
+
description="My description"
|
|
76
|
+
columns={[]}
|
|
77
|
+
data={[]}
|
|
78
|
+
isLoading={true}
|
|
79
|
+
submitAllLabel="Submit All"
|
|
80
|
+
submitSelectedLabel="Submit Selected"
|
|
81
|
+
filters={[]}
|
|
82
|
+
selectedRows={[]}
|
|
83
|
+
onChangeSelectedRows={() => {}}
|
|
84
|
+
isSubmitting={false}
|
|
85
|
+
onSubmitAllData={() => {}}
|
|
86
|
+
onSubmitSelectedData={() => {}}
|
|
87
|
+
onCancel={onCancel}
|
|
88
|
+
/>
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const modal = screen.getByTestId('modal');
|
|
92
|
+
expect(modal.className).toContain('ai-modal-table');
|
|
93
|
+
expect(modal.className).toContain('hash123');
|
|
94
|
+
|
|
95
|
+
fireEvent.click(screen.getByTestId('close-button'));
|
|
96
|
+
expect(onCancel).toHaveBeenCalledTimes(1);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { AiModalTableProps } from '../types';
|
|
3
|
+
export declare const AiModalTable: ({ columns, customActionButtons, data, description, editDataIndexes, filters, isLoading, isSubmitting, onChangeSelectedRows, onEdit, onSubmitAllData, onSubmitSelectedData, rowKey, selectedRows, submitAllLabel, submitSelectedLabel, mapperConfig, tableClassName, ...modalProps }: AiModalTableProps) => React.JSX.Element;
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai-modal-table/index.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,eAAO,MAAM,YAAY,GAAI,qRAoB1B,iBAAiB,sBAoEnB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
import { Flex } from '@akinon/ui-layout';
|
|
13
|
+
import { Modal } from '@akinon/ui-modal';
|
|
14
|
+
import { useToken } from '@akinon/ui-theme';
|
|
15
|
+
import { useStyleRegister } from '@ant-design/cssinjs';
|
|
16
|
+
import { ConfigProvider } from 'antd';
|
|
17
|
+
import classNames from 'classnames';
|
|
18
|
+
import * as React from 'react';
|
|
19
|
+
import { AiTable } from '../ai-table';
|
|
20
|
+
import { DEFAULT_ROW_KEY } from '../ai-table/constants';
|
|
21
|
+
export const AiModalTable = (_a) => {
|
|
22
|
+
var { columns = [], customActionButtons, data = [], description, editDataIndexes, filters = [], isLoading, isSubmitting, onChangeSelectedRows, onEdit, onSubmitAllData, onSubmitSelectedData, rowKey = DEFAULT_ROW_KEY, selectedRows, submitAllLabel, submitSelectedLabel, mapperConfig, tableClassName } = _a, modalProps = __rest(_a, ["columns", "customActionButtons", "data", "description", "editDataIndexes", "filters", "isLoading", "isSubmitting", "onChangeSelectedRows", "onEdit", "onSubmitAllData", "onSubmitSelectedData", "rowKey", "selectedRows", "submitAllLabel", "submitSelectedLabel", "mapperConfig", "tableClassName"]);
|
|
23
|
+
const { onCancel, className } = modalProps, restModalProps = __rest(modalProps, ["onCancel", "className"]);
|
|
24
|
+
const { getPrefixCls, theme } = React.useContext(ConfigProvider.ConfigContext);
|
|
25
|
+
const { token, hashId } = useToken();
|
|
26
|
+
const baseCls = getPrefixCls('ai-modal-table');
|
|
27
|
+
const handleCancel = (e) => {
|
|
28
|
+
if (onCancel)
|
|
29
|
+
onCancel(e);
|
|
30
|
+
};
|
|
31
|
+
const useStyle = useStyleRegister({
|
|
32
|
+
token: token,
|
|
33
|
+
path: ['AiModalTable'],
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
|
+
theme: theme
|
|
36
|
+
}, () => {
|
|
37
|
+
const prefixCls = `:where(.${hashId}).${baseCls}`;
|
|
38
|
+
return {
|
|
39
|
+
[prefixCls]: {
|
|
40
|
+
'.akinon-modal-title': {
|
|
41
|
+
borderBottom: 'none !important'
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
return useStyle(React.createElement(Modal, Object.assign({ className: classNames(baseCls, hashId, className), footer: null, onCancel: handleCancel, centered: true, destroyOnClose: true, width: 1200 }, restModalProps),
|
|
47
|
+
React.createElement(Flex, { gap: 10, vertical: true },
|
|
48
|
+
React.createElement("div", { className: "text-neutral-50 text-sm mb-2" }, description),
|
|
49
|
+
React.createElement(AiTable, { columns: columns, customActionButtons: customActionButtons, data: data, editDataIndexes: editDataIndexes, filters: filters, isLoading: isLoading, isSubmitting: isSubmitting, onChangeSelectedRows: onChangeSelectedRows, onEdit: onEdit, onSubmitAllData: onSubmitAllData, onSubmitSelectedData: onSubmitSelectedData, rowKey: rowKey, selectedRows: selectedRows, submitAllLabel: submitAllLabel, submitSelectedLabel: submitSelectedLabel, mapperConfig: mapperConfig, tableClassName: tableClassName }))));
|
|
50
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../src/ai-table/__tests__/index.test.tsx"],"names":[],"mappings":""}
|