@visactor/vtable
Version:
canvas table width high performance
202 lines (190 loc) • 14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.updateChartState = exports.updateChartData = exports.clearCellChartCacheImage = exports.clearChartCacheImage = exports.updateChartSizeForResizeRowHeight = exports.updateChartSizeForResizeColWidth = void 0;
const vutils_1 = require("@visactor/vutils"), factory_1 = require("../../core/factory"), padding_1 = require("../utils/padding"), get_prop_1 = require("../utils/get-prop");
function updateChartSizeForResizeColWidth(scenegraph, col) {
const {table: table} = scenegraph, layout = table.internalProps.layoutMap, columnResizeType = -1 === col ? "all" : table.internalProps.columnResizeType;
if ("column" === columnResizeType) {
const columnGroup = scenegraph.getColGroup(col), columnHeaderGroup = scenegraph.getColGroup(col, !0), columnBottomGroup = scenegraph.getColGroupInBottom(col, !0);
if (null == columnGroup || columnGroup.forEachChildren((cellNode => {
updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row));
})), null == columnHeaderGroup || columnHeaderGroup.forEachChildren((cellNode => {
updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row));
})), null == columnBottomGroup || columnBottomGroup.forEachChildren((cellNode => {
updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row));
})), "adaptive" === table.widthMode && col < table.colCount - 1) {
const columnGroup = scenegraph.getColGroup(col + 1), columnHeaderGroup = scenegraph.getColGroup(col + 1, !0), columnBottomGroup = scenegraph.getColGroupInBottom(col + 1, !0);
null == columnGroup || columnGroup.forEachChildren((cellNode => {
updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row));
})), null == columnHeaderGroup || columnHeaderGroup.forEachChildren((cellNode => {
updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row));
})), null == columnBottomGroup || columnBottomGroup.forEachChildren((cellNode => {
updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row));
}));
}
} else {
let resizeIndicatorKey, resizeDimensionKey, resizeDimensionValue, startCol = table.rowHeaderLevelCount, endCol = table.colCount - 1;
if ("indicator" === columnResizeType) if (layout.indicatorsAsCol) resizeIndicatorKey = layout.getIndicatorKey(col, table.columnHeaderLevelCount); else {
const headerPaths = layout.getCellHeaderPaths(col, table.columnHeaderLevelCount - 1), headerPath = headerPaths.colHeaderPaths[headerPaths.colHeaderPaths.length - 1];
resizeDimensionKey = headerPath.dimensionKey, resizeDimensionValue = headerPath.value;
} else if ("indicatorGroup" === columnResizeType) {
const layout = table.internalProps.layoutMap, headerPaths = layout.getCellHeaderPaths(table.stateManager.columnResize.col, table.columnHeaderLevelCount), node = layout.getHeadNodeByRowOrColDimensions(headerPaths.colHeaderPaths.slice(0, headerPaths.colHeaderPaths.length - 1));
startCol = node.startInTotal + table.frozenColCount, endCol = node.startInTotal + table.frozenColCount + node.size - 1;
}
for (let c = startCol; c <= endCol; c++) {
const columnGroup = scenegraph.getColGroup(c), columnHeaderGroup = scenegraph.getColGroup(c, !0), columnBottomGroup = scenegraph.getColGroupInBottom(c, !0);
if (columnGroup) {
if ("indicator" === columnResizeType) {
const indicatorKey = layout.getIndicatorKey(c, table.columnHeaderLevelCount);
if (layout.indicatorsAsCol && indicatorKey !== resizeIndicatorKey) continue;
if (!layout.indicatorsAsCol) {
const headerPaths = layout.getCellHeaderPaths(c, table.columnHeaderLevelCount - 1), headerPath = null == headerPaths ? void 0 : headerPaths.colHeaderPaths[headerPaths.colHeaderPaths.length - 1];
if (!headerPath || resizeDimensionKey !== headerPath.dimensionKey || resizeDimensionValue !== headerPath.value) continue;
}
}
columnGroup.forEachChildren((cellNode => {
updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row));
})), null == columnHeaderGroup || columnHeaderGroup.forEachChildren((cellNode => {
updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row));
})), null == columnBottomGroup || columnBottomGroup.forEachChildren((cellNode => {
updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row));
}));
}
}
}
}
function updateChartSizeForResizeRowHeight(scenegraph, row) {
var _a;
const {table: table} = scenegraph, layout = table.internalProps.layoutMap, state = table.stateManager, rowResizeType = -1 === row ? "all" : table.internalProps.rowResizeType;
let resizeIndicatorKey, resizeDimensionKey, resizeDimensionValue, startRow = table.columnHeaderLevelCount, endRow = table.rowCount - 1;
if ("indicator" === rowResizeType) if (layout.indicatorsAsCol) {
const headerPaths = layout.getCellHeaderPaths(table.rowHeaderLevelCount - 1, row), headerPath = null === (_a = headerPaths.rowHeaderPaths) || void 0 === _a ? void 0 : _a[headerPaths.rowHeaderPaths.length - 1];
resizeDimensionKey = null == headerPath ? void 0 : headerPath.dimensionKey, resizeDimensionValue = null == headerPath ? void 0 : headerPath.value;
} else resizeIndicatorKey = layout.getIndicatorKey(table.rowHeaderLevelCount, row); else if ("indicatorGroup" === rowResizeType) {
const layout = table.internalProps.layoutMap, headerPaths = layout.getCellHeaderPaths(table.rowHeaderLevelCount, row), node = layout.getHeadNodeByRowOrColDimensions(headerPaths.rowHeaderPaths.slice(0, headerPaths.rowHeaderPaths.length - 1));
startRow = node.startInTotal + table.frozenRowCount, endRow = node.startInTotal + table.frozenRowCount + node.size - 1;
}
const colsRange = [ {
startCol: scenegraph.proxy.colStart,
endCol: scenegraph.proxy.colEnd
} ];
table.frozenColCount && colsRange.push({
startCol: 0,
endCol: table.frozenColCount - 1
}), table.rightFrozenColCount && colsRange.push({
startCol: table.colCount - table.rightFrozenColCount,
endCol: table.colCount - 1
}), colsRange.forEach((({startCol: startCol, endCol: endCol}) => {
for (let col = startCol; col <= endCol; col++) if ("row" === rowResizeType) {
const cellNode = scenegraph.highPerformanceGetCell(col, row);
if ("cell" !== cellNode.role) continue;
if (updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row)),
"adaptive" === table.heightMode && row < table.rowCount - 1) {
const cellNode = scenegraph.highPerformanceGetCell(col, row + 1);
updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row));
}
} else for (let r = startRow; r <= endRow; r++) {
if ("indicator" === rowResizeType) {
const indicatorKey = layout.getIndicatorKey(state.table.rowHeaderLevelCount, r);
if (!layout.indicatorsAsCol && indicatorKey !== resizeIndicatorKey) continue;
if (layout.indicatorsAsCol) {
const headerPaths = layout.getCellHeaderPaths(state.table.rowHeaderLevelCount - 1, r), headerPath = null == headerPaths ? void 0 : headerPaths.rowHeaderPaths[headerPaths.rowHeaderPaths.length - 1];
if (!headerPath || resizeDimensionKey !== headerPath.dimensionKey || resizeDimensionValue !== headerPath.value) continue;
}
}
const cellNode = scenegraph.highPerformanceGetCell(col, r);
if ("cell" !== cellNode.role) continue;
updateChartGraphicSize(cellNode, table.getColWidth(cellNode.col), table.getRowHeight(cellNode.row));
}
}));
}
function clearChartCacheImage(scenegraph) {
var _a;
for (let c = scenegraph.proxy.colStart; c <= scenegraph.proxy.colEnd; c++) {
const columnGroup = scenegraph.getColGroup(c);
null === (_a = null == columnGroup ? void 0 : columnGroup.getChildren()) || void 0 === _a || _a.forEach((cellNode => {
cellNode.children.forEach((node => {
"chart" === node.type && (node.cacheCanvas = null, node.addUpdateBoundTag());
}));
}));
}
}
function clearCellChartCacheImage(col, row, scenegraph) {
scenegraph.getCell(col, row).children.forEach((node => {
"chart" === node.type && (node.cacheCanvas = null, node.addUpdateBoundTag());
}));
}
function updateChartData(scenegraph) {
var _a;
const table = scenegraph.table;
for (let c = scenegraph.proxy.colStart; c <= scenegraph.proxy.colEnd; c++) {
const columnGroup = scenegraph.getColGroup(c);
null === (_a = null == columnGroup ? void 0 : columnGroup.getChildren()) || void 0 === _a || _a.forEach((cellNode => {
const col = cellNode.col, row = cellNode.row;
cellNode.children.forEach((node => {
if ("chart" === node.type) {
node.updateData(table.getCellValue(col, row));
const chartSpec = node.attribute.spec, chartType = chartSpec.type;
if ("gauge" !== chartType && "rose" !== chartType && "radar" !== chartType) {
const newAxes = table.internalProps.layoutMap.getChartAxes(col, row);
node.setAttribute("axes", newAxes), chartSpec.axes = newAxes;
}
node.setAttribute("spec", chartSpec);
}
}));
}));
}
updateTableAxes(scenegraph.rowHeaderGroup, scenegraph.table), updateTableAxes(scenegraph.colHeaderGroup, scenegraph.table),
updateTableAxes(scenegraph.rightFrozenGroup, scenegraph.table), updateTableAxes(scenegraph.bottomFrozenGroup, scenegraph.table);
}
function updateChartState(scenegraph, datum) {
const table = scenegraph.table;
if (table.isPivotChart()) {
const preSelectItemsCount = table._selectedDataItemsInChart.length;
if ((null === datum || 0 === (null == datum ? void 0 : datum.length) || 0 === Object.keys(datum).length) && 0 === preSelectItemsCount) return;
const newSelectedDataItemsInChart = [];
if (Array.isArray(datum)) datum.forEach((dataItem => {
if (dataItem && 0 !== dataItem.key && Object.keys(dataItem).length > 0) {
const selectedState = {};
for (const itemKey in dataItem) itemKey.startsWith("VGRAMMAR_") || itemKey.startsWith("__VCHART") || (selectedState[itemKey] = dataItem[itemKey]);
newSelectedDataItemsInChart.push(selectedState);
}
})); else if (datum && 0 !== datum.key && Object.keys(datum).length > 0) {
const selectedState = {};
for (const itemKey in datum) itemKey.startsWith("VGRAMMAR_") || itemKey.startsWith("__VCHART") || (selectedState[itemKey] = datum[itemKey]);
newSelectedDataItemsInChart.push(selectedState);
}
(0, vutils_1.isEqual)(table._selectedDataItemsInChart, newSelectedDataItemsInChart) || (table._selectedDataItemsInChart = newSelectedDataItemsInChart,
table.internalProps.layoutMap.updateDataStateToChartInstance(), clearChartCacheImage(scenegraph),
table.scenegraph.updateNextFrame());
}
}
function updateTableAxes(containerGroup, table) {
containerGroup.forEachChildren((column => {
"column" === column.role && column.forEachChildren((cell => {
var _a;
if ("cell" === cell.role) {
let isAxisComponent = !1;
if (cell.forEachChildren((mark => "axis" === mark.name && (isAxisComponent = !0,
!0))), isAxisComponent) {
const axisConfig = table.internalProps.layoutMap.getAxisConfigInPivotChart(cell.col, cell.row), cellStyle = table._getCellStyle(cell.col, cell.row), padding = (0,
padding_1.getQuadProps)((0, get_prop_1.getProp)("padding", cellStyle, cell.col, cell.row, table)), axis = new (factory_1.Factory.getComponent("axis"))(axisConfig, cell.attribute.width, cell.attribute.height, null !== (_a = axisConfig.__vtablePadding) && void 0 !== _a ? _a : padding, table);
cell.clear(), cell.appendChild(axis.component), axis.overlap();
}
}
}));
}));
}
function updateChartGraphicSize(cellNode, width, height) {
cellNode.forEachChildren((graphic => {
"chart" === graphic.type && (graphic.cacheCanvas = null, graphic.setAttributes({
width: Math.ceil(width - graphic.attribute.cellPadding[3] - graphic.attribute.cellPadding[1]),
height: Math.ceil(height - graphic.attribute.cellPadding[0] - graphic.attribute.cellPadding[2])
}));
}));
}
exports.updateChartSizeForResizeColWidth = updateChartSizeForResizeColWidth, exports.updateChartSizeForResizeRowHeight = updateChartSizeForResizeRowHeight,
exports.clearChartCacheImage = clearChartCacheImage, exports.clearCellChartCacheImage = clearCellChartCacheImage,
exports.updateChartData = updateChartData, exports.updateChartState = updateChartState;
//# sourceMappingURL=update-chart.js.map