Update from Vibe Studio

This commit is contained in:
Vibe Studio
2026-01-09 14:52:46 +00:00
parent 42a0efe70b
commit 47fa6d98b2
28661 changed files with 2421771 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
import type { IntlType } from '@ant-design/pro-provider';
import React, { Key } from 'react';
export type AlertRenderType<T> = ((props: {
intl: IntlType;
selectedRowKeys: (number | string | Key)[];
selectedRows: T[];
onCleanSelected: () => void;
}) => React.ReactNode) | false;
export type TableAlertProps<T> = {
selectedRowKeys: (number | string | Key)[];
selectedRows: T[];
alwaysShowAlert?: boolean;
alertInfoRender?: AlertRenderType<T>;
onCleanSelected: () => void;
alertOptionRender?: AlertRenderType<T>;
};
declare function TableAlert<T>({ selectedRowKeys, onCleanSelected, alwaysShowAlert, selectedRows, alertInfoRender, alertOptionRender, }: TableAlertProps<T>): React.JSX.Element | null;
export default TableAlert;

View File

@@ -0,0 +1,78 @@
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _proProvider = require("@ant-design/pro-provider");
var _antd = require("antd");
var _react = _interopRequireWildcard(require("react"));
var _style = require("./style");
var _jsxRuntime = require("react/jsx-runtime");
var defaultAlertOptionRender = function defaultAlertOptionRender(props) {
var intl = props.intl,
onCleanSelected = props.onCleanSelected;
return [/*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
onClick: onCleanSelected,
children: intl.getMessage('alert.clear', '清空')
}, "0")];
};
function TableAlert(_ref) {
var _ref$selectedRowKeys = _ref.selectedRowKeys,
selectedRowKeys = _ref$selectedRowKeys === void 0 ? [] : _ref$selectedRowKeys,
onCleanSelected = _ref.onCleanSelected,
alwaysShowAlert = _ref.alwaysShowAlert,
selectedRows = _ref.selectedRows,
_ref$alertInfoRender = _ref.alertInfoRender,
alertInfoRender = _ref$alertInfoRender === void 0 ? function (_ref2) {
var intl = _ref2.intl;
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_antd.Space, {
children: [intl.getMessage('alert.selected', '已选择'), selectedRowKeys.length, intl.getMessage('alert.item', '项'), "\xA0\xA0"]
});
} : _ref$alertInfoRender,
_ref$alertOptionRende = _ref.alertOptionRender,
alertOptionRender = _ref$alertOptionRende === void 0 ? defaultAlertOptionRender : _ref$alertOptionRende;
var intl = (0, _proProvider.useIntl)();
var option = alertOptionRender && alertOptionRender({
onCleanSelected: onCleanSelected,
selectedRowKeys: selectedRowKeys,
selectedRows: selectedRows,
intl: intl
});
var _useContext = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext),
getPrefixCls = _useContext.getPrefixCls;
var className = getPrefixCls('pro-table-alert');
var _useStyle = (0, _style.useStyle)(className),
wrapSSR = _useStyle.wrapSSR,
hashId = _useStyle.hashId;
if (alertInfoRender === false) {
return null;
}
var dom = alertInfoRender({
intl: intl,
selectedRowKeys: selectedRowKeys,
selectedRows: selectedRows,
onCleanSelected: onCleanSelected
});
if (dom === false || selectedRowKeys.length < 1 && !alwaysShowAlert) {
return null;
}
return wrapSSR( /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(className, " ").concat(hashId).trim(),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(className, "-container ").concat(hashId).trim(),
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: "".concat(className, "-info ").concat(hashId).trim(),
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(className, "-info-content ").concat(hashId).trim(),
children: dom
}), option ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(className, "-info-option ").concat(hashId).trim(),
children: option
}) : null]
})
})
}));
}
var _default = exports.default = TableAlert;

View File

@@ -0,0 +1,9 @@
/// <reference types="react" />
import type { ProAliasToken } from '@ant-design/pro-provider';
export interface ProToken extends ProAliasToken {
componentCls: string;
}
export declare function useStyle(prefixCls: string): {
wrapSSR: (node: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>) => import("react").JSX.Element;
hashId: string;
};

View File

@@ -0,0 +1,43 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useStyle = useStyle;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _proProvider = require("@ant-design/pro-provider");
var genProStyle = function genProStyle(token) {
return (0, _defineProperty2.default)({}, token.componentCls, {
marginBlockEnd: 16,
backgroundColor: (0, _proProvider.setAlpha)(token.colorTextBase, 0.02),
borderRadius: token.borderRadius,
border: 'none',
'&-container': {
paddingBlock: token.paddingSM,
paddingInline: token.paddingLG
},
'&-info': {
display: 'flex',
alignItems: 'center',
transition: 'all 0.3s',
color: token.colorTextTertiary,
'&-content': {
flex: 1
},
'&-option': {
minWidth: 48,
paddingInlineStart: 16
}
}
});
};
function useStyle(prefixCls) {
return (0, _proProvider.useStyle)('ProTableAlert', function (token) {
var proToken = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, token), {}, {
componentCls: ".".concat(prefixCls)
});
return [genProStyle(proToken)];
});
}

View File

@@ -0,0 +1,8 @@
import { type TableColumnType } from 'antd';
import React from 'react';
import type { SettingOptionType } from '../ToolBar';
type ColumnSettingProps<T = any> = SettingOptionType & {
columns: TableColumnType<T>[];
};
declare function ColumnSetting<T>(props: ColumnSettingProps<T>): React.JSX.Element;
export default ColumnSetting;

View File

@@ -0,0 +1,454 @@
"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 _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _icons = require("@ant-design/icons");
var _proProvider = require("@ant-design/pro-provider");
var _proUtils = require("@ant-design/pro-utils");
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _omit = _interopRequireDefault(require("rc-util/lib/omit"));
var _react = _interopRequireWildcard(require("react"));
var _Provide = require("../../Store/Provide");
var _index = require("../../utils/index");
var _style = require("./style");
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["key", "dataIndex", "children"],
_excluded2 = ["disabled"];
var ToolTipIcon = function ToolTipIcon(_ref) {
var title = _ref.title,
show = _ref.show,
children = _ref.children,
columnKey = _ref.columnKey,
fixed = _ref.fixed;
var _useContext = (0, _react.useContext)(_Provide.TableContext),
columnsMap = _useContext.columnsMap,
setColumnsMap = _useContext.setColumnsMap;
if (!show) {
return null;
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tooltip, {
title: title,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
onClick: function onClick(e) {
e.stopPropagation();
e.preventDefault();
var config = columnsMap[columnKey] || {};
var columnKeyMap = (0, _objectSpread3.default)((0, _objectSpread3.default)({}, columnsMap), {}, (0, _defineProperty2.default)({}, columnKey, (0, _objectSpread3.default)((0, _objectSpread3.default)({}, config), {}, {
fixed: fixed
})));
setColumnsMap(columnKeyMap);
},
children: children
})
});
};
var CheckboxListItem = function CheckboxListItem(_ref2) {
var columnKey = _ref2.columnKey,
isLeaf = _ref2.isLeaf,
title = _ref2.title,
className = _ref2.className,
fixed = _ref2.fixed,
showListItemOption = _ref2.showListItemOption;
var intl = (0, _proProvider.useIntl)();
var _useContext2 = (0, _react.useContext)(_proProvider.ProProvider),
hashId = _useContext2.hashId;
var dom = /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
className: "".concat(className, "-list-item-option ").concat(hashId).trim(),
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(ToolTipIcon, {
columnKey: columnKey,
fixed: "left",
title: intl.getMessage('tableToolBar.leftPin', '固定在列首'),
show: fixed !== 'left',
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.VerticalAlignTopOutlined, {})
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(ToolTipIcon, {
columnKey: columnKey,
fixed: undefined,
title: intl.getMessage('tableToolBar.noPin', '不固定'),
show: !!fixed,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.VerticalAlignMiddleOutlined, {})
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(ToolTipIcon, {
columnKey: columnKey,
fixed: "right",
title: intl.getMessage('tableToolBar.rightPin', '固定在列尾'),
show: fixed !== 'right',
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.VerticalAlignBottomOutlined, {})
})]
});
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
className: "".concat(className, "-list-item ").concat(hashId).trim(),
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(className, "-list-item-title ").concat(hashId).trim(),
children: title
}), showListItemOption && !isLeaf ? dom : null]
}, columnKey);
};
var CheckboxList = function CheckboxList(_ref3) {
var _treeDataConfig$list, _treeDataConfig$list2, _treeDataConfig$list3;
var list = _ref3.list,
draggable = _ref3.draggable,
checkable = _ref3.checkable,
showListItemOption = _ref3.showListItemOption,
className = _ref3.className,
_ref3$showTitle = _ref3.showTitle,
showTitle = _ref3$showTitle === void 0 ? true : _ref3$showTitle,
listTitle = _ref3.title,
_ref3$listHeight = _ref3.listHeight,
listHeight = _ref3$listHeight === void 0 ? 280 : _ref3$listHeight;
var _useContext3 = (0, _react.useContext)(_proProvider.ProProvider),
hashId = _useContext3.hashId;
var _useContext4 = (0, _react.useContext)(_Provide.TableContext),
columnsMap = _useContext4.columnsMap,
setColumnsMap = _useContext4.setColumnsMap,
sortKeyColumns = _useContext4.sortKeyColumns,
setSortKeyColumns = _useContext4.setSortKeyColumns;
var show = list && list.length > 0;
var treeDataConfig = (0, _react.useMemo)(function () {
if (!show) return {};
var checkedKeys = [];
var treeMap = new Map();
var loopData = function loopData(data, parentConfig) {
return data.map(function (_ref4) {
var _config$disable;
var key = _ref4.key,
dataIndex = _ref4.dataIndex,
children = _ref4.children,
rest = (0, _objectWithoutProperties2.default)(_ref4, _excluded);
var columnKey = (0, _index.genColumnKey)(key, [parentConfig === null || parentConfig === void 0 ? void 0 : parentConfig.columnKey, rest.index].filter(Boolean).join('-'));
var config = columnsMap[columnKey || 'null'] || {
show: true
};
if (config.show !== false && !children) {
checkedKeys.push(columnKey);
}
var item = (0, _objectSpread3.default)((0, _objectSpread3.default)({
key: columnKey
}, (0, _omit.default)(rest, ['className'])), {}, {
selectable: false,
disabled: config.disable === true,
disableCheckbox: typeof config.disable === 'boolean' ? config.disable : (_config$disable = config.disable) === null || _config$disable === void 0 ? void 0 : _config$disable.checkbox,
isLeaf: parentConfig ? true : undefined
});
if (children) {
var _item$children;
item.children = loopData(children, (0, _objectSpread3.default)((0, _objectSpread3.default)({}, config), {}, {
columnKey: columnKey
}));
// 如果children 已经全部是show了把自己也设置为show
if ((_item$children = item.children) !== null && _item$children !== void 0 && _item$children.every(function (childrenItem) {
return checkedKeys === null || checkedKeys === void 0 ? void 0 : checkedKeys.includes(childrenItem.key);
})) {
checkedKeys.push(columnKey);
}
}
treeMap.set(key, item);
return item;
});
};
return {
list: loopData(list),
keys: checkedKeys,
map: treeMap
};
}, [columnsMap, list, show]);
/** 移动到指定的位置 */
var move = (0, _proUtils.useRefFunction)(function (id, targetId, dropPosition) {
var newMap = (0, _objectSpread3.default)({}, columnsMap);
var newColumns = (0, _toConsumableArray2.default)(sortKeyColumns);
var findIndex = newColumns.findIndex(function (columnKey) {
return columnKey === id;
});
var targetIndex = newColumns.findIndex(function (columnKey) {
return columnKey === targetId;
});
var isDownWard = dropPosition >= findIndex;
if (findIndex < 0) return;
var targetItem = newColumns[findIndex];
newColumns.splice(findIndex, 1);
if (dropPosition === 0) {
newColumns.unshift(targetItem);
} else {
newColumns.splice(isDownWard ? targetIndex : targetIndex + 1, 0, targetItem);
}
// 重新生成排序数组
newColumns.forEach(function (key, order) {
newMap[key] = (0, _objectSpread3.default)((0, _objectSpread3.default)({}, newMap[key] || {}), {}, {
order: order
});
});
// 更新数组
setColumnsMap(newMap);
setSortKeyColumns(newColumns);
});
/** 选中反选功能 */
var onCheckTree = (0, _proUtils.useRefFunction)(function (e) {
var newColumnMap = (0, _objectSpread3.default)({}, columnsMap);
var loopSetShow = function loopSetShow(key) {
var _treeDataConfig$map;
var newSetting = (0, _objectSpread3.default)({}, newColumnMap[key]);
newSetting.show = e.checked;
// 如果含有子节点,也要选中
if ((_treeDataConfig$map = treeDataConfig.map) !== null && _treeDataConfig$map !== void 0 && (_treeDataConfig$map = _treeDataConfig$map.get(key)) !== null && _treeDataConfig$map !== void 0 && _treeDataConfig$map.children) {
var _treeDataConfig$map$g;
(_treeDataConfig$map$g = treeDataConfig.map.get(key)) === null || _treeDataConfig$map$g === void 0 || (_treeDataConfig$map$g = _treeDataConfig$map$g.children) === null || _treeDataConfig$map$g === void 0 || _treeDataConfig$map$g.forEach(function (item) {
return loopSetShow(item.key);
});
}
newColumnMap[key] = newSetting;
};
loopSetShow(e.node.key);
setColumnsMap((0, _objectSpread3.default)({}, newColumnMap));
});
if (!show) {
return null;
}
var listDom = /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tree, {
itemHeight: 24,
draggable: draggable && !!((_treeDataConfig$list = treeDataConfig.list) !== null && _treeDataConfig$list !== void 0 && _treeDataConfig$list.length) && ((_treeDataConfig$list2 = treeDataConfig.list) === null || _treeDataConfig$list2 === void 0 ? void 0 : _treeDataConfig$list2.length) > 1,
checkable: checkable,
onDrop: function onDrop(info) {
var dropKey = info.node.key;
var dragKey = info.dragNode.key;
var dropPosition = info.dropPosition,
dropToGap = info.dropToGap;
var position = dropPosition === -1 || !dropToGap ? dropPosition + 1 : dropPosition;
move(dragKey, dropKey, position);
},
blockNode: true,
onCheck: function onCheck(_, e) {
return onCheckTree(e);
},
checkedKeys: treeDataConfig.keys,
showLine: false,
titleRender: function titleRender(_node) {
var node = (0, _objectSpread3.default)((0, _objectSpread3.default)({}, _node), {}, {
children: undefined
});
if (!node.title) return null;
var normalizedTitle = (0, _proUtils.runFunction)(node.title, node);
var wrappedTitle = /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Typography.Text, {
style: {
width: 80
},
ellipsis: {
tooltip: normalizedTitle
},
children: normalizedTitle
});
return /*#__PURE__*/(0, _jsxRuntime.jsx)(CheckboxListItem, (0, _objectSpread3.default)((0, _objectSpread3.default)({
className: className
}, (0, _omit.default)(node, ['key'])), {}, {
showListItemOption: showListItemOption,
title: wrappedTitle,
columnKey: node.key
}));
},
height: listHeight,
treeData: (_treeDataConfig$list3 = treeDataConfig.list) === null || _treeDataConfig$list3 === void 0 ? void 0 : _treeDataConfig$list3.map(function (_ref5) {
var disabled = _ref5.disabled,
config = (0, _objectWithoutProperties2.default)(_ref5, _excluded2);
return config;
})
});
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [showTitle && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
className: "".concat(className, "-list-title ").concat(hashId).trim(),
children: listTitle
}), listDom]
});
};
var GroupCheckboxList = function GroupCheckboxList(_ref6) {
var localColumns = _ref6.localColumns,
className = _ref6.className,
draggable = _ref6.draggable,
checkable = _ref6.checkable,
showListItemOption = _ref6.showListItemOption,
listsHeight = _ref6.listsHeight;
var _useContext5 = (0, _react.useContext)(_proProvider.ProProvider),
hashId = _useContext5.hashId;
var rightList = [];
var leftList = [];
var list = [];
var intl = (0, _proProvider.useIntl)();
localColumns.forEach(function (item) {
/** 不在 setting 中展示的 */
if (item.hideInSetting) {
return;
}
var fixed = item.fixed;
if (fixed === 'left') {
leftList.push(item);
return;
}
if (fixed === 'right') {
rightList.push(item);
return;
}
list.push(item);
});
var showRight = rightList && rightList.length > 0;
var showLeft = leftList && leftList.length > 0;
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: (0, _classnames.default)("".concat(className, "-list"), hashId, (0, _defineProperty2.default)({}, "".concat(className, "-list-group"), showRight || showLeft)),
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(CheckboxList, {
title: intl.getMessage('tableToolBar.leftFixedTitle', '固定在左侧'),
list: leftList,
draggable: draggable,
checkable: checkable,
showListItemOption: showListItemOption,
className: className,
listHeight: listsHeight
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(CheckboxList, {
list: list,
draggable: draggable,
checkable: checkable,
showListItemOption: showListItemOption,
title: intl.getMessage('tableToolBar.noFixedTitle', '不固定'),
showTitle: showLeft || showRight,
className: className,
listHeight: listsHeight
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(CheckboxList, {
title: intl.getMessage('tableToolBar.rightFixedTitle', '固定在右侧'),
list: rightList,
draggable: draggable,
checkable: checkable,
showListItemOption: showListItemOption,
className: className,
listHeight: listsHeight
})]
});
};
function ColumnSetting(props) {
var _props$checkable, _props$draggable, _props$showListItemOp, _props$settingIcon;
var columnRef = (0, _react.useRef)(null);
// 获得当前上下文的 hashID
var counter = (0, _react.useContext)(_Provide.TableContext);
var localColumns = props.columns;
var _props$checkedReset = props.checkedReset,
checkedReset = _props$checkedReset === void 0 ? true : _props$checkedReset;
var columnsMap = counter.columnsMap,
setColumnsMap = counter.setColumnsMap,
clearPersistenceStorage = counter.clearPersistenceStorage;
(0, _react.useEffect)(function () {
var _counter$propsRef$cur;
if ((_counter$propsRef$cur = counter.propsRef.current) !== null && _counter$propsRef$cur !== void 0 && (_counter$propsRef$cur = _counter$propsRef$cur.columnsState) !== null && _counter$propsRef$cur !== void 0 && _counter$propsRef$cur.value) {
var _counter$propsRef$cur2;
columnRef.current = JSON.parse(JSON.stringify(((_counter$propsRef$cur2 = counter.propsRef.current) === null || _counter$propsRef$cur2 === void 0 || (_counter$propsRef$cur2 = _counter$propsRef$cur2.columnsState) === null || _counter$propsRef$cur2 === void 0 ? void 0 : _counter$propsRef$cur2.value) || {}));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
/**
* 设置全部选中,或全部未选中
*
* @param show
*/
var setAllSelectAction = (0, _proUtils.useRefFunction)(function () {
var show = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
var columnKeyMap = {};
var loopColumns = function loopColumns(columns) {
columns.forEach(function (_ref7) {
var key = _ref7.key,
fixed = _ref7.fixed,
index = _ref7.index,
children = _ref7.children,
disable = _ref7.disable;
var columnKey = (0, _index.genColumnKey)(key, index);
if (columnKey) {
var _columnsMap$columnKey, _columnsMap$columnKey2;
columnKeyMap[columnKey] = {
// 子节点 disable 时,不修改节点显示状态
show: disable ? (_columnsMap$columnKey = columnsMap[columnKey]) === null || _columnsMap$columnKey === void 0 ? void 0 : _columnsMap$columnKey.show : show,
fixed: fixed,
disable: disable,
order: (_columnsMap$columnKey2 = columnsMap[columnKey]) === null || _columnsMap$columnKey2 === void 0 ? void 0 : _columnsMap$columnKey2.order
};
}
if (children) {
loopColumns(children);
}
});
};
loopColumns(localColumns);
setColumnsMap(columnKeyMap);
});
/** 全选和反选 */
var checkedAll = (0, _proUtils.useRefFunction)(function (e) {
if (e.target.checked) {
setAllSelectAction();
} else {
setAllSelectAction(false);
}
});
/** 重置项目 */
var clearClick = (0, _proUtils.useRefFunction)(function () {
var _counter$propsRef$cur3;
clearPersistenceStorage === null || clearPersistenceStorage === void 0 || clearPersistenceStorage();
setColumnsMap(((_counter$propsRef$cur3 = counter.propsRef.current) === null || _counter$propsRef$cur3 === void 0 || (_counter$propsRef$cur3 = _counter$propsRef$cur3.columnsState) === null || _counter$propsRef$cur3 === void 0 ? void 0 : _counter$propsRef$cur3.defaultValue) || columnRef.current || counter.defaultColumnKeyMap);
});
// 未选中的 key 列表
var unCheckedKeys = Object.values(columnsMap).filter(function (value) {
return !value || value.show === false;
});
// 是否已经选中
var indeterminate = unCheckedKeys.length > 0 && unCheckedKeys.length !== localColumns.length;
var intl = (0, _proProvider.useIntl)();
var _useContext6 = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext),
getPrefixCls = _useContext6.getPrefixCls;
var className = getPrefixCls('pro-table-column-setting');
var _useStyle = (0, _style.useStyle)(className),
wrapSSR = _useStyle.wrapSSR,
hashId = _useStyle.hashId;
return wrapSSR( /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Popover, {
arrow: false,
title: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: "".concat(className, "-title ").concat(hashId).trim(),
children: [props.checkable === false ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Checkbox, {
indeterminate: indeterminate,
checked: unCheckedKeys.length === 0 && unCheckedKeys.length !== localColumns.length,
onChange: function onChange(e) {
checkedAll(e);
},
children: intl.getMessage('tableToolBar.columnDisplay', '列展示')
}), checkedReset ? /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
onClick: clearClick,
className: "".concat(className, "-action-rest-button ").concat(hashId).trim(),
children: intl.getMessage('tableToolBar.reset', '重置')
}) : null, props !== null && props !== void 0 && props.extra ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Space, {
size: 12,
align: "center",
children: props.extra
}) : null]
}),
overlayClassName: "".concat(className, "-overlay ").concat(hashId).trim(),
trigger: "click",
placement: "bottomRight",
content: /*#__PURE__*/(0, _jsxRuntime.jsx)(GroupCheckboxList, {
checkable: (_props$checkable = props.checkable) !== null && _props$checkable !== void 0 ? _props$checkable : true,
draggable: (_props$draggable = props.draggable) !== null && _props$draggable !== void 0 ? _props$draggable : true,
showListItemOption: (_props$showListItemOp = props.showListItemOption) !== null && _props$showListItemOp !== void 0 ? _props$showListItemOp : true,
className: className,
localColumns: localColumns,
listsHeight: props.listsHeight
}),
children: props.children || /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tooltip, {
title: intl.getMessage('tableToolBar.columnSetting', '列设置'),
children: (_props$settingIcon = props.settingIcon) !== null && _props$settingIcon !== void 0 ? _props$settingIcon : /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.SettingOutlined, {})
})
}));
}
var _default = exports.default = ColumnSetting;

