"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);