es-grid-template 0.0.7 → 0.0.13

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 (116) hide show
  1. package/LICENSE +21 -19
  2. package/es/{CheckboxFilter.d.ts → grid-component/CheckboxFilter.d.ts} +1 -1
  3. package/es/{CheckboxFilter.js → grid-component/CheckboxFilter.js} +7 -11
  4. package/es/grid-component/ColumnsChoose.d.ts +9 -0
  5. package/es/{ColumnsChoose.js → grid-component/ColumnsChoose.js} +66 -70
  6. package/es/grid-component/EditableCell.d.ts +19 -0
  7. package/es/grid-component/EditableCell.js +842 -0
  8. package/es/{FilterSearch.js → grid-component/FilterSearch.js} +2 -2
  9. package/es/grid-component/GridStyle.d.ts +4 -0
  10. package/es/grid-component/GridStyle.js +5 -0
  11. package/es/grid-component/InternalTable.d.ts +6 -0
  12. package/es/grid-component/InternalTable.js +283 -0
  13. package/es/grid-component/LoadingSpinner.d.ts +3 -0
  14. package/es/grid-component/LoadingSpinner.js +20 -0
  15. package/es/grid-component/Message/Message.d.ts +2 -0
  16. package/es/grid-component/Message/Message.js +16 -0
  17. package/es/grid-component/Message/index.d.ts +1 -0
  18. package/es/grid-component/Message/index.js +1 -0
  19. package/es/grid-component/TableGrid.d.ts +10 -0
  20. package/es/grid-component/TableGrid.js +375 -0
  21. package/es/grid-component/async-table-select/index.d.ts +9 -0
  22. package/es/grid-component/async-table-select/index.js +37 -0
  23. package/es/{hooks → grid-component/hooks}/constant.d.ts +14 -0
  24. package/es/{hooks → grid-component/hooks}/constant.js +17 -2
  25. package/es/grid-component/hooks/useColumns/index.d.ts +6 -0
  26. package/es/grid-component/hooks/useColumns/index.js +422 -0
  27. package/es/grid-component/hooks/utils.d.ts +35 -0
  28. package/es/{hooks → grid-component/hooks}/utils.js +147 -19
  29. package/es/grid-component/index.d.ts +2 -0
  30. package/es/grid-component/index.js +2 -0
  31. package/es/grid-component/rc-table/Grid.d.ts +8 -0
  32. package/es/grid-component/rc-table/Grid.js +99 -0
  33. package/es/grid-component/rc-table/GridEdit.d.ts +9 -0
  34. package/es/grid-component/rc-table/GridEdit.js +706 -0
  35. package/es/grid-component/type.d.ts +225 -0
  36. package/es/grid-component/useContext.d.ts +27 -0
  37. package/es/grid-component/useContext.js +4 -0
  38. package/es/index.d.ts +1 -2
  39. package/es/index.js +2 -2
  40. package/es/table-grid/styles.scss +551 -0
  41. package/lib/{CheckboxFilter.d.ts → grid-component/CheckboxFilter.d.ts} +1 -1
  42. package/lib/{CheckboxFilter.js → grid-component/CheckboxFilter.js} +11 -14
  43. package/lib/grid-component/ColumnsChoose.d.ts +9 -0
  44. package/lib/{ColumnsChoose.js → grid-component/ColumnsChoose.js} +66 -70
  45. package/lib/grid-component/EditableCell.d.ts +19 -0
  46. package/lib/grid-component/EditableCell.js +844 -0
  47. package/lib/{FilterSearch.js → grid-component/FilterSearch.js} +3 -3
  48. package/lib/grid-component/GridStyle.d.ts +4 -0
  49. package/lib/grid-component/GridStyle.js +12 -0
  50. package/lib/grid-component/InternalTable.d.ts +6 -0
  51. package/lib/grid-component/InternalTable.js +292 -0
  52. package/lib/grid-component/LoadingSpinner.d.ts +3 -0
  53. package/lib/grid-component/LoadingSpinner.js +29 -0
  54. package/lib/grid-component/Message/Message.d.ts +2 -0
  55. package/lib/grid-component/Message/Message.js +25 -0
  56. package/lib/grid-component/Message/index.d.ts +1 -0
  57. package/lib/grid-component/Message/index.js +16 -0
  58. package/lib/grid-component/TableGrid.d.ts +10 -0
  59. package/lib/grid-component/TableGrid.js +382 -0
  60. package/lib/grid-component/async-table-select/index.d.ts +9 -0
  61. package/lib/grid-component/async-table-select/index.js +46 -0
  62. package/lib/{hooks → grid-component/hooks}/constant.d.ts +14 -0
  63. package/lib/{hooks → grid-component/hooks}/constant.js +18 -3
  64. package/lib/grid-component/hooks/useColumns/index.d.ts +6 -0
  65. package/lib/grid-component/hooks/useColumns/index.js +435 -0
  66. package/lib/grid-component/hooks/utils.d.ts +35 -0
  67. package/lib/{hooks → grid-component/hooks}/utils.js +164 -22
  68. package/lib/grid-component/index.d.ts +2 -0
  69. package/lib/grid-component/index.js +9 -0
  70. package/lib/grid-component/rc-table/Grid.d.ts +8 -0
  71. package/lib/grid-component/rc-table/Grid.js +108 -0
  72. package/lib/grid-component/rc-table/GridEdit.d.ts +9 -0
  73. package/lib/grid-component/rc-table/GridEdit.js +715 -0
  74. package/lib/grid-component/type.d.ts +225 -0
  75. package/lib/grid-component/useContext.d.ts +27 -0
  76. package/lib/grid-component/useContext.js +10 -0
  77. package/lib/index.d.ts +1 -2
  78. package/lib/index.js +7 -3
  79. package/lib/table-grid/styles.scss +551 -0
  80. package/package.json +17 -6
  81. package/es/ColumnsChoose.d.ts +0 -10
  82. package/es/GridTable.d.ts +0 -7
  83. package/es/GridTable.js +0 -927
  84. package/es/hooks/useColumns/index.d.ts +0 -2
  85. package/es/hooks/useColumns/index.js +0 -25
  86. package/es/hooks/utils.d.ts +0 -18
  87. package/es/styles.scss +0 -30
  88. package/es/type.d.ts +0 -88
  89. package/lib/ColumnsChoose.d.ts +0 -10
  90. package/lib/GridTable.d.ts +0 -7
  91. package/lib/GridTable.js +0 -936
  92. package/lib/hooks/useColumns/index.d.ts +0 -2
  93. package/lib/hooks/useColumns/index.js +0 -31
  94. package/lib/hooks/utils.d.ts +0 -18
  95. package/lib/styles.scss +0 -30
  96. package/lib/type.d.ts +0 -88
  97. /package/es/{ContextMenu.d.ts → grid-component/ContextMenu.d.ts} +0 -0
  98. /package/es/{ContextMenu.js → grid-component/ContextMenu.js} +0 -0
  99. /package/es/{FilterSearch.d.ts → grid-component/FilterSearch.d.ts} +0 -0
  100. /package/es/{hooks → grid-component/hooks}/index.d.ts +0 -0
  101. /package/es/{hooks → grid-component/hooks}/index.js +0 -0
  102. /package/es/{hooks → grid-component/hooks}/useIsOverflow.d.ts +0 -0
  103. /package/es/{hooks → grid-component/hooks}/useIsOverflow.js +0 -0
  104. /package/es/{hooks → grid-component/hooks}/useOnClickOutside.d.ts +0 -0
  105. /package/es/{hooks → grid-component/hooks}/useOnClickOutside.js +0 -0
  106. /package/es/{type.js → grid-component/type.js} +0 -0
  107. /package/lib/{ContextMenu.d.ts → grid-component/ContextMenu.d.ts} +0 -0
  108. /package/lib/{ContextMenu.js → grid-component/ContextMenu.js} +0 -0
  109. /package/lib/{FilterSearch.d.ts → grid-component/FilterSearch.d.ts} +0 -0
  110. /package/lib/{hooks → grid-component/hooks}/index.d.ts +0 -0
  111. /package/lib/{hooks → grid-component/hooks}/index.js +0 -0
  112. /package/lib/{hooks → grid-component/hooks}/useIsOverflow.d.ts +0 -0
  113. /package/lib/{hooks → grid-component/hooks}/useIsOverflow.js +0 -0
  114. /package/lib/{hooks → grid-component/hooks}/useOnClickOutside.d.ts +0 -0
  115. /package/lib/{hooks → grid-component/hooks}/useOnClickOutside.js +0 -0
  116. /package/lib/{type.js → grid-component/type.js} +0 -0
