es-grid-template 0.0.4 → 0.0.7

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 (64) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/LICENSE +19 -0
  3. package/README.md +1 -6
  4. package/{dist/components/GridTable → es}/CheckboxFilter.d.ts +1 -1
  5. package/es/CheckboxFilter.js +249 -0
  6. package/{dist/components/GridTable → es}/ColumnsChoose.d.ts +3 -2
  7. package/es/ColumnsChoose.js +213 -0
  8. package/{dist/components/GridTable → es}/ContextMenu.d.ts +1 -1
  9. package/es/ContextMenu.js +126 -0
  10. package/{dist/components/GridTable → es}/FilterSearch.d.ts +3 -3
  11. package/es/FilterSearch.js +33 -0
  12. package/es/GridTable.d.ts +7 -0
  13. package/es/GridTable.js +927 -0
  14. package/es/hooks/constant.js +214 -0
  15. package/es/hooks/index.js +5 -0
  16. package/{dist → es}/hooks/useColumns/index.d.ts +1 -1
  17. package/es/hooks/useColumns/index.js +25 -0
  18. package/{dist → es}/hooks/useIsOverflow.d.ts +1 -1
  19. package/es/hooks/useIsOverflow.js +17 -0
  20. package/es/hooks/useOnClickOutside.js +28 -0
  21. package/{dist → es}/hooks/utils.d.ts +7 -3
  22. package/es/hooks/utils.js +192 -0
  23. package/es/index.d.ts +2 -0
  24. package/es/index.js +2 -0
  25. package/es/styles.scss +30 -0
  26. package/es/type.d.ts +88 -0
  27. package/es/type.js +1 -0
  28. package/lib/CheckboxFilter.d.ts +19 -0
  29. package/lib/CheckboxFilter.js +257 -0
  30. package/lib/ColumnsChoose.d.ts +10 -0
  31. package/lib/ColumnsChoose.js +223 -0
  32. package/lib/ContextMenu.d.ts +20 -0
  33. package/lib/ContextMenu.js +135 -0
  34. package/lib/FilterSearch.d.ts +12 -0
  35. package/lib/FilterSearch.js +42 -0
  36. package/lib/GridTable.d.ts +7 -0
  37. package/lib/GridTable.js +936 -0
  38. package/lib/hooks/constant.d.ts +48 -0
  39. package/lib/hooks/constant.js +221 -0
  40. package/lib/hooks/index.d.ts +4 -0
  41. package/lib/hooks/index.js +49 -0
  42. package/lib/hooks/useColumns/index.d.ts +2 -0
  43. package/lib/hooks/useColumns/index.js +31 -0
  44. package/lib/hooks/useIsOverflow.d.ts +1 -0
  45. package/lib/hooks/useIsOverflow.js +26 -0
  46. package/lib/hooks/useOnClickOutside.d.ts +1 -0
  47. package/lib/hooks/useOnClickOutside.js +36 -0
  48. package/lib/hooks/utils.d.ts +18 -0
  49. package/lib/hooks/utils.js +215 -0
  50. package/lib/index.d.ts +2 -0
  51. package/lib/index.js +9 -0
  52. package/lib/styles.scss +30 -0
  53. package/lib/type.d.ts +88 -0
  54. package/lib/type.js +5 -0
  55. package/package.json +75 -94
  56. package/dist/components/GridTable/GridTable.d.ts +0 -6
  57. package/dist/components/GridTable/index.d.ts +0 -1
  58. package/dist/components/index.d.ts +0 -1
  59. package/dist/index.d.ts +0 -2
  60. package/dist/index.js +0 -53
  61. package/dist/type.d.ts +0 -45
  62. /package/{dist → es}/hooks/constant.d.ts +0 -0
  63. /package/{dist → es}/hooks/index.d.ts +0 -0
  64. /package/{dist → es}/hooks/useOnClickOutside.d.ts +0 -0
@@ -0,0 +1,936 @@
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;