225 lines
9.3 KiB
JavaScript
225 lines
9.3 KiB
JavaScript
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
|
|
var _excluded = ["radioType", "renderFormItem", "mode", "light", "label", "render"],
|
|
_excluded2 = ["onSearch", "onClear", "onChange", "onBlur", "showSearch", "autoClearSearchValue", "treeData", "fetchDataOnSearch", "searchValue"];
|
|
import { useIntl } from '@ant-design/pro-provider';
|
|
import { FieldLabel, objectToMap, proFieldParsingText } from '@ant-design/pro-utils';
|
|
import { ConfigProvider, Spin, TreeSelect } from 'antd';
|
|
import classNames from 'classnames';
|
|
import useMergedState from "rc-util/es/hooks/useMergedState";
|
|
import React, { useContext, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
import { useFieldFetchData } from "../Select";
|
|
|
|
// 兼容代码-----------
|
|
import "antd/es/spin/style";
|
|
import "antd/es/tree-select/style";
|
|
//----------------------
|
|
import { Fragment as _Fragment } from "react/jsx-runtime";
|
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
/**
|
|
* Tree select
|
|
* A function that returns a React component.
|
|
* @param ref
|
|
*/
|
|
var FieldTreeSelect = function FieldTreeSelect(_ref, ref) {
|
|
var radioType = _ref.radioType,
|
|
renderFormItem = _ref.renderFormItem,
|
|
mode = _ref.mode,
|
|
light = _ref.light,
|
|
label = _ref.label,
|
|
render = _ref.render,
|
|
rest = _objectWithoutProperties(_ref, _excluded);
|
|
var _useContext = useContext(ConfigProvider.ConfigContext),
|
|
getPrefixCls = _useContext.getPrefixCls;
|
|
var layoutClassName = getPrefixCls('pro-field-tree-select');
|
|
var treeSelectRef = useRef(null);
|
|
var _useState = useState(false),
|
|
_useState2 = _slicedToArray(_useState, 2),
|
|
open = _useState2[0],
|
|
setOpen = _useState2[1];
|
|
var _ref2 = rest.fieldProps,
|
|
onSearch = _ref2.onSearch,
|
|
_onClear = _ref2.onClear,
|
|
propsOnChange = _ref2.onChange,
|
|
_onBlur = _ref2.onBlur,
|
|
showSearch = _ref2.showSearch,
|
|
autoClearSearchValue = _ref2.autoClearSearchValue,
|
|
treeData = _ref2.treeData,
|
|
fetchDataOnSearch = _ref2.fetchDataOnSearch,
|
|
propsSearchValue = _ref2.searchValue,
|
|
fieldProps = _objectWithoutProperties(_ref2, _excluded2);
|
|
var intl = useIntl();
|
|
var _useFieldFetchData = useFieldFetchData(_objectSpread(_objectSpread({}, rest), {}, {
|
|
defaultKeyWords: propsSearchValue
|
|
})),
|
|
_useFieldFetchData2 = _slicedToArray(_useFieldFetchData, 3),
|
|
loading = _useFieldFetchData2[0],
|
|
options = _useFieldFetchData2[1],
|
|
_fetchData = _useFieldFetchData2[2];
|
|
var _useMergedState = useMergedState(undefined, {
|
|
onChange: onSearch,
|
|
value: propsSearchValue
|
|
}),
|
|
_useMergedState2 = _slicedToArray(_useMergedState, 2),
|
|
searchValue = _useMergedState2[0],
|
|
setSearchValue = _useMergedState2[1];
|
|
useImperativeHandle(ref, function () {
|
|
return _objectSpread(_objectSpread({}, treeSelectRef.current || {}), {}, {
|
|
fetchData: function fetchData(keyWord) {
|
|
return _fetchData(keyWord);
|
|
}
|
|
});
|
|
});
|
|
var optionsValueEnum = useMemo(function () {
|
|
if (mode !== 'read') return;
|
|
/**
|
|
* Support TreeSelect fieldNames
|
|
* @see https://ant.design/components/tree-select-cn
|
|
*/
|
|
var _ref3 = (fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.fieldNames) || {},
|
|
_ref3$value = _ref3.value,
|
|
valuePropsName = _ref3$value === void 0 ? 'value' : _ref3$value,
|
|
_ref3$label = _ref3.label,
|
|
labelPropsName = _ref3$label === void 0 ? 'label' : _ref3$label,
|
|
_ref3$children = _ref3.children,
|
|
childrenPropsName = _ref3$children === void 0 ? 'children' : _ref3$children;
|
|
var valuesMap = new Map();
|
|
var traverseOptions = function traverseOptions(_options) {
|
|
if (!(_options !== null && _options !== void 0 && _options.length)) {
|
|
return valuesMap;
|
|
}
|
|
var length = _options.length;
|
|
var i = 0;
|
|
while (i < length) {
|
|
var cur = _options[i++];
|
|
valuesMap.set(cur[valuePropsName], cur[labelPropsName]);
|
|
traverseOptions(cur[childrenPropsName]);
|
|
}
|
|
return valuesMap;
|
|
};
|
|
return traverseOptions(options);
|
|
}, [fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.fieldNames, mode, options]);
|
|
var onChange = function onChange(value, optionList, extra) {
|
|
// 将搜索框置空 和 antd 行为保持一致
|
|
if (showSearch && autoClearSearchValue) {
|
|
_fetchData(undefined);
|
|
setSearchValue(undefined);
|
|
}
|
|
propsOnChange === null || propsOnChange === void 0 || propsOnChange(value, optionList, extra);
|
|
};
|
|
if (mode === 'read') {
|
|
var dom = /*#__PURE__*/_jsx(_Fragment, {
|
|
children: proFieldParsingText(rest.text, objectToMap(rest.valueEnum || optionsValueEnum))
|
|
});
|
|
if (render) {
|
|
var _render;
|
|
return (_render = render(rest.text, _objectSpread(_objectSpread({
|
|
mode: mode
|
|
}, fieldProps), {}, {
|
|
treeData: options
|
|
}), dom)) !== null && _render !== void 0 ? _render : null;
|
|
}
|
|
return dom;
|
|
}
|
|
if (mode === 'edit') {
|
|
var _fieldProps$value;
|
|
var valuesLength = Array.isArray(fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.value) ? fieldProps === null || fieldProps === void 0 || (_fieldProps$value = fieldProps.value) === null || _fieldProps$value === void 0 ? void 0 : _fieldProps$value.length : 0;
|
|
var _dom = /*#__PURE__*/_jsx(Spin, {
|
|
spinning: loading,
|
|
children: /*#__PURE__*/_jsx(TreeSelect, _objectSpread(_objectSpread({
|
|
open: open,
|
|
onDropdownVisibleChange: function onDropdownVisibleChange(isOpen) {
|
|
var _fieldProps$onDropdow;
|
|
fieldProps === null || fieldProps === void 0 || (_fieldProps$onDropdow = fieldProps.onDropdownVisibleChange) === null || _fieldProps$onDropdow === void 0 || _fieldProps$onDropdow.call(fieldProps, isOpen);
|
|
setOpen(isOpen);
|
|
},
|
|
ref: treeSelectRef,
|
|
popupMatchSelectWidth: !light,
|
|
placeholder: intl.getMessage('tableForm.selectPlaceholder', '请选择'),
|
|
tagRender: light ? function (item) {
|
|
var _fieldProps$value2;
|
|
if (valuesLength < 2) return /*#__PURE__*/_jsx(_Fragment, {
|
|
children: item.label
|
|
});
|
|
/**
|
|
* 性能不好,等我给 antd 提个issue
|
|
*/
|
|
var itemIndex = fieldProps === null || fieldProps === void 0 || (_fieldProps$value2 = fieldProps.value) === null || _fieldProps$value2 === void 0 ? void 0 : _fieldProps$value2.findIndex(function (v) {
|
|
return v === item.value || v.value === item.value;
|
|
});
|
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
children: [item.label, " ", itemIndex < valuesLength - 1 ? ',' : '']
|
|
});
|
|
} : undefined,
|
|
bordered: !light
|
|
}, fieldProps), {}, {
|
|
treeData: options,
|
|
showSearch: showSearch,
|
|
style: _objectSpread({
|
|
minWidth: 60
|
|
}, fieldProps.style),
|
|
allowClear: fieldProps.allowClear !== false,
|
|
searchValue: searchValue,
|
|
autoClearSearchValue: autoClearSearchValue,
|
|
onClear: function onClear() {
|
|
_onClear === null || _onClear === void 0 || _onClear();
|
|
_fetchData(undefined);
|
|
if (showSearch) {
|
|
setSearchValue(undefined);
|
|
}
|
|
},
|
|
onChange: onChange,
|
|
onSearch: function onSearch(value) {
|
|
// fix 不支持请求的情况下不刷新options
|
|
if (fetchDataOnSearch && rest !== null && rest !== void 0 && rest.request) {
|
|
_fetchData(value);
|
|
}
|
|
setSearchValue(value);
|
|
},
|
|
onBlur: function onBlur(event) {
|
|
setSearchValue(undefined);
|
|
_fetchData(undefined);
|
|
_onBlur === null || _onBlur === void 0 || _onBlur(event);
|
|
},
|
|
className: classNames(fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.className, layoutClassName)
|
|
}))
|
|
});
|
|
if (renderFormItem) {
|
|
var _renderFormItem;
|
|
_dom = (_renderFormItem = renderFormItem(rest.text, _objectSpread(_objectSpread({
|
|
mode: mode
|
|
}, fieldProps), {}, {
|
|
options: options,
|
|
loading: loading
|
|
}), _dom)) !== null && _renderFormItem !== void 0 ? _renderFormItem : null;
|
|
}
|
|
if (light) {
|
|
var _fieldProps$value3;
|
|
var disabled = fieldProps.disabled,
|
|
placeholder = fieldProps.placeholder;
|
|
var notEmpty = !!fieldProps.value && ((_fieldProps$value3 = fieldProps.value) === null || _fieldProps$value3 === void 0 ? void 0 : _fieldProps$value3.length) !== 0;
|
|
return /*#__PURE__*/_jsx(FieldLabel, {
|
|
label: label,
|
|
disabled: disabled,
|
|
placeholder: placeholder,
|
|
onClick: function onClick() {
|
|
var _fieldProps$onDropdow2;
|
|
setOpen(true);
|
|
fieldProps === null || fieldProps === void 0 || (_fieldProps$onDropdow2 = fieldProps.onDropdownVisibleChange) === null || _fieldProps$onDropdow2 === void 0 || _fieldProps$onDropdow2.call(fieldProps, true);
|
|
},
|
|
bordered: rest.bordered,
|
|
value: notEmpty || open ? _dom : null,
|
|
style: notEmpty ? {
|
|
paddingInlineEnd: 0
|
|
} : undefined,
|
|
allowClear: false,
|
|
downIcon: false
|
|
});
|
|
}
|
|
return _dom;
|
|
}
|
|
return null;
|
|
};
|
|
export default /*#__PURE__*/React.forwardRef(FieldTreeSelect); |