package/lib/GridTable.js DELETED
@@ -1,936 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = void 0;
8
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
- var _react = _interopRequireWildcard(require("react"));
10
- var _uiRc = require("ui-rc");
11
- var _reactResizable = require("react-resizable");
12
- var _antdStyle = require("antd-style");
13
- var _reactNumericComponent = require("react-numeric-component");
14
- var _icons = require("@ant-design/icons");
15
- var _dayjs = _interopRequireDefault(require("dayjs"));
16
- require("dayjs/locale/es");
17
- require("dayjs/locale/vi");
18
- require("./styles.scss");
19
- var _moment = _interopRequireDefault(require("moment"));
20
- var _CheckboxFilter = _interopRequireDefault(require("./CheckboxFilter"));
21
- var _ContextMenu = _interopRequireDefault(require("./ContextMenu"));
22
- var _ColumnsChoose = require("./ColumnsChoose");
23
- var _classnames = _interopRequireDefault(require("classnames"));
24
- var _hooks = require("./hooks");
25
- var _antd = require("antd");
26
- var _useColumns = require("./hooks/useColumns");
27
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
28
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
29
- // import {Button, DatePicker, Input, Space} from "antd"
30
-
31
- // import {flatColumns} from "../../hooks/useColumns";
32
- // import {
33
- // checkDecimalSeparator,
34
- // checkThousandSeparator,
35
- // convertDateToDayjs,
36
- // convertDayjsToDate,
37
- // getTypeFilter,
38
- // getDatepickerFormat,
39
- // isColor,
40
- // isEmpty,
41
- // numberOperator,
42
- // sumDataByField,
43
- // translateOption
44
- // } from "../hooks";
45
-
46
- // import type {ColumnsType, ColumnType, GridTableProps} from "../../type";
47
-
48
- // import en from 'antd/es/date-picker/locale/en_US'
49
-
50
- // import vi from 'antd/es/date-picker/locale/vi_VN'
51
-
52
- // import type {PickerLocale} from "antd/es/date-picker/generatePicker";
53
-
54
- // import type {PickerLocale} from "ui-rc/dist/date-picker/generatePicker";
55
-
56
- const {
57
- RangePicker
58
- } = _uiRc.DatePicker;
59
- const convertFilters = filters => {
60
- const result = [];
61
- filters.forEach(({
62
- key,
63
- column,
64
- filteredKeys,
65
- operator
66
- }) => {
67
- if (!filteredKeys || filteredKeys.length === 0) return;
68
- if (column.typeFilter === "DateRange" && filteredKeys.length === 2) {
69
- result.push({
70
- key,
71
- field: column.dataIndex,
72
- value: filteredKeys[0],
73
- predicate: "and",
74
- operator: "greaterthanorequal"
75
- }, {
76
- key,
77
- field: column.dataIndex,
78
- value: filteredKeys[1],
79
- predicate: "and",
80
- operator: "lessthanorequal"
81
- });
82
- } else if (column.typeFilter === 'Checkbox') {
83
- filteredKeys.forEach(value => {
84
- result.push({
85
- key,
86
- field: column.dataIndex,
87
- value,
88
- predicate: "or",
89
- operator
90
- });
91
- });
92
- } else {
93
- result.push({
94
- key,
95
- field: column.dataIndex,
96
- value: filteredKeys[0],
97
- predicate: 'and',
98
- operator
99
- });
100
- }
101
- });
102
- return result;
103
- };
104
- const ResizableTitle = props => {
105
- const {
106
- onResize,
107
- width,
108
- ...restProps
109
- } = props;
110
- if (!width) {
111
- return /*#__PURE__*/_react.default.createElement("th", restProps);
112
- }
113
- return (
114
- /*#__PURE__*/
115
- // @ts-ignore
116
- _react.default.createElement(_reactResizable.Resizable, {
117
- width: width,
118
- height: 0,
119
- handle: /*#__PURE__*/_react.default.createElement("span", {
120
- className: "react-resizable-handle",
121
- onClick: e => {
122
- e.stopPropagation();
123
- }
124
- }),
125
- onResize: onResize,
126
- draggableOpts: {
127
- enableUserSelectHack: false
128
- }
129
- }, /*#__PURE__*/_react.default.createElement("th", restProps))
130
- );
131
- };
132
- const useStyle = (0, _antdStyle.createStyles)(({
133
- css
134
- }) => {
135
- // const { antCls } = token
136
- const antCls = 'ui-rc';
137
- return {
138
- customTable: css`
139
- ${antCls}-table {
140
- ${antCls}-table-container {
141
- ${antCls}-table-body,
142
- ${antCls}-table-content {
143
- scrollbar-width: thin;
144
- scrollbar-color: #eaeaea transparent;
145
- scrollbar-gutter: stable;
146
- }
147
- }
148
- }
149
- `
150
- };
151
- });
152
- const GridTable = props => {
153
- const {
154
- columns: defaultColumns,
155
- dataSource,
156
- format,
157
- virtual = true,
158
- t,
159
- lang,
160
- contextMenuOpen,
161
- contextMenuItems: propContextMenuItems,
162
- contextMenuHidden,
163
- contextMenuClick,
164
- recordDoubleClick,
165
- toolbarItems,
166
- showColumnChoose,
167
- onFilter,
168
- selectionSettings,
169
- rowSelection,
170
- rowSelected,
171
- rowKey = 'id',
172
- ...rest
173
- } = props;
174
- const {
175
- styles
176
- } = useStyle();
177
-
178
- // const locale = lang && lang === 'en' ? en : vi
179
-
180
- // const buddhistLocale: PickerLocale = {
181
- // ...locale,
182
- // lang: {
183
- // ...locale.lang
184
- //
185
- // }
186
- // }
187
-
188
- // console.log('buddhistLocale', buddhistLocale)
189
- const clickRef = (0, _react.useRef)(null);
190
- const searchInput = (0, _react.useRef)(null);
191
- const menuRef = (0, _react.useRef)(null);
192
- const viewportWidth = window.innerWidth;
193
- const viewportHeight = window.innerHeight;
194
- const defaultSelected = (0, _react.useMemo)(() => {
195
- return selectionSettings?.defaultSelectedRowKeys ?? [];
196
- }, [selectionSettings?.defaultSelectedRowKeys]);
197
- const [menuVisible, setMenuVisible] = _react.default.useState(false);
198
- const [selectedRowData, setSelectedRowData] = _react.default.useState(null);
199
- const [position, setPosition] = _react.default.useState({
200
- x: 0,
201
- y: 0,
202
- viewportWidth,
203
- viewportHeight
204
- });
205
- // const [filters, setFilters] = React.useState<any[]>([])
206
-
207
- const [selectedRowKeys, setSelectedRowKeys] = (0, _react.useState)(defaultSelected);
208
- const contextMenuItems = _react.default.useMemo(() => {
209
- if (typeof contextMenuHidden === "function" && propContextMenuItems && selectedRowData) {
210
- const hiddenItems = contextMenuHidden({
211
- rowInfo: {
212
- rowData: selectedRowData
213
- }
214
- });
215
- return propContextMenuItems.filter(item => !hiddenItems.includes(item?.key));
216
- }
217
- if (contextMenuHidden && typeof contextMenuHidden !== 'function' && propContextMenuItems) {
218
- return propContextMenuItems.filter(item => !contextMenuHidden.includes(item?.key));
219
- }
220
- return propContextMenuItems;
221
- }, [propContextMenuItems, contextMenuHidden, selectedRowData]);
222
- (0, _react.useLayoutEffect)(() => {
223
- setMenuVisible(false);
224
- }, []);
225
- const handleSearch = (selectedKeys, confirm
226
- // dataIndex: any
227
- ) => {
228
- confirm();
229
- };
230
- const renderFilter = (column, selectedKeys, setSelectedKeys, confirm, visible, searchValue, setSearchValue) => {
231
- const type = (0, _hooks.getTypeFilter)(column);
232
- const dateFormat = (0, _hooks.getDatepickerFormat)(column.type, column) ?? 'DD/MM/YYYY';
233
- const dateRangeFormat = (0, _hooks.getDatepickerFormat)(column.type, column) ?? 'DD/MM/YYYY';
234
- switch (type) {
235
- case 'Number':
236
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
237
- className: 'mb-1'
238
- }, /*#__PURE__*/_react.default.createElement(_reactNumericComponent.NumericFormat, {
239
- value: selectedKeys[0]
240
- // thousandSeparator={checkThousandSeparator(thousandSeparator, decimalSeparator)}
241
- // decimalSeparator={checkDecimalSeparator(thousandSeparator, decimalSeparator)}
242
- // allowNegative={col.format && col.format.allowNegative === true}
243
- ,
244
- allowNegative: true,
245
- customInput: _uiRc.Input,
246
- className: ' rounded-0 input-element form-control',
247
- onValueChange: values => {
248
- // onChangeValueFilter(type, values.floatValue)
249
- setSelectedKeys(values.floatValue || values.floatValue === 0 ? [values.floatValue] : []);
250
- }
251
- }))));
252
- case 'NumberRange':
253
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
254
- className: 'mb-1 d-flex flex-column gap-1'
255
- }, /*#__PURE__*/_react.default.createElement("div", {
256
- style: {
257
- marginBottom: 8
258
- }
259
- }, /*#__PURE__*/_react.default.createElement(_reactNumericComponent.NumericFormat, {
260
- value: selectedKeys[0]
261
- // thousandSeparator={checkThousandSeparator(thousandSeparator, decimalSeparator)}
262
- // decimalSeparator={checkDecimalSeparator(thousandSeparator, decimalSeparator)}
263
- ,
264
- allowNegative: true,
265
- customInput: _uiRc.Input,
266
- className: ' rounded-0 input-element form-control'
267
- // onValueChange={(values: any) => {
268
- // onChangeValueFilter(type, values.floatValue, 'min')
269
- // }}
270
- ,
271
- placeholder: 'Min',
272
- autoFocus: true
273
- })), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactNumericComponent.NumericFormat, {
274
- value: selectedKeys[1]
275
- // thousandSeparator={checkThousandSeparator(thousandSeparator, decimalSeparator)}
276
- // decimalSeparator={checkDecimalSeparator(thousandSeparator, decimalSeparator)}
277
- ,
278
- allowNegative: true,
279
- customInput: _uiRc.Input,
280
- className: ' rounded-0 input-element form-control',
281
- onValueChange: () => {
282
- // onChangeValueFilter(type, values.floatValue, 'max')
283
- },
284
- placeholder: 'Max'
285
- })))));
286
- case 'Date':
287
- const dateValue = selectedKeys[0] ? (0, _hooks.convertDateToDayjs)(new Date(selectedKeys[0]), dateFormat) : null;
288
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
289
- className: 'mb-1'
290
- }, /*#__PURE__*/_react.default.createElement(_uiRc.DatePicker, {
291
- format: {
292
- format: dateFormat,
293
- type: 'mask'
294
- }
295
- // locale={buddhistLocale}
296
- ,
297
- style: {
298
- width: '100%',
299
- height: '100%'
300
- },
301
- value: dateValue,
302
- defaultValue: dateValue,
303
- placeholder: column.placeholder,
304
- onChange: (valueDate, dateString) => {
305
- const newDateValue = dateString ? (0, _moment.default)((0, _hooks.convertDayjsToDate)(dateString, dateFormat)).format() : null;
306
- setSelectedKeys(newDateValue ? [newDateValue] : []);
307
- }
308
- }))));
309
- case 'DateRange':
310
- const dateRangeValue = [selectedKeys[0] ? (0, _hooks.convertDateToDayjs)(new Date(selectedKeys[0]), dateRangeFormat) : '', selectedKeys[1] ? (0, _hooks.convertDateToDayjs)(new Date(selectedKeys[1]), dateRangeFormat) : ''];
311
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
312
- className: 'mb-1'
313
- }, /*#__PURE__*/_react.default.createElement(RangePicker, {
314
- format: {
315
- format: dateRangeFormat,
316
- type: 'mask'
317
- }
318
- // defaultValue={dateRangeValue}
319
- ,
320
- value: dateRangeValue,
321
- placeholder: ['Ngày bắt đầu', 'Ngày kết thúc'],
322
- popupStyle: {
323
- zIndex: 9999
324
- },
325
- onChange: (value, dateString) => {
326
- const newDateRangeValue = dateString[0] ? [dateString[0] ? (0, _moment.default)((0, _hooks.convertDayjsToDate)(dateString[0], dateRangeFormat)).format() : '', dateString[1] ? (0, _moment.default)((0, _hooks.convertDayjsToDate)(dateString[1], dateRangeFormat)).format() : ''] : '';
327
-
328
- // setSelectedKeys(newDateValue ? [newDateValue] : [])
329
- setSelectedKeys(newDateRangeValue);
330
- },
331
- style: {
332
- width: '100%'
333
- }
334
- // popupClassName={'adv-popup-container'}
335
- // getPopupContainer={() => menuRef.current}
336
- }))));
337
- case 'Dropdown':
338
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
339
- className: 'mb-1'
340
- }, /*#__PURE__*/_react.default.createElement(_uiRc.Select, {
341
- options: (0, _hooks.translateOption)(_hooks.numberOperator, t),
342
- style: {
343
- width: '100%',
344
- marginBottom: 8
345
- },
346
- value: selectedKeys[0],
347
- onChange: val => {
348
- // setOperatorKey(val)
349
- setSelectedKeys(val ? [val] : []);
350
- },
351
- showSearch: true,
352
- allowClear: true
353
- }))));
354
-
355
- // case 'DropTree':
356
- // return (
357
- // <Fragment>
358
- // <div>
359
- // {col.filterOption && col.filterOption.showOperator === false ? (
360
- // ''
361
- // ) : (
362
- // <div className={'mb-1'}>
363
- // <Select
364
- // options={translateOption(numberOperator, t)}
365
- // // options={t ? numberOperator.map((it: any) => ({...it, label: t(it.label)})) : numberOperator}
366
- //
367
- // classNamePrefix='select'
368
- // className={`react-select`}
369
- // value={translateOption(numberOperator, t).find(
370
- // ope => ope.value === (operator ? operator : getDefaultOperator(col))
371
- // )}
372
- // onChange={(val: any) => {
373
- // setCurrentFilter((prevState: any) => ({ ...prevState, operator: val.value }))
374
- // }}
375
- // />
376
- // </div>
377
- // )}
378
- //
379
- // <div className={'mb-1'}>
380
- // <Input
381
- // placeholder={'Nhập giá trị'}
382
- // value={value}
383
- // onChange={(val: any) => {
384
- // onChangeValueFilter(type, val.value)
385
- // }}
386
- // />
387
- // </div>
388
- //
389
- // <div className={'d-flex justify-content-end'}>
390
- // <Button color='flat-primary' className={'me-1 be-button'} onClick={(e: any) => handleOnFilter(e)}>
391
- // {t ? t('Filter') : 'Filter'}
392
- // </Button>
393
- // <Button color='flat-secondary' className={'be-button'} onClick={(e: any) => handleClearFilter(e)}>
394
- // {t ? t('Delete') : 'Delete'}
395
- // </Button>
396
- // </div>
397
- // </div>
398
- // </Fragment>
399
- // )
400
- //
401
- case 'Checkbox':
402
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
403
- className: 'mb-1'
404
- }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_CheckboxFilter.default
405
- // column={column}
406
- , {
407
- locale: {
408
- filterTitle: 'Chọn tất cả',
409
- filterCheckall: 'Chọn tất cả'
410
- },
411
- selectedKeys: selectedKeys,
412
- onSelect: setSelectedKeys,
413
- options: [{
414
- text: 'Joe',
415
- value: 'Joe'
416
- }, {
417
- text: 'Jim',
418
- value: 'Jim'
419
- }, {
420
- text: 'Green',
421
- value: 'Green'
422
- }, {
423
- text: 'Black',
424
- value: 'Black'
425
- }, {
426
- text: 'Category 1',
427
- value: 'Category 1'
428
- }, {
429
- text: 'Yellow',
430
- value: 'Yellow'
431
- }, {
432
- text: 'Pink',
433
- value: 'Pink'
434
- }, {
435
- text: 'Category 2',
436
- value: 'Category 666'
437
- }, {
438
- text: 'Category 2',
439
- value: 'Category 555'
440
- }, {
441
- text: 'Category 2',
442
- value: 'Category 55'
443
- }, {
444
- text: 'Category 2',
445
- value: 'Category 44'
446
- }, {
447
- text: 'Category 2',
448
- value: 'Category 33'
449
- }, {
450
- text: 'Category 2',
451
- value: 'Category 22'
452
- }, {
453
- text: 'Category 2',
454
- value: 'Category 11'
455
- }
456
- // {
457
- // text: 'Submenu',
458
- // value: 'Submenu',
459
- // children: [
460
- // {
461
- // text: 'Green',
462
- // value: 'Green',
463
- // },
464
- // {
465
- // text: 'Black',
466
- // value: 'Black',
467
- // },
468
- // ],
469
- // },
470
- ],
471
- filterMultiple: true,
472
- open: visible,
473
- searchValue: searchValue,
474
- setSearchValue: setSearchValue
475
- })))));
476
- case 'Text':
477
- default:
478
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
479
- className: 'mb-1'
480
- }, /*#__PURE__*/_react.default.createElement(_uiRc.Input, {
481
- ref: searchInput,
482
- placeholder: `Search ${column.key}`,
483
- value: selectedKeys[0],
484
- onChange: e => setSelectedKeys(e.target.value ? [e.target.value] : []),
485
- onPressEnter: () => handleSearch(selectedKeys, confirm),
486
- allowClear: true
487
- }))));
488
- }
489
- };
490
- const getColumnSearchProps = column => ({
491
- filterDropdown: ({
492
- setSelectedKeys,
493
- selectedKeys,
494
- confirm,
495
- // clearFilters,
496
- close,
497
- setOperatorKey,
498
- operatorKey,
499
- visible,
500
- searchValue,
501
- setSearchValue
502
- }) => {
503
- // const typeFilter = getTypeFilter(columns as RcColumnType)
504
- return /*#__PURE__*/_react.default.createElement("div", {
505
- style: {
506
- padding: 8,
507
- minWidth: 275
508
- },
509
- onKeyDown: e => e.stopPropagation()
510
- }, (column.showOperator !== false || column.typeFilter !== 'DateRange' && column.typeFilter !== 'NumberRange') && /*#__PURE__*/_react.default.createElement("div", {
511
- className: 'mb-1'
512
- }, /*#__PURE__*/_react.default.createElement(_uiRc.Select, {
513
- options: (0, _hooks.translateOption)(_hooks.numberOperator, t),
514
- style: {
515
- width: '100%',
516
- marginBottom: 8
517
- },
518
- value: operatorKey,
519
- onChange: val => {
520
- setOperatorKey(val);
521
- }
522
- })), /*#__PURE__*/_react.default.createElement("div", {
523
- style: {
524
- marginBottom: 8
525
- }
526
- }, renderFilter(column, selectedKeys, setSelectedKeys, confirm, visible, searchValue, setSearchValue)), /*#__PURE__*/_react.default.createElement("div", {
527
- style: {
528
- justifyContent: 'end',
529
- width: '100%'
530
- }
531
- }, /*#__PURE__*/_react.default.createElement(_antd.Button, {
532
- type: "primary",
533
- onClick: () => {
534
- confirm({
535
- closeDropdown: false
536
- });
537
- handleSearch(selectedKeys, confirm);
538
- },
539
- icon: /*#__PURE__*/_react.default.createElement(_icons.SearchOutlined, null),
540
- size: "small",
541
- style: {
542
- width: 90
543
- }
544
- }, "Filter"), /*#__PURE__*/_react.default.createElement(_antd.Button, {
545
- type: "link",
546
- size: "small",
547
- onClick: () => {
548
- close();
549
- }
550
- }, "close")));
551
- },
552
- // filterIcon: (filtered: boolean) => (
553
- // <SearchOutlined style={{ color: filtered ? '#1677ff' : undefined }} />
554
- // ),
555
-
556
- onFilter: (value, record) => {
557
- // @ts-ignore
558
- return record[column.dataIndex];
559
- },
560
- filterDropdownProps: {
561
- onOpenChange(open) {
562
- if (open) {
563
- setTimeout(() => searchInput.current?.select(), 100);
564
- }
565
- }
566
-
567
- // trigger: ['hover']
568
- }
569
- });
570
- const renderContent = column => value => {
571
- switch (column?.type) {
572
- case 'number':
573
- const thousandSeparator = column.format?.thousandSeparator ? column.format?.thousandSeparator : format?.thousandSeparator;
574
- const decimalSeparator = column.format?.decimalSeparator ? column.format?.decimalSeparator : format?.decimalSeparator;
575
- const dec = column.format?.decimalScale || column.format?.decimalScale === 0 ? column.format?.decimalScale : format?.decimalScale;
576
- const content = !(0, _hooks.isEmpty)(value) ? dec || dec === 0 ? parseFloat(Number(value).toFixed(dec)).toString() : value.toString() : '0';
577
- const numericFormatProps = {
578
- thousandSeparator: (0, _hooks.checkThousandSeparator)(thousandSeparator, decimalSeparator),
579
- decimalSeparator: (0, _hooks.checkDecimalSeparator)(thousandSeparator, decimalSeparator),
580
- allowNegative: (column.format?.allowNegative ? column.format?.allowNegative : format?.allowNegative) ?? true,
581
- prefix: column.format?.prefix ? column.format?.prefix : format?.prefix,
582
- suffix: column.format?.suffix ? column.format?.suffix : format?.suffix,
583
- decimalScale: column.format?.decimalScale || column.format?.decimalScale === 0 ? column.format?.decimalScale : format?.decimalScale,
584
- fixedDecimalScale: (column.format?.fixedDecimalScale ? column.format?.fixedDecimalScale : format?.fixedDecimalScale) ?? false
585
- };
586
- return !(0, _hooks.isEmpty)(content) ? (0, _reactNumericComponent.numericFormatter)(content, numericFormatProps) : '';
587
- case 'date':
588
- return value ? (0, _dayjs.default)(value).format(column.format?.dateFormat ?? format?.dateFormat ?? 'DD/MM/YYYY') : '';
589
- case 'time':
590
- return value ? value : '';
591
- case 'year':
592
- const year = value ? (0, _moment.default)(value).format('yyyy') : '';
593
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, year);
594
- case 'datetime':
595
- return value ? (0, _moment.default)(value).format(column.format?.datetimeFormat ?? format?.datetimeFormat ?? 'DD/MM/YYYY HH:mm') : '';
596
- case 'boolean':
597
- return value ? 'true' : 'false';
598
- case 'color':
599
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, (0, _hooks.isColor)(value) ? /*#__PURE__*/_react.default.createElement("div", {
600
- className: 'w-100 h-100',
601
- style: {
602
- backgroundColor: value,
603
- border: '1px solid #f0f0f0'
604
- }
605
- }) : '');
606
- case 'checkbox':
607
- return /*#__PURE__*/_react.default.createElement(_uiRc.Input, {
608
- checked: !!content,
609
- readOnly: true,
610
- type: "checkbox"
611
- });
612
- case 'file':
613
- const nameFile = typeof value === 'object' && !Array.isArray(value) ? value.name : Array.isArray(value) ? value.map(it => typeof it === 'object' ? it.name : it).filter(Boolean).join(", ") : '';
614
- return value ? nameFile : '';
615
- default:
616
- if (Array.isArray(value)) {
617
- return value.join(', ');
618
- }
619
- return value;
620
- }
621
- };
622
- const addIsFilter = columns => {
623
- return columns.map(column => {
624
- // @ts-ignore
625
- if (!column?.dataIndex && !column.key) {
626
- return column;
627
- }
628
- // @ts-ignore
629
- if (column?.children && column.children.length > 0) {
630
- return {
631
- ...column,
632
- // @ts-ignore
633
- children: addIsFilter(column.children) // Xử lý đệ quy cho cấp con
634
- };
635
- }
636
- // @ts-ignore
637
- if (column?.dataIndex === 'index' || column.allowFiltering === false) {
638
- return {
639
- ...column
640
- };
641
- }
642
- return {
643
- ...getColumnSearchProps(column),
644
- render: renderContent(column),
645
- ...column
646
- };
647
- });
648
- };
649
- const tmpColumns = (0, _react.useMemo)(() => {
650
- // return addIsFilter(defaultColumns ?? [])
651
- return addIsFilter(defaultColumns ? [_uiRc.Table.SELECTION_COLUMN, ...defaultColumns] : []);
652
- }, [defaultColumns]);
653
- const [columns, setColumns] = (0, _react.useState)(tmpColumns ?? []);
654
- const handleResize = indexPath => (e, {
655
- size
656
- }) => {
657
- const updateColumns = (cols, path) => {
658
- const [currentIndex, ...restPath] = path;
659
- return cols.map((col, idx) => {
660
- if (idx === currentIndex) {
661
- if (restPath.length === 0) {
662
- // Cập nhật width của cột cuối cùng trong path
663
- // return { ...col, width: size.width }
664
-
665
- // Kiểm tra minWidth trước khi cập nhật width
666
- if (col.minWidth && size.width < col.minWidth) {
667
- e.preventDefault();
668
- return col; // Không cập nhật nếu nhỏ hơn minWidth
669
- }
670
-
671
- // Kiểm tra minWidth trước khi cập nhật width
672
- if (col.maxWidth && size.width > col.maxWidth) {
673
- e.preventDefault();
674
- return col; // Không cập nhật nếu nhỏ hơn minWidth
675
- }
676
- return {
677
- ...col,
678
- width: size.width
679
- };
680
- } else if (col.children) {
681
- // Tiếp tục cập nhật các cấp con
682
- return {
683
- ...col,
684
- children: updateColumns(col.children, restPath)
685
- };
686
- }
687
- }
688
- // e.preventDefault()
689
- return col;
690
- });
691
- };
692
- setColumns(prevColumns => updateColumns(prevColumns, indexPath));
693
- };
694
- const addResizeHandlers = (cols, parentPath = []) => {
695
- return cols.map((col, index) => {
696
- const currentPath = [...parentPath, index];
697
- if (!col?.dataIndex && !col.key) {
698
- return col;
699
- }
700
- if (col.children) {
701
- return {
702
- ...col,
703
- ellipsis: col.ellipsis !== true,
704
- children: addResizeHandlers(col.children, currentPath)
705
- };
706
- }
707
- return {
708
- ...col,
709
- ellipsis: col.ellipsis !== true,
710
- onHeaderCell: () => ({
711
- width: col.width,
712
- onResize: handleResize(currentPath)
713
- })
714
- };
715
- });
716
- };
717
-
718
- // const resizableColumns = createResizableColumns(columns)
719
-
720
- // const resizableColumns = addResizeHandlers(columns)
721
- const resizableColumns = (0, _react.useMemo)(() => {
722
- return addResizeHandlers(columns);
723
- }, [columns]);
724
-
725
- // const handleReset = (clearFilters: () => void) => {
726
- // clearFilters()
727
- // }
728
-
729
- // const handleChangeOperator = (val: IFilterOperator) => {
730
- // setOperator(val)
731
- // }
732
-
733
- const onContextMenu = data => event => {
734
- event.preventDefault(); // Ngăn chặn menu mặc định của trình duyệt
735
-
736
- setSelectedRowData(data);
737
- contextMenuOpen?.({
738
- rowInfo: {
739
- rowData: data
740
- },
741
- event
742
- });
743
- setMenuVisible(true);
744
-
745
- // Đợi DOM cập nhật và lấy kích thước menu
746
- setTimeout(() => {
747
- const menuElement = menuRef.current; // Lấy menu từ DOM
748
- const menuWidth = menuElement?.offsetWidth || 200; // Mặc định 200px nếu chưa render
749
- const menuHeight = menuElement?.offsetHeight; // Mặc định 450px nếu chưa render
750
-
751
- // Điều chỉnh vị trí menu
752
- let x = event.clientX;
753
- let y = event.clientY;
754
- if (x + menuWidth > viewportWidth) {
755
- x = x - menuWidth - 10; // Cách cạnh phải 10px
756
- }
757
- if (y + menuHeight > viewportHeight) {
758
- if (y < menuHeight) {
759
- y = 10;
760
- } else {
761
- y = y - 10 - menuHeight; // Cách cạnh dưới 10px
762
- }
763
- }
764
- setPosition(prevState => ({
765
- ...prevState,
766
- x,
767
- y
768
- }));
769
- }, 100);
770
- if (!menuVisible) {
771
- document.addEventListener(`click`, function onClickOutside(e) {
772
- const element = e.target;
773
- const menuContainer = document.querySelector(".popup-context-menu");
774
- const isInsideContainer = element.closest(".popup-context-menu") && menuContainer;
775
- if (isInsideContainer) {
776
- return;
777
- }
778
- setMenuVisible(false);
779
- document.removeEventListener(`click`, onClickOutside);
780
- });
781
- }
782
- };
783
- const handleRowClick = () => {
784
- if (clickRef.current) return;
785
-
786
- // @ts-ignore
787
- clickRef.current = setTimeout(() => {
788
- // console.log("Single Click:", record);
789
- clickRef.current = null;
790
- }, 250);
791
- };
792
- const handleRowDoubleClick = (record, index) => e => {
793
- if (clickRef.current) {
794
- clearTimeout(clickRef.current);
795
- clickRef.current = null;
796
- }
797
- recordDoubleClick?.({
798
- e,
799
- rowIndex: index,
800
- rowData: record
801
- });
802
- };
803
- const onSelectChange = (keys, selectedRows, info, selectedRow) => {
804
- if (info.type === 'all') {
805
- // setSelectedRowKeys(keys)
806
- rowSelected?.({
807
- selected: selectedRows,
808
- type: 'rowSelected',
809
- rowData: {}
810
- });
811
- } else {
812
- if (selectionSettings?.type === 'multiple') {
813
- // setSelectedRowKeys(keys)
814
- rowSelected?.({
815
- selected: selectedRows,
816
- type: 'rowSelected',
817
- rowData: selectedRow
818
- });
819
- } else {
820
- // @ts-ignore
821
- setSelectedRowKeys([selectedRow[rowKey]]);
822
- rowSelected?.({
823
- selected: [selectedRow],
824
- type: 'rowSelected',
825
- rowData: selectedRow
826
- });
827
- }
828
- }
829
- };
830
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(_ContextMenu.default, {
831
- open: menuVisible,
832
- pos: position,
833
- setOpen: setMenuVisible,
834
- menuRef: menuRef,
835
- contextMenuItems: contextMenuItems,
836
- contextMenuClick: contextMenuClick,
837
- rowData: selectedRowData
838
- }), /*#__PURE__*/_react.default.createElement(_uiRc.Table, (0, _extends2.default)({}, rest, {
839
- dataSource: dataSource
840
- // className={styles.customTable}
841
- ,
842
- className: (0, _classnames.default)('', {
843
- 'table-none-column-select': selectionSettings?.mode === undefined && selectionSettings?.type !== 'multiple'
844
- }, styles.customTable),
845
- bordered: true,
846
- virtual: virtual,
847
- columns: resizableColumns,
848
- rowKey: rowKey,
849
- rowHoverable: true,
850
- components: {
851
- header: {
852
- cell: ResizableTitle
853
- }
854
- },
855
- onRow: (data, index) => {
856
- return {
857
- onDoubleClick: handleRowDoubleClick(data, index),
858
- // onClick: handleRowClick(data),
859
- onClick: handleRowClick,
860
- onContextMenu: onContextMenu(data)
861
- };
862
- },
863
- rowSelection: {
864
- type: selectionSettings?.mode === 'checkbox' || selectionSettings?.type === 'multiple' ? 'checkbox' : "radio",
865
- // columnWidth: selectionSettings?.mode === 'checkbox' || selectionSettings?.mode === 'radio' || selectionSettings?.type === 'multiple' ? 50 : 0.000001,
866
- columnWidth: !selectionSettings?.mode ? 0.0000001 : selectionSettings?.columnWidth ?? 50,
867
- onChange: onSelectChange,
868
- // onSelect: (record, selected, selectedRows, nativeEvent)=> {
869
- // // console.log(record, selected, selectedRows, nativeEvent)
870
- // },
871
-
872
- selectedRowKeys: selectionSettings?.mode === 'checkbox' && selectionSettings?.type === 'single' ? selectedRowKeys : undefined,
873
- defaultSelectedRowKeys: selectionSettings?.defaultSelectedRowKeys,
874
- preserveSelectedRowKeys: true,
875
- ...rowSelection,
876
- // hideSelectAll: !selectionSettings?.type || selectionSettings?.type === 'single' || selectionSettings?.mode === 'radio' ? true : rowSelection?.hideSelectAll ?? selectionSettings?.type !== 'multiple',
877
- hideSelectAll: !selectionSettings?.type || selectionSettings?.type === 'single' || selectionSettings?.mode === 'radio' ? true : selectionSettings?.hideSelectAll ?? selectionSettings?.type !== 'multiple'
878
- },
879
- onScroll: () => {
880
- setMenuVisible(false);
881
- },
882
- title: () => {
883
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, "Header"), toolbarItems && /*#__PURE__*/_react.default.createElement("div", {
884
- style: {
885
- display: 'flex',
886
- justifyContent: 'space-between'
887
- }
888
- }, /*#__PURE__*/_react.default.createElement(_uiRc.Toolbar, {
889
- style: {
890
- width: '100%'
891
- },
892
- items: toolbarItems,
893
- mode: 'responsive'
894
- // mode={'scroll'}
895
- ,
896
- onClick: val => {
897
- console.log(val);
898
- }
899
- }), showColumnChoose && /*#__PURE__*/_react.default.createElement(_ColumnsChoose.ColumnsChoose, {
900
- columns: columns,
901
- setColumns: setColumns
902
- }), /*#__PURE__*/_react.default.createElement("div", null)));
903
- },
904
- summary: () => /*#__PURE__*/_react.default.createElement(_uiRc.Table.Summary, {
905
- fixed: true
906
- }, /*#__PURE__*/_react.default.createElement(_uiRc.Table.Summary.Row, null, (0, _useColumns.flatColumns)(tmpColumns).filter(col => col.hidden !== true).map((col, index) => {
907
- const thousandSeparator = col.format?.thousandSeparator ? col.format?.thousandSeparator : format?.thousandSeparator;
908
- const decimalSeparator = col.format?.decimalSeparator ? col.format?.decimalSeparator : format?.decimalSeparator;
909
- const dec = col.format?.decimalScale || col.format?.decimalScale === 0 ? col.format?.decimalScale : format?.decimalScale;
910
- const sumValue = col.type === 'number' ? (0, _hooks.sumDataByField)(dataSource, col?.key) : 0;
911
- const value = !(0, _hooks.isEmpty)(sumValue) ? dec || dec === 0 ? parseFloat(Number(sumValue).toFixed(dec)).toString() : sumValue.toString() : '0';
912
- const cellValue = col.type === 'number' && col.isSummary !== false ? value : '';
913
- const numericFormatProps = {
914
- thousandSeparator: (0, _hooks.checkThousandSeparator)(thousandSeparator, decimalSeparator),
915
- decimalSeparator: (0, _hooks.checkDecimalSeparator)(thousandSeparator, decimalSeparator),
916
- allowNegative: (col.format?.allowNegative ? col.format?.allowNegative : format?.allowNegative) ?? false,
917
- prefix: col.format?.prefix ? col.format?.prefix : format?.prefix,
918
- suffix: col.format?.suffix ? col.format?.suffix : format?.suffix,
919
- decimalScale: dec,
920
- fixedDecimalScale: (col.format?.fixedDecimalScale ? col.format?.fixedDecimalScale : format?.fixedDecimalScale) ?? false
921
- };
922
- return (
923
- /*#__PURE__*/
924
- // <Table.Summary.Cell index={index}>{col.summaryTemplate ? col.summaryTemplate(cellValue, (col.key || col.dataIndex) as string) : numericFormatter(cellValue, numericFormatProps)}</Table.Summary.Cell>
925
- _react.default.createElement(_uiRc.Table.Summary.Cell, {
926
- key: index,
927
- index: index
928
- }, col.summaryTemplate ? col.summaryTemplate(cellValue, col.key) : (0, _reactNumericComponent.numericFormatter)(cellValue, numericFormatProps))
929
- );
930
- }))),
931
- onFilter: val => {
932
- onFilter?.(convertFilters(val));
933
- }
934
- })));
935
- };
936
- var _default = exports.default = GridTable;