450 lines
20 KiB
JavaScript
450 lines
20 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.default = exports.ProDescriptions = exports.FieldRender = void 0;
|
||
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
||
var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
|
||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
||
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
||
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
||
var _icons = require("@ant-design/icons");
|
||
var _proForm = _interopRequireWildcard(require("@ant-design/pro-form"));
|
||
var _proSkeleton = _interopRequireDefault(require("@ant-design/pro-skeleton"));
|
||
var _proUtils = require("@ant-design/pro-utils");
|
||
var _antd = require("antd");
|
||
var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray"));
|
||
var _get = _interopRequireDefault(require("rc-util/lib/utils/get"));
|
||
var _react = _interopRequireWildcard(require("react"));
|
||
var _useFetchData = _interopRequireDefault(require("./useFetchData"));
|
||
var _proProvider = require("@ant-design/pro-provider");
|
||
require("antd/lib/descriptions/style");
|
||
var _jsxRuntime = require("react/jsx-runtime");
|
||
var _excluded = ["valueEnum", "render", "renderText", "mode", "plain", "dataIndex", "request", "params", "editable"],
|
||
_excluded2 = ["request", "columns", "params", "dataSource", "onDataSourceChange", "formProps", "editable", "loading", "onLoadingChange", "actionRef", "onRequestError", "emptyText", "contentStyle"]; // 兼容代码-----------
|
||
//----------------------
|
||
// todo remove it
|
||
/**
|
||
* 定义列表属性的类型定义,用于定义列表的一列
|
||
* @typedef {Object} ProDescriptionsItemProps
|
||
* @property {ProSchema} schema - 用于生成表格项的 schema 配置对象
|
||
* @property {boolean} [hide] - 是否隐藏该列,可用于权限控制
|
||
* @property {boolean} [plain] - 是否只展示文本,不展示标签
|
||
* @property {boolean} [copyable] - 是否可以拷贝该列的内容
|
||
* @property {boolean | { showTitle?: boolean }} [ellipsis] - 是否展示省略号,如果是一个对象,可以设置鼠标悬浮时是否展示完整的内容
|
||
* @property {ProFieldFCMode} [mode] - ProField 组件的模式
|
||
* @property {React.ReactNode} [children] - 表格项的子组件
|
||
* @property {number} [order] - 表格项的排序
|
||
* @property {number} [index] - 表格项的索引
|
||
* @template T - 表格数据的类型
|
||
* @template ValueType - 表格项的值类型
|
||
*/
|
||
/**
|
||
* 根据 dataIndex 获取值,支持 dataIndex 为数组
|
||
*
|
||
* @param item
|
||
* @param entity
|
||
*/
|
||
var getDataFromConfig = function getDataFromConfig(item, entity) {
|
||
var dataIndex = item.dataIndex;
|
||
if (dataIndex) {
|
||
var data = Array.isArray(dataIndex) ? (0, _get.default)(entity, dataIndex) : entity[dataIndex];
|
||
if (data !== undefined || data !== null) {
|
||
return data;
|
||
}
|
||
}
|
||
return item.children;
|
||
};
|
||
|
||
/**
|
||
* 这里会处理编辑的功能
|
||
*
|
||
* @param props
|
||
*/
|
||
var FieldRender = exports.FieldRender = function FieldRender(props) {
|
||
var _proTheme$useToken2;
|
||
var valueEnum = props.valueEnum,
|
||
action = props.action,
|
||
index = props.index,
|
||
text = props.text,
|
||
entity = props.entity,
|
||
mode = props.mode,
|
||
render = props.render,
|
||
editableUtils = props.editableUtils,
|
||
valueType = props.valueType,
|
||
plain = props.plain,
|
||
dataIndex = props.dataIndex,
|
||
request = props.request,
|
||
renderFormItem = props.renderFormItem,
|
||
params = props.params,
|
||
emptyText = props.emptyText;
|
||
var form = _proForm.default.useFormInstance();
|
||
var _proTheme$useToken = (_proTheme$useToken2 = _proProvider.proTheme.useToken) === null || _proTheme$useToken2 === void 0 ? void 0 : _proTheme$useToken2.call(_proProvider.proTheme),
|
||
token = _proTheme$useToken.token;
|
||
var fieldConfig = {
|
||
text: text,
|
||
valueEnum: valueEnum,
|
||
mode: mode || 'read',
|
||
proFieldProps: {
|
||
emptyText: emptyText,
|
||
render: render ? function (finText) {
|
||
return render === null || render === void 0 ? void 0 : render(finText, entity, index, action, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
|
||
type: 'descriptions'
|
||
}));
|
||
} : undefined
|
||
},
|
||
ignoreFormItem: true,
|
||
valueType: valueType,
|
||
request: request,
|
||
params: params,
|
||
plain: plain
|
||
};
|
||
|
||
/** 如果是只读模式,fieldProps 的 form是空的,所以需要兜底处理 */
|
||
if (mode === 'read' || !mode || valueType === 'option') {
|
||
var fieldProps = (0, _proUtils.getFieldPropsOrFormItemProps)(props.fieldProps, undefined, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
|
||
rowKey: dataIndex,
|
||
isEditable: false
|
||
}));
|
||
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_proForm.ProFormField, (0, _objectSpread2.default)((0, _objectSpread2.default)({
|
||
name: dataIndex
|
||
}, fieldConfig), {}, {
|
||
fieldProps: fieldProps
|
||
}));
|
||
}
|
||
var renderDom = function renderDom() {
|
||
var _editableUtils$action;
|
||
var formItemProps = (0, _proUtils.getFieldPropsOrFormItemProps)(props.formItemProps, form, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
|
||
rowKey: dataIndex,
|
||
isEditable: true
|
||
}));
|
||
var fieldProps = (0, _proUtils.getFieldPropsOrFormItemProps)(props.fieldProps, form, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
|
||
rowKey: dataIndex,
|
||
isEditable: true
|
||
}));
|
||
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
||
style: {
|
||
display: 'flex',
|
||
gap: token.marginXS,
|
||
alignItems: 'baseline'
|
||
},
|
||
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_proUtils.InlineErrorFormItem, (0, _objectSpread2.default)((0, _objectSpread2.default)({
|
||
name: dataIndex
|
||
}, formItemProps), {}, {
|
||
style: (0, _objectSpread2.default)({
|
||
margin: 0
|
||
}, (formItemProps === null || formItemProps === void 0 ? void 0 : formItemProps.style) || {}),
|
||
initialValue: text || (formItemProps === null || formItemProps === void 0 ? void 0 : formItemProps.initialValue),
|
||
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_proForm.ProFormField, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, fieldConfig), {}, {
|
||
// @ts-ignore
|
||
proFieldProps: (0, _objectSpread2.default)({}, fieldConfig.proFieldProps),
|
||
renderFormItem: renderFormItem ? function () {
|
||
return renderFormItem === null || renderFormItem === void 0 ? void 0 : renderFormItem((0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
|
||
type: 'descriptions'
|
||
}), {
|
||
isEditable: true,
|
||
recordKey: dataIndex,
|
||
record: form.getFieldValue([dataIndex].flat(1)),
|
||
defaultRender: function defaultRender() {
|
||
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_proForm.ProFormField, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, fieldConfig), {}, {
|
||
fieldProps: fieldProps
|
||
}));
|
||
},
|
||
type: 'descriptions'
|
||
}, form);
|
||
} : undefined,
|
||
fieldProps: fieldProps
|
||
}))
|
||
})), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
||
style: {
|
||
display: 'flex',
|
||
maxHeight: token.controlHeight,
|
||
alignItems: 'center',
|
||
gap: token.marginXS
|
||
},
|
||
children: editableUtils === null || editableUtils === void 0 || (_editableUtils$action = editableUtils.actionRender) === null || _editableUtils$action === void 0 ? void 0 : _editableUtils$action.call(editableUtils, dataIndex || index, {
|
||
cancelText: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.CloseOutlined, {}),
|
||
saveText: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.CheckOutlined, {}),
|
||
deleteText: false
|
||
})
|
||
})]
|
||
});
|
||
};
|
||
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
||
style: {
|
||
marginTop: -5,
|
||
marginBottom: -5,
|
||
marginLeft: 0,
|
||
marginRight: 0
|
||
},
|
||
children: renderDom()
|
||
});
|
||
};
|
||
var schemaToDescriptionsItem = function schemaToDescriptionsItem(items, entity, action, editableUtils, emptyText) {
|
||
var _items$map;
|
||
var options = [];
|
||
var isBigger58 = (0, _proUtils.compareVersions)(_antd.version, '5.8.0') >= 0;
|
||
// 因为 Descriptions 只是个语法糖,children 是不会执行的,所以需要这里处理一下
|
||
var children = items === null || items === void 0 || (_items$map = items.map) === null || _items$map === void 0 ? void 0 : _items$map.call(items, function (item, index) {
|
||
var _getDataFromConfig, _restItem$label, _restItem$label2;
|
||
if ( /*#__PURE__*/_react.default.isValidElement(item)) {
|
||
return isBigger58 ? {
|
||
children: item
|
||
} : item;
|
||
}
|
||
var _ref = item,
|
||
valueEnum = _ref.valueEnum,
|
||
render = _ref.render,
|
||
renderText = _ref.renderText,
|
||
mode = _ref.mode,
|
||
plain = _ref.plain,
|
||
dataIndex = _ref.dataIndex,
|
||
request = _ref.request,
|
||
params = _ref.params,
|
||
editable = _ref.editable,
|
||
restItem = (0, _objectWithoutProperties2.default)(_ref, _excluded);
|
||
var defaultData = (_getDataFromConfig = getDataFromConfig(item, entity)) !== null && _getDataFromConfig !== void 0 ? _getDataFromConfig : restItem.children;
|
||
var text = renderText ? renderText(defaultData, entity, index, action) : defaultData;
|
||
var title = typeof restItem.title === 'function' ? restItem.title(item, 'descriptions', null) : restItem.title;
|
||
|
||
// dataIndex 无所谓是否存在
|
||
// 有些时候不需要 dataIndex 可以直接 render
|
||
var valueType = typeof restItem.valueType === 'function' ? restItem.valueType(entity || {}, 'descriptions') : restItem.valueType;
|
||
var isEditable = editableUtils === null || editableUtils === void 0 ? void 0 : editableUtils.isEditable(dataIndex || index);
|
||
var fieldMode = mode || isEditable ? 'edit' : 'read';
|
||
var showEditIcon = editableUtils && fieldMode === 'read' && editable !== false && (editable === null || editable === void 0 ? void 0 : editable(text, entity, index)) !== false;
|
||
var Component = showEditIcon ? _antd.Space : _react.default.Fragment;
|
||
var contentDom = fieldMode === 'edit' ? text : (0, _proUtils.genCopyable)(text, item, text);
|
||
var field = isBigger58 && valueType !== 'option' ? (0, _objectSpread2.default)((0, _objectSpread2.default)({}, restItem), {}, {
|
||
key: restItem.key || ((_restItem$label = restItem.label) === null || _restItem$label === void 0 ? void 0 : _restItem$label.toString()) || index,
|
||
label: (title || restItem.label || restItem.tooltip) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_proUtils.LabelIconTip, {
|
||
label: title || restItem.label,
|
||
tooltip: restItem.tooltip,
|
||
ellipsis: item.ellipsis
|
||
}),
|
||
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(Component, {
|
||
children: [/*#__PURE__*/(0, _react.createElement)(FieldRender, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
|
||
key: item === null || item === void 0 ? void 0 : item.key,
|
||
dataIndex: item.dataIndex || index,
|
||
mode: fieldMode,
|
||
text: contentDom,
|
||
valueType: valueType,
|
||
entity: entity,
|
||
index: index,
|
||
emptyText: emptyText,
|
||
action: action,
|
||
editableUtils: editableUtils
|
||
})), showEditIcon && /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.EditOutlined, {
|
||
onClick: function onClick() {
|
||
editableUtils === null || editableUtils === void 0 || editableUtils.startEditable(dataIndex || index);
|
||
}
|
||
})]
|
||
})
|
||
}) : /*#__PURE__*/(0, _react.createElement)(_antd.Descriptions.Item, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, restItem), {}, {
|
||
key: restItem.key || ((_restItem$label2 = restItem.label) === null || _restItem$label2 === void 0 ? void 0 : _restItem$label2.toString()) || index,
|
||
label: (title || restItem.label || restItem.tooltip) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_proUtils.LabelIconTip, {
|
||
label: title || restItem.label,
|
||
tooltip: restItem.tooltip,
|
||
ellipsis: item.ellipsis
|
||
})
|
||
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(Component, {
|
||
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(FieldRender, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
|
||
dataIndex: item.dataIndex || index,
|
||
mode: fieldMode,
|
||
text: contentDom,
|
||
valueType: valueType,
|
||
entity: entity,
|
||
index: index,
|
||
action: action,
|
||
editableUtils: editableUtils
|
||
})), showEditIcon && valueType !== 'option' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.EditOutlined, {
|
||
onClick: function onClick() {
|
||
editableUtils === null || editableUtils === void 0 || editableUtils.startEditable(dataIndex || index);
|
||
}
|
||
})]
|
||
}));
|
||
// 如果类型是 option 自动放到右上角
|
||
if (valueType === 'option') {
|
||
options.push(field);
|
||
return null;
|
||
}
|
||
return field;
|
||
}).filter(function (item) {
|
||
return item;
|
||
});
|
||
return {
|
||
// 空数组传递还是会被判定为有值
|
||
options: options !== null && options !== void 0 && options.length ? options : null,
|
||
children: children
|
||
};
|
||
};
|
||
var ProDescriptionsItem = function ProDescriptionsItem(props) {
|
||
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Descriptions.Item, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
|
||
children: props.children
|
||
}));
|
||
};
|
||
ProDescriptionsItem.displayName = 'ProDescriptionsItem';
|
||
var DefaultProDescriptionsDom = function DefaultProDescriptionsDom(dom) {
|
||
return dom.children;
|
||
};
|
||
var ProDescriptions = exports.ProDescriptions = function ProDescriptions(props) {
|
||
var _props$editable;
|
||
var request = props.request,
|
||
columns = props.columns,
|
||
params = props.params,
|
||
dataSource = props.dataSource,
|
||
onDataSourceChange = props.onDataSourceChange,
|
||
formProps = props.formProps,
|
||
editable = props.editable,
|
||
loading = props.loading,
|
||
onLoadingChange = props.onLoadingChange,
|
||
actionRef = props.actionRef,
|
||
onRequestError = props.onRequestError,
|
||
emptyText = props.emptyText,
|
||
contentStyle = props.contentStyle,
|
||
rest = (0, _objectWithoutProperties2.default)(props, _excluded2);
|
||
var context = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext);
|
||
var action = (0, _useFetchData.default)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee() {
|
||
var data;
|
||
return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
|
||
while (1) switch (_context.prev = _context.next) {
|
||
case 0:
|
||
if (!request) {
|
||
_context.next = 6;
|
||
break;
|
||
}
|
||
_context.next = 3;
|
||
return request(params || {});
|
||
case 3:
|
||
_context.t0 = _context.sent;
|
||
_context.next = 7;
|
||
break;
|
||
case 6:
|
||
_context.t0 = {
|
||
data: {}
|
||
};
|
||
case 7:
|
||
data = _context.t0;
|
||
return _context.abrupt("return", data);
|
||
case 9:
|
||
case "end":
|
||
return _context.stop();
|
||
}
|
||
}, _callee);
|
||
})), {
|
||
onRequestError: onRequestError,
|
||
effects: [(0, _proUtils.stringify)(params)],
|
||
manual: !request,
|
||
dataSource: dataSource,
|
||
loading: loading,
|
||
onLoadingChange: onLoadingChange,
|
||
onDataSourceChange: onDataSourceChange
|
||
});
|
||
|
||
/*
|
||
* 可编辑行的相关配置
|
||
*/
|
||
var editableUtils = (0, _proUtils.useEditableMap)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, props.editable), {}, {
|
||
childrenColumnName: undefined,
|
||
dataSource: action.dataSource,
|
||
setDataSource: action.setDataSource
|
||
}));
|
||
|
||
/** 支持 reload 的功能 */
|
||
(0, _react.useEffect)(function () {
|
||
if (actionRef) {
|
||
actionRef.current = (0, _objectSpread2.default)({
|
||
reload: action.reload
|
||
}, editableUtils);
|
||
}
|
||
}, [action, actionRef, editableUtils]);
|
||
|
||
// loading 时展示
|
||
// loading = undefined 但是 request 存在时也应该展示
|
||
if (action.loading || action.loading === undefined && request) {
|
||
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_proSkeleton.default, {
|
||
type: "descriptions",
|
||
list: false,
|
||
pageHeader: false
|
||
});
|
||
}
|
||
var getColumns = function getColumns() {
|
||
// 因为 Descriptions 只是个语法糖,children 是不会执行的,所以需要这里处理一下
|
||
var childrenColumns = (0, _toArray.default)(props.children).filter(Boolean).map(function (item) {
|
||
if (! /*#__PURE__*/_react.default.isValidElement(item)) {
|
||
return item;
|
||
}
|
||
var _ref3 = item === null || item === void 0 ? void 0 : item.props,
|
||
valueEnum = _ref3.valueEnum,
|
||
valueType = _ref3.valueType,
|
||
dataIndex = _ref3.dataIndex,
|
||
ellipsis = _ref3.ellipsis,
|
||
copyable = _ref3.copyable,
|
||
itemRequest = _ref3.request;
|
||
if (!valueType && !valueEnum && !dataIndex && !itemRequest && !ellipsis && !copyable &&
|
||
// @ts-ignore
|
||
item.type.displayName !== 'ProDescriptionsItem') {
|
||
return item;
|
||
}
|
||
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item === null || item === void 0 ? void 0 : item.props), {}, {
|
||
entity: dataSource
|
||
});
|
||
});
|
||
return [].concat((0, _toConsumableArray2.default)(columns || []), (0, _toConsumableArray2.default)(childrenColumns)).filter(function (item) {
|
||
if (!item) return false;
|
||
if (item !== null && item !== void 0 && item.valueType && ['index', 'indexBorder'].includes(item === null || item === void 0 ? void 0 : item.valueType)) {
|
||
return false;
|
||
}
|
||
return !(item !== null && item !== void 0 && item.hideInDescriptions);
|
||
}).sort(function (a, b) {
|
||
if (b.order || a.order) {
|
||
return (b.order || 0) - (a.order || 0);
|
||
}
|
||
return (b.index || 0) - (a.index || 0);
|
||
});
|
||
};
|
||
var _schemaToDescriptions = schemaToDescriptionsItem(getColumns(), action.dataSource || {}, (actionRef === null || actionRef === void 0 ? void 0 : actionRef.current) || action, editable ? editableUtils : undefined, props.emptyText),
|
||
options = _schemaToDescriptions.options,
|
||
children = _schemaToDescriptions.children;
|
||
|
||
/** 如果不是可编辑模式,没必要注入 ProForm */
|
||
var FormComponent = editable ? _proForm.default : DefaultProDescriptionsDom;
|
||
|
||
/** 即使组件返回null了, 在传递的过程中还是会被Description检测到为有值 */
|
||
var title = null;
|
||
if (rest.title || rest.tooltip || rest.tip) {
|
||
title = /*#__PURE__*/(0, _jsxRuntime.jsx)(_proUtils.LabelIconTip, {
|
||
label: rest.title,
|
||
tooltip: rest.tooltip || rest.tip
|
||
});
|
||
}
|
||
var className = context.getPrefixCls('pro-descriptions');
|
||
var isBigger58 = (0, _proUtils.compareVersions)(_antd.version, '5.8.0') >= 0;
|
||
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_proUtils.ErrorBoundary, {
|
||
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(FormComponent, (0, _objectSpread2.default)((0, _objectSpread2.default)({
|
||
form: (_props$editable = props.editable) === null || _props$editable === void 0 ? void 0 : _props$editable.form,
|
||
component: false,
|
||
submitter: false
|
||
}, formProps), {}, {
|
||
onFinish: undefined,
|
||
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Descriptions, (0, _objectSpread2.default)((0, _objectSpread2.default)({
|
||
className: className
|
||
}, rest), {}, {
|
||
contentStyle: (0, _objectSpread2.default)({
|
||
minWidth: 0
|
||
}, contentStyle || {}),
|
||
extra: rest.extra ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_antd.Space, {
|
||
children: [options, rest.extra]
|
||
}) : options,
|
||
title: title,
|
||
items: isBigger58 ? children : undefined,
|
||
children: isBigger58 ? null : children
|
||
}))
|
||
}), "form")
|
||
});
|
||
};
|
||
ProDescriptions.Item = ProDescriptionsItem;
|
||
var _default = exports.default = ProDescriptions; |