@react-fabric/data 1.0.0-beta.6 → 1.0.0-beta.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{src/histogram/Histogram.module.css → css/_histogram.css} +16 -13
- package/{dist/esm/tree/types.js → css/styles.css} +2 -7
- package/dist/cjs/checklist/CheckList.js +27 -4
- package/dist/cjs/histogram/Histogram.js +39 -9
- package/dist/cjs/hooks/useFilteredList.js +88 -10
- package/dist/cjs/hooks/usePagination.js +27 -4
- package/dist/cjs/hooks/useSelectableList.js +29 -0
- package/dist/cjs/i18n/ar.json.js +8 -1
- package/dist/cjs/i18n/en.json.js +8 -1
- package/dist/cjs/json/JsonViewer.js +68 -28
- package/dist/cjs/pagination/Pagination.js +14 -4
- package/dist/cjs/table/AddColumn.js +3 -3
- package/dist/cjs/table/BodyCell.js +14 -6
- package/dist/cjs/table/BodyRow.js +4 -4
- package/dist/cjs/table/CheckboxCell.js +2 -2
- package/dist/cjs/table/ColumnFilters.js +97 -0
- package/dist/cjs/table/HeaderCell.js +71 -43
- package/dist/cjs/table/Table.js +62 -13
- package/dist/cjs/table/types.js +29 -0
- package/dist/cjs/table/useResizer.js +4 -4
- package/dist/cjs/table/useVirtualTable.js +127 -19
- package/dist/cjs/tree/TreeNode.js +50 -32
- package/dist/cjs/tree/TreePanel.js +52 -19
- package/dist/cjs/tree/useTree.js +199 -38
- package/dist/cjs/tree/utils.js +39 -12
- package/dist/cjs/virtual/Gallery.js +97 -45
- package/dist/cjs/virtual/List.js +93 -39
- package/dist/cjs/virtual/Scroller.js +16 -8
- package/dist/esm/checklist/CheckList.js +28 -5
- package/dist/esm/histogram/Histogram.js +41 -11
- package/dist/esm/hooks/useFilteredList.js +89 -11
- package/dist/esm/hooks/usePagination.js +27 -4
- package/dist/esm/hooks/useSelectableList.js +29 -0
- package/dist/esm/i18n/ar.json.js +8 -2
- package/dist/esm/i18n/en.json.js +8 -2
- package/dist/esm/json/JsonViewer.js +69 -29
- package/dist/esm/pagination/Pagination.js +15 -5
- package/dist/esm/table/AddColumn.js +4 -4
- package/dist/esm/table/BodyCell.js +15 -7
- package/dist/esm/table/BodyRow.js +4 -4
- package/dist/esm/table/CheckboxCell.js +3 -3
- package/dist/esm/table/ColumnFilters.js +97 -0
- package/dist/esm/table/HeaderCell.js +72 -44
- package/dist/esm/table/Table.js +63 -14
- package/dist/esm/table/types.js +29 -0
- package/dist/esm/table/useResizer.js +4 -4
- package/dist/esm/table/useVirtualTable.js +129 -21
- package/dist/esm/tree/TreeNode.js +53 -35
- package/dist/esm/tree/TreePanel.js +54 -21
- package/dist/esm/tree/useTree.js +202 -41
- package/dist/esm/tree/utils.js +40 -13
- package/dist/esm/virtual/Gallery.js +97 -45
- package/dist/esm/virtual/List.js +93 -39
- package/dist/esm/virtual/Scroller.js +17 -9
- package/dist/types/checklist/CheckList.d.ts +22 -0
- package/dist/types/histogram/Histogram.d.ts +28 -1
- package/dist/types/hooks/useFilteredList.d.ts +66 -5
- package/dist/types/hooks/usePagination.d.ts +19 -0
- package/dist/types/hooks/useSelectableList.d.ts +29 -0
- package/dist/types/json/JsonViewer.d.ts +27 -2
- package/dist/types/pagination/Pagination.d.ts +10 -1
- package/dist/types/table/ColumnFilters.d.ts +9 -0
- package/dist/types/table/HeaderCell.d.ts +1 -1
- package/dist/types/table/Table.d.ts +14 -1
- package/dist/types/table/types.d.ts +46 -7
- package/dist/types/table/useVirtualTable.d.ts +23 -9
- package/dist/types/tree/TreeNode.d.ts +1 -1
- package/dist/types/tree/TreePanel.d.ts +42 -1
- package/dist/types/tree/types.d.ts +65 -21
- package/dist/types/tree/useTree.d.ts +9 -10
- package/dist/types/tree/utils.d.ts +10 -3
- package/dist/types/virtual/Gallery.d.ts +42 -3
- package/dist/types/virtual/List.d.ts +42 -3
- package/package.json +16 -14
- package/src/checklist/CheckList.tsx +39 -7
- package/src/histogram/Histogram.tsx +43 -19
- package/src/hooks/useFilteredList.tsx +109 -9
- package/src/hooks/usePagination.tsx +32 -7
- package/src/hooks/useSelectableList.ts +29 -0
- package/src/i18n/ar.json +5 -0
- package/src/i18n/en.json +5 -0
- package/src/json/JsonViewer.tsx +76 -37
- package/src/pagination/Pagination.tsx +15 -5
- package/src/table/AddColumn.tsx +4 -4
- package/src/table/BodyCell.tsx +24 -7
- package/src/table/BodyRow.tsx +7 -4
- package/src/table/CheckboxCell.tsx +5 -5
- package/src/table/ColumnFilters.tsx +105 -0
- package/src/table/HeaderCell.tsx +74 -21
- package/src/table/Table.tsx +107 -12
- package/src/table/types.ts +49 -10
- package/src/table/useResizer.ts +5 -3
- package/src/table/useVirtualTable.ts +158 -27
- package/src/tree/TreeNode.tsx +96 -62
- package/src/tree/TreePanel.tsx +88 -22
- package/src/tree/types.ts +73 -23
- package/src/tree/useTree.ts +220 -44
- package/src/tree/utils.ts +58 -20
- package/src/virtual/Gallery.tsx +118 -54
- package/src/virtual/List.tsx +99 -39
- package/src/virtual/Scroller.tsx +25 -9
- package/dist/cjs/histogram/Histogram.module.css +0 -1
- package/dist/cjs/tree/types.js +0 -30
- package/dist/esm/histogram/Histogram.module.css +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { DateDisplay } from '@react-fabric/date';
|
|
4
|
-
import { getByPath, isTrue, Format } from '@react-fabric/utilities';
|
|
4
|
+
import { getByPath, isTrue, Format, isObject, isArray } from '@react-fabric/utilities';
|
|
5
5
|
import classNames from 'classnames';
|
|
6
6
|
import { useMemo } from 'react';
|
|
7
7
|
import { useTableContext } from './Context.js';
|
|
@@ -43,24 +43,26 @@ var BodyCell = function BodyCell(_ref) {
|
|
|
43
43
|
return (_widths$get = widths.get(column.id.toString())) !== null && _widths$get !== void 0 ? _widths$get : column.width;
|
|
44
44
|
}, [widths, column]);
|
|
45
45
|
var content = useMemo(function () {
|
|
46
|
+
var _column$dataType2;
|
|
46
47
|
var value = getByPath(item, column.id.toString());
|
|
47
48
|
if (column.renderer != null) {
|
|
48
|
-
return column.renderer(
|
|
49
|
+
return column.renderer(value, item, index);
|
|
49
50
|
}
|
|
50
51
|
if (column.dataType === "boolean") {
|
|
51
52
|
var _column$valueMap;
|
|
52
53
|
var map = (_column$valueMap = column.valueMap) !== null && _column$valueMap !== void 0 ? _column$valueMap : {
|
|
53
54
|
"true": "Yes",
|
|
54
|
-
"false": "
|
|
55
|
+
"false": "No"
|
|
55
56
|
};
|
|
56
57
|
return map["".concat(isTrue(value) ? "true" : "false")];
|
|
57
58
|
}
|
|
58
59
|
if (column.valueMap != null) {
|
|
59
|
-
|
|
60
|
+
var _column$dataType;
|
|
61
|
+
if (["number", "string"].includes((_column$dataType = column.dataType) !== null && _column$dataType !== void 0 ? _column$dataType : "string") && value in column.valueMap) {
|
|
60
62
|
return column.valueMap[value];
|
|
61
63
|
}
|
|
62
64
|
}
|
|
63
|
-
if (column.dataType
|
|
65
|
+
if (["date", "time", "datetime"].includes((_column$dataType2 = column.dataType) !== null && _column$dataType2 !== void 0 ? _column$dataType2 : "")) {
|
|
64
66
|
return /*#__PURE__*/jsx(DateDisplay, {
|
|
65
67
|
date: value,
|
|
66
68
|
format: column.format
|
|
@@ -69,17 +71,23 @@ var BodyCell = function BodyCell(_ref) {
|
|
|
69
71
|
if (column.dataType === "number") {
|
|
70
72
|
return Format.number(value, column.format);
|
|
71
73
|
}
|
|
74
|
+
if (isObject(value)) {
|
|
75
|
+
return JSON.stringify(value);
|
|
76
|
+
}
|
|
77
|
+
if (isArray(value)) {
|
|
78
|
+
return value.join(", ");
|
|
79
|
+
}
|
|
72
80
|
return value !== null && value !== void 0 ? value : "";
|
|
73
81
|
}, [item, column]);
|
|
74
82
|
return /*#__PURE__*/jsx("div", {
|
|
75
|
-
className: "overflow-hidden bg-inherit start-0",
|
|
83
|
+
className: "overflow-hidden bg-inherit start-0 border-e group/table-col",
|
|
76
84
|
style: {
|
|
77
85
|
width: width !== null && width !== void 0 ? width : COL_DEFAULT_WIDTH,
|
|
78
86
|
minWidth: (_column$minWidth = column.minWidth) !== null && _column$minWidth !== void 0 ? _column$minWidth : COL_MIN_WIDTH,
|
|
79
87
|
maxWidth: (_column$maxWidth = column.maxWidth) !== null && _column$maxWidth !== void 0 ? _column$maxWidth : COL_MAX_WIDTH
|
|
80
88
|
},
|
|
81
89
|
children: /*#__PURE__*/jsx("div", {
|
|
82
|
-
className: classNames("px-2 py-1
|
|
90
|
+
className: classNames("px-2 py-1", column.className, column.truncate && "truncate", column.align === "center" && "text-center", column.align === "end" && "text-end"),
|
|
83
91
|
children: content
|
|
84
92
|
})
|
|
85
93
|
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { Icon } from '@react-fabric/core';
|
|
3
4
|
import classNames from 'classnames';
|
|
4
5
|
import { BodyCell } from './BodyCell.js';
|
|
5
6
|
import { CheckboxCell } from './CheckboxCell.js';
|
|
6
|
-
import { Icon, CoreIcons } from '@react-fabric/core';
|
|
7
7
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
8
8
|
|
|
9
9
|
/*
|
|
@@ -55,17 +55,17 @@ var BodyRow = function BodyRow(_ref) {
|
|
|
55
55
|
children: [/*#__PURE__*/jsxs("div", {
|
|
56
56
|
role: "none",
|
|
57
57
|
"data-row": index,
|
|
58
|
-
className: classNames("flex flex-nowrap datatable-row data-
|
|
58
|
+
className: classNames("flex flex-nowrap datatable-row data-hilight:outline-1 -outline-offset-1 outline-primary-500 group/table-row", onRowClick && "hover:bg-primary-50 active:bg-primary-100", index % 2 ? "bg-even" : "bg-odd"),
|
|
59
59
|
onClick: function onClick() {
|
|
60
60
|
return checkableRows && keyProperty && !onRowClick ? toggleChecked(data[keyProperty]) : onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(data);
|
|
61
61
|
},
|
|
62
62
|
children: [/*#__PURE__*/jsxs("div", {
|
|
63
63
|
className: wrapperStart,
|
|
64
64
|
children: [!!canExpand && /*#__PURE__*/jsx("div", {
|
|
65
|
-
className: classNames("group font-medium w-6 flex flex-nowrap text-start
|
|
65
|
+
className: classNames("group font-medium w-6 flex flex-nowrap text-start py-1", !canExpand(data) && "pointer-events-none opacity-35"),
|
|
66
66
|
children: /*#__PURE__*/jsx(Icon, {
|
|
67
67
|
className: "p-1 text-tint-700 hover:text-primary-600",
|
|
68
|
-
icon: expanded ?
|
|
68
|
+
icon: expanded ? "icon-[mdi--minus-box]" : "icon-[mdi--plus-box]",
|
|
69
69
|
onClick: function onClick(e) {
|
|
70
70
|
return [keyProperty && toggleExpand(data[keyProperty]), e.stopPropagation()];
|
|
71
71
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { Icon
|
|
3
|
+
import { Icon } from '@react-fabric/core';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
5
5
|
|
|
6
6
|
/*
|
|
@@ -30,9 +30,9 @@ var CheckboxCell = function CheckboxCell(_ref) {
|
|
|
30
30
|
var state = _ref.state,
|
|
31
31
|
_onClick = _ref.onClick;
|
|
32
32
|
return /*#__PURE__*/jsx("div", {
|
|
33
|
-
className: "group font-medium border-e w-6 flex flex-nowrap text-start
|
|
33
|
+
className: "group font-medium border-e w-6 flex flex-nowrap text-start py-1",
|
|
34
34
|
children: /*#__PURE__*/jsx(Icon, {
|
|
35
|
-
icon: state === 2 ?
|
|
35
|
+
icon: state === 2 ? "icon-[mdi--checkbox-intermediate]" : state === 1 ? "icon-[mdi--checkbox-marked]" : "icon-[mdi--checkbox-blank-outline]",
|
|
36
36
|
className: "p-1 text-tint-700 hover:text-primary-600",
|
|
37
37
|
onClick: function onClick(e) {
|
|
38
38
|
return [_onClick === null || _onClick === void 0 ? void 0 : _onClick(), e.stopPropagation()];
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
4
|
+
import { DropdownDismiss, Button } from '@react-fabric/core';
|
|
5
|
+
import { Input, Search, Checkbox } from '@react-fabric/form';
|
|
6
|
+
import { matchString, EMPTY_ARRAY } from '@react-fabric/utilities';
|
|
7
|
+
import { useState } from 'react';
|
|
8
|
+
import { useFilteredList } from '../hooks/useFilteredList.js';
|
|
9
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
var ListFilter = function ListFilter(_ref) {
|
|
12
|
+
var _ref$list = _ref.list,
|
|
13
|
+
list = _ref$list === void 0 ? EMPTY_ARRAY : _ref$list,
|
|
14
|
+
filter = _ref.filter,
|
|
15
|
+
onFilter = _ref.onFilter;
|
|
16
|
+
var _useState = useState(new Set(filter)),
|
|
17
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
18
|
+
selected = _useState2[0],
|
|
19
|
+
setSelected = _useState2[1];
|
|
20
|
+
var _useFilteredList = useFilteredList(list, function (item, query) {
|
|
21
|
+
var _item$id;
|
|
22
|
+
return matchString((_item$id = item.id) !== null && _item$id !== void 0 ? _item$id : item, query);
|
|
23
|
+
}),
|
|
24
|
+
filteredList = _useFilteredList.filteredList,
|
|
25
|
+
query = _useFilteredList.query,
|
|
26
|
+
onSearch = _useFilteredList.onSearch;
|
|
27
|
+
return /*#__PURE__*/jsxs("div", {
|
|
28
|
+
className: "flex flex-col",
|
|
29
|
+
children: [/*#__PURE__*/jsx("div", {
|
|
30
|
+
children: /*#__PURE__*/jsx(Search, {
|
|
31
|
+
autoFocus: true,
|
|
32
|
+
value: query,
|
|
33
|
+
onSearch: onSearch,
|
|
34
|
+
searchOnChange: true
|
|
35
|
+
})
|
|
36
|
+
}), /*#__PURE__*/jsxs("div", {
|
|
37
|
+
className: "flex-1 overflow-auto scroll-thin",
|
|
38
|
+
children: [filteredList.map(function (v, idx) {
|
|
39
|
+
var _v$id, _v$label;
|
|
40
|
+
return /*#__PURE__*/jsx("div", {
|
|
41
|
+
className: "flex gap-x-1 text-xs items-center",
|
|
42
|
+
children: /*#__PURE__*/jsx(Checkbox, {
|
|
43
|
+
checked: selected.has((_v$id = v.id) !== null && _v$id !== void 0 ? _v$id : v),
|
|
44
|
+
onChange: function onChange(b) {
|
|
45
|
+
var _v$id2, _v$id3;
|
|
46
|
+
var set = new Set(Array.from(selected.values()));
|
|
47
|
+
b ? set.add((_v$id2 = v.id) !== null && _v$id2 !== void 0 ? _v$id2 : v) : set["delete"]((_v$id3 = v.id) !== null && _v$id3 !== void 0 ? _v$id3 : v);
|
|
48
|
+
setSelected(set);
|
|
49
|
+
},
|
|
50
|
+
label: /*#__PURE__*/jsx("span", {
|
|
51
|
+
className: "truncate",
|
|
52
|
+
children: (_v$label = v.label) !== null && _v$label !== void 0 ? _v$label : v
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
}, idx);
|
|
56
|
+
}), filteredList.length === 0 && /*#__PURE__*/jsx("span", {
|
|
57
|
+
className: "text-muted text-xs",
|
|
58
|
+
children: "No items found"
|
|
59
|
+
})]
|
|
60
|
+
}), /*#__PURE__*/jsx("div", {
|
|
61
|
+
className: "flex justify-end",
|
|
62
|
+
children: /*#__PURE__*/jsx(DropdownDismiss, {
|
|
63
|
+
children: /*#__PURE__*/jsx(Button, {
|
|
64
|
+
size: "xs",
|
|
65
|
+
onClick: function onClick() {
|
|
66
|
+
return onFilter === null || onFilter === void 0 ? void 0 : onFilter(Array.from(selected));
|
|
67
|
+
},
|
|
68
|
+
children: "Apply"
|
|
69
|
+
})
|
|
70
|
+
})
|
|
71
|
+
})]
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
var ColumnFilters = function ColumnFilters(_ref2) {
|
|
75
|
+
var type = _ref2.type,
|
|
76
|
+
list = _ref2.list,
|
|
77
|
+
filter = _ref2.filter,
|
|
78
|
+
onFilter = _ref2.onFilter;
|
|
79
|
+
return /*#__PURE__*/jsxs("div", {
|
|
80
|
+
className: "flex flex-col min-w-[16rem]",
|
|
81
|
+
children: [list && /*#__PURE__*/jsx(ListFilter, {
|
|
82
|
+
list: list,
|
|
83
|
+
filter: filter,
|
|
84
|
+
onFilter: onFilter
|
|
85
|
+
}), !list && type === "string" && /*#__PURE__*/jsx(Input, {
|
|
86
|
+
autoFocus: true,
|
|
87
|
+
allowClear: true,
|
|
88
|
+
value: filter,
|
|
89
|
+
onEnterPressed: function onEnterPressed(e) {
|
|
90
|
+
var _e$target$value;
|
|
91
|
+
return onFilter((_e$target$value = e.target.value) !== null && _e$target$value !== void 0 ? _e$target$value : "");
|
|
92
|
+
}
|
|
93
|
+
})]
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export { ColumnFilters };
|
|
@@ -1,51 +1,37 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
4
|
+
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
|
|
5
|
+
import { Menu, MenuItem, Divider, Tooltip, Icon, getIconProps, DropdownTool, Button } from '@react-fabric/core';
|
|
6
|
+
import { isEmpty } from '@react-fabric/utilities';
|
|
4
7
|
import { useMemo, useCallback } from 'react';
|
|
8
|
+
import { ColumnFilters } from './ColumnFilters.js';
|
|
5
9
|
import { useTableContext } from './Context.js';
|
|
6
10
|
import { COL_DEFAULT_WIDTH, COL_MIN_WIDTH, COL_MAX_WIDTH } from './types.js';
|
|
7
11
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
8
12
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* @version: 1.0.0
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* The MIT License (MIT)
|
|
15
|
-
* Copyright (c) 2024 Adarsh Pastakia
|
|
16
|
-
*
|
|
17
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
18
|
-
* and associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
19
|
-
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
20
|
-
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
21
|
-
* subject to the following conditions:
|
|
22
|
-
*
|
|
23
|
-
* The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
24
|
-
* portions of the Software.
|
|
25
|
-
*
|
|
26
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
27
|
-
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
28
|
-
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
29
|
-
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
30
|
-
*/
|
|
31
|
-
|
|
13
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
14
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
32
15
|
var HeaderCell = function HeaderCell(_ref) {
|
|
33
16
|
var id = _ref.id,
|
|
17
|
+
field = _ref.field,
|
|
18
|
+
dataType = _ref.dataType,
|
|
34
19
|
label = _ref.label,
|
|
35
20
|
icon = _ref.icon,
|
|
36
|
-
|
|
37
|
-
iconColor = _ref.iconColor,
|
|
38
|
-
rtlFlip = _ref.rtlFlip;
|
|
39
|
-
_ref.actions;
|
|
21
|
+
actions = _ref.actions;
|
|
40
22
|
_ref.locked;
|
|
41
|
-
var
|
|
23
|
+
var filter = _ref.filter,
|
|
24
|
+
filterable = _ref.filterable,
|
|
25
|
+
filterOptions = _ref.filterOptions,
|
|
26
|
+
tooltip = _ref.tooltip,
|
|
42
27
|
sortable = _ref.sortable,
|
|
43
28
|
resizable = _ref.resizable,
|
|
44
29
|
_width = _ref.width,
|
|
45
30
|
maxWidth = _ref.maxWidth,
|
|
46
31
|
minWidth = _ref.minWidth,
|
|
47
32
|
sort = _ref.sort,
|
|
48
|
-
onSort = _ref.onSort
|
|
33
|
+
onSort = _ref.onSort,
|
|
34
|
+
_onFilter = _ref.onFilter;
|
|
49
35
|
var _useTableContext = useTableContext(),
|
|
50
36
|
startResize = _useTableContext.startResize,
|
|
51
37
|
widths = _useTableContext.widths;
|
|
@@ -53,30 +39,68 @@ var HeaderCell = function HeaderCell(_ref) {
|
|
|
53
39
|
var _widths$get;
|
|
54
40
|
return (_widths$get = widths.get(id.toString())) !== null && _widths$get !== void 0 ? _widths$get : _width;
|
|
55
41
|
}, [widths, _width, id]);
|
|
56
|
-
var handleSort = useCallback(function () {
|
|
42
|
+
var handleSort = useCallback(function (order) {
|
|
57
43
|
sortable && (onSort === null || onSort === void 0 ? void 0 : onSort({
|
|
58
44
|
id: id.toString(),
|
|
59
|
-
order: (sort === null || sort === void 0 ? void 0 : sort.id) === id && sort.order === "asc" ? "desc" : "asc"
|
|
45
|
+
order: order !== null && order !== void 0 ? order : (sort === null || sort === void 0 ? void 0 : sort.id) === id && sort.order === "asc" ? "desc" : "asc"
|
|
60
46
|
}));
|
|
61
|
-
}, [onSort,
|
|
47
|
+
}, [onSort, sort, sortable]);
|
|
62
48
|
var menus = useMemo(function () {
|
|
63
49
|
var ret = [];
|
|
50
|
+
if (filterable && (dataType !== null && dataType !== void 0 ? dataType : filterOptions)) {
|
|
51
|
+
ret.push( /*#__PURE__*/jsx(Menu, {
|
|
52
|
+
label: "Filter",
|
|
53
|
+
icon: filter ? "icon-[mdi--check]" : "",
|
|
54
|
+
trigger: "click",
|
|
55
|
+
children: /*#__PURE__*/jsx(ColumnFilters, {
|
|
56
|
+
type: dataType,
|
|
57
|
+
list: filterOptions,
|
|
58
|
+
filter: filter,
|
|
59
|
+
onFilter: function onFilter(value) {
|
|
60
|
+
return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(field !== null && field !== void 0 ? field : id, value);
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
}, "filters"));
|
|
64
|
+
}
|
|
64
65
|
if (sortable) {
|
|
65
66
|
ret.push( /*#__PURE__*/jsx(MenuItem, {
|
|
66
67
|
label: "Sort ascending",
|
|
67
|
-
icon:
|
|
68
|
+
icon: "icon-[mdi--sort-ascending]",
|
|
69
|
+
onClick: function onClick() {
|
|
70
|
+
return handleSort("asc");
|
|
71
|
+
}
|
|
68
72
|
}, "sort-asc"), /*#__PURE__*/jsx(MenuItem, {
|
|
69
73
|
label: "Sort descending",
|
|
70
|
-
icon:
|
|
74
|
+
icon: "icon-[mdi--sort-descending]",
|
|
75
|
+
onClick: function onClick() {
|
|
76
|
+
return handleSort("desc");
|
|
77
|
+
}
|
|
71
78
|
}, "sort-desc"));
|
|
72
79
|
}
|
|
80
|
+
if (actions) {
|
|
81
|
+
var _ret;
|
|
82
|
+
ret.push( /*#__PURE__*/jsx(Divider, {}, "div"));
|
|
83
|
+
(_ret = ret).push.apply(_ret, _toConsumableArray(actions));
|
|
84
|
+
}
|
|
85
|
+
if (ret.length === 1) {
|
|
86
|
+
ret = [/*#__PURE__*/jsx(ColumnFilters, {
|
|
87
|
+
type: dataType,
|
|
88
|
+
list: filterOptions,
|
|
89
|
+
filter: filter,
|
|
90
|
+
onFilter: function onFilter(value) {
|
|
91
|
+
return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(field !== null && field !== void 0 ? field : id, value);
|
|
92
|
+
}
|
|
93
|
+
}, "filters")];
|
|
94
|
+
}
|
|
73
95
|
return ret;
|
|
74
|
-
}, [sortable]);
|
|
96
|
+
}, [sortable, actions, _onFilter, handleSort]);
|
|
75
97
|
return /*#__PURE__*/jsxs("div", {
|
|
76
98
|
role: "none",
|
|
77
99
|
"data-id": id,
|
|
78
|
-
onClick:
|
|
79
|
-
|
|
100
|
+
onClick: function onClick() {
|
|
101
|
+
return handleSort();
|
|
102
|
+
},
|
|
103
|
+
className: "group/tool font-medium border-e flex flex-nowrap text-start items-center table-header-cell",
|
|
80
104
|
style: {
|
|
81
105
|
width: width !== null && width !== void 0 ? width : COL_DEFAULT_WIDTH,
|
|
82
106
|
minWidth: minWidth !== null && minWidth !== void 0 ? minWidth : COL_MIN_WIDTH,
|
|
@@ -87,12 +111,7 @@ var HeaderCell = function HeaderCell(_ref) {
|
|
|
87
111
|
disabled: !(tooltip !== null && tooltip !== void 0 ? tooltip : label),
|
|
88
112
|
children: /*#__PURE__*/jsxs("div", {
|
|
89
113
|
className: "flex-initial px-2 py-1 text-sm truncate sticky start-0",
|
|
90
|
-
children: [icon && /*#__PURE__*/jsx(Icon, {
|
|
91
|
-
icon: icon,
|
|
92
|
-
bg: iconBg,
|
|
93
|
-
color: iconColor,
|
|
94
|
-
rtlFlip: rtlFlip
|
|
95
|
-
}), /*#__PURE__*/jsx("span", {
|
|
114
|
+
children: [icon && /*#__PURE__*/jsx(Icon, _objectSpread({}, getIconProps(icon))), /*#__PURE__*/jsx("span", {
|
|
96
115
|
children: label !== null && label !== void 0 ? label : " "
|
|
97
116
|
})]
|
|
98
117
|
})
|
|
@@ -112,6 +131,15 @@ var HeaderCell = function HeaderCell(_ref) {
|
|
|
112
131
|
className: "text-sm",
|
|
113
132
|
children: menus
|
|
114
133
|
})
|
|
134
|
+
}), filterable && !isEmpty(filter) && /*#__PURE__*/jsx(Button, {
|
|
135
|
+
size: "sm",
|
|
136
|
+
variant: "link",
|
|
137
|
+
"aria-label": "clear filter",
|
|
138
|
+
stopPropagation: true,
|
|
139
|
+
icon: "icon-[mdi--filter-remove]",
|
|
140
|
+
onClick: function onClick() {
|
|
141
|
+
return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(id);
|
|
142
|
+
}
|
|
115
143
|
}), resizable && /*#__PURE__*/jsx("div", {
|
|
116
144
|
role: "none",
|
|
117
145
|
className: "cursor-col-resize border-e bg-transparent border-tint-200 w-[5px] self-stretch",
|
package/dist/esm/table/Table.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
4
|
-
import { useDebounce,
|
|
4
|
+
import { useDebounce, LoadingLine, Icon, EmptyContent } from '@react-fabric/core';
|
|
5
5
|
import { debounce } from '@react-fabric/utilities';
|
|
6
|
+
import classNames from 'classnames';
|
|
6
7
|
import { useRef, useMemo, useLayoutEffect, useImperativeHandle, useEffect } from 'react';
|
|
7
8
|
import { useTranslation } from 'react-i18next';
|
|
8
9
|
import { AddColumn } from './AddColumn.js';
|
|
@@ -18,23 +19,31 @@ import { jsx, jsxs } from 'react/jsx-runtime';
|
|
|
18
19
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
19
20
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
20
21
|
var Table = function Table(_ref) {
|
|
21
|
-
var _state$start, _state$cols, _state$end, _items
|
|
22
|
+
var _state$start, _state$cols, _state$end, _items, _state$start2, _state$cols2, _state$end2;
|
|
22
23
|
var ref = _ref.ref,
|
|
23
24
|
data = _ref.data,
|
|
24
25
|
columns = _ref.columns,
|
|
25
|
-
keyProperty = _ref.keyProperty,
|
|
26
|
+
_ref$keyProperty = _ref.keyProperty,
|
|
27
|
+
keyProperty = _ref$keyProperty === void 0 ? "id" : _ref$keyProperty,
|
|
28
|
+
groupProperty = _ref.groupProperty,
|
|
26
29
|
checkableRows = _ref.checkableRows,
|
|
27
30
|
initialScroll = _ref.initialScroll,
|
|
28
31
|
hideableColumns = _ref.hideableColumns,
|
|
29
32
|
sort = _ref.sort,
|
|
30
33
|
loading = _ref.loading,
|
|
34
|
+
checked = _ref.checked,
|
|
31
35
|
emptyDisplay = _ref.emptyDisplay,
|
|
36
|
+
groupRenderer = _ref.groupRenderer,
|
|
32
37
|
canExpand = _ref.canExpand,
|
|
33
38
|
children = _ref.children,
|
|
34
39
|
onSort = _ref.onSort,
|
|
40
|
+
onFilter = _ref.onFilter,
|
|
35
41
|
onScroll = _ref.onScroll,
|
|
36
42
|
onRowClick = _ref.onRowClick,
|
|
37
|
-
onCheckedChanged = _ref.onCheckedChanged
|
|
43
|
+
onCheckedChanged = _ref.onCheckedChanged,
|
|
44
|
+
_ref$total = _ref.total,
|
|
45
|
+
total = _ref$total === void 0 ? 0 : _ref$total,
|
|
46
|
+
onLoadMore = _ref.onLoadMore;
|
|
38
47
|
var _useTranslation = useTranslation("data"),
|
|
39
48
|
t = _useTranslation.t;
|
|
40
49
|
var fireCheckChanged = useDebounce(function (checkedIds) {
|
|
@@ -43,17 +52,28 @@ var Table = function Table(_ref) {
|
|
|
43
52
|
var _useTableColumns = useTableColumns(columns),
|
|
44
53
|
state = _useTableColumns.state,
|
|
45
54
|
onHide = _useTableColumns.onHide;
|
|
46
|
-
var _useVirtualTable = useVirtualTable(data,
|
|
55
|
+
var _useVirtualTable = useVirtualTable(data, {
|
|
56
|
+
checked: checked,
|
|
57
|
+
keyProperty: keyProperty,
|
|
58
|
+
groupProperty: groupProperty,
|
|
59
|
+
total: total,
|
|
60
|
+
loading: loading,
|
|
61
|
+
onLoadMore: onLoadMore,
|
|
62
|
+
onCheckChanged: fireCheckChanged
|
|
63
|
+
}),
|
|
47
64
|
scrollerRef = _useVirtualTable.scrollerRef,
|
|
48
65
|
items = _useVirtualTable.items,
|
|
49
66
|
top = _useVirtualTable.top,
|
|
50
67
|
checkState = _useVirtualTable.checkState,
|
|
51
68
|
virtualizer = _useVirtualTable.virtualizer,
|
|
69
|
+
hasActiveSticky = _useVirtualTable.hasActiveSticky,
|
|
52
70
|
toggleExpand = _useVirtualTable.toggleExpand,
|
|
53
71
|
toggleChecked = _useVirtualTable.toggleChecked,
|
|
54
72
|
toggleAllChecked = _useVirtualTable.toggleAllChecked,
|
|
73
|
+
toggleGroupExpand = _useVirtualTable.toggleGroupExpand,
|
|
55
74
|
getData = _useVirtualTable.getData,
|
|
56
75
|
totalSize = _useVirtualTable.totalSize,
|
|
76
|
+
isActiveSticky = _useVirtualTable.isActiveSticky,
|
|
57
77
|
measureElement = _useVirtualTable.measureElement;
|
|
58
78
|
var refBody = useRef(null);
|
|
59
79
|
var wrapperStart = useMemo(function () {
|
|
@@ -108,9 +128,11 @@ var Table = function Table(_ref) {
|
|
|
108
128
|
style: {
|
|
109
129
|
gridTemplate: "\"head\" auto \"loader\" auto \"content\" 1fr \"foot\" auto/1fr"
|
|
110
130
|
},
|
|
131
|
+
"data-ref": "tableScroller",
|
|
111
132
|
ref: scrollerRef,
|
|
112
133
|
children: [/*#__PURE__*/jsxs("div", {
|
|
113
|
-
|
|
134
|
+
"data-ref": "tableHeader",
|
|
135
|
+
className: "bg-base font-medium sticky top-0 h-8 area-head border-b select-none flex flex-nowrap z-3",
|
|
114
136
|
children: [/*#__PURE__*/jsxs("div", {
|
|
115
137
|
className: wrapperStart,
|
|
116
138
|
children: [canExpand && /*#__PURE__*/jsx("div", {
|
|
@@ -121,20 +143,23 @@ var Table = function Table(_ref) {
|
|
|
121
143
|
}), (_state$start = state.start) === null || _state$start === void 0 ? void 0 : _state$start.map(function (col, idx) {
|
|
122
144
|
return /*#__PURE__*/jsx(HeaderCell, _objectSpread(_objectSpread({}, col), {}, {
|
|
123
145
|
sort: sort,
|
|
124
|
-
onSort: onSort
|
|
146
|
+
onSort: onSort,
|
|
147
|
+
onFilter: onFilter
|
|
125
148
|
}), idx);
|
|
126
149
|
})]
|
|
127
150
|
}), (_state$cols = state.cols) === null || _state$cols === void 0 ? void 0 : _state$cols.map(function (col, idx) {
|
|
128
151
|
return /*#__PURE__*/jsx(HeaderCell, _objectSpread(_objectSpread({}, col), {}, {
|
|
129
152
|
sort: sort,
|
|
130
|
-
onSort: onSort
|
|
153
|
+
onSort: onSort,
|
|
154
|
+
onFilter: onFilter
|
|
131
155
|
}), idx);
|
|
132
156
|
}), /*#__PURE__*/jsxs("div", {
|
|
133
157
|
className: wrapperEnd,
|
|
134
158
|
children: [(_state$end = state.end) === null || _state$end === void 0 ? void 0 : _state$end.map(function (col, idx) {
|
|
135
159
|
return /*#__PURE__*/jsx(HeaderCell, _objectSpread(_objectSpread({}, col), {}, {
|
|
136
160
|
sort: sort,
|
|
137
|
-
onSort: onSort
|
|
161
|
+
onSort: onSort,
|
|
162
|
+
onFilter: onFilter
|
|
138
163
|
}), idx);
|
|
139
164
|
}), hideableColumns && /*#__PURE__*/jsx(AddColumn, {
|
|
140
165
|
onClick: onHide,
|
|
@@ -143,22 +168,46 @@ var Table = function Table(_ref) {
|
|
|
143
168
|
})
|
|
144
169
|
})]
|
|
145
170
|
})]
|
|
146
|
-
}), loading && /*#__PURE__*/jsx(
|
|
147
|
-
className: "area-content flex flex-col flex-nowrap",
|
|
171
|
+
}), loading && /*#__PURE__*/jsx(LoadingLine, {}), data.length > 0 && /*#__PURE__*/jsxs("div", {
|
|
172
|
+
className: "area-content flex flex-col flex-nowrap min-h-full",
|
|
148
173
|
style: {
|
|
149
174
|
height: totalSize()
|
|
150
175
|
},
|
|
151
176
|
ref: refBody,
|
|
152
177
|
children: [/*#__PURE__*/jsx("div", {
|
|
153
178
|
style: {
|
|
154
|
-
height: (_items
|
|
179
|
+
height: (_items = items[hasActiveSticky ? 1 : 0]) === null || _items === void 0 ? void 0 : _items.start
|
|
155
180
|
}
|
|
156
181
|
}), items.map(function (_ref2) {
|
|
182
|
+
var _groupRenderer;
|
|
157
183
|
var index = _ref2.index,
|
|
158
184
|
key = _ref2.key;
|
|
159
185
|
var data = getData(index);
|
|
160
|
-
return /*#__PURE__*/jsx(
|
|
161
|
-
|
|
186
|
+
return "__GROUP__" in data ? /*#__PURE__*/jsx("div", {
|
|
187
|
+
ref: measureElement,
|
|
188
|
+
"data-index": index,
|
|
189
|
+
className: classNames("text-md bg-base border-y border-tint-100 border-t-0 cursor-pointer flex items-center justify-start gap-1 z-2", isActiveSticky(index) && "sticky top-8"),
|
|
190
|
+
role: "none",
|
|
191
|
+
onClick: function onClick() {
|
|
192
|
+
return toggleGroupExpand(data.key);
|
|
193
|
+
},
|
|
194
|
+
children: /*#__PURE__*/jsxs("div", {
|
|
195
|
+
className: classNames("px-2 py-1 flex items-center gap-1 z-2 sticky start-0"),
|
|
196
|
+
children: [/*#__PURE__*/jsx(Icon, {
|
|
197
|
+
rtlFlip: true,
|
|
198
|
+
icon: data.open ? "icon-[mdi--chevron-down]" : "icon-[mdi--chevron-right]"
|
|
199
|
+
}), (_groupRenderer = groupRenderer === null || groupRenderer === void 0 ? void 0 : groupRenderer(data)) !== null && _groupRenderer !== void 0 ? _groupRenderer : /*#__PURE__*/jsxs("div", {
|
|
200
|
+
className: "flex gap-1 items-center",
|
|
201
|
+
children: [/*#__PURE__*/jsx("span", {
|
|
202
|
+
children: data.key
|
|
203
|
+
}), /*#__PURE__*/jsxs("span", {
|
|
204
|
+
className: "text-sm",
|
|
205
|
+
children: ["(", data.itemCount, ")"]
|
|
206
|
+
})]
|
|
207
|
+
})]
|
|
208
|
+
})
|
|
209
|
+
}, key) : /*#__PURE__*/jsx(BodyRow, {
|
|
210
|
+
rowKey: key.toString(),
|
|
162
211
|
index: index,
|
|
163
212
|
checkableRows: checkableRows,
|
|
164
213
|
checked: keyProperty && checkState.checked.includes(data[keyProperty]) ? 1 : 0,
|
package/dist/esm/table/types.js
CHANGED
|
@@ -27,4 +27,33 @@ var COL_MIN_WIDTH = "3rem";
|
|
|
27
27
|
var COL_MAX_WIDTH = "64rem";
|
|
28
28
|
var COL_DEFAULT_WIDTH = "12rem";
|
|
29
29
|
|
|
30
|
+
/**
|
|
31
|
+
* TableColumn interface defines the structure of a column in a table.
|
|
32
|
+
* It includes properties for column identification, display options, alignment,
|
|
33
|
+
* visibility, resizing, sorting, filtering, and rendering.
|
|
34
|
+
*
|
|
35
|
+
* @template T - The type of data the column will represent, defaulting to KeyValue.
|
|
36
|
+
* @property {keyof T | string} id - Unique identifier for the column.
|
|
37
|
+
* @property {"string" | "number" | "boolean" | "datetime" | "date" | "time" | "unknown"} [dataType] - Data type of the column values.
|
|
38
|
+
* @property {string} [label] - Display label for the column header.
|
|
39
|
+
* @property {string} [tooltip] - Tooltip text for the column header.
|
|
40
|
+
* @property {string} [format] - Format string for displaying the column values.
|
|
41
|
+
* @property {"start" | "center" | "end"} [align] - Text alignment within the column.
|
|
42
|
+
* @property {"start" | "end"} [locked] - Indicates if the column is locked at the start or end.
|
|
43
|
+
* @property {boolean} [hidden] - Whether the column is hidden.
|
|
44
|
+
* @property {boolean} [truncate] - Whether to truncate the text in the column.
|
|
45
|
+
* @property {boolean} [hideable] - Whether the column can be hidden by the user.
|
|
46
|
+
* @property {boolean} [resizable] - Whether the column can be resized by the user.
|
|
47
|
+
* @property {boolean} [sortable] - Whether the column can be sorted.
|
|
48
|
+
* @property {boolean} [filterable] - Whether the column can be filtered.
|
|
49
|
+
* @property {AnyObject} [filter] - Filter criteria for the column.
|
|
50
|
+
* @property {ReactElement[]} [actions] - Array of action elements to be displayed in the column.
|
|
51
|
+
* @property {AnyObject[]} [filterOptions] - Options for filtering the column.
|
|
52
|
+
* @property {string | number} [width] - Width of the column.
|
|
53
|
+
* @property {string | number} [minWidth] - Minimum width of the column.
|
|
54
|
+
* @property {string | number} [maxWidth] - Maximum width of the column.
|
|
55
|
+
* @property {KeyValue} [valueMap] - Mapping of values for the column.
|
|
56
|
+
* @property {(value: AnyObject, data: T, index: number) => Elements<AnyObject>} [renderer] - Custom renderer function for the column values.
|
|
57
|
+
*/
|
|
58
|
+
|
|
30
59
|
export { COL_DEFAULT_WIDTH, COL_MAX_WIDTH, COL_MIN_WIDTH };
|
|
@@ -44,14 +44,14 @@ var useResizer = function useResizer(colEl, ghostEl, callback) {
|
|
|
44
44
|
/** ***************** attach handlers *******************/
|
|
45
45
|
var box = colEl.getBoundingClientRect();
|
|
46
46
|
if (colEl.parentElement != null) {
|
|
47
|
-
var _colEl$
|
|
48
|
-
var parentBox = (_colEl$
|
|
47
|
+
var _colEl$closest;
|
|
48
|
+
var parentBox = (_colEl$closest = colEl.closest("[data-ref='tableScroller']")) === null || _colEl$closest === void 0 ? void 0 : _colEl$closest.getBoundingClientRect();
|
|
49
49
|
if (isRtl) {
|
|
50
50
|
placeholder.style.left = "unset";
|
|
51
|
-
placeholder.style.right = "".concat(
|
|
51
|
+
placeholder.style.right = "".concat(parentBox.width - box.right, "px");
|
|
52
52
|
} else {
|
|
53
53
|
placeholder.style.right = "unset";
|
|
54
|
-
placeholder.style.left = "".concat(box.left
|
|
54
|
+
placeholder.style.left = "".concat(box.left, "px");
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
placeholder.style.width = "".concat(colEl.offsetWidth, "px");
|