View File

@@ -0,0 +1,9 @@
/// <reference types="react" />
import type { ProAliasToken } from '@ant-design/pro-provider';
export interface ProToken extends ProAliasToken {
componentCls: string;
}
export declare function useStyle(prefixCls: string): {
wrapSSR: (node: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>) => import("react").JSX.Element;
hashId: string;
};

View File

@@ -0,0 +1,89 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useStyle = useStyle;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _proProvider = require("@ant-design/pro-provider");
var genProStyle = function genProStyle(token) {
return (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, token.componentCls, {
width: 'auto',
'&-title': {
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
height: '32px'
},
'&-overlay': (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(token.antCls, "-popover-inner-content"), {
width: '200px',
paddingBlock: 0,
paddingInline: 0,
paddingBlockEnd: 8
}), "".concat(token.antCls, "-tree-node-content-wrapper:hover"), {
backgroundColor: 'transparent'
}), "".concat(token.antCls, "-tree-draggable-icon"), {
cursor: 'grab'
}), "".concat(token.antCls, "-tree-treenode"), (0, _defineProperty2.default)((0, _defineProperty2.default)({
alignItems: 'center',
'&:hover': (0, _defineProperty2.default)({}, "".concat(token.componentCls, "-list-item-option"), {
display: 'block'
})
}, "".concat(token.antCls, "-tree-checkbox"), {
marginInlineEnd: '4px'
}), "".concat(token.antCls, "-tree-title"), {
width: '100%'
}))
}), "".concat(token.componentCls, "-action-rest-button"), {
color: token.colorPrimary
}), "".concat(token.componentCls, "-list"), (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({
display: 'flex',
flexDirection: 'column',
width: '100%',
paddingBlockStart: 8
}, "&".concat(token.componentCls, "-list-group"), {
paddingBlockStart: 0
}), '&-title', {
marginBlockStart: '6px',
marginBlockEnd: '6px',
paddingInlineStart: '24px',
color: token.colorTextSecondary,
fontSize: '12px'
}), '&-item', {
display: 'flex',
alignItems: 'center',
maxHeight: 24,
justifyContent: 'space-between',
'&-title': {
flex: 1,
maxWidth: 80,
textOverflow: 'ellipsis',
overflow: 'hidden',
wordBreak: 'break-all',
whiteSpace: 'nowrap'
},
'&-option': {
display: 'none',
float: 'right',
cursor: 'pointer',
'> span': {
'> span.anticon': {
color: token.colorPrimary
}
},
'> span + span': {
marginInlineStart: 4
}
}
}));
};
function useStyle(prefixCls) {
return (0, _proProvider.useStyle)('ColumnSetting', function (token) {
var proToken = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, token), {}, {
componentCls: ".".concat(prefixCls)
});
return [genProStyle(proToken)];
});
}

View File

@@ -0,0 +1,13 @@
import type { ParamsType } from '@ant-design/pro-provider';
import React from 'react';
import type { ProTableProps } from '../../typing';
export type DragTableProps<T, U> = {
/** @name 拖动排序列key值 如配置此参数,则会在该 key 对应的行显示拖拽排序把手,允许拖拽排序 */
dragSortKey?: string;
/** @name 渲染自定义拖动排序把手的函数 如配置了 dragSortKey 但未配置此参数,则使用默认把手图标 */
dragSortHandlerRender?: (rowData: T, idx: number) => React.ReactNode;
/** @name 拖动排序完成回调 */
onDragSortEnd?: (beforeIndex: number, afterIndex: number, newDataSource: T[]) => Promise<void> | void;
} & ProTableProps<T, U>;
declare function DragSortTable<T extends Record<string, any>, U extends ParamsType = ParamsType, ValueType = 'text'>(props: DragTableProps<T, U>): React.JSX.Element;
export default DragSortTable;

View File

