UNPKG

@flatbiz/antd

Version:
495 lines (486 loc) 21.1 kB
/*! @flatjs/forge MIT @flatbiz/antd */ import _RedoOutlined from '@ant-design/icons/es/icons/RedoOutlined.js'; import { classNames } from '@dimjs/utils/class-names/class-names'; import _CaretDownFilled from '@ant-design/icons/es/icons/CaretDownFilled.js'; import { c as _toConsumableArray, _ as _objectWithoutProperties, a as _slicedToArray, b as _objectSpread2, i as _defineProperty } from './_rollupPluginBabelHelpers-BYm17lo8.js'; import { extend } from '@dimjs/utils/extend/extend'; import { hooks } from '@wove/react/hooks'; import { isArray } from '@dimjs/lang/is-array'; import { get } from '@dimjs/utils/get/get'; import { isObject } from '@dimjs/lang/is-object'; import { useState, useRef, useMemo, createElement } from 'react'; import { usePrevious } from 'ahooks'; import { TreeSelect, Button } from 'antd'; import { dequal } from 'dequal'; import { toArray, treeToTiledMap, isNotEmptyArray, treeToArray, isUndefinedOrNull } from '@flatbiz/utils'; import { fbaHooks } from './fba-hooks/index.js'; import { R as RequestStatus } from './request-status-BNGBHA33.js'; import { Model } from '@dimjs/model-react'; import { jsx } from 'react/jsx-runtime'; var defaultState = { treeSelectorList: [], treeSelectorTiledMap: {}, queryIsEmpty: false }; var TreeSelectorWrapperModel = { actions: { setSelectBoxList: function setSelectBoxList(params) { return function (state) { state.treeSelectorList = params.treeSelectorList || []; state.treeSelectorTiledMap = params.treeSelectorTiledMap || {}; state.requestStatus = 'request-success'; }; }, resetSelectBoxList: function resetSelectBoxList() { return function (state) { state.treeSelectorList = []; state.treeSelectorTiledMap = {}; }; }, changeRequestStatus: function changeRequestStatus(params) { return function (state) { state.requestStatus = params; }; } }, state: defaultState }; var treeSelectorWrapperModels = {}; /** * ``` * 使用方式 * const [state, actions] = useTreeSelectorWrapperModel('key值').useStore(); * ``` */ var treeSelectorWrapperModel = function treeSelectorWrapperModel(key) { if (!treeSelectorWrapperModels[key]) { treeSelectorWrapperModels[key] = Model(TreeSelectorWrapperModel); } return treeSelectorWrapperModels[key]; }; var getExpandedKeysByValue = function getExpandedKeysByValue(value, treeSelectorTiledMap) { var tempList = []; var parentNode = treeSelectorTiledMap[value]; while (parentNode) { var pId = parentNode.pId; parentNode = treeSelectorTiledMap[pId]; if (parentNode) { tempList.push(pId); } } return tempList; }; var getExpandedKeysByValues = function getExpandedKeysByValues(values, treeSelectorTiledMap) { if (values.length === 0) return []; var expandedKeys = []; values.forEach(function (value) { var targetList = getExpandedKeysByValue(value, treeSelectorTiledMap); expandedKeys.push.apply(expandedKeys, _toConsumableArray(targetList)); }); return Array.from(new Set(expandedKeys)); }; var _excluded = ["serviceConfig", "effectDependencyList", "onTreeSelectorListChange", "onTreeSelectorRequestError", "treeSelectorList", "requestMessageConfig", "modelKey", "value", "labelInValue", "labelInValueFieldNames", "onTreeItemDataAdapter", "selectedParentCheckedAllChildrenList", "fieldNames", "onChange", "treeDefaultExpandAll", "showAllOption", "initRootExpand", "treeDefaultExpandedKeys", "executeOnChangeInRenderFirstValue"]; /** * 树选择器包装组件,由于过度封装,部分antd TreeSelect原始功能不支持,不满足情况的请使用antd TreeSelect实现 * ``` * 1. 当设置treeSelectorList属性后,serviceConfig、onTreeSelectorListChange将失效 * 2. 父节点默认不返回,需要返回请设置showCheckedStrategy * ``` */ var TreeSelectorWrapper = function TreeSelectorWrapper(props) { var serviceConfig = props.serviceConfig, effectDependencyList = props.effectDependencyList, onTreeSelectorListChange = props.onTreeSelectorListChange, onTreeSelectorRequestError = props.onTreeSelectorRequestError, treeSelectorList = props.treeSelectorList, requestMessageConfig = props.requestMessageConfig, modelKey = props.modelKey, value = props.value, _labelInValue = props.labelInValue, labelInValueFieldNames = props.labelInValueFieldNames, onTreeItemDataAdapter = props.onTreeItemDataAdapter, _props$selectedParent = props.selectedParentCheckedAllChildrenList, selectedParentCheckedAllChildrenList = _props$selectedParent === void 0 ? true : _props$selectedParent, fieldNames = props.fieldNames, onChange = props.onChange, treeDefaultExpandAll = props.treeDefaultExpandAll, showAllOption = props.showAllOption, initRootExpand = props.initRootExpand, treeDefaultExpandedKeys = props.treeDefaultExpandedKeys, executeOnChangeInRenderFirstValue = props.executeOnChangeInRenderFirstValue, otherProps = _objectWithoutProperties(props, _excluded); /** * 不能使用key、defaultValue模式 * 1. 勾选的和回填选中不相同情况,勾选后会渲染defaultValue模式后,弹框被关闭,操作体验存在问题 */ var hasTreeSelectorList = Object.prototype.hasOwnProperty.call(props, 'treeSelectorList'); var newServiceConfig = serviceConfig || {}; var newEffectDependencyList = effectDependencyList || []; var _fbaHooks$useSafeStat = fbaHooks.useSafeState(false), _fbaHooks$useSafeStat2 = _slicedToArray(_fbaHooks$useSafeStat, 2), loading = _fbaHooks$useSafeStat2[0], setLoading = _fbaHooks$useSafeStat2[1]; var _useState = useState(), _useState2 = _slicedToArray(_useState, 2), treeExpandedKeys = _useState2[0], setTreeExpandedKeys = _useState2[1]; var _treeSelectorWrapperM = treeSelectorWrapperModel(modelKey).useStore(), _treeSelectorWrapperM2 = _slicedToArray(_treeSelectorWrapperM, 2), state = _treeSelectorWrapperM2[0], actions = _treeSelectorWrapperM2[1]; var requestPreKey = "request-progress-".concat(modelKey); var isMultiple = otherProps.treeCheckable || otherProps.multiple; var responseFirstRef = useRef(true); /** * treeCheckStrictly checkable 状态下节点选择完全受控(父子节点选中状态不再关联), * 会使得 labelInValue 强制为 true */ var labelInValue = useMemo(function () { if (otherProps.treeCheckStrictly) return true; return _labelInValue; }, [_labelInValue, otherProps.treeCheckStrictly]); var fieldNamesMerge = useMemo(function () { return _objectSpread2({ label: 'label', value: 'value', children: 'children', disabled: 'disabled' }, fieldNames); }, [fieldNames]); var labelInValueFieldNamesMerge = useMemo(function () { return _objectSpread2({ label: 'label', value: 'value' }, labelInValueFieldNames); }, [labelInValueFieldNames]); var allOptionConfig = useMemo(function () { if (showAllOption) { var isTrue = showAllOption === true; return { label: isTrue ? '全部' : showAllOption.label, value: isTrue ? '' : showAllOption.value }; } return null; }, [showAllOption]); var _useState3 = useState(), _useState4 = _slicedToArray(_useState3, 2), searchValue = _useState4[0], setSearchValue = _useState4[1]; var propsPureValue = fbaHooks.useMemoCustom(function () { return toArray(value).map(function (item) { if (isObject(item)) { return labelInValue ? item[labelInValueFieldNamesMerge.value] : item[fieldNamesMerge.value]; } return item; }); }, [fieldNamesMerge.value, labelInValue, labelInValueFieldNamesMerge.value, props.value]); var prevPropsPureValue = usePrevious(propsPureValue); fbaHooks.useEffectCustom(function () { if (state.treeSelectorList.length > 0) { if (responseFirstRef.current && executeOnChangeInRenderFirstValue && labelInValue) { var dataList = []; var originalList = []; propsPureValue.forEach(function (item) { var target = state.treeSelectorTiledMap[item]; if (target) { originalList.push(target); dataList.push(_defineProperty(_defineProperty({}, labelInValueFieldNamesMerge.label, target[fieldNamesMerge.label]), labelInValueFieldNamesMerge.value, target[fieldNamesMerge.value])); } }); if (isMultiple) { var _props$onChange; (_props$onChange = props.onChange) === null || _props$onChange === void 0 || _props$onChange.call(props, dataList ? dataList : undefined, originalList); } else { var _props$onChange2; (_props$onChange2 = props.onChange) === null || _props$onChange2 === void 0 || _props$onChange2.call(props, dataList ? dataList[0] : undefined, originalList[0]); } } var _treeExpandedKeys = []; if (responseFirstRef.current) { responseFirstRef.current = false; if (treeDefaultExpandedKeys) { _treeExpandedKeys = treeDefaultExpandedKeys; } else if (treeDefaultExpandAll) { var allValues = Object.keys(state.treeSelectorTiledMap).map(function (item) { var _state$treeSelectorTi; return (_state$treeSelectorTi = state.treeSelectorTiledMap[item]) === null || _state$treeSelectorTi === void 0 ? void 0 : _state$treeSelectorTi[fieldNamesMerge.value]; }); _treeExpandedKeys = allValues; } else if (initRootExpand && state.treeSelectorList.length === 1) { _treeExpandedKeys = [state.treeSelectorList[0][fieldNamesMerge.value]]; } setTreeExpandedKeys(_treeExpandedKeys); } // else { // responseFirstRef.current = false; // if (!searchValue) { // const expandedKeys = getExpandedKeysByValues( // propsPureValue, // state.treeSelectorTiledMap // ); // setTreeExpandedKeys(expandedKeys); // } // } } }, [propsPureValue, state.treeSelectorList]); fbaHooks.useEffectCustom(function () { if (!responseFirstRef.current && propsPureValue.length > 0) { if (state.treeSelectorList.length > 0 && JSON.stringify(propsPureValue) !== JSON.stringify(prevPropsPureValue)) { if (!searchValue) { var expandedKeys = getExpandedKeysByValues(propsPureValue, state.treeSelectorTiledMap); setTreeExpandedKeys(expandedKeys); } } } }, [propsPureValue, state.treeSelectorList]); var valueIsEmpty = function valueIsEmpty(value) { return value === '' || isUndefinedOrNull(value); }; var serviceResponseHandle = function serviceResponseHandle(respData) { var result = respData; if (newServiceConfig.onRequestResultAdapter) { result = newServiceConfig.onRequestResultAdapter(respData); } else if (fieldNamesMerge.list) { result = get(respData, fieldNamesMerge.list); } if (result && !isArray(result)) { console.warn('待渲染数据为非数组结构', result); return []; } return result || []; }; var startDataSourceRequest = hooks.useCallbackRef(function () { return new Promise(function ($return, $error) { var requiredParamsKeys, params, isEmpty, _newServiceConfig$onR, _respData, respData; if (!newServiceConfig.onRequest) { return $error(new Error('onRequest 调用接口服务不能为空')); } requiredParamsKeys = newServiceConfig.requiredParamsKeys || []; params = extend({}, newServiceConfig.params); isEmpty = requiredParamsKeys.find(function (key) { return valueIsEmpty(params[key]); }); if (isEmpty) { void actions.changeRequestStatus('no-dependencies-params'); console.warn("TreeSelectorWrapper\u7EC4\u4EF6\uFF1A\u53C2\u6570\uFF1A".concat(requiredParamsKeys.join('、'), "\u4E0D\u80FD\u4E3A\u7A7A")); return $return(); } var $Try_1_Post = function () { try { return $return(); } catch ($boundEx) { return $error($boundEx); } }; var $Try_1_Catch = function (error) { try { setLoading(false); window[requestPreKey] = false; void actions.changeRequestStatus('request-error'); onTreeSelectorRequestError === null || onTreeSelectorRequestError === void 0 || onTreeSelectorRequestError(error); return $Try_1_Post(); } catch ($boundEx) { return $error($boundEx); } }; try { setLoading(true); window[requestPreKey] = true; void actions.changeRequestStatus('request-progress'); return Promise.resolve((_newServiceConfig$onR = newServiceConfig.onRequest) === null || _newServiceConfig$onR === void 0 ? void 0 : _newServiceConfig$onR.call(newServiceConfig, params)).then(function ($await_2) { try { _respData = $await_2; respData = serviceResponseHandle(_respData); setLoading(false); window[requestPreKey] = false; onChangeSelectorList(respData || []); return $Try_1_Post(); } catch ($boundEx) { return $Try_1_Catch($boundEx); } }, $Try_1_Catch); } catch (error) { $Try_1_Catch(error); } }); }); hooks.useCustomCompareEffect(function () { if (hasTreeSelectorList) return; // 当无依赖项时,如果存在缓存数据,就不在调用接口 if (newEffectDependencyList.length) { // 内部主动清楚数据,被依赖的数据发生变更时,依赖组件数据清空 onChangeSelectorList([]); void startDataSourceRequest(); return; } var allState = treeSelectorWrapperModel(modelKey).getState(); if (allState.requestStatus === 'request-success') { return; } // 判断相同的modelKey是否已经在请求数据中,避免重复请求 if (!window[requestPreKey]) { void startDataSourceRequest(); return; } }, newEffectDependencyList, dequal); var onChangeSelectorList = hooks.useCallbackRef(function (dataList) { if ((dataList === null || dataList === void 0 ? void 0 : dataList.length) === 0 && state.treeSelectorList.length === 0) { void actions.setSelectBoxList({ treeSelectorList: [], treeSelectorTiledMap: {} }); onTreeSelectorListChange === null || onTreeSelectorListChange === void 0 || onTreeSelectorListChange([]); return; } // 全部选项 var tempItem = allOptionConfig ? _defineProperty(_defineProperty({}, fieldNamesMerge.label, allOptionConfig.label), fieldNamesMerge.value, allOptionConfig.value) : undefined; var newdataList = showAllOption ? [tempItem].concat(_toConsumableArray(dataList)) : dataList; void actions.setSelectBoxList({ treeSelectorList: newdataList, treeSelectorTiledMap: treeToTiledMap(newdataList, { value: fieldNamesMerge.value, children: fieldNamesMerge.children }, 'pId') }); onTreeSelectorListChange === null || onTreeSelectorListChange === void 0 || onTreeSelectorListChange(dataList); }); fbaHooks.useEffectCustom(function () { if (hasTreeSelectorList) { onChangeSelectorList(treeSelectorList || []); } }, [treeSelectorList]); var onTreeExpand = hooks.useCallbackRef(function (expandedKeys) { setTreeExpandedKeys(expandedKeys); }); var onAgainRequest = hooks.useCallbackRef(function () { void startDataSourceRequest(); }); /** * 根据treeCheckable、treeCheckStrictly、showCheckedStrategy等设置情况,判断返回数据是否包含父节点 * 1. 当 treeCheckable = true,changeValue 数据格式为 { label,value }[] */ var onInnerChange = hooks.useCallbackRef(function (changeValue, _data, triggerInfo) { var resultValueList = toArray(changeValue); if (otherProps.treeCheckStrictly) { if (selectedParentCheckedAllChildrenList && triggerInfo.checked) { var target = state.treeSelectorTiledMap[triggerInfo === null || triggerInfo === void 0 ? void 0 : triggerInfo.triggerValue]; if (isNotEmptyArray(target[fieldNamesMerge.children])) { resultValueList = treeToArray([target], fieldNamesMerge.children).map(function (item) { return item[fieldNamesMerge.value]; }); } else { resultValueList = changeValue === null || changeValue === void 0 ? void 0 : changeValue.map(function (item) { return item.value; }); } } else { resultValueList = changeValue === null || changeValue === void 0 ? void 0 : changeValue.map(function (item) { return item.value; }); } } if (labelInValue) { var resultItemList = resultValueList.map(function (item) { var target = state.treeSelectorTiledMap[item]; return _defineProperty(_defineProperty({}, labelInValueFieldNamesMerge.label, target[fieldNamesMerge.label]), labelInValueFieldNamesMerge.value, target[fieldNamesMerge.value]); }); if (isMultiple) { onChange === null || onChange === void 0 || onChange(resultItemList, resultItemList, triggerInfo); } else { onChange === null || onChange === void 0 || onChange(resultItemList[0], resultItemList[0], triggerInfo); } } else { var _resultItemList = resultValueList.map(function (item) { return state.treeSelectorTiledMap[item]; }); if (isMultiple) { onChange === null || onChange === void 0 || onChange(resultValueList, _resultItemList, triggerInfo); } else { onChange === null || onChange === void 0 || onChange(resultValueList[0], _resultItemList[0], triggerInfo); } } }); var mapTree = hooks.useCallbackRef(function (data) { if (!data) return null; return data.map(function (item) { var itemAdapterData = (onTreeItemDataAdapter === null || onTreeItemDataAdapter === void 0 ? void 0 : onTreeItemDataAdapter(_objectSpread2({}, item))) || item; var children = itemAdapterData[fieldNamesMerge.children]; var value = itemAdapterData[fieldNamesMerge.value]; var label = itemAdapterData[fieldNamesMerge.label]; var disabled = itemAdapterData[fieldNamesMerge.disabled] ? itemAdapterData[fieldNamesMerge.disabled] : itemAdapterData.disabled; return /*#__PURE__*/createElement(TreeSelect.TreeNode, _objectSpread2(_objectSpread2({}, itemAdapterData), {}, { disabled: disabled, value: value, title: label, key: "".concat(value) }), children && children.length > 0 && mapTree(children)); }); }); var onSearch = function onSearch(searchValue) { setSearchValue(searchValue); var targetKeyList = []; if (!searchValue) { setSearchValue(undefined); targetKeyList = propsPureValue; } else { Object.keys(state.treeSelectorTiledMap).forEach(function (item) { var target = state.treeSelectorTiledMap[item]; var label = target === null || target === void 0 ? void 0 : target[fieldNamesMerge.label]; if (label !== null && label !== void 0 && label.includes(searchValue)) { targetKeyList.push(target[fieldNamesMerge.value]); } }); } var expandedKeysMerge = getExpandedKeysByValues(targetKeyList, state.treeSelectorTiledMap); setTreeExpandedKeys(expandedKeysMerge); }; var treeValue = isMultiple ? propsPureValue : propsPureValue[0]; /** * 1. 使用 TreeNode 渲染节点,不能重写 fieldNames 配置 * 2. 使用 TreeNode 是为了实现 TreeNode ICON */ return /*#__PURE__*/jsx(TreeSelect, _objectSpread2(_objectSpread2({ searchValue: searchValue, dropdownStyle: { maxHeight: 400, overflow: 'auto' }, showSearch: true, treeLine: { showLeafIcon: false }, treeNodeFilterProp: "title", switcherIcon: /*#__PURE__*/jsx(_CaretDownFilled, {}), popupMatchSelectWidth: false }, otherProps), {}, { className: classNames('v-tree-select-wrapper', otherProps.className), popupClassName: classNames('v-tree-select-wrapper-dropdown', otherProps.popupClassName), onChange: onInnerChange, treeExpandedKeys: treeExpandedKeys, value: treeValue, onSearch: onSearch, loading: loading, onTreeExpand: onTreeExpand, style: _objectSpread2({ width: '100%' }, otherProps.style), suffixIcon: state.requestStatus === 'request-error' ? /*#__PURE__*/jsx(_RedoOutlined, { spin: loading, onClick: onAgainRequest }) : undefined, notFoundContent: /*#__PURE__*/jsx(RequestStatus, { status: state.requestStatus, messageConfig: requestMessageConfig, loading: loading, errorButton: /*#__PURE__*/jsx(Button, { type: "primary", onClick: onAgainRequest, children: "\u91CD\u65B0\u83B7\u53D6\u6570\u636E" }) }), children: mapTree(state.treeSelectorList) })); }; export { TreeSelectorWrapper as T }; //# sourceMappingURL=selector-DCHIIlhe.js.map