choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
313 lines (238 loc) • 10.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var React = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _omit = _interopRequireDefault(require("lodash/omit"));
var _debounce = _interopRequireDefault(require("lodash/debounce"));
var _icon = _interopRequireDefault(require("../icon"));
var _util = require("../rc-components/tree/util");
var _treeUtil = require("../rc-components/tree/utils/treeUtil");
var _index = _interopRequireDefault(require("./index"));
var _dictUtil = require("./utils/dictUtil");
var _ConfigContext = _interopRequireDefault(require("../config-provider/ConfigContext"));
var _excluded = ["className"];
function TreeIcon(props) {
var _React$useContext = React.useContext(_ConfigContext["default"]),
getPrefixCls = _React$useContext.getPrefixCls;
var isLeaf = props.isLeaf,
expanded = props.expanded,
prefixCls = props.prefixCls;
var prefixCl = getPrefixCls('tree', prefixCls);
if (isLeaf) {
return /*#__PURE__*/React.createElement(_icon["default"], {
type: "insert_drive_file",
className: "".concat(prefixCl, "-switcher-line-icon")
});
}
return expanded ? /*#__PURE__*/React.createElement(_icon["default"], {
type: "baseline-file_copy",
className: "".concat(prefixCl, "-switcher-line-icon")
}) : /*#__PURE__*/React.createElement(_icon["default"], {
type: "library_books",
className: "".concat(prefixCl, "-switcher-line-icon")
});
}
function getIcon(props) {
return /*#__PURE__*/React.createElement(TreeIcon, (0, _extends2["default"])({}, props));
}
function getTreeData(_ref) {
var treeData = _ref.treeData,
children = _ref.children;
return treeData || (0, _treeUtil.convertTreeToData)(children);
}
var DirectoryTree = /*#__PURE__*/function (_React$Component) {
(0, _inherits2["default"])(DirectoryTree, _React$Component);
var _super = (0, _createSuper2["default"])(DirectoryTree);
function DirectoryTree(props) {
var _this;
(0, _classCallCheck2["default"])(this, DirectoryTree);
_this = _super.call(this, props);
_this.onExpand = function (expandedKeys, info) {
var onExpand = _this.props.onExpand;
_this.setUncontrolledState({
expandedKeys: expandedKeys
}); // Call origin function
if (onExpand) {
return onExpand(expandedKeys, info);
}
return undefined;
};
_this.onClick = function (event, node) {
var _this$props = _this.props,
onClick = _this$props.onClick,
expandAction = _this$props.expandAction; // Expand the tree
if (expandAction === 'click') {
_this.onDebounceExpand(event, node);
}
if (onClick) {
onClick(event, node);
}
};
_this.onDoubleClick = function (event, node) {
var _this$props2 = _this.props,
onDoubleClick = _this$props2.onDoubleClick,
expandAction = _this$props2.expandAction; // Expand the tree
if (expandAction === 'doubleClick') {
_this.onDebounceExpand(event, node);
}
if (onDoubleClick) {
onDoubleClick(event, node);
}
};
_this.onSelect = function (keys, event) {
var _this$props3 = _this.props,
onSelect = _this$props3.onSelect,
multiple = _this$props3.multiple;
var _this$state$expandedK = _this.state.expandedKeys,
expandedKeys = _this$state$expandedK === void 0 ? [] : _this$state$expandedK;
var node = event.node,
nativeEvent = event.nativeEvent;
var _node$key = node.key,
key = _node$key === void 0 ? '' : _node$key;
var treeData = getTreeData(_this.props);
var newState = {}; // We need wrap this event since some value is not same
var newEvent = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, event), {}, {
selected: true
}); // Windows / Mac single pick
var ctrlPick = nativeEvent.ctrlKey || nativeEvent.metaKey;
var shiftPick = nativeEvent.shiftKey; // Generate new selected keys
var newSelectedKeys;
if (multiple && ctrlPick) {
// Control click
newSelectedKeys = keys;
_this.lastSelectedKey = key;
_this.cachedSelectedKeys = newSelectedKeys;
newEvent.selectedNodes = (0, _dictUtil.convertDirectoryKeysToNodes)(treeData, newSelectedKeys);
} else if (multiple && shiftPick) {
// Shift click
newSelectedKeys = Array.from(new Set([].concat((0, _toConsumableArray2["default"])(_this.cachedSelectedKeys || []), (0, _toConsumableArray2["default"])((0, _dictUtil.calcRangeKeys)(treeData, expandedKeys, key, _this.lastSelectedKey)))));
newEvent.selectedNodes = (0, _dictUtil.convertDirectoryKeysToNodes)(treeData, newSelectedKeys);
} else {
// Single click
newSelectedKeys = [key];
_this.lastSelectedKey = key;
_this.cachedSelectedKeys = newSelectedKeys;
newEvent.selectedNodes = (0, _dictUtil.convertDirectoryKeysToNodes)(treeData, newSelectedKeys);
}
newState.selectedKeys = newSelectedKeys;
if (onSelect) {
onSelect(newSelectedKeys, newEvent);
}
_this.setUncontrolledState(newState);
};
_this.setTreeRef = function (node) {
_this.tree = node;
};
_this.expandFolderNode = function (event, node) {
var isLeaf = node.isLeaf;
if (isLeaf || event.shiftKey || event.metaKey || event.ctrlKey) {
return;
} // Get internal rc-tree
var internalTree = _this.tree.tree; // Call internal rc-tree expand function
// https://github.com/C7n-design/C7n-design/issues/12567
internalTree.onNodeExpand(event, node);
};
_this.setUncontrolledState = function (state) {
var newState = (0, _omit["default"])(state, Object.keys(_this.props));
if (Object.keys(newState).length) {
_this.setState(newState);
}
};
_this.renderDirectoryTree = function () {
var _this$props4 = _this.props,
className = _this$props4.className,
props = (0, _objectWithoutProperties2["default"])(_this$props4, _excluded);
var _this$state = _this.state,
expandedKeys = _this$state.expandedKeys,
selectedKeys = _this$state.selectedKeys;
var prefixCls = _this.getPrefixCls();
var connectClassName = (0, _classnames["default"])("".concat(prefixCls, "-directory"), className, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-directory-rtl"), true));
return /*#__PURE__*/React.createElement(_index["default"], (0, _extends2["default"])({
icon: getIcon,
ref: _this.setTreeRef,
blockNode: true
}, props, {
prefixCls: prefixCls,
className: connectClassName,
expandedKeys: expandedKeys,
selectedKeys: selectedKeys,
onSelect: _this.onSelect,
onClick: _this.onClick,
onDoubleClick: _this.onDoubleClick,
onExpand: _this.onExpand
}));
};
var defaultExpandAll = props.defaultExpandAll,
defaultExpandParent = props.defaultExpandParent,
expandedKeys = props.expandedKeys,
defaultExpandedKeys = props.defaultExpandedKeys;
var _convertDataToEntitie = (0, _treeUtil.convertDataToEntities)(getTreeData(props)),
keyEntities = _convertDataToEntitie.keyEntities; // Selected keys
_this.state = {
selectedKeys: props.selectedKeys || props.defaultSelectedKeys || []
}; // Expanded keys
if (defaultExpandAll) {
_this.state.expandedKeys = Object.keys(keyEntities);
} else if (defaultExpandParent) {
_this.state.expandedKeys = (0, _util.conductExpandParent)(expandedKeys || defaultExpandedKeys || [], keyEntities);
} else {
_this.state.expandedKeys = expandedKeys || defaultExpandedKeys;
}
_this.onDebounceExpand = (0, _debounce["default"])(_this.expandFolderNode, 200, {
leading: true
});
return _this;
}
(0, _createClass2["default"])(DirectoryTree, [{
key: "getPrefixCls",
value: function getPrefixCls() {
var prefixCls = this.props.prefixCls;
var getPrefixCls = this.context.getPrefixCls;
return getPrefixCls('tree', prefixCls);
}
}, {
key: "render",
value: function render() {
return this.renderDirectoryTree();
}
}], [{
key: "contextType",
get: function get() {
return _ConfigContext["default"];
}
}, {
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(nextProps) {
var newState = {};
if ('expandedKeys' in nextProps) {
newState.expandedKeys = nextProps.expandedKeys;
}
if ('selectedKeys' in nextProps) {
newState.selectedKeys = nextProps.selectedKeys;
}
return newState;
}
}]);
return DirectoryTree;
}(React.Component);
DirectoryTree.defaultProps = {
showIcon: true,
expandAction: 'click'
};
var _default = DirectoryTree;
exports["default"] = _default;
//# sourceMappingURL=DirectoryTree.js.map