UNPKG

rsuite

Version:

A suite of react components

171 lines (165 loc) 5.93 kB
'use client'; "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _react = _interopRequireWildcard(require("react")); var _TreeView = _interopRequireDefault(require("./TreeView")); var _SearchView = _interopRequireDefault(require("./SearchView")); var _Box = _interopRequireDefault(require("../internals/Box")); var _utils = require("../internals/utils"); var _utils2 = require("../internals/Tree/utils"); var _utils3 = require("../Tree/utils"); var _hooks = require("../internals/hooks"); var _hooks2 = require("./hooks"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } /** * CascadeTree is a component that displays tree-structured data in columns. * * @see https://rsuitejs.com/components/cascade-tree */ const CascadeTree = (0, _utils.forwardRef)((props, ref) => { const { propsWithDefaults } = (0, _hooks.useCustom)('CascadeTree', props); const { as, data = [], defaultValue, className, classPrefix = 'cascade-tree', childrenKey = 'children', valueKey = 'value', labelKey = 'label', locale, value: valueProp, disabledItemValues = [], columnWidth, columnHeight, searchable, renderTreeNode, renderColumn, onSelect, onSearch, onChange, getChildren, ...rest } = propsWithDefaults; const [value, setValue] = (0, _hooks.useControlled)(valueProp, defaultValue); // Store the children of each node const childrenMap = (0, _hooks.useMap)(); // Store the parent of each node const parentMap = (0, _react.useMemo)(() => (0, _utils2.getParentMap)(data, item => { var _childrenMap$get; return (_childrenMap$get = childrenMap.get(item)) !== null && _childrenMap$get !== void 0 ? _childrenMap$get : item[childrenKey]; }), [childrenMap, childrenKey, data]); // Flatten the tree data const flattenedData = (0, _react.useMemo)(() => (0, _utils3.flattenTree)(data, item => { var _childrenMap$get2; return (_childrenMap$get2 = childrenMap.get(item)) !== null && _childrenMap$get2 !== void 0 ? _childrenMap$get2 : item[childrenKey]; }), [childrenMap, childrenKey, data]); // The selected item const selectedItem = flattenedData.find(item => item[valueKey] === value); // Callback function after selecting the node const onSelectCallback = (node, event) => { const { isLeafNode, cascadePaths, itemData } = node; onSelect === null || onSelect === void 0 || onSelect(itemData, cascadePaths, event); if (isLeafNode) { const nextValue = itemData[valueKey]; setValue(nextValue); } }; const { activeItem, loadingItemsSet, handleSelect } = (0, _hooks2.useSelect)({ value, valueKey, childrenKey, childrenMap, selectedItem, getChildren, onChange, onSelect: onSelectCallback }); const { columns, pathTowardsActiveItem } = (0, _hooks2.usePaths)({ data, activeItem, selectedItem, getParent: item => parentMap.get(item), getChildren: item => { var _childrenMap$get3; return (_childrenMap$get3 = childrenMap.get(item)) !== null && _childrenMap$get3 !== void 0 ? _childrenMap$get3 : item[childrenKey]; } }); const { withPrefix, merge } = (0, _hooks.useStyles)(classPrefix); const classes = merge(className, withPrefix()); const onSearchCallback = (0, _react.useCallback)((value, _items, event) => onSearch === null || onSearch === void 0 ? void 0 : onSearch(value, event), [onSearch]); const { items, searchKeyword, setSearchKeyword, handleSearch } = (0, _hooks2.useSearch)({ labelKey, childrenKey, parentMap, flattenedData, onSearch: onSearchCallback }); const handleSearchRowSelect = (0, _hooks.useEventCallback)((item, items, event) => { var _item$childrenKey; const node = { itemData: item, cascadePaths: items, isLeafNode: !((_item$childrenKey = item[childrenKey]) !== null && _item$childrenKey !== void 0 && _item$childrenKey.length) }; handleSelect(node, event); setSearchKeyword(''); }); return /*#__PURE__*/_react.default.createElement(_Box.default, (0, _extends2.default)({ as: as, className: classes }, rest, { ref: ref }), searchable && /*#__PURE__*/_react.default.createElement(_SearchView.default, { data: items, searchKeyword: searchKeyword, valueKey: valueKey, labelKey: labelKey, locale: locale, parentMap: parentMap, disabledItemValues: disabledItemValues, onSelect: handleSearchRowSelect, onSearch: handleSearch }), !searchKeyword && /*#__PURE__*/_react.default.createElement(_TreeView.default, { columnWidth: columnWidth, columnHeight: columnHeight, disabledItemValues: disabledItemValues, loadingItemsSet: loadingItemsSet, valueKey: valueKey, labelKey: labelKey, childrenKey: childrenKey, classPrefix: classPrefix, data: columns, cascadePaths: pathTowardsActiveItem, activeItemValue: value, onSelect: handleSelect, renderColumn: renderColumn, renderTreeNode: renderTreeNode })); }); CascadeTree.displayName = 'CascadeTree'; var _default = exports.default = CascadeTree;