You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.9 KiB
86 lines
3.9 KiB
|
2 years ago
|
"use strict";
|
||
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
|
exports.createSpanningCellManager = void 0;
|
||
|
|
const alignSpanningCell_1 = require("./alignSpanningCell");
|
||
|
|
const calculateSpanningCellWidth_1 = require("./calculateSpanningCellWidth");
|
||
|
|
const makeRangeConfig_1 = require("./makeRangeConfig");
|
||
|
|
const utils_1 = require("./utils");
|
||
|
|
const findRangeConfig = (cell, rangeConfigs) => {
|
||
|
|
return rangeConfigs.find((rangeCoordinate) => {
|
||
|
|
return (0, utils_1.isCellInRange)(cell, rangeCoordinate);
|
||
|
|
});
|
||
|
|
};
|
||
|
|
const getContainingRange = (rangeConfig, context) => {
|
||
|
|
const width = (0, calculateSpanningCellWidth_1.calculateSpanningCellWidth)(rangeConfig, context);
|
||
|
|
const wrappedContent = (0, alignSpanningCell_1.wrapRangeContent)(rangeConfig, width, context);
|
||
|
|
const alignedContent = (0, alignSpanningCell_1.alignVerticalRangeContent)(rangeConfig, wrappedContent, context);
|
||
|
|
const getCellContent = (rowIndex) => {
|
||
|
|
const { topLeft } = rangeConfig;
|
||
|
|
const { drawHorizontalLine, rowHeights } = context;
|
||
|
|
const totalWithinHorizontalBorderHeight = rowIndex - topLeft.row;
|
||
|
|
const totalHiddenHorizontalBorderHeight = (0, utils_1.sequence)(topLeft.row + 1, rowIndex).filter((index) => {
|
||
|
|
/* istanbul ignore next */
|
||
|
|
return !(drawHorizontalLine === null || drawHorizontalLine === void 0 ? void 0 : drawHorizontalLine(index, rowHeights.length));
|
||
|
|
}).length;
|
||
|
|
const offset = (0, utils_1.sumArray)(rowHeights.slice(topLeft.row, rowIndex)) + totalWithinHorizontalBorderHeight - totalHiddenHorizontalBorderHeight;
|
||
|
|
return alignedContent.slice(offset, offset + rowHeights[rowIndex]);
|
||
|
|
};
|
||
|
|
const getBorderContent = (borderIndex) => {
|
||
|
|
const { topLeft } = rangeConfig;
|
||
|
|
const offset = (0, utils_1.sumArray)(context.rowHeights.slice(topLeft.row, borderIndex)) + (borderIndex - topLeft.row - 1);
|
||
|
|
return alignedContent[offset];
|
||
|
|
};
|
||
|
|
return {
|
||
|
|
...rangeConfig,
|
||
|
|
extractBorderContent: getBorderContent,
|
||
|
|
extractCellContent: getCellContent,
|
||
|
|
height: wrappedContent.length,
|
||
|
|
width,
|
||
|
|
};
|
||
|
|
};
|
||
|
|
const inSameRange = (cell1, cell2, ranges) => {
|
||
|
|
const range1 = findRangeConfig(cell1, ranges);
|
||
|
|
const range2 = findRangeConfig(cell2, ranges);
|
||
|
|
if (range1 && range2) {
|
||
|
|
return (0, utils_1.areCellEqual)(range1.topLeft, range2.topLeft);
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
};
|
||
|
|
const hashRange = (range) => {
|
||
|
|
const { row, col } = range.topLeft;
|
||
|
|
return `${row}/${col}`;
|
||
|
|
};
|
||
|
|
const createSpanningCellManager = (parameters) => {
|
||
|
|
const { spanningCellConfigs, columnsConfig } = parameters;
|
||
|
|
const ranges = spanningCellConfigs.map((config) => {
|
||
|
|
return (0, makeRangeConfig_1.makeRangeConfig)(config, columnsConfig);
|
||
|
|
});
|
||
|
|
const rangeCache = {};
|
||
|
|
let rowHeights = [];
|
||
|
|
return { getContainingRange: (cell, options) => {
|
||
|
|
var _a;
|
||
|
|
const originalRow = (options === null || options === void 0 ? void 0 : options.mapped) ? (0, utils_1.findOriginalRowIndex)(rowHeights, cell.row) : cell.row;
|
||
|
|
const range = findRangeConfig({ ...cell,
|
||
|
|
row: originalRow }, ranges);
|
||
|
|
if (!range) {
|
||
|
|
return undefined;
|
||
|
|
}
|
||
|
|
if (rowHeights.length === 0) {
|
||
|
|
return getContainingRange(range, { ...parameters,
|
||
|
|
rowHeights });
|
||
|
|
}
|
||
|
|
const hash = hashRange(range);
|
||
|
|
(_a = rangeCache[hash]) !== null && _a !== void 0 ? _a : (rangeCache[hash] = getContainingRange(range, { ...parameters,
|
||
|
|
rowHeights }));
|
||
|
|
return rangeCache[hash];
|
||
|
|
},
|
||
|
|
inSameRange: (cell1, cell2) => {
|
||
|
|
return inSameRange(cell1, cell2, ranges);
|
||
|
|
},
|
||
|
|
rowHeights,
|
||
|
|
setRowHeights: (_rowHeights) => {
|
||
|
|
rowHeights = _rowHeights;
|
||
|
|
} };
|
||
|
|
};
|
||
|
|
exports.createSpanningCellManager = createSpanningCellManager;
|
||
|
|
//# sourceMappingURL=spanningCellManager.js.map
|