es-grid-template 1.2.0 → 1.2.2

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 (69) hide show
  1. package/assets/index.css +695 -0
  2. package/assets/index.scss +1063 -0
  3. package/es/grid-component/ColumnsChoose.d.ts +1 -0
  4. package/es/grid-component/ColumnsChoose.js +63 -28
  5. package/es/grid-component/ColumnsGroup/ColumnsGroup.d.ts +12 -0
  6. package/es/grid-component/ColumnsGroup/ColumnsGroup.js +223 -0
  7. package/es/grid-component/ColumnsGroup/index.d.ts +1 -0
  8. package/es/grid-component/ColumnsGroup/index.js +1 -0
  9. package/es/grid-component/ConvertColumnTable.d.ts +7 -0
  10. package/es/grid-component/ConvertColumnTable.js +143 -0
  11. package/es/grid-component/EditableCell.js +1 -1
  12. package/es/grid-component/GridStyle.js +1 -1
  13. package/es/grid-component/InternalTable.d.ts +1 -0
  14. package/es/grid-component/InternalTable.js +150 -249
  15. package/es/grid-component/TableGrid.d.ts +4 -1
  16. package/es/grid-component/TableGrid.js +31 -70
  17. package/es/grid-component/hooks/{useColumns → columns}/index.d.ts +2 -2
  18. package/es/grid-component/hooks/{useColumns → columns}/index.js +20 -16
  19. package/es/grid-component/hooks/content/HeaderContent.d.ts +11 -0
  20. package/es/grid-component/hooks/content/HeaderContent.js +79 -0
  21. package/es/grid-component/hooks/content/TooltipContent.d.ts +13 -0
  22. package/es/grid-component/hooks/content/TooltipContent.js +74 -0
  23. package/es/grid-component/hooks/useColumns.d.ts +16 -0
  24. package/es/grid-component/hooks/useColumns.js +280 -0
  25. package/es/grid-component/hooks/utils.d.ts +26 -1
  26. package/es/grid-component/hooks/utils.js +331 -1
  27. package/es/grid-component/index.js +3 -1
  28. package/es/grid-component/styles.scss +365 -68
  29. package/es/grid-component/table/Grid.d.ts +2 -0
  30. package/es/grid-component/table/Grid.js +18 -6
  31. package/es/grid-component/table/GridEdit.d.ts +4 -1
  32. package/es/grid-component/table/GridEdit.js +941 -307
  33. package/es/grid-component/table/Group.d.ts +13 -0
  34. package/es/grid-component/table/Group.js +154 -0
  35. package/es/grid-component/type.d.ts +39 -2
  36. package/lib/grid-component/ColumnsChoose.d.ts +1 -0
  37. package/lib/grid-component/ColumnsChoose.js +62 -27
  38. package/lib/grid-component/ColumnsGroup/ColumnsGroup.d.ts +12 -0
  39. package/lib/grid-component/ColumnsGroup/ColumnsGroup.js +234 -0
  40. package/lib/grid-component/ColumnsGroup/index.d.ts +1 -0
  41. package/lib/grid-component/ColumnsGroup/index.js +16 -0
  42. package/lib/grid-component/ConvertColumnTable.d.ts +7 -0
  43. package/lib/grid-component/ConvertColumnTable.js +152 -0
  44. package/lib/grid-component/EditableCell.js +1 -1
  45. package/lib/grid-component/GridStyle.js +1 -1
  46. package/lib/grid-component/InternalTable.d.ts +1 -0
  47. package/lib/grid-component/InternalTable.js +144 -249
  48. package/lib/grid-component/TableGrid.d.ts +4 -1
  49. package/lib/grid-component/TableGrid.js +26 -68
  50. package/lib/grid-component/hooks/{useColumns → columns}/index.d.ts +2 -2
  51. package/lib/grid-component/hooks/{useColumns → columns}/index.js +20 -16
  52. package/lib/grid-component/hooks/content/HeaderContent.d.ts +11 -0
  53. package/lib/grid-component/hooks/content/HeaderContent.js +86 -0
  54. package/lib/grid-component/hooks/content/TooltipContent.d.ts +13 -0
  55. package/lib/grid-component/hooks/content/TooltipContent.js +81 -0
  56. package/lib/grid-component/hooks/useColumns.d.ts +16 -0
  57. package/lib/grid-component/hooks/useColumns.js +291 -0
  58. package/lib/grid-component/hooks/utils.d.ts +26 -1
  59. package/lib/grid-component/hooks/utils.js +347 -5
  60. package/lib/grid-component/index.js +2 -1
  61. package/lib/grid-component/styles.scss +365 -68
  62. package/lib/grid-component/table/Grid.d.ts +2 -0
  63. package/lib/grid-component/table/Grid.js +18 -6
  64. package/lib/grid-component/table/GridEdit.d.ts +4 -1
  65. package/lib/grid-component/table/GridEdit.js +939 -305
  66. package/lib/grid-component/table/Group.d.ts +13 -0
  67. package/lib/grid-component/table/Group.js +163 -0
  68. package/lib/grid-component/type.d.ts +39 -2
  69. package/package.json +106 -105
