@uiw-admin/components
Version:
253 lines (247 loc) • 7.66 kB
JavaScript
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
import _extends from "@babel/runtime/helpers/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose";
var _excluded = ["style", "columns", "rowSelection", "onPageChange", "scroll", "paginationProps"],
_excluded2 = ["props"];
import React, { useState, useEffect, useCallback, useRef, useMemo } from 'react';
import { Table, Pagination, Checkbox, Radio, Empty } from 'uiw';
import { useStore } from './hooks';
import useSelections from './useSelections';
import { useReactMutation, fetchFn } from '@kkt/request';
import { jsx as _jsx } from "react/jsx-runtime";
var BaseTable = _ref => {
var {
columns,
rowSelection = {
selectKey: undefined,
type: 'checkbox',
defaultSelected: []
},
onPageChange: pageChange,
scroll = {},
paginationProps = {}
} = _ref,
tableProps = _objectWithoutPropertiesLoose(_ref, _excluded);
var [pageIndex, setPageIndex] = useState(1);
var [pgSize, setPgSize] = useState((paginationProps == null ? void 0 : paginationProps.pageSize) || 10);
var [prevData, setPrevData] = useState({
data: [],
total: 0
});
var store = useStore();
var {
formatData,
updateStore,
query,
key,
searchValues,
requestOptions,
mutationOptions
} = store;
var {
selectKey,
type = 'checkbox',
defaultSelected = []
} = rowSelection;
var {
x
} = scroll;
var isCheckbox = type === 'checkbox';
// 提出表单属性
var defaultColumns = () => {
return columns.map(item => {
var others = _objectWithoutPropertiesLoose(item, _excluded2);
return others;
});
};
// 表单默认值
var defaultValues = useMemo(() => {
var defaultSearchValues = {};
columns.forEach(col => {
var _col$props;
if (col != null && (_col$props = col.props) != null && _col$props.initialValue) {
var name = col.props.key || col.key;
defaultSearchValues[name] = col.props.initialValue;
}
if (Array.isArray(col.props)) {
col.props.forEach(form => {
var name = form.key || col.key;
if (form.initialValue) {
defaultSearchValues[name] = form.initialValue;
}
});
}
});
return defaultSearchValues;
}, [JSON.stringify(columns)]);
// 是否首次调取数据
var isFirstMountRef = useRef(false);
// 格式化接口查询参数
var formatQuery = () => {
if (query) {
var params = _extends({}, defaultValues, searchValues);
return query(pageIndex, pgSize, params);
} else {
// 默认传参
return {
page: 1,
pageSize: 10
};
}
};
var pageSize = formatQuery().pageSize || 10;
// 调接口
var {
mutate,
data,
isLoading
} = useReactMutation(_extends({
mutationFn: function () {
var _mutationFn = _asyncToGenerator(function* () {
var url = key;
var query = formatQuery();
var params = _extends({
method: 'POST',
body: JSON.stringify(query)
}, requestOptions);
if (['get', 'GET'].includes(params.method)) {
var searchParams = new URLSearchParams(query);
url += '?' + searchParams.toString();
delete params.body;
}
return fetchFn(url, params);
});
function mutationFn() {
return _mutationFn.apply(this, arguments);
}
return mutationFn;
}()
}, mutationOptions));
useEffect(() => {
// 第一次加载
mutate();
}, [mutate]);
// table数据
var tableData = formatData && data ? formatData(data).data : (data == null ? void 0 : data.data) || (prevData == null ? void 0 : prevData.data);
var selection = useSelections(
// 有枚举值的话 设置枚举值
selectKey ? tableData ? tableData.map(itm => itm[selectKey]) : [] : [], defaultSelected, type === 'radio');
// 总数
var total = formatData && data ? formatData(data).total : (data == null ? void 0 : data.total) || (prevData == null ? void 0 : prevData.total);
// 分页
var onPageChange = useCallback( /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator(function* (page) {
if (pageChange) {
pageChange(page);
}
yield setPageIndex(page);
mutate(false);
});
return function (_x) {
return _ref2.apply(this, arguments);
};
}(), [setPageIndex, pageChange]);
useEffect(() => {
// 获取表单默认值
var defaultSearchValues = {};
columns.forEach(col => {
var _col$props2;
if (col != null && (_col$props2 = col.props) != null && _col$props2.initialValue) {
var name = col.props.key || col.key;
defaultSearchValues[name] = col.props.initialValue;
}
if (Array.isArray(col.props)) {
col.props.forEach(form => {
var name = form.key || col.key;
if (form.initialValue) {
defaultSearchValues[name] = form.initialValue;
}
});
}
});
var stores = {
data: tableData,
total,
loading: isLoading,
// onSearch,
selection,
pageIndex,
setPageIndex,
mutate
};
if (!isFirstMountRef.current) {
isFirstMountRef.current = true;
// 默认表单值
stores.searchValues = defaultSearchValues;
}
updateStore(stores);
// 上一次请求数据
if (data) {
setPrevData(tableData);
}
}, [JSON.stringify(tableData), isLoading, JSON.stringify(columns), pageIndex, JSON.stringify(selection), setPageIndex, mutate, total]);
var selectionCol = [{
title: isCheckbox ? () => {
return /*#__PURE__*/_jsx(Checkbox, {
checked: selection.allSelected,
indeterminate: !selection.allSelected && selection.partiallySelected,
onClick: () => {
selection.toggleAll();
}
});
} : null,
key: 'checked',
width: 35,
render: (text, key, rowData) => {
if (!selectKey) return null;
return isCheckbox ? /*#__PURE__*/_jsx(Checkbox, {
checked: selection.isSelected(rowData[selectKey]),
onClick: () => {
selection.toggle(rowData[selectKey]);
}
}) : /*#__PURE__*/_jsx(Radio, {
onChange: () => {
selection.toggle(rowData[selectKey]);
},
checked: selection.isSelected(rowData[selectKey])
});
}
}];
return /*#__PURE__*/_jsx("div", {
style: {
overflow: x ? 'scroll' : 'hidden'
},
children: /*#__PURE__*/_jsx("div", {
style: {
width: x || '100%'
},
children: /*#__PURE__*/_jsx(Table
// 判断是否添加选择框
, _extends({
columns: selectKey ? selectionCol.concat(defaultColumns()) : defaultColumns(),
data: tableData,
empty: /*#__PURE__*/_jsx(Empty, {
style: {
padding: '40px 0'
}
}),
footer: tableData && tableData.length > 0 && /*#__PURE__*/_jsx(Pagination, _extends({
divider: true
}, paginationProps, {
current: pageIndex,
pageSize: pageSize,
total: total,
onChange: page => {
onPageChange(page);
},
onShowSizeChange: (current, pageSize) => {
setPgSize(pageSize);
onPageChange(1);
paginationProps == null ? void 0 : paginationProps.onShowSizeChange == null ? void 0 : paginationProps.onShowSizeChange(current, pageSize);
}
}))
}, tableProps))
})
});
};
export default BaseTable;