@@ -0,0 +1,118 @@
"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 _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _icons = require("@ant-design/icons");
var _antd = require("antd");
var _useMergedState3 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
var _react = _interopRequireWildcard(require("react"));
var _Table = _interopRequireDefault(require("../../Table"));
var _useDragSort2 = require("../../utils/useDragSort");
var _style = require("./style");
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["rowKey", "dragSortKey", "dragSortHandlerRender", "onDragSortEnd", "onDataSourceChange", "defaultData", "dataSource", "onLoad"],
_excluded2 = ["rowData", "index", "className"];
function DragSortTable(props) {
var _otherProps$columns;
var rowKey = props.rowKey,
dragSortKey = props.dragSortKey,
dragSortHandlerRender = props.dragSortHandlerRender,
onDragSortEnd = props.onDragSortEnd,
onDataSourceChange = props.onDataSourceChange,
defaultData = props.defaultData,
originDataSource = props.dataSource,
onLoad = props.onLoad,
otherProps = (0, _objectWithoutProperties2.default)(props, _excluded);
var _useContext = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext),
getPrefixCls = _useContext.getPrefixCls;
var _useMergedState = (0, _useMergedState3.default)(function () {
return defaultData || [];
}, {
value: originDataSource,
onChange: onDataSourceChange
}),
_useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
dataSource = _useMergedState2[0],
setDataSource = _useMergedState2[1];
var _useStyle = (0, _style.useStyle)(getPrefixCls('pro-table-drag')),
wrapSSR = _useStyle.wrapSSR,
hashId = _useStyle.hashId;
// 默认拖拽把手
var DragHandle = (0, _react.useMemo)(function () {
return function (dragHandleProps) {
var rowData = dragHandleProps.rowData,
index = dragHandleProps.index,
className = dragHandleProps.className,
rest = (0, _objectWithoutProperties2.default)(dragHandleProps, _excluded2);
var defaultDom = /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.HolderOutlined, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, rest), {}, {
className: "".concat(getPrefixCls('pro-table-drag-icon'), " ").concat(className || '', " ").concat(hashId || '').trim()
}));
var handel = dragSortHandlerRender ? dragSortHandlerRender(dragHandleProps === null || dragHandleProps === void 0 ? void 0 : dragHandleProps.rowData, dragHandleProps === null || dragHandleProps === void 0 ? void 0 : dragHandleProps.index) : defaultDom;
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, rest), {}, {
children: handel
}));
};
}, [getPrefixCls]);
// 使用自定义hooks获取拖拽相关组件的components集合
var _useDragSort = (0, _useDragSort2.useDragSort)({
dataSource: dataSource === null || dataSource === void 0 ? void 0 : dataSource.slice(),
dragSortKey: dragSortKey,
onDragSortEnd: onDragSortEnd,
components: props.components,
rowKey: rowKey,
DragHandle: DragHandle
}),
components = _useDragSort.components,
DndContext = _useDragSort.DndContext;
var wrapOnload = /*#__PURE__*/function () {
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(ds) {
return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
setDataSource(ds);
return _context.abrupt("return", onLoad === null || onLoad === void 0 ? void 0 : onLoad(ds));
case 2:
case "end":
return _context.stop();
}
}, _callee);
}));
return function wrapOnload(_x) {
return _ref.apply(this, arguments);
};
}();
return wrapSSR( /*#__PURE__*/(0, _jsxRuntime.jsx)(_Table.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, otherProps), {}, {
columns: (_otherProps$columns = otherProps.columns) === null || _otherProps$columns === void 0 ? void 0 : _otherProps$columns.map(function (item) {
if (item.dataIndex == dragSortKey || item.key === dragSortKey) {
if (!item.render) {
item.render = function () {
return null;
};
}
}
return item;
}),
onLoad: wrapOnload,
rowKey: rowKey,
tableViewRender: function tableViewRender(_, defaultDom) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(DndContext, {
children: defaultDom
});
},
dataSource: dataSource,
components: components,
onDataSourceChange: onDataSourceChange
})));
}
var _default = exports.default = DragSortTable;

View File

@@ -0,0 +1,9 @@
/// <reference types="react" />
import type { ProAliasToken } from '@ant-design/pro-provider';
export interface ProListToken extends ProAliasToken {
componentCls: string;
}
export declare function useStyle(prefixCls: string): {
wrapSSR: (node: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>) => import("react").JSX.Element;
hashId: string;
};

View File

@@ -0,0 +1,34 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useStyle = useStyle;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _proProvider = require("@ant-design/pro-provider");
var genProListStyle = function genProListStyle(token) {
return (0, _defineProperty2.default)({}, token.componentCls, {
'&-icon': {
marginInlineEnd: 8,
color: token.colorTextSecondary,
cursor: 'grab !important',
padding: 4,
fontSize: 12,
borderRadius: token.borderRadius,
'&:hover': {
color: token.colorText,
backgroundColor: token.colorInfoBg
}
}
});
};
function useStyle(prefixCls) {
return (0, _proProvider.useStyle)('DragSortTable', function (token) {
var proListToken = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, token), {}, {
componentCls: ".".concat(prefixCls)
});
return [genProListStyle(proListToken)];
});
}

View File

@@ -0,0 +1,24 @@
import type { MenuItemProps } from 'antd';
import React from 'react';
interface MenuItems extends MenuItemProps {
name: React.ReactNode;
key: string;
title?: string;
}
export type DropdownProps = {
className?: string;
style?: React.CSSProperties;
menus?: MenuItems[];
onSelect?: (key: string) => void;
children?: React.ReactNode;
};
/**
* 一个简单的下拉菜单
*
* @param param0
*/
declare const DropdownButton: React.FC<DropdownProps>;
declare const TableDropdown: React.FC<DropdownProps> & {
Button: typeof DropdownButton;
};
export default TableDropdown;

View File

@@ -0,0 +1,86 @@
"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 _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _icons = require("@ant-design/icons");
var _proUtils = require("@ant-design/pro-utils");
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireWildcard(require("react"));
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["key", "name"];
/**
* 一个简单的下拉菜单
*
* @param param0
*/
var DropdownButton = function DropdownButton(_ref) {
var children = _ref.children,
menus = _ref.menus,
onSelect = _ref.onSelect,
className = _ref.className,
style = _ref.style;
var _useContext = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext),
getPrefixCls = _useContext.getPrefixCls;
var tempClassName = getPrefixCls('pro-table-dropdown');
var dropdownProps = (0, _proUtils.menuOverlayCompatible)({
onClick: function onClick(params) {
return onSelect && onSelect(params.key);
},
items: menus === null || menus === void 0 ? void 0 : menus.map(function (item) {
return {
label: item.name,
key: item.key
};
})
});
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Dropdown, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, dropdownProps), {}, {
className: (0, _classnames.default)(tempClassName, className),
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_antd.Button, {
style: style,
children: [children, " ", /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.DownOutlined, {})]
})
}));
};
var TableDropdown = function TableDropdown(_ref2) {
var propsClassName = _ref2.className,
style = _ref2.style,
onSelect = _ref2.onSelect,
_ref2$menus = _ref2.menus,
menus = _ref2$menus === void 0 ? [] : _ref2$menus,
children = _ref2.children;
var _useContext2 = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext),
getPrefixCls = _useContext2.getPrefixCls;
var className = getPrefixCls('pro-table-dropdown');
var dropdownProps = (0, _proUtils.menuOverlayCompatible)({
onClick: function onClick(params) {
onSelect === null || onSelect === void 0 || onSelect(params.key);
},
items: menus.map(function (_ref3) {
var key = _ref3.key,
name = _ref3.name,
rest = (0, _objectWithoutProperties2.default)(_ref3, _excluded);
return (0, _objectSpread2.default)((0, _objectSpread2.default)({
key: key
}, rest), {}, {
title: rest.title,
label: name
});
})
});
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Dropdown, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, dropdownProps), {}, {
className: (0, _classnames.default)(className, propsClassName),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
style: style,
children: children || /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.EllipsisOutlined, {})
})
}));
};
TableDropdown.Button = DropdownButton;
var _default = exports.default = TableDropdown;

View File

@@ -0,0 +1,3 @@
import type { ParamsType } from '@ant-design/pro-provider';
import { EditableProTableProps } from './index';
export declare function CellEditorTable<DataType extends Record<string, any>, Params extends ParamsType = ParamsType, ValueType = 'text'>(props: EditableProTableProps<DataType, Params, ValueType>): import("react/jsx-runtime").JSX.Element;

View File

@@ -0,0 +1,66 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CellEditorTable = CellEditorTable;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireDefault(require("react"));
var _index = _interopRequireDefault(require("./index"));
var _jsxRuntime = require("react/jsx-runtime");
function CellEditorTable(props) {
var _props$columns;
var _React$useState = _react.default.useState([]),
_React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
editableKeys = _React$useState2[0],
setEditableRowKeys = _React$useState2[1];
var _React$useState3 = _react.default.useState([]),
_React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
dataIndex = _React$useState4[0],
setDataIndex = _React$useState4[1];
var rowKey = props.rowKey || 'id';
// ============================ RowKey ============================
var getRowKey = _react.default.useMemo(function () {
if (typeof rowKey === 'function') {
return rowKey;
}
return function (record, index) {
var _ref;
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 (_ref = record === null || record === void 0 ? void 0 : record[rowKey]) !== null && _ref !== void 0 ? _ref : index === null || index === void 0 ? void 0 : index.toString();
};
}, [props.name, rowKey]);
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({
bordered: true,
pagination: false
}, props), {}, {
editable: (0, _objectSpread2.default)({
editableKeys: editableKeys
}, props.editable),
columns: (props === null || props === void 0 || (_props$columns = props.columns) === null || _props$columns === void 0 ? void 0 : _props$columns.map(function (item) {
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
editable: dataIndex.flat(1).join('.') === [item.dataIndex || item.key].flat(1).join('.') ? undefined : false,
onCell: function onCell(record, rowIndex) {
return {
onDoubleClick: function onDoubleClick() {
setEditableRowKeys([getRowKey(record, rowIndex)]);
setDataIndex([item.dataIndex || item.key]);
},
onBlur: function onBlur() {
setEditableRowKeys([]);
}
};
}
});
})) || []
}));
}

View File

@@ -0,0 +1,3 @@
import type { ParamsType } from '@ant-design/pro-provider';
import { EditableProTableProps } from './index';
export declare function RowEditorTable<DataType extends Record<string, any>, Params extends ParamsType = ParamsType, ValueType = 'text'>(props: EditableProTableProps<DataType, Params, ValueType>): import("react/jsx-runtime").JSX.Element;

View File

@@ -0,0 +1,60 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.RowEditorTable = RowEditorTable;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireDefault(require("react"));
var _index = _interopRequireDefault(require("./index"));
var _jsxRuntime = require("react/jsx-runtime");
function RowEditorTable(props) {
var _props$columns;
var _React$useState = _react.default.useState([]),
_React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
editableKeys = _React$useState2[0],
setEditableRowKeys = _React$useState2[1];
var rowKey = props.rowKey || 'id';
// ============================ RowKey ============================
var getRowKey = _react.default.useMemo(function () {
if (typeof rowKey === 'function') {
return rowKey;
}
return function (record, index) {
var _ref;
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 (_ref = record === null || record === void 0 ? void 0 : record[rowKey]) !== null && _ref !== void 0 ? _ref : index === null || index === void 0 ? void 0 : index.toString();
};
}, [props.name, rowKey]);
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({
bordered: true,
pagination: false
}, props), {}, {
editable: (0, _objectSpread2.default)({
editableKeys: editableKeys
}, props.editable),
columns: (props === null || props === void 0 || (_props$columns = props.columns) === null || _props$columns === void 0 ? void 0 : _props$columns.map(function (item) {
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
onCell: function onCell(record, rowIndex) {
return {
onDoubleClick: function onDoubleClick() {
setEditableRowKeys([getRowKey(record, rowIndex)]);
},
onBlur: function onBlur() {
setEditableRowKeys([]);
}
};
}
});
})) || []
}));
}

View File

@@ -0,0 +1,92 @@
import { ProFormInstance } from '@ant-design/pro-form';
import type { ParamsType } from '@ant-design/pro-provider';
import type { ButtonProps, FormItemProps } from 'antd';
import React from 'react';
import type { ProTableProps } from '../../typing';
export type EditableFormInstance<T = any> = ProFormInstance<T> & {
/**
* 获取一行数据的
* @param rowIndex
* @returns T | undefined
*
* @example getRowData(1) 可以传入第几行的数据
* @example getRowData("id") 也可以传入 rowKey根据你列的唯一key 来获得。
*/
getRowData?: (rowIndex: string | number) => T | undefined;
/**
* 获取整个 table 的数据
* @returns T[] | undefined
*/
getRowsData?: () => T[] | undefined;
/**
* 设置一行的数据,会将数据进行简单的 merge
*
* {title:"old", decs:"old",id:"old"} -> set {title:"new"} -> {title:"new", decs:"old",id:"old"}
*
* @description 只会做最第一层对象的 merge 哦。
* {title:"old", decs:{name:"old",key:"old"},id:"old"} -> set {decs:{name:"new"}} -> {title:"old", decs:{name:"new"},id:"old"} -> set {decs:{name:"old"}}
*
* @param rowIndex
* @param data
* @returns void
*
* 根据行号设置
* @example setRowData(1, { title:"new" }) 可以传入修改第几行
*
* 根据行 id 设置
* @example setRowData("id", { title:"new" }) 也可以传入 rowKey根据你列的唯一 key 来设置。
*
* 清空原有数据
* @example setRowData(1, { title:undefined })
*
*/
setRowData?: (rowIndex: string | number, data: Partial<T>) => void;
};
export type RecordCreatorProps<DataSourceType> = {
record: DataSourceType | ((index: number, dataSource: DataSourceType[]) => DataSourceType);
position?: 'top' | 'bottom';
/**
* 新增一行的类型
*
* @augments dataSource 将会新增一行数据到 dataSource 中,不支持取消,只能删除
* @augments cache 将会把数据放到缓存中,取消后消失
*/
newRecordType?: 'dataSource' | 'cache';
/** 要增加到哪个节点下,一般用于多重嵌套表格 */
parentKey?: React.Key | ((index: number, dataSource: DataSourceType[]) => React.Key);
};
export type EditableProTableProps<T, U extends ParamsType, ValueType = 'text'> = Omit<ProTableProps<T, U, ValueType>, 'onChange'> & {
defaultValue?: readonly T[];
value?: readonly T[];
onChange?: (value: readonly T[]) => void;
/** @name 原先的 table OnChange */
onTableChange?: ProTableProps<T, U>['onChange'];
/**
*@name 可编辑表格列配置的form可以操作表格里面的数据
*/
editableFormRef?: React.Ref<EditableFormInstance<T> | undefined>;
/** @name 新建按钮的设置 */
recordCreatorProps?: (RecordCreatorProps<T> & ButtonProps & {
creatorButtonText?: React.ReactNode;
}) | false;
/** 最大行数 */
maxLength?: number;
/** Table 的值发生改变,为了适应 Form 调整了顺序 */
onValuesChange?: (values: T[], record: T) => void;
/** 是否受控,如果为 true每次 value 更新都会重置表单 */
controlled?: boolean;
/** FormItem 的设置 */
formItemProps?: Omit<FormItemProps, 'children' | 'name'>;
};
/**
* 可以直接放到 Form 中的可编辑表格
* A React component that is used to create a table.
* @param props
*/
declare function FieldEditableTable<DataType extends Record<string, any>, Params extends ParamsType = ParamsType, ValueType = 'text'>(props: EditableProTableProps<DataType, Params, ValueType>): import("react/jsx-runtime").JSX.Element;
declare namespace FieldEditableTable {
var RecordCreator: <T = Record<string, any>>(props: RecordCreatorProps<T> & {
children: JSX.Element;
}) => React.FunctionComponentElement<any>;
}
export default FieldEditableTable;

