UNPKG

@cainiaofe/cn-ui-m

Version:
141 lines (140 loc) 7.72 kB
import { __assign, __spreadArray } from "tslib"; import $i18n from "../../../locales/i18n"; import React, { useContext } from 'react'; import { CnList } from "../../cn-list"; import { CnButton } from "../../cn-button"; import isFunction from 'lodash/isFunction'; import { CnSelector } from "../../cn-selector"; import { findInArray, isNil, isValidArray, mergeDataSource, replaceMessage, } from "../../../utils/func"; import SelectContext from '../context'; import Option from '../option'; import { defaultLocalFilterLowerCase, isSelected, removeItemFromArray, } from '../util'; import OptionGroup from '../option-group'; var sort = function (arr, value) { var selectedArr = []; var unSelectedArr = []; arr.forEach(function (item) { if (isSelected(value, item.value)) { selectedArr.push(item); } else { unSelectedArr.push(item); } }); return __spreadArray(__spreadArray([], selectedArr, true), unSelectedArr, true); }; var SelectBody = function (props) { var _a = useContext(SelectContext), prefix = _a.prefix, size = _a.size, displayType = _a.displayType, disabled = _a.disabled, mode = _a.mode, dataSource = _a.dataSource, _b = _a.filterLocal, filterLocal = _b === void 0 ? true : _b, _c = _a.stickyOnTop, stickyOnTop = _c === void 0 ? true : _c, _d = _a.filter, filter = _d === void 0 ? defaultLocalFilterLowerCase : _d, searchValue = _a.searchValue, innerValue = _a.innerValue, value = _a.value, transferSearchToOption = _a.transferSearchToOption, onChange = _a.onChange, onSearchAdd = _a.onSearchAdd, renderItem = _a.renderItem; var _e = props.searchToOptionBtnText, searchToOptionBtnText = _e === void 0 ? '' : _e, _f = props.emptySearchText, emptySearchText = _f === void 0 ? '' : _f; var renderWithTag = displayType === 'tag'; var renderWithMenu = !renderWithTag && mode === 'single'; var clsPrefix = "".concat(prefix, "select"); var dataSourceHasChildren = dataSource.some(function (it) { return it.children; }); // 执行排序 var filteredDataSource = filterLocal && !dataSourceHasChildren ? mergeDataSource(dataSource, __spreadArray(__spreadArray([], value, true), innerValue, true)).filter(function (item) { return filter(searchValue, item); }) // 内部过滤 dataSource : dataSource; if (mode === 'multiple' && stickyOnTop) { filteredDataSource = sort(filteredDataSource, value); } var emptySearchContent = (React.createElement("div", { className: "".concat(clsPrefix, "-search-empty") }, React.createElement("span", { className: "".concat(clsPrefix, "-search-empty-tip") }, searchValue ? replaceMessage(emptySearchText, { searchVal: searchValue }) : $i18n.get({ id: 'PleaseEnterAKeywordSearch', dm: '请输入关键词搜索', })))); // 这里原先是Menu实现,由于没有给选中的选项加className,导致无法定制样式,因此放弃掉,改用统一的Option if (renderWithMenu) { if (isValidArray(filteredDataSource)) { var renderOption_1 = function (it, index) { return (React.createElement(Option, __assign({ key: it.value + index, selected: isSelected(innerValue, it.value), disabled: disabled || it.disabled, multiple: false, onClick: function () { var onClick = it.onClick; if (isFunction(onClick)) { onClick(it.value); } onChange([__assign({ label: it.label, value: it.value }, it)]); } }, it), typeof renderItem === 'function' ? renderItem(it) : it.label)); }; var singleOptions = filteredDataSource.map(function (it, index) { if (it.children) { return (React.createElement(OptionGroup, { title: it.label, key: it.value + index, className: "".concat(clsPrefix, "-").concat(mode) }, it.children.map(function (child, childIndex) { return renderOption_1(child, childIndex); }))); } else { return renderOption_1(it, index); } }); return React.createElement(CnList, null, singleOptions); } return emptySearchContent; } if (renderWithTag) { return (React.createElement("div", { className: "".concat(prefix, "select--tag ").concat(prefix, "select--tag-").concat(size) }, React.createElement(CnSelector, { prefix: prefix, mode: mode, value: innerValue.map(function (it) { return it.value; }), dataSource: filteredDataSource, onChange: function (v) { if (isNil(v)) { onChange([]); return; } var newValue = Array.isArray(v) ? v : [v]; var newItems = newValue.map(function (x) { return findInArray(filteredDataSource, function (item) { return item.value === x; }); }); onChange(newItems); } }))); } var renderOptions = function (it) { return (React.createElement(Option, __assign({ key: it.value, selected: isSelected(innerValue, it.value), disabled: disabled || it.disabled, onClick: function () { var selectedItem = findInArray(innerValue, function (item) { return item.value === it.value; }); if (selectedItem) { onChange(removeItemFromArray(innerValue, selectedItem.value)); } else { onChange(__spreadArray(__spreadArray([], innerValue, true), [ __assign(__assign({}, it), { label: it.label, value: it.value }), ], false)); } } }, it), typeof renderItem === 'function' ? renderItem(it) : it.label)); }; var options = filteredDataSource.map(function (item) { if (item.children) { return (React.createElement(OptionGroup, { title: item.label, key: item.value }, item.children.map(function (child) { return renderOptions(child); }))); } else { return renderOptions(item); } }); // 常规渲染 // eslint-disable-next-line no-nested-ternary return transferSearchToOption ? (React.createElement(CnList, null, searchValue && !findInArray(filteredDataSource, function (it) { return "".concat(it.label) === "".concat(searchValue); }) && (React.createElement(Option // @ts-ignore , { // @ts-ignore isNew: true, onClick: function () { if (onSearchAdd) { onSearchAdd(searchValue, innerValue); } onChange(__spreadArray(__spreadArray([], innerValue, true), [ { label: searchValue, value: searchValue, userAdd: true, }, ], false)); } }, React.createElement("div", { style: { display: 'flex', flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', } }, React.createElement("span", null, searchValue), React.createElement(CnButton, { size: "small", type: "secondary" }, searchToOptionBtnText)))), options)) : isValidArray(filteredDataSource) ? (React.createElement(CnList, null, options)) : (emptySearchContent); }; export default SelectBody;