@jay.kou/rak-ssr
Version:
A react based UI components for admin system
573 lines (552 loc) • 27.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.FORM_TYPE_MAP = void 0;
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _immer = _interopRequireDefault(require("immer"));
var _react = require("react");
var _proTable = _interopRequireDefault(require("@ant-design/pro-table"));
var _antd = require("antd");
var _LinkButton = _interopRequireDefault(require("../LinkButton"));
var _ModalForm = _interopRequireDefault(require("../ModalForm"));
var _filterCols = require("./filterCols");
var _utils = require("./utils");
var _classnames = _interopRequireDefault(require("classnames"));
var _context = require("../SettingProvider/context");
var _exceljs = require("../utils/exceljs");
var _ModalConfirm = _interopRequireDefault(require("./components/ModalConfirm"));
var _context2 = require("../context");
var _index = require("../utils/index");
var _treeUtil = require("../utils/treeUtil");
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["title"],
_excluded2 = ["btnText", "title"],
_excluded3 = ["rowKey", "name", "columns", "options", "pagination", "formColumns", "scroll", "onFinish", "tableAlertOption", "rowSelection", "sticky", "className", "optionColSpaceSize", "noPadding", "search", "request", "onOpen", "modalProps", "formProps", "defaultHideInSearch", "confirmModalProps", "confirmModelType", "optionColumnSpaceProps", "actionRef"],
_excluded4 = ["modalProps", "formProps", "searchConfig", "options", "defaultHideInSearch", "confirmModalType", "confirmModalProps", "tableAlertOption"]; // todo: 改成支持 ssr
// import './styles.css';
/**
* 表单类型的映射
*/
var FORM_TYPE_MAP = exports.FORM_TYPE_MAP = {
new: '新增',
edit: '编辑',
read: '查看'
};
var ProTable = /*#__PURE__*/function (_Component) {
(0, _inherits2.default)(ProTable, _Component);
var _super = (0, _createSuper2.default)(ProTable);
function ProTable(props) {
var _this;
(0, _classCallCheck2.default)(this, ProTable);
_this = _super.call(this, props);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "targetId", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "selfInnerRef", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "selfActionRef", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "baseInnerObj", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "context", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "tableReload", function () {
var _currentActionRef$cur;
var currentActionRef = _this.props.actionRef || _this.selfActionRef;
(_currentActionRef$cur = currentActionRef.current) === null || _currentActionRef$cur === void 0 || _currentActionRef$cur.reload();
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getInnerRef", function () {
return _this.props.innerRef || _this.selfInnerRef;
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getTitle", function () {
var _this$props = _this.props,
name = _this$props.name,
_this$props$toolbar = _this$props.toolbar,
toolbar = _this$props$toolbar === void 0 ? {} : _this$props$toolbar;
var title = toolbar.title;
if (title) return title;
if (name) return "".concat(name, "\u5217\u8868");
return false;
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getModalTitle", function () {
var _this$props$name = _this.props.name,
name = _this$props$name === void 0 ? '' : _this$props$name;
var formType = _this.state.formType;
return "".concat(FORM_TYPE_MAP[formType]).concat(name) || '';
});
/**
* 增强列功能
* 1. 给 option 列增加 innerRef
* 2. option 列的 renderDom 包裹 Space 组件
* @param cols
* @returns cols
*/
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "patchColumn", function ($cols) {
/**
* 全局默认设置
*/
var setting = _this.context || {};
var globalSpaceProps = setting.optionColumnSpaceProps;
var _this$props$optionCol = _this.props.optionColumnSpaceProps,
optionColumnSpaceProps = _this$props$optionCol === void 0 ? {} : _this$props$optionCol;
var innerRef = _this.getInnerRef();
var mergedSpaceProps = (0, _index.mergeOptions)({
size: 'small'
}, globalSpaceProps, optionColumnSpaceProps);
return (0, _immer.default)($cols, function (cols) {
cols.forEach(function (col) {
var render = col.render;
// 给valueType为option列的render增加ref参数
if (col.valueType === 'option' && render) {
col.render = function (text, record, index, action) {
var renderDom = render(text, record, index, action, innerRef);
//数组的话外面包一个 Space 组件
return Array.isArray(renderDom) ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Space, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, mergedSpaceProps), {}, {
children: renderDom
})) : renderDom;
};
}
});
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "enableDelete", function ($cols) {
/**
* 全局默认设置
*/
var setting = _this.context || {};
var globalType = setting.confirmModalType,
globalProps = setting.confirmModalProps;
// props
var _this$props2 = _this.props,
_this$props2$rowKey = _this$props2.rowKey,
rowKey = _this$props2$rowKey === void 0 ? 'id' : _this$props2$rowKey,
delPermission = _this$props2.delPermission,
delFunction = _this$props2.delFunction,
_this$props2$confirmM = _this$props2.confirmModelType,
confirmModelType = _this$props2$confirmM === void 0 ? globalType || 'popconfirm' : _this$props2$confirmM,
_this$props2$confirmM2 = _this$props2.confirmModalProps,
confirmModalProps = _this$props2$confirmM2 === void 0 ? {} : _this$props2$confirmM2;
var mergedProps = (0, _index.mergeOptions)(globalProps, confirmModalProps);
var hasDelPermission = delPermission ? delPermission() : true;
// state
var delLoading = _this.state.delLoading;
// 使用produce是为了改变columns的引用, 从而可以重渲染
return (0, _immer.default)($cols, function (cols) {
cols.forEach(function (col) {
var render = col.render,
_col$enableDelete = col.enableDelete,
enableDelete = _col$enableDelete === void 0 ? false : _col$enableDelete;
// 如果列上开启了删除enableDelete, 复写render
if (col.valueType === 'option' && delFunction && hasDelPermission && enableDelete && render) {
col.render = function (text, record, index, actionRef, innerRef) {
// 增强 rowKey 为函数
// @ts-ignore
var key = typeof rowKey === 'function' ? rowKey(record) : rowKey;
// 增强 enableDelete 为函数
var $enableDelete = typeof enableDelete === 'function' ? enableDelete(record, index) : {};
// enabledDelete为true时的默认值
var _$enableDelete$disabl = $enableDelete.disabled,
disabled = _$enableDelete$disabl === void 0 ? false : _$enableDelete$disabl,
_$enableDelete$visibl = $enableDelete.visible,
visible = _$enableDelete$visibl === void 0 ? true : _$enableDelete$visibl,
danger = $enableDelete.danger,
_$enableDelete$btnTex = $enableDelete.btnText,
btnText = _$enableDelete$btnTex === void 0 ? '删除' : _$enableDelete$btnTex;
var renderDom = render(text, record, index, actionRef, innerRef);
if (Array.isArray(renderDom) && visible) {
var deleteDom;
// 弹框的默认属性
var _mergedProps$title = mergedProps.title,
title = _mergedProps$title === void 0 ? '确定删除吗?' : _mergedProps$title,
rest = (0, _objectWithoutProperties2.default)(mergedProps, _excluded);
if (confirmModelType === 'modal') {
deleteDom = /*#__PURE__*/(0, _jsxRuntime.jsx)(_ModalConfirm.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({
title: title
}, rest), {}, {
onOk: function onOk() {
_this.handleDelete([record[key]], record);
},
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_LinkButton.default, {
disabled: disabled,
onClick: function onClick(e) {
return e.stopPropagation();
},
loading: delLoading && record[key] === _this.targetId,
danger: danger,
children: btnText
})
}), renderDom.length + 1);
} else {
deleteDom = /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Popconfirm, (0, _objectSpread2.default)((0, _objectSpread2.default)({
title: title
}, rest), {}, {
onConfirm: function onConfirm(e) {
e === null || e === void 0 || e.stopPropagation();
_this.handleDelete([record[key]], record);
},
onCancel: function onCancel(e) {
return e === null || e === void 0 ? void 0 : e.stopPropagation();
},
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_LinkButton.default, {
disabled: disabled,
onClick: function onClick(e) {
return e.stopPropagation();
},
loading: delLoading && record[key] === _this.targetId,
danger: danger,
children: btnText
})
}), renderDom.length + 1);
}
renderDom.push(deleteDom);
}
return renderDom;
};
}
});
});
});
// 分受控和非受控
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getRowSelection", function () {
// props
var rowSelection = _this.props.rowSelection;
//state
var selectedRowKeys = _this.state.selectedRowKeys;
if (rowSelection && !rowSelection.selectedRowKeys) {
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, rowSelection), {}, {
selectedRowKeys: selectedRowKeys,
onChange: function onChange(keys, selectedRows) {
return _this.setState({
selectedRowKeys: keys,
selectedRows: selectedRows
});
}
});
}
return rowSelection;
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleDelete", function (selectedIds, record, callback) {
var _this$props3 = _this.props,
_this$props3$rowKey = _this$props3.rowKey,
rowKey = _this$props3$rowKey === void 0 ? 'id' : _this$props3$rowKey,
delFunction = _this$props3.delFunction,
_this$props3$rowSelec = _this$props3.rowSelection,
rowSelection = _this$props3$rowSelec === void 0 ? {} : _this$props3$rowSelec,
_this$props3$actionRe = _this$props3.actionRef,
actionRef = _this$props3$actionRe === void 0 ? _this.selfActionRef : _this$props3$actionRe;
//@ts-ignore
var key = typeof rowKey === 'function' ? rowKey(record) : rowKey;
_this.setState({
delLoading: true
});
if (record[key]) {
_this.targetId = record[key];
}
if (delFunction) {
delFunction(selectedIds, record).then(function () {
_antd.message.success('删除成功!');
if (callback) callback();
// bugfix: 如果在多选选中后, 点的行上的删除, 不是点的批量删除, 删除后要去除掉selectedKeys
if (record[key] && rowSelection) {
var ids = (selectedIds || []).filter(function (_key) {
return _key !== record[key];
});
if (rowSelection.selectedRowKeys) {
// @ts-ignore onChange 应有三个参数
if (rowSelection.onChange) rowSelection.onChange(ids);
} else {
_this.setState({
selectedRowKeys: ids
});
}
}
var action = actionRef.current;
if (action) {
// bugfix: 假如数据一共有两页, 并且第二页只有一条数据, 删除该数据后应该自动切到上一页
var _action$pageInfo = action.pageInfo,
current = _action$pageInfo.current,
total = _action$pageInfo.total,
pageSize = _action$pageInfo.pageSize;
// 判断当前是否为空
var deleteRecordLength = record.id ? 1 : (selectedIds || []).length;
var isCurrentEmpty = total - deleteRecordLength === (current - 1) * pageSize;
if (current > 1 && isCurrentEmpty) {
action.setPageInfo({
current: current - 1
});
return;
}
action.reload();
}
}).finally(function () {
_this.setState({
delLoading: false
});
});
}
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "tableAlertOptionRender", function (_ref) {
var _selectedRowKeys = _ref.selectedRowKeys,
onCleanSelected = _ref.onCleanSelected;
// state
var _this$state = _this.state,
delLoading = _this$state.delLoading,
selectedRows = _this$state.selectedRows;
/**
* 全局默认设置
*/
var setting = _this.context || {};
var globalOption = setting.tableAlertOption;
// props
var _this$props4 = _this.props,
_this$props4$tableAle = _this$props4.tableAlertOption,
tableAlertOption = _this$props4$tableAle === void 0 ? {} : _this$props4$tableAle,
columns = _this$props4.columns,
name = _this$props4.name,
delFunction = _this$props4.delFunction,
delPermission = _this$props4.delPermission,
confirmModelType = _this$props4.confirmModelType;
// 合并全局设置和组件传入的属性, 后者传入的优先级高
var mergedOption = (0, _index.mergeOptions)(globalOption, tableAlertOption);
// tableAlertOption
var _mergedOption$hideDel = mergedOption.hideDelete,
hideDelete = _mergedOption$hideDel === void 0 ? false : _mergedOption$hideDel,
_mergedOption$enableE = mergedOption.enableExport,
enableExport = _mergedOption$enableE === void 0 ? false : _mergedOption$enableE,
_mergedOption$actions = mergedOption.actions,
alertActions = _mergedOption$actions === void 0 ? [] : _mergedOption$actions,
exportName = mergedOption.exportName,
deleteProps = mergedOption.deleteProps;
var _ref2 = deleteProps || {},
_ref2$btnText = _ref2.btnText,
btnText = _ref2$btnText === void 0 ? '批量删除' : _ref2$btnText,
title = _ref2.title,
rest = (0, _objectWithoutProperties2.default)(_ref2, _excluded2);
var hasDelPermission = delPermission ? delPermission() : true;
/* 多选删除 */
var getDelDom = function getDelDom() {
if (!hideDelete && delFunction && hasDelPermission) {
var defaultTitle = title ? title(_selectedRowKeys.length) : "\u786E\u5B9A\u5220\u9664".concat(_selectedRowKeys.length, "\u6761\u6570\u636E\u5417?");
if (confirmModelType === 'modal') {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ModalConfirm.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({
title: defaultTitle
}, rest), {}, {
onOk: function onOk() {
_this.handleDelete(_selectedRowKeys, {}, onCleanSelected);
},
okButtonProps: {
loading: delLoading
},
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_LinkButton.default, {
loading: delLoading,
children: btnText
})
}));
} else {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Popconfirm, (0, _objectSpread2.default)((0, _objectSpread2.default)({
overlayStyle: {
width: '180px'
},
title: defaultTitle
}, rest), {}, {
onConfirm: function onConfirm() {
_this.handleDelete(_selectedRowKeys, {}, onCleanSelected);
},
okButtonProps: {
loading: delLoading
},
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_LinkButton.default, {
loading: delLoading,
children: btnText
})
}));
}
}
};
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_antd.Space, {
size: 'middle',
children: [enableExport && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LinkButton.default, {
onClick: function onClick() {
(0, _exceljs.exportAntTableToExcel)((0, _filterCols.filterExportCols)(columns), selectedRows, exportName || "".concat(name ? name + '列表' : '', "\u5BFC\u51FA"));
onCleanSelected();
},
children: "\u5BFC\u51FA\u6240\u9009"
}), getDelDom(), alertActions, /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
onClick: onCleanSelected,
children: "\u53D6\u6D88\u9009\u62E9"
})]
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "selfOnOpen", function (formType, formRef, formData) {
_this.setState({
formType: formType
});
if (_this.props.onOpen) {
_this.props.onOpen(formType, formRef, formData);
}
});
_this.state = {
formType: '',
delLoading: false,
selectedRowKeys: [],
selectedRows: []
};
_this.targetId = '';
_this.selfInnerRef = /*#__PURE__*/(0, _react.createRef)();
_this.selfActionRef = /*#__PURE__*/(0, _react.createRef)();
_this.baseInnerObj = (0, _context2.CreateBaseInner)();
// @ts-ignore
_this.getInnerRef().current = {};
_this.getInnerRef().current.data = _this.baseInnerObj.data;
_this.getInnerRef().current.setData = _this.baseInnerObj.setData;
return _this;
}
(0, _createClass2.default)(ProTable, [{
key: "componentDidMount",
value: function componentDidMount() {
/** 注册一个事件用于 reload 表格; 这对于一些已缓存的页面比较有用, 在其它页面可以控制刷新表格 */
document.addEventListener('reload', this.tableReload);
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
document.removeEventListener('reload', this.tableReload);
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _this$props5 = this.props,
_this$props5$rowKey = _this$props5.rowKey,
rowKey = _this$props5$rowKey === void 0 ? 'id' : _this$props5$rowKey,
name = _this$props5.name,
columns = _this$props5.columns,
options = _this$props5.options,
_this$props5$paginati = _this$props5.pagination,
pagination = _this$props5$paginati === void 0 ? {} : _this$props5$paginati,
formColumns = _this$props5.formColumns,
_this$props5$scroll = _this$props5.scroll,
scroll = _this$props5$scroll === void 0 ? {
x: '100%'
} : _this$props5$scroll,
onFinish = _this$props5.onFinish,
tableAlertOption = _this$props5.tableAlertOption,
rowSelection = _this$props5.rowSelection,
_this$props5$sticky = _this$props5.sticky,
sticky = _this$props5$sticky === void 0 ? true : _this$props5$sticky,
className = _this$props5.className,
optionColSpaceSize = _this$props5.optionColSpaceSize,
_this$props5$noPaddin = _this$props5.noPadding,
noPadding = _this$props5$noPaddin === void 0 ? false : _this$props5$noPaddin,
search = _this$props5.search,
request = _this$props5.request,
onOpen = _this$props5.onOpen,
_this$props5$modalPro = _this$props5.modalProps,
modalProps = _this$props5$modalPro === void 0 ? {} : _this$props5$modalPro,
_this$props5$formProp = _this$props5.formProps,
formProps = _this$props5$formProp === void 0 ? {} : _this$props5$formProp,
defaultHideInSearch = _this$props5.defaultHideInSearch,
confirmModalProps = _this$props5.confirmModalProps,
confirmModelType = _this$props5.confirmModelType,
optionColumnSpaceProps = _this$props5.optionColumnSpaceProps,
actionRef = _this$props5.actionRef,
rest = (0, _objectWithoutProperties2.default)(_this$props5, _excluded3);
/**
* 全局默认设置
*/
var setting = this.context || {};
var _setting$modalProps = setting.modalProps,
settingModalProps = _setting$modalProps === void 0 ? {} : _setting$modalProps,
_setting$formProps = setting.formProps,
settingFormProps = _setting$formProps === void 0 ? {} : _setting$formProps,
_setting$searchConfig = setting.searchConfig,
searchConfig = _setting$searchConfig === void 0 ? {} : _setting$searchConfig,
globalOptions = setting.options,
globalDefaultHideInSearch = setting.defaultHideInSearch,
a = setting.confirmModalType,
b = setting.confirmModalProps,
c = setting.tableAlertOption,
restSetting = (0, _objectWithoutProperties2.default)(setting, _excluded4);
var tableRest = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, restSetting), rest);
var modalRest = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settingModalProps), modalProps);
var defaultSearchConfig = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, searchConfig), {}, {
className: 'searchFormStyleFix'
});
/**
* 处理 options 属性的合并
* 1. 组件属性为 false, 优先级高
* 2. 组件属性为 undefined, 走全局
*
*/
var mergedOptions = (0, _index.myMergeOptions)(globalOptions, options, false);
var mergedDefaultHideInSearch = (0, _index.myMergeBoolean)(globalDefaultHideInSearch, defaultHideInSearch, false);
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_proTable.default, (0, _objectSpread2.default)({
className: (0, _classnames.default)(className, optionColSpaceSize === 'small' && 'myTableSmallOptionCol', noPadding && 'rak-protable-no-padding'),
rowKey: rowKey,
headerTitle: this.getTitle()
// @ts-ignore
,
columns: this.patchColumn(this.enableDelete((0, _treeUtil.normalizeTree)(columns, function (_item) {
var item = (0, _objectSpread2.default)({}, _item);
if (item.hideInSearch === undefined) {
item.hideInSearch = mergedDefaultHideInSearch;
}
if (item.type === 'search' || item.valueType === 'dependency') {
item.search = true;
item.hideInSearch = false;
item.hideInTable = true;
item.hideInForm = true;
}
return item;
}))).filter(function (col) {
if (col.type === 'form') return false;
return true;
}),
options: mergedOptions,
pagination: pagination,
scroll: scroll,
tableAlertOptionRender: this.tableAlertOptionRender,
rowSelection: this.getRowSelection(),
sticky: sticky,
search: search === false ? false : (0, _objectSpread2.default)((0, _objectSpread2.default)({}, defaultSearchConfig), search),
request: request ? function (params, sort, filter) {
return new Promise(function (resolve, reject) {
request((0, _utils.handleRequestParams)(params, sort), sort, filter).then(function (res) {
var innerRef = _this2.getInnerRef();
if (innerRef) {
innerRef.current.total = res.total;
innerRef.current.dataSource = res.data;
innerRef.current.params = (0, _utils.handleRequestParams)(params, sort);
}
resolve(res);
}).catch(function (err) {
return reject(err);
});
});
} : undefined,
actionRef: actionRef || this.selfActionRef
}, tableRest)), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ModalForm.default, (0, _objectSpread2.default)({
innerRef: this.getInnerRef(),
title: this.getModalTitle()
// @ts-ignore
,
columns: (formColumns || columns).filter(function (col) {
if (col.type === 'form') return true;
if (!col.type) return true;
return false;
}),
onFinish: onFinish,
onOpen: this.selfOnOpen,
formProps: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settingFormProps), formProps)
}, modalRest))]
});
}
}]);
return ProTable;
}(_react.Component);
(0, _defineProperty2.default)(ProTable, "contextType", _context.ProTableContext);
var _default = exports.default = ProTable;