@@ -1,24 +1,29 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import React, { useCallback, useEffect, useRef, useState } from 'react';
3
- import { Select, Table } from "rc-master-ui";
4
- import { Button, Space } from "antd";
5
- import { SearchOutlined } from "@ant-design/icons";
2
+ import React from 'react';
6
3
  import { Resizable } from "react-resizable";
4
+ import 'react-resizable/css/styles.css';
7
5
  import customParseFormat from 'dayjs/plugin/customParseFormat';
8
- import { booleanOperator, getTypeFilter, numberOperator, stringOperator, translateOption, updateArrayByKey } from "./hooks";
9
- import { FilterFill } from "becoxy-icons";
10
- import { flatColumns2, renderContent, renderFilter } from "./hooks/useColumns";
6
+ import { addRowIdArray,
7
+ // convertFlatColumn,
8
+ removeColumns,
9
+ // addRowIdArray,
10
+ updateArrayByKey, updateColumnsByGroup, updateData } from "./hooks";
11
11
  import dayjs from "dayjs";
12
12
  import 'dayjs/locale/es';
13
13
  import 'dayjs/locale/vi';
14
- import en from 'rc-master-ui/es/date-picker/locale/en_US';
15
- import vi from 'rc-master-ui/es/date-picker/locale/vi_VN';
16
- import "./styles.scss";
17
14
  import GridEdit from "./table/GridEdit";
18
15
  import Grid from "./table/Grid";
19
- // import useMergedState from "rc-util/lib/hooks/useMergedState";
20
-
16
+ import en from "rc-master-ui/es/date-picker/locale/en_US";
17
+ import vi from "rc-master-ui/es/date-picker/locale/vi_VN";
18
+ import useColumns from "./hooks/useColumns";
19
+ import "./styles.scss";
20
+ import { flatColumns2 } from "./hooks/columns";
21
+ import Group from "./table/Group";
21
22
  dayjs.extend(customParseFormat);