View File

@@ -0,0 +1,415 @@
"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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _icons = require("@ant-design/icons");
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 _useMergedState3 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
var _get = _interopRequireDefault(require("rc-util/lib/utils/get"));
var _set = _interopRequireDefault(require("rc-util/lib/utils/set"));
var _react = _interopRequireWildcard(require("react"));
var _Table = _interopRequireDefault(require("../../Table"));
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["onTableChange", "maxLength", "formItemProps", "recordCreatorProps", "rowKey", "controlled", "defaultValue", "onChange", "editableFormRef"],
_excluded2 = ["record", "position", "creatorButtonText", "newRecordType", "parentKey", "style"];
var EditableTableActionContext = /*#__PURE__*/_react.default.createContext(undefined);
/** 可编辑表格的按钮 */
function RecordCreator(props) {
var children = props.children,
record = props.record,
position = props.position,
newRecordType = props.newRecordType,
parentKey = props.parentKey;
var actionRef = (0, _react.useContext)(EditableTableActionContext);
return /*#__PURE__*/_react.default.cloneElement(children, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, children.props), {}, {
onClick: function () {
var _onClick = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(e) {
var _children$props$onCli, _children$props, _actionRef$current;
var isOk;
return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return (_children$props$onCli = (_children$props = children.props).onClick) === null || _children$props$onCli === void 0 ? void 0 : _children$props$onCli.call(_children$props, e);
case 2:
isOk = _context.sent;
if (!(isOk === false)) {
_context.next = 5;
break;
}
return _context.abrupt("return");
case 5:
actionRef === null || actionRef === void 0 || (_actionRef$current = actionRef.current) === null || _actionRef$current === void 0 || _actionRef$current.addEditRecord(record, {
position: position,
newRecordType: newRecordType,
parentKey: parentKey
});
case 6:
case "end":
return _context.stop();
}
}, _callee);
}));
function onClick(_x) {
return _onClick.apply(this, arguments);
}
return onClick;
}()
}));
}
/**
* 可以直接放到 Form 中的可编辑表格
* A React component that is used to create a table.
* @param props
*/
function EditableTable(props) {
var _props$editable2, _props$editable4;
var intl = (0, _proProvider.useIntl)();
var onTableChange = props.onTableChange,
maxLength = props.maxLength,
formItemProps = props.formItemProps,
recordCreatorProps = props.recordCreatorProps,
rowKey = props.rowKey,
controlled = props.controlled,
defaultValue = props.defaultValue,
onChange = props.onChange,
editableFormRef = props.editableFormRef,
rest = (0, _objectWithoutProperties2.default)(props, _excluded);
var preData = (0, _react.useRef)(undefined);
var actionRef = (0, _react.useRef)();
var formRef = (0, _react.useRef)();
// 设置 ref
(0, _react.useImperativeHandle)(rest.actionRef, function () {
return actionRef.current;
}, [actionRef.current]);
var _useMergedState = (0, _useMergedState3.default)(function () {
return props.value || defaultValue || [];
}, {
value: props.value,
onChange: props.onChange
}),
_useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
value = _useMergedState2[0],
setValue = _useMergedState2[1];
var getRowKey = _react.default.useMemo(function () {
if (typeof rowKey === 'function') {
return rowKey;
}
return function (record, index) {
return record[rowKey] || index;
};
}, [rowKey]);
/**
* 根据不同的情况返回不同的 rowKey
* @param finlayRowKey
* @returns string | number
*/
var coverRowKey = (0, _proUtils.useRefFunction)(function (finlayRowKey) {
/**
* 如果是 prop.name 的模式就需要把行号转化成具体的rowKey。
*/
if (typeof finlayRowKey === 'number' && !props.name) {
if (finlayRowKey >= value.length) return finlayRowKey;
var rowData = value && value[finlayRowKey];
return getRowKey === null || getRowKey === void 0 ? void 0 : getRowKey(rowData, finlayRowKey);
}
/**
* 如果是 prop.name 的模式,就直接返回行号
*/
if ((typeof finlayRowKey === 'string' || finlayRowKey >= value.length) && props.name) {
var _rowIndex = value.findIndex(function (item, index) {
var _getRowKey;
return (getRowKey === null || getRowKey === void 0 || (_getRowKey = getRowKey(item, index)) === null || _getRowKey === void 0 ? void 0 : _getRowKey.toString()) === (finlayRowKey === null || finlayRowKey === void 0 ? void 0 : finlayRowKey.toString());
});
if (_rowIndex !== -1) return _rowIndex;
}
return finlayRowKey;
});
// 设置 editableFormRef
(0, _react.useImperativeHandle)(editableFormRef, function () {
/**
* 获取一行数据的
* @param rowIndex
* @returns T | undefined
*/
var getRowData = function getRowData(rowIndex) {
var _finlayRowKey$toStrin, _formRef$current;
if (rowIndex == undefined) {
throw new Error('rowIndex is required');
}
var finlayRowKey = coverRowKey(rowIndex);
var rowKeyName = [props.name, (_finlayRowKey$toStrin = finlayRowKey === null || finlayRowKey === void 0 ? void 0 : finlayRowKey.toString()) !== null && _finlayRowKey$toStrin !== void 0 ? _finlayRowKey$toStrin : ''].flat(1).filter(Boolean);
return (_formRef$current = formRef.current) === null || _formRef$current === void 0 ? void 0 : _formRef$current.getFieldValue(rowKeyName);
};
/**
* 获取整个 table 的数据
* @returns T[] | undefined
*/
var getRowsData = function getRowsData() {
var _formRef$current3;
var rowKeyName = [props.name].flat(1).filter(Boolean);
if (Array.isArray(rowKeyName) && rowKeyName.length === 0) {
var _formRef$current2;
var rowData = (_formRef$current2 = formRef.current) === null || _formRef$current2 === void 0 ? void 0 : _formRef$current2.getFieldsValue();
if (Array.isArray(rowData)) return rowData;
return Object.keys(rowData).map(function (key) {
return rowData[key];
});
}
return (_formRef$current3 = formRef.current) === null || _formRef$current3 === void 0 ? void 0 : _formRef$current3.getFieldValue(rowKeyName);
};
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, formRef.current), {}, {
getRowData: getRowData,
getRowsData: getRowsData,
/**
* 设置一行的数据,会将数据进行简单的 merge
* @param rowIndex
* @param data
* @returns void
*/
setRowData: function setRowData(rowIndex, data) {
var _finlayRowKey$toStrin2, _formRef$current4;
if (rowIndex == undefined) {
throw new Error('rowIndex is required');
}
var finlayRowKey = coverRowKey(rowIndex);
var rowKeyName = [props.name, (_finlayRowKey$toStrin2 = finlayRowKey === null || finlayRowKey === void 0 ? void 0 : finlayRowKey.toString()) !== null && _finlayRowKey$toStrin2 !== void 0 ? _finlayRowKey$toStrin2 : ''].flat(1).filter(Boolean);
var newRowData = Object.assign({}, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, getRowData(rowIndex)), data || {}));
var updateValues = (0, _set.default)({}, rowKeyName, newRowData);
(_formRef$current4 = formRef.current) === null || _formRef$current4 === void 0 || _formRef$current4.setFieldsValue(updateValues);
return true;
}
});
}, [coverRowKey, props.name, formRef.current]);
(0, _react.useEffect)(function () {
if (!props.controlled) return;
(value || []).forEach(function (current, index) {
var _formRef$current5;
(_formRef$current5 = formRef.current) === null || _formRef$current5 === void 0 || _formRef$current5.setFieldsValue((0, _defineProperty2.default)({}, "".concat(getRowKey(current, index)), current));
}, {});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [(0, _proUtils.stringify)(value), props.controlled]);
(0, _react.useEffect)(function () {
if (props.name) {
var _props$editable;
formRef.current = props === null || props === void 0 || (_props$editable = props.editable) === null || _props$editable === void 0 ? void 0 : _props$editable.form;
}
}, [(_props$editable2 = props.editable) === null || _props$editable2 === void 0 ? void 0 : _props$editable2.form, props.name]);
var _ref = recordCreatorProps || {},
record = _ref.record,
position = _ref.position,
creatorButtonText = _ref.creatorButtonText,
newRecordType = _ref.newRecordType,
parentKey = _ref.parentKey,
style = _ref.style,
restButtonProps = (0, _objectWithoutProperties2.default)(_ref, _excluded2);
var isTop = position === 'top';
var creatorButtonDom = (0, _react.useMemo)(function () {
if (typeof maxLength === 'number' && maxLength <= (value === null || value === void 0 ? void 0 : value.length)) {
return false;
}
return recordCreatorProps !== false && /*#__PURE__*/(0, _jsxRuntime.jsx)(RecordCreator, {
record: (0, _proUtils.runFunction)(record, value === null || value === void 0 ? void 0 : value.length, value) || {},
position: position,
parentKey: (0, _proUtils.runFunction)(parentKey, value === null || value === void 0 ? void 0 : value.length, value),
newRecordType: newRecordType,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Button, (0, _objectSpread2.default)((0, _objectSpread2.default)({
type: "dashed",
style: (0, _objectSpread2.default)({
display: 'block',
margin: '10px 0',
width: '100%'
}, style),
icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.PlusOutlined, {})
}, restButtonProps), {}, {
children: creatorButtonText || intl.getMessage('editableTable.action.add', '添加一行数据')
}))
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [recordCreatorProps, maxLength, value === null || value === void 0 ? void 0 : value.length]);
var buttonRenderProps = (0, _react.useMemo)(function () {
if (!creatorButtonDom) {
return {};
}
if (isTop) {
return {
components: {
header: {
wrapper: function wrapper(_ref2) {
var _rest$columns;
var className = _ref2.className,
children = _ref2.children;
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("thead", {
className: className,
children: [children, /*#__PURE__*/(0, _jsxRuntime.jsxs)("tr", {
style: {
position: 'relative'
},
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
colSpan: 0,
style: {
visibility: 'hidden'
},
children: creatorButtonDom
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
style: {
position: 'absolute',
left: 0,
width: '100%'
},
colSpan: (_rest$columns = rest.columns) === null || _rest$columns === void 0 ? void 0 : _rest$columns.length,
children: creatorButtonDom
})]
})]
});
}
}
}
};
}
return {
tableViewRender: function tableViewRender(_, dom) {
var _props$tableViewRende, _props$tableViewRende2;
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [(_props$tableViewRende = (_props$tableViewRende2 = props.tableViewRender) === null || _props$tableViewRende2 === void 0 ? void 0 : _props$tableViewRende2.call(props, _, dom)) !== null && _props$tableViewRende !== void 0 ? _props$tableViewRende : dom, creatorButtonDom]
});
}
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isTop, creatorButtonDom]);
var editableProps = (0, _objectSpread2.default)({}, props.editable);
/**
* 防止闭包的onchange
*
* >>>>>>为了性能好辛苦
*/
var newOnValueChange = (0, _proUtils.useRefFunction)(function (r, dataSource) {
var _props$editable3, _props$editable3$onVa, _props$onValuesChange;
(_props$editable3 = props.editable) === null || _props$editable3 === void 0 || (_props$editable3$onVa = _props$editable3.onValuesChange) === null || _props$editable3$onVa === void 0 || _props$editable3$onVa.call(_props$editable3, r, dataSource);
(_props$onValuesChange = props.onValuesChange) === null || _props$onValuesChange === void 0 || _props$onValuesChange.call(props, dataSource, r);
if (props.controlled) {
var _props$onChange;
props === null || props === void 0 || (_props$onChange = props.onChange) === null || _props$onChange === void 0 || _props$onChange.call(props, dataSource);
}
});
if (props !== null && props !== void 0 && props.onValuesChange || (_props$editable4 = props.editable) !== null && _props$editable4 !== void 0 && _props$editable4.onValuesChange ||
// 受控模式需要触发 onchange
props.controlled && props !== null && props !== void 0 && props.onChange) {
editableProps.onValuesChange = newOnValueChange;
}
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(EditableTableActionContext.Provider, {
value: actionRef,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Table.default, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({
search: false,
options: false,
pagination: false,
rowKey: rowKey,
revalidateOnFocus: false
}, rest), buttonRenderProps), {}, {
tableLayout: "fixed",
actionRef: actionRef,
onChange: onTableChange,
editable: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, editableProps), {}, {
formProps: (0, _objectSpread2.default)({
formRef: formRef
}, editableProps.formProps)
}),
dataSource: value,
onDataSourceChange: function onDataSourceChange(dataSource) {
setValue(dataSource);
/**
* 如果是top需要重新设置一下 form不然会导致 id 相同数据混淆
*/
if (props.name && position === 'top') {
var _formRef$current6;
var newValue = (0, _set.default)({}, [props.name].flat(1).filter(Boolean), dataSource);
(_formRef$current6 = formRef.current) === null || _formRef$current6 === void 0 || _formRef$current6.setFieldsValue(newValue);
}
}
}))
}), props.name ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_proForm.ProFormDependency, {
name: [props.name],
children: function children(changeValue) {
var _props$editable5, _props$editable5$onVa;
if (!preData.current) {
preData.current = value;
return null;
}
var list = (0, _get.default)(changeValue, [props.name].flat(1));
var changeItem = list === null || list === void 0 ? void 0 : list.find(function (item, index) {
var _preData$current;
return !(0, _proUtils.isDeepEqualReact)(item, (_preData$current = preData.current) === null || _preData$current === void 0 ? void 0 : _preData$current[index]);
});
preData.current = value;
if (!changeItem) return null;
// 如果不存在 preData 说明是初始化,此时不需要触发 onValuesChange
props === null || props === void 0 || (_props$editable5 = props.editable) === null || _props$editable5 === void 0 || (_props$editable5$onVa = _props$editable5.onValuesChange) === null || _props$editable5$onVa === void 0 || _props$editable5$onVa.call(_props$editable5, changeItem, list);
return null;
}
}) : null]
});
}
/**
* 可以直接放到 Form 中的可编辑表格
* A React component that is used to create a table.
* @param props
*/
function FieldEditableTable(props) {
var form = _proForm.default.useFormInstance();
if (!props.name) return /*#__PURE__*/(0, _jsxRuntime.jsx)(EditableTable, (0, _objectSpread2.default)({
tableLayout: "fixed",
scroll: {
x: 'max-content'
}
}, props));
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Form.Item, (0, _objectSpread2.default)((0, _objectSpread2.default)({
style: {
maxWidth: '100%'
},
shouldUpdate: function shouldUpdate(prev, next) {
var name = [props.name].flat(1);
try {
return JSON.stringify((0, _get.default)(prev, name)) !== JSON.stringify((0, _get.default)(next, name));
} catch (error) {
return true;
}
}
}, props === null || props === void 0 ? void 0 : props.formItemProps), {}, {
name: props.name,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(EditableTable, (0, _objectSpread2.default)((0, _objectSpread2.default)({
tableLayout: "fixed",
scroll: {
x: 'max-content'
}
}, props), {}, {
editable: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props.editable), {}, {
form: form
})
}))
}));
}
FieldEditableTable.RecordCreator = RecordCreator;
var _default = exports.default = FieldEditableTable;

