react-admin-kit
Version:
A react based UI components for admin system
532 lines (505 loc) • 23.9 kB
JavaScript
import _typeof from "@babel/runtime/helpers/esm/typeof";
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
var _excluded = ["rowKey", "name", "onOpen", "defaultHideInSearch", "rakLocale", "noPadding", "options", "rowSelection", "delFunction", "delPermission", "delConfirmType", "delPopconfirmProps", "delModalConfirmProps", "delSuccessProps", "optionColumnSpaceProps", "tableAlertOptionRender", "tableAlertOption", "modalFormProps"],
_excluded2 = ["title"];
import AntProTable from '@ant-design/pro-table';
import produce from 'immer';
import styled, { css } from 'styled-components';
import ModalForm from "../ModalForm";
import { useContext, useEffect, useImperativeHandle, useRef, useState } from 'react';
import { LocaleContext, ProTableContext } from "../SettingProvider/context";
import Omit from 'omit.js';
import { myMergeOptions } from "../utils";
import { message, Modal, Popconfirm, Space } from 'antd';
import LinkButton from "../LinkButton";
import { exportTable, getAreaFields } from "./utils";
import { jsx as _jsx } from "react/jsx-runtime";
import { createElement as _createElement } from "react";
import { jsxs as _jsxs } from "react/jsx-runtime";
export var FORM_TYPE_LOCALE = {
new: 'formTypeNew',
edit: 'formTypeEdit',
read: 'formTypeRead'
};
var TableWrapper = styled.div.withConfig({
shouldForwardProp: function shouldForwardProp(prop) {
return !['noPadding'].includes(prop);
}
}).withConfig({
displayName: "TableWrapper",
componentId: "react-admin-kit__sc-1774qxd-0"
})(["& .ant-pro-table-alert-container{font-size:14px;}", ""], function (props) {
return props.noPadding && css(["& .ant-pro-card-body{padding-inline:unset;}"]);
});
var ProTable = function ProTable(props) {
var _globalLocale$delSucc;
var _message$useMessage = message.useMessage(),
_message$useMessage2 = _slicedToArray(_message$useMessage, 2),
messageApi = _message$useMessage2[0],
contextHolder = _message$useMessage2[1];
var _Modal$useModal = Modal.useModal(),
_Modal$useModal2 = _slicedToArray(_Modal$useModal, 2),
modal = _Modal$useModal2[0],
modalContextHolder = _Modal$useModal2[1];
// ------- state ---------
var _useState = useState('new'),
_useState2 = _slicedToArray(_useState, 2),
formType = _useState2[0],
setFormType = _useState2[1];
var _useState3 = useState(false),
_useState4 = _slicedToArray(_useState3, 2),
delLoading = _useState4[0],
setDelLoading = _useState4[1];
var _useState5 = useState([]),
_useState6 = _slicedToArray(_useState5, 2),
selectedRowKeys = _useState6[0],
setSelectedRowKeys = _useState6[1];
var _useState7 = useState([]),
_useState8 = _slicedToArray(_useState7, 2),
selectedRows = _useState8[0],
setSelectedRows = _useState8[1];
// ------- ref -----------
var actionRef = useRef();
var targetId = useRef();
// 全局默认设置
var globalLocale = useContext(LocaleContext);
var setting = useContext(ProTableContext) || {};
var safeProps = Omit(props, ['request', 'columns', 'formColumns', 'onFinish', 'innerRef', 'actionRef']);
var mergedProps = myMergeOptions(setting, safeProps || {},
// 默认值放在这里,能合并对象类属性
{
toolbar: {},
rakLocale: globalLocale,
delSuccessProps: {
content: (_globalLocale$delSucc = globalLocale.delSuccessContent) !== null && _globalLocale$delSucc !== void 0 ? _globalLocale$delSucc : '删除成功',
type: 'success'
},
delPopconfirmProps: {},
delModalConfirmProps: {},
optionColumnSpaceProps: {
size: 'small'
},
tableAlertOption: {
enableDelete: true,
spaceProps: {
size: 'middle'
},
delPopconfirmProps: {
okButtonProps: {
loading: delLoading
}
},
delModalConfirmProps: {
okButtonProps: {
loading: delLoading
}
}
}
});
var propsActionRef = props.actionRef,
propsInnerRef = props.innerRef,
columns = props.columns,
formColumns = props.formColumns,
request = props.request,
onFinish = props.onFinish;
var _mergedProps$rowKey = mergedProps.rowKey,
rowKey = _mergedProps$rowKey === void 0 ? 'id' : _mergedProps$rowKey,
name = mergedProps.name,
onOpen = mergedProps.onOpen,
_mergedProps$defaultH = mergedProps.defaultHideInSearch,
defaultHideInSearch = _mergedProps$defaultH === void 0 ? false : _mergedProps$defaultH,
rakLocale = mergedProps.rakLocale,
_mergedProps$noPaddin = mergedProps.noPadding,
noPadding = _mergedProps$noPaddin === void 0 ? false : _mergedProps$noPaddin,
_mergedProps$options = mergedProps.options,
options = _mergedProps$options === void 0 ? false : _mergedProps$options,
rowSelection = mergedProps.rowSelection,
delFunction = mergedProps.delFunction,
delPermission = mergedProps.delPermission,
_mergedProps$delConfi = mergedProps.delConfirmType,
delConfirmType = _mergedProps$delConfi === void 0 ? 'popconfirm' : _mergedProps$delConfi,
delPopconfirmProps = mergedProps.delPopconfirmProps,
delModalConfirmProps = mergedProps.delModalConfirmProps,
delSuccessProps = mergedProps.delSuccessProps,
optionColumnSpaceProps = mergedProps.optionColumnSpaceProps,
tableAlertOptionRender = mergedProps.tableAlertOptionRender,
tableAlertOption = mergedProps.tableAlertOption,
_mergedProps$modalFor = mergedProps.modalFormProps,
modalFormProps = _mergedProps$modalFor === void 0 ? {} : _mergedProps$modalFor,
restTableProps = _objectWithoutProperties(mergedProps, _excluded);
var hasDelPermission = delPermission ? delPermission() : true;
var getHeaderTitle = function getHeaderTitle() {
var toolbar = mergedProps.toolbar;
var _ref = toolbar,
title = _ref.title;
if (title) return title;
if (name) return "".concat(name).concat(rakLocale.tableTitleAfter);
return false;
};
var getModalTitle = function getModalTitle() {
var _mergedProps$name = mergedProps.name,
name = _mergedProps$name === void 0 ? '' : _mergedProps$name;
var localeKey = FORM_TYPE_LOCALE[formType];
var formTypeStr = rakLocale[localeKey];
return "".concat(formTypeStr).concat(name) || '';
};
var _modalFormProps$title = modalFormProps.title,
title = _modalFormProps$title === void 0 ? getModalTitle() : _modalFormProps$title,
modalFormRestProps = _objectWithoutProperties(modalFormProps, _excluded2);
// 这是传给 ModalForm 组件的, 所以类型是 ModalForm 的 innerRef 类型
var innerRef = useRef();
useImperativeHandle(propsInnerRef, function () {
return innerRef.current;
}, []);
var getActionRef = function getActionRef() {
// @ts-ignore
return propsActionRef || actionRef;
};
var patchRequest = function patchRequest() {
if (request) {
return function (params, sort, filter) {
return new Promise(function (resolve, reject) {
request(params, sort, filter).then(function (res) {
if (innerRef.current) {
innerRef.current.total = res.total;
innerRef.current.dataSource = res.data;
innerRef.current.params = params;
}
resolve(res);
}).catch(function (err) {
return reject(err);
});
});
};
}
};
var selfOnOpen = /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(formType, formRef, formData) {
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
setFormType(formType);
if (!onOpen) {
_context.next = 4;
break;
}
_context.next = 4;
return onOpen(formType, formRef, formData);
case 4:
case "end":
return _context.stop();
}
}, _callee);
}));
return function selfOnOpen(_x, _x2, _x3) {
return _ref2.apply(this, arguments);
};
}();
var getRecordKey = function getRecordKey(record) {
return typeof rowKey === 'function' ? rowKey(record) : record[rowKey];
};
// 分受控和非受控
var getRowSelection = function getRowSelection() {
// 如果属性上没有提供 selectedRowKeys 就转成内部受控
if (rowSelection && !rowSelection.selectedRowKeys) {
return _objectSpread(_objectSpread({}, rowSelection), {}, {
selectedRowKeys: selectedRowKeys,
onChange: function onChange(keys, selectedRows) {
setSelectedRowKeys(keys);
setSelectedRows(selectedRows);
}
});
}
return rowSelection;
};
var handleDelete = function handleDelete(selectedIds, record, callback) {
setDelLoading(true);
targetId.current = getRecordKey(record);
Promise.resolve(delFunction(selectedIds, record)).then(function () {
var _getActionRef$current;
if (delSuccessProps) {
messageApi.open(_objectSpread(_objectSpread({}, delSuccessProps), {}, {
content: delSuccessProps.content // 这么做仅仅是为了消除 ts 告警提示
}));
}
if (callback) callback();
// bugfix: 如果在多选选中后, 点的行上的删除, 而不是点的批量删除, 删除后要去除掉selectedKeys
if (getRecordKey(record) && rowSelection) {
var ids = (selectedIds || []).filter(function (id) {
return id !== getRecordKey(record);
});
if (rowSelection.selectedRowKeys) {
// @ts-ignore onChange 应有三个参数
if (rowSelection.onChange) rowSelection.onChange(ids);
} else {
setSelectedRowKeys(ids);
}
}
(_getActionRef$current = getActionRef().current) === null || _getActionRef$current === void 0 || _getActionRef$current.reload();
}).finally(function () {
setDelLoading(false);
});
};
var getDelDom = function getDelDom(_ref3) {
var popconfirmProps = _ref3.popconfirmProps,
modalFuncProps = _ref3.modalFuncProps,
disabled = _ref3.disabled,
danger = _ref3.danger,
loading = _ref3.loading,
btnText = _ref3.btnText;
if (delConfirmType === 'popconfirm') {
return /*#__PURE__*/_createElement(Popconfirm, _objectSpread(_objectSpread({}, popconfirmProps), {}, {
key: "del-dom"
}), /*#__PURE__*/_jsx(LinkButton, {
disabled: disabled,
onClick: function onClick(e) {
return e.stopPropagation();
},
loading: loading,
danger: danger,
children: btnText
}));
} else {
return /*#__PURE__*/_jsx(LinkButton, {
disabled: disabled,
onClick: function onClick(e) {
e.stopPropagation();
modal.confirm(modalFuncProps);
},
loading: loading,
danger: danger,
children: btnText
}, "del-dom");
}
};
var getTableAlertOptionRender = function getTableAlertOptionRender(option) {
var _rakLocale$alertDelPo, _rakLocale$alertDelMo;
var delDom = null;
var _ref4 = tableAlertOption,
enableDelete = _ref4.enableDelete,
delPopconfirmProps = _ref4.delPopconfirmProps,
delModalConfirmProps = _ref4.delModalConfirmProps,
spaceProps = _ref4.spaceProps;
var alertEnableDelete = typeof enableDelete === 'function' ? enableDelete(option.selectedRowKeys, option.selectedRows) : enableDelete;
var _ref5 = _typeof(alertEnableDelete) === 'object' ? alertEnableDelete : {},
_ref5$disabled = _ref5.disabled,
disabled = _ref5$disabled === void 0 ? false : _ref5$disabled,
_ref5$danger = _ref5.danger,
danger = _ref5$danger === void 0 ? false : _ref5$danger,
_ref5$btnText = _ref5.btnText,
btnText = _ref5$btnText === void 0 ? rakLocale === null || rakLocale === void 0 ? void 0 : rakLocale.alertDelBtnText : _ref5$btnText;
// 处理 popconfirm title 默认值
var popconfirmTitle = typeof delPopconfirmProps.title === 'function' ? delPopconfirmProps.title(option.selectedRowKeys, option.selectedRows) : delPopconfirmProps.title || (rakLocale === null || rakLocale === void 0 || (_rakLocale$alertDelPo = rakLocale.alertDelPopconfirmTitle) === null || _rakLocale$alertDelPo === void 0 ? void 0 : _rakLocale$alertDelPo.call(rakLocale, option.selectedRowKeys));
// 处理 popconfirm description 默认值
var popconfirmDescription = typeof delPopconfirmProps.description === 'function' ? delPopconfirmProps.description(option.selectedRowKeys, option.selectedRows) : delPopconfirmProps.description;
// 处理 modal title 默认值
var modalConfirmTitle = typeof delModalConfirmProps.title === 'function' ? delModalConfirmProps.title(option.selectedRowKeys, option.selectedRows) : delModalConfirmProps.title || (rakLocale === null || rakLocale === void 0 ? void 0 : rakLocale.alertDelModalConfirmTitle);
// 处理 modal content 默认值
var modalConfirmContent = typeof delModalConfirmProps.content === 'function' ? delModalConfirmProps.content(option.selectedRowKeys, option.selectedRows) : delModalConfirmProps.content || (rakLocale === null || rakLocale === void 0 || (_rakLocale$alertDelMo = rakLocale.alertDelModalConfirmContent) === null || _rakLocale$alertDelMo === void 0 ? void 0 : _rakLocale$alertDelMo.call(rakLocale, option.selectedRowKeys));
if (delFunction && hasDelPermission && alertEnableDelete) {
delDom = getDelDom({
disabled: disabled,
danger: danger,
btnText: btnText,
loading: delLoading,
popconfirmProps: _objectSpread(_objectSpread({}, delPopconfirmProps), {}, {
onConfirm: function onConfirm() {
var _delPopconfirmProps$o;
handleDelete(option.selectedRowKeys, {}, option.onCleanSelected);
delPopconfirmProps === null || delPopconfirmProps === void 0 || (_delPopconfirmProps$o = delPopconfirmProps.onConfirm) === null || _delPopconfirmProps$o === void 0 || _delPopconfirmProps$o.call(delPopconfirmProps);
},
title: popconfirmTitle,
description: popconfirmDescription
}),
modalFuncProps: _objectSpread(_objectSpread({}, delModalConfirmProps), {}, {
title: modalConfirmTitle,
content: modalConfirmContent,
onOk: function onOk() {
var _delModalConfirmProps;
handleDelete(option.selectedRowKeys, {}, option.onCleanSelected);
delModalConfirmProps === null || delModalConfirmProps === void 0 || (_delModalConfirmProps = delModalConfirmProps.onOk) === null || _delModalConfirmProps === void 0 || _delModalConfirmProps.call(delModalConfirmProps);
}
})
});
}
var cancelDom = /*#__PURE__*/_jsx(LinkButton, {
onClick: option.onCleanSelected,
children: option.intl.getMessage('alert.clear', '清空')
});
var defaultDom = /*#__PURE__*/_jsxs(Space, _objectSpread(_objectSpread({}, spaceProps), {}, {
children: [delDom, cancelDom]
}));
return tableAlertOptionRender ? tableAlertOptionRender(option, {
delDom: delDom,
cancelDom: cancelDom
}) : defaultDom;
};
/**
* 增加 render 函数
* 1. 给 option 列增加 innerRef
* 2. option 列的 renderDom 包裹 Space 组件
* 3. 加入删除节点
*/
var patchRender = function patchRender(columns, _ref6) {
var innerRef = _ref6.innerRef,
spaceProps = _ref6.spaceProps;
return produce(columns, function (cols) {
cols.forEach(function (col) {
var render = col.render,
_col$enableDelete = col.enableDelete,
enableDelete = _col$enableDelete === void 0 ? false : _col$enableDelete;
// 给 valueType 为 option 列的 render 增加 ref 参数
if (col.valueType === 'option' && render) {
col.render = function (text, record, index, action) {
var renderDom = render(text, record, index, action, innerRef);
// 增加删除节点
var enableDeleteResult = typeof enableDelete === 'function' ? enableDelete(record, index) : enableDelete;
if (delFunction && hasDelPermission && enableDeleteResult && Array.isArray(renderDom)) {
var _ref7 = _typeof(enableDeleteResult) === 'object' ? enableDeleteResult : {},
_ref7$disabled = _ref7.disabled,
disabled = _ref7$disabled === void 0 ? false : _ref7$disabled,
_ref7$danger = _ref7.danger,
danger = _ref7$danger === void 0 ? false : _ref7$danger,
_ref7$btnText = _ref7.btnText,
btnText = _ref7$btnText === void 0 ? rakLocale === null || rakLocale === void 0 ? void 0 : rakLocale.delBtnText : _ref7$btnText,
_ref7$btnIndex = _ref7.btnIndex,
btnIndex = _ref7$btnIndex === void 0 ? renderDom.length : _ref7$btnIndex;
// 处理 popconfirm title 默认值
var popconfirmTitle = typeof delPopconfirmProps.title === 'function' ? delPopconfirmProps.title(record, index) : delPopconfirmProps.title || (rakLocale === null || rakLocale === void 0 ? void 0 : rakLocale.delPopconfirmTitle);
// 处理 popconfirm description 默认值
var popconfirmDescription = typeof delPopconfirmProps.description === 'function' ? delPopconfirmProps.description(record, index) : delPopconfirmProps.description;
// 处理 modal title 默认值
var modalConfirmTitle = typeof delModalConfirmProps.title === 'function' ? delModalConfirmProps.title(record, index) : delModalConfirmProps.title || (rakLocale === null || rakLocale === void 0 ? void 0 : rakLocale.delModalConfirmTitle);
// 处理 modal content 默认值
var modalConfirmContent = typeof delModalConfirmProps.content === 'function' ? delModalConfirmProps.content(record, index) : delModalConfirmProps.content || (rakLocale === null || rakLocale === void 0 ? void 0 : rakLocale.delModalConfirmContent);
var delDom = getDelDom({
disabled: disabled,
danger: danger,
btnText: btnText,
loading: delLoading && getRecordKey(record) === targetId.current,
popconfirmProps: _objectSpread(_objectSpread({}, delPopconfirmProps), {}, {
onConfirm: function onConfirm() {
var _delPopconfirmProps$o2;
handleDelete([getRecordKey(record)], record);
delPopconfirmProps === null || delPopconfirmProps === void 0 || (_delPopconfirmProps$o2 = delPopconfirmProps.onConfirm) === null || _delPopconfirmProps$o2 === void 0 || _delPopconfirmProps$o2.call(delPopconfirmProps);
},
title: popconfirmTitle,
description: popconfirmDescription
}),
modalFuncProps: _objectSpread(_objectSpread({}, delModalConfirmProps), {}, {
title: modalConfirmTitle,
content: modalConfirmContent,
onOk: function onOk() {
var _delModalConfirmProps2;
handleDelete([getRecordKey(record)], record);
delModalConfirmProps === null || delModalConfirmProps === void 0 || (_delModalConfirmProps2 = delModalConfirmProps.onOk) === null || _delModalConfirmProps2 === void 0 || _delModalConfirmProps2.call(delModalConfirmProps);
}
})
});
renderDom.splice(btnIndex, 0, delDom);
}
//数组的话外面包一个 Space 组件
return Array.isArray(renderDom) ? /*#__PURE__*/_jsx(Space, _objectSpread(_objectSpread({}, spaceProps), {}, {
children: renderDom
})) : renderDom;
};
}
});
});
};
useEffect(function () {
if (innerRef.current) {
var exportColumns = getAreaFields(columns, 'export');
// 多语言
var defaultFilename = "".concat(name).concat(rakLocale === null || rakLocale === void 0 ? void 0 : rakLocale.tableTitleAfter) || (rakLocale === null || rakLocale === void 0 ? void 0 : rakLocale.exportFilename);
innerRef.current.export = function (rows, ExcelJS) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return exportTable(exportColumns, rows, ExcelJS, _objectSpread(_objectSpread({}, options), {}, {
filename: options.filename || defaultFilename
}));
};
}
}, [columns, name]);
useEffect(function () {
var tableReload = function tableReload() {
var _getActionRef$current2;
(_getActionRef$current2 = getActionRef().current) === null || _getActionRef$current2 === void 0 || _getActionRef$current2.reload();
};
/** 注册一个事件用于 reload 表格; 这对于一些已缓存的页面比较有用, 在其它页面可以控制刷新表格 */
document.addEventListener('@proTableReload', tableReload);
return function () {
document.removeEventListener('@proTableReload', tableReload);
};
}, []);
return /*#__PURE__*/_jsxs(TableWrapper, {
noPadding: noPadding,
children: [/*#__PURE__*/_jsx(AntProTable, _objectSpread({
rowKey: rowKey,
headerTitle: getHeaderTitle(),
actionRef: getActionRef(),
columns: patchRender(getAreaFields(columns, 'search', {
defaultHideInSearch: defaultHideInSearch
}).concat(getAreaFields(columns, 'table')), {
innerRef: innerRef,
spaceProps: optionColumnSpaceProps
}),
request: patchRequest(),
rowSelection: getRowSelection(),
tableAlertOptionRender: tableAlertOptionRender === false ? false : getTableAlertOptionRender,
options: options
}, restTableProps)), /*#__PURE__*/_jsx(ModalForm, _objectSpread({
title: title,
innerRef: innerRef
//@ts-ignore render 方法在 table 和 form 上的使用方法稍有不同,使用时需注意,最好两端分开用 render
,
columns: getAreaFields(formColumns || columns, 'form'),
onOpen: selfOnOpen,
onFinish: onFinish
}, modalFormRestProps)), contextHolder, modalContextHolder]
});
};
export default ProTable;
// 用于生成api文档
/* istanbul ignore next */
export var MyProTableSelfTypeComponent = function MyProTableSelfTypeComponent() {
return null;
};
// 用于生成api文档
/* istanbul ignore next */
export var MyProTableOriginTypeComponent = function MyProTableOriginTypeComponent() {
return null;
};
// 用于生成api文档
/* istanbul ignore next */
export var InnerRefTypeComponent = function InnerRefTypeComponent() {
return null;
};
// 用于生成api文档
/* istanbul ignore next */
export var TableAlertOptionTypeComponent = function TableAlertOptionTypeComponent() {
return null;
};
// 用于生成api文档
/* istanbul ignore next */
export var TableColumnTypeBaseComponent = function TableColumnTypeBaseComponent() {
return null;
};
// 用于生成api文档
/* istanbul ignore next */
export var TableColumnSelfTypeComponent = function TableColumnSelfTypeComponent() {
return null;
};
// 用于生成api文档
/* istanbul ignore next */
export var TableColumnOriginTypeComponent = function TableColumnOriginTypeComponent() {
return null;
};
// 用于生成api文档
/* istanbul ignore next */
export var EnableDeleteTypeComponent = function EnableDeleteTypeComponent() {
return null;
};