23
+
24
+ // const ASCEND = 'ascend';
25
+ // const DESCEND = 'descend';
26
+
22
27
  const ResizableTitle = props => {
23
28
  const {
24
29
  onResize,
@@ -35,7 +40,7 @@ const ResizableTitle = props => {
35
40
  width: width,
36
41
  height: 0,
37
42
  handle: /*#__PURE__*/React.createElement("span", {
38
- className: "react-resizable-handle",
43
+ className: "rc-resizable-handle",
39
44
  onClick: e => {
40
45
  e.stopPropagation();
41
46
  }
@@ -50,6 +55,7 @@ const ResizableTitle = props => {
50
55
  const InternalTable = props => {
51
56
  const {
52
57
  t,
58
+ // columns,
53
59
  columns: propsColumns,
54
60
  lang,
55
61
  locale,
@@ -58,13 +64,24 @@ const InternalTable = props => {
58
64
  dataSourceFilter: propDataSourceFilter,
59
65
  onFilterClick,
60
66
  editAble,
61
- rowKey,
67
+ rowKey: propRowKey,
62
68
  format,
63
69
  onDataChange,
64
70
  sortMultiple,
65
- expandable,
71
+ // expandable,
72
+ // @ts-ignore
73
+ onCellPaste,
74
+ clickHeaderToSort = true,
75
+ components,
76
+ onChooseColumns,
77
+ groupAble,
78
+ groupSetting,
79
+ groupColumns,
66
80
  ...rest
67
81
  } = props;
82
+ const rowKey = React.useMemo(() => {
83
+ return editAble ? 'rowId' : propRowKey ?? 'id';
84
+ }, [editAble, propRowKey]);
68
85
  const local = lang && lang === 'en' ? en : vi;
69
86
  const buddhistLocale = {
70
87
  ...local,
@@ -72,157 +89,28 @@ const InternalTable = props => {
72
89
  ...local.lang
73
90
  }
74
91
  };
75
-
76
- // const [mergedColumns, setMergedColumns] = useMergedState(
77
- // propsColumns,
78
- // {
79
- // value: propsColumns,
80
- // },
81
- // );
82
-
83
- const tableRef = useRef(null);
84
- const [data, setData] = useState([]);
85
- const [columns, setColumns] = useState([]);
86
- const [isManualUpdate, setIsManualUpdate] = useState(false);
87
- // const [expandKeys, setExpandKeys] = useState<string[]>([]);
88
- const [dataSourceFilter, setDataSourceFilter] = useState(propDataSourceFilter ?? []);
89
- useEffect(() => {
90
- const rs = propsColumns && propsColumns.length > 0 ? [Table.SELECTION_COLUMN, ...propsColumns] : [];
91
- // const rs = propsColumns ? [...propsColumns] : []
92
- setColumns(rs);
92
+ const mergerdData = React.useMemo(() => {
93
+ return addRowIdArray(dataSource);
94
+ }, [dataSource]);
95
+ const [columns, setColumns] = React.useState([]);
96
+ const tableRef = React.useRef(null);
97
+ React.useEffect(() => {
98
+ setColumns(propsColumns);
93
99
  }, [propsColumns]);
94
- useEffect(() => {
95
- if (!isManualUpdate) {
96
- setData(dataSource || []);
97
- }
98
- setIsManualUpdate(false);
99
- }, [dataSource, isManualUpdate]);
100
100
 
101
- // const [columns, setColumns] = useMergedState(
102
- // propsColumns ? [Table.SELECTION_COLUMN, ...propsColumns] : [],
103
- // {
104
- // value: propsColumns ? [Table.SELECTION_COLUMN, ...propsColumns] : [],
105
- // },
106
- // );
101
+ // const [data, setData] = useState<RecordType[]>([]);
107
102
 
108
- // ============================ RowKey ============================
109
- const getRowKey = React.useMemo(() => {
110
- if (typeof rowKey === 'function') {
111
- return rowKey;
112
- }
113
- // @ts-ignore
114
- return record => record?.[rowKey];
115
- }, [rowKey]);
103
+ // const [isManualUpdate, setIsManualUpdate] = useState(false);
116
104
 
117
105
  // useEffect(() => {
118
- // const rrr = findAllChildrenKeys<any>(dataSource, getRowKey, 'children');
119
- // setExpandKeys(rrr as any)
120
- // }, [dataSource, getRowKey])
106
+ // if (!isManualUpdate) {
107
+ // const mergedData = addRowIdArray(dataSource)
108
+ //
109
+ // setData(mergedData || []);
110
+ // }
111
+ // setIsManualUpdate(false);
112
+ // }, [dataSource, isManualUpdate])
121
113
 
122
- const handleSearch = (selectedKeys, confirm) => {
123
- confirm();
124
- };
125
- const onFilterCallback = (key, filterDataCallback) => {
126
- const find = dataSourceFilter.find(it => it.key === key);
127
- if (find) {
128
- const newData = updateArrayByKey(dataSourceFilter, {
129
- key,
130
- data: filterDataCallback
131
- }, 'key');
132
- setDataSourceFilter(newData);
133
- } else {
134
- const newData = [...dataSourceFilter, {
135
- key,
136
- data: filterDataCallback
137
- }];
138
- setDataSourceFilter(newData);
139
- }
140
- };
141
- const getColumnSearchProps = useCallback(column => ({
142
- filterDropdown: ({
143
- setSelectedKeys,
144
- selectedKeys,
145
- confirm,
146
- // close,
147
- setOperatorKey,
148
- operatorKey,
149
- visible,
150
- searchValue,
151
- setSearchValue
152
- }) => {
153
- const type = getTypeFilter(column);
154
- // const operatorOptions = !type || type === 'Text' ? stringOperator : numberOperator
155
- // const operatorOptions = type === 'Checkbox' || type === 'Dropdown' || type === 'DropTree' || ty
156
- const operatorOptions = type === ('Checkbox' || 'Dropdown' || 'DropTree' || 'CheckboxDropdown') ? booleanOperator : !type || type === 'Text' ? stringOperator : numberOperator;
157
- return /*#__PURE__*/React.createElement("div", {
158
- style: {
159
- padding: 8,
160
- minWidth: 275
161
- },
162
- onKeyDown: e => e.stopPropagation()
163
- }, column?.showOperator !== false && column?.typeFilter !== 'DateRange' && column?.typeFilter !== 'NumberRange' && /*#__PURE__*/React.createElement("div", {
164
- className: 'mb-1'
165
- }, /*#__PURE__*/React.createElement(Select, {
166
- options: translateOption(operatorOptions, t),
167
- style: {
168
- width: '100%',
169
- marginBottom: 8
170
- },
171
- value: operatorKey,
172
- onChange: val => {
173
- setOperatorKey(val);
174
- }
175
- })), /*#__PURE__*/React.createElement("div", {
176
- style: {
177
- marginBottom: 8
178
- }
179
- }, renderFilter(column, selectedKeys, setSelectedKeys, confirm, visible, searchValue, setSearchValue, dataSourceFilter, buddhistLocale, locale, t)), /*#__PURE__*/React.createElement(Space, {
180
- style: {
181
- justifyContent: 'end',
182
- width: '100%'
183
- }
184
- }, /*#__PURE__*/React.createElement(Button, {
185
- type: "primary",
186
- onClick: () => {
187
- confirm({
188
- closeDropdown: false
189
- });
190
- handleSearch(selectedKeys, confirm);
191
- },
192
- icon: /*#__PURE__*/React.createElement(SearchOutlined, null),
193
- size: "small",
194
- style: {
195
- width: 90
196
- }
197
- }, t ? t('Filter') : 'Filter'), /*#__PURE__*/React.createElement(Button, {
198
- type: "link",
199
- size: "small",
200
- onClick: () => {
201
- // setSearchValue('')
202
- setSelectedKeys([]);
203
- confirm();
204
- // handleSearch()
205
- // close()
206
- }
207
- }, t ? t("Clear") : 'Clear')));
208
- },
209
- filterIcon: filtered => /*#__PURE__*/React.createElement(FilterFill, {
210
- fontSize: 12,
211
- onClick: () => {
212
- onFilterClick?.(column, onFilterCallback);
213
- },
214
- style: {
215
- color: filtered ? '#283046' : undefined
216
- }
217
- }),
218
- filterDropdownProps: {
219
- onOpenChange(open) {
220
- if (open) {
221
- // setTimeout(() => searchInput.current?.select(), 100)
222
- }
223
- }
224
- }
225
- }), [buddhistLocale, dataSourceFilter, onFilterCallback, onFilterClick, t]);
226
114
  const handleResize = column => (e, {
227
115
  size
228
116
  }) => {
@@ -233,123 +121,136 @@ const InternalTable = props => {
233
121
  const newColumns = updateArrayByKey(columns, newColumn, 'field');
234
122
  setColumns(newColumns);
235
123
  };
236
- const convertColumns = flatColumns2(columns).map((column, colIndex) => {
237
- if (!column?.dataIndex && !column.key && !column.field) {
238
- return column;
239
- }
240
- const transformedColumn = {
241
- ...column,
242
- dataIndex: column.field ?? column.dataIndex,
243
- key: column.field ?? column.dataIndex ?? column.key,
244
- title: t ? t(column.headerText ?? column.title) : column.headerText ?? column.title,
245
- ellipsis: column.ellipsis !== false,
246
- align: column.textAlign ?? column.align,
247
- fixed: column.frozen ? column.frozen.toLowerCase() : column.fixed
248
- };
124
+ const [transformSelectionColumns] = useColumns({
125
+ locale,
126
+ t,
127
+ buddhistLocale,
128
+ dataSourceFilter: propDataSourceFilter,
129
+ format,
130
+ sortMultiple,
131
+ groupAble,
132
+ groupSetting,
133
+ groupColumns,
134
+ handleResize
135
+ });
136
+ const mergedColumns = React.useMemo(() => {
137
+ return transformSelectionColumns(columns);
138
+ }, [columns, transformSelectionColumns]);
249
139
 
250
- // @ts-ignore
251
- if (["index", "#"].includes(transformedColumn.dataIndex)) {
252
- return {
253
- ...transformedColumn,
254
- onCell: () => ({
255
- className: 'cell-number'
256
- }),
257
- render: (_, __, rowIndex) => rowIndex + 1
258
- };
259
- }
260
- if (column.field === 'command') {
261
- return {
262
- ...transformedColumn,
263
- onCell: () => ({
264
- className: column.field === 'command' ? "ui-rc-cell-command" : ''
265
- }),
266
- onHeaderCell: () => ({
267
- width: column.width,
268
- onResize: handleResize(column)
269
- })
270
- };
140
+ // ============================ RowKey ============================
141
+ const getRowKey = React.useMemo(() => {
142
+ if (typeof rowKey === 'function') {
143
+ return rowKey;
271
144
  }
272
- return {
273
- ...(column.allowFiltering === false ? {} : {
274
- ...getColumnSearchProps(column)
275
- }),
276
- ...transformedColumn,
277
- onFilter: value => {
278
- return value;
279
- },
280
- sorter: column.sorter === false ? undefined : {
281
- compare: a => a,
282
- multiple: sortMultiple ? colIndex : undefined
283
- },
284
- onHeaderCell: () => ({
285
- width: column.width,
286
- onResize: handleResize(column)
287
- }),
288
- render: (value, record, rowIndex) => renderContent(column, value, record, rowIndex, format)
289
- };
290
- });
291
- const transformColumns = React.useCallback(cols => {
292
145
  // @ts-ignore
293
- return cols.map(column => {
294
- const find = convertColumns.find(it => it.key === column.field);
295
- if (!column?.field && !column?.key) {
296
- return column;
297
- }
298
- if (find) {
299
- return {
300
- ...find
301
- };
302
- }
146
+ return record => record?.[rowKey];
147
+ }, [rowKey]);
303
148
 
304
- // Xử đệ quy cho children
305
- if (column.children?.length) {
306
- return {
307
- ...column,
308
- key: column.field ?? column.dataIndex ?? column.key,
309
- title: t ? t(column.headerText ?? column.title) : column.headerText ?? column.title,
310
- ellipsis: column.ellipsis !== false,
311
- align: column.textAlign ?? column.align,
312
- children: transformColumns(column.children)
313
- };
314
- }
315
- });
316
- }, [convertColumns]);
317
- const mergedColumns = React.useMemo(() => {
318
- return transformColumns(columns);
319
- }, [transformColumns, columns]);
149
+ // const triggerChangeColumns = (newColumns: ColumnsTable<RecordType>) => {
320
150
  const triggerChangeColumns = newColumns => {
321
151
  setColumns(newColumns);
152
+ onChooseColumns?.({
153
+ showColumns: [],
154
+ columns: [],
155
+ flattenColumns: []
156
+ });
157
+ };
158
+ const triggerGroupColumns = groupedColumns => {
159
+ setColumns(updateColumnsByGroup(mergedColumns, groupedColumns));
160
+ if (groupSetting) {
161
+ if (groupSetting.client === false) {
162
+
163
+ // setIsTree(true)
164
+
165
+ // setGroupOpen([])
166
+
167
+ // const dt = ungroupArray(dataSource)
168
+
169
+ // const rs = groupArrayByColumns2(dt, [...value])
170
+
171
+ // setResource([...rs])
172
+
173
+ // if (groupSetting.onGroup) {
174
+ // groupSetting.onGroup({
175
+ // columnGrouped: value,
176
+ // columns: removeColumns(columns as any, value),
177
+ // flattenColumns: convertFlatColumn(removeColumns(columns as any, value)) as any
178
+ //
179
+ // })
180
+ // }
181
+ } else {
182
+ if (groupSetting.onGroup) {
183
+ groupSetting.onGroup({
184
+ columnGrouped: groupedColumns,
185
+ columns: removeColumns(columns, groupedColumns),
186
+ flattenColumns: flatColumns2(removeColumns(columns, groupedColumns))
187
+ });
188
+ }
189
+ }
190
+ }
322
191
  };
323
192
  const triggerChangeData = newData => {
324
- setIsManualUpdate(true);
325
- setData(newData);
193
+ // setIsManualUpdate(true)
194
+ // setData(newData)
326
195
  // setMergedData(newData)
327
196
  onDataChange?.(newData);
328
197
  };
329
- const TableComponent = editAble ? GridEdit : Grid;
198
+ const triggerPaste = (pastedRows, pastedColumnsArray, newData) => {
199
+ const handlePasteCallback = callbackData => {
200
+ const newDataUpdate = updateData(dataSource, callbackData, rowKey);
201
+ triggerChangeData(newDataUpdate);
202
+ onCellPaste?.dataChange?.(newDataUpdate);
203
+ };
204
+ if (onCellPaste && onCellPaste.onPasted) {
205
+ if (onCellPaste.onPasted.length > 1) {
206
+ onCellPaste.onPasted({
207
+ pasteData: pastedRows,
208
+ type: 'onPaste',
209
+ data: dataSource,
210
+ pastedColumns: pastedColumnsArray
211
+ }, handlePasteCallback);
212
+ } else {
213
+ onCellPaste.onPasted({
214
+ pasteData: pastedRows,
215
+ type: 'onPaste',
216
+ data: dataSource,
217
+ pastedColumns: pastedColumnsArray
218
+ }, handlePasteCallback);
219
+ triggerChangeData(newData);
220
+ onCellPaste.dataChange?.(newData);
221
+ }
222
+ }
223
+ };
224
+ const TableComponent = groupAble ? Group : editAble ? GridEdit : Grid;
330
225
  return /*#__PURE__*/React.createElement(TableComponent, _extends({}, rest, {
331
226
  t: t,
332
227
  locale: locale,
333
228
  tableRef: tableRef,
334
- dataSource: data
335
- // mergedData={mergedData}
229
+ dataSource: mergerdData
230
+ // components={components}
336
231
  ,
337
232
  components: {
338
233
  header: {
339
234
  cell: allowResizing ? ResizableTitle : undefined
340
235
  }
341
236
  },
342
- format: format,
343
- columns: mergedColumns
344
- // defaultColumns={mergedColumns}
237
+ format: format
238
+ // columns={columns}
345
239
  ,
240
+ columns: mergedColumns,
346
241
  showSorterTooltip: {
347
242
  target: 'sorter-icon'
348
243
  },
349
244
  triggerChangeColumns: triggerChangeColumns,
350
245
  triggerChangeData: triggerChangeData,
246
+ triggerGroupColumns: triggerGroupColumns,
351
247
  rowKey: rowKey,
352
- getRowKey: getRowKey
248
+ getRowKey: getRowKey,
249
+ triggerPaste: triggerPaste,
250
+ clickHeaderToSort: clickHeaderToSort,
251
+ groupSetting: groupSetting,
252
+ groupAble: groupAble,
253
+ groupColumns: groupColumns
353
254
  }));
354
255
  };
355
256
  export default InternalTable;
@@ -5,9 +5,12 @@ import type { ColumnsTable, GetRowKey, GridTableProps } from "./type";
5
5
  type GridProps<T> = GridTableProps<T> & {
6
6
  triggerChangeColumns?: (columns: ColumnsTable<T>, type: string) => void;
7
7
  triggerChangeData?: (newData: T[], type: string) => void;
8
+ triggerGroupColumns?: (groupedColumns: string[]) => void;
8
9
  tableRef: any;
9
10
  bottomToolbar?: () => React.ReactElement;
10
- getRowKey?: GetRowKey<T>;
11
+ getRowKey: GetRowKey<T>;
12
+ rowSelection?: any;
13
+ groupToolbar?: () => React.ReactNode;
11
14
  };
12
15
  declare const TableGrid: <RecordType extends object>(props: GridProps<RecordType>) => React.JSX.Element;
13
16
  export default TableGrid;