zp-bee
Version:
zp-bee,是一款基于 Dumi,由 React + TypeScript 开发的组件库 🎉。
706 lines (610 loc) • 26 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.Resizable = void 0;
require("antd/es/affix/style");
var _affix = _interopRequireDefault(require("antd/es/affix"));
require("antd/es/table/style");
var _table = _interopRequireDefault(require("antd/es/table"));
require("antd/es/pagination/style");
var _pagination = _interopRequireDefault(require("antd/es/pagination"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _isVisible = _interopRequireDefault(require("rc-util/es/Dom/isVisible"));
var _virtualizedAntdTable = require("../virtualized-antd-table");
var __rest = void 0 && (void 0).__rest || function (s, e) {
var t = {};
for (var p in s) {
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
}
if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
}
return t;
};
var _document = document;
var Resizable = function Resizable(props) {
var children = props.children,
className = props.className,
onMouseMove = props.onMouseMove,
onMouseDown = props.onMouseDown,
onMouseOut = props.onMouseOut,
p = __rest(props, ["children", "className", "onMouseMove", "onMouseDown", "onMouseOut"]);
var handleClick = function handleClick(e) {
e.stopPropagation();
};
return /*#__PURE__*/_react.default.cloneElement(children, Object.assign(Object.assign({}, p), {
className: "".concat(className ? "".concat(className, " ") : '', "react-resizable"),
children: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children.props.children, /*#__PURE__*/_react.default.createElement("span", {
className: "react-resizable-handle",
onMouseMove: onMouseMove,
onMouseDown: onMouseDown,
onMouseOut: onMouseOut
}))
}));
};
exports.Resizable = Resizable;
var MyTable = function MyTable(_a) {
var columns = _a.columns,
dataSource = _a.dataSource,
storeColumnNamePrefix = _a.storeColumnNamePrefix,
pagination = _a.pagination,
_a$sticky = _a.sticky,
sticky = _a$sticky === void 0 ? false : _a$sticky,
_a$affixPagination = _a.affixPagination,
affixPagination = _a$affixPagination === void 0 ? true : _a$affixPagination,
summaryRow = _a.summaryRow,
settingNode = _a.settingNode,
settingNodeRender = _a.settingNodeRender,
_a$isUnusualOrder = _a.isUnusualOrder,
isUnusualOrder = _a$isUnusualOrder === void 0 ? false : _a$isUnusualOrder,
footerNode = _a.footerNode,
scroll = _a.scroll,
_a$isVirtualList = _a.isVirtualList,
isVirtualList = _a$isVirtualList === void 0 ? false : _a$isVirtualList,
propsComponents = _a.components,
_a$closeResizeHeader = _a.closeResizeHeader,
closeResizeHeader = _a$closeResizeHeader === void 0 ? false : _a$closeResizeHeader,
onVirtualScroll = _a.onVirtualScroll,
_a$autoFix = _a.autoFix,
autoFix = _a$autoFix === void 0 ? true : _a$autoFix,
bindRef = _a.bindRef,
restProps = __rest(_a, ["columns", "dataSource", "storeColumnNamePrefix", "pagination", "sticky", "affixPagination", "summaryRow", "settingNode", "settingNodeRender", "isUnusualOrder", "footerNode", "scroll", "isVirtualList", "components", "closeResizeHeader", "onVirtualScroll", "autoFix", "bindRef"]);
var _useState = (0, _react.useState)(columns),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
packagedColumns = _useState2[0],
setPackagedColumns = _useState2[1];
var _useState3 = (0, _react.useState)(scroll || {}),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
packageScroll = _useState4[0],
setPackageScroll = _useState4[1];
var packagedColumnsRef = (0, _react.useRef)();
var _useState5 = (0, _react.useState)(true),
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
paginationVisible = _useState6[0],
setPaginationVisible = _useState6[1];
var purePaginationRef = (0, _react.useRef)();
var resizeProxyRef = (0, _react.useRef)();
var containerRef = (0, _react.useRef)();
var paginationRef = (0, _react.useRef)(null);
var _useRef = (0, _react.useRef)({
dataSrc: []
}),
currentInstance = _useRef.current;
paginationRef.current = pagination;
var dragging = (0, _react.useRef)(false);
var draggingColumn = (0, _react.useRef)(null);
var ResizableTitle = (0, _react.useCallback)(function (props) {
var onResize = props.onResize,
onResizeStop = props.onResizeStop,
className = props.className,
restProps = __rest(props, ["onResize", "onResizeStop", "className"]);
var handleMouseMove = function handleMouseMove(column, event, onResizeStop) {
// if (!column.resizable) return;
// if (column.subColumns && column.subColumns.length) return;
if (!dragging.current) {
var target = event.target;
while (target && target.tagName !== 'TH') {
target = target.parentNode;
}
if (!target) {
return;
}
var rect = target.getBoundingClientRect();
var bodyStyle = containerRef.current.style; // 如果是最后一个th 则返回
if (target.nextSibling && target.nextSibling.getAttribute('class').includes('ant-table-cell-scrollbar') || target.parentNode.lastChild === target) {
bodyStyle.cursor = '';
draggingColumn.current = null;
return;
}
if (rect.width > 12 && rect.right - event.pageX < 8) {
bodyStyle.cursor = 'col-resize';
draggingColumn.current = Object.assign(Object.assign({}, column), {
realWidth: rect.width
});
} else {
bodyStyle.cursor = '';
draggingColumn.current = null;
}
}
};
var handleMouseDown = function handleMouseDown(column, event, onResizeStop) {
if (draggingColumn.current) {
dragging.current = true; // const { table } = this.context;
// const { el: tableEl, resizeProxy } = table;
var tableLeft = containerRef.current.getBoundingClientRect().left;
var columnEl = event.target;
while (columnEl && columnEl.tagName !== 'TH') {
columnEl = columnEl.parentNode;
}
var columnRect = columnEl.getBoundingClientRect(); // 最小宽度40px
var minLeft = columnRect.left - tableLeft + 40;
columnEl.classList.add('noclick');
var startMouseLeft = event.clientX;
var startLeft = columnRect.right - tableLeft;
var startColumnLeft = columnRect.left - tableLeft;
resizeProxyRef.current.style.visibility = 'visible';
resizeProxyRef.current.style.left = startLeft - 20 + 'px';
containerRef.current.onselectstart = function () {
return false;
};
containerRef.current.ondragstart = function () {
return false;
};
var _handleMouseMove = function _handleMouseMove(event) {
var deltaLeft = event.clientX - startMouseLeft;
var proxyLeft = startLeft + deltaLeft;
resizeProxyRef.current.style.left = Math.max(minLeft, proxyLeft) - 20 + 'px';
};
var handleMouseUp = function handleMouseUp(event) {
if (dragging.current) {
event.stopPropagation();
var finalLeft = parseInt(resizeProxyRef.current.style.left, 10) + 20;
var columnWidth = finalLeft - startColumnLeft;
var oldWidth = draggingColumn.current.realWidth;
containerRef.current.style.cursor = '';
resizeProxyRef.current.style.visibility = 'hidden';
containerRef.current.removeEventListener('mousemove', _handleMouseMove);
containerRef.current.removeEventListener('mouseup', handleMouseUp);
containerRef.current.onselectstart = null;
containerRef.current.ondragstart = null; // 计算出来的值大于0才可以调整
if (columnWidth > 0) {
onResizeStop && onResizeStop(columnWidth);
}
setTimeout(function () {
columnEl.classList.remove('noclick');
});
dragging.current = false;
draggingColumn.current = null;
}
};
containerRef.current.addEventListener('mousemove', _handleMouseMove);
containerRef.current.addEventListener('mouseup', handleMouseUp);
}
};
var handleMouseOut = function handleMouseOut() {
containerRef.current.style.cursor = '';
};
return /*#__PURE__*/_react.default.createElement(Resizable, {
className: className,
onMouseMove: function onMouseMove(e) {
return handleMouseMove(restProps, e, onResizeStop);
},
onMouseDown: function onMouseDown(e) {
return handleMouseDown(restProps, e, onResizeStop);
},
onMouseOut: function onMouseOut(e) {
return handleMouseOut();
}
}, /*#__PURE__*/_react.default.createElement("th", Object.assign({}, restProps)));
}, []); // 视口监听器
var observer = (0, _react.useRef)();
var initObserver = function initObserver() {
observer.current = new IntersectionObserver(function (entries) {
entries.forEach(function (entry) {
// 元素可见时更新状态
if ((0, _isVisible.default)(containerRef.current)) {
setPaginationVisible(entry.isIntersecting);
}
});
});
if (purePaginationRef.current) {
observer.current.observe(purePaginationRef.current);
}
};
var resetObserver = function resetObserver() {
// 状态更新,页面卸载时,去除视口监听
if (observer.current) {
observer.current.disconnect();
}
};
var handleColsResizeStop = function handleColsResizeStop(index, pIndex) {
return function (newWidth, nextIndex) {
var resultIndex = nextIndex !== null && nextIndex !== void 0 ? nextIndex : index;
var nextColumns = (0, _toConsumableArray2.default)(packagedColumnsRef.current);
if (pIndex) {
nextColumns[pIndex].children[resultIndex] = Object.assign(Object.assign({}, nextColumns[pIndex].children[resultIndex]), {
width: newWidth
});
} else {
nextColumns[resultIndex] = Object.assign(Object.assign({}, nextColumns[resultIndex]), {
width: newWidth
});
} // 重新设置表格的滚动宽度
var _calculateWidth = calculateWidth(nextColumns),
scrollX = _calculateWidth.scrollX,
bodyWidth = _calculateWidth.bodyWidth; // 横向超出了 则设置scroll中的x值
if (scrollX) {
setPackageScroll(Object.assign({}, packageScroll, {
x: bodyWidth
}));
} else {
delete packageScroll.x;
setPackageScroll(packageScroll);
}
setPackagedColumns(nextColumns);
var memorySize = "".concat(newWidth); // 存入store中
if (storeColumnNamePrefix) {
if (pIndex) {
window.localStorage.setItem("".concat(storeColumnNamePrefix, "_").concat(nextColumns[pIndex].children[resultIndex].dataIndex), memorySize);
} else {
window.localStorage.setItem("".concat(storeColumnNamePrefix, "_").concat(nextColumns[resultIndex].dataIndex), memorySize);
}
}
};
};
var dataSrc = (0, _react.useMemo)(function () {
return summaryRow ? [].concat((0, _toConsumableArray2.default)(dataSource), [Object.assign(Object.assign({}, summaryRow), {
__isSummaryRow: true
})]) : dataSource;
}, [dataSource, summaryRow]);
var queryColumns = (0, _react.useCallback)(function () {
var tempColumns = (0, _toConsumableArray2.default)(columns);
if (!tempColumns.length) {
if (settingNode) {
// 仅有设置按钮 且有自定义render
if (settingNodeRender) {
tempColumns.unshift({
title: settingNode,
dataIndex: '__dataIndex',
align: 'center',
width: 40,
render: settingNodeRender
});
} else {
tempColumns.unshift({
title: settingNode,
dataIndex: '__dataIndex',
align: 'center',
width: 40,
render: function render(text, record, index) {
var _a, _b, _c, _d;
if (isUnusualOrder) {
return {
children: record.unusualOrder,
props: {
rowSpan: record.rowSpan
}
};
} else {
return index + 1 + ((_b = (_a = paginationRef.current) === null || _a === void 0 ? void 0 : _a.pageSize) !== null && _b !== void 0 ? _b : 10) * (((_d = (_c = paginationRef.current) === null || _c === void 0 ? void 0 : _c.current) !== null && _d !== void 0 ? _d : 1) - 1);
}
}
});
}
setPackagedColumns(tempColumns);
return;
}
setPackagedColumns([]);
return;
}
if (summaryRow || settingNode) {
// 有合计行
if (summaryRow) {
tempColumns = tempColumns.map(function (column) {
return Object.assign(Object.assign({}, column), {
render: function render(text, record, index) {
if (record.__isSummaryRow) {
// 如果此行是合计行,直接返回文字
return text;
} else {
if (column.render) {
// 不是合计行,且column有render属性,使用传入的render
return column.render(text, record, index);
} else {
// 不是合计行,且column没有render属性,直接返回文本
return text;
}
}
}
});
}); // 有合计行则显示序号列,合计行显示总计
tempColumns.unshift({
title: settingNode || '',
fixed: tempColumns[0].fixed === 'left' ? 'left' : '',
dataIndex: '__dataIndex',
align: 'center',
width: 40,
render: function render(text, record, index) {
var _a, _b, _c, _d;
if (record.__isSummaryRow) {
return '总计';
} else {
if (isUnusualOrder) {
return {
children: record.unusualOrder,
props: {
rowSpan: record.rowSpan
}
};
} else {
return index + 1 + ((_b = (_a = paginationRef.current) === null || _a === void 0 ? void 0 : _a.pageSize) !== null && _b !== void 0 ? _b : 10) * (((_d = (_c = paginationRef.current) === null || _c === void 0 ? void 0 : _c.current) !== null && _d !== void 0 ? _d : 1) - 1);
}
}
}
});
} else if (settingNode) {
// 仅有设置按钮
if (settingNodeRender) {
tempColumns.unshift({
title: settingNode,
fixed: tempColumns[0].fixed === 'left' ? 'left' : '',
dataIndex: '__dataIndex',
align: 'center',
width: 40,
render: settingNodeRender
});
} else {
tempColumns.unshift({
title: settingNode,
fixed: tempColumns[0].fixed === 'left' ? 'left' : '',
dataIndex: '__dataIndex',
align: 'center',
width: 40,
render: function render(text, record, index) {
var _a, _b, _c, _d;
if (isUnusualOrder) {
return {
children: record.unusualOrder,
props: {
rowSpan: record.rowSpan
}
};
} else {
return index + 1 + ((_b = (_a = paginationRef.current) === null || _a === void 0 ? void 0 : _a.pageSize) !== null && _b !== void 0 ? _b : 10) * (((_d = (_c = paginationRef.current) === null || _c === void 0 ? void 0 : _c.current) !== null && _d !== void 0 ? _d : 1) - 1);
}
}
});
}
}
}
var setColumnsLocalWidth = function setColumnsLocalWidth(columns, pIndex) {
return columns.map(function (column, index) {
var memorySize; // 有store存储前缀,取存储值为column的宽度
if (storeColumnNamePrefix) {
var sizeColumns = window.localStorage.getItem("".concat(storeColumnNamePrefix, "_").concat(column.dataIndex));
memorySize = sizeColumns ? Number(sizeColumns) : sizeColumns;
}
return Object.assign(Object.assign({}, column), {
width: memorySize || column.width,
minWidth: column.width || column.minWidth,
children: setColumnsLocalWidth(column.children || [], index),
onHeaderCell: function onHeaderCell(column) {
return {
width: column.width,
dataIndex: column.dataIndex,
onResizeStop: handleColsResizeStop(index, pIndex)
};
}
});
});
};
tempColumns = setColumnsLocalWidth(tempColumns, null);
var _calculateWidth2 = calculateWidth(tempColumns),
scrollX = _calculateWidth2.scrollX,
bodyWidth = _calculateWidth2.bodyWidth; // 横向超出了 则设置scroll中的x值
if (scrollX) {
setPackageScroll(Object.assign({}, packageScroll, {
x: bodyWidth
}));
} else {
delete packageScroll.x;
setPackageScroll(packageScroll);
}
setPackagedColumns(tempColumns);
}, [columns, summaryRow, settingNode, scroll, packageScroll]);
(0, _react.useEffect)(function () {
queryColumns();
}, [columns, summaryRow, settingNode]);
(0, _react.useEffect)(function () {
packagedColumnsRef.current = packagedColumns;
}, [packagedColumns]);
(0, _react.useEffect)(function () {
if (affixPagination) {
initObserver();
}
return resetObserver;
}, [affixPagination, paginationVisible]);
var calculateWidth = function calculateWidth(columns) {
var gutterWidth = 15;
var rowSelection = restProps.rowSelection;
var bodyMinWidth = columns.reduce(function (pre, col) {
return pre + (col.width || col.minWidth);
}, rowSelection ? 50 : 0);
var bodyWidth = containerRef.current.clientWidth;
var scrollX;
var fixedWidth;
var rightFixedWidth; // 判断是否全部都设置了width值 如果全部设置了 则去除最后一列的width值 使得表格自适应且不按比例划分宽度
// 如果最后需要删除的列fixed 则向前寻找最后一个非fixed的去除width值
if (autoFix) {
if (columns && columns.length > 1 && columns.every(function (item) {
return item.width;
})) {
for (var i = columns.length - 1; i > -1; i--) {
if (!columns[i].fixed) {
delete columns[i].width;
break;
}
}
}
} // mutate props (TableStore's state[columns])
var flexColumns = columns.filter(function (column) {
return typeof column.width !== 'number';
});
if (flexColumns.length) {
if (bodyMinWidth < bodyWidth - gutterWidth) {
// no scroll bar
scrollX = false;
var totalFlexWidth = bodyWidth - gutterWidth - bodyMinWidth;
if (flexColumns.length === 1) {
flexColumns[0].realWidth = flexColumns[0].minWidth + totalFlexWidth;
} else {
var allColumnsWidth = flexColumns.reduce(function (pre, col) {
return pre + col.minWidth;
}, 0);
var flexWidthPerPixel = totalFlexWidth / allColumnsWidth;
var widthWithoutFirst = 0;
flexColumns.forEach(function (column, index) {
if (index === 0) return;
var flexWidth = Math.floor(column.minWidth * flexWidthPerPixel);
widthWithoutFirst += flexWidth;
column.realWidth = column.minWidth + flexWidth;
});
flexColumns[0].realWidth = flexColumns[0].minWidth + totalFlexWidth - widthWithoutFirst;
}
} else {
// have horizontal scroll bar
scrollX = true;
flexColumns.forEach(function (column) {
column.realWidth = column.minWidth;
});
}
bodyWidth = Math.max(bodyMinWidth, bodyWidth);
} else {
scrollX = bodyMinWidth > bodyWidth;
bodyWidth = bodyMinWidth;
} // if (fixedColumns.length) {
// fixedWidth = fixedColumns.reduce((pre, col) => pre + col.realWidth, 0);
// }
// if (rightFixedColumns.length) {
// rightFixedWidth = rightFixedColumns.reduce((pre, col) => pre + col.realWidth, 0);
// }
return {
scrollX: scrollX,
bodyWidth: bodyWidth,
fixedWidth: fixedWidth,
rightFixedWidth: rightFixedWidth
};
};
var PaginationNode = function PaginationNode() {
return /*#__PURE__*/_react.default.createElement(_pagination.default, Object.assign({
size: "small",
current: pagination === null || pagination === void 0 ? void 0 : pagination.current,
pageSize: pagination === null || pagination === void 0 ? void 0 : pagination.pageSize,
pageSizeOptions: ['10', '20', '30', '40', '100', '200'],
total: pagination === null || pagination === void 0 ? void 0 : pagination.total,
showTotal: function showTotal(total) {
return "\u5171".concat(total, "\u6761\u8BB0\u5F55");
},
showSizeChanger: true
}, pagination));
};
var _useVT = (0, _virtualizedAntdTable.useVT)(function () {
return {
scroll: (scroll === null || scroll === void 0 ? void 0 : scroll.y) ? {
y: scroll === null || scroll === void 0 ? void 0 : scroll.y
} : {
y: 600
},
onScroll: function onScroll() {
var _a, _b; // 当开启虚拟滚动且方法存在时回调
if (((_a = vtRef === null || vtRef === void 0 ? void 0 : vtRef.current) === null || _a === void 0 ? void 0 : _a.getDataSourceIndex) && onVirtualScroll) {
var _vtRef$current$getDat = vtRef.current.getDataSourceIndex(),
_vtRef$current$getDat2 = (0, _slicedToArray2.default)(_vtRef$current$getDat, 2),
startIndex = _vtRef$current$getDat2[0],
endIndex = _vtRef$current$getDat2[1];
onVirtualScroll && onVirtualScroll((_b = currentInstance === null || currentInstance === void 0 ? void 0 : currentInstance.dataSrc) === null || _b === void 0 ? void 0 : _b.slice(startIndex, endIndex + 1), startIndex, endIndex);
}
}
};
}, [scroll === null || scroll === void 0 ? void 0 : scroll.y]),
_useVT2 = (0, _slicedToArray2.default)(_useVT, 3),
vt = _useVT2[0],
setVt = _useVT2[1],
vtRef = _useVT2[2];
(0, _react.useEffect)(function () {
if (propsComponents) {
// @ts-ignore
setVt(propsComponents);
}
}, []);
(0, _react.useEffect)(function () {
if (vtRef) {
bindRef && bindRef(vtRef);
}
}, [vtRef]);
var memoVtComponents = (0, _react.useMemo)(function () {
setPackageScroll(scroll);
return Object.assign(Object.assign({}, (scroll === null || scroll === void 0 ? void 0 : scroll.y) && vt), {
header: {
cell: closeResizeHeader ? null : ResizableTitle
}
});
}, [scroll === null || scroll === void 0 ? void 0 : scroll.y]);
var components = (0, _react.useMemo)(function () {
return Object.assign(Object.assign({}, propsComponents), {
header: {
cell: closeResizeHeader ? null : ResizableTitle
}
});
}, [scroll, propsComponents]);
currentInstance.dataSrc = dataSrc;
return /*#__PURE__*/_react.default.createElement("div", {
className: "beeTableContainer",
ref: containerRef
}, /*#__PURE__*/_react.default.createElement(_table.default, Object.assign({}, restProps, {
className: "oneHeader",
columns: packagedColumns,
dataSource: dataSrc,
sticky: sticky,
pagination: false,
scroll: packageScroll,
components: isVirtualList ? memoVtComponents : components
})), pagination && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
ref: purePaginationRef,
className: "purePagination",
style: paginationVisible ? footerNode ? {
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center'
} : {
display: 'block'
} : {
visibility: affixPagination ? 'hidden' : 'visible'
}
}, footerNode, /*#__PURE__*/_react.default.createElement(PaginationNode, null)), !paginationVisible && affixPagination && /*#__PURE__*/_react.default.createElement(_affix.default, {
offsetBottom: 15,
style: {
zIndex: 10
}
}, /*#__PURE__*/_react.default.createElement("div", {
className: "scrollFooter"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "footer",
style: footerNode ? {} : {
justifyContent: 'flex-end'
}
}, footerNode, /*#__PURE__*/_react.default.createElement(PaginationNode, null))))), /*#__PURE__*/_react.default.createElement("div", {
className: "tableColumnResizeProxy",
ref: resizeProxyRef,
style: {
visibility: 'hidden'
}
}, /*#__PURE__*/_react.default.createElement("div", null)));
};
var _default = MyTable;
exports.default = _default;