"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