choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
147 lines (125 loc) • 5.01 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import React, { useContext, useEffect, useState } from 'react';
import { action } from 'mobx';
import { observer } from 'mobx-react-lite';
import { Droppable } from 'react-beautiful-dnd';
import omit from 'lodash/omit';
import { pxToRem } from '../../../es/_util/UnitConvertor';
import Spin from '../spin';
import TableContext from './TableContext';
import { toTransformValue } from '../_util/transform';
import mergeProps from '../_util/mergeProps';
import { isStickySupport } from './utils';
import { instance } from './Table';
import { useRenderClone } from './hooks';
function getRowHeight(tableStore, dataSet, draggableId) {
var rowMetaData = tableStore.rowMetaData;
if (rowMetaData) {
var record = dataSet.find(function (r) {
return String(r.key) === String(draggableId);
});
if (record) {
var metaData = rowMetaData.find(function (meta) {
return meta.record === record;
});
if (metaData) {
return metaData.height;
}
}
}
return tableStore.virtualRowHeight;
}
var VirtualWrapper = function VirtualWrapper(props) {
var children = props.children;
var _useContext = useContext(TableContext),
tableStore = _useContext.tableStore,
prefixCls = _useContext.prefixCls,
virtualSpin = _useContext.virtualSpin,
spinProps = _useContext.spinProps,
isTree = _useContext.isTree,
rowDragRender = _useContext.rowDragRender,
dataSet = _useContext.dataSet;
var virtualTop = tableStore.virtualTop,
virtualHeight = tableStore.virtualHeight,
_tableStore$scrolling = tableStore.scrolling,
scrolling = _tableStore$scrolling === void 0 ? false : _tableStore$scrolling;
var _useState = useState(virtualHeight),
_useState2 = _slicedToArray(_useState, 2),
height = _useState2[0],
setHeight = _useState2[1];
useEffect(action(function () {
if (virtualHeight !== height) {
var lastScrollTop = tableStore.lastScrollTop,
tableBodyWrap = tableStore.node.tableBodyWrap;
if (lastScrollTop && tableBodyWrap) {
var scrollTop = Math.max(0, virtualHeight - height + lastScrollTop);
if (scrollTop === tableBodyWrap.scrollTop) {
tableStore.setLastScrollTop(scrollTop);
} else {
tableBodyWrap.scrollTop = scrollTop;
}
}
setHeight(virtualHeight);
}
}), [virtualHeight, height, tableStore]);
useEffect(function () {
var lastScrollTop = tableStore.lastScrollTop,
tableBodyWrap = tableStore.node.tableBodyWrap;
if (lastScrollTop) {
tableStore.setLastScrollTop(tableBodyWrap ? tableBodyWrap.scrollTop : 0);
}
}, [tableStore]);
var getBody = function getBody(droppableProvided, droppableSnapshot) {
var wrapperStyle = {
height: pxToRem(virtualHeight, true)
};
var style = {};
if (scrolling) {
wrapperStyle.pointerEvents = 'none';
}
var dragRowHeight = droppableSnapshot && droppableSnapshot.draggingFromThisWith ? getRowHeight(tableStore, dataSet, droppableSnapshot.draggingFromThisWith) : undefined;
var top = dragRowHeight ? virtualTop + dragRowHeight : virtualTop;
if (isStickySupport() && tableStore.hasRowGroups) {
wrapperStyle.paddingTop = pxToRem(top, true);
style.position = 'relative';
} else {
style.transform = toTransformValue({
translateY: pxToRem(top, true)
});
}
return /*#__PURE__*/React.createElement("div", _extends({
className: "".concat(prefixCls, "-tbody-wrapper"),
style: wrapperStyle,
ref: droppableProvided && droppableProvided.innerRef
}, droppableProvided && droppableProvided.droppableProps), /*#__PURE__*/React.createElement("div", {
style: style
}, children(droppableSnapshot, dragRowHeight)));
};
var renderClone = useRenderClone();
var content = tableStore.rowDraggable ? /*#__PURE__*/React.createElement(Droppable, _extends({
droppableId: tableStore.node.props.id || "table",
key: "table",
isCombineEnabled: isTree,
mode: "virtual",
renderClone: renderClone,
getContainerForClone: function getContainerForClone() {
return instance(tableStore.node.getClassName(), prefixCls).tbody;
}
}, rowDragRender && rowDragRender.droppableProps), getBody) : getBody();
return /*#__PURE__*/React.createElement(React.Fragment, null, content, virtualSpin && scrolling && /*#__PURE__*/React.createElement(Spin, _extends({}, mergeProps(omit(spinProps, ['dataSet']), {
spinning: true,
style: {
position: 'absolute',
top: '50%',
left: '50%',
marginTop: pxToRem(tableStore.lastScrollTop, true),
transform: toTransformValue({
translate: '-50% -50%'
})
}
}))));
};
VirtualWrapper.displayName = 'VirtualWrapper';
export default observer(VirtualWrapper);
//# sourceMappingURL=VirtualWrapper.js.map