View File

@@ -0,0 +1,31 @@
import type { BaseQueryFilterProps, ProFormInstance, ProFormProps } from '@ant-design/pro-form';
import type { ProSchemaComponentTypes } from '@ant-design/pro-utils';
import type { FormItemProps } from 'antd';
import React from 'react';
import type { ActionType, ProColumns, ProTableProps } from '../../typing';
export type SearchConfig = BaseQueryFilterProps & {
filterType?: 'query' | 'light';
};
export type TableFormItem<T, U = any> = {
onSubmit?: (value: T, firstLoad: boolean) => void;
onReset?: (value: T) => void;
form?: Omit<ProFormProps, 'form'>;
type?: ProSchemaComponentTypes;
dateFormatter?: ProTableProps<T, U, any>['dateFormatter'];
search?: false | SearchConfig;
columns: ProColumns<U, any>[];
formRef: React.MutableRefObject<ProFormInstance | undefined>;
submitButtonLoading?: boolean;
manualRequest?: boolean;
bordered?: boolean;
action: React.MutableRefObject<ActionType | undefined>;
ghost?: boolean;
} & Omit<FormItemProps, 'children' | 'onReset'>;
/**
* 这里会把 列配置转化为 form 表单
*
* @param param0
* @returns
*/
declare const FormRender: <T, U = any>({ onSubmit, formRef, dateFormatter, type, columns, action, ghost, manualRequest, onReset, submitButtonLoading, search: searchConfig, form: formConfig, bordered, }: TableFormItem<T, U>) => import("react/jsx-runtime").JSX.Element;
export default FormRender;

View File

@@ -0,0 +1,214 @@
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _proForm = require("@ant-design/pro-form");
var _proProvider = require("@ant-design/pro-provider");
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _omit = _interopRequireDefault(require("rc-util/lib/omit"));
var _react = _interopRequireWildcard(require("react"));
var _jsxRuntime = require("react/jsx-runtime");
function toLowerLine(str) {
var temp = str.replace(/[A-Z]/g, function (match) {
return "-".concat(match.toLowerCase());
});
if (temp.startsWith('-')) {
// 如果首字母是大写执行replace时会多一个_这里需要去掉
temp = temp.slice(1);
}
return temp;
}
/**
* 获取当前选择的 Form Layout 配置
*
* @param isForm
* @param searchConfig
* @returns LightFilter | QueryFilter | ProForm
*/
var getFormCompetent = function getFormCompetent(isForm, searchConfig) {
if (!isForm && searchConfig !== false) {
if ((searchConfig === null || searchConfig === void 0 ? void 0 : searchConfig.filterType) === 'light') {
return 'LightFilter';
}
return 'QueryFilter';
}
return 'Form';
};
/**
* 获取需要传给相应表单的props
*
* @param searchConfig
* @param name
*/
var getFromProps = function getFromProps(isForm, searchConfig, name) {
if (!isForm && name === 'LightFilter') {
// 传给 lightFilter 的问题
return (0, _omit.default)((0, _objectSpread2.default)({}, searchConfig), ['labelWidth', 'defaultCollapsed', 'filterType']);
}
if (!isForm) {
// 传给 QueryFilter 的配置
return (0, _omit.default)((0, _objectSpread2.default)({
labelWidth: searchConfig ? searchConfig === null || searchConfig === void 0 ? void 0 : searchConfig.labelWidth : undefined,
defaultCollapsed: true
}, searchConfig), ['filterType']);
}
return {};
};
/**
* 从formConfig中获取传给相应表单的配置
*
* @param isForm
* @param formConfig
*/
var getFormConfigs = function getFormConfigs(isForm, formConfig) {
if (isForm) {
// 传给Form的配置
return (0, _omit.default)(formConfig, ['ignoreRules']);
}
// 传给Filter的配置
return (0, _objectSpread2.default)({
ignoreRules: true
}, formConfig);
};
/**
* 这里会把 列配置转化为 form 表单
*
* @param param0
* @returns
*/
var FormRender = function FormRender(_ref) {
var onSubmit = _ref.onSubmit,
formRef = _ref.formRef,
_ref$dateFormatter = _ref.dateFormatter,
dateFormatter = _ref$dateFormatter === void 0 ? 'string' : _ref$dateFormatter,
type = _ref.type,
columns = _ref.columns,
action = _ref.action,
ghost = _ref.ghost,
manualRequest = _ref.manualRequest,
_onReset = _ref.onReset,
submitButtonLoading = _ref.submitButtonLoading,
searchConfig = _ref.search,
formConfig = _ref.form,
bordered = _ref.bordered;
var _useContext = (0, _react.useContext)(_proProvider.ProProvider),
hashId = _useContext.hashId;
var isForm = type === 'form';
/** 提交表单,根据两种模式不同,方法不相同 */
var submit = /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(values, firstLoad) {
return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (onSubmit) {
onSubmit(values, firstLoad);
}
case 1:
case "end":
return _context.stop();
}
}, _callee);
}));
return function submit(_x, _x2) {
return _ref2.apply(this, arguments);
};
}();
var _useContext2 = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext),
getPrefixCls = _useContext2.getPrefixCls;
var columnsList = (0, _react.useMemo)(function () {
return columns.filter(function (item) {
if (item === _antd.Table.EXPAND_COLUMN || item === _antd.Table.SELECTION_COLUMN) {
return false;
}
if ((item.hideInSearch || item.search === false) && type !== 'form') {
return false;
}
if (type === 'form' && item.hideInForm) {
return false;
}
return true;
}).map(function (item) {
var _item$dataIndex;
var finalValueType = !item.valueType || ['textarea', 'jsonCode', 'code'].includes(item === null || item === void 0 ? void 0 : item.valueType) && type === 'table' ? 'text' : item === null || item === void 0 ? void 0 : item.valueType;
var columnKey = (item === null || item === void 0 ? void 0 : item.key) || (item === null || item === void 0 || (_item$dataIndex = item.dataIndex) === null || _item$dataIndex === void 0 ? void 0 : _item$dataIndex.toString());
return (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
width: undefined
}, item.search && (0, _typeof2.default)(item.search) === 'object' ? item.search : {}), {}, {
valueType: finalValueType,
proFieldProps: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item.proFieldProps), {}, {
proFieldKey: columnKey ? "table-field-".concat(columnKey) : undefined
})
});
});
}, [columns, type]);
var className = getPrefixCls('pro-table-search');
var formClassName = getPrefixCls('pro-table-form');
var competentName = (0, _react.useMemo)(function () {
return getFormCompetent(isForm, searchConfig);
}, [searchConfig, isForm]);
// 传给每个表单的配置,理论上大家都需要
var loadingProps = (0, _react.useMemo)(function () {
return {
submitter: {
submitButtonProps: {
loading: submitButtonLoading
}
}
};
}, [submitButtonLoading]);
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: (0, _classnames.default)(hashId, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, getPrefixCls('pro-card'), true), "".concat(getPrefixCls('pro-card'), "-border"), !!bordered), "".concat(getPrefixCls('pro-card'), "-bordered"), !!bordered), "".concat(getPrefixCls('pro-card'), "-ghost"), !!ghost), className, true), formClassName, isForm), getPrefixCls("pro-table-search-".concat(toLowerLine(competentName))), true), "".concat(className, "-ghost"), ghost), searchConfig === null || searchConfig === void 0 ? void 0 : searchConfig.className, searchConfig !== false && (searchConfig === null || searchConfig === void 0 ? void 0 : searchConfig.className))),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_proForm.BetaSchemaForm, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({
layoutType: competentName,
columns: columnsList,
type: type
}, loadingProps), getFromProps(isForm, searchConfig, competentName)), getFormConfigs(isForm, formConfig || {})), {}, {
formRef: formRef,
action: action,
dateFormatter: dateFormatter,
onInit: function onInit(values, form) {
formRef.current = form;
// 触发一个 submit之所以这里触发是为了保证 value 都被 format了
if (type !== 'form') {
var _action$current, _action$current2, _action$current2$setP;
// 修改 pageSize变成从 url 中获取的
var pageInfo = (_action$current = action.current) === null || _action$current === void 0 ? void 0 : _action$current.pageInfo;
// 从 values 里获取是因为有时候要从 url中获取的 pageSize。
var _ref3 = values,
_ref3$current = _ref3.current,
current = _ref3$current === void 0 ? pageInfo === null || pageInfo === void 0 ? void 0 : pageInfo.current : _ref3$current,
_ref3$pageSize = _ref3.pageSize,
pageSize = _ref3$pageSize === void 0 ? pageInfo === null || pageInfo === void 0 ? void 0 : pageInfo.pageSize : _ref3$pageSize;
(_action$current2 = action.current) === null || _action$current2 === void 0 || (_action$current2$setP = _action$current2.setPageInfo) === null || _action$current2$setP === void 0 || _action$current2$setP.call(_action$current2, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, pageInfo), {}, {
current: parseInt(current, 10),
pageSize: parseInt(pageSize, 10)
}));
/** 如果是手动模式不需要提交 */
if (manualRequest) return;
submit(values, true);
}
},
onReset: function onReset(values) {
_onReset === null || _onReset === void 0 || _onReset(values);
},
onFinish: function onFinish(values) {
submit(values, false);
},
initialValues: formConfig === null || formConfig === void 0 ? void 0 : formConfig.initialValues
}))
});
};
var _default = exports.default = FormRender;

View File

@@ -0,0 +1,39 @@
import type { TablePaginationConfig } from 'antd';
import React from 'react';
import type { ActionType, ProTableProps } from '../../typing';
type BaseFormProps<T, U> = {
pagination?: TablePaginationConfig | false;
beforeSearchSubmit?: (params: Partial<U>) => any;
action: React.MutableRefObject<ActionType | undefined>;
onSubmit?: (params: U) => void;
onReset?: () => void;
loading: boolean;
onFormSearchSubmit: (params: U) => void;
columns: ProTableProps<T, U, any>['columns'];
dateFormatter: ProTableProps<T, U, any>['dateFormatter'];
formRef: ProTableProps<T, U, any>['formRef'];
type: ProTableProps<T, U, any>['type'];
cardBordered: ProTableProps<T, U, any>['cardBordered'];
form: ProTableProps<T, U, any>['form'];
search: ProTableProps<T, U, any>['search'];
manualRequest: ProTableProps<T, U, any>['manualRequest'];
};
declare class FormSearch<T, U> extends React.Component<BaseFormProps<T, U> & {
ghost?: boolean;
}> {
/** 查询表单相关的配置 */
onSubmit: (value: U, firstLoad: boolean) => void;
onReset: (value: Partial<U>) => void;
/**
* 只 Diff 需要用的 props能减少 5 次左右的render
*
* @param next
* @see 因为 hooks 每次的 setFormSearch 都是新的,所以每次都触发 render
* @see action 也是同样的原因
* @returns
*/
isEqual: (next: BaseFormProps<T, U>) => boolean;
shouldComponentUpdate: (next: BaseFormProps<T, U>) => boolean;
render: () => import("react/jsx-runtime").JSX.Element;
}
export default FormSearch;

View File

