Files
2026-01-16 01:51:36 +00:00

850 lines
39 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"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 = void 0;
var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _objectSpread4 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
require("antd/lib/table/style");
require("antd/lib/typography/style");
var _proCard = _interopRequireDefault(require("@ant-design/pro-card"));
var _proForm = _interopRequireWildcard(require("@ant-design/pro-form"));
var _proProvider = require("@ant-design/pro-provider");
var _proUtils = require("@ant-design/pro-utils");
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
var _react = _interopRequireWildcard(require("react"));
var _Provide = require("./Store/Provide");
var _Alert = _interopRequireDefault(require("./components/Alert"));
var _Form = _interopRequireDefault(require("./components/Form"));
var _ToolBar = _interopRequireDefault(require("./components/ToolBar"));
var _style3 = require("./style");
var _useFetchData = _interopRequireDefault(require("./useFetchData"));
var _utils = require("./utils");
var _columnSort = require("./utils/columnSort");
var _genProColumnToColumn = require("./utils/genProColumnToColumn");
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["rowKey", "tableClassName", "defaultClassName", "action", "tableColumn", "type", "pagination", "rowSelection", "size", "defaultSize", "tableStyle", "toolbarDom", "hideToolbar", "searchNode", "style", "cardProps", "alertDom", "name", "onSortChange", "onFilterChange", "options", "isLightFilter", "className", "cardBordered", "editableUtils", "getRowKey"],
_excluded2 = ["cardBordered", "request", "className", "params", "defaultData", "headerTitle", "postData", "ghost", "pagination", "actionRef", "columns", "toolBarRender", "optionsRender", "onLoad", "onRequestError", "style", "cardProps", "tableStyle", "tableClassName", "columnsStateMap", "onColumnsStateChange", "options", "search", "name", "onLoadingChange", "rowSelection", "beforeSearchSubmit", "tableAlertRender", "defaultClassName", "formRef", "type", "columnEmptyText", "toolbar", "rowKey", "manualRequest", "polling", "tooltip", "revalidateOnFocus", "searchFormRender"]; // 兼容代码-----------
//----------------------
function TableRender(props) {
var rowKey = props.rowKey,
tableClassName = props.tableClassName,
defaultClassName = props.defaultClassName,
action = props.action,
tableColumns = props.tableColumn,
type = props.type,
pagination = props.pagination,
rowSelection = props.rowSelection,
size = props.size,
defaultSize = props.defaultSize,
tableStyle = props.tableStyle,
toolbarDom = props.toolbarDom,
hideToolbar = props.hideToolbar,
searchNode = props.searchNode,
style = props.style,
propsCardProps = props.cardProps,
alertDom = props.alertDom,
name = props.name,
onSortChange = props.onSortChange,
onFilterChange = props.onFilterChange,
options = props.options,
isLightFilter = props.isLightFilter,
className = props.className,
cardBordered = props.cardBordered,
editableUtils = props.editableUtils,
getRowKey = props.getRowKey,
rest = (0, _objectWithoutProperties2.default)(props, _excluded);
var counter = (0, _react.useContext)(_Provide.TableContext);
/** 需要遍历一下,不然不支持嵌套表格 */
var columns = (0, _react.useMemo)(function () {
var loopFilter = function loopFilter(column) {
return column.map(function (item) {
// 删掉不应该显示的
var columnKey = (0, _utils.genColumnKey)(item.key, item.index);
var config = counter.columnsMap[columnKey];
if (config && config.show === false) {
return false;
}
if (item.children) {
return (0, _objectSpread4.default)((0, _objectSpread4.default)({}, item), {}, {
children: loopFilter(item.children)
});
}
return item;
}).filter(Boolean);
};
return loopFilter(tableColumns);
}, [counter.columnsMap, tableColumns]);
/**
* 如果是分页的新增,总是加到最后一行
*
* @returns
*/
var editableDataSource = function editableDataSource(dataSource) {
var _ref = editableUtils.newLineRecord || {},
newLineOptions = _ref.options,
row = _ref.defaultValue;
var isNewLineRecordAtTop = (newLineOptions === null || newLineOptions === void 0 ? void 0 : newLineOptions.position) === 'top';
if (newLineOptions !== null && newLineOptions !== void 0 && newLineOptions.parentKey) {
var _recordKeyToString, _props$expandable;
var actionProps = {
data: dataSource,
getRowKey: getRowKey,
row: (0, _objectSpread4.default)((0, _objectSpread4.default)({}, row), {}, {
map_row_parentKey: (_recordKeyToString = (0, _proUtils.recordKeyToString)(newLineOptions.parentKey)) === null || _recordKeyToString === void 0 ? void 0 : _recordKeyToString.toString()
}),
key: newLineOptions === null || newLineOptions === void 0 ? void 0 : newLineOptions.recordKey,
childrenColumnName: ((_props$expandable = props.expandable) === null || _props$expandable === void 0 ? void 0 : _props$expandable.childrenColumnName) || 'children'
};
return (0, _proUtils.editableRowByKey)(actionProps, isNewLineRecordAtTop ? 'top' : 'update');
}
if (isNewLineRecordAtTop) {
return [row].concat((0, _toConsumableArray2.default)(action.dataSource));
}
// 如果有分页的功能,我们加到这一页的末尾
if (pagination && pagination !== null && pagination !== void 0 && pagination.current && pagination !== null && pagination !== void 0 && pagination.pageSize) {
var newDataSource = (0, _toConsumableArray2.default)(action.dataSource);
if ((pagination === null || pagination === void 0 ? void 0 : pagination.pageSize) > newDataSource.length) {
newDataSource.push(row);
return newDataSource;
}
newDataSource.splice((pagination === null || pagination === void 0 ? void 0 : pagination.current) * (pagination === null || pagination === void 0 ? void 0 : pagination.pageSize) - 1, 0, row);
return newDataSource;
}
return [].concat((0, _toConsumableArray2.default)(action.dataSource), [row]);
};
var getTableProps = function getTableProps() {
return (0, _objectSpread4.default)((0, _objectSpread4.default)({}, rest), {}, {
size: size,
rowSelection: rowSelection === false ? undefined : rowSelection,
className: tableClassName,
style: tableStyle,
columns: columns,
loading: action.loading,
dataSource: editableUtils.newLineRecord ? editableDataSource(action.dataSource) : action.dataSource,
pagination: pagination,
onChange: function onChange(changePagination, filters, sorter, extra) {
var _rest$onChange;
(_rest$onChange = rest.onChange) === null || _rest$onChange === void 0 || _rest$onChange.call(rest, changePagination, filters, sorter, extra);
onFilterChange((0, _proUtils.omitUndefined)(filters));
// 制造筛选的数据
// 制造一个排序的数据
if (Array.isArray(sorter)) {
var _omitUndefined;
var data = sorter.reduce(function (pre, value) {
return (0, _objectSpread4.default)((0, _objectSpread4.default)({}, pre), {}, (0, _defineProperty2.default)({}, "".concat(value.field), value.order));
}, {});
onSortChange((_omitUndefined = (0, _proUtils.omitUndefined)(data)) !== null && _omitUndefined !== void 0 ? _omitUndefined : {});
} else {
var _sorter$column, _omitUndefined2;
var sorterOfColumn = (_sorter$column = sorter.column) === null || _sorter$column === void 0 ? void 0 : _sorter$column.sorter;
var isSortByField = (sorterOfColumn === null || sorterOfColumn === void 0 ? void 0 : sorterOfColumn.toString()) === sorterOfColumn;
onSortChange((_omitUndefined2 = (0, _proUtils.omitUndefined)((0, _defineProperty2.default)({}, "".concat(isSortByField ? sorterOfColumn : sorter.field), sorter.order))) !== null && _omitUndefined2 !== void 0 ? _omitUndefined2 : {});
}
}
});
};
/**
* 是否需要 card 来包裹
*/
var notNeedCardDom = (0, _react.useMemo)(function () {
if (props.search === false && !props.headerTitle && props.toolBarRender === false) {
return true;
}
return false;
}, []);
/** 默认的 table dom如果是编辑模式外面还要包个 form */
var baseTableDom = /*#__PURE__*/(0, _jsxRuntime.jsx)(_proForm.GridContext.Provider, {
value: {
grid: false,
colProps: undefined,
rowProps: undefined
},
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Table, (0, _objectSpread4.default)((0, _objectSpread4.default)({}, getTableProps()), {}, {
rowKey: rowKey
}))
});
/** 自定义的 render */
var tableDom = props.tableViewRender ? props.tableViewRender((0, _objectSpread4.default)((0, _objectSpread4.default)({}, getTableProps()), {}, {
rowSelection: rowSelection !== false ? rowSelection : undefined
}), baseTableDom) : baseTableDom;
/**
* 这段代码使用了 useMemo 进行了性能优化,根据 props.editable 和 props.name 的不同情况,渲染不同的页面组件。
* 当 props.editable 为 true 并且 props.name 不存在时,渲染一个带有表单和工具栏的页面组件,否则只渲染工具栏和表格组件。
* renderContent 函数会在 alertDom、props.loading、props.editable、tableDom、toolbarDom 发生变化时重新执行。
* */
var tableContentDom = (0, _react.useMemo)(function () {
if (props.editable && !props.name) {
var _props$editable, _props$editable2, _props$editable3;
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [toolbarDom, alertDom, /*#__PURE__*/(0, _react.createElement)(_proForm.default, (0, _objectSpread4.default)((0, _objectSpread4.default)({}, (_props$editable = props.editable) === null || _props$editable === void 0 ? void 0 : _props$editable.formProps), {}, {
formRef: (_props$editable2 = props.editable) === null || _props$editable2 === void 0 || (_props$editable2 = _props$editable2.formProps) === null || _props$editable2 === void 0 ? void 0 : _props$editable2.formRef,
component: false,
form: (_props$editable3 = props.editable) === null || _props$editable3 === void 0 ? void 0 : _props$editable3.form,
onValuesChange: editableUtils.onValuesChange,
key: "table",
submitter: false,
omitNil: false,
dateFormatter: props.dateFormatter
}), tableDom)]
});
}
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [toolbarDom, alertDom, tableDom]
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [alertDom, props.loading, !!props.editable, tableDom, toolbarDom]);
var cardBodyStyle = (0, _react.useMemo)(function () {
if (propsCardProps === false || notNeedCardDom === true || !!props.name) return {};
if (hideToolbar) {
return {
padding: 0
};
}
if (toolbarDom) {
return {
paddingBlockStart: 0
};
}
if (toolbarDom && pagination === false) {
return {
paddingBlockStart: 0
};
}
// if (!toolbarDom)
return {
padding: 0
};
}, [notNeedCardDom, pagination, props.name, propsCardProps, toolbarDom, hideToolbar]);
/** Table 区域的 dom为了方便 render */
var tableAreaDom =
// cardProps 或者 有了name 就不需要这个padding了不然会导致不好对齐
propsCardProps === false || notNeedCardDom === true || !!props.name ? tableContentDom : /*#__PURE__*/(0, _jsxRuntime.jsx)(_proCard.default, (0, _objectSpread4.default)((0, _objectSpread4.default)({
ghost: props.ghost,
bordered: (0, _utils.isBordered)('table', cardBordered),
bodyStyle: cardBodyStyle
}, propsCardProps), {}, {
children: tableContentDom
}));
var renderTable = function renderTable() {
if (props.tableRender) {
return props.tableRender(props, tableAreaDom, {
toolbar: toolbarDom || undefined,
alert: alertDom || undefined,
table: tableDom || undefined
});
}
return tableAreaDom;
};
var proTableDom = /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: (0, _classnames.default)(className, (0, _defineProperty2.default)({}, "".concat(defaultClassName, "-polling"), action.pollingLoading)),
style: style,
ref: counter.rootDomRef,
children: [isLightFilter ? null : searchNode, type !== 'form' && props.tableExtraRender && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: (0, _classnames.default)(className, "".concat(defaultClassName, "-extra")),
children: props.tableExtraRender(props, action.dataSource || [])
}), type !== 'form' && renderTable()]
});
// 如果不需要的全屏ConfigProvider 没有意义
if (!options || !(options !== null && options !== void 0 && options.fullScreen)) {
return proTableDom;
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.ConfigProvider, {
getPopupContainer: function getPopupContainer() {
return counter.rootDomRef.current || document.body;
},
children: proTableDom
});
}
var emptyObj = {};
var ProTable = function ProTable(props) {
var _props$expandable2;
var cardBordered = props.cardBordered,
request = props.request,
propsClassName = props.className,
_props$params = props.params,
params = _props$params === void 0 ? emptyObj : _props$params,
defaultData = props.defaultData,
headerTitle = props.headerTitle,
postData = props.postData,
ghost = props.ghost,
propsPagination = props.pagination,
propsActionRef = props.actionRef,
_props$columns = props.columns,
propsColumns = _props$columns === void 0 ? [] : _props$columns,
toolBarRender = props.toolBarRender,
optionsRender = props.optionsRender,
onLoad = props.onLoad,
onRequestError = props.onRequestError,
style = props.style,
cardProps = props.cardProps,
tableStyle = props.tableStyle,
tableClassName = props.tableClassName,
columnsStateMap = props.columnsStateMap,
onColumnsStateChange = props.onColumnsStateChange,
options = props.options,
search = props.search,
isEditorTable = props.name,
onLoadingChange = props.onLoadingChange,
_props$rowSelection = props.rowSelection,
propsRowSelection = _props$rowSelection === void 0 ? false : _props$rowSelection,
beforeSearchSubmit = props.beforeSearchSubmit,
tableAlertRender = props.tableAlertRender,
defaultClassName = props.defaultClassName,
propRef = props.formRef,
_props$type = props.type,
type = _props$type === void 0 ? 'table' : _props$type,
_props$columnEmptyTex = props.columnEmptyText,
columnEmptyText = _props$columnEmptyTex === void 0 ? '-' : _props$columnEmptyTex,
toolbar = props.toolbar,
rowKey = props.rowKey,
manualRequest = props.manualRequest,
polling = props.polling,
tooltip = props.tooltip,
_props$revalidateOnFo = props.revalidateOnFocus,
revalidateOnFocus = _props$revalidateOnFo === void 0 ? false : _props$revalidateOnFo,
searchFormRender = props.searchFormRender,
rest = (0, _objectWithoutProperties2.default)(props, _excluded2);
var _useStyle = (0, _style3.useStyle)(props.defaultClassName),
wrapSSR = _useStyle.wrapSSR,
hashId = _useStyle.hashId;
var className = (0, _classnames.default)(defaultClassName, propsClassName, hashId);
/** 通用的来操作子节点的工具类 */
var actionRef = (0, _react.useRef)();
var defaultFormRef = (0, _react.useRef)();
var formRef = propRef || defaultFormRef;
(0, _react.useImperativeHandle)(propsActionRef, function () {
return actionRef.current;
});
/** 单选多选的相关逻辑 */
var _useMountMergeState = (0, _proUtils.useMountMergeState)(propsRowSelection ? (propsRowSelection === null || propsRowSelection === void 0 ? void 0 : propsRowSelection.defaultSelectedRowKeys) || [] : undefined, {
value: propsRowSelection ? propsRowSelection.selectedRowKeys : undefined
}),
_useMountMergeState2 = (0, _slicedToArray2.default)(_useMountMergeState, 2),
selectedRowKeys = _useMountMergeState2[0],
setSelectedRowKeys = _useMountMergeState2[1];
var _useMountMergeState3 = (0, _proUtils.useMountMergeState)(function () {
// 如果手动模式,或者 search 不存在的时候设置为 undefined
// undefined 就不会触发首次加载
if (manualRequest || search !== false) {
return undefined;
}
return {};
}),
_useMountMergeState4 = (0, _slicedToArray2.default)(_useMountMergeState3, 2),
formSearch = _useMountMergeState4[0],
setFormSearch = _useMountMergeState4[1];
var _useMountMergeState5 = (0, _proUtils.useMountMergeState)({}),
_useMountMergeState6 = (0, _slicedToArray2.default)(_useMountMergeState5, 2),
proFilter = _useMountMergeState6[0],
setProFilter = _useMountMergeState6[1];
var _useMountMergeState7 = (0, _proUtils.useMountMergeState)({}),
_useMountMergeState8 = (0, _slicedToArray2.default)(_useMountMergeState7, 2),
proSort = _useMountMergeState8[0],
setProSort = _useMountMergeState8[1];
// 平铺所有columns, 用于判断是用的是本地筛选/排序
var loopColumns = (0, _react.useCallback)(function (data) {
var _columns = [];
for (var i = 0; i < data.length; i++) {
var _curItem = data[i];
if (_curItem.children) {
loopColumns(_curItem.children);
} else {
_columns.push(_curItem);
}
}
return _columns;
}, []);
/** 如果所有列中的 filters = true | undefined 说明是用的是本地筛选 任何一列配置 filters=false就能绕过这个判断 */
var useLocaleFilter = (0, _react.useMemo)(function () {
var _columns = loopColumns(propsColumns);
return _columns === null || _columns === void 0 ? void 0 : _columns.every(function (column) {
return !!column.filters && !!column.onFilter || column.filters === undefined && column.onFilter === undefined;
});
}, [loopColumns, propsColumns]);
/** 如果所有列中的 sorter != true 说明是用的是本地排序 任何一列配置 sorter=true就能绕过这个判断 */
var useLocaleSorter = (0, _react.useMemo)(function () {
var _columns = loopColumns(propsColumns);
return _columns === null || _columns === void 0 ? void 0 : _columns.every(function (column) {
return column.sorter !== true;
});
}, [loopColumns, propsColumns]);
/** 设置默认的服務端排序和筛选值 */
(0, _react.useEffect)(function () {
var _parseDefaultColumnCo = (0, _utils.parseDefaultColumnConfig)(propsColumns),
sort = _parseDefaultColumnCo.sort,
filter = _parseDefaultColumnCo.filter;
if (!useLocaleFilter) setProFilter(filter);
if (!useLocaleSorter) setProSort(sort);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
var intl = (0, _proProvider.useIntl)();
/** 需要初始化 不然默认可能报错 这里取了 defaultCurrent 和 current 为了保证不会重复刷新 */
var fetchPagination = (0, _typeof2.default)(propsPagination) === 'object' ? propsPagination : {
defaultCurrent: 1,
defaultPageSize: 20,
pageSize: 20,
current: 1
};
var counter = (0, _react.useContext)(_Provide.TableContext);
// ============================ useFetchData ============================
var fetchData = (0, _react.useMemo)(function () {
if (!request) return undefined;
return /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(pageParams) {
var actionParams, response;
return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
actionParams = (0, _objectSpread4.default)((0, _objectSpread4.default)((0, _objectSpread4.default)({}, pageParams || {}), formSearch), params); // eslint-disable-next-line no-underscore-dangle
delete actionParams._timestamp;
_context.next = 4;
return request(actionParams, proSort, proFilter);
case 4:
response = _context.sent;
return _context.abrupt("return", response);
case 6:
case "end":
return _context.stop();
}
}, _callee);
}));
return function (_x) {
return _ref2.apply(this, arguments);
};
}();
}, [formSearch, params, proFilter, proSort, request]);
var action = (0, _useFetchData.default)(fetchData, defaultData, {
pageInfo: propsPagination === false ? false : fetchPagination,
loading: props.loading,
dataSource: props.dataSource,
onDataSourceChange: props.onDataSourceChange,
onLoad: onLoad,
onLoadingChange: onLoadingChange,
onRequestError: onRequestError,
postData: postData,
revalidateOnFocus: revalidateOnFocus,
manual: formSearch === undefined,
polling: polling,
effects: [(0, _proUtils.stringify)(params), (0, _proUtils.stringify)(formSearch), (0, _proUtils.stringify)(proFilter), (0, _proUtils.stringify)(proSort)],
debounceTime: props.debounceTime,
onPageInfoChange: function onPageInfoChange(pageInfo) {
var _propsPagination$onCh, _propsPagination$onSh;
if (!propsPagination || !fetchData) return;
// 总是触发一下 onChange 和 onShowSizeChange
// 目前只有 List 和 Table 支持分页, List 有分页的时候打断 Table 的分页
propsPagination === null || propsPagination === void 0 || (_propsPagination$onCh = propsPagination.onChange) === null || _propsPagination$onCh === void 0 || _propsPagination$onCh.call(propsPagination, pageInfo.current, pageInfo.pageSize);
propsPagination === null || propsPagination === void 0 || (_propsPagination$onSh = propsPagination.onShowSizeChange) === null || _propsPagination$onSh === void 0 || _propsPagination$onSh.call(propsPagination, pageInfo.current, pageInfo.pageSize);
}
});
// ============================ END ============================
/** 聚焦的时候重新请求数据,这样可以保证数据都是最新的。 */
(0, _react.useEffect)(function () {
var _props$form;
// 手动模式和 request 为空都不生效
if (props.manualRequest || !props.request || !revalidateOnFocus || (_props$form = props.form) !== null && _props$form !== void 0 && _props$form.ignoreRules) return;
// 聚焦时重新请求事件
var visibilitychange = function visibilitychange() {
if (document.visibilityState === 'visible') {
action.reload();
}
};
document.addEventListener('visibilitychange', visibilitychange);
return function () {
return document.removeEventListener('visibilitychange', visibilitychange);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
/** SelectedRowKeys受控处理selectRows */
var preserveRecordsRef = _react.default.useRef(new Map());
// ============================ RowKey ============================
var getRowKey = _react.default.useMemo(function () {
if (typeof rowKey === 'function') {
return rowKey;
}
return function (record, index) {
var _ref3;
if (index === -1) {
return record === null || record === void 0 ? void 0 : record[rowKey];
}
// 如果 props 中有name 的话用index 来做行号,这样方便转化为 index
if (props.name) {
return index === null || index === void 0 ? void 0 : index.toString();
}
return (_ref3 = record === null || record === void 0 ? void 0 : record[rowKey]) !== null && _ref3 !== void 0 ? _ref3 : index === null || index === void 0 ? void 0 : index.toString();
};
}, [props.name, rowKey]);
(0, _react.useMemo)(function () {
var _action$dataSource;
if ((_action$dataSource = action.dataSource) !== null && _action$dataSource !== void 0 && _action$dataSource.length) {
var keys = action.dataSource.map(function (data) {
var dataRowKey = getRowKey(data, -1);
preserveRecordsRef.current.set(dataRowKey, data);
return dataRowKey;
});
return keys;
}
return [];
}, [action.dataSource, getRowKey]);
/** 页面编辑的计算 */
var pagination = (0, _react.useMemo)(function () {
var newPropsPagination = propsPagination === false ? false : (0, _objectSpread4.default)({}, propsPagination);
var pageConfig = (0, _objectSpread4.default)((0, _objectSpread4.default)({}, action.pageInfo), {}, {
setPageInfo: function setPageInfo(_ref4) {
var pageSize = _ref4.pageSize,
current = _ref4.current;
var pageInfo = action.pageInfo;
// pageSize 发生改变,并且你不是在第一页,切回到第一页
// 这样可以防止出现 跳转到一个空的数据页的问题
if (pageSize === pageInfo.pageSize || pageInfo.current === 1) {
action.setPageInfo({
pageSize: pageSize,
current: current
});
return;
}
// 通过request的时候清空数据然后刷新不然可能会导致 pageSize 没有数据多
if (request) action.setDataSource([]);
action.setPageInfo({
pageSize: pageSize,
// 目前只有 List 和 Table 支持分页, List 有分页的时候 还是使用之前的当前页码
current: type === 'list' ? current : 1
});
}
});
if (request && newPropsPagination) {
delete newPropsPagination.onChange;
delete newPropsPagination.onShowSizeChange;
}
return (0, _utils.mergePagination)(newPropsPagination, pageConfig, intl);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [propsPagination, action, intl]);
(0, _proUtils.useDeepCompareEffect)(function () {
var _action$pageInfo;
// request 存在且params不为空且已经请求过数据才需要设置。
if (props.request && !(0, _isEmpty.default)(params) && action.dataSource && !(0, _isEqual.default)(action.dataSource, defaultData) && (action === null || action === void 0 || (_action$pageInfo = action.pageInfo) === null || _action$pageInfo === void 0 ? void 0 : _action$pageInfo.current) !== 1) {
action.setPageInfo({
current: 1
});
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [params]);
// 设置 name 到 store 中,里面用了 ref ,所以不用担心直接 set
counter.setPrefixName(props.name);
/** 清空所有的选中项 */
var _onCleanSelected = (0, _react.useCallback)(function () {
if (propsRowSelection && propsRowSelection.onChange) {
propsRowSelection.onChange([], [], {
type: 'none'
});
}
setSelectedRowKeys([]);
}, [propsRowSelection, setSelectedRowKeys]);
counter.propsRef.current = props;
/** 可编辑行的相关配置 */
var editableUtils = (0, _proUtils.useEditableArray)((0, _objectSpread4.default)((0, _objectSpread4.default)({}, props.editable), {}, {
tableName: props.name,
getRowKey: getRowKey,
childrenColumnName: ((_props$expandable2 = props.expandable) === null || _props$expandable2 === void 0 ? void 0 : _props$expandable2.childrenColumnName) || 'children',
dataSource: action.dataSource || [],
setDataSource: function setDataSource(data) {
var _props$editable4, _props$editable4$onVa;
(_props$editable4 = props.editable) === null || _props$editable4 === void 0 || (_props$editable4$onVa = _props$editable4.onValuesChange) === null || _props$editable4$onVa === void 0 || _props$editable4$onVa.call(_props$editable4, undefined, data);
action.setDataSource(data);
}
}));
// ============================ Render ============================
var _proTheme$useToken = _proProvider.proTheme === null || _proProvider.proTheme === void 0 ? void 0 : _proProvider.proTheme.useToken(),
token = _proTheme$useToken.token;
/** 绑定 action */
(0, _utils.useActionType)(actionRef, action, {
fullScreen: function fullScreen() {
var _counter$rootDomRef;
if (!((_counter$rootDomRef = counter.rootDomRef) !== null && _counter$rootDomRef !== void 0 && _counter$rootDomRef.current) || !document.fullscreenEnabled) {
return;
}
if (document.fullscreenElement) {
document.exitFullscreen();
} else {
var _counter$rootDomRef2;
(_counter$rootDomRef2 = counter.rootDomRef) === null || _counter$rootDomRef2 === void 0 || _counter$rootDomRef2.current.requestFullscreen();
}
},
onCleanSelected: function onCleanSelected() {
// 清空选中行
_onCleanSelected();
},
resetAll: function resetAll() {
var _formRef$current;
// 清空选中行
_onCleanSelected();
var _parseDefaultColumnCo2 = (0, _utils.parseDefaultColumnConfig)(propsColumns),
sort = _parseDefaultColumnCo2.sort,
filter = _parseDefaultColumnCo2.filter;
// 清空筛选
setProFilter(filter);
// 清空排序
setProSort(sort);
// 清空 toolbar 搜索
counter.setKeyWords(undefined);
// 重置页码
action.setPageInfo({
current: 1
});
// 重置表单
formRef === null || formRef === void 0 || (_formRef$current = formRef.current) === null || _formRef$current === void 0 || _formRef$current.resetFields();
setFormSearch({});
},
editableUtils: editableUtils
});
/** 同步 action */
counter.setAction(actionRef.current);
// ---------- 列计算相关 start -----------------
var tableColumn = (0, _react.useMemo)(function () {
var _props$expandable3;
return (0, _genProColumnToColumn.genProColumnToColumn)({
columns: propsColumns,
counter: counter,
columnEmptyText: columnEmptyText,
type: type,
marginSM: token.marginSM,
editableUtils: editableUtils,
rowKey: rowKey,
childrenColumnName: (_props$expandable3 = props.expandable) === null || _props$expandable3 === void 0 ? void 0 : _props$expandable3.childrenColumnName,
proFilter: proFilter,
proSort: proSort
}).sort((0, _columnSort.columnSort)(counter.columnsMap));
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [propsColumns, counter === null || counter === void 0 ? void 0 : counter.sortKeyColumns, counter === null || counter === void 0 ? void 0 : counter.columnsMap, columnEmptyText, type,
// eslint-disable-next-line react-hooks/exhaustive-deps
editableUtils.editableKeys && editableUtils.editableKeys.join(','), proFilter, proSort]);
/** Table Column 变化的时候更新一下,这个参数将会用于渲染 */
(0, _proUtils.useDeepCompareEffectDebounce)(function () {
if (tableColumn && tableColumn.length > 0) {
// 重新生成key的字符串用于排序
var columnKeys = tableColumn.map(function (item) {
return (0, _utils.genColumnKey)(item.key, item.index);
});
counter.setSortKeyColumns(columnKeys);
}
}, [tableColumn], ['render', 'renderFormItem'], 100);
/** 同步 Pagination支持受控的 页码 和 pageSize */
(0, _proUtils.useDeepCompareEffect)(function () {
var pageInfo = action.pageInfo;
var _ref5 = propsPagination || {},
_ref5$current = _ref5.current,
current = _ref5$current === void 0 ? pageInfo === null || pageInfo === void 0 ? void 0 : pageInfo.current : _ref5$current,
_ref5$pageSize = _ref5.pageSize,
pageSize = _ref5$pageSize === void 0 ? pageInfo === null || pageInfo === void 0 ? void 0 : pageInfo.pageSize : _ref5$pageSize;
if (propsPagination && (current || pageSize) && (pageSize !== (pageInfo === null || pageInfo === void 0 ? void 0 : pageInfo.pageSize) || current !== (pageInfo === null || pageInfo === void 0 ? void 0 : pageInfo.current))) {
action.setPageInfo({
pageSize: pageSize || pageInfo.pageSize,
current: current || pageInfo.current
});
}
}, [propsPagination && propsPagination.pageSize, propsPagination && propsPagination.current]);
/** 行选择相关的问题 */
var rowSelection = (0, _objectSpread4.default)((0, _objectSpread4.default)({
selectedRowKeys: selectedRowKeys
}, propsRowSelection), {}, {
onChange: function onChange(keys, rows, info) {
if (propsRowSelection && propsRowSelection.onChange) {
propsRowSelection.onChange(keys, rows, info);
}
setSelectedRowKeys(keys);
}
});
/** 是不是 LightFilter, LightFilter 有一些特殊的处理 */
var isLightFilter = search !== false && (search === null || search === void 0 ? void 0 : search.filterType) === 'light';
var _onFormSearchSubmit = (0, _react.useCallback)(function (values) {
// 判断search.onSearch返回值决定是否更新formSearch
if (options && options.search) {
var _options$search, _options$search$onSea;
var _ref6 = options.search === true ? {} : options.search,
_ref6$name = _ref6.name,
name = _ref6$name === void 0 ? 'keyword' : _ref6$name;
/** 如果传入的 onSearch 返回值为 false则不要把options.search.name对应的值set到formSearch */
var success = (_options$search = options.search) === null || _options$search === void 0 || (_options$search$onSea = _options$search.onSearch) === null || _options$search$onSea === void 0 ? void 0 : _options$search$onSea.call(_options$search, counter.keyWords);
if (success !== false) {
setFormSearch((0, _objectSpread4.default)((0, _objectSpread4.default)({}, values), {}, (0, _defineProperty2.default)({}, name, counter.keyWords)));
return;
}
}
setFormSearch(values);
}, [counter.keyWords, options, setFormSearch]);
var loading = (0, _react.useMemo)(function () {
if ((0, _typeof2.default)(action.loading) === 'object') {
var _action$loading;
return ((_action$loading = action.loading) === null || _action$loading === void 0 ? void 0 : _action$loading.spinning) || false;
}
return action.loading;
}, [action.loading]);
var searchNode = (0, _react.useMemo)(function () {
var node = search === false && type !== 'form' ? null : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Form.default, {
pagination: pagination,
beforeSearchSubmit: beforeSearchSubmit,
action: actionRef,
columns: propsColumns,
onFormSearchSubmit: function onFormSearchSubmit(values) {
_onFormSearchSubmit(values);
},
ghost: ghost,
onReset: props.onReset,
onSubmit: props.onSubmit,
loading: !!loading,
manualRequest: manualRequest,
search: search,
form: props.form,
formRef: formRef,
type: props.type || 'table',
cardBordered: props.cardBordered,
dateFormatter: props.dateFormatter
});
if (searchFormRender && node) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
children: searchFormRender(props, node)
});
} else {
return node;
}
}, [beforeSearchSubmit, formRef, ghost, loading, manualRequest, _onFormSearchSubmit, pagination, props, propsColumns, search, searchFormRender, type]);
var selectedRows = (0, _react.useMemo)(function () {
return selectedRowKeys === null || selectedRowKeys === void 0 ? void 0 : selectedRowKeys.map(function (key) {
var _preserveRecordsRef$c;
return (_preserveRecordsRef$c = preserveRecordsRef.current) === null || _preserveRecordsRef$c === void 0 ? void 0 : _preserveRecordsRef$c.get(key);
});
}, [action.dataSource, selectedRowKeys]);
var hideToolbar = (0, _react.useMemo)(function () {
return options === false && !headerTitle && !toolBarRender && !toolbar && !isLightFilter;
}, [options, headerTitle, toolBarRender, toolbar, isLightFilter]);
/** 内置的工具栏 */
var toolbarDom = toolBarRender === false ? null : /*#__PURE__*/(0, _jsxRuntime.jsx)(_ToolBar.default, {
headerTitle: headerTitle,
hideToolbar: hideToolbar,
selectedRows: selectedRows,
selectedRowKeys: selectedRowKeys,
tableColumn: tableColumn,
tooltip: tooltip,
toolbar: toolbar,
onFormSearchSubmit: function onFormSearchSubmit(newValues) {
setFormSearch((0, _objectSpread4.default)((0, _objectSpread4.default)({}, formSearch), newValues));
},
searchNode: isLightFilter ? searchNode : null,
options: options,
optionsRender: optionsRender,
actionRef: actionRef,
toolBarRender: toolBarRender
});
/** 内置的多选操作栏 */
var alertDom = propsRowSelection !== false ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Alert.default, {
selectedRowKeys: selectedRowKeys,
selectedRows: selectedRows,
onCleanSelected: _onCleanSelected,
alertOptionRender: rest.tableAlertOptionRender,
alertInfoRender: tableAlertRender,
alwaysShowAlert: propsRowSelection === null || propsRowSelection === void 0 ? void 0 : propsRowSelection.alwaysShowAlert
}) : null;
return wrapSSR( /*#__PURE__*/(0, _jsxRuntime.jsx)(TableRender, (0, _objectSpread4.default)((0, _objectSpread4.default)({}, props), {}, {
name: isEditorTable,
defaultClassName: defaultClassName,
size: counter.tableSize,
onSizeChange: counter.setTableSize,
pagination: pagination,
searchNode: searchNode,
rowSelection: propsRowSelection !== false ? rowSelection : undefined,
className: className,
tableColumn: tableColumn,
isLightFilter: isLightFilter,
action: action,
alertDom: alertDom,
toolbarDom: toolbarDom,
hideToolbar: hideToolbar,
onSortChange: function onSortChange(sortConfig) {
if (useLocaleSorter || sortConfig === proSort) return;
setProSort(sortConfig);
},
onFilterChange: function onFilterChange(filterConfig) {
if (useLocaleFilter || filterConfig === proFilter) return;
setProFilter(filterConfig);
},
editableUtils: editableUtils,
getRowKey: getRowKey
})));
};
/**
* 🏆 Use Ant Design Table like a Pro! 更快 更好 更方便
*
* @param props
*/
var ProviderTableContainer = function ProviderTableContainer(props) {
var _useContext = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext),
getPrefixCls = _useContext.getPrefixCls;
var ErrorComponent = props.ErrorBoundary === false ? _react.default.Fragment : props.ErrorBoundary || _proUtils.ErrorBoundary;
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Provide.Container, {
initValue: props,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_proProvider.ProConfigProvider, {
needDeps: true,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ErrorComponent, {
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ProTable, (0, _objectSpread4.default)({
defaultClassName: "".concat(getPrefixCls('pro-table'))
}, props))
})
})
});
};
ProviderTableContainer.Summary = _antd.Table.Summary;
var _default = exports.default = ProviderTableContainer;