UNPKG

@antv/s2

Version:

effective spreadsheet render core lib

236 lines 9.18 kB
import { isNumber } from 'lodash'; import { FrozenGroupArea, ROOT_NODE_ID } from '../../common'; import { Node } from '../layout/node'; import { Frame } from './frame'; export const getSeriesNumberNodes = (rowsHierarchy, seriesNumberWidth, spreadsheet) => { const isHierarchyTreeType = spreadsheet.isHierarchyTreeType(); const rootNodes = rowsHierarchy.getNodes(0); return rootNodes.map((node, idx) => { const value = `${idx + 1}`; const sNode = new Node({ id: value, field: '', rowIndex: idx, value, }); sNode.x = node.x; sNode.y = node.y; sNode.width = seriesNumberWidth; sNode.height = isHierarchyTreeType ? node.getTotalHeightForTreeHierarchy() : node.height; sNode.isLeaf = true; sNode.relatedNode = node; sNode.spreadsheet = spreadsheet; return sNode; }); }; const getAllParents = (nodes) => { const parents = nodes.reduce((pre, leaf) => { let parent = leaf.parent; while (parent && parent.id !== ROOT_NODE_ID) { // eslint-disable-next-line no-loop-func if (!pre.find((node) => node.id === parent.id)) { pre.push(parent); } parent = parent.parent; } return pre; }, []); return parents; }; const clipFrozenRowHeadNode = (node, { y = 0, height = 0 }) => { if (node.y < y) { node.height -= y - node.y; node.y = y; } if (node.y + node.height > y + height) { node.height -= node.y + node.height - y - height; } }; const clipFrozenTrailingRowHeadNode = (node, { y = 0, height = 0 }) => { if (node.y + node.height > y + height) { node.height -= node.y + node.height - y - height; } if (node.y < y) { node.height -= y - node.y; node.y = y; } }; export const getExtraFrozenRowNodes = (facet) => { const extraNodes = []; const { start, end } = facet.getCellRange(); const { rowCount, trailingRowCount } = facet.getFrozenOptions(); if (rowCount) { const frozenLeafNodes = facet.getRowLeafNodesByRange(start, start + rowCount - 1); frozenLeafNodes.forEach((leafNode) => { const newLeafNode = leafNode.clone(); newLeafNode.isFrozenHead = true; extraNodes.push(newLeafNode); }); const parents = getAllParents(frozenLeafNodes); parents.forEach((parent) => { const newParent = parent.clone(); newParent.isFrozenHead = true; clipFrozenRowHeadNode(newParent, facet.frozenGroupAreas[FrozenGroupArea.Row]); extraNodes.push(newParent); }); } if (trailingRowCount) { const frozenLeafNodes = facet.getRowLeafNodesByRange(end - trailingRowCount + 1, end); frozenLeafNodes.forEach((leafNode) => { const newLeafNode = leafNode.clone(); newLeafNode.isFrozenTrailing = true; extraNodes.push(newLeafNode); }); const parents = getAllParents(frozenLeafNodes); parents.forEach((parent) => { const newParent = parent.clone(); newParent.isFrozenTrailing = true; clipFrozenTrailingRowHeadNode(newParent, facet.frozenGroupAreas[FrozenGroupArea.TrailingRow]); extraNodes.push(newParent); }); } return extraNodes; }; export const getExtraFrozenSeriesNodes = (facet, nodes) => { const extraNodes = []; const { start, end } = facet.getCellRange(); const { rowCount, trailingRowCount } = facet.getFrozenOptions(); const includeChildInRowIndexRange = (node, range) => { var _a; const rowIdx = node.rowIndex; if (isNumber(rowIdx) && rowIdx >= range[0] && rowIdx <= range[1]) { return true; } const children = (_a = node.children) !== null && _a !== void 0 ? _a : []; for (let i = 0; i < children.length; i++) { if (includeChildInRowIndexRange(children[i], range)) { return true; } } return false; }; if (rowCount) { const range = [start, start + rowCount - 1]; nodes.forEach((node) => { if (node.relatedNode && !includeChildInRowIndexRange(node.relatedNode, range)) { return; } const newNode = node.clone(); newNode.isFrozenHead = true; clipFrozenRowHeadNode(newNode, facet.frozenGroupAreas[FrozenGroupArea.Row]); extraNodes.push(newNode); }); } if (trailingRowCount) { const range = [end - trailingRowCount + 1, end]; nodes.forEach((node) => { if (node.relatedNode && !includeChildInRowIndexRange(node.relatedNode, range)) { return; } const newNode = node.clone(); newNode.isFrozenTrailing = true; clipFrozenTrailingRowHeadNode(newNode, facet.frozenGroupAreas[FrozenGroupArea.TrailingRow]); extraNodes.push(newNode); }); } return extraNodes; }; export const getExtraFrozenColNodes = (facet) => { const extraNodes = []; const { colCount, trailingColCount } = facet.getFrozenOptions(); if (colCount) { const { x, width } = facet.frozenGroupAreas[FrozenGroupArea.Col]; const frozenLeafNodes = facet.getColLeafNodesByRange(0, colCount - 1); frozenLeafNodes.forEach((leafNode) => { const newLeafNode = leafNode.clone(); newLeafNode.isFrozenHead = true; extraNodes.push(newLeafNode); }); const parents = getAllParents(frozenLeafNodes); parents.forEach((parent) => { const newParent = parent.clone(); newParent.isFrozenHead = true; if (newParent.x < x) { newParent.width -= x - newParent.x; newParent.x = x; } if (newParent.x + newParent.width > x + width) { newParent.width -= newParent.x + newParent.width - x - width; } extraNodes.push(newParent); }); } if (trailingColCount) { const { x, width } = facet.frozenGroupAreas[FrozenGroupArea.TrailingCol]; const total = facet.getColLeafNodes().length; const frozenLeafNodes = facet.getColLeafNodesByRange(total - trailingColCount, total - 1); frozenLeafNodes.forEach((leafNode) => { const newLeafNode = leafNode.clone(); newLeafNode.isFrozenTrailing = true; extraNodes.push(newLeafNode); }); const parents = getAllParents(frozenLeafNodes); parents.forEach((parent) => { const newParent = parent.clone(); newParent.isFrozenTrailing = true; if (newParent.x + newParent.width > x + width) { newParent.width -= newParent.x + newParent.width - x - width; } if (newParent.x < x) { newParent.width -= x - newParent.x; newParent.x = x; } extraNodes.push(newParent); }); } return extraNodes; }; export const getFrozenColOffset = (facet, cornerWidth = 0, scrollX = 0) => { const isFrozenRowHeader = facet.spreadsheet.isFrozenRowHeader(); if (isFrozenRowHeader) { return 0; } return scrollX <= cornerWidth ? scrollX : cornerWidth; }; export const getFrozenTrailingColOffset = (facet, viewportWidth) => { const trailingCol = facet.frozenGroupAreas[FrozenGroupArea.TrailingCol]; const trailingColWidth = trailingCol.x + trailingCol.width; const trailingColOffset = viewportWidth > trailingColWidth ? 0 : trailingColWidth - viewportWidth; return trailingColOffset; }; export const getFrozenTrailingRowOffset = (facet, viewportHeight, paginationScrollY) => { const trailingRow = facet.frozenGroupAreas[FrozenGroupArea.TrailingRow]; const trailingRowHeight = trailingRow.y + trailingRow.height - paginationScrollY; const trailingRowOffset = viewportHeight > trailingRowHeight ? paginationScrollY : paginationScrollY + trailingRowHeight - viewportHeight; return trailingRowOffset; }; export const getScrollGroupClip = (facet, position) => { const isFrozenRowHeader = facet.spreadsheet.isFrozenRowHeader(); const frozenGroupAreas = facet.frozenGroupAreas; const frozenColGroupWidth = frozenGroupAreas[FrozenGroupArea.Col].width; const frozenTrailingColGroupWidth = frozenGroupAreas[FrozenGroupArea.TrailingCol].width; let x; if (isFrozenRowHeader) { x = position.x + frozenColGroupWidth; } else if (frozenColGroupWidth) { x = Frame.getVerticalBorderWidth(facet.spreadsheet) + frozenColGroupWidth; } else { x = 0; } const viewportWidth = facet.panelBBox.viewportWidth; return { x, width: (isFrozenRowHeader ? viewportWidth : position.x + viewportWidth) - frozenColGroupWidth - frozenTrailingColGroupWidth, }; }; //# sourceMappingURL=util.js.map