@@ -0,0 +1,175 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
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 _proUtils = require("@ant-design/pro-utils");
var _omit = _interopRequireDefault(require("rc-util/lib/omit"));
var _react = _interopRequireDefault(require("react"));
var _index = require("../../utils/index");
var _FormRender = _interopRequireDefault(require("./FormRender"));
var _jsxRuntime = require("react/jsx-runtime");
var FormSearch = /*#__PURE__*/function (_React$Component) {
(0, _inherits2.default)(FormSearch, _React$Component);
var _super = (0, _createSuper2.default)(FormSearch);
function FormSearch() {
var _this;
(0, _classCallCheck2.default)(this, FormSearch);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
/** 查询表单相关的配置 */
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onSubmit", function (value, firstLoad) {
var _this$props = _this.props,
pagination = _this$props.pagination,
_this$props$beforeSea = _this$props.beforeSearchSubmit,
beforeSearchSubmit = _this$props$beforeSea === void 0 ? function (searchParams) {
return searchParams;
} : _this$props$beforeSea,
action = _this$props.action,
onSubmit = _this$props.onSubmit,
onFormSearchSubmit = _this$props.onFormSearchSubmit;
// 只传入 pagination 中的 current 和 pageSize 参数
var pageInfo = pagination ? (0, _proUtils.omitUndefined)({
current: pagination.current,
pageSize: pagination.pageSize
}) : {};
var submitParams = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, value), {}, {
_timestamp: Date.now()
}, pageInfo);
var omitParams = (0, _omit.default)(beforeSearchSubmit(submitParams), Object.keys(pageInfo));
onFormSearchSubmit(omitParams);
if (!firstLoad) {
var _action$current, _action$current$setPa;
// back first page
(_action$current = action.current) === null || _action$current === void 0 || (_action$current$setPa = _action$current.setPageInfo) === null || _action$current$setPa === void 0 || _action$current$setPa.call(_action$current, {
current: 1
});
}
// 不是第一次提交就不触发,第一次提交是 js 触发的
// 为了解决 https://github.com/ant-design/pro-components/issues/579
if (onSubmit && !firstLoad) {
onSubmit === null || onSubmit === void 0 || onSubmit(value);
}
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onReset", function (value) {
var _action$current2, _action$current2$setP;
var _this$props2 = _this.props,
pagination = _this$props2.pagination,
_this$props2$beforeSe = _this$props2.beforeSearchSubmit,
beforeSearchSubmit = _this$props2$beforeSe === void 0 ? function (searchParams) {
return searchParams;
} : _this$props2$beforeSe,
action = _this$props2.action,
onFormSearchSubmit = _this$props2.onFormSearchSubmit,
onReset = _this$props2.onReset;
var pageInfo = pagination ? (0, _proUtils.omitUndefined)({
current: pagination.current,
pageSize: pagination.pageSize
}) : {};
var omitParams = (0, _omit.default)(beforeSearchSubmit((0, _objectSpread2.default)((0, _objectSpread2.default)({}, value), pageInfo)), Object.keys(pageInfo));
onFormSearchSubmit(omitParams);
// back first page
(_action$current2 = action.current) === null || _action$current2 === void 0 || (_action$current2$setP = _action$current2.setPageInfo) === null || _action$current2$setP === void 0 || _action$current2$setP.call(_action$current2, {
current: 1
});
onReset === null || onReset === void 0 || onReset();
});
/**
* 只 Diff 需要用的 props能减少 5 次左右的render
*
* @param next
* @see 因为 hooks 每次的 setFormSearch 都是新的,所以每次都触发 render
* @see action 也是同样的原因
* @returns
*/
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isEqual", function (next) {
var _this$props3 = _this.props,
columns = _this$props3.columns,
loading = _this$props3.loading,
formRef = _this$props3.formRef,
type = _this$props3.type,
cardBordered = _this$props3.cardBordered,
dateFormatter = _this$props3.dateFormatter,
form = _this$props3.form,
search = _this$props3.search,
manualRequest = _this$props3.manualRequest;
var diffProps = {
columns: columns,
loading: loading,
formRef: formRef,
type: type,
cardBordered: cardBordered,
dateFormatter: dateFormatter,
form: form,
search: search,
manualRequest: manualRequest
};
return !(0, _proUtils.isDeepEqualReact)(diffProps, {
columns: next.columns,
formRef: next.formRef,
loading: next.loading,
type: next.type,
cardBordered: next.cardBordered,
dateFormatter: next.dateFormatter,
form: next.form,
search: next.search,
manualRequest: next.manualRequest
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "shouldComponentUpdate", function (next) {
return _this.isEqual(next);
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "render", function () {
var _this$props4 = _this.props,
columns = _this$props4.columns,
loading = _this$props4.loading,
formRef = _this$props4.formRef,
type = _this$props4.type,
action = _this$props4.action,
cardBordered = _this$props4.cardBordered,
dateFormatter = _this$props4.dateFormatter,
form = _this$props4.form,
search = _this$props4.search,
pagination = _this$props4.pagination,
ghost = _this$props4.ghost,
manualRequest = _this$props4.manualRequest;
var pageInfo = pagination ? (0, _proUtils.omitUndefined)({
current: pagination.current,
pageSize: pagination.pageSize
}) : {};
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRender.default, {
submitButtonLoading: loading,
columns: columns,
type: type,
ghost: ghost,
formRef: formRef,
onSubmit: _this.onSubmit,
manualRequest: manualRequest,
onReset: _this.onReset,
dateFormatter: dateFormatter,
search: search,
form: (0, _objectSpread2.default)((0, _objectSpread2.default)({
autoFocusFirstInput: false
}, form), {}, {
extraUrlParams: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, pageInfo), form === null || form === void 0 ? void 0 : form.extraUrlParams)
}),
action: action,
bordered: (0, _index.isBordered)('search', cardBordered)
});
});
return _this;
}
return (0, _createClass2.default)(FormSearch);
}(_react.default.Component);
var _default = exports.default = FormSearch;

View File

@@ -0,0 +1,16 @@
import React from 'react';
export type ListToolBarMenuItem = {
key: React.Key;
label: React.ReactNode;
disabled?: boolean;
};
export type ListToolBarHeaderMenuProps = {
type?: 'inline' | 'dropdown' | 'tab';
activeKey?: React.Key;
defaultActiveKey?: React.Key;
items?: ListToolBarMenuItem[];
onChange?: (activeKey?: React.Key) => void;
prefixCls?: string;
};
declare const HeaderMenu: React.FC<ListToolBarHeaderMenuProps>;
export default HeaderMenu;

View File

@@ -0,0 +1,102 @@
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _icons = require("@ant-design/icons");
var _proProvider = require("@ant-design/pro-provider");
var _proUtils = require("@ant-design/pro-utils");
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _useMergedState3 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
var _react = _interopRequireWildcard(require("react"));
var _jsxRuntime = require("react/jsx-runtime");
var HeaderMenu = function HeaderMenu(props) {
var _useContext = (0, _react.useContext)(_proProvider.ProProvider),
hashId = _useContext.hashId;
var _props$items = props.items,
items = _props$items === void 0 ? [] : _props$items,
_props$type = props.type,
type = _props$type === void 0 ? 'inline' : _props$type,
prefixCls = props.prefixCls,
propActiveKey = props.activeKey,
defaultActiveKey = props.defaultActiveKey;
var _useMergedState = (0, _useMergedState3.default)(propActiveKey || defaultActiveKey, {
value: propActiveKey,
onChange: props.onChange
}),
_useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
activeKey = _useMergedState2[0],
setActiveKey = _useMergedState2[1];
if (items.length < 1) {
return null;
}
var activeItem = items.find(function (item) {
return item.key === activeKey;
}) || items[0];
if (type === 'inline') {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-menu"), "".concat(prefixCls, "-inline-menu"), hashId),
children: items.map(function (item, index) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
onClick: function onClick() {
setActiveKey(item.key);
},
className: (0, _classnames.default)("".concat(prefixCls, "-inline-menu-item"), activeItem.key === item.key ? "".concat(prefixCls, "-inline-menu-item-active") : undefined, hashId),
children: item.label
}, item.key || index);
})
});
}
if (type === 'tab') {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tabs, {
items: items.map(function (item) {
var _item$key;
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
key: (_item$key = item.key) === null || _item$key === void 0 ? void 0 : _item$key.toString()
});
}),
activeKey: activeItem.key,
onTabClick: function onTabClick(key) {
return setActiveKey(key);
},
children: (0, _proUtils.compareVersions)(_antd.version, '4.23.0') < 0 ? items === null || items === void 0 ? void 0 : items.map(function (item, index) {
/* 如果版本低于 4.23.0,不支持 items */
return /*#__PURE__*/(0, _react.createElement)(_antd.Tabs.TabPane, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
key: item.key || index,
tab: item.label
}));
}) : null
});
}
var dropdownProps = (0, _proUtils.menuOverlayCompatible)({
selectedKeys: [activeItem.key],
onClick: function onClick(item) {
setActiveKey(item.key);
},
items: items.map(function (item, index) {
return {
key: item.key || index,
disabled: item.disabled,
label: item.label
};
})
});
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-menu"), "".concat(prefixCls, "-dropdownmenu")),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Dropdown, (0, _objectSpread2.default)((0, _objectSpread2.default)({
trigger: ['click']
}, dropdownProps), {}, {
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_antd.Space, {
className: "".concat(prefixCls, "-dropdownmenu-label"),
children: [activeItem.label, /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.DownOutlined, {})]
})
}))
});
};
var _default = exports.default = HeaderMenu;

View File

@@ -0,0 +1,55 @@
import { TabPaneProps } from 'antd';
import type { LabelTooltipType } from 'antd/lib/form/FormItemLabel';
import type { SearchProps } from 'antd/lib/input';
import React from 'react';
import type { ListToolBarHeaderMenuProps } from './HeaderMenu';
export type ListToolBarSetting = {
icon: React.ReactNode;
tooltip?: LabelTooltipType | string;
key?: string;
onClick?: (key?: string) => void;
};
/** Antd 默认直接导出了 rc 组件中的 Tab.Pane 组件。 */
type TabPane = TabPaneProps & {
key?: string;
};
export type ListToolBarTabs = {
activeKey?: string;
defaultActiveKey?: string;
onChange?: (activeKey: string) => void;
items?: TabPane[];
};
export type ListToolBarMenu = ListToolBarHeaderMenuProps;
type SearchPropType = (SearchProps & {
onSearch: (searchValue: string) => Promise<false | void> | false | void;
}) | React.ReactNode | boolean;
type SettingPropType = React.ReactNode | ListToolBarSetting;
export type ListToolBarProps = {
prefixCls?: string;
className?: string;
style?: React.CSSProperties;
/** 标题 */
title?: React.ReactNode;
/** 副标题 */
subTitle?: React.ReactNode;
/** 标题提示 */
tooltip?: string | LabelTooltipType;
/** 搜索输入栏相关配置 */
search?: SearchPropType;
/** 搜索回调 */
onSearch?: (keyWords: string) => void;
/** 工具栏右侧操作区 */
actions?: React.ReactNode[];
/** 工作栏右侧设置区 */
settings?: SettingPropType[];
/** 是否多行展示 */
multipleLine?: boolean;
/** 过滤区,通常配合 LightFilter 使用 */
filter?: React.ReactNode;
/** 标签页配置,仅当 `multipleLine` 为 true 时有效 */
tabs?: ListToolBarTabs;
/** 菜单配置 */
menu?: ListToolBarMenu;
};
declare const ListToolBar: React.FC<ListToolBarProps>;
export default ListToolBar;

View File

