UNPKG

@visactor/vtable

Version:

canvas table width high performance

208 lines (197 loc) 11.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.updateCol = void 0; const vutils_1 = require("@visactor/vutils"), group_1 = require("../graphic/group"), cell_helper_1 = require("../group-creater/cell-helper"), get_cell_merge_1 = require("../utils/get-cell-merge"); function updateCol(removeCells, addCells, updateCells, table) { var _a, _b; const scene = table.scenegraph, removeCols = deduplication(removeCells.map((cell => cell.col))).sort(((a, b) => b - a)), addCols = deduplication(addCells.map((cell => cell.col))).sort(((a, b) => a - b)), updateCols = deduplication(updateCells.map((cell => cell.col))).sort(((a, b) => a - b)); removeCols.forEach((col => { removeCol(col, scene); })); const colWidthsMap = table.colWidthsMap; let updateAfter; if (removeCols.forEach((col => { colWidthsMap.delAndReorder(col); })), removeCols.length && resetColNumber(scene), scene.table._clearColRangeWidthsMap(), addCols.forEach((col => { const needUpdateAfter = addCol(col, scene); resetColNumber(scene), updateAfter = null != updateAfter ? updateAfter : needUpdateAfter, colWidthsMap.addAndReorder(col); })), resetColNumberAndX(scene), updateCols.forEach((col => { for (let row = 0; row < table.rowCount; row++) { const mergeInfo = (0, get_cell_merge_1.getCellMergeInfo)(scene.table, col, row); if (mergeInfo) for (let col = mergeInfo.start.col; col <= mergeInfo.end.col; col++) for (let col = mergeInfo.start.col; col <= mergeInfo.end.col; col++) (0, cell_helper_1.updateCell)(col, row, scene.table, !1); else (0, cell_helper_1.updateCell)(col, row, scene.table, !1); } })), (0, vutils_1.isNumber)(updateAfter)) { for (let col = updateAfter; col < Math.max(table.colCount, null !== (_a = table.internalProps._oldColCount) && void 0 !== _a ? _a : table.colCount); col++) for (let row = 0; row < Math.max(table.rowCount, null !== (_b = table.internalProps._oldRowCount) && void 0 !== _b ? _b : table.rowCount); row++) { const cellGroup = scene.highPerformanceGetCell(col, row, !0); cellGroup && (cellGroup.needUpdate = !0); } scene.proxy.colUpdatePos = updateAfter; } if (addCols.length) { if (!(0, vutils_1.isNumber)(updateAfter)) { const minCol = Math.min(...addCols); scene.proxy.colUpdatePos = minCol; } scene.proxy.colUpdateDirection = "left", scene.proxy.updateColGroups(2 * scene.proxy.screenColCount), updateRightFrozeCellGroups(), scene.proxy.progress(); } else removeCols.length && (scene.proxy.updateColGroups(2 * scene.proxy.screenColCount), updateRightFrozeCellGroups(), scene.proxy.progress()); const newTotalWidth = table.getColsWidth(table.frozenColCount, table.colCount - 1); function updateRightFrozeCellGroups() { if ((null == addCols ? void 0 : addCols[(null == addCols ? void 0 : addCols.length) - 1]) >= table.colCount - table.rightFrozenColCount || (null == updateCols ? void 0 : updateCols[(null == updateCols ? void 0 : updateCols.length) - 1]) >= table.colCount - table.rightFrozenColCount || (null == removeCols ? void 0 : removeCols[0]) >= table.colCount - table.rightFrozenColCount) { for (let col = table.colCount - table.rightFrozenColCount; col < table.colCount; col++) for (let row = 0; row < table.rowCount; row++) { const cellGroup = scene.highPerformanceGetCell(col, row, !0); cellGroup && (cellGroup.needUpdate = !0); } scene.proxy.updateRightFrozenCellGroups(); } } scene.updateContainerWidth(scene.table.frozenColCount, newTotalWidth - scene.bodyGroup.attribute.width); } function removeCol(col, scene) { const proxy = scene.proxy; if (col >= scene.table.rowHeaderLevelCount) if (col >= scene.table.colCount - scene.table.rightFrozenColCount) ; else { const colGroup = scene.getColGroup(col, !1); colGroup && colGroup.parent === scene.bodyGroup && scene.bodyGroup.removeChild(colGroup); const bottomColGroup = scene.getColGroupInBottom(col); bottomColGroup && bottomColGroup.parent === scene.bottomFrozenGroup && scene.bottomFrozenGroup.removeChild(bottomColGroup); const headerColGroup = scene.getColGroup(col, !0); headerColGroup && headerColGroup.parent === scene.colHeaderGroup && scene.colHeaderGroup.removeChild(headerColGroup); } col >= proxy.colStart && col <= proxy.colEnd && (proxy.colEnd--, proxy.currentCol--), proxy.bodyRightCol--; const totalActualBodyColCount = Math.min(proxy.colLimit, proxy.bodyRightCol - proxy.bodyLeftCol + 1); proxy.totalActualBodyColCount = totalActualBodyColCount, proxy.totalCol = proxy.colStart + totalActualBodyColCount - 1; } function addCol(col, scene) { const proxy = scene.proxy; proxy.bodyRightCol++; const totalActualBodyColCount = Math.min(proxy.colLimit, proxy.bodyRightCol - proxy.bodyLeftCol + 1); if (proxy.totalActualBodyColCount = totalActualBodyColCount, proxy.totalCol = proxy.colStart + totalActualBodyColCount - 1, !(col < proxy.colStart)) return col > proxy.colEnd ? proxy.colEnd - proxy.colStart + 1 < proxy.colLimit ? (proxy.colEnd++, proxy.currentCol++, addColGroup(col, scene), col) : void 0 : proxy.colEnd - proxy.colStart + 1 < proxy.colLimit ? (proxy.colEnd++, proxy.currentCol++, addColGroup(col, scene), col) : col; } function deduplication(array) { const result = []; for (let i = 0; i < array.length; i++) -1 === result.indexOf(array[i]) && result.push(array[i]); return result; } function resetColNumber(scene) { let colIndex = scene.bodyColStart; function processCell(cellGroup) { cellGroup.col = colIndex; const merge = (0, get_cell_merge_1.getCellMergeInfo)(scene.table, cellGroup.col, cellGroup.row); merge && (cellGroup.mergeStartCol = merge.start.col, cellGroup.mergeStartCol = merge.start.col, cellGroup.mergeEndCol = merge.end.col, cellGroup.mergeEndCol = merge.end.col), cellGroup.role; } scene.bodyGroup.forEachChildren((colGroup => { colGroup.col = colIndex, null == colGroup || colGroup.forEachChildren((cellGroup => { processCell(cellGroup); })), colIndex++; })), colIndex = scene.bodyColStart, scene.colHeaderGroup.forEachChildren((colGroup => { colGroup.col = colIndex, null == colGroup || colGroup.forEachChildren((cellGroup => { processCell(cellGroup); })), colIndex++; })), colIndex = scene.bodyColStart, scene.bottomFrozenGroup.forEachChildren((colGroup => { colGroup.col = colIndex, null == colGroup || colGroup.forEachChildren((cellGroup => { processCell(cellGroup); })), colIndex++; })); } function resetColNumberAndX(scene) { let colIndex = scene.bodyColStart, x = scene.getCellGroupX(colIndex); function processCell(cellGroup) { cellGroup.col = colIndex; const merge = (0, get_cell_merge_1.getCellMergeInfo)(scene.table, cellGroup.col, cellGroup.row); merge && (cellGroup.mergeStartCol = merge.start.col, cellGroup.mergeStartCol = merge.start.col, cellGroup.mergeEndCol = merge.end.col, cellGroup.mergeEndCol = merge.end.col), cellGroup.role; } scene.bodyGroup.forEachChildren((colGroup => { colGroup.col = colIndex, null == colGroup || colGroup.forEachChildren((cellGroup => { processCell(cellGroup); })), colGroup.setAttribute("x", x), x += colGroup.attribute.width, colIndex++; })), colIndex = scene.bodyColStart, x = scene.getCellGroupX(colIndex), scene.colHeaderGroup.forEachChildren((colGroup => { colGroup.col = colIndex, null == colGroup || colGroup.forEachChildren((cellGroup => { processCell(cellGroup); })), colGroup.setAttribute("x", x), x += colGroup.attribute.width, colIndex++; })), colIndex = scene.bodyColStart, x = scene.getCellGroupX(colIndex), scene.bottomFrozenGroup.forEachChildren((colGroup => { colGroup.col = colIndex, null == colGroup || colGroup.forEachChildren((cellGroup => { processCell(cellGroup); })), colGroup.setAttribute("x", x), x += colGroup.attribute.width, colIndex++; })), colIndex = scene.table.colCount - scene.table.rightFrozenColCount, x = 0, scene.rightFrozenGroup.forEachChildren((colGroup => { colGroup.col = colIndex, null == colGroup || colGroup.forEachChildren((cellGroup => { processCell(cellGroup); })), colGroup.setAttribute("x", x), x += colGroup.attribute.width, colIndex++; })), colIndex = scene.table.colCount - scene.table.rightFrozenColCount, x = 0, scene.rightTopCornerGroup.forEachChildren((colGroup => { colGroup.col = colIndex, null == colGroup || colGroup.forEachChildren((cellGroup => { processCell(cellGroup); })), colGroup.setAttribute("x", x), x += colGroup.attribute.width, colIndex++; })), colIndex = scene.table.colCount - scene.table.rightFrozenColCount, x = 0, scene.rightBottomCornerGroup.forEachChildren((colGroup => { colGroup.col = colIndex, null == colGroup || colGroup.forEachChildren((cellGroup => { processCell(cellGroup); })), colGroup.setAttribute("x", x), x += colGroup.attribute.width, colIndex++; })); } function addColGroup(col, scene) { if (scene.colHeaderGroup && scene.table.columnHeaderLevelCount > 0) { const columnGroup = new group_1.Group({ x: 0, y: 0, width: scene.table.getColWidth(col), height: 0, clip: !1, pickable: !1 }); columnGroup.role = "column", columnGroup.col = col; const colAfter = scene.getColGroup(col, !0); colAfter ? scene.colHeaderGroup.insertBefore(columnGroup, colAfter) : scene.colHeaderGroup.appendChild(columnGroup), generateCellGroup(columnGroup, col, 0, scene.table.columnHeaderLevelCount - 1); } if (scene.bodyGroup) { const columnGroup = new group_1.Group({ x: 0, y: 0, width: scene.table.getColWidth(col), height: 0, clip: !1, pickable: !1 }); columnGroup.role = "column", columnGroup.col = col; const colAfter = scene.getColGroup(col, !1); colAfter ? scene.bodyGroup.insertBefore(columnGroup, colAfter) : scene.bodyGroup.appendChild(columnGroup), generateCellGroup(columnGroup, col, scene.bodyRowStart, scene.bodyRowEnd); } if (scene.bottomFrozenGroup && scene.table.bottomFrozenRowCount > 0) { const columnGroup = new group_1.Group({ x: 0, y: 0, width: scene.table.getColWidth(col), height: 0, clip: !1, pickable: !1 }); columnGroup.role = "column", columnGroup.col = col; const colAfter = scene.getColGroupInBottom(col); colAfter ? scene.bottomFrozenGroup.insertBefore(columnGroup, colAfter) : scene.bottomFrozenGroup.appendChild(columnGroup), generateCellGroup(columnGroup, col, scene.table.rowCount - scene.table.bottomFrozenRowCount, scene.table.rowCount - 1); } function generateCellGroup(group, col, rowStart, rowEnd) { for (let row = rowStart; row <= rowEnd; row++) { const cellGroup = new group_1.Group({ x: 0, y: 0, width: scene.table.getColWidth(col), height: scene.table.getRowHeight(row) }); cellGroup.role = "cell", cellGroup.col = col, cellGroup.row = row, cellGroup.needUpdate = !0, group.appendChild(cellGroup); } } } exports.updateCol = updateCol; //# sourceMappingURL=update-col.js.map