rc-table
Version:
table ui component for react
265 lines (249 loc) • 10.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof3 = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _context = require("@rc-component/context");
var _rcVirtualList = _interopRequireDefault(require("rc-virtual-list"));
var React = _interopRequireWildcard(require("react"));
var _TableContext = _interopRequireWildcard(require("../context/TableContext"));
var _useFlattenRecords = _interopRequireDefault(require("../hooks/useFlattenRecords"));
var _BodyLine = _interopRequireDefault(require("./BodyLine"));
var _context2 = require("./context");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
var Grid = /*#__PURE__*/React.forwardRef(function (props, ref) {
var data = props.data,
onScroll = props.onScroll;
var _useContext = (0, _context.useContext)(_TableContext.default, ['flattenColumns', 'onColumnResize', 'getRowKey', 'prefixCls', 'expandedKeys', 'childrenColumnName', 'scrollX']),
flattenColumns = _useContext.flattenColumns,
onColumnResize = _useContext.onColumnResize,
getRowKey = _useContext.getRowKey,
expandedKeys = _useContext.expandedKeys,
prefixCls = _useContext.prefixCls,
childrenColumnName = _useContext.childrenColumnName,
scrollX = _useContext.scrollX;
var _useContext2 = (0, _context.useContext)(_context2.StaticContext),
sticky = _useContext2.sticky,
scrollY = _useContext2.scrollY,
listItemHeight = _useContext2.listItemHeight,
getComponent = _useContext2.getComponent,
onTablePropScroll = _useContext2.onScroll;
// =========================== Ref ============================
var listRef = React.useRef();
// =========================== Data ===========================
var flattenData = (0, _useFlattenRecords.default)(data, childrenColumnName, expandedKeys, getRowKey);
// ========================== Column ==========================
var columnsWidth = React.useMemo(function () {
var total = 0;
return flattenColumns.map(function (_ref) {
var width = _ref.width,
key = _ref.key;
total += width;
return [key, width, total];
});
}, [flattenColumns]);
var columnsOffset = React.useMemo(function () {
return columnsWidth.map(function (colWidth) {
return colWidth[2];
});
}, [columnsWidth]);
React.useEffect(function () {
columnsWidth.forEach(function (_ref2) {
var _ref3 = (0, _slicedToArray2.default)(_ref2, 2),
key = _ref3[0],
width = _ref3[1];
onColumnResize(key, width);
});
}, [columnsWidth]);
// =========================== Ref ============================
React.useImperativeHandle(ref, function () {
var _listRef$current2;
var obj = {
scrollTo: function scrollTo(config) {
var _listRef$current;
(_listRef$current = listRef.current) === null || _listRef$current === void 0 || _listRef$current.scrollTo(config);
},
nativeElement: (_listRef$current2 = listRef.current) === null || _listRef$current2 === void 0 ? void 0 : _listRef$current2.nativeElement
};
Object.defineProperty(obj, 'scrollLeft', {
get: function get() {
var _listRef$current3;
return ((_listRef$current3 = listRef.current) === null || _listRef$current3 === void 0 ? void 0 : _listRef$current3.getScrollInfo().x) || 0;
},
set: function set(value) {
var _listRef$current4;
(_listRef$current4 = listRef.current) === null || _listRef$current4 === void 0 || _listRef$current4.scrollTo({
left: value
});
}
});
return obj;
});
// ======================= Col/Row Span =======================
var getRowSpan = function getRowSpan(column, index) {
var _flattenData$index;
var record = (_flattenData$index = flattenData[index]) === null || _flattenData$index === void 0 ? void 0 : _flattenData$index.record;
var onCell = column.onCell;
if (onCell) {
var _cellProps$rowSpan;
var cellProps = onCell(record, index);
return (_cellProps$rowSpan = cellProps === null || cellProps === void 0 ? void 0 : cellProps.rowSpan) !== null && _cellProps$rowSpan !== void 0 ? _cellProps$rowSpan : 1;
}
return 1;
};
var extraRender = function extraRender(info) {
var start = info.start,
end = info.end,
getSize = info.getSize,
offsetY = info.offsetY;
// Do nothing if no data
if (end < 0) {
return null;
}
// Find first rowSpan column
var firstRowSpanColumns = flattenColumns.filter(
// rowSpan is 0
function (column) {
return getRowSpan(column, start) === 0;
});
var startIndex = start;
var _loop = function _loop(i) {
firstRowSpanColumns = firstRowSpanColumns.filter(function (column) {
return getRowSpan(column, i) === 0;
});
if (!firstRowSpanColumns.length) {
startIndex = i;
return 1; // break
}
};
for (var i = start; i >= 0; i -= 1) {
if (_loop(i)) break;
}
// Find last rowSpan column
var lastRowSpanColumns = flattenColumns.filter(
// rowSpan is not 1
function (column) {
return getRowSpan(column, end) !== 1;
});
var endIndex = end;
var _loop2 = function _loop2(_i) {
lastRowSpanColumns = lastRowSpanColumns.filter(function (column) {
return getRowSpan(column, _i) !== 1;
});
if (!lastRowSpanColumns.length) {
endIndex = Math.max(_i - 1, end);
return 1; // break
}
};
for (var _i = end; _i < flattenData.length; _i += 1) {
if (_loop2(_i)) break;
}
// Collect the line who has rowSpan
var spanLines = [];
var _loop3 = function _loop3(_i2) {
var item = flattenData[_i2];
// This code will never reach, just incase
if (!item) {
return 1; // continue
}
if (flattenColumns.some(function (column) {
return getRowSpan(column, _i2) > 1;
})) {
spanLines.push(_i2);
}
};
for (var _i2 = startIndex; _i2 <= endIndex; _i2 += 1) {
if (_loop3(_i2)) continue;
}
// Patch extra line on the page
var nodes = spanLines.map(function (index) {
var item = flattenData[index];
var rowKey = getRowKey(item.record, index);
var getHeight = function getHeight(rowSpan) {
var endItemIndex = index + rowSpan - 1;
var endItemKey = getRowKey(flattenData[endItemIndex].record, endItemIndex);
var sizeInfo = getSize(rowKey, endItemKey);
return sizeInfo.bottom - sizeInfo.top;
};
var sizeInfo = getSize(rowKey);
return /*#__PURE__*/React.createElement(_BodyLine.default, {
key: index,
data: item,
rowKey: rowKey,
index: index,
style: {
top: -offsetY + sizeInfo.top
},
extra: true,
getHeight: getHeight
});
});
return nodes;
};
// ========================= Context ==========================
var gridContext = React.useMemo(function () {
return {
columnsOffset: columnsOffset
};
}, [columnsOffset]);
// ========================== Render ==========================
var tblPrefixCls = "".concat(prefixCls, "-tbody");
// default 'div' in rc-virtual-list
var wrapperComponent = getComponent(['body', 'wrapper']);
// ========================== Sticky Scroll Bar ==========================
var horizontalScrollBarStyle = {};
if (sticky) {
horizontalScrollBarStyle.position = 'sticky';
horizontalScrollBarStyle.bottom = 0;
if ((0, _typeof2.default)(sticky) === 'object' && sticky.offsetScroll) {
horizontalScrollBarStyle.bottom = sticky.offsetScroll;
}
}
return /*#__PURE__*/React.createElement(_context2.GridContext.Provider, {
value: gridContext
}, /*#__PURE__*/React.createElement(_rcVirtualList.default, {
fullHeight: false,
ref: listRef,
prefixCls: "".concat(tblPrefixCls, "-virtual"),
styles: {
horizontalScrollBar: horizontalScrollBarStyle
},
className: tblPrefixCls,
height: scrollY,
itemHeight: listItemHeight || 24,
data: flattenData,
itemKey: function itemKey(item) {
return getRowKey(item.record);
},
component: wrapperComponent,
scrollWidth: scrollX,
onVirtualScroll: function onVirtualScroll(_ref4) {
var _listRef$current5;
var x = _ref4.x;
onScroll({
currentTarget: (_listRef$current5 = listRef.current) === null || _listRef$current5 === void 0 ? void 0 : _listRef$current5.nativeElement,
scrollLeft: x
});
},
onScroll: onTablePropScroll,
extraRender: extraRender
}, function (item, index, itemProps) {
var rowKey = getRowKey(item.record, index);
return /*#__PURE__*/React.createElement(_BodyLine.default, {
data: item,
rowKey: rowKey,
index: index,
style: itemProps.style
});
}));
});
var ResponseGrid = (0, _TableContext.responseImmutable)(Grid);
if (process.env.NODE_ENV !== 'production') {
ResponseGrid.displayName = 'ResponseGrid';
}
var _default = exports.default = ResponseGrid;