@@ -0,0 +1,320 @@
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _proProvider = require("@ant-design/pro-provider");
var _proUtils = require("@ant-design/pro-utils");
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer"));
var _react = _interopRequireWildcard(require("react"));
var _HeaderMenu = _interopRequireDefault(require("./HeaderMenu"));
var _style = require("./style");
var _jsxRuntime = require("react/jsx-runtime");
/** Antd 默认直接导出了 rc 组件中的 Tab.Pane 组件。 */
/**
* 获取配置区域 DOM Item
*
* @param setting 配置项
*/
function getSettingItem(setting) {
if ( /*#__PURE__*/_react.default.isValidElement(setting)) {
return setting;
}
if (setting) {
var settingConfig = setting;
var icon = settingConfig.icon,
tooltip = settingConfig.tooltip,
_onClick = settingConfig.onClick,
_key = settingConfig.key;
if (icon && tooltip) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tooltip, {
title: tooltip,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
onClick: function onClick() {
if (_onClick) {
_onClick(_key);
}
},
children: icon
}, _key)
});
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
onClick: function onClick() {
if (_onClick) {
_onClick(_key);
}
},
children: icon
}, _key);
}
return null;
}
var ListToolBarTabBar = function ListToolBarTabBar(_ref) {
var _tabs$items;
var prefixCls = _ref.prefixCls,
tabs = _ref.tabs,
multipleLine = _ref.multipleLine,
filtersNode = _ref.filtersNode;
if (!multipleLine) return null;
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixCls, "-extra-line"),
children: tabs !== null && tabs !== void 0 && tabs.items && tabs !== null && tabs !== void 0 && tabs.items.length ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tabs, {
style: {
width: '100%'
},
defaultActiveKey: tabs.defaultActiveKey,
activeKey: tabs.activeKey,
items: tabs.items.map(function (item, index) {
var _item$key;
return (0, _objectSpread2.default)((0, _objectSpread2.default)({
label: item.tab
}, item), {}, {
key: ((_item$key = item.key) === null || _item$key === void 0 ? void 0 : _item$key.toString()) || (index === null || index === void 0 ? void 0 : index.toString())
});
}),
onChange: tabs.onChange,
tabBarExtraContent: filtersNode,
children: (_tabs$items = tabs.items) === null || _tabs$items === void 0 ? void 0 : _tabs$items.map(function (item, index) {
return (0, _proUtils.compareVersions)(_antd.version, '4.23.0') < 0 ? /*#__PURE__*/(0, _react.createElement)(_antd.Tabs.TabPane, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
key: item.key || index,
tab: item.tab
})) : null;
})
}) : filtersNode
});
};
var ListToolBar = function ListToolBar(_ref2) {
var customizePrefixCls = _ref2.prefixCls,
title = _ref2.title,
subTitle = _ref2.subTitle,
tooltip = _ref2.tooltip,
className = _ref2.className,
style = _ref2.style,
search = _ref2.search,
onSearch = _ref2.onSearch,
_ref2$multipleLine = _ref2.multipleLine,
multipleLine = _ref2$multipleLine === void 0 ? false : _ref2$multipleLine,
filter = _ref2.filter,
_ref2$actions = _ref2.actions,
actions = _ref2$actions === void 0 ? [] : _ref2$actions,
_ref2$settings = _ref2.settings,
settings = _ref2$settings === void 0 ? [] : _ref2$settings,
tabs = _ref2.tabs,
menu = _ref2.menu;
var _useContext = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext),
getPrefixCls = _useContext.getPrefixCls;
var _proTheme$useToken = _proProvider.proTheme.useToken(),
token = _proTheme$useToken.token;
var prefixCls = getPrefixCls('pro-table-list-toolbar', customizePrefixCls);
var _useStyle = (0, _style.useStyle)(prefixCls),
wrapSSR = _useStyle.wrapSSR,
hashId = _useStyle.hashId;
var intl = (0, _proProvider.useIntl)();
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
isMobile = _useState2[0],
setIsMobile = _useState2[1];
var placeholder = intl.getMessage('tableForm.inputPlaceholder', '请输入');
/**
* 获取搜索栏 DOM
*
* @param search 搜索框相关配置
*/
var searchNode = (0, _react.useMemo)(function () {
if (!search) {
return null;
}
if ( /*#__PURE__*/_react.default.isValidElement(search)) {
return search;
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Input.Search, (0, _objectSpread2.default)((0, _objectSpread2.default)({
style: {
width: 200
},
placeholder: placeholder
}, search), {}, {
onSearch: /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee() {
var _onSearch, _ref4;
var _len,
restParams,
_key2,
success,
_args = arguments;
return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
for (_len = _args.length, restParams = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {
restParams[_key2] = _args[_key2];
}
_context.next = 3;
return (_onSearch = (_ref4 = search).onSearch) === null || _onSearch === void 0 ? void 0 : _onSearch.call.apply(_onSearch, [_ref4].concat(restParams));
case 3:
success = _context.sent;
if (success !== false) {
onSearch === null || onSearch === void 0 || onSearch(restParams === null || restParams === void 0 ? void 0 : restParams[0]);
}
case 5:
case "end":
return _context.stop();
}
}, _callee);
}))
}));
}, [placeholder, onSearch, search]);
/** 轻量筛选组件 */
var filtersNode = (0, _react.useMemo)(function () {
if (filter) return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixCls, "-filter ").concat(hashId).trim(),
children: filter
});
return null;
}, [filter, hashId, prefixCls]);
/** 有没有 title需要结合多个场景判断 */
var hasTitle = (0, _react.useMemo)(function () {
return menu || title || subTitle || tooltip;
}, [menu, subTitle, title, tooltip]);
/** 没有 key 的时候帮忙加一下 key 不加的话很烦人 */
var actionDom = (0, _react.useMemo)(function () {
if (!Array.isArray(actions)) {
return actions;
}
if (actions.length < 1) {
return null;
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: token.marginXS
},
children: actions.map(function (action, index) {
if (! /*#__PURE__*/_react.default.isValidElement(action)) {
// eslint-disable-next-line react/no-array-index-key
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_react.default.Fragment, {
children: action
}, index);
}
return /*#__PURE__*/_react.default.cloneElement(action, (0, _objectSpread2.default)({
// eslint-disable-next-line react/no-array-index-key
key: index
}, action === null || action === void 0 ? void 0 : action.props));
})
});
}, [actions]);
var hasRight = (0, _react.useMemo)(function () {
return !!(hasTitle && searchNode || !multipleLine && filtersNode || actionDom || settings !== null && settings !== void 0 && settings.length);
}, [actionDom, filtersNode, hasTitle, multipleLine, searchNode, settings === null || settings === void 0 ? void 0 : settings.length]);
var hasLeft = (0, _react.useMemo)(function () {
return tooltip || title || subTitle || menu || !hasTitle && searchNode;
}, [hasTitle, menu, searchNode, subTitle, title, tooltip]);
var leftTitleDom = (0, _react.useMemo)(function () {
// 保留dom是为了占位不然 right 就变到左边了
if (!hasLeft && hasRight) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixCls, "-left ").concat(hashId).trim()
});
}
// 减少 space 的dom渲染的时候能节省点性能
if (!menu && (hasTitle || !searchNode)) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixCls, "-left ").concat(hashId).trim(),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixCls, "-title ").concat(hashId).trim(),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_proUtils.LabelIconTip, {
tooltip: tooltip,
label: title,
subTitle: subTitle
})
})
});
}
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-left"), hashId, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(prefixCls, "-left-has-tabs"), (menu === null || menu === void 0 ? void 0 : menu.type) === 'tab'), "".concat(prefixCls, "-left-has-dropdown"), (menu === null || menu === void 0 ? void 0 : menu.type) === 'dropdown'), "".concat(prefixCls, "-left-has-inline-menu"), (menu === null || menu === void 0 ? void 0 : menu.type) === 'inline')),
children: [hasTitle && !menu && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixCls, "-title ").concat(hashId).trim(),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_proUtils.LabelIconTip, {
tooltip: tooltip,
label: title,
subTitle: subTitle
})
}), menu &&
/*#__PURE__*/
// 这里面实现了 tabs 的逻辑
(0, _jsxRuntime.jsx)(_HeaderMenu.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, menu), {}, {
prefixCls: prefixCls
})), !hasTitle && searchNode ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixCls, "-search ").concat(hashId).trim(),
children: searchNode
}) : null]
});
}, [hasLeft, hasRight, hasTitle, hashId, menu, prefixCls, searchNode, subTitle, title, tooltip]);
var rightTitleDom = (0, _react.useMemo)(function () {
if (!hasRight) return null;
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: "".concat(prefixCls, "-right ").concat(hashId).trim(),
style: isMobile ? {} : {
alignItems: 'center'
},
children: [!multipleLine ? filtersNode : null, hasTitle && searchNode ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixCls, "-search ").concat(hashId).trim(),
children: searchNode
}) : null, actionDom, settings !== null && settings !== void 0 && settings.length ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixCls, "-setting-items ").concat(hashId).trim(),
children: settings.map(function (setting, index) {
var settingItem = getSettingItem(setting);
return (
/*#__PURE__*/
// eslint-disable-next-line react/no-array-index-key
(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixCls, "-setting-item ").concat(hashId).trim(),
children: settingItem
}, index)
);
})
}) : null]
});
}, [hasRight, prefixCls, hashId, isMobile, hasTitle, searchNode, multipleLine, filtersNode, actionDom, settings]);
var titleNode = (0, _react.useMemo)(function () {
if (!hasRight && !hasLeft) return null;
var containerClassName = (0, _classnames.default)("".concat(prefixCls, "-container"), hashId, (0, _defineProperty2.default)({}, "".concat(prefixCls, "-container-mobile"), isMobile));
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: containerClassName,
children: [leftTitleDom, rightTitleDom]
});
}, [hasLeft, hasRight, hashId, isMobile, leftTitleDom, prefixCls, rightTitleDom]);
return wrapSSR( /*#__PURE__*/(0, _jsxRuntime.jsx)(_rcResizeObserver.default, {
onResize: function onResize(size) {
if (size.width < 375 !== isMobile) {
setIsMobile(size.width < 375);
}
},
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
style: style,
className: (0, _classnames.default)(prefixCls, hashId, className),
children: [titleNode, /*#__PURE__*/(0, _jsxRuntime.jsx)(ListToolBarTabBar, {
filtersNode: filtersNode,
prefixCls: prefixCls,
tabs: tabs,
multipleLine: multipleLine
})]
})
}));
};
var _default = exports.default = ListToolBar;

View File

@@ -0,0 +1,9 @@
/// <reference types="react" />
import type { ProAliasToken } from '@ant-design/pro-provider';
export interface ProListToken extends ProAliasToken {
componentCls: string;
}
export declare function useStyle(prefixCls: string): {
wrapSSR: (node: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>) => import("react").JSX.Element;
hashId: string;
};

View File

@@ -0,0 +1,135 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useStyle = useStyle;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _proProvider = require("@ant-design/pro-provider");
var genProListStyle = function genProListStyle(token) {
return (0, _defineProperty2.default)({}, token.componentCls, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({
lineHeight: '1',
'&-container': {
display: 'flex',
justifyContent: 'space-between',
paddingBlock: token.padding,
paddingInline: 0,
'&-mobile': {
flexDirection: 'column'
}
},
'&-title': {
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-start',
color: token.colorTextHeading,
fontWeight: '500',
fontSize: token.fontSizeLG
},
'&-search:not(:last-child)': {
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-start'
},
'&-setting-item': {
marginBlock: 0,
marginInline: 4,
color: token.colorIconHover,
fontSize: token.fontSizeLG,
cursor: 'pointer',
'> span': {
display: 'block',
width: '100%',
height: '100%'
},
'&:hover': {
color: token.colorPrimary
}
},
'&-left': (0, _defineProperty2.default)((0, _defineProperty2.default)({
display: 'flex',
flexWrap: 'wrap',
alignItems: 'center',
gap: token.marginXS,
justifyContent: 'flex-start',
maxWidth: 'calc(100% - 200px)'
}, "".concat(token.antCls, "-tabs"), {
width: '100%'
}), '&-has-tabs', {
overflow: 'hidden'
}),
'&-right': {
flex: 1,
display: 'flex',
flexWrap: 'wrap',
justifyContent: 'flex-end',
gap: token.marginXS
},
'&-extra-line': {
marginBlockEnd: token.margin
},
'&-setting-items': {
display: 'flex',
gap: token.marginXS,
lineHeight: '32px',
alignItems: 'center'
},
'&-filter': (0, _defineProperty2.default)({
'&:not(:last-child)': {
marginInlineEnd: token.margin
},
display: 'flex',
alignItems: 'center'
}, "div$".concat(token.antCls, "-pro-table-search"), {
marginBlock: 0,
marginInline: 0,
paddingBlock: 0,
paddingInline: 0
}),
'&-inline-menu-item': {
display: 'inline-block',
marginInlineEnd: token.marginLG,
cursor: 'pointer',
opacity: '0.75',
'&-active': {
fontWeight: 'bold',
opacity: '1'
}
}
}, "".concat(token.antCls, "-tabs-top > ").concat(token.antCls, "-tabs-nav"), (0, _defineProperty2.default)({
marginBlockEnd: 0,
'&::before': {
borderBlockEnd: 0
}
}, "".concat(token.antCls, "-tabs-nav-list"), {
marginBlockStart: 0,
'${token.antCls}-tabs-tab': {
paddingBlockStart: 0
}
})), '&-dropdownmenu-label', {
fontWeight: 'bold',
fontSize: token.fontSizeIcon,
textAlign: 'center',
cursor: 'pointer'
}), '@media (max-width: 768px)', (0, _defineProperty2.default)({}, token.componentCls, {
'&-container': {
display: 'flex',
flexWrap: 'wrap',
flexDirection: 'column'
},
'&-left': {
marginBlockEnd: '16px',
maxWidth: '100%'
}
})));
};
function useStyle(prefixCls) {
return (0, _proProvider.useStyle)('ProTableListToolBar', function (token) {
var proListToken = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, token), {}, {
componentCls: ".".concat(prefixCls)
});
return [genProListStyle(proListToken)];
});
}

View File

@@ -0,0 +1,6 @@
import React from 'react';
export type DensitySize = 'middle' | 'small' | 'large' | undefined;
declare const _default: React.MemoExoticComponent<(props: {
icon?: React.ReactNode;
}) => import("react/jsx-runtime").JSX.Element>;
export default _default;

View File

@@ -0,0 +1,51 @@
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _icons = require("@ant-design/icons");
var _proProvider = require("@ant-design/pro-provider");
var _proUtils = require("@ant-design/pro-utils");
var _antd = require("antd");
var _react = _interopRequireWildcard(require("react"));
var _Provide = require("../../Store/Provide");
var _jsxRuntime = require("react/jsx-runtime");
var DensityIcon = function DensityIcon(props) {
var _props$icon = props.icon,
icon = _props$icon === void 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.ColumnHeightOutlined, {}) : _props$icon;
var counter = (0, _react.useContext)(_Provide.TableContext);
var intl = (0, _proProvider.useIntl)();
var dropdownProps = (0, _proUtils.menuOverlayCompatible)({
selectedKeys: [counter.tableSize],
onClick: function onClick(_ref) {
var _counter$setTableSize;
var key = _ref.key;
(_counter$setTableSize = counter.setTableSize) === null || _counter$setTableSize === void 0 || _counter$setTableSize.call(counter, key);
},
style: {
width: 80
},
items: [{
key: 'large',
label: intl.getMessage('tableToolBar.densityLarger', '宽松')
}, {
key: 'middle',
label: intl.getMessage('tableToolBar.densityMiddle', '中等')
}, {
key: 'small',
label: intl.getMessage('tableToolBar.densitySmall', '紧凑')
}]
});
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Dropdown, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, dropdownProps), {}, {
trigger: ['click'],
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tooltip, {
title: intl.getMessage('tableToolBar.density', '表格密度'),
children: icon
})
}));
};
var _default = exports.default = /*#__PURE__*/_react.default.memo(DensityIcon);

View File

@@ -0,0 +1,3 @@
import React from 'react';
declare const _default: React.MemoExoticComponent<() => import("react/jsx-runtime").JSX.Element>;
export default _default;

