UNPKG

@cainiaofe/cn-ui-m

Version:
132 lines (131 loc) 7.31 kB
import { __assign, __spreadArray } from "tslib"; import $i18n from "../../../../locales/i18n"; import React, { useMemo, useState } from 'react'; import classNames from 'classnames'; import { SelectDrawer } from "../../../select-drawer"; import { CnTab, CnTabItem } from "../../../cn-tab"; import { CnReadOnly } from "../../../cn-read-only"; import { CascaderList } from './cascader-list'; import { calcSelectedList } from '../../utils'; import { withNativeProps, useControlled } from '@cainiaofe/cn-ui-common'; var clsPrefix = 'cn-ui-m-cascader'; var separator = '/'; export var CnCascaderSelect = function (props) { var _a, _b; var dataSource = props.dataSource, drawerClassName = props.drawerClassName, hasClear = props.hasClear, _c = props.rootTipText, rootTipText = _c === void 0 ? $i18n.get({ id: 'PleaseSelect', dm: '请选择' }) : _c, isPreview = props.isPreview, readOnly = props.readOnly, _d = props.size, size = _d === void 0 ? 'medium' : _d, placeholder = props.placeholder, disabled = props.disabled, loadData = props.loadData, onSelect = props.onSelect, renderContent = props.renderContent, insideFilter = props.insideFilter, insideForm = props.insideForm, _e = props.isArrayValue, isArrayValue = _e === void 0 ? false : _e; var _f = useControlled(props), value = _f[0], onChange = _f[1]; var initSelectedList = useMemo(function () { var curValue; if (isArrayValue && Array.isArray(value) && value.length) { curValue = value === null || value === void 0 ? void 0 : value[0]; } else { curValue = value; } return calcSelectedList(dataSource, curValue); }, [dataSource, value, isArrayValue]); // 当用户在选择内容,未点击确定按钮的时候,内部保存状态,不透出给外部消费 var _g = useState(initSelectedList), selectedList = _g[0], setSelectedList = _g[1]; var _h = useState(true), showSelectedChildren = _h[0], setShowSelectedChildren = _h[1]; var _j = useState(((_a = initSelectedList[initSelectedList.length - 1]) === null || _a === void 0 ? void 0 : _a.value) || 'placeholder'), selectedTabKey = _j[0], setSelectedTabKey = _j[1]; var resetSelected = function () { var _a; setSelectedList(initSelectedList); setSelectedTabKey(((_a = initSelectedList[initSelectedList.length - 1]) === null || _a === void 0 ? void 0 : _a.value) || 'placeholder'); }; if (isPreview || readOnly) { return (React.createElement(CnReadOnly, { value: initSelectedList.map(function (node) { return node.label; }).join(separator) })); } /** 之所以从 dataSource 取数,是因为 dataSource 受控 */ var getChildren = function (key) { if (!dataSource) return []; var temp = dataSource; if (!dataSource) return []; if (key === 'placeholder') return temp; var _loop_1 = function (item) { var findData = temp.find(function (_) { return _.value === item.value; }); temp = (findData === null || findData === void 0 ? void 0 : findData.children) || []; if (key === item.value) return { value: temp }; }; for (var _i = 0, selectedList_1 = selectedList; _i < selectedList_1.length; _i++) { var item = selectedList_1[_i]; var state_1 = _loop_1(item); if (typeof state_1 === "object") return state_1.value; } return []; }; var list = selectedList.map(function (item) { return __assign(__assign({}, item), { children: getChildren(item.value) }); }); if (!list.length) { list.push({ label: rootTipText, value: 'placeholder', children: dataSource, }); } else { var len = list.length; var last = list[len - 1]; if ((_b = last.children) === null || _b === void 0 ? void 0 : _b.length) { list.push({ label: rootTipText, value: 'placeholder', }); } } var handleChange = function () { var last = selectedList[selectedList.length - 1]; if (isArrayValue === true) { onChange([last === null || last === void 0 ? void 0 : last.value], [last]); } else { onChange(last === null || last === void 0 ? void 0 : last.value, last); } }; return withNativeProps(props, React.createElement(SelectDrawer, { placeholder: placeholder, disabled: disabled, hasClear: hasClear, size: size, className: classNames(clsPrefix), insideFilter: insideFilter, insideForm: insideForm, content: renderContent ? renderContent(initSelectedList, separator) : initSelectedList.map(function (item) { return item.label; }).join(separator), drawerClassName: classNames("".concat(clsPrefix, "-container"), drawerClassName), onOk: handleChange, onCancel: resetSelected, onClear: function () { return onChange(undefined); }, buttonPosition: "bottom", "data-testid": "cn-cascader-select" }, React.createElement(CnTab, { className: "".concat(clsPrefix, "-nav"), activeKey: "".concat(selectedTabKey, "_").concat(showSelectedChildren), contentClassName: "".concat(clsPrefix, "-content"), tabAlign: "left" }, list.map(function (item, i) { var children = item.children || []; var canSelect = true; if (!children.length || !showSelectedChildren) { var temp = list[i - 1]; if (temp) { children = temp.children || []; canSelect = false; } } return (React.createElement(CnTabItem, { key: "".concat(item.value, "_").concat(showSelectedChildren), itemKey: item.value, title: item.label || rootTipText, onClick: function () { if (item.value === 'placeholder') return; setShowSelectedChildren(false); if (i === 0) { setSelectedList([]); setSelectedTabKey('placeholder'); return; } if (selectedTabKey === item.value) return; setSelectedList(__spreadArray([], selectedList.slice(0, i + 1), true)); setSelectedTabKey(item.value || 'placeholder'); } }, React.createElement(CascaderList, { options: children, value: item.value, loadData: loadData, onClick: function (subItem) { if (canSelect) { setSelectedList(__spreadArray(__spreadArray([], selectedList, true), [subItem], false)); } else { setSelectedList(__spreadArray(__spreadArray([], selectedList.slice(0, i), true), [subItem], false)); } setShowSelectedChildren(true); setSelectedTabKey(subItem.value); onSelect === null || onSelect === void 0 ? void 0 : onSelect(subItem.value, subItem); } }))); })))); }; CnCascaderSelect.displayName = 'CnCascaderSelect';