@react-fabric/data 1.0.0-beta.6 → 1.0.0-beta.60

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 (103) hide show
  1. package/{src/histogram/Histogram.module.css → css/_histogram.css} +16 -13
  2. package/css/styles.css +24 -0
  3. package/dist/cjs/checklist/CheckList.js +23 -0
  4. package/dist/cjs/histogram/Histogram.js +37 -7
  5. package/dist/cjs/hooks/useFilteredList.js +88 -10
  6. package/dist/cjs/hooks/usePagination.js +27 -4
  7. package/dist/cjs/hooks/useSelectableList.js +29 -0
  8. package/dist/cjs/i18n/ar.json.js +8 -1
  9. package/dist/cjs/i18n/en.json.js +8 -1
  10. package/dist/cjs/json/JsonViewer.js +67 -27
  11. package/dist/cjs/pagination/Pagination.js +10 -0
  12. package/dist/cjs/table/AddColumn.js +1 -1
  13. package/dist/cjs/table/BodyCell.js +5 -4
  14. package/dist/cjs/table/BodyRow.js +2 -2
  15. package/dist/cjs/table/CheckboxCell.js +1 -1
  16. package/dist/cjs/table/ColumnFilters.js +97 -0
  17. package/dist/cjs/table/HeaderCell.js +71 -43
  18. package/dist/cjs/table/Table.js +58 -12
  19. package/dist/cjs/table/types.js +29 -0
  20. package/dist/cjs/table/useResizer.js +4 -4
  21. package/dist/cjs/table/useVirtualTable.js +127 -19
  22. package/dist/cjs/tree/TreeNode.js +48 -30
  23. package/dist/cjs/tree/TreePanel.js +45 -11
  24. package/dist/cjs/tree/useTree.js +199 -38
  25. package/dist/cjs/tree/utils.js +39 -12
  26. package/dist/cjs/virtual/Gallery.js +97 -45
  27. package/dist/cjs/virtual/List.js +93 -39
  28. package/dist/cjs/virtual/Scroller.js +16 -8
  29. package/dist/esm/checklist/CheckList.js +23 -0
  30. package/dist/esm/histogram/Histogram.js +38 -8
  31. package/dist/esm/hooks/useFilteredList.js +89 -11
  32. package/dist/esm/hooks/usePagination.js +27 -4
  33. package/dist/esm/hooks/useSelectableList.js +29 -0
  34. package/dist/esm/i18n/ar.json.js +8 -2
  35. package/dist/esm/i18n/en.json.js +8 -2
  36. package/dist/esm/json/JsonViewer.js +68 -28
  37. package/dist/esm/pagination/Pagination.js +10 -0
  38. package/dist/esm/table/AddColumn.js +1 -1
  39. package/dist/esm/table/BodyCell.js +5 -4
  40. package/dist/esm/table/BodyRow.js +2 -2
  41. package/dist/esm/table/CheckboxCell.js +1 -1
  42. package/dist/esm/table/ColumnFilters.js +97 -0
  43. package/dist/esm/table/HeaderCell.js +72 -44
  44. package/dist/esm/table/Table.js +59 -13
  45. package/dist/esm/table/types.js +29 -0
  46. package/dist/esm/table/useResizer.js +4 -4
  47. package/dist/esm/table/useVirtualTable.js +129 -21
  48. package/dist/esm/tree/TreeNode.js +51 -33
  49. package/dist/esm/tree/TreePanel.js +46 -12
  50. package/dist/esm/tree/useTree.js +202 -41
  51. package/dist/esm/tree/utils.js +40 -13
  52. package/dist/esm/virtual/Gallery.js +97 -45
  53. package/dist/esm/virtual/List.js +93 -39
  54. package/dist/esm/virtual/Scroller.js +16 -8
  55. package/dist/types/checklist/CheckList.d.ts +22 -0
  56. package/dist/types/histogram/Histogram.d.ts +28 -1
  57. package/dist/types/hooks/useFilteredList.d.ts +66 -5
  58. package/dist/types/hooks/usePagination.d.ts +19 -0
  59. package/dist/types/hooks/useSelectableList.d.ts +29 -0
  60. package/dist/types/json/JsonViewer.d.ts +27 -2
  61. package/dist/types/pagination/Pagination.d.ts +10 -1
  62. package/dist/types/table/ColumnFilters.d.ts +9 -0
  63. package/dist/types/table/HeaderCell.d.ts +1 -1
  64. package/dist/types/table/Table.d.ts +14 -1
  65. package/dist/types/table/types.d.ts +44 -5
  66. package/dist/types/table/useVirtualTable.d.ts +23 -9
  67. package/dist/types/tree/TreeNode.d.ts +1 -1
  68. package/dist/types/tree/TreePanel.d.ts +42 -1
  69. package/dist/types/tree/types.d.ts +65 -19
  70. package/dist/types/tree/useTree.d.ts +9 -10
  71. package/dist/types/tree/utils.d.ts +10 -3
  72. package/dist/types/virtual/Gallery.d.ts +42 -3
  73. package/dist/types/virtual/List.d.ts +42 -3
  74. package/package.json +16 -14
  75. package/src/checklist/CheckList.tsx +22 -0
  76. package/src/histogram/Histogram.tsx +40 -10
  77. package/src/hooks/useFilteredList.tsx +109 -9
  78. package/src/hooks/usePagination.tsx +32 -7
  79. package/src/hooks/useSelectableList.ts +29 -0
  80. package/src/i18n/ar.json +5 -0
  81. package/src/i18n/en.json +5 -0
  82. package/src/json/JsonViewer.tsx +71 -35
  83. package/src/pagination/Pagination.tsx +10 -0
  84. package/src/table/AddColumn.tsx +1 -1
  85. package/src/table/BodyCell.tsx +6 -4
  86. package/src/table/BodyRow.tsx +3 -2
  87. package/src/table/CheckboxCell.tsx +1 -1
  88. package/src/table/ColumnFilters.tsx +105 -0
  89. package/src/table/HeaderCell.tsx +72 -18
  90. package/src/table/Table.tsx +99 -11
  91. package/src/table/types.ts +46 -8
  92. package/src/table/useResizer.ts +5 -3
  93. package/src/table/useVirtualTable.ts +158 -27
  94. package/src/tree/TreeNode.tsx +98 -58
  95. package/src/tree/TreePanel.tsx +77 -6
  96. package/src/tree/types.ts +73 -18
  97. package/src/tree/useTree.ts +220 -44
  98. package/src/tree/utils.ts +58 -20
  99. package/src/virtual/Gallery.tsx +118 -54
  100. package/src/virtual/List.tsx +99 -39
  101. package/src/virtual/Scroller.tsx +16 -8
  102. package/dist/cjs/histogram/Histogram.module.css +0 -1
  103. package/dist/esm/histogram/Histogram.module.css +0 -1
