@pingux/astro 2.20.0-alpha.8 → 2.20.0-alpha.9
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/lib/cjs/components/TreeView/TreeView.js +100 -0
- package/lib/cjs/components/TreeView/TreeView.mdx +16 -0
- package/lib/cjs/components/TreeView/TreeView.stories.js +89 -0
- package/lib/cjs/components/TreeView/TreeView.styles.js +32 -0
- package/lib/cjs/components/TreeView/TreeView.test.js +124 -0
- package/lib/cjs/components/TreeView/TreeViewItem.js +74 -0
- package/lib/cjs/components/TreeView/TreeViewRow.js +147 -0
- package/lib/cjs/components/TreeView/TreeViewSection.js +88 -0
- package/lib/cjs/components/TreeView/index.js +28 -0
- package/lib/cjs/context/TreeViewContext/index.js +14 -0
- package/lib/cjs/index.d.ts +3 -1
- package/lib/cjs/index.js +30 -4
- package/lib/cjs/styles/variants/variants.js +3 -1
- package/lib/components/TreeView/TreeView.js +89 -0
- package/lib/components/TreeView/TreeView.mdx +16 -0
- package/lib/components/TreeView/TreeView.stories.js +79 -0
- package/lib/components/TreeView/TreeView.styles.js +24 -0
- package/lib/components/TreeView/TreeView.test.js +121 -0
- package/lib/components/TreeView/TreeViewItem.js +60 -0
- package/lib/components/TreeView/TreeViewRow.js +135 -0
- package/lib/components/TreeView/TreeViewSection.js +74 -0
- package/lib/components/TreeView/index.js +3 -0
- package/lib/context/TreeViewContext/index.js +5 -0
- package/lib/index.js +3 -1
- package/lib/styles/variants/variants.js +3 -1
- package/package.json +1 -1
@@ -0,0 +1,88 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
|
4
|
+
var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
|
5
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
6
|
+
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
|
7
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
8
|
+
_Object$defineProperty(exports, "__esModule", {
|
9
|
+
value: true
|
10
|
+
});
|
11
|
+
exports["default"] = void 0;
|
12
|
+
var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
|
13
|
+
var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));
|
14
|
+
var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
|
15
|
+
var _react = _interopRequireWildcard(require("react"));
|
16
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
17
|
+
var _TreeViewContext = require("../../context/TreeViewContext");
|
18
|
+
var _index = require("../../index");
|
19
|
+
var _TreeView = require("./TreeView");
|
20
|
+
var _TreeViewRow = _interopRequireDefault(require("./TreeViewRow"));
|
21
|
+
var _react2 = require("@emotion/react");
|
22
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
23
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
24
|
+
var TreeViewSection = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
25
|
+
var _context, _context2, _context3, _context4;
|
26
|
+
var item = props.item,
|
27
|
+
items = props.items,
|
28
|
+
title = props.title;
|
29
|
+
var treeSectionRef = (0, _react.useRef)();
|
30
|
+
/* istanbul ignore next */
|
31
|
+
(0, _react.useImperativeHandle)(ref, function () {
|
32
|
+
return treeSectionRef.current;
|
33
|
+
});
|
34
|
+
var _useTreeViewContext = (0, _TreeViewContext.useTreeViewContext)(),
|
35
|
+
state = _useTreeViewContext.state,
|
36
|
+
tree = _useTreeViewContext.tree;
|
37
|
+
var isExpanded = (0, _includes["default"])(_context = (0, _from["default"])(state.expandedKeys)).call(_context, item.key);
|
38
|
+
var isSelected = (0, _includes["default"])(_context2 = (0, _from["default"])(tree.selectedKeys)).call(_context2, item.key);
|
39
|
+
var isDisabled = (0, _includes["default"])(_context3 = (0, _from["default"])(state.disabledKeys)).call(_context3, item.key);
|
40
|
+
return (0, _react2.jsx)(_index.Box, {
|
41
|
+
ref: treeSectionRef,
|
42
|
+
as: "li",
|
43
|
+
sx: {
|
44
|
+
':not(:last-child)': {
|
45
|
+
pb: 'sm'
|
46
|
+
}
|
47
|
+
},
|
48
|
+
role: "treeitem",
|
49
|
+
"aria-expanded": isExpanded,
|
50
|
+
"aria-selected": isSelected,
|
51
|
+
"aria-disabled": isDisabled
|
52
|
+
}, (0, _react2.jsx)(_TreeViewRow["default"], {
|
53
|
+
item: item,
|
54
|
+
title: title,
|
55
|
+
items: items,
|
56
|
+
isExpanded: isExpanded,
|
57
|
+
isSelected: isSelected,
|
58
|
+
isDisabled: isDisabled
|
59
|
+
}), isExpanded && (0, _react2.jsx)(_index.Box, {
|
60
|
+
as: "ul",
|
61
|
+
role: "group",
|
62
|
+
key: "".concat(item.key, " ul"),
|
63
|
+
sx: {
|
64
|
+
pl: 'md'
|
65
|
+
}
|
66
|
+
}, (0, _map["default"])(_context4 = (0, _from["default"])(items)).call(_context4, function (_item) {
|
67
|
+
var _item$value$items;
|
68
|
+
return (0, _TreeView.SectionOrItemRender)(((_item$value$items = _item.value.items) === null || _item$value$items === void 0 ? void 0 : _item$value$items.length) > 0, (0, _react2.jsx)(TreeViewSection, {
|
69
|
+
item: _item,
|
70
|
+
items: _item.children,
|
71
|
+
title: _item.value.title,
|
72
|
+
key: _item.value.title
|
73
|
+
}), (0, _react2.jsx)(_index.TreeViewItem, {
|
74
|
+
item: _item,
|
75
|
+
title: _item.value.title,
|
76
|
+
key: _item.value.title
|
77
|
+
}));
|
78
|
+
})));
|
79
|
+
});
|
80
|
+
TreeViewSection.propTypes = {
|
81
|
+
items: _propTypes["default"].arrayOf(_propTypes["default"].shape({})),
|
82
|
+
item: _propTypes["default"].shape({
|
83
|
+
key: _propTypes["default"].string
|
84
|
+
}),
|
85
|
+
title: _propTypes["default"].string
|
86
|
+
};
|
87
|
+
var _default = TreeViewSection;
|
88
|
+
exports["default"] = _default;
|
@@ -0,0 +1,28 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
4
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
5
|
+
_Object$defineProperty(exports, "__esModule", {
|
6
|
+
value: true
|
7
|
+
});
|
8
|
+
_Object$defineProperty(exports, "TreeViewItem", {
|
9
|
+
enumerable: true,
|
10
|
+
get: function get() {
|
11
|
+
return _TreeViewItem["default"];
|
12
|
+
}
|
13
|
+
});
|
14
|
+
_Object$defineProperty(exports, "TreeViewSection", {
|
15
|
+
enumerable: true,
|
16
|
+
get: function get() {
|
17
|
+
return _TreeViewSection["default"];
|
18
|
+
}
|
19
|
+
});
|
20
|
+
_Object$defineProperty(exports, "default", {
|
21
|
+
enumerable: true,
|
22
|
+
get: function get() {
|
23
|
+
return _TreeView["default"];
|
24
|
+
}
|
25
|
+
});
|
26
|
+
var _TreeView = _interopRequireDefault(require("./TreeView"));
|
27
|
+
var _TreeViewItem = _interopRequireDefault(require("./TreeViewItem"));
|
28
|
+
var _TreeViewSection = _interopRequireDefault(require("./TreeViewSection"));
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
4
|
+
_Object$defineProperty(exports, "__esModule", {
|
5
|
+
value: true
|
6
|
+
});
|
7
|
+
exports.useTreeViewContext = exports.TreeViewContext = void 0;
|
8
|
+
var _react = require("react");
|
9
|
+
var TreeViewContext = /*#__PURE__*/(0, _react.createContext)(null);
|
10
|
+
exports.TreeViewContext = TreeViewContext;
|
11
|
+
var useTreeViewContext = function useTreeViewContext() {
|
12
|
+
return (0, _react.useContext)(TreeViewContext);
|
13
|
+
};
|
14
|
+
exports.useTreeViewContext = useTreeViewContext;
|
package/lib/cjs/index.d.ts
CHANGED
@@ -159,13 +159,15 @@ export * from './components/TextField';
|
|
159
159
|
export { default as TimeZonePicker } from './components/TimeZonePicker';
|
160
160
|
export { default as TooltipTrigger } from './components/TooltipTrigger';
|
161
161
|
export * from './components/TooltipTrigger';
|
162
|
+
export { default as TreeView } from './components/TreeView';
|
163
|
+
export * from './components/TreeView';
|
162
164
|
export { default as PageHeader } from './experimental/PageHeader';
|
163
165
|
export * from './experimental/PageHeader';
|
164
166
|
export { default as DataTable } from './components/DataTable';
|
165
167
|
export * from './components/DataTable';
|
166
168
|
export * from './types';
|
167
169
|
export { OverlayProvider, useOverlayPosition, useOverlayTrigger } from 'react-aria';
|
168
|
-
export { Item, Section, useOverlayTriggerState } from 'react-stately';
|
170
|
+
export { Item, Section, useOverlayTriggerState, useTreeData } from 'react-stately';
|
169
171
|
export { TableBody as DataTableBody, Cell as DataTableCell, Column as DataTableColumn, TableHeader as DataTableHeader, Row as DataTableRow, } from 'react-stately';
|
170
172
|
export { default as EditButton } from './experimental/EditButton';
|
171
173
|
export { default as PanelHeader } from './experimental/PanelHeader';
|
package/lib/cjs/index.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
|
3
|
-
var _context, _context2, _context3, _context4, _context5, _context6, _context7, _context8, _context9, _context10, _context11, _context12, _context13, _context14, _context15, _context16, _context17, _context18, _context19, _context20, _context21, _context22, _context23, _context24, _context25, _context26, _context27, _context28, _context29, _context30, _context31, _context32, _context33, _context34, _context35, _context36, _context37, _context38, _context39, _context40, _context41, _context42, _context43, _context44, _context45, _context46, _context47, _context48, _context49, _context50, _context51, _context52, _context53, _context54, _context55, _context56, _context57, _context58, _context59, _context60, _context61, _context62, _context63, _context64, _context65, _context66, _context67, _context68, _context69, _context70, _context71, _context72, _context73, _context74;
|
3
|
+
var _context, _context2, _context3, _context4, _context5, _context6, _context7, _context8, _context9, _context10, _context11, _context12, _context13, _context14, _context15, _context16, _context17, _context18, _context19, _context20, _context21, _context22, _context23, _context24, _context25, _context26, _context27, _context28, _context29, _context30, _context31, _context32, _context33, _context34, _context35, _context36, _context37, _context38, _context39, _context40, _context41, _context42, _context43, _context44, _context45, _context46, _context47, _context48, _context49, _context50, _context51, _context52, _context53, _context54, _context55, _context56, _context57, _context58, _context59, _context60, _context61, _context62, _context63, _context64, _context65, _context66, _context67, _context68, _context69, _context70, _context71, _context72, _context73, _context74, _context75;
|
4
4
|
var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
|
5
5
|
var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
|
6
6
|
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
@@ -103,6 +103,7 @@ var _exportNames = {
|
|
103
103
|
TextField: true,
|
104
104
|
TimeZonePicker: true,
|
105
105
|
TooltipTrigger: true,
|
106
|
+
TreeView: true,
|
106
107
|
PageHeader: true,
|
107
108
|
DataTable: true,
|
108
109
|
OverlayProvider: true,
|
@@ -111,6 +112,7 @@ var _exportNames = {
|
|
111
112
|
Item: true,
|
112
113
|
Section: true,
|
113
114
|
useOverlayTriggerState: true,
|
115
|
+
useTreeData: true,
|
114
116
|
DataTableBody: true,
|
115
117
|
DataTableCell: true,
|
116
118
|
DataTableColumn: true,
|
@@ -758,6 +760,12 @@ _Object$defineProperty(exports, "TooltipTrigger", {
|
|
758
760
|
return _TooltipTrigger["default"];
|
759
761
|
}
|
760
762
|
});
|
763
|
+
_Object$defineProperty(exports, "TreeView", {
|
764
|
+
enumerable: true,
|
765
|
+
get: function get() {
|
766
|
+
return _TreeView["default"];
|
767
|
+
}
|
768
|
+
});
|
761
769
|
_Object$defineProperty(exports, "useOverlayPosition", {
|
762
770
|
enumerable: true,
|
763
771
|
get: function get() {
|
@@ -776,6 +784,12 @@ _Object$defineProperty(exports, "useOverlayTriggerState", {
|
|
776
784
|
return _reactStately.useOverlayTriggerState;
|
777
785
|
}
|
778
786
|
});
|
787
|
+
_Object$defineProperty(exports, "useTreeData", {
|
788
|
+
enumerable: true,
|
789
|
+
get: function get() {
|
790
|
+
return _reactStately.useTreeData;
|
791
|
+
}
|
792
|
+
});
|
779
793
|
var _AccordionGridGroup = _interopRequireWildcard(require("./components/AccordionGridGroup"));
|
780
794
|
_forEachInstanceProperty(_context = _Object$keys(_AccordionGridGroup)).call(_context, function (key) {
|
781
795
|
if (key === "default" || key === "__esModule") return;
|
@@ -1646,8 +1660,20 @@ _forEachInstanceProperty(_context71 = _Object$keys(_TooltipTrigger)).call(_conte
|
|
1646
1660
|
}
|
1647
1661
|
});
|
1648
1662
|
});
|
1663
|
+
var _TreeView = _interopRequireWildcard(require("./components/TreeView"));
|
1664
|
+
_forEachInstanceProperty(_context72 = _Object$keys(_TreeView)).call(_context72, function (key) {
|
1665
|
+
if (key === "default" || key === "__esModule") return;
|
1666
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
1667
|
+
if (key in exports && exports[key] === _TreeView[key]) return;
|
1668
|
+
_Object$defineProperty(exports, key, {
|
1669
|
+
enumerable: true,
|
1670
|
+
get: function get() {
|
1671
|
+
return _TreeView[key];
|
1672
|
+
}
|
1673
|
+
});
|
1674
|
+
});
|
1649
1675
|
var _PageHeader = _interopRequireWildcard(require("./experimental/PageHeader"));
|
1650
|
-
_forEachInstanceProperty(
|
1676
|
+
_forEachInstanceProperty(_context73 = _Object$keys(_PageHeader)).call(_context73, function (key) {
|
1651
1677
|
if (key === "default" || key === "__esModule") return;
|
1652
1678
|
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
1653
1679
|
if (key in exports && exports[key] === _PageHeader[key]) return;
|
@@ -1659,7 +1685,7 @@ _forEachInstanceProperty(_context72 = _Object$keys(_PageHeader)).call(_context72
|
|
1659
1685
|
});
|
1660
1686
|
});
|
1661
1687
|
var _DataTable = _interopRequireWildcard(require("./components/DataTable"));
|
1662
|
-
_forEachInstanceProperty(
|
1688
|
+
_forEachInstanceProperty(_context74 = _Object$keys(_DataTable)).call(_context74, function (key) {
|
1663
1689
|
if (key === "default" || key === "__esModule") return;
|
1664
1690
|
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
1665
1691
|
if (key in exports && exports[key] === _DataTable[key]) return;
|
@@ -1671,7 +1697,7 @@ _forEachInstanceProperty(_context73 = _Object$keys(_DataTable)).call(_context73,
|
|
1671
1697
|
});
|
1672
1698
|
});
|
1673
1699
|
var _types = require("./types");
|
1674
|
-
_forEachInstanceProperty(
|
1700
|
+
_forEachInstanceProperty(_context75 = _Object$keys(_types)).call(_context75, function (key) {
|
1675
1701
|
if (key === "default" || key === "__esModule") return;
|
1676
1702
|
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
1677
1703
|
if (key in exports && exports[key] === _types[key]) return;
|
@@ -52,6 +52,7 @@ var _Table = _interopRequireDefault(require("../../components/Table/Table.styles
|
|
52
52
|
var tab = _interopRequireWildcard(require("../../components/Tabs/Tabs.style"));
|
53
53
|
var _TimeZone = _interopRequireDefault(require("../../components/TimeZonePicker/TimeZone.styles"));
|
54
54
|
var _Tooltip = _interopRequireDefault(require("../../components/TooltipTrigger/Tooltip.styles"));
|
55
|
+
var _TreeView = _interopRequireDefault(require("../../components/TreeView/TreeView.styles"));
|
55
56
|
var _PanelHeader = _interopRequireDefault(require("../../experimental/PanelHeader/PanelHeader.styles"));
|
56
57
|
function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
57
58
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
@@ -93,6 +94,7 @@ var _default = _objectSpread({
|
|
93
94
|
stepper: _Stepper["default"],
|
94
95
|
table: _Table["default"],
|
95
96
|
timeZone: _TimeZone["default"],
|
96
|
-
tooltip: _Tooltip["default"]
|
97
|
+
tooltip: _Tooltip["default"],
|
98
|
+
treeView: _TreeView["default"]
|
97
99
|
}, tab);
|
98
100
|
exports["default"] = _default;
|
@@ -0,0 +1,89 @@
|
|
1
|
+
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
|
2
|
+
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
|
3
|
+
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
|
4
|
+
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
|
5
|
+
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
|
6
|
+
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
|
7
|
+
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
|
8
|
+
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
|
9
|
+
import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
10
|
+
import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
|
11
|
+
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
|
12
|
+
var _excluded = ["tree", "onExpandedChange"];
|
13
|
+
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
|
14
|
+
import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from";
|
15
|
+
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
16
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context2, _context3; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(source), !0)).call(_context2, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context3 = ownKeys(Object(source))).call(_context3, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
17
|
+
import React, { forwardRef, useImperativeHandle, useRef } from 'react';
|
18
|
+
import { useTreeState } from 'react-stately';
|
19
|
+
import PropTypes from 'prop-types';
|
20
|
+
import { TreeViewContext } from '../../context/TreeViewContext';
|
21
|
+
import { Box, TreeViewItem, TreeViewSection } from '../../index';
|
22
|
+
import { isIterableProp } from '../../utils/devUtils/props/isIterable';
|
23
|
+
|
24
|
+
// split out and exported for ease of use across components
|
25
|
+
// and to facilitate easier testing (eliminates redundant conditional renders)
|
26
|
+
import { jsx as ___EmotionJSX } from "@emotion/react";
|
27
|
+
export var SectionOrItemRender = function SectionOrItemRender(condition, SectionComponent, ItemComponent) {
|
28
|
+
if (condition) {
|
29
|
+
return SectionComponent;
|
30
|
+
}
|
31
|
+
return ItemComponent;
|
32
|
+
};
|
33
|
+
var TreeView = /*#__PURE__*/forwardRef(function (props, ref) {
|
34
|
+
var _labelRef$current, _context;
|
35
|
+
var tree = props.tree,
|
36
|
+
onExpandedChange = props.onExpandedChange,
|
37
|
+
others = _objectWithoutProperties(props, _excluded);
|
38
|
+
var labelRef = useRef();
|
39
|
+
var treeViewRef = useRef();
|
40
|
+
/* istanbul ignore next */
|
41
|
+
useImperativeHandle(ref, function () {
|
42
|
+
return treeViewRef.current;
|
43
|
+
});
|
44
|
+
var state = useTreeState(_objectSpread({
|
45
|
+
onExpandedChange: onExpandedChange
|
46
|
+
}, others));
|
47
|
+
return ___EmotionJSX(TreeViewContext.Provider, {
|
48
|
+
value: {
|
49
|
+
state: state,
|
50
|
+
tree: tree
|
51
|
+
}
|
52
|
+
}, ___EmotionJSX(Box, _extends({
|
53
|
+
as: "ul",
|
54
|
+
role: "tree",
|
55
|
+
ref: treeViewRef,
|
56
|
+
"aria-labelledby": labelRef === null || labelRef === void 0 || (_labelRef$current = labelRef.current) === null || _labelRef$current === void 0 ? void 0 : _labelRef$current.id,
|
57
|
+
sx: {
|
58
|
+
overflow: 'hidden'
|
59
|
+
}
|
60
|
+
}, others), _mapInstanceProperty(_context = _Array$from(state.collection)).call(_context, function (item) {
|
61
|
+
return SectionOrItemRender(item.type === 'section', ___EmotionJSX(TreeViewSection, {
|
62
|
+
item: item,
|
63
|
+
items: item.props.items,
|
64
|
+
title: item.props.title,
|
65
|
+
key: item.props.title
|
66
|
+
}), ___EmotionJSX(TreeViewItem, {
|
67
|
+
item: item,
|
68
|
+
title: item.value.value.title,
|
69
|
+
key: item.value.value.title
|
70
|
+
}));
|
71
|
+
})));
|
72
|
+
});
|
73
|
+
TreeView.defaultProps = {
|
74
|
+
'aria-label': 'tree'
|
75
|
+
};
|
76
|
+
TreeView.propTypes = {
|
77
|
+
/** data object prop that is required to make the tree function
|
78
|
+
this is returned from the useTreeData hook in React-Aria */
|
79
|
+
tree: PropTypes.shape({}).isRequired,
|
80
|
+
/** The currently disabled keys in the collection. */
|
81
|
+
disabledKeys: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.object])),
|
82
|
+
/** Callback function that is called when items are expanded or collapsed. */
|
83
|
+
onExpandedChange: PropTypes.func,
|
84
|
+
/** The list of TreeView items. */
|
85
|
+
items: isIterableProp,
|
86
|
+
/** String that describes the treeview when using a screen reader. */
|
87
|
+
'aria-label': PropTypes.string
|
88
|
+
};
|
89
|
+
export default TreeView;
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { Meta } from '@storybook/addon-docs';
|
2
|
+
|
3
|
+
<Meta title="Experimental/TreeView/TreeView" />
|
4
|
+
|
5
|
+
# TreeView
|
6
|
+
|
7
|
+
The TreeView component represents a nested structure of data.
|
8
|
+
|
9
|
+
### Required components
|
10
|
+
|
11
|
+
This component requires the the use of Item and Section, both exported from [react-stately/collections](https://react-spectrum.adobe.com/react-stately/collections.html).
|
12
|
+
This component will also require the use of the [useTreeData](https://react-spectrum.adobe.com/react-stately/useTreeData.html) hook, which is exported through react-stately.
|
13
|
+
|
14
|
+
### Accessibility
|
15
|
+
|
16
|
+
This component should adhere to the [WAI-ARIA TreeView](https://www.w3.org/WAI/ARIA/apg/patterns/treeview/) accessibility guidelines.
|
@@ -0,0 +1,79 @@
|
|
1
|
+
import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
2
|
+
import React from 'react';
|
3
|
+
import DocsLayout from '../../../.storybook/storybookDocsLayout';
|
4
|
+
import { Item, Section, TreeView, useTreeData } from '../../index';
|
5
|
+
import { SectionOrItemRender } from './TreeView';
|
6
|
+
import TreeViewReadMe from './TreeView.mdx';
|
7
|
+
import { jsx as ___EmotionJSX } from "@emotion/react";
|
8
|
+
export default {
|
9
|
+
title: 'Experimental/TreeView',
|
10
|
+
component: TreeView,
|
11
|
+
parameters: {
|
12
|
+
docs: {
|
13
|
+
page: function page() {
|
14
|
+
return ___EmotionJSX(React.Fragment, null, ___EmotionJSX(TreeViewReadMe, null), ___EmotionJSX(DocsLayout, null));
|
15
|
+
},
|
16
|
+
source: {
|
17
|
+
type: 'code'
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
21
|
+
};
|
22
|
+
var data = [{
|
23
|
+
title: 'Policies',
|
24
|
+
items: [{
|
25
|
+
title: 'Registration',
|
26
|
+
items: [{
|
27
|
+
title: 'Registration A'
|
28
|
+
}, {
|
29
|
+
title: 'Registration B',
|
30
|
+
items: [{
|
31
|
+
title: 'Registration B1'
|
32
|
+
}, {
|
33
|
+
title: 'Registration B2'
|
34
|
+
}]
|
35
|
+
}, {
|
36
|
+
title: 'Registration C'
|
37
|
+
}, {
|
38
|
+
title: 'Registration D'
|
39
|
+
}]
|
40
|
+
}, {
|
41
|
+
title: 'Authentication',
|
42
|
+
items: [{
|
43
|
+
title: 'Authentication A'
|
44
|
+
}, {
|
45
|
+
title: 'Authentication B'
|
46
|
+
}]
|
47
|
+
}]
|
48
|
+
}, {
|
49
|
+
title: 'Other',
|
50
|
+
items: [{
|
51
|
+
title: 'Other A'
|
52
|
+
}]
|
53
|
+
}, {
|
54
|
+
title: 'Single Item'
|
55
|
+
}];
|
56
|
+
export var Default = function Default(args) {
|
57
|
+
var tree = useTreeData({
|
58
|
+
initialItems: data,
|
59
|
+
getKey: function getKey(item) {
|
60
|
+
return item.title;
|
61
|
+
},
|
62
|
+
getChildren: function getChildren(item) {
|
63
|
+
return item.items;
|
64
|
+
}
|
65
|
+
});
|
66
|
+
return ___EmotionJSX(TreeView, _extends({}, args, {
|
67
|
+
items: tree.items,
|
68
|
+
tree: tree
|
69
|
+
}), function (section) {
|
70
|
+
return SectionOrItemRender(section.children.length > 0, ___EmotionJSX(Section, {
|
71
|
+
key: section.key,
|
72
|
+
items: section.children,
|
73
|
+
title: section.value.title
|
74
|
+
}), ___EmotionJSX(Item, {
|
75
|
+
key: section.key,
|
76
|
+
title: section.title
|
77
|
+
}));
|
78
|
+
});
|
79
|
+
};
|
@@ -0,0 +1,24 @@
|
|
1
|
+
var treeRow = {
|
2
|
+
flexGrow: 1,
|
3
|
+
cursor: 'pointer',
|
4
|
+
height: '31px',
|
5
|
+
outline: 'none',
|
6
|
+
'&.is-selected, &.is-hovered, &.is-focused': {
|
7
|
+
backgroundColor: 'active',
|
8
|
+
'& span': {
|
9
|
+
color: 'white'
|
10
|
+
},
|
11
|
+
'& svg': {
|
12
|
+
fill: 'white'
|
13
|
+
},
|
14
|
+
'& button': {
|
15
|
+
fill: 'white'
|
16
|
+
}
|
17
|
+
},
|
18
|
+
'&.is-expanded': {
|
19
|
+
marginBottom: 'xs'
|
20
|
+
}
|
21
|
+
};
|
22
|
+
export default {
|
23
|
+
treeRow: treeRow
|
24
|
+
};
|
@@ -0,0 +1,121 @@
|
|
1
|
+
import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
2
|
+
import React from 'react';
|
3
|
+
import { useTreeData } from 'react-stately';
|
4
|
+
import { Item, Section } from '../../index';
|
5
|
+
import { fireEvent, render, screen } from '../../utils/testUtils/testWrapper';
|
6
|
+
import { SectionOrItemRender } from './TreeView';
|
7
|
+
import TreeView from '.';
|
8
|
+
import { jsx as ___EmotionJSX } from "@emotion/react";
|
9
|
+
var testId = 'test-TreeView';
|
10
|
+
var defaultProps = {
|
11
|
+
'data-testid': testId
|
12
|
+
};
|
13
|
+
var data = [{
|
14
|
+
title: 'People',
|
15
|
+
items: [{
|
16
|
+
title: 'David',
|
17
|
+
customProp: 1
|
18
|
+
}, {
|
19
|
+
title: 'Sam'
|
20
|
+
}, {
|
21
|
+
title: 'Jane'
|
22
|
+
}]
|
23
|
+
}, {
|
24
|
+
title: 'Animals',
|
25
|
+
items: [{
|
26
|
+
title: 'Bears',
|
27
|
+
items: [{
|
28
|
+
title: 'Black Bear'
|
29
|
+
}, {
|
30
|
+
title: 'Brown Bear'
|
31
|
+
}]
|
32
|
+
}, {
|
33
|
+
title: 'Kangaroo'
|
34
|
+
}, {
|
35
|
+
title: 'Snake'
|
36
|
+
}]
|
37
|
+
}, {
|
38
|
+
title: 'Plant'
|
39
|
+
}];
|
40
|
+
var TreeViewComponent = function TreeViewComponent(props) {
|
41
|
+
var tree = useTreeData({
|
42
|
+
initialItems: data,
|
43
|
+
getKey: function getKey(item) {
|
44
|
+
return item.title;
|
45
|
+
},
|
46
|
+
getChildren: function getChildren(item) {
|
47
|
+
return item.items;
|
48
|
+
}
|
49
|
+
});
|
50
|
+
return ___EmotionJSX(TreeView, _extends({}, defaultProps, props, {
|
51
|
+
items: tree.items,
|
52
|
+
tree: tree
|
53
|
+
}), function (section) {
|
54
|
+
var _section$children;
|
55
|
+
return SectionOrItemRender(((_section$children = section.children) === null || _section$children === void 0 ? void 0 : _section$children.length) > 0, ___EmotionJSX(Section, {
|
56
|
+
key: section.key,
|
57
|
+
items: section.children,
|
58
|
+
title: section.key,
|
59
|
+
customProp: {
|
60
|
+
testp: 1
|
61
|
+
}
|
62
|
+
}), ___EmotionJSX(Item, {
|
63
|
+
key: section.key,
|
64
|
+
title: section.key
|
65
|
+
}));
|
66
|
+
});
|
67
|
+
};
|
68
|
+
test('Can select an Item using the mouse', function () {
|
69
|
+
render(___EmotionJSX(TreeViewComponent, null));
|
70
|
+
var element = screen.getByTestId(testId);
|
71
|
+
expect(element).toBeInTheDocument();
|
72
|
+
var peopleElement = screen.getByText('People');
|
73
|
+
expect(peopleElement).not.toHaveClass('is-selected');
|
74
|
+
fireEvent.click(peopleElement);
|
75
|
+
expect(peopleElement).toHaveClass('is-selected');
|
76
|
+
});
|
77
|
+
test('Renders both Sections and Items', function () {
|
78
|
+
render(___EmotionJSX(TreeViewComponent, null));
|
79
|
+
var peopleElement = screen.getByText('People');
|
80
|
+
expect(peopleElement).toBeInTheDocument();
|
81
|
+
var plantElement = screen.getByText('Plant');
|
82
|
+
expect(plantElement).toBeInTheDocument();
|
83
|
+
var allListItems = screen.getAllByRole('treeitem');
|
84
|
+
expect(allListItems).toHaveLength(3);
|
85
|
+
});
|
86
|
+
test('Can expand an Item using the mouse', function () {
|
87
|
+
render(___EmotionJSX(TreeViewComponent, null));
|
88
|
+
|
89
|
+
// The children of collapsed sections will not
|
90
|
+
// be rendered by default.
|
91
|
+
expect(screen.queryByText(data[0].items[0].title)).not.toBeInTheDocument();
|
92
|
+
|
93
|
+
// Clicking the dropdown icon, renders the children
|
94
|
+
// of the collapsed section.
|
95
|
+
var buttons = screen.queryAllByRole('button');
|
96
|
+
fireEvent.click(buttons[0]);
|
97
|
+
expect(screen.queryByText(data[0].items[0].title)).toBeInTheDocument();
|
98
|
+
});
|
99
|
+
test('onExpandedChange change prop calls when used', function () {
|
100
|
+
var onPress = jest.fn();
|
101
|
+
render(___EmotionJSX(TreeViewComponent, {
|
102
|
+
onExpandedChange: onPress
|
103
|
+
}));
|
104
|
+
expect(onPress).not.toHaveBeenCalled();
|
105
|
+
var buttons = screen.queryAllByRole('button');
|
106
|
+
fireEvent.click(buttons[0]);
|
107
|
+
expect(onPress).toHaveBeenCalled();
|
108
|
+
});
|
109
|
+
test('disabledKeys prop disables items in the tree -- rendering them unclickable', function () {
|
110
|
+
render(___EmotionJSX(TreeViewComponent, {
|
111
|
+
disabledKeys: ['Plant']
|
112
|
+
}));
|
113
|
+
var listItems = screen.getAllByRole('treeitem');
|
114
|
+
var thisItem = listItems[2];
|
115
|
+
expect(thisItem).not.toHaveClass('is-selected');
|
116
|
+
expect(thisItem).toHaveAttribute('aria-disabled', 'true');
|
117
|
+
fireEvent.mouseDown(thisItem);
|
118
|
+
fireEvent.mouseUp(thisItem);
|
119
|
+
expect(thisItem).not.toHaveClass('is-selected');
|
120
|
+
expect(thisItem).toHaveAttribute('aria-selected', 'false');
|
121
|
+
});
|
@@ -0,0 +1,60 @@
|
|
1
|
+
import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
|
2
|
+
import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from";
|
3
|
+
import React, { forwardRef, useImperativeHandle, useRef } from 'react';
|
4
|
+
import FileIcon from '@pingux/mdi-react/FileIcon';
|
5
|
+
import PropTypes from 'prop-types';
|
6
|
+
import { useTreeViewContext } from '../../context/TreeViewContext';
|
7
|
+
import { Box } from '../../index';
|
8
|
+
import TreeViewRow from './TreeViewRow';
|
9
|
+
import { jsx as ___EmotionJSX } from "@emotion/react";
|
10
|
+
var TreeViewItem = /*#__PURE__*/forwardRef(function (props, ref) {
|
11
|
+
var _context, _context2, _context3;
|
12
|
+
var item = props.item,
|
13
|
+
title = props.title;
|
14
|
+
var treeItemRef = useRef();
|
15
|
+
/* istanbul ignore next */
|
16
|
+
useImperativeHandle(ref, function () {
|
17
|
+
return treeItemRef.current;
|
18
|
+
});
|
19
|
+
var _useTreeViewContext = useTreeViewContext(),
|
20
|
+
state = _useTreeViewContext.state,
|
21
|
+
tree = _useTreeViewContext.tree;
|
22
|
+
var isExpanded = _includesInstanceProperty(_context = _Array$from(state.expandedKeys)).call(_context, item.key);
|
23
|
+
var isSelected = _includesInstanceProperty(_context2 = _Array$from(tree.selectedKeys)).call(_context2, item.key);
|
24
|
+
var isDisabled = _includesInstanceProperty(_context3 = _Array$from(state.disabledKeys)).call(_context3, item.key);
|
25
|
+
|
26
|
+
// this component may seem unnecessary, but it will be where the
|
27
|
+
// useOption and dragAndDrop stuff will go
|
28
|
+
// this comment will be removed at that time.
|
29
|
+
|
30
|
+
return ___EmotionJSX(Box, {
|
31
|
+
as: "li",
|
32
|
+
isRow: true,
|
33
|
+
ref: treeItemRef,
|
34
|
+
role: "treeitem",
|
35
|
+
"aria-selected": isSelected,
|
36
|
+
"aria-disabled": isDisabled,
|
37
|
+
sx: {
|
38
|
+
width: '100%',
|
39
|
+
ml: '36px',
|
40
|
+
':not(:last-child)': {
|
41
|
+
pb: 'sm'
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}, ___EmotionJSX(TreeViewRow, {
|
45
|
+
item: item,
|
46
|
+
title: title,
|
47
|
+
mainIcon: FileIcon,
|
48
|
+
isSelected: isSelected,
|
49
|
+
isExpanded: isExpanded,
|
50
|
+
isDisabled: isDisabled
|
51
|
+
}));
|
52
|
+
});
|
53
|
+
TreeViewItem.propTypes = {
|
54
|
+
item: PropTypes.shape({
|
55
|
+
key: PropTypes.string
|
56
|
+
}),
|
57
|
+
name: PropTypes.string,
|
58
|
+
title: PropTypes.string
|
59
|
+
};
|
60
|
+
export default TreeViewItem;
|