450 lines
19 KiB
JavaScript
450 lines
19 KiB
JavaScript
"use strict";
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.useFieldFetchData = exports.proFieldParsingValueEnumToArray = exports.default = void 0;
|
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
var _proProvider = require("@ant-design/pro-provider");
|
|
var _proUtils = require("@ant-design/pro-utils");
|
|
var _antd = require("antd");
|
|
var _react = _interopRequireWildcard(require("react"));
|
|
var _swr = _interopRequireDefault(require("swr"));
|
|
var _LightSelect = _interopRequireDefault(require("./LightSelect"));
|
|
var _SearchSelect = _interopRequireDefault(require("./SearchSelect"));
|
|
require("antd/lib/select/style");
|
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
var _excluded = ["value", "text"],
|
|
_excluded2 = ["mode", "valueEnum", "render", "renderFormItem", "request", "fieldProps", "plain", "children", "light", "proFieldKey", "params", "label", "bordered", "id", "lightLabel", "labelTrigger"]; // 兼容代码-----------
|
|
//------------
|
|
var Highlight = function Highlight(_ref) {
|
|
var label = _ref.label,
|
|
words = _ref.words;
|
|
var _useContext = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext),
|
|
getPrefixCls = _useContext.getPrefixCls;
|
|
var lightCls = getPrefixCls('pro-select-item-option-content-light');
|
|
var optionCls = getPrefixCls('pro-select-item-option-content');
|
|
|
|
// css
|
|
var _useStyle = (0, _proUtils.useStyle)('Highlight', function (token) {
|
|
return (0, _defineProperty2.default)((0, _defineProperty2.default)({}, ".".concat(lightCls), {
|
|
color: token.colorPrimary
|
|
}), ".".concat(optionCls), {
|
|
flex: 'auto',
|
|
overflow: 'hidden',
|
|
whiteSpace: 'nowrap',
|
|
textOverflow: 'ellipsis'
|
|
});
|
|
}),
|
|
wrapSSR = _useStyle.wrapSSR;
|
|
var matchKeywordsRE = new RegExp(words.map(function (word) {
|
|
return word.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&');
|
|
}).join('|'), 'gi');
|
|
var matchText = label;
|
|
var elements = [];
|
|
while (matchText.length) {
|
|
var match = matchKeywordsRE.exec(matchText);
|
|
if (!match) {
|
|
elements.push(matchText);
|
|
break;
|
|
}
|
|
var start = match.index;
|
|
var matchLength = match[0].length + start;
|
|
elements.push(matchText.slice(0, start), /*#__PURE__*/_react.default.createElement('span', {
|
|
className: lightCls
|
|
}, matchText.slice(start, matchLength)));
|
|
matchText = matchText.slice(matchLength);
|
|
}
|
|
return wrapSSR( /*#__PURE__*/_react.default.createElement.apply(_react.default, ['div', {
|
|
title: label,
|
|
className: optionCls
|
|
}].concat(elements)));
|
|
};
|
|
|
|
/**
|
|
* 递归筛选 item
|
|
*
|
|
* @param item
|
|
* @param keyWords
|
|
* @returns
|
|
*/
|
|
function filerByItem(item, keyWords) {
|
|
var _item$label, _item$value;
|
|
if (!keyWords) return true;
|
|
if (item !== null && item !== void 0 && (_item$label = item.label) !== null && _item$label !== void 0 && _item$label.toString().toLowerCase().includes(keyWords.toLowerCase()) || item !== null && item !== void 0 && (_item$value = item.value) !== null && _item$value !== void 0 && _item$value.toString().toLowerCase().includes(keyWords.toLowerCase())) {
|
|
return true;
|
|
}
|
|
if (item.children || item.options) {
|
|
var findItem = [].concat((0, _toConsumableArray2.default)(item.children || []), [item.options || []]).find(function (mapItem) {
|
|
return filerByItem(mapItem, keyWords);
|
|
});
|
|
if (findItem) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 把 value 的枚举转化为数组
|
|
*
|
|
* @param valueEnum
|
|
*/
|
|
var proFieldParsingValueEnumToArray = exports.proFieldParsingValueEnumToArray = function proFieldParsingValueEnumToArray(valueEnumParams) {
|
|
var enumArray = [];
|
|
var valueEnum = (0, _proUtils.objectToMap)(valueEnumParams);
|
|
valueEnum.forEach(function (_, key) {
|
|
var value = valueEnum.get(key) || valueEnum.get("".concat(key));
|
|
if (!value) {
|
|
return;
|
|
}
|
|
if ((0, _typeof2.default)(value) === 'object' && value !== null && value !== void 0 && value.text) {
|
|
enumArray.push({
|
|
text: value === null || value === void 0 ? void 0 : value.text,
|
|
value: key,
|
|
label: value === null || value === void 0 ? void 0 : value.text,
|
|
disabled: value.disabled
|
|
});
|
|
return;
|
|
}
|
|
enumArray.push({
|
|
text: value,
|
|
value: key
|
|
});
|
|
});
|
|
return enumArray;
|
|
};
|
|
var useFieldFetchData = exports.useFieldFetchData = function useFieldFetchData(props) {
|
|
var _ref5, _props$debounceTime, _props$fieldProps3, _props$fieldProps6;
|
|
var cacheForSwr = props.cacheForSwr,
|
|
fieldProps = props.fieldProps;
|
|
var _useState = (0, _react.useState)(props.defaultKeyWords),
|
|
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
keyWords = _useState2[0],
|
|
setKeyWords = _useState2[1];
|
|
/** Key 是用来缓存请求的,如果不在是有问题 */
|
|
var _useState3 = (0, _react.useState)(function () {
|
|
if (props.proFieldKey) {
|
|
return props.proFieldKey.toString();
|
|
}
|
|
if (props.request) {
|
|
return (0, _proUtils.nanoid)();
|
|
}
|
|
return 'no-fetch';
|
|
}),
|
|
_useState4 = (0, _slicedToArray2.default)(_useState3, 1),
|
|
cacheKey = _useState4[0];
|
|
var proFieldKeyRef = (0, _react.useRef)(cacheKey);
|
|
var getOptionsFormValueEnum = (0, _proUtils.useRefFunction)(function (coverValueEnum) {
|
|
return proFieldParsingValueEnumToArray((0, _proUtils.objectToMap)(coverValueEnum)).map(function (_ref3) {
|
|
var value = _ref3.value,
|
|
text = _ref3.text,
|
|
rest = (0, _objectWithoutProperties2.default)(_ref3, _excluded);
|
|
return (0, _objectSpread2.default)({
|
|
label: text,
|
|
value: value,
|
|
key: value
|
|
}, rest);
|
|
});
|
|
});
|
|
var defaultOptions = (0, _proUtils.useDeepCompareMemo)(function () {
|
|
if (!fieldProps) return undefined;
|
|
var data = (fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.options) || (fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.treeData);
|
|
if (!data) return undefined;
|
|
var _ref4 = fieldProps.fieldNames || {},
|
|
children = _ref4.children,
|
|
label = _ref4.label,
|
|
value = _ref4.value;
|
|
var traverseFieldKey = function traverseFieldKey(_options, type) {
|
|
if (!(_options !== null && _options !== void 0 && _options.length)) return;
|
|
var length = _options.length;
|
|
var i = 0;
|
|
while (i < length) {
|
|
var cur = _options[i++];
|
|
var customFieldName = type === 'children' ? children : type === 'label' ? label : value;
|
|
if (customFieldName && cur[customFieldName] !== undefined) {
|
|
cur[type] = cur[customFieldName];
|
|
if (type === 'children') {
|
|
traverseFieldKey(cur[customFieldName], 'children');
|
|
traverseFieldKey(cur[customFieldName], 'label');
|
|
traverseFieldKey(cur[customFieldName], 'value');
|
|
}
|
|
}
|
|
}
|
|
};
|
|
if (children) traverseFieldKey(data, 'children');
|
|
if (label) traverseFieldKey(data, 'label');
|
|
if (value) traverseFieldKey(data, 'value');
|
|
return data;
|
|
}, [fieldProps]);
|
|
var _useMountMergeState = (0, _proUtils.useMountMergeState)(function () {
|
|
if (props.valueEnum) {
|
|
return getOptionsFormValueEnum(props.valueEnum);
|
|
}
|
|
return [];
|
|
}, {
|
|
value: defaultOptions
|
|
}),
|
|
_useMountMergeState2 = (0, _slicedToArray2.default)(_useMountMergeState, 2),
|
|
options = _useMountMergeState2[0],
|
|
setOptions = _useMountMergeState2[1];
|
|
(0, _proUtils.useDeepCompareEffect)(function () {
|
|
var _props$fieldProps, _props$fieldProps2;
|
|
// 优先使用 fieldProps?.options
|
|
if (!props.valueEnum || (_props$fieldProps = props.fieldProps) !== null && _props$fieldProps !== void 0 && _props$fieldProps.options || (_props$fieldProps2 = props.fieldProps) !== null && _props$fieldProps2 !== void 0 && _props$fieldProps2.treeData) return;
|
|
setOptions(getOptionsFormValueEnum(props.valueEnum));
|
|
}, [props.valueEnum]);
|
|
var swrKey = (0, _proUtils.useDebounceValue)([proFieldKeyRef.current, props.params, keyWords], (_ref5 = (_props$debounceTime = props.debounceTime) !== null && _props$debounceTime !== void 0 ? _props$debounceTime : props === null || props === void 0 || (_props$fieldProps3 = props.fieldProps) === null || _props$fieldProps3 === void 0 ? void 0 : _props$fieldProps3.debounceTime) !== null && _ref5 !== void 0 ? _ref5 : 0, [props.params, keyWords]);
|
|
var _useSWR = (0, _swr.default)(function () {
|
|
if (!props.request) {
|
|
return null;
|
|
}
|
|
return swrKey;
|
|
}, function (_ref6) {
|
|
var _ref7 = (0, _slicedToArray2.default)(_ref6, 3),
|
|
params = _ref7[1],
|
|
kw = _ref7[2];
|
|
return props.request((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
|
|
keyWords: kw
|
|
}), props);
|
|
}, {
|
|
revalidateIfStale: !cacheForSwr,
|
|
// 打开 cacheForSwr 的时候才应该支持两个功能
|
|
revalidateOnReconnect: cacheForSwr,
|
|
shouldRetryOnError: false,
|
|
// @todo 这个功能感觉应该搞个API出来
|
|
revalidateOnFocus: false
|
|
}),
|
|
data = _useSWR.data,
|
|
setLocaleData = _useSWR.mutate,
|
|
isValidating = _useSWR.isValidating;
|
|
var resOptions = (0, _react.useMemo)(function () {
|
|
var _props$fieldProps4, _props$fieldProps5;
|
|
var opt = options === null || options === void 0 ? void 0 : options.map(function (item) {
|
|
if (typeof item === 'string') {
|
|
return {
|
|
label: item,
|
|
value: item
|
|
};
|
|
}
|
|
if (item.children || item.options) {
|
|
var childrenOptions = [].concat((0, _toConsumableArray2.default)(item.children || []), (0, _toConsumableArray2.default)(item.options || [])).filter(function (mapItem) {
|
|
return filerByItem(mapItem, keyWords);
|
|
});
|
|
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
|
|
children: childrenOptions,
|
|
options: childrenOptions
|
|
});
|
|
}
|
|
return item;
|
|
});
|
|
|
|
// filterOption 为 true 时 filter数据, filterOption 默认为true
|
|
if (((_props$fieldProps4 = props.fieldProps) === null || _props$fieldProps4 === void 0 ? void 0 : _props$fieldProps4.filterOption) === true || ((_props$fieldProps5 = props.fieldProps) === null || _props$fieldProps5 === void 0 ? void 0 : _props$fieldProps5.filterOption) === undefined) {
|
|
return opt === null || opt === void 0 ? void 0 : opt.filter(function (item) {
|
|
if (!item) return false;
|
|
if (!keyWords) return true;
|
|
return filerByItem(item, keyWords);
|
|
});
|
|
}
|
|
return opt;
|
|
}, [options, keyWords, (_props$fieldProps6 = props.fieldProps) === null || _props$fieldProps6 === void 0 ? void 0 : _props$fieldProps6.filterOption]);
|
|
var applyFieldNamesMapping = function applyFieldNamesMapping(item) {
|
|
if (!(fieldProps !== null && fieldProps !== void 0 && fieldProps.fieldNames)) return item;
|
|
var _fieldProps$fieldName = fieldProps.fieldNames,
|
|
_fieldProps$fieldName2 = _fieldProps$fieldName.label,
|
|
labelKey = _fieldProps$fieldName2 === void 0 ? 'label' : _fieldProps$fieldName2,
|
|
_fieldProps$fieldName3 = _fieldProps$fieldName.value,
|
|
valueKey = _fieldProps$fieldName3 === void 0 ? 'value' : _fieldProps$fieldName3;
|
|
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
|
|
label: item[labelKey],
|
|
value: item[valueKey]
|
|
});
|
|
};
|
|
var finalData = props.request ? data === null || data === void 0 ? void 0 : data.map(function (item) {
|
|
return applyFieldNamesMapping(item);
|
|
}) : undefined;
|
|
return [isValidating, finalData || resOptions, function (fetchKeyWords) {
|
|
setKeyWords(fetchKeyWords);
|
|
}, function () {
|
|
setKeyWords(undefined);
|
|
setLocaleData([], false);
|
|
}];
|
|
};
|
|
|
|
/**
|
|
* 可以根据 valueEnum 来进行类型的设置
|
|
*
|
|
* @param
|
|
*/
|
|
var FieldSelect = function FieldSelect(props, ref) {
|
|
var _ConfigProvider$useCo;
|
|
var mode = props.mode,
|
|
valueEnum = props.valueEnum,
|
|
render = props.render,
|
|
renderFormItem = props.renderFormItem,
|
|
request = props.request,
|
|
fieldProps = props.fieldProps,
|
|
plain = props.plain,
|
|
children = props.children,
|
|
light = props.light,
|
|
proFieldKey = props.proFieldKey,
|
|
params = props.params,
|
|
label = props.label,
|
|
bordered = props.bordered,
|
|
id = props.id,
|
|
lightLabel = props.lightLabel,
|
|
labelTrigger = props.labelTrigger,
|
|
rest = (0, _objectWithoutProperties2.default)(props, _excluded2);
|
|
var inputRef = (0, _react.useRef)();
|
|
var intl = (0, _proProvider.useIntl)();
|
|
var keyWordsRef = (0, _react.useRef)('');
|
|
(0, _react.useEffect)(function () {
|
|
keyWordsRef.current = fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.searchValue;
|
|
}, [fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.searchValue]);
|
|
var _useFieldFetchData = useFieldFetchData(props),
|
|
_useFieldFetchData2 = (0, _slicedToArray2.default)(_useFieldFetchData, 4),
|
|
loading = _useFieldFetchData2[0],
|
|
options = _useFieldFetchData2[1],
|
|
_fetchData = _useFieldFetchData2[2],
|
|
resetData = _useFieldFetchData2[3];
|
|
var _ref8 = (_antd.ConfigProvider === null || _antd.ConfigProvider === void 0 || (_ConfigProvider$useCo = _antd.ConfigProvider.useConfig) === null || _ConfigProvider$useCo === void 0 ? void 0 : _ConfigProvider$useCo.call(_antd.ConfigProvider)) || {
|
|
componentSize: 'middle'
|
|
},
|
|
componentSize = _ref8.componentSize;
|
|
(0, _react.useImperativeHandle)(ref, function () {
|
|
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, inputRef.current || {}), {}, {
|
|
fetchData: function fetchData(keyWord) {
|
|
return _fetchData(keyWord);
|
|
}
|
|
});
|
|
}, [_fetchData]);
|
|
var optionsValueEnum = (0, _react.useMemo)(function () {
|
|
if (mode !== 'read') return;
|
|
|
|
/**
|
|
* Support select fieldNames
|
|
* Similar to cascader fieldNames support
|
|
*/
|
|
var _ref9 = (fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.fieldNames) || {},
|
|
_ref9$value = _ref9.value,
|
|
valuePropsName = _ref9$value === void 0 ? 'value' : _ref9$value,
|
|
_ref9$label = _ref9.label,
|
|
labelPropsName = _ref9$label === void 0 ? 'label' : _ref9$label,
|
|
_ref9$options = _ref9.options,
|
|
optionsPropsName = _ref9$options === void 0 ? 'options' : _ref9$options;
|
|
var traverseOptions = function traverseOptions(_options) {
|
|
var localMap = new Map();
|
|
if (!(_options !== null && _options !== void 0 && _options.length)) {
|
|
return localMap;
|
|
}
|
|
var length = _options.length;
|
|
for (var i = 0; i < length; i++) {
|
|
var cur = _options[i];
|
|
|
|
// Use fieldNames mapping to get correct value and label
|
|
var curValue = cur[valuePropsName];
|
|
var curLabel = cur[labelPropsName];
|
|
if (curValue !== undefined && curLabel !== undefined) {
|
|
localMap.set(curValue, curLabel);
|
|
}
|
|
|
|
// Handle nested options with fieldNames mapping
|
|
var childOptions = cur[optionsPropsName] || cur.options;
|
|
if (childOptions !== null && childOptions !== void 0 && childOptions.length) {
|
|
var childMap = traverseOptions(childOptions);
|
|
childMap.forEach(function (v, k) {
|
|
return localMap.set(k, v);
|
|
});
|
|
}
|
|
}
|
|
return localMap;
|
|
};
|
|
return traverseOptions(options);
|
|
}, [mode, options, fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.fieldNames]);
|
|
if (mode === 'read') {
|
|
var dom = /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
children: (0, _proUtils.proFieldParsingText)(rest.text, (0, _proUtils.objectToMap)(valueEnum || optionsValueEnum))
|
|
});
|
|
if (render) {
|
|
var _render;
|
|
return (_render = render(dom, (0, _objectSpread2.default)((0, _objectSpread2.default)({
|
|
mode: mode
|
|
}, fieldProps), {}, {
|
|
options: options
|
|
}), dom)) !== null && _render !== void 0 ? _render : null;
|
|
}
|
|
return dom;
|
|
}
|
|
if (mode === 'edit' || mode === 'update') {
|
|
var renderDom = function renderDom() {
|
|
if (light) {
|
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_LightSelect.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _proUtils.compatibleBorder)(bordered)), {}, {
|
|
id: id,
|
|
loading: loading,
|
|
ref: inputRef,
|
|
allowClear: true,
|
|
size: componentSize,
|
|
options: options,
|
|
label: label,
|
|
placeholder: intl.getMessage('tableForm.selectPlaceholder', '请选择'),
|
|
lightLabel: lightLabel,
|
|
labelTrigger: labelTrigger,
|
|
fetchData: _fetchData
|
|
}, fieldProps));
|
|
}
|
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchSelect.default, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({
|
|
className: rest.className,
|
|
style: (0, _objectSpread2.default)({
|
|
minWidth: 100
|
|
}, rest.style)
|
|
}, (0, _proUtils.compatibleBorder)(bordered)), {}, {
|
|
id: id,
|
|
loading: loading,
|
|
ref: inputRef,
|
|
allowClear: true,
|
|
defaultSearchValue: props.defaultKeyWords,
|
|
notFoundContent: loading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Spin, {
|
|
size: "small"
|
|
}) : fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.notFoundContent,
|
|
fetchData: function fetchData(keyWord) {
|
|
keyWordsRef.current = keyWord !== null && keyWord !== void 0 ? keyWord : '';
|
|
_fetchData(keyWord);
|
|
},
|
|
resetData: resetData,
|
|
preserveOriginalLabel: true,
|
|
optionItemRender: function optionItemRender(item) {
|
|
if (typeof item.label === 'string' && keyWordsRef.current) {
|
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(Highlight, {
|
|
label: item.label,
|
|
words: [keyWordsRef.current]
|
|
});
|
|
}
|
|
return item.label;
|
|
},
|
|
placeholder: intl.getMessage('tableForm.selectPlaceholder', '请选择'),
|
|
label: label
|
|
}, fieldProps), {}, {
|
|
options: options
|
|
}), "SearchSelect");
|
|
};
|
|
var _dom = renderDom();
|
|
if (renderFormItem) {
|
|
var _renderFormItem;
|
|
return (_renderFormItem = renderFormItem(rest.text, (0, _objectSpread2.default)((0, _objectSpread2.default)({
|
|
mode: mode
|
|
}, fieldProps), {}, {
|
|
options: options,
|
|
loading: loading
|
|
}), _dom)) !== null && _renderFormItem !== void 0 ? _renderFormItem : null;
|
|
}
|
|
return _dom;
|
|
}
|
|
return null;
|
|
};
|
|
var _default = exports.default = /*#__PURE__*/_react.default.forwardRef(FieldSelect); |