@@ -43,9 +43,10 @@ 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 = react.useMemo(function () {
46
+ var _column$dataType;
46
47
  var value = utilities.getByPath(item, column.id.toString());
47
48
  if (column.renderer != null) {
48
- return column.renderer(item[column.id], item, index);
49
+ return column.renderer(value, item, index);
49
50
  }
50
51
  if (column.dataType === "boolean") {
51
52
  var _column$valueMap;
@@ -60,7 +61,7 @@ var BodyCell = function BodyCell(_ref) {
60
61
  return column.valueMap[value];
61
62
  }
62
63
  }
63
- if (column.dataType === "date") {
64
+ if (["date", "time", "datetime"].includes((_column$dataType = column.dataType) !== null && _column$dataType !== void 0 ? _column$dataType : "")) {
64
65
  return /*#__PURE__*/jsxRuntime.jsx(date.DateDisplay, {
65
66
  date: value,
66
67
  format: column.format
@@ -72,14 +73,14 @@ var BodyCell = function BodyCell(_ref) {
72
73
  return value !== null && value !== void 0 ? value : "";
73
74
  }, [item, column]);
74
75
  return /*#__PURE__*/jsxRuntime.jsx("div", {
75
- className: "overflow-hidden bg-inherit start-0",
76
+ className: "overflow-hidden bg-inherit start-0 border-e group/table-col",
76
77
  style: {
77
78
  width: width !== null && width !== void 0 ? width : types.COL_DEFAULT_WIDTH,
78
79
  minWidth: (_column$minWidth = column.minWidth) !== null && _column$minWidth !== void 0 ? _column$minWidth : types.COL_MIN_WIDTH,
79
80
  maxWidth: (_column$maxWidth = column.maxWidth) !== null && _column$maxWidth !== void 0 ? _column$maxWidth : types.COL_MAX_WIDTH
80
81
  },
81
82
  children: /*#__PURE__*/jsxRuntime.jsx("div", {
82
- className: classNames("px-2 py-1 border-e truncate", column.align === "center" && "text-center", column.align === "end" && "text-end"),
83
+ className: classNames("px-2 py-1", column.className, column.truncate && "truncate", column.align === "center" && "text-center", column.align === "end" && "text-end"),
83
84
  children: content
84
85
  })
85
86
  });
@@ -55,14 +55,14 @@ var BodyRow = function BodyRow(_ref) {
55
55
  children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
56
56
  role: "none",
57
57
  "data-row": index,
58
- className: classNames("flex flex-nowrap datatable-row data-[hilight]:outline-1 -outline-offset-1 outline-primary-500", onRowClick && "hover:bg-primary-50 active:bg-primary-100"),
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__*/jsxRuntime.jsxs("div", {
63
63
  className: wrapperStart,
64
64
  children: [!!canExpand && /*#__PURE__*/jsxRuntime.jsx("div", {
65
- className: classNames("group font-medium w-6 flex flex-nowrap text-start items-center", !canExpand(data) && "pointer-events-none opacity-35"),
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__*/jsxRuntime.jsx(core.Icon, {
67
67
  className: "p-1 text-tint-700 hover:text-primary-600",
68
68
  icon: expanded ? core.CoreIcons.collapse : core.CoreIcons.expand,
@@ -30,7 +30,7 @@ var CheckboxCell = function CheckboxCell(_ref) {
30
30
  var state = _ref.state,
31
31
  _onClick = _ref.onClick;
32
32
  return /*#__PURE__*/jsxRuntime.jsx("div", {
33
- className: "group font-medium border-e w-6 flex flex-nowrap text-start items-center",
33
+ className: "group font-medium border-e w-6 flex flex-nowrap text-start py-1",
34
34
  children: /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
35
35
  icon: state === 2 ? core.CoreIcons.checkboxInt : state === 1 ? core.CoreIcons.checkboxOn : core.CoreIcons.checkboxOff,
36
36
  className: "p-1 text-tint-700 hover:text-primary-600",
@@ -0,0 +1,97 @@
1
+ 'use strict';
2
+
3
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
4
+ var core = require('@react-fabric/core');
5
+ var form = require('@react-fabric/form');
6
+ var utilities = require('@react-fabric/utilities');
7
+ var react = require('react');
8
+ var useFilteredList = require('../hooks/useFilteredList.js');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ var ListFilter = function ListFilter(_ref) {
12
+ var _ref$list = _ref.list,
13
+ list = _ref$list === void 0 ? utilities.EMPTY_ARRAY : _ref$list,
14
+ filter = _ref.filter,
15
+ onFilter = _ref.onFilter;
16
+ var _useState = react.useState(new Set(filter)),
17
+ _useState2 = _slicedToArray(_useState, 2),
18
+ selected = _useState2[0],
19
+ setSelected = _useState2[1];
20
+ var _useFilteredList = useFilteredList.useFilteredList(list, function (item, query) {
21
+ var _item$id;
22
+ return utilities.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__*/jsxRuntime.jsxs("div", {
28
+ className: "flex flex-col",
29
+ children: [/*#__PURE__*/jsxRuntime.jsx("div", {
30
+ children: /*#__PURE__*/jsxRuntime.jsx(form.Search, {
31
+ autoFocus: true,
32
+ value: query,
33
+ onSearch: onSearch,
34
+ searchOnChange: true
35
+ })
36
+ }), /*#__PURE__*/jsxRuntime.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__*/jsxRuntime.jsx("div", {
41
+ className: "flex gap-x-1 text-xs items-center",
42
+ children: /*#__PURE__*/jsxRuntime.jsx(form.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__*/jsxRuntime.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__*/jsxRuntime.jsx("span", {
57
+ className: "text-muted text-xs",
58
+ children: "No items found"
59
+ })]
60
+ }), /*#__PURE__*/jsxRuntime.jsx("div", {
61
+ className: "flex justify-end",
62
+ children: /*#__PURE__*/jsxRuntime.jsx(core.DropdownDismiss, {
63
+ children: /*#__PURE__*/jsxRuntime.jsx(core.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__*/jsxRuntime.jsxs("div", {
80
+ className: "flex flex-col min-w-[16rem]",
81
+ children: [list && /*#__PURE__*/jsxRuntime.jsx(ListFilter, {
82
+ list: list,
83
+ filter: filter,
84
+ onFilter: onFilter
85
+ }), !list && type === "string" && /*#__PURE__*/jsxRuntime.jsx(form.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
+ exports.ColumnFilters = ColumnFilters;
@@ -1,51 +1,37 @@
1
1
  'use strict';
2
2
 
3
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
+ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
3
5
  var core = require('@react-fabric/core');
6
+ var utilities = require('@react-fabric/utilities');
4
7
  var react = require('react');
8
+ var ColumnFilters = require('./ColumnFilters.js');
5
9
  var Context = require('./Context.js');
6
10
  var types = require('./types.js');
7
11
  var jsxRuntime = require('react/jsx-runtime');
8
12
 
9
- /*
10
- * React Fabric
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
- iconBg = _ref.iconBg,
37
- iconColor = _ref.iconColor,
38
- rtlFlip = _ref.rtlFlip;
39
- _ref.actions;
21
+ actions = _ref.actions;
40
22
  _ref.locked;
41
- var tooltip = _ref.tooltip,
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 = Context.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 = react.useCallback(function () {
42
+ var handleSort = react.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, name, sort, sortable]);
47
+ }, [onSort, sort, sortable]);
62
48
  var menus = react.useMemo(function () {
63
49
  var ret = [];
50
+ if (filterable && (dataType !== null && dataType !== void 0 ? dataType : filterOptions)) {
51
+ ret.push( /*#__PURE__*/jsxRuntime.jsx(core.Menu, {
52
+ label: "Filter",
53
+ icon: filter ? core.CoreIcons.tick : "",
54
+ trigger: "click",
55
+ children: /*#__PURE__*/jsxRuntime.jsx(ColumnFilters.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__*/jsxRuntime.jsx(core.MenuItem, {
66
67
  label: "Sort ascending",
67
- icon: core.CoreIcons.sortAsc
68
+ icon: core.CoreIcons.sortAsc,
69
+ onClick: function onClick() {
70
+ return handleSort("asc");
71
+ }
68
72
  }, "sort-asc"), /*#__PURE__*/jsxRuntime.jsx(core.MenuItem, {
69
73
  label: "Sort descending",
70
- icon: core.CoreIcons.sortDesc
74
+ icon: core.CoreIcons.sortDesc,
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__*/jsxRuntime.jsx(core.Divider, {}, "div"));
83
+ (_ret = ret).push.apply(_ret, _toConsumableArray(actions));
84
+ }
85
+ if (ret.length === 1) {
86
+ ret = [/*#__PURE__*/jsxRuntime.jsx(ColumnFilters.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__*/jsxRuntime.jsxs("div", {
76
98
  role: "none",
77
99
  "data-id": id,
78
- onClick: handleSort,
79
- className: "group font-medium border-e flex flex-nowrap text-start items-center table-header-cell",
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 : types.COL_DEFAULT_WIDTH,
82
106
  minWidth: minWidth !== null && minWidth !== void 0 ? minWidth : types.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__*/jsxRuntime.jsxs("div", {
89
113
  className: "flex-initial px-2 py-1 text-sm truncate sticky start-0",
90
- children: [icon && /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
91
- icon: icon,
92
- bg: iconBg,
93
- color: iconColor,
94
- rtlFlip: rtlFlip
95
- }), /*#__PURE__*/jsxRuntime.jsx("span", {
114
+ children: [icon && /*#__PURE__*/jsxRuntime.jsx(core.Icon, _objectSpread({}, core.getIconProps(icon))), /*#__PURE__*/jsxRuntime.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 && !utilities.isEmpty(filter) && /*#__PURE__*/jsxRuntime.jsx(core.Button, {
135
+ size: "sm",
136
+ variant: "link",
137
+ "aria-label": "clear filter",
138
+ stopPropagation: true,
139
+ icon: core.CoreIcons.funnelRemove,
140
+ onClick: function onClick() {
141
+ return _onFilter === null || _onFilter === void 0 ? void 0 : _onFilter(id);
142
+ }
115
143
  }), resizable && /*#__PURE__*/jsxRuntime.jsx("div", {
116
144
  role: "none",
117
145
  className: "cursor-col-resize border-e bg-transparent border-tint-200 w-[5px] self-stretch",
@@ -3,6 +3,7 @@
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
4
  var core = require('@react-fabric/core');
5
5
  var utilities = require('@react-fabric/utilities');
6
+ var classNames = require('classnames');
6
7
  var react = require('react');
7
8
  var reactI18next = require('react-i18next');
8
9
  var AddColumn = require('./AddColumn.js');
@@ -18,23 +19,31 @@ var jsxRuntime = require('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$, _state$start2, _state$cols2, _state$end2;
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 = reactI18next.useTranslation("data"),
39
48
  t = _useTranslation.t;
40
49
  var fireCheckChanged = core.useDebounce(function (checkedIds) {
@@ -43,17 +52,28 @@ var Table = function Table(_ref) {
43
52
  var _useTableColumns = useTableColumns.useTableColumns(columns),
44
53
  state = _useTableColumns.state,
45
54
  onHide = _useTableColumns.onHide;
46
- var _useVirtualTable = useVirtualTable.useVirtualTable(data, keyProperty, fireCheckChanged),
55
+ var _useVirtualTable = 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 = react.useRef(null);
59
79
  var wrapperStart = react.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__*/jsxRuntime.jsxs("div", {
113
- className: "bg-base font-medium sticky top-0 area-head border-b select-none flex flex-nowrap z-2",
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__*/jsxRuntime.jsxs("div", {
115
137
  className: wrapperStart,
116
138
  children: [canExpand && /*#__PURE__*/jsxRuntime.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__*/jsxRuntime.jsx(HeaderCell.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__*/jsxRuntime.jsx(HeaderCell.HeaderCell, _objectSpread(_objectSpread({}, col), {}, {
129
152
  sort: sort,
130
- onSort: onSort
153
+ onSort: onSort,
154
+ onFilter: onFilter
131
155
  }), idx);
132
156
  }), /*#__PURE__*/jsxRuntime.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__*/jsxRuntime.jsx(HeaderCell.HeaderCell, _objectSpread(_objectSpread({}, col), {}, {
136
160
  sort: sort,
137
- onSort: onSort
161
+ onSort: onSort,
162
+ onFilter: onFilter
138
163
  }), idx);
139
164
  }), hideableColumns && /*#__PURE__*/jsxRuntime.jsx(AddColumn.AddColumn, {
140
165
  onClick: onHide,
@@ -144,21 +169,42 @@ var Table = function Table(_ref) {
144
169
  })]
145
170
  })]
146
171
  }), loading && /*#__PURE__*/jsxRuntime.jsx(core.Loading, {}), data.length > 0 && /*#__PURE__*/jsxRuntime.jsxs("div", {
147
- className: "area-content flex flex-col flex-nowrap",
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__*/jsxRuntime.jsx("div", {
153
178
  style: {
154
- height: (_items$ = items[0]) === null || _items$ === void 0 ? void 0 : _items$.start
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__*/jsxRuntime.jsx(BodyRow.BodyRow, {
161
- rowKey: key,
186
+ return "__GROUP__" in data ? /*#__PURE__*/jsxRuntime.jsxs("div", {
187
+ ref: measureElement,
188
+ "data-index": index,
189
+ className: classNames("px-2 py-1 text-md bg-base border-y border-tint-100 cursor-pointer flex items-center 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__*/jsxRuntime.jsx(core.Icon, {
195
+ rtlFlip: true,
196
+ icon: data.open ? core.CoreIcons.chevronDown : core.CoreIcons.chevronRight
197
+ }), (_groupRenderer = groupRenderer === null || groupRenderer === void 0 ? void 0 : groupRenderer(data)) !== null && _groupRenderer !== void 0 ? _groupRenderer : /*#__PURE__*/jsxRuntime.jsxs("div", {
198
+ className: "flex gap-1 items-center",
199
+ children: [/*#__PURE__*/jsxRuntime.jsx("span", {
200
+ children: data.key
201
+ }), /*#__PURE__*/jsxRuntime.jsxs("span", {
202
+ className: "text-sm",
203
+ children: ["(", data.itemCount, ")"]
204
+ })]
205
+ })]
206
+ }, key) : /*#__PURE__*/jsxRuntime.jsx(BodyRow.BodyRow, {
207
+ rowKey: key.toString(),
162
208
  index: index,
163
209
  checkableRows: checkableRows,
164
210
  checked: keyProperty && checkState.checked.includes(data[keyProperty]) ? 1 : 0,
@@ -27,6 +27,35 @@ 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
  exports.COL_DEFAULT_WIDTH = COL_DEFAULT_WIDTH;
31
60
  exports.COL_MAX_WIDTH = COL_MAX_WIDTH;
32
61
  exports.COL_MIN_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$parentElement;
48
- var parentBox = (_colEl$parentElement = colEl.parentElement) === null || _colEl$parentElement === void 0 ? void 0 : _colEl$parentElement.getBoundingClientRect();
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(box.right - parentBox.right, "px");
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 - parentBox.left, "px");
54
+ placeholder.style.left = "".concat(box.left, "px");
55
55
  }
56
56
  }
57
57
  placeholder.style.width = "".concat(colEl.offsetWidth, "px");