@flatbiz/antd
Version:
495 lines (486 loc) • 21.1 kB
JavaScript
/*! @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