View File

@@ -0,0 +1,38 @@
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _icons = require("@ant-design/icons");
var _proProvider = require("@ant-design/pro-provider");
var _proUtils = require("@ant-design/pro-utils");
var _antd = require("antd");
var _react = _interopRequireWildcard(require("react"));
var _jsxRuntime = require("react/jsx-runtime");
var FullScreenIcon = function FullScreenIcon() {
var intl = (0, _proProvider.useIntl)();
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
fullscreen = _useState2[0],
setFullscreen = _useState2[1];
(0, _react.useEffect)(function () {
if (!(0, _proUtils.isBrowser)()) {
return;
}
document.onfullscreenchange = function () {
setFullscreen(!!document.fullscreenElement);
};
}, []);
return fullscreen ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tooltip, {
title: intl.getMessage('tableToolBar.exitFullScreen', '全屏'),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.FullscreenExitOutlined, {})
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tooltip, {
title: intl.getMessage('tableToolBar.fullScreen', '全屏'),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.FullscreenOutlined, {})
});
};
var _default = exports.default = /*#__PURE__*/_react.default.memo(FullScreenIcon);

View File

@@ -0,0 +1,70 @@
import type { TableColumnType } from 'antd';
import type { LabelTooltipType } from 'antd/lib/form/FormItemLabel';
import React from 'react';
import type { ActionType, OptionSearchProps, ProTableProps } from '../../typing';
import type { ListToolBarProps } from '../ListToolBar';
export type SettingOptionType = {
draggable?: boolean;
checkable?: boolean;
showListItemOption?: boolean;
checkedReset?: boolean;
listsHeight?: number;
extra?: React.ReactNode;
children?: React.ReactNode;
settingIcon?: React.ReactNode;
};
export type OptionConfig = {
density?: boolean;
fullScreen?: OptionsType;
reload?: OptionsType;
setting?: boolean | SettingOptionType;
search?: (OptionSearchProps & {
name?: string;
}) | boolean;
reloadIcon?: React.ReactNode;
densityIcon?: React.ReactNode;
};
export type OptionsFunctionType = (e: React.MouseEvent<HTMLSpanElement>, action?: ActionType) => void;
export type OptionsType = OptionsFunctionType | boolean;
export type ToolBarProps<T = unknown> = {
headerTitle?: React.ReactNode;
tooltip?: string | LabelTooltipType;
/** @deprecated 你可以使用 tooltip这个更改是为了与 antd 统一 */
tip?: string;
toolbar?: ListToolBarProps;
toolBarRender?: (action: ActionType | undefined, rows: {
selectedRowKeys?: (string | number)[];
selectedRows?: T[];
}) => React.ReactNode[];
action: React.MutableRefObject<ActionType | undefined>;
options?: OptionConfig | false;
optionsRender?: ToolbarRenderProps<T>['optionsRender'];
selectedRowKeys?: (string | number)[];
selectedRows?: T[];
className?: string;
onSearch?: (keyWords: string) => void;
columns: TableColumnType<T>[];
};
export type ToolbarRenderProps<T> = {
hideToolbar: boolean;
onFormSearchSubmit: (params: any) => void;
searchNode: React.ReactNode;
tableColumn: any[];
tooltip?: string | LabelTooltipType;
selectedRows: T[];
selectedRowKeys: React.Key[] | (string | number)[];
headerTitle: React.ReactNode;
toolbar: ProTableProps<T, any, any>['toolbar'];
options: ProTableProps<T, any, any>['options'];
optionsRender?: (props: ToolBarProps<T>, defaultDom: React.ReactNode[]) => React.ReactNode[];
toolBarRender?: ToolBarProps<T>['toolBarRender'];
actionRef: React.MutableRefObject<ActionType | undefined>;
};
/** 这里负责与table交互并且减少 render次数 */
declare class ToolbarRender<T> extends React.Component<ToolbarRenderProps<T>> {
onSearch: (keyword: string) => void;
isEquals: (next: ToolbarRenderProps<T>) => boolean;
shouldComponentUpdate: (next: ToolbarRenderProps<T>) => boolean;
render: () => import("react/jsx-runtime").JSX.Element | null;
}
export default ToolbarRender;

View File

@@ -0,0 +1,304 @@
"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 _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
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 _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _icons = require("@ant-design/icons");
var _proProvider = require("@ant-design/pro-provider");
var _proUtils = require("@ant-design/pro-utils");
var _antd = require("antd");
var _react = _interopRequireWildcard(require("react"));
var _Provide = require("../../Store/Provide");
var _ColumnSetting = _interopRequireDefault(require("../ColumnSetting"));
var _ListToolBar = _interopRequireDefault(require("../ListToolBar"));
var _DensityIcon = _interopRequireDefault(require("./DensityIcon"));
var _FullscreenIcon = _interopRequireDefault(require("./FullscreenIcon"));
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["headerTitle", "tooltip", "toolBarRender", "action", "options", "selectedRowKeys", "selectedRows", "toolbar", "onSearch", "columns", "optionsRender"];
function getButtonText(_ref, options) {
var _options$reloadIcon;
var intl = _ref.intl;
return {
reload: {
text: intl.getMessage('tableToolBar.reload', '刷新'),
icon: (_options$reloadIcon = options.reloadIcon) !== null && _options$reloadIcon !== void 0 ? _options$reloadIcon : /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.ReloadOutlined, {})
},
density: {
text: intl.getMessage('tableToolBar.density', '表格密度'),
icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_DensityIcon.default, {
icon: options.densityIcon
})
},
fullScreen: {
text: intl.getMessage('tableToolBar.fullScreen', '全屏'),
icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FullscreenIcon.default, {})
}
};
}
/**
* 渲染默认的 工具栏
*
* @param options
* @param className
*/
function renderDefaultOption(options, defaultOptions, actions, columns) {
return Object.keys(options).filter(function (item) {
return item;
}).map(function (key) {
var value = options[key];
if (!value) {
return null;
}
var onClick = value === true ? defaultOptions[key] : function (event) {
value === null || value === void 0 || value(event, actions.current);
};
if (typeof onClick !== 'function') {
onClick = function onClick() {};
}
if (key === 'setting') {
return /*#__PURE__*/(0, _react.createElement)(_ColumnSetting.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, options[key]), {}, {
columns: columns,
key: key
}));
}
if (key === 'fullScreen') {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
onClick: onClick,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FullscreenIcon.default, {})
}, key);
}
var optionItem = getButtonText(defaultOptions, options)[key];
if (optionItem) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
onClick: onClick,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tooltip, {
title: optionItem.text,
children: optionItem.icon
})
}, key);
}
return null;
}).filter(function (item) {
return item;
});
}
function ToolBar(_ref2) {
var headerTitle = _ref2.headerTitle,
tooltip = _ref2.tooltip,
toolBarRender = _ref2.toolBarRender,
action = _ref2.action,
propsOptions = _ref2.options,
selectedRowKeys = _ref2.selectedRowKeys,
selectedRows = _ref2.selectedRows,
toolbar = _ref2.toolbar,
onSearch = _ref2.onSearch,
columns = _ref2.columns,
optionsRender = _ref2.optionsRender,
rest = (0, _objectWithoutProperties2.default)(_ref2, _excluded);
var counter = (0, _react.useContext)(_Provide.TableContext);
var intl = (0, _proProvider.useIntl)();
var optionDom = (0, _react.useMemo)(function () {
var defaultOptions = {
reload: function reload() {
var _action$current;
return action === null || action === void 0 || (_action$current = action.current) === null || _action$current === void 0 ? void 0 : _action$current.reload();
},
density: true,
setting: true,
search: false,
fullScreen: function fullScreen() {
var _action$current2, _action$current2$full;
return action === null || action === void 0 || (_action$current2 = action.current) === null || _action$current2 === void 0 || (_action$current2$full = _action$current2.fullScreen) === null || _action$current2$full === void 0 ? void 0 : _action$current2$full.call(_action$current2);
}
};
if (propsOptions === false) {
return [];
}
var options = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, defaultOptions), {}, {
fullScreen: false
}, propsOptions);
var settings = renderDefaultOption(options, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, defaultOptions), {}, {
intl: intl
}), action, columns);
if (optionsRender) {
return optionsRender((0, _objectSpread2.default)({
headerTitle: headerTitle,
tooltip: tooltip,
toolBarRender: toolBarRender,
action: action,
options: propsOptions,
selectedRowKeys: selectedRowKeys,
selectedRows: selectedRows,
toolbar: toolbar,
onSearch: onSearch,
columns: columns,
optionsRender: optionsRender
}, rest), settings);
}
return settings;
}, [action, columns, headerTitle, intl, onSearch, optionsRender, propsOptions, rest, selectedRowKeys, selectedRows, toolBarRender, toolbar, tooltip]);
// 操作列表
var actions = toolBarRender ? toolBarRender(action === null || action === void 0 ? void 0 : action.current, {
selectedRowKeys: selectedRowKeys,
selectedRows: selectedRows
}) : [];
var searchConfig = (0, _react.useMemo)(function () {
if (!propsOptions) {
return false;
}
if (!propsOptions.search) return false;
/** 受控的value 和 onChange */
var defaultSearchConfig = {
value: counter.keyWords,
onChange: function onChange(e) {
return counter.setKeyWords(e.target.value);
}
};
if (propsOptions.search === true) return defaultSearchConfig;
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, defaultSearchConfig), propsOptions.search);
}, [counter, propsOptions]);
(0, _react.useEffect)(function () {
if (counter.keyWords === undefined) {
onSearch === null || onSearch === void 0 || onSearch('');
}
}, [counter.keyWords, onSearch]);
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListToolBar.default, (0, _objectSpread2.default)({
title: headerTitle,
tooltip: tooltip || rest.tip,
search: searchConfig,
onSearch: onSearch,
actions: actions,
settings: optionDom
}, toolbar));
}
/** 这里负责与table交互并且减少 render次数 */
var ToolbarRender = /*#__PURE__*/function (_React$Component) {
(0, _inherits2.default)(ToolbarRender, _React$Component);
var _super = (0, _createSuper2.default)(ToolbarRender);
function ToolbarRender() {
var _this;
(0, _classCallCheck2.default)(this, ToolbarRender);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onSearch", function (keyword) {
var _options$search, _options$search$onSea, _actionRef$current, _actionRef$current$se;
var _this$props = _this.props,
options = _this$props.options,
onFormSearchSubmit = _this$props.onFormSearchSubmit,
actionRef = _this$props.actionRef;
if (!options || !options.search) {
return;
}
var _ref3 = options.search === true ? {} : options.search,
_ref3$name = _ref3.name,
name = _ref3$name === void 0 ? 'keyword' : _ref3$name;
/** 如果传入的 onSearch 返回值为 false应该直接拦截请求 */
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, keyword);
if (success === false) return;
// 查询的时候的回到第一页
actionRef === null || actionRef === void 0 || (_actionRef$current = actionRef.current) === null || _actionRef$current === void 0 || (_actionRef$current$se = _actionRef$current.setPageInfo) === null || _actionRef$current$se === void 0 || _actionRef$current$se.call(_actionRef$current, {
current: 1
});
onFormSearchSubmit((0, _proUtils.omitUndefined)((0, _defineProperty2.default)({
_timestamp: Date.now()
}, name, keyword)));
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isEquals", function (next) {
var _this$props2 = _this.props,
hideToolbar = _this$props2.hideToolbar,
tableColumn = _this$props2.tableColumn,
options = _this$props2.options,
tooltip = _this$props2.tooltip,
toolbar = _this$props2.toolbar,
selectedRows = _this$props2.selectedRows,
selectedRowKeys = _this$props2.selectedRowKeys,
headerTitle = _this$props2.headerTitle,
actionRef = _this$props2.actionRef,
toolBarRender = _this$props2.toolBarRender;
return (0, _proUtils.isDeepEqualReact)({
hideToolbar: hideToolbar,
tableColumn: tableColumn,
options: options,
tooltip: tooltip,
toolbar: toolbar,
selectedRows: selectedRows,
selectedRowKeys: selectedRowKeys,
headerTitle: headerTitle,
actionRef: actionRef,
toolBarRender: toolBarRender
}, {
hideToolbar: next.hideToolbar,
tableColumn: next.tableColumn,
options: next.options,
tooltip: next.tooltip,
toolbar: next.toolbar,
selectedRows: next.selectedRows,
selectedRowKeys: next.selectedRowKeys,
headerTitle: next.headerTitle,
actionRef: next.actionRef,
toolBarRender: next.toolBarRender
}, ['render', 'renderFormItem']);
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "shouldComponentUpdate", function (next) {
if (next.searchNode) {
return true;
}
return !_this.isEquals(next);
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "render", function () {
var _this$props3 = _this.props,
hideToolbar = _this$props3.hideToolbar,
tableColumn = _this$props3.tableColumn,
options = _this$props3.options,
searchNode = _this$props3.searchNode,
tooltip = _this$props3.tooltip,
toolbar = _this$props3.toolbar,
selectedRows = _this$props3.selectedRows,
selectedRowKeys = _this$props3.selectedRowKeys,
headerTitle = _this$props3.headerTitle,
actionRef = _this$props3.actionRef,
toolBarRender = _this$props3.toolBarRender,
optionsRender = _this$props3.optionsRender;
// 不展示 toolbar
if (hideToolbar) {
return null;
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(ToolBar, {
tooltip: tooltip,
columns: tableColumn,
options: options,
headerTitle: headerTitle,
action: actionRef,
onSearch: _this.onSearch,
selectedRows: selectedRows,
selectedRowKeys: selectedRowKeys,
toolBarRender: toolBarRender,
toolbar: (0, _objectSpread2.default)({
filter: searchNode
}, toolbar),
optionsRender: optionsRender
});
});
return _this;
}
return (0, _createClass2.default)(ToolbarRender);
}(_react.default.Component);
var _default = exports.default = ToolbarRender;