@visactor/vtable
Version:
canvas table width high performance
248 lines (229 loc) • 18.6 kB
JavaScript
import { Factory } from "../../core/factory";
import { getStyleTheme } from "../../core/tableHelper";
import { CUSTOM_CONTAINER_NAME, CUSTOM_MERGE_CONTAINER_NAME, dealWithCustom } from "../component/custom";
import { updateImageCellContentWhileResize } from "../group-creater/cell-type/image-cell";
import { resizeCellGroup, getCustomCellMergeCustom } from "../group-creater/cell-helper";
import { getCellMergeInfo } from "../utils/get-cell-merge";
import { getProp } from "../utils/get-prop";
import { isMergeCellGroup } from "../utils/is-merge-cell-group";
import { getQuadProps } from "../utils/padding";
import { updateCellContentWidth } from "../utils/text-icon-layout";
import { computeRowHeight } from "./compute-row-height";
import { updateCellHeightForRow } from "./update-height";
import { getHierarchyOffset } from "../utils/get-hierarchy-offset";
import { getCellMergeRange } from "../../tools/merge-range";
export function updateColWidth(scene, col, detaX, skipTableWidthMap) {
skipTableWidthMap || scene.table._setColWidth(col, scene.table.getColWidth(col) + detaX, !0);
const colOrCornerHeaderColumn = scene.getColGroup(col, !0), rightTopColumn = scene.getColGroupInRightTopCorner(col);
colOrCornerHeaderColumn && !rightTopColumn && updateColunmWidth(colOrCornerHeaderColumn, detaX, "col-corner", scene),
rightTopColumn && updateColunmWidth(rightTopColumn, detaX, "right-top", scene);
const rowHeaderOrBodyColumn = scene.getColGroup(col);
rowHeaderOrBodyColumn && updateColunmWidth(rowHeaderOrBodyColumn, detaX, "row-body", scene);
const leftBottomColumn = scene.getColGroupInLeftBottomCorner(col);
leftBottomColumn && updateColunmWidth(leftBottomColumn, detaX, "left-bottom", scene);
const bottomColumn = scene.getColGroupInBottom(col);
bottomColumn && updateColunmWidth(bottomColumn, detaX, "bottom", scene);
const rightBottomColumn = scene.getColGroupInRightBottomCorner(col);
rightBottomColumn && updateColunmWidth(rightBottomColumn, detaX, "right-bottom", scene),
col < scene.frozenColCount ? (scene.cornerHeaderGroup.forEachChildrenSkipChild(((column, index) => {
column.col > col && column.setAttribute("x", column.attribute.x + detaX);
})), scene.rowHeaderGroup.forEachChildrenSkipChild(((column, index) => {
column.col > col && column.setAttribute("x", column.attribute.x + detaX);
}))) : (scene.colHeaderGroup.forEachChildrenSkipChild(((column, index) => {
column.col > col && column.setAttribute("x", column.attribute.x + detaX);
})), scene.bodyGroup.forEachChildrenSkipChild(((column, index) => {
column.col > col && column.setAttribute("x", column.attribute.x + detaX);
}))), leftBottomColumn && scene.leftBottomCornerGroup.forEachChildrenSkipChild(((column, index) => {
column.col > col && column.setAttribute("x", column.attribute.x + detaX);
})), bottomColumn && scene.bottomFrozenGroup.forEachChildrenSkipChild(((column, index) => {
column.col > col && column.setAttribute("x", column.attribute.x + detaX);
})), rightBottomColumn && scene.rightBottomCornerGroup.forEachChildrenSkipChild(((column, index) => {
column.col > col && column.setAttribute("x", column.attribute.x + detaX);
}));
}
function updateColunmWidth(columnGroup, detaX, mode, scene) {
var _a, _b, _c, _d, _e, _f, _g;
let needRerangeRow = !1;
const oldColumnWidth = null !== (_a = null == columnGroup ? void 0 : columnGroup.attribute.width) && void 0 !== _a ? _a : 0;
if (null == columnGroup || columnGroup.setAttribute("width", oldColumnWidth + detaX),
null == columnGroup || columnGroup.forEachChildren(((cell, index) => {
if (updateCellWidth(scene, cell, cell.col, cell.row, oldColumnWidth, oldColumnWidth + detaX, detaX, "row-body" !== mode || cell.col < scene.table.rowHeaderLevelCount, scene.table.internalProps.autoWrapText)) {
const mergeInfo = getCellMergeInfo(scene.table, cell.col, cell.row);
if (mergeInfo && mergeInfo.end.row - mergeInfo.start.row) for (let row = mergeInfo.start.row; row <= mergeInfo.end.row; row++) resetRowHeight(scene, row); else resetRowHeight(scene, cell.row);
needRerangeRow = !0;
}
})), needRerangeRow) {
let colGroup, oldContainerHeight, row, newTotalHeight = 0;
for (let col = 0; col < scene.table.colCount; col++) {
if ("col-corner" === mode ? (row = 0, colGroup = scene.getColGroup(col, !0), oldContainerHeight = null !== (_b = scene.colHeaderGroup.attribute.height) && void 0 !== _b ? _b : 0) : "row-body" === mode ? (row = scene.table.frozenRowCount,
colGroup = scene.getColGroup(col, !1), oldContainerHeight = null !== (_c = scene.bodyGroup.attribute.height) && void 0 !== _c ? _c : 0) : "bottom" === mode ? (row = scene.table.rowCount - scene.table.bottomFrozenRowCount,
colGroup = scene.getColGroupInBottom(col), oldContainerHeight = null !== (_d = scene.bottomFrozenGroup.attribute.height) && void 0 !== _d ? _d : 0) : "left-bottom" === mode ? (row = scene.table.rowCount - scene.table.bottomFrozenRowCount,
colGroup = scene.getColGroupInLeftBottomCorner(col), oldContainerHeight = null !== (_e = scene.leftBottomCornerGroup.attribute.height) && void 0 !== _e ? _e : 0) : "right-top" === mode ? (row = 0,
colGroup = scene.getColGroupInRightTopCorner(col), oldContainerHeight = null !== (_f = scene.rightTopCornerGroup.attribute.height) && void 0 !== _f ? _f : 0) : "right-bottom" === mode && (row = scene.table.rowCount - scene.table.bottomFrozenRowCount,
colGroup = scene.getColGroupInRightBottomCorner(col), oldContainerHeight = null !== (_g = scene.rightBottomCornerGroup.attribute.height) && void 0 !== _g ? _g : 0),
!colGroup) continue;
let y = 0;
colGroup.forEachChildren((cellGroup => {
var _a;
cellGroup.setAttribute("y", y), y += null !== (_a = scene.table.getRowHeight(cellGroup.row)) && void 0 !== _a ? _a : 0;
})), newTotalHeight = y;
}
scene.updateContainerHeight(row, newTotalHeight - oldContainerHeight);
for (let col = 0; col < scene.table.frozenColCount; col++) {
const leftBottomFrozenColumnGroup = scene.getColGroupInLeftBottomCorner(col);
let y = 0;
null == leftBottomFrozenColumnGroup || leftBottomFrozenColumnGroup.forEachChildren((cellGroup => {
cellGroup.setAttribute("y", y), y += scene.table.getRowHeight(cellGroup.row);
}));
}
for (let col = scene.table.colCount - scene.table.rightFrozenColCount; col < scene.table.colCount; col++) {
const rightBottomFrozenColumnGroup = scene.getColGroupInRightBottomCorner(col);
let y = 0;
null == rightBottomFrozenColumnGroup || rightBottomFrozenColumnGroup.forEachChildren((cellGroup => {
cellGroup.setAttribute("y", y), y += scene.table.getRowHeight(cellGroup.row);
}));
}
for (let col = scene.table.frozenColCount; col < scene.table.colCount - scene.table.rightFrozenColCount; col++) {
const rightBottomFrozenColumnGroup = scene.getColGroupInBottom(col);
let y = 0;
null == rightBottomFrozenColumnGroup || rightBottomFrozenColumnGroup.forEachChildren((cellGroup => {
cellGroup.setAttribute("y", y), y += scene.table.getRowHeight(cellGroup.row);
}));
}
}
}
function updateCellWidth(scene, cell, col, row, oldWidth, distWidth, detaX, isHeader, autoWrapText) {
var _a, _b, _c, _d, _e, _f, _g;
if (cell.attribute.width === distWidth && !cell.needUpdateWidth) return !1;
cell.needUpdateWidth = !1, cell.setAttribute("width", distWidth);
const cellGroup = cell;
if (!cellGroup) return !1;
const autoRowHeight = scene.table.isAutoRowHeight(row), isVtableMerge = null === (_a = scene.table.getCellRawRecord(col, row)) || void 0 === _a ? void 0 : _a.vtableMerge, isCustomMerge = !!scene.table.getCustomMerge(col, row), type = isVtableMerge || isCustomMerge ? "text" : scene.table.isHeader(col, row) ? null !== (_b = scene.table._getHeaderLayoutMap(col, row).headerType) && void 0 !== _b ? _b : "text" : null !== (_c = scene.table.getBodyColumnType(col, row)) && void 0 !== _c ? _c : "text";
let isHeightChange = !1;
if ("progressbar" === type) {
const columnDefine = scene.table.getBodyColumnDefine(col, row), style = scene.table._getCellStyle(col, row), value = scene.table.getCellValue(col, row), dataValue = scene.table.getCellOriginValue(col, row), padding = getQuadProps(getProp("padding", style, col, row, scene.table));
let range;
(null == columnDefine ? void 0 : columnDefine.mergeCell) && (range = scene.table.getCellRange(col, row));
const newBarCell = Factory.getFunction("createProgressBarCell")(columnDefine, style, cellGroup.attribute.width, value, dataValue, col, row, padding, scene.table, range), oldBarCell = cellGroup.getChildByName("progress-bar");
cellGroup.insertBefore(newBarCell, oldBarCell), cellGroup.removeChild(oldBarCell),
oldBarCell.removeAllChild(), oldBarCell.release();
const cellChange = updateMergeCellContentWidth(cellGroup, distWidth, detaX, autoRowHeight, !0, scene.table);
isHeightChange = isHeightChange || cellChange;
} else if ("sparkline" === type) {
cellGroup.removeAllChild();
const headerStyle = scene.table._getCellStyle(col, row), padding = getQuadProps(getProp("padding", headerStyle, col, row, scene.table));
Factory.getFunction("createSparkLineCellGroup")(cellGroup, cellGroup.parent, cellGroup.attribute.x, cellGroup.attribute.y, col, row, cellGroup.attribute.width, cellGroup.attribute.height, padding, scene.table, getStyleTheme(headerStyle, scene.table, col, row, getProp).theme, !1);
} else if ("image" === type || "video" === type) updateImageCellContentWhileResize(cellGroup, col, row, detaX, 0, scene.table); else if ("axis" === (null === (_d = cellGroup.firstChild) || void 0 === _d ? void 0 : _d.name)) {
const axisConfig = scene.table.internalProps.layoutMap.getAxisConfigInPivotChart(col, row), cellStyle = scene.table._getCellStyle(col, row), padding = getQuadProps(getProp("padding", cellStyle, col, row, scene.table));
if (axisConfig) {
const axis = new (Factory.getComponent("axis"))(axisConfig, cellGroup.attribute.width, cellGroup.attribute.height, null !== (_e = axisConfig.__vtablePadding) && void 0 !== _e ? _e : padding, scene.table);
cellGroup.clear(), cellGroup.appendChild(axis.component), axis.overlap();
}
} else if ("axis" === (null === (_f = cell.firstChild) || void 0 === _f ? void 0 : _f.name)) null === (_g = cell.firstChild) || void 0 === _g || _g.originAxis.resize(cell.attribute.width, cell.attribute.height); else {
let renderDefault = !0;
const customContainer = cell.getChildByName(CUSTOM_CONTAINER_NAME) || cell.getChildByName(CUSTOM_MERGE_CONTAINER_NAME);
if (customContainer) {
let customElementsGroup;
cell.removeChild(customContainer);
const customMergeRange = getCustomCellMergeCustom(col, row, cell, scene.table);
if (customMergeRange) for (let mergeCol = customMergeRange.start.col; mergeCol <= customMergeRange.end.col; mergeCol++) {
if (mergeCol === col) continue;
const mergedCell = scene.getCell(mergeCol, row), customContainer = mergedCell.getChildByName(CUSTOM_CONTAINER_NAME) || mergedCell.getChildByName(CUSTOM_MERGE_CONTAINER_NAME);
customContainer.removeAllChild(), mergedCell.removeChild(customContainer), getCustomCellMergeCustom(mergeCol, row, mergedCell, scene.table);
} else {
let customRender, customLayout;
const cellType = scene.table.getCellLocation(col, row), {vtableMerge: vtableMerge} = scene.table.getCellRawRecord(col, row) || {};
if (vtableMerge && scene.table.options.groupTitleCustomLayout) customLayout = scene.table.options.groupTitleCustomLayout; else if ("body" !== cellType) {
const define = scene.table.getHeaderDefine(col, row);
customRender = null == define ? void 0 : define.headerCustomRender, customLayout = null == define ? void 0 : define.headerCustomLayout;
} else {
const define = scene.table.getBodyColumnDefine(col, row);
customRender = (null == define ? void 0 : define.customRender) || scene.table.customRender,
customLayout = null == define ? void 0 : define.customLayout;
}
if ((customRender || customLayout) && isMergeCellGroup(cellGroup)) for (let mergeCol = cellGroup.mergeStartCol; mergeCol <= cellGroup.mergeEndCol; mergeCol++) if (mergeCol !== col) for (let mergeRow = cellGroup.mergeStartRow; mergeRow <= cellGroup.mergeEndRow; mergeRow++) scene.updateCellContent(mergeCol, mergeRow);
if (customLayout || customRender) {
const style = scene.table._getCellStyle(col, row), padding = getQuadProps(getProp("padding", style, col, row, scene.table));
let width = cellGroup.attribute.width, height = cellGroup.attribute.height;
isMergeCellGroup(cellGroup) && (width = scene.table.getColsWidth(cellGroup.mergeStartCol, cellGroup.mergeEndCol),
height = scene.table.getRowsHeight(cellGroup.mergeStartRow, cellGroup.mergeEndRow));
const customResult = dealWithCustom(customLayout, customRender, col, row, width, height, !1, scene.table.isAutoRowHeight(row), padding, isMergeCellGroup(cellGroup) ? {
start: {
col: cellGroup.mergeStartCol,
row: cellGroup.mergeStartRow
},
end: {
col: cellGroup.mergeEndCol,
row: cellGroup.mergeEndRow
}
} : void 0, scene.table);
customElementsGroup = customResult.elementsGroup, renderDefault = customResult.renderDefault,
isHeightChange = !0;
}
cell.childrenCount > 0 && customElementsGroup ? cell.insertBefore(customElementsGroup, cell.firstChild) : customElementsGroup && cell.appendChild(customElementsGroup);
}
}
const cellChange = updateMergeCellContentWidth(cellGroup, distWidth, detaX, autoRowHeight, renderDefault, scene.table);
isHeightChange = isHeightChange || cellChange;
}
if (!autoWrapText) {
autoWrapText = scene.table._getCellStyle(col, row).autoWrapText;
}
return !(!autoRowHeight || !autoWrapText) && isHeightChange;
}
function updateMergeCellContentWidth(cellGroup, distWidth, detaX, autoRowHeight, renderDefault, table) {
if (isMergeCellGroup(cellGroup)) {
distWidth = 0;
let isHeightChange = !1;
for (let col = cellGroup.mergeStartCol; col <= cellGroup.mergeEndCol; col++) distWidth += table.getColWidth(col);
let cellHeight = 0;
for (let row = cellGroup.mergeStartRow; row <= cellGroup.mergeEndRow; row++) cellHeight += table.getRowHeight(row);
const {colStart: colStart, colEnd: colEnd, rowStart: rowStart, rowEnd: rowEnd} = getCellMergeRange(cellGroup, table.scenegraph);
for (let col = colStart; col <= colEnd; col++) for (let row = rowStart; row <= rowEnd; row++) {
if (col === cellGroup.col && row !== cellGroup.row) continue;
const singleCellGroup = table.scenegraph.getCell(col, row);
if ("cell" !== singleCellGroup.role) continue;
singleCellGroup.forEachChildren((child => {
child.setAttributes({
dx: 0,
dy: 0
});
}));
let changed = !1;
if (renderDefault) {
const style = table._getCellStyle(colStart, rowStart), padding = getQuadProps(getProp("padding", style, col, row, table)), textAlign = style.textAlign, textBaseline = style.textBaseline;
changed = updateCellContentWidth(singleCellGroup, distWidth, cellHeight, detaX, autoRowHeight, padding, textAlign, textBaseline, table.scenegraph);
const hierarchyOffset = getHierarchyOffset(singleCellGroup.col, singleCellGroup.row, table);
if (hierarchyOffset) {
const text = singleCellGroup.getChildByName("text"), icon = singleCellGroup.getChildByName("expand") || singleCellGroup.getChildByName("collapse");
"icon-left" !== (null == icon ? void 0 : icon.role) && text && text.setAttribute("dx", hierarchyOffset);
}
}
const rangeHeight = table.getRowHeight(row), rangeWidth = table.getColWidth(col);
singleCellGroup.contentWidth = distWidth;
const {heightChange: heightChange} = resizeCellGroup(singleCellGroup, rangeWidth, rangeHeight, {
start: {
col: cellGroup.mergeStartCol,
row: cellGroup.mergeStartRow
},
end: {
col: cellGroup.mergeEndCol,
row: cellGroup.mergeEndRow
}
}, table);
heightChange && (singleCellGroup.needUpdateHeight = !0), isHeightChange = isHeightChange || changed;
}
return isHeightChange;
}
const style = table._getCellStyle(cellGroup.col, cellGroup.row), padding = getQuadProps(getProp("padding", style, cellGroup.col, cellGroup.row, table)), textAlign = style.textAlign, textBaseline = style.textBaseline;
return updateCellContentWidth(cellGroup, distWidth, table.getRowHeight(cellGroup.row), detaX, autoRowHeight, padding, textAlign, textBaseline, table.scenegraph);
}
function resetRowHeight(scene, row) {
const maxHeight = Math.round(computeRowHeight(row, 0, scene.table.colCount - 1, scene.table));
scene.table._setRowHeight(row, maxHeight, !0);
for (let col = 0; col < scene.table.colCount; col++) {
const distHeight = maxHeight, cell = scene.highPerformanceGetCell(col, row);
"empty" !== cell.role && updateCellHeightForRow(scene, cell, col, row, distHeight, distHeight - cell.attribute.height, scene.table.isHeader(col, row));
}
}
//# sourceMappingURL=update-width.js.map