UNPKG

acud

Version:

acg react 组件库

265 lines (263 loc) • 11.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _dedupe = _interopRequireDefault(require("classnames/dedupe")); var _OutlinedClose = _interopRequireDefault(require("acud-icon/lib/icons/OutlinedClose")); var _createWorker = require("../_util/createWorker"); var _loading = _interopRequireDefault(require("../loading")); var _table = _interopRequireDefault(require("../table")); var _TargetList = _interopRequireDefault(require("./TargetList")); var _search = _interopRequireDefault(require("../search")); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(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 (var _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); } /* * transfer 穿梭框 * author zhousheng */ var defaultFilterOption = function defaultFilterOption(inputValue, option) { return option.title.indexOf(inputValue) > -1; }; var Target = function Target(props) { var prefixCls = props.prefixCls, displayType = props.displayType, _props$showClearAll = props.showClearAll, showClearAll = _props$showClearAll === void 0 ? true : _props$showClearAll, _props$filterOption = props.filterOption, filterOption = _props$filterOption === void 0 ? defaultFilterOption : _props$filterOption, showSearch = props.showSearch, _props$showSearchClea = props.showSearchClear, showSearchClear = _props$showSearchClea === void 0 ? true : _props$showSearchClea, tKeys = props.tKeys, setTKeys = props.setTKeys, loading = props.loading, setLoading = props.setLoading, useWorker = props.useWorker, _props$workerLimit = props.workerLimit, workerLimit = _props$workerLimit === void 0 ? 100000 : _props$workerLimit, _props$workerLoading = props.workerLoading, workerLoading = _props$workerLoading === void 0 ? true : _props$workerLoading, rightStyle = props.rightStyle, locale = props.locale, expansionSource = props.expansionSource, columns = props.columns, pagination = props.pagination, onSearch = props.onSearch, _props$tableRightProp = props.tableRightProps, tableRightProps = _props$tableRightProp === void 0 ? {} : _props$tableRightProp, _props$searchRightPro = props.searchRightProps, searchRightProps = _props$searchRightPro === void 0 ? {} : _props$searchRightPro; var targetCls = "".concat(prefixCls, "-target"); var targetTitle = locale.targetTitle, searchPlaceholder = locale.searchPlaceholder, targetNoData = locale.targetNoData, targetNoSearchData = locale.targetNoSearchData, clearAll = locale.clearAll, workerLoadingTip = locale.workerLoadingTip; var _React$useState = React.useState([]), _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2), targetSource = _React$useState2[0], setTargetSource = _React$useState2[1]; React.useEffect(function () { var tkSet = new Set(tKeys); if (useWorker && expansionSource.length > workerLimit && tKeys.length > workerLimit) { workerLoading && setLoading(true); var tsWorker = (0, _createWorker.createWorker)(function (e) { var _e$data = e.data, expansionSource = _e$data.expansionSource, tkSet = _e$data.tkSet; var tsArr = expansionSource.filter(function (data) { return tkSet.has(data.key) // eslint-disable-next-line max-nested-callbacks || data.group && data.childrenKeys.some(function (childKey) { return tkSet.has(childKey); }); }); self.postMessage(tsArr); }); tsWorker.addEventListener('message', function (event) { setTargetSource(event.data); tsWorker.terminate(); workerLoading && setLoading(false); }); tsWorker.postMessage({ expansionSource: expansionSource, tkSet: tkSet }); } else { var tsArr = expansionSource.filter(function (data) { return tkSet.has(data.key) || data.group && data.childrenKeys.some(function (childKey) { return tkSet.has(childKey); }); }); setTargetSource(tsArr); } }, [expansionSource, tKeys]); // 搜索关键字 var _React$useState3 = React.useState(''), _React$useState4 = (0, _slicedToArray2["default"])(_React$useState3, 2), searchValue = _React$useState4[0], setSearchValue = _React$useState4[1]; var filterSource = React.useMemo(function () { if (searchValue === '') { return targetSource; } var tfs = targetSource.filter(function (data) { if (data.group) { return filterOption(searchValue, data) || data.children.some(function (child) { return tKeys.includes(child.key) && filterOption(searchValue, child); }); } if (data.groupOption) { var parentData = targetSource.find(function (cData) { return cData.key === data.groupKey; }); return filterOption(searchValue, data) || filterOption(searchValue, parentData); } return filterOption(searchValue, data); }); return tfs; }, [searchValue, targetSource, filterOption]); // 已选项 var optionSource = React.useMemo(function () { return filterSource.filter(function (data) { return !data.group; }); }, [filterSource]); // 已选中的可操作的key var totalUndisabledKeys = React.useMemo(function () { var unDisabledTargetSource = optionSource.filter(function (data) { return !data.disabled; }); return unDisabledTargetSource.map(function (data) { return data.key; }); }, [optionSource]); // 已选中的不可操作的key var totalDisabledKeys = React.useMemo(function () { var unDisabledTargetSource = optionSource.filter(function (data) { return data.disabled; }); return unDisabledTargetSource.map(function (data) { return data.key; }); }, [optionSource]); var handleClearAll = React.useCallback(function () { var tukSet = new Set(totalUndisabledKeys); if (useWorker && tKeys.length > workerLimit && totalUndisabledKeys.length > workerLimit) { workerLoading && setLoading(true); var tkWorker = (0, _createWorker.createWorker)(function (e) { var _e$data2 = e.data, tukSet = _e$data2.tukSet, tKeys = _e$data2.tKeys; var newTKeys = tKeys.filter(function (key) { return !tukSet.has(key); }); self.postMessage(newTKeys); }); tkWorker.addEventListener('message', function (event) { setTKeys(event.data); tkWorker.terminate(); workerLoading && setLoading(false); }); tkWorker.postMessage({ tukSet: tukSet, tKeys: tKeys }); } else { // const newTKeys = tKeys.filter(key => !totalUndisabledKeys.includes(key)); var newTKeys = tKeys.filter(function (key) { return !tukSet.has(key); }); setTKeys(newTKeys); } }, [totalUndisabledKeys, tKeys, useWorker, workerLimit, workerLoading]); var searchChange = React.useCallback(function (e) { var searchValue = e.target.value; setSearchValue(searchValue); onSearch === null || onSearch === void 0 ? void 0 : onSearch('right', searchValue); }, [onSearch]); var targetColumns = React.useMemo(function () { if (!columns) { return; } var cancelItem = function cancelItem(data) { if (data.disabled) { return; } var curTKeys = (0, _toConsumableArray2["default"])(tKeys); if (data.group) { var deleteKeys = data.childrenKeys; curTKeys = curTKeys.filter(function (tKey) { return !deleteKeys.includes(tKey); }); } else if (curTKeys.includes(data.key)) { curTKeys.splice(curTKeys.indexOf(data.key), 1); } setTKeys(curTKeys); }; var tColumns = (0, _toConsumableArray2["default"])(columns); tColumns.push({ title: '', key: 'action', width: 40, render: function render(_text, data) { if (!data.disabled) { return /*#__PURE__*/React.createElement(_OutlinedClose["default"], { className: "".concat(prefixCls, "-target-item-cancel"), onClick: function onClick() { return cancelItem(data); } }); } return null; } }); return tColumns; }, [columns, tKeys]); var clearCls = (0, _dedupe["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, "".concat(targetCls, "-clear-all"), true), "".concat(targetCls, "-clear-all-disabled"), filterSource.length === totalDisabledKeys.length)); return /*#__PURE__*/React.createElement(_loading["default"], { loading: loading, tip: workerLoadingTip, size: "small" }, /*#__PURE__*/React.createElement("div", { className: targetCls, style: rightStyle }, /*#__PURE__*/React.createElement("div", { className: "".concat(targetCls, "-header") }, /*#__PURE__*/React.createElement("span", { className: "".concat(targetCls, "-label") }, targetTitle, "\uFF08", optionSource.length, "\uFF09"), showClearAll && /*#__PURE__*/React.createElement("span", { className: clearCls, "aria-disabled": optionSource.length === totalDisabledKeys.length, onClick: handleClearAll }, clearAll)), /*#__PURE__*/React.createElement("div", { className: "".concat(targetCls, "-body") }, (showSearch === true || showSearch === 'right') && /*#__PURE__*/React.createElement(_search["default"], (0, _extends2["default"])({ placeholder: searchPlaceholder, className: "".concat(targetCls, "-search"), allowClear: showSearchClear, size: "small", onChange: searchChange }, searchRightProps)), displayType === 'table' && /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-table-box") }, /*#__PURE__*/React.createElement(_table["default"], (0, _extends2["default"])({ pagination: pagination ? (0, _extends2["default"])({ total: optionSource.length }, pagination) : false, dataSource: filterSource, columns: targetColumns }, tableRightProps))), !!filterSource.length && displayType === 'single' && /*#__PURE__*/React.createElement(_TargetList["default"], (0, _extends2["default"])({}, props, { filterSource: filterSource })), filterSource.length === 0 && displayType === 'single' && /*#__PURE__*/React.createElement("p", { className: "".concat(prefixCls, "-target-nodata") }, /*#__PURE__*/React.createElement("span", null, searchValue === '' ? targetNoData : targetNoSearchData))))); }; var _default = exports["default"] = Target;