UNPKG

@m-materials/com-tree

Version:

基于antd TreeSelect 下拉树结构选择器

604 lines (489 loc) 17.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports["default"] = void 0; var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose")); var _react = _interopRequireDefault(require("react")); var _lodash = require("lodash"); var _antd = require("antd"); var _reactCustomScrollbars = require("react-custom-scrollbars"); var _axios = _interopRequireDefault(require("axios")); var _classnames = _interopRequireDefault(require("classnames")); require("./index.css"); var _excluded = ["allowClear", "placeholder", "disabled", "searchPlaceHolder", "showSearch"]; var Search = _antd.Input.Search; var TreeNode = _antd.Tree.TreeNode; var childFieldKey = 'children'; var ComTree = /*#__PURE__*/function (_React$Component) { (0, _inheritsLoose2["default"])(ComTree, _React$Component); function ComTree(props) { var _this; _this = _React$Component.call(this, props) || this; _this.hideComboList = function (e) { var showTree = _this.state.showTree; var tDom = ReactDOM.findDOMNode(_this.comboList); if (showTree) { if (tDom && tDom.contains(e.target)) { _this.focus(); } else { setTimeout(function () { _this.setState({ showTree: false }); }, 200); } } }; _this.showComboList = function (showTree) { if (showTree) { var store = _this.props.store; if (store) { _this.getData(); } _this.setState({ showTree: showTree }); } }; _this.getReaderData = function (obj) { var reader = _this.props.reader; var data = []; if (reader.data) { data = _this.getReader(reader.data, obj) || []; } return data; }; _this.getReader = function (readerField, obj) { var data = null; if (obj && typeof obj === 'object' && readerField) { var s = readerField.split('.'); var d = obj[s[0]]; for (var i = 1; i < s.length; i++) { d = d[s[i]]; if (d instanceof Array && d.length > 0 && i < s.length - 1) { d = d[0]; } } if (d) { data = d; } } return data; }; _this.getData = function () { var _this$props = _this.props, cascadeParams = _this$props.cascadeParams, store = _this$props.store; var _ref = store || {}, params = _ref.params; var superParams = (0, _extends3["default"])({}, params || {}); if (cascadeParams) { _this.loaded = false; superParams = (0, _extends3["default"])({}, superParams, { cascadeParams: cascadeParams }); } if (!_this.loaded) { _this.loadData(superParams); } }; _this.loadData = function (params) { var _this$props2 = _this.props, store = _this$props2.store, afterLoaded = _this$props2.afterLoaded, reader = _this$props2.reader; var _ref2 = store || {}, url = _ref2.url, type = _ref2.type, _ref2$dataPath = _ref2.dataPath, dataPath = _ref2$dataPath === void 0 ? 'data' : _ref2$dataPath; var methodType = type || 'GET'; _this.setState({ loading: true }); var requestOptions = { method: methodType, url: url, headers: { neverCancel: true } }; if (methodType.toLocaleLowerCase() === 'get') { requestOptions.params = params; } else { requestOptions.data = params; } if (url) { (0, _axios["default"])(requestOptions).then(function (res) { if (res.success) { var resultData = res[dataPath] || []; var ds = []; if (reader && reader.data) { ds = _this.getReaderData(resultData); } else if (resultData instanceof Array) { ds = resultData; } _this.data = ds; _this.setState({ treeData: [].concat(ds) }); if (afterLoaded && afterLoaded instanceof Function) { afterLoaded(ds); } } })["finally"](function () { _this.loaded = true; _this.setState({ loading: false }); }); } }; _this.onClearValue = function () { var _this$props3 = _this.props, afterClear = _this$props3.afterClear, form = _this$props3.form, name = _this$props3.name, reader = _this$props3.reader, _this$props3$field = _this$props3.field, field = _this$props3$field === void 0 ? [] : _this$props3$field; _this.setState({ value: undefined }, function () { var _data; var data = (_data = {}, _data[name] = null, _data); if (reader && reader.field && field.length === reader.field.length) { field.forEach(function (f) { data[f] = null; }); } if (form) { form.setFieldsValue(data); } if (afterClear && afterClear instanceof Function) { afterClear(); } }); }; _this.filterNodes = function (filterName, valueKey, treeData, expandedKeys) { var reader = _this.props.reader; var childKey = reader.childKey; var newArr = []; treeData.forEach(function (treeNode) { var nodeChildren = treeNode[childKey] || treeNode[childFieldKey]; var fieldValue = _this.getReader(filterName, treeNode); if (fieldValue.toLowerCase().indexOf(valueKey) > -1) { newArr.push(treeNode); expandedKeys.push(_this.getRowKey(treeNode)); } else if (nodeChildren && nodeChildren.length > 0) { var _extends2; var ab = _this.filterNodes(filterName, valueKey, nodeChildren, expandedKeys); var obj = (0, _extends3["default"])({}, treeNode, (_extends2 = {}, _extends2[childKey || childFieldKey] = ab, _extends2)); if (ab && ab.length > 0) { newArr.push(obj); } } }); return newArr; }; _this.getLocalFilterData = function () { var expKeys = _this.state.expandedKeys; var _this$props4 = _this.props, reader = _this$props4.reader, name = _this$props4.name; var newData = [].concat(_this.data); var expandedKeys = [].concat(expKeys); var searchValue = _this.quickSearchValue; if (searchValue) { var filterName = name; if (reader && reader.name) { filterName = reader.name; } newData = _this.filterNodes(filterName, searchValue.toLowerCase(), newData, expandedKeys); } return { treeData: newData, expandedKeys: expandedKeys }; }; _this.onExpand = function (expandedKeys) { _this.setState({ expandedKeys: expandedKeys, autoExpandParent: false }); }; _this.handlerSearchChange = function (e) { _this.quickSearchValue = e.target.value; }; _this.setCursorPosition = function (ctrl, pos) { if (ctrl !== null && ctrl !== void 0 && ctrl.setSelectionRange) { ctrl.focus(); ctrl.setSelectionRange(pos, pos); } else if (ctrl !== null && ctrl !== void 0 && ctrl.createTextRange) { var range = ctrl.createTextRange(); range.collapse(true); range.moveEnd('character', pos); range.moveStart('character', pos); range.select(); } }; _this.focus = function () { if (_this.searchInput && _this.searchInput.input) { _this.setCursorPosition(_this.searchInput.input.input, _this.quickSearchValue.length); } }; _this.onSearch = function () { var _this$getLocalFilterD = _this.getLocalFilterData(), treeData = _this$getLocalFilterD.treeData, expandedKeys = _this$getLocalFilterD.expandedKeys; _this.setState({ treeData: treeData, expandedKeys: expandedKeys, autoExpandParent: true }, _this.focus); }; _this.initComboList = function (ref) { if (ref) { var width = _this.props.width; _this.comboList = ref; if (width && width > 0) { ref.parentNode.style.width = width + "px"; } } }; _this.getRowKey = function (item) { var _this$props$rowKey = _this.props.rowKey, rowKey = _this$props$rowKey === void 0 ? 'id' : _this$props$rowKey; var key; if (typeof rowKey === 'function') { key = rowKey(item); } else if (typeof rowKey === 'string') { key = item[rowKey]; } else { key = item.key; } if (!key) { throw new Error('rowKey is empty'); } return key; }; _this.getItemBySelectedKeys = function (selectedKeys) { var nodeData = []; for (var i = 0; i < selectedKeys.length; i++) { _this.getTreeNodeByKey(_this.data, nodeData, selectedKeys[i]); } return nodeData; }; _this.getTreeNodeByKey = function (treeNodes, nodeData, key) { var reader = _this.props.reader; var childKey = reader.childKey; for (var i = 0; i < treeNodes.length; i += 1) { var node = treeNodes[i]; var rowKey = _this.getRowKey(node); var nodeChildren = node[childKey] || node[childFieldKey]; if (rowKey === key) { nodeData.push(node); } if (nodeChildren && nodeChildren.length > 0) { _this.getTreeNodeByKey(nodeChildren, nodeData, key); } } }; _this.onSelect = function (selectedKeys, e) { var _this$props5 = _this.props, afterSelect = _this$props5.afterSelect, reader = _this$props5.reader, form = _this$props5.form, name = _this$props5.name, _this$props5$field = _this$props5.field, field = _this$props5$field === void 0 ? [] : _this$props5$field; if (e.selected) { var selectNodes = _this.getItemBySelectedKeys(selectedKeys); var item = selectNodes.length > 0 ? selectNodes[0] : null; _this.setState({ showTree: false, value: _this.getReader(reader.name, item) }, function () { var _ref3, _ref4; var data = name ? (_ref3 = {}, _ref3[name] = _this.getReader(reader.name, item), _ref3) : (_ref4 = {}, _ref4[reader.name] = _this.getReader(reader.name, item), _ref4); var formData = form ? form.getFieldsValue() : {}; if (reader && reader.field && field.length > 0 && field.length === reader.field.length) { field.forEach(function (f, idx) { data[f] = _this.getReader(reader.field ? reader.field[idx] : '', item); }); } Object.assign(formData, data); if (form) { debugger; form.setFieldsValue(formData); } if (afterSelect) { afterSelect(item); } }); } }; _this.renderTreeNodes = function (data) { var reader = _this.props.reader; var searchValue = _this.quickSearchValue; return data.map(function (item) { var name = reader.name, childKey = reader.childKey; var readerValue = item[name] || ''; var readerChildren = item[childKey] || item[childFieldKey]; var i = readerValue.indexOf(searchValue.toLowerCase()); var beforeStr = readerValue.substr(0, i); var afterStr = readerValue.substr(i + searchValue.length); var title = i > -1 ? /*#__PURE__*/_react["default"].createElement("span", null, beforeStr, /*#__PURE__*/_react["default"].createElement("span", { style: { color: '#f50' } }, searchValue), afterStr) : /*#__PURE__*/_react["default"].createElement("span", null, readerValue); if (readerChildren && readerChildren.length > 0) { return { title: title, key: _this.getRowKey(item), children: _this.renderTreeNodes(readerChildren) }; } return { title: title, key: _this.getRowKey(item) }; }); }; var defaultValue = props.defaultValue, value = props.value, _props$dataSource = props.dataSource, dataSource = _props$dataSource === void 0 ? [] : _props$dataSource; var defaultV = value || defaultValue || undefined; // 是否已经加载完成 _this.loaded = false; _this.data = [].concat(dataSource); // Dom节点 _this.comboList; // HTMLDivElement | undefined; // 当前选中节点 _this.select; // React.ReactNode; // 快速查询的value _this.quickSearchValue = ''; // string = ''; // searchInput ref _this.searchInput; // any; _this.state = { value: defaultV, loading: false, showTree: false, treeData: dataSource, autoExpandParent: true, defaultSelectedKeys: [], expandedKeys: [] }; return _this; } // 鼠标移入自动加载数据 var _proto = ComTree.prototype; _proto.componentDidMount = function componentDidMount() { document.addEventListener('mousedown', this.hideComboList, false); var store = this.props.store; if (store && store.autoLoad === true) { this.getData(); } console.log(this.props); }; _proto.componentWillUnmount = function componentWillUnmount() { document.removeEventListener('mousedown', this.hideComboList); }; _proto.componentDidUpdate = function componentDidUpdate(prevProps) { if (!(0, _lodash.isEqual)(prevProps.cascadeParams, this.props.cascadeParams) || !(0, _lodash.isEqual)(prevProps.value, this.props.value)) { var _this$props6 = this.props, defaultValue = _this$props6.defaultValue, value = _this$props6.value; var defaultV = value || defaultValue || undefined; this.setState({ value: defaultV }); } }; _proto.render = function render() { var _this2 = this; var _this$props7 = this.props, allowClear = _this$props7.allowClear, placeholder = _this$props7.placeholder, disabled = _this$props7.disabled, searchPlaceHolder = _this$props7.searchPlaceHolder, showSearch = _this$props7.showSearch, others = (0, _objectWithoutPropertiesLoose2["default"])(_this$props7, _excluded); var _this$state = this.state, loading = _this$state.loading, value = _this$state.value, treeData = _this$state.treeData, expandedKeys = _this$state.expandedKeys, autoExpandParent = _this$state.autoExpandParent, defaultSelectedKeys = _this$state.defaultSelectedKeys; return /*#__PURE__*/_react["default"].createElement("div", { className: "ComTree" }, /*#__PURE__*/_react["default"].createElement(_antd.Select, (0, _extends3["default"])({ ref: function ref(ele) { return _this2.select = ele; }, onDropdownVisibleChange: this.showComboList // open={showTree} , value: value, allowClear: allowClear, placeholder: placeholder, onChange: this.onClearValue, disabled: disabled }, others, { dropdownRender: function dropdownRender() { return /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames["default"])('seid-combo-tree'), ref: function ref(_ref5) { return _this2.initComboList(_ref5); } }, showSearch ? /*#__PURE__*/_react["default"].createElement("div", { className: "action-bar" }, /*#__PURE__*/_react["default"].createElement(Search, { ref: function ref(node) { return _this2.searchInput = node; }, placeholder: searchPlaceHolder, onChange: _this2.handlerSearchChange, onSearch: _this2.onSearch, onPressEnter: _this2.onSearch })) : null, /*#__PURE__*/_react["default"].createElement("div", { className: "list-body" }, /*#__PURE__*/_react["default"].createElement(_antd.Skeleton, { loading: loading, active: true }, /*#__PURE__*/_react["default"].createElement(_reactCustomScrollbars.Scrollbars, { style: { height: 220 } }, treeData && treeData.length === 0 ? /*#__PURE__*/_react["default"].createElement(Empty, { image: Empty.PRESENTED_IMAGE_SIMPLE }) : /*#__PURE__*/_react["default"].createElement(_antd.Tree, { autoExpandParent: autoExpandParent, expandedKeys: expandedKeys, defaultSelectedKeys: defaultSelectedKeys, onExpand: _this2.onExpand, onSelect: _this2.onSelect, treeData: _this2.renderTreeNodes(treeData) }))))); } }))); }; return ComTree; }(_react["default"].Component); exports["default"] = ComTree; ComTree.propTypes = {}; ComTree.defaultProps = { disabled: false, showSearch: true, store: null, dataSource: [], allowClear: false, placeholder: '', searchPlaceHolder: '', searchProperties: ['code', 'name'], rowKey: 'id', name: '', field: [] };