448 lines
18 KiB
JavaScript
448 lines
18 KiB
JavaScript
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
||
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
|
||
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
||
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
||
var _excluded = ["key", "dataIndex", "children"],
|
||
_excluded2 = ["disabled"];
|
||
import { SettingOutlined, VerticalAlignBottomOutlined, VerticalAlignMiddleOutlined, VerticalAlignTopOutlined } from '@ant-design/icons';
|
||
import { ProProvider, useIntl } from '@ant-design/pro-provider';
|
||
import { runFunction, useRefFunction } from '@ant-design/pro-utils';
|
||
import { Checkbox, ConfigProvider, Popover, Space, Tooltip, Tree, Typography } from 'antd';
|
||
import classNames from 'classnames';
|
||
import omit from "rc-util/es/omit";
|
||
import React, { useContext, useEffect, useMemo, useRef } from 'react';
|
||
import { TableContext } from "../../Store/Provide";
|
||
import { genColumnKey } from "../../utils/index";
|
||
import { useStyle } from "./style";
|
||
import { jsx as _jsx } from "react/jsx-runtime";
|
||
import { jsxs as _jsxs } from "react/jsx-runtime";
|
||
import { Fragment as _Fragment } from "react/jsx-runtime";
|
||
var ToolTipIcon = function ToolTipIcon(_ref) {
|
||
var title = _ref.title,
|
||
show = _ref.show,
|
||
children = _ref.children,
|
||
columnKey = _ref.columnKey,
|
||
fixed = _ref.fixed;
|
||
var _useContext = useContext(TableContext),
|
||
columnsMap = _useContext.columnsMap,
|
||
setColumnsMap = _useContext.setColumnsMap;
|
||
if (!show) {
|
||
return null;
|
||
}
|
||
return /*#__PURE__*/_jsx(Tooltip, {
|
||
title: title,
|
||
children: /*#__PURE__*/_jsx("span", {
|
||
onClick: function onClick(e) {
|
||
e.stopPropagation();
|
||
e.preventDefault();
|
||
var config = columnsMap[columnKey] || {};
|
||
var columnKeyMap = _objectSpread(_objectSpread({}, columnsMap), {}, _defineProperty({}, columnKey, _objectSpread(_objectSpread({}, 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 = useIntl();
|
||
var _useContext2 = useContext(ProProvider),
|
||
hashId = _useContext2.hashId;
|
||
var dom = /*#__PURE__*/_jsxs("span", {
|
||
className: "".concat(className, "-list-item-option ").concat(hashId).trim(),
|
||
children: [/*#__PURE__*/_jsx(ToolTipIcon, {
|
||
columnKey: columnKey,
|
||
fixed: "left",
|
||
title: intl.getMessage('tableToolBar.leftPin', '固定在列首'),
|
||
show: fixed !== 'left',
|
||
children: /*#__PURE__*/_jsx(VerticalAlignTopOutlined, {})
|
||
}), /*#__PURE__*/_jsx(ToolTipIcon, {
|
||
columnKey: columnKey,
|
||
fixed: undefined,
|
||
title: intl.getMessage('tableToolBar.noPin', '不固定'),
|
||
show: !!fixed,
|
||
children: /*#__PURE__*/_jsx(VerticalAlignMiddleOutlined, {})
|
||
}), /*#__PURE__*/_jsx(ToolTipIcon, {
|
||
columnKey: columnKey,
|
||
fixed: "right",
|
||
title: intl.getMessage('tableToolBar.rightPin', '固定在列尾'),
|
||
show: fixed !== 'right',
|
||
children: /*#__PURE__*/_jsx(VerticalAlignBottomOutlined, {})
|
||
})]
|
||
});
|
||
return /*#__PURE__*/_jsxs("span", {
|
||
className: "".concat(className, "-list-item ").concat(hashId).trim(),
|
||
children: [/*#__PURE__*/_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 = useContext(ProProvider),
|
||
hashId = _useContext3.hashId;
|
||
var _useContext4 = useContext(TableContext),
|
||
columnsMap = _useContext4.columnsMap,
|
||
setColumnsMap = _useContext4.setColumnsMap,
|
||
sortKeyColumns = _useContext4.sortKeyColumns,
|
||
setSortKeyColumns = _useContext4.setSortKeyColumns;
|
||
var show = list && list.length > 0;
|
||
var treeDataConfig = 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 = _objectWithoutProperties(_ref4, _excluded);
|
||
var columnKey = 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 = _objectSpread(_objectSpread({
|
||
key: columnKey
|
||
}, omit(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, _objectSpread(_objectSpread({}, 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 = useRefFunction(function (id, targetId, dropPosition) {
|
||
var newMap = _objectSpread({}, columnsMap);
|
||
var newColumns = _toConsumableArray(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] = _objectSpread(_objectSpread({}, newMap[key] || {}), {}, {
|
||
order: order
|
||
});
|
||
});
|
||
// 更新数组
|
||
setColumnsMap(newMap);
|
||
setSortKeyColumns(newColumns);
|
||
});
|
||
|
||
/** 选中反选功能 */
|
||
var onCheckTree = useRefFunction(function (e) {
|
||
var newColumnMap = _objectSpread({}, columnsMap);
|
||
var loopSetShow = function loopSetShow(key) {
|
||
var _treeDataConfig$map;
|
||
var newSetting = _objectSpread({}, 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(_objectSpread({}, newColumnMap));
|
||
});
|
||
if (!show) {
|
||
return null;
|
||
}
|
||
var listDom = /*#__PURE__*/_jsx(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 = _objectSpread(_objectSpread({}, _node), {}, {
|
||
children: undefined
|
||
});
|
||
if (!node.title) return null;
|
||
var normalizedTitle = runFunction(node.title, node);
|
||
var wrappedTitle = /*#__PURE__*/_jsx(Typography.Text, {
|
||
style: {
|
||
width: 80
|
||
},
|
||
ellipsis: {
|
||
tooltip: normalizedTitle
|
||
},
|
||
children: normalizedTitle
|
||
});
|
||
return /*#__PURE__*/_jsx(CheckboxListItem, _objectSpread(_objectSpread({
|
||
className: className
|
||
}, omit(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 = _objectWithoutProperties(_ref5, _excluded2);
|
||
return config;
|
||
})
|
||
});
|
||
return /*#__PURE__*/_jsxs(_Fragment, {
|
||
children: [showTitle && /*#__PURE__*/_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 = useContext(ProProvider),
|
||
hashId = _useContext5.hashId;
|
||
var rightList = [];
|
||
var leftList = [];
|
||
var list = [];
|
||
var intl = 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__*/_jsxs("div", {
|
||
className: classNames("".concat(className, "-list"), hashId, _defineProperty({}, "".concat(className, "-list-group"), showRight || showLeft)),
|
||
children: [/*#__PURE__*/_jsx(CheckboxList, {
|
||
title: intl.getMessage('tableToolBar.leftFixedTitle', '固定在左侧'),
|
||
list: leftList,
|
||
draggable: draggable,
|
||
checkable: checkable,
|
||
showListItemOption: showListItemOption,
|
||
className: className,
|
||
listHeight: listsHeight
|
||
}), /*#__PURE__*/_jsx(CheckboxList, {
|
||
list: list,
|
||
draggable: draggable,
|
||
checkable: checkable,
|
||
showListItemOption: showListItemOption,
|
||
title: intl.getMessage('tableToolBar.noFixedTitle', '不固定'),
|
||
showTitle: showLeft || showRight,
|
||
className: className,
|
||
listHeight: listsHeight
|
||
}), /*#__PURE__*/_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 = useRef(null);
|
||
// 获得当前上下文的 hashID
|
||
var counter = useContext(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;
|
||
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 = 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 = 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 = useRefFunction(function (e) {
|
||
if (e.target.checked) {
|
||
setAllSelectAction();
|
||
} else {
|
||
setAllSelectAction(false);
|
||
}
|
||
});
|
||
|
||
/** 重置项目 */
|
||
var clearClick = 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 = useIntl();
|
||
var _useContext6 = useContext(ConfigProvider.ConfigContext),
|
||
getPrefixCls = _useContext6.getPrefixCls;
|
||
var className = getPrefixCls('pro-table-column-setting');
|
||
var _useStyle = useStyle(className),
|
||
wrapSSR = _useStyle.wrapSSR,
|
||
hashId = _useStyle.hashId;
|
||
return wrapSSR( /*#__PURE__*/_jsx(Popover, {
|
||
arrow: false,
|
||
title: /*#__PURE__*/_jsxs("div", {
|
||
className: "".concat(className, "-title ").concat(hashId).trim(),
|
||
children: [props.checkable === false ? /*#__PURE__*/_jsx("div", {}) : /*#__PURE__*/_jsx(Checkbox, {
|
||
indeterminate: indeterminate,
|
||
checked: unCheckedKeys.length === 0 && unCheckedKeys.length !== localColumns.length,
|
||
onChange: function onChange(e) {
|
||
checkedAll(e);
|
||
},
|
||
children: intl.getMessage('tableToolBar.columnDisplay', '列展示')
|
||
}), checkedReset ? /*#__PURE__*/_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__*/_jsx(Space, {
|
||
size: 12,
|
||
align: "center",
|
||
children: props.extra
|
||
}) : null]
|
||
}),
|
||
overlayClassName: "".concat(className, "-overlay ").concat(hashId).trim(),
|
||
trigger: "click",
|
||
placement: "bottomRight",
|
||
content: /*#__PURE__*/_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__*/_jsx(Tooltip, {
|
||
title: intl.getMessage('tableToolBar.columnSetting', '列设置'),
|
||
children: (_props$settingIcon = props.settingIcon) !== null && _props$settingIcon !== void 0 ? _props$settingIcon : /*#__PURE__*/_jsx(SettingOutlined, {})
|
||
})
|
||
}));
|
||
}
|
||
export default ColumnSetting; |