@react-fabric/data 1.0.0-beta.1 → 1.0.0-beta.4

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.
@@ -0,0 +1,134 @@
1
+ 'use strict';
2
+
3
+ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
4
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
+ var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
6
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
7
+ var core = require('@react-fabric/core');
8
+ var utilities = require('@react-fabric/utilities');
9
+ var react = require('react');
10
+ var reactI18next = require('react-i18next');
11
+ var useSelectableList = require('../hooks/useSelectableList.js');
12
+ var jsxRuntime = require('react/jsx-runtime');
13
+
14
+ var _excluded = ["items", "maxCount", "allowNegative", "emptyMessage", "sortItems"];
15
+ 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; }
16
+ 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; }
17
+ var CheckItem = /*#__PURE__*/react.memo(function (_ref) {
18
+ var id = _ref.id,
19
+ allowNegative = _ref.allowNegative,
20
+ selected = _ref.selected,
21
+ icon = _ref.icon,
22
+ label = _ref.label,
23
+ isDisabled = _ref.isDisabled,
24
+ _onClick = _ref.onClick,
25
+ badge = _ref.badge;
26
+ return /*#__PURE__*/jsxRuntime.jsxs("div", {
27
+ role: "none",
28
+ className: "ax-checkList__item",
29
+ "data-disabled": isDisabled,
30
+ onClick: function onClick() {
31
+ return _onClick(id, false);
32
+ },
33
+ onContextMenu: function onContextMenu(e) {
34
+ return [allowNegative && _onClick(id, true), e.preventDefault()];
35
+ },
36
+ children: [!allowNegative && /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
37
+ "data-type": "checkbox",
38
+ className: "ax-checkList__checkbox",
39
+ "data-selected": selected === 1,
40
+ icon: selected ? core.CoreIcons.checkboxInt : core.CoreIcons.checkboxOff
41
+ }), allowNegative && /*#__PURE__*/jsxRuntime.jsxs(react.Fragment, {
42
+ children: [/*#__PURE__*/jsxRuntime.jsx(core.Icon, {
43
+ "data-type": "multiple",
44
+ className: "ax-checkList__checkbox",
45
+ icon: selected === 1 ? core.CoreIcons.expand : selected === -1 ? core.CoreIcons.collapse : core.CoreIcons.checkboxOff,
46
+ "data-selected": selected
47
+ }), /*#__PURE__*/jsxRuntime.jsxs("div", {
48
+ className: "ax-checkList__checkbox",
49
+ children: [/*#__PURE__*/jsxRuntime.jsx(core.Icon, {
50
+ "data-type": "positive",
51
+ onClick: function onClick(e) {
52
+ return [(_onClick(id, false), e.stopPropagation())];
53
+ },
54
+ icon: selected === 1 ? core.CoreIcons.expandActive : core.CoreIcons.expand,
55
+ "data-selected": selected === 1
56
+ }), /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
57
+ "data-type": "negative",
58
+ onClick: function onClick(e) {
59
+ return [(_onClick(id, true), e.stopPropagation())];
60
+ },
61
+ icon: selected === -1 ? core.CoreIcons.collapseActive : core.CoreIcons.collapse,
62
+ "data-selected": selected === -1
63
+ })]
64
+ })]
65
+ }), /*#__PURE__*/react.isValidElement(icon) && icon, utilities.isString(icon) && /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
66
+ icon: icon
67
+ }), /*#__PURE__*/jsxRuntime.jsx("label", {
68
+ children: label
69
+ }), /*#__PURE__*/jsxRuntime.jsx(core.Badge, _objectSpread({}, badge))]
70
+ });
71
+ });
72
+ CheckItem.displayName = "CheckItem";
73
+ var CheckList = function CheckList(_ref2) {
74
+ var _ref2$items = _ref2.items,
75
+ items = _ref2$items === void 0 ? [] : _ref2$items,
76
+ _ref2$maxCount = _ref2.maxCount,
77
+ maxCount = _ref2$maxCount === void 0 ? 0 : _ref2$maxCount,
78
+ allowNegative = _ref2.allowNegative,
79
+ emptyMessage = _ref2.emptyMessage,
80
+ _ref2$sortItems = _ref2.sortItems,
81
+ sortItems = _ref2$sortItems === void 0 ? true : _ref2$sortItems,
82
+ props = _objectWithoutProperties(_ref2, _excluded);
83
+ var _useTranslation = reactI18next.useTranslation("data"),
84
+ t = _useTranslation.t;
85
+ var _useSelectableList = useSelectableList.useSelectableList(_objectSpread({
86
+ items: items
87
+ }, props)),
88
+ selection = _useSelectableList.selection,
89
+ toggleSelection = _useSelectableList.toggleSelection;
90
+ var _useState = react.useState(false),
91
+ _useState2 = _slicedToArray(_useState, 2),
92
+ showMore = _useState2[0],
93
+ setShowMore = _useState2[1];
94
+ react.useEffect(function () {
95
+ setShowMore(false);
96
+ }, [items]);
97
+ var listItems = react.useMemo(function () {
98
+ return _toConsumableArray(items).sort(function (a, b) {
99
+ if (sortItems && selection[a.id] !== selection[b.id]) {
100
+ if (selection[a.id] === 1) return -1;
101
+ if (selection[b.id] === 1) return 1;
102
+ if (selection[a.id] === -1) return -1;
103
+ if (selection[b.id] === -1) return 1;
104
+ }
105
+ return 0;
106
+ }).slice(0, !showMore && maxCount > 0 ? maxCount : undefined);
107
+ }, [items, selection, maxCount, showMore, sortItems]);
108
+ return /*#__PURE__*/jsxRuntime.jsxs("div", {
109
+ className: "ax-checkList",
110
+ children: [listItems.map(function (item, index) {
111
+ return /*#__PURE__*/react.createElement(CheckItem, _objectSpread(_objectSpread({}, item), {}, {
112
+ key: index,
113
+ onClick: toggleSelection,
114
+ allowNegative: allowNegative,
115
+ selected: selection[item.id]
116
+ }));
117
+ }), maxCount > 0 && items.length > maxCount && /*#__PURE__*/jsxRuntime.jsx("div", {
118
+ className: "ax-moreLink",
119
+ children: /*#__PURE__*/jsxRuntime.jsxs("span", {
120
+ role: "none",
121
+ className: "link",
122
+ onClick: function onClick() {
123
+ return setShowMore(!showMore);
124
+ },
125
+ children: ["...", t("core:action.".concat(showMore ? "less" : "more"))]
126
+ })
127
+ }), listItems.length === 0 && /*#__PURE__*/jsxRuntime.jsx(core.EmptyContent, {
128
+ className: "text-sm",
129
+ message: emptyMessage !== null && emptyMessage !== void 0 ? emptyMessage : t("checkList.empty")
130
+ })]
131
+ });
132
+ };
133
+
134
+ exports.CheckList = CheckList;
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
+ var react = require('react');
6
+
7
+ 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; }
8
+ 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; }
9
+ var useSelectableList = function useSelectableList(_ref) {
10
+ var items = _ref.items,
11
+ selected = _ref.selected,
12
+ nonselected = _ref.nonselected,
13
+ onChange = _ref.onChange,
14
+ onClick = _ref.onClick;
15
+ var selectionRef = react.useRef({});
16
+ var _useState = react.useState({}),
17
+ _useState2 = _slicedToArray(_useState, 2),
18
+ selection = _useState2[0],
19
+ setSelection = _useState2[1];
20
+ var _useTransition = react.useTransition(),
21
+ _useTransition2 = _slicedToArray(_useTransition, 2),
22
+ startTransition = _useTransition2[1];
23
+ react.useEffect(function () {
24
+ selectionRef.current = items.reduce(function (ret, _ref2) {
25
+ var _selected$includes, _nonselected$includes;
26
+ var id = _ref2.id;
27
+ return _objectSpread(_objectSpread({}, ret), {}, _defineProperty({}, id, selected !== null && selected !== void 0 && (_selected$includes = selected.includes) !== null && _selected$includes !== void 0 && _selected$includes.call(selected, id) ? 1 : nonselected !== null && nonselected !== void 0 && (_nonselected$includes = nonselected.includes) !== null && _nonselected$includes !== void 0 && _nonselected$includes.call(nonselected, id) ? -1 : 0));
28
+ }, {});
29
+ setSelection(_objectSpread({}, selectionRef.current));
30
+ }, [items, selected, nonselected]);
31
+ var toggleSelection = react.useCallback(function (id) {
32
+ var isNegative = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
33
+ var check = isNegative ? -1 : 1;
34
+ if (selectionRef.current[id] !== check) selectionRef.current[id] = check;else if (selectionRef.current[id] === check) selectionRef.current[id] = 0;
35
+ var change = [[], []];
36
+ Object.entries(selectionRef.current).forEach(function (_ref3) {
37
+ var _ref4 = _slicedToArray(_ref3, 2),
38
+ id = _ref4[0],
39
+ select = _ref4[1];
40
+ return select === 1 ? change[0].push(id) : select === -1 ? change[1].push(id) : undefined;
41
+ });
42
+ setSelection(_objectSpread({}, selectionRef.current));
43
+ startTransition(function () {
44
+ onClick === null || onClick === void 0 || onClick(id, isNegative);
45
+ onChange === null || onChange === void 0 || onChange(change[0], change[1]);
46
+ });
47
+ }, []);
48
+ return {
49
+ selection: selection,
50
+ toggleSelection: toggleSelection
51
+ };
52
+ };
53
+
54
+ exports.useSelectableList = useSelectableList;
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  require('./i18n/index.js');
4
+ var CheckList = require('./checklist/CheckList.js');
4
5
  var Histogram = require('./histogram/Histogram.js');
5
6
  var JsonViewer = require('./json/JsonViewer.js');
6
7
  var Pagination = require('./pagination/Pagination.js');
@@ -13,6 +14,7 @@ var usePagination = require('./hooks/usePagination.js');
13
14
 
14
15
 
15
16
 
17
+ exports.CheckList = CheckList.CheckList;
16
18
  exports.Histogram = Histogram.Histogram;
17
19
  exports.JsonViewer = JsonViewer.JsonViewer;
18
20
  exports.Pagination = Pagination.Pagination;
@@ -19,7 +19,8 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
19
19
  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
20
  var Table = function Table(_ref) {
21
21
  var _state$start, _state$cols, _state$end, _items$, _state$start3, _state$cols3, _state$end3;
22
- var data = _ref.data,
22
+ var ref = _ref.ref,
23
+ data = _ref.data,
23
24
  columns = _ref.columns,
24
25
  keyProperty = _ref.keyProperty,
25
26
  checkableRows = _ref.checkableRows,
@@ -46,12 +47,42 @@ var Table = function Table(_ref) {
46
47
  getData = _useVirtualTable.getData,
47
48
  totalSize = _useVirtualTable.totalSize,
48
49
  measureElement = _useVirtualTable.measureElement;
50
+ var refBody = react.useRef(null);
49
51
  var wrapperStart = react.useMemo(function () {
50
52
  return "bg-inherit sticky start-0 flex flex-nowrap z-1";
51
53
  }, []);
52
54
  var wrapperEnd = react.useMemo(function () {
53
55
  return "bg-inherit sticky end-0 flex flex-nowrap z-1 border-s -ms-px";
54
56
  }, []);
57
+ react.useImperativeHandle(ref, function () {
58
+ return {
59
+ hilight: function hilight(row) {
60
+ var _refBody$current, _refBody$current2;
61
+ (_refBody$current = refBody.current) === null || _refBody$current === void 0 || _refBody$current.querySelectorAll(".datatable-row[data-hilight=\"true\"]").forEach(function (el) {
62
+ return el && (el.dataset.hilight = undefined);
63
+ });
64
+ var el = (_refBody$current2 = refBody.current) === null || _refBody$current2 === void 0 ? void 0 : _refBody$current2.querySelector("[data-row=\"".concat(row, "\"]"));
65
+ el === null || el === void 0 || el.scrollIntoView({
66
+ behavior: "smooth",
67
+ block: "center"
68
+ });
69
+ el && (el.dataset.hilight = "true");
70
+ },
71
+ unhilight: function unhilight() {
72
+ var _refBody$current3;
73
+ (_refBody$current3 = refBody.current) === null || _refBody$current3 === void 0 || _refBody$current3.querySelectorAll(".datatable-row[data-hilight=\"true\"]").forEach(function (el) {
74
+ return el && (el.dataset.hilight = undefined);
75
+ });
76
+ },
77
+ scrollTo: function scrollTo(row) {
78
+ var _refBody$current4;
79
+ var el = (_refBody$current4 = refBody.current) === null || _refBody$current4 === void 0 ? void 0 : _refBody$current4.querySelector("[data-row=\"".concat(row, "\"]"));
80
+ el === null || el === void 0 || el.scrollIntoView({
81
+ behavior: "smooth"
82
+ });
83
+ }
84
+ };
85
+ }, []);
55
86
  return /*#__PURE__*/jsxRuntime.jsx(Context.TableProvider, {
56
87
  children: /*#__PURE__*/jsxRuntime.jsxs("div", {
57
88
  className: "grid area-content overflow-auto relative",
@@ -96,6 +127,7 @@ var Table = function Table(_ref) {
96
127
  style: {
97
128
  height: totalSize()
98
129
  },
130
+ ref: refBody,
99
131
  children: [/*#__PURE__*/jsxRuntime.jsx("div", {
100
132
  style: {
101
133
  height: (_items$ = items[0]) === null || _items$ === void 0 ? void 0 : _items$.start
@@ -107,15 +139,16 @@ var Table = function Table(_ref) {
107
139
  var data = getData(index);
108
140
  return /*#__PURE__*/jsxRuntime.jsxs("div", {
109
141
  role: "none",
110
- className: classNames("flex flex-nowrap", index % 2 ? "bg-even" : "bg-odd", onRowClick && "hover:bg-primary-50 active:bg-primary-100"),
142
+ "data-row": index,
143
+ className: classNames("flex flex-nowrap datatable-row data-[hilight]:outline-1 -outline-offset-1 outline-primary-500", index % 2 ? "bg-even" : "bg-odd", onRowClick && "hover:bg-primary-50 active:bg-primary-100"),
111
144
  onClick: function onClick() {
112
- return checkableRows && !onRowClick ? toggleChecked(data[keyProperty]) : onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(data);
145
+ return checkableRows && keyProperty && !onRowClick ? toggleChecked(data[keyProperty]) : onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(data);
113
146
  },
114
147
  "data-index": index,
115
148
  ref: measureElement,
116
149
  children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
117
150
  className: wrapperStart,
118
- children: [checkableRows && /*#__PURE__*/jsxRuntime.jsx(CheckboxCell.CheckboxCell, {
151
+ children: [checkableRows && keyProperty && /*#__PURE__*/jsxRuntime.jsx(CheckboxCell.CheckboxCell, {
119
152
  onClick: function onClick() {
120
153
  return toggleChecked(data[keyProperty]);
121
154
  },
@@ -28,13 +28,13 @@ var useVirtualTable = function useVirtualTable(data, keyProperty, onCheckChanged
28
28
  if (action.type === "checkall") {
29
29
  if (state.allChecked !== 0) {
30
30
  state.checked = [];
31
- } else {
31
+ } else if (keyProperty) {
32
32
  state.checked = data.map(function (item) {
33
33
  return item[keyProperty];
34
34
  });
35
35
  }
36
36
  }
37
- onCheckChanged(state.checked);
37
+ onCheckChanged === null || onCheckChanged === void 0 || onCheckChanged(state.checked);
38
38
  return _objectSpread(_objectSpread({}, state), {}, {
39
39
  allChecked: state.checked.length === data.length ? 1 : state.checked.length ? 2 : 0
40
40
  });
@@ -11,12 +11,13 @@ var types = require('./types.js');
11
11
  var useTree = require('./useTree.js');
12
12
  var jsxRuntime = require('react/jsx-runtime');
13
13
 
14
- var _excluded = ["items", "selected", "checked", "checkable", "noLines", "renderer", "searchable", "selectable", "matcher", "filterPlaceholder", "defaultLeafIcon", "defaultNodeIcon", "expander", "onChecked", "onLoad", "onSelect"];
14
+ var _excluded = ["ref", "items", "selected", "checked", "checkable", "noLines", "renderer", "searchable", "selectable", "matcher", "filterPlaceholder", "defaultLeafIcon", "defaultNodeIcon", "expander", "onChecked", "onLoad", "onSelect"];
15
15
  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; }
16
16
  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; }
17
17
  var TreePanel = function TreePanel(_ref) {
18
18
  var _virtualItems$;
19
- var items = _ref.items,
19
+ var ref = _ref.ref,
20
+ items = _ref.items,
20
21
  selected = _ref.selected,
21
22
  checked = _ref.checked,
22
23
  checkable = _ref.checkable,
@@ -48,6 +49,7 @@ var TreePanel = function TreePanel(_ref) {
48
49
  expandAll = _useTree.expandAll,
49
50
  collapseAll = _useTree.collapseAll,
50
51
  select = _useTree.select,
52
+ expand = _useTree.expand,
51
53
  onFilter = _useTree.onFilter;
52
54
  var scrollerRef = react.useRef(null);
53
55
  var virtualizer = reactVirtual.useVirtualizer({
@@ -66,6 +68,16 @@ var TreePanel = function TreePanel(_ref) {
66
68
  if (expander === "folder") return [core.CoreIcons.folderClosed, core.CoreIcons.folderOpen];
67
69
  return [core.CoreIcons.expand, core.CoreIcons.collapse];
68
70
  }, [expander]);
71
+ react.useImperativeHandle(ref, function () {
72
+ return {
73
+ open: function open(id) {
74
+ return expand(id);
75
+ },
76
+ select: function select(id) {
77
+ return expand(id);
78
+ }
79
+ };
80
+ }, []);
69
81
  return /*#__PURE__*/jsxRuntime.jsxs(core.Section, {
70
82
  children: [/*#__PURE__*/jsxRuntime.jsxs(core.Header, {
71
83
  flex: true,
@@ -151,6 +151,12 @@ var useTree = function useTree(_ref) {
151
151
  id: id
152
152
  });
153
153
  }, []);
154
+ var expand = react.useCallback(function (id) {
155
+ dispatch({
156
+ type: "expand",
157
+ id: id
158
+ });
159
+ }, []);
154
160
  var expandAll = react.useCallback(function () {
155
161
  dispatch({
156
162
  type: "expandAll"
@@ -174,6 +180,7 @@ var useTree = function useTree(_ref) {
174
180
  collapseAll: collapseAll,
175
181
  toggleCheck: toggleCheck,
176
182
  select: select,
183
+ expand: expand,
177
184
  onFilter: onFilter
178
185
  };
179
186
  };
@@ -0,0 +1,134 @@
1
+ 'use client';
2
+
3
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
4
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
6
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
7
+ import { Icon, CoreIcons, Badge, EmptyContent } from '@react-fabric/core';
8
+ import { isString } from '@react-fabric/utilities';
9
+ import { memo, Fragment, isValidElement, useState, useEffect, useMemo, createElement } from 'react';
10
+ import { useTranslation } from 'react-i18next';
11
+ import { useSelectableList } from '../hooks/useSelectableList.js';
12
+ import { jsxs, jsx } from 'react/jsx-runtime';
13
+
14
+ var _excluded = ["items", "maxCount", "allowNegative", "emptyMessage", "sortItems"];
15
+ 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; }
16
+ 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; }
17
+ var CheckItem = /*#__PURE__*/memo(function (_ref) {
18
+ var id = _ref.id,
19
+ allowNegative = _ref.allowNegative,
20
+ selected = _ref.selected,
21
+ icon = _ref.icon,
22
+ label = _ref.label,
23
+ isDisabled = _ref.isDisabled,
24
+ _onClick = _ref.onClick,
25
+ badge = _ref.badge;
26
+ return /*#__PURE__*/jsxs("div", {
27
+ role: "none",
28
+ className: "ax-checkList__item",
29
+ "data-disabled": isDisabled,
30
+ onClick: function onClick() {
31
+ return _onClick(id, false);
32
+ },
33
+ onContextMenu: function onContextMenu(e) {
34
+ return [allowNegative && _onClick(id, true), e.preventDefault()];
35
+ },
36
+ children: [!allowNegative && /*#__PURE__*/jsx(Icon, {
37
+ "data-type": "checkbox",
38
+ className: "ax-checkList__checkbox",
39
+ "data-selected": selected === 1,
40
+ icon: selected ? CoreIcons.checkboxInt : CoreIcons.checkboxOff
41
+ }), allowNegative && /*#__PURE__*/jsxs(Fragment, {
42
+ children: [/*#__PURE__*/jsx(Icon, {
43
+ "data-type": "multiple",
44
+ className: "ax-checkList__checkbox",
45
+ icon: selected === 1 ? CoreIcons.expand : selected === -1 ? CoreIcons.collapse : CoreIcons.checkboxOff,
46
+ "data-selected": selected
47
+ }), /*#__PURE__*/jsxs("div", {
48
+ className: "ax-checkList__checkbox",
49
+ children: [/*#__PURE__*/jsx(Icon, {
50
+ "data-type": "positive",
51
+ onClick: function onClick(e) {
52
+ return [(_onClick(id, false), e.stopPropagation())];
53
+ },
54
+ icon: selected === 1 ? CoreIcons.expandActive : CoreIcons.expand,
55
+ "data-selected": selected === 1
56
+ }), /*#__PURE__*/jsx(Icon, {
57
+ "data-type": "negative",
58
+ onClick: function onClick(e) {
59
+ return [(_onClick(id, true), e.stopPropagation())];
60
+ },
61
+ icon: selected === -1 ? CoreIcons.collapseActive : CoreIcons.collapse,
62
+ "data-selected": selected === -1
63
+ })]
64
+ })]
65
+ }), /*#__PURE__*/isValidElement(icon) && icon, isString(icon) && /*#__PURE__*/jsx(Icon, {
66
+ icon: icon
67
+ }), /*#__PURE__*/jsx("label", {
68
+ children: label
69
+ }), /*#__PURE__*/jsx(Badge, _objectSpread({}, badge))]
70
+ });
71
+ });
72
+ CheckItem.displayName = "CheckItem";
73
+ var CheckList = function CheckList(_ref2) {
74
+ var _ref2$items = _ref2.items,
75
+ items = _ref2$items === void 0 ? [] : _ref2$items,
76
+ _ref2$maxCount = _ref2.maxCount,
77
+ maxCount = _ref2$maxCount === void 0 ? 0 : _ref2$maxCount,
78
+ allowNegative = _ref2.allowNegative,
79
+ emptyMessage = _ref2.emptyMessage,
80
+ _ref2$sortItems = _ref2.sortItems,
81
+ sortItems = _ref2$sortItems === void 0 ? true : _ref2$sortItems,
82
+ props = _objectWithoutProperties(_ref2, _excluded);
83
+ var _useTranslation = useTranslation("data"),
84
+ t = _useTranslation.t;
85
+ var _useSelectableList = useSelectableList(_objectSpread({
86
+ items: items
87
+ }, props)),
88
+ selection = _useSelectableList.selection,
89
+ toggleSelection = _useSelectableList.toggleSelection;
90
+ var _useState = useState(false),
91
+ _useState2 = _slicedToArray(_useState, 2),
92
+ showMore = _useState2[0],
93
+ setShowMore = _useState2[1];
94
+ useEffect(function () {
95
+ setShowMore(false);
96
+ }, [items]);
97
+ var listItems = useMemo(function () {
98
+ return _toConsumableArray(items).sort(function (a, b) {
99
+ if (sortItems && selection[a.id] !== selection[b.id]) {
100
+ if (selection[a.id] === 1) return -1;
101
+ if (selection[b.id] === 1) return 1;
102
+ if (selection[a.id] === -1) return -1;
103
+ if (selection[b.id] === -1) return 1;
104
+ }
105
+ return 0;
106
+ }).slice(0, !showMore && maxCount > 0 ? maxCount : undefined);
107
+ }, [items, selection, maxCount, showMore, sortItems]);
108
+ return /*#__PURE__*/jsxs("div", {
109
+ className: "ax-checkList",
110
+ children: [listItems.map(function (item, index) {
111
+ return /*#__PURE__*/createElement(CheckItem, _objectSpread(_objectSpread({}, item), {}, {
112
+ key: index,
113
+ onClick: toggleSelection,
114
+ allowNegative: allowNegative,
115
+ selected: selection[item.id]
116
+ }));
117
+ }), maxCount > 0 && items.length > maxCount && /*#__PURE__*/jsx("div", {
118
+ className: "ax-moreLink",
119
+ children: /*#__PURE__*/jsxs("span", {
120
+ role: "none",
121
+ className: "link",
122
+ onClick: function onClick() {
123
+ return setShowMore(!showMore);
124
+ },
125
+ children: ["...", t("core:action.".concat(showMore ? "less" : "more"))]
126
+ })
127
+ }), listItems.length === 0 && /*#__PURE__*/jsx(EmptyContent, {
128
+ className: "text-sm",
129
+ message: emptyMessage !== null && emptyMessage !== void 0 ? emptyMessage : t("checkList.empty")
130
+ })]
131
+ });
132
+ };
133
+
134
+ export { CheckList };
@@ -0,0 +1,54 @@
1
+ 'use client';
2
+
3
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
+ import { useRef, useState, useTransition, useEffect, useCallback } from 'react';
6
+
7
+ 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; }
8
+ 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; }
9
+ var useSelectableList = function useSelectableList(_ref) {
10
+ var items = _ref.items,
11
+ selected = _ref.selected,
12
+ nonselected = _ref.nonselected,
13
+ onChange = _ref.onChange,
14
+ onClick = _ref.onClick;
15
+ var selectionRef = useRef({});
16
+ var _useState = useState({}),
17
+ _useState2 = _slicedToArray(_useState, 2),
18
+ selection = _useState2[0],
19
+ setSelection = _useState2[1];
20
+ var _useTransition = useTransition(),
21
+ _useTransition2 = _slicedToArray(_useTransition, 2),
22
+ startTransition = _useTransition2[1];
23
+ useEffect(function () {
24
+ selectionRef.current = items.reduce(function (ret, _ref2) {
25
+ var _selected$includes, _nonselected$includes;
26
+ var id = _ref2.id;
27
+ return _objectSpread(_objectSpread({}, ret), {}, _defineProperty({}, id, selected !== null && selected !== void 0 && (_selected$includes = selected.includes) !== null && _selected$includes !== void 0 && _selected$includes.call(selected, id) ? 1 : nonselected !== null && nonselected !== void 0 && (_nonselected$includes = nonselected.includes) !== null && _nonselected$includes !== void 0 && _nonselected$includes.call(nonselected, id) ? -1 : 0));
28
+ }, {});
29
+ setSelection(_objectSpread({}, selectionRef.current));
30
+ }, [items, selected, nonselected]);
31
+ var toggleSelection = useCallback(function (id) {
32
+ var isNegative = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
33
+ var check = isNegative ? -1 : 1;
34
+ if (selectionRef.current[id] !== check) selectionRef.current[id] = check;else if (selectionRef.current[id] === check) selectionRef.current[id] = 0;
35
+ var change = [[], []];
36
+ Object.entries(selectionRef.current).forEach(function (_ref3) {
37
+ var _ref4 = _slicedToArray(_ref3, 2),
38
+ id = _ref4[0],
39
+ select = _ref4[1];
40
+ return select === 1 ? change[0].push(id) : select === -1 ? change[1].push(id) : undefined;
41
+ });
42
+ setSelection(_objectSpread({}, selectionRef.current));
43
+ startTransition(function () {
44
+ onClick === null || onClick === void 0 || onClick(id, isNegative);
45
+ onChange === null || onChange === void 0 || onChange(change[0], change[1]);
46
+ });
47
+ }, []);
48
+ return {
49
+ selection: selection,
50
+ toggleSelection: toggleSelection
51
+ };
52
+ };
53
+
54
+ export { useSelectableList };
package/dist/esm/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import './i18n/index.js';
4
+ export { CheckList } from './checklist/CheckList.js';
4
5
  export { Histogram } from './histogram/Histogram.js';
5
6
  export { JsonViewer } from './json/JsonViewer.js';
6
7
  export { Pagination } from './pagination/Pagination.js';
@@ -3,7 +3,7 @@
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
4
  import { useDebounce, Loading, EmptyContent } from '@react-fabric/core';
5
5
  import classNames from 'classnames';
6
- import { useMemo } from 'react';
6
+ import { useRef, useMemo, useImperativeHandle } from 'react';
7
7
  import { useTranslation } from 'react-i18next';
8
8
  import { AddColumn } from './AddColumn.js';
9
9
  import { BodyCell } from './BodyCell.js';
@@ -19,7 +19,8 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
19
19
  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
20
  var Table = function Table(_ref) {
21
21
  var _state$start, _state$cols, _state$end, _items$, _state$start3, _state$cols3, _state$end3;
22
- var data = _ref.data,
22
+ var ref = _ref.ref,
23
+ data = _ref.data,
23
24
  columns = _ref.columns,
24
25
  keyProperty = _ref.keyProperty,
25
26
  checkableRows = _ref.checkableRows,
@@ -46,12 +47,42 @@ var Table = function Table(_ref) {
46
47
  getData = _useVirtualTable.getData,
47
48
  totalSize = _useVirtualTable.totalSize,
48
49
  measureElement = _useVirtualTable.measureElement;
50
+ var refBody = useRef(null);
49
51
  var wrapperStart = useMemo(function () {
50
52
  return "bg-inherit sticky start-0 flex flex-nowrap z-1";
51
53
  }, []);
52
54
  var wrapperEnd = useMemo(function () {
53
55
  return "bg-inherit sticky end-0 flex flex-nowrap z-1 border-s -ms-px";
54
56
  }, []);
57
+ useImperativeHandle(ref, function () {
58
+ return {
59
+ hilight: function hilight(row) {
60
+ var _refBody$current, _refBody$current2;
61
+ (_refBody$current = refBody.current) === null || _refBody$current === void 0 || _refBody$current.querySelectorAll(".datatable-row[data-hilight=\"true\"]").forEach(function (el) {
62
+ return el && (el.dataset.hilight = undefined);
63
+ });
64
+ var el = (_refBody$current2 = refBody.current) === null || _refBody$current2 === void 0 ? void 0 : _refBody$current2.querySelector("[data-row=\"".concat(row, "\"]"));
65
+ el === null || el === void 0 || el.scrollIntoView({
66
+ behavior: "smooth",
67
+ block: "center"
68
+ });
69
+ el && (el.dataset.hilight = "true");
70
+ },
71
+ unhilight: function unhilight() {
72
+ var _refBody$current3;
73
+ (_refBody$current3 = refBody.current) === null || _refBody$current3 === void 0 || _refBody$current3.querySelectorAll(".datatable-row[data-hilight=\"true\"]").forEach(function (el) {
74
+ return el && (el.dataset.hilight = undefined);
75
+ });
76
+ },
77
+ scrollTo: function scrollTo(row) {
78
+ var _refBody$current4;
79
+ var el = (_refBody$current4 = refBody.current) === null || _refBody$current4 === void 0 ? void 0 : _refBody$current4.querySelector("[data-row=\"".concat(row, "\"]"));
80
+ el === null || el === void 0 || el.scrollIntoView({
81
+ behavior: "smooth"
82
+ });
83
+ }
84
+ };
85
+ }, []);
55
86
  return /*#__PURE__*/jsx(TableProvider, {
56
87
  children: /*#__PURE__*/jsxs("div", {
57
88
  className: "grid area-content overflow-auto relative",
@@ -96,6 +127,7 @@ var Table = function Table(_ref) {
96
127
  style: {
97
128
  height: totalSize()
98
129
  },
130
+ ref: refBody,
99
131
  children: [/*#__PURE__*/jsx("div", {
100
132
  style: {
101
133
  height: (_items$ = items[0]) === null || _items$ === void 0 ? void 0 : _items$.start
@@ -107,15 +139,16 @@ var Table = function Table(_ref) {
107
139
  var data = getData(index);
108
140
  return /*#__PURE__*/jsxs("div", {
109
141
  role: "none",
110
- className: classNames("flex flex-nowrap", index % 2 ? "bg-even" : "bg-odd", onRowClick && "hover:bg-primary-50 active:bg-primary-100"),
142
+ "data-row": index,
143
+ className: classNames("flex flex-nowrap datatable-row data-[hilight]:outline-1 -outline-offset-1 outline-primary-500", index % 2 ? "bg-even" : "bg-odd", onRowClick && "hover:bg-primary-50 active:bg-primary-100"),
111
144
  onClick: function onClick() {
112
- return checkableRows && !onRowClick ? toggleChecked(data[keyProperty]) : onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(data);
145
+ return checkableRows && keyProperty && !onRowClick ? toggleChecked(data[keyProperty]) : onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(data);
113
146
  },
114
147
  "data-index": index,
115
148
  ref: measureElement,
116
149
  children: [/*#__PURE__*/jsxs("div", {
117
150
  className: wrapperStart,
118
- children: [checkableRows && /*#__PURE__*/jsx(CheckboxCell, {
151
+ children: [checkableRows && keyProperty && /*#__PURE__*/jsx(CheckboxCell, {
119
152
  onClick: function onClick() {
120
153
  return toggleChecked(data[keyProperty]);
121
154
  },