UNPKG

@syncfusion/ej2-spreadsheet

Version:

Feature-rich JavaScript Spreadsheet (Excel) control with built-in support for selection, editing, formatting, importing and exporting to Excel

85 lines (61 loc) 6.13 kB
# Merge Module data flow ## What It Does Merge module handles all cell merge/unmerge operations at the workbook model level and the spreadsheet UI. It computes merged ranges, applies rowSpan/colSpan values, updates cell values/formats, refreshes conditional formats, and coordinates rendering/hide logic for merged cells across frozen panes and hidden rows/columns. ## Entry Points **WorkbookMerge (Core)** - `merge(args: MergeArgs)` - Primary core routine that validates ranges, splits horizontal/vertical/all merges, and applies merge logic to model cells. Handles undo/redo via `isAction` and notifies refresh/selection updates. - `mergeAll(args, startRow?, startCol?)` - Low-level routine that writes span metadata (`rowSpan`/`colSpan`) and clears partial cells inside the merged region. - `mergedRange`, `activeCellRange`, `insertHandler` - helpers to compute merged extents, adjust ranges when inserts happen, and update persisted mergedCells on import. **Merge (Spreadsheet / UI)** - `merge(args)` - UI renderer entry that refreshes DOM cells for merged regions using the cell renderer service. - `hideHandler`, `checkPrevMerge`, `checkMerge` - UI handlers that control display/hide logic for merged cells when rows/columns are hidden, when rendering viewport rows, and when neighboring merges affect visible cells. ## Core Logic Flow 1. Callers request merge via `setMerge` / `setMerge`-equivalent notification, providing `MergeArgs` (range, type, isAction, model backup when undoable). 2. `WorkbookMerge.merge` normalizes the range (`getRangeIndexes`, `getSwapRange`) and optionally calls `mergedRange` to expand the range considering existing spans. 3. Based on `args.type` it dispatches to `mergeAll` for all/vertical/horizontal variants. `mergeAll`: - Iterates target cells; records existing cell content/format into `args.model` when `isAction` for undo. - Removes `rowSpan`/`colSpan` from cells inside the merge and sets negative spans on covered cells to mark them as merged placeholders. - For the top-left cell of the merge, sets positive `rowSpan`/`colSpan` on the update object to reflect merged dimensions and writes the leading cell value/format. - Calls `updateCell(...)` for cell writes and sets `usedRange` appropriately. 4. After mutation, core refreshes conditional formats (`refreshCF`) and notifies `applyMerge` when appropriate. 5. If `insertMerge` notifications come from insert operations, `insertHandler` adapts existing merges to new indices and re-applies merge layout. 6. `WorkbookMerge` emits `actionBegin`/`actionComplete` notifications for actionable merges and triggers `selectRange` and `refreshChart` for the active sheet when necessary. ## UI Logic Flow 1. UI listens to `applyMerge` and `hiddenMerge` events to update DOM. 2. `Merge.merge` uses the cell renderer service to refresh the merged cell DOM (colSpan/rowSpan), and ensures correct content and display settings across frozen panes. 3. When rows/columns are hidden or visibility changes, `hideHandler` determines whether merged cells should be shown/hidden or re-rendered with adjusted spans, using `skipHiddenIdx` to map visible indices. 4. During content rendering, `checkPrevMerge` and `checkMerge` inspect adjacent/past merges to avoid duplicate spans in the viewport, clearing or restoring display attributes as needed. ## Operations Handled - Merge (All / Horizontally / Vertically) - Compute merged range, record undo model, set positive spans on anchor cell and negative placeholders on covered cells. - Preserve leading cell value/format; clear other cell content or store it in undo model. - Unmerge - Remove span metadata and restore per-cell values/formats from `args.model` when provided. - Hidden rows/columns - Adjust visible `rowSpan`/`colSpan` based on hidden counts, and avoid rendering merged placeholders in collapsed areas. - Insert adjustments - `insertHandler` adapts merge ranges and reapplies merges when rows/columns are inserted inside merged regions. - Import/update - `updateMergedCellsFromSheet` normalizes mergedCells metadata after import to fit current sheet dimensions and converts stored mergedCells into runtime span metadata. ## Validation & Safety - Range normalization: accepts string or index input and uses `getRangeIndexes` / `getSwapRange`. - Skip-checks: `skipChecking` short-circuits expensive range recalculation when callers already know the extent. - Protection: merges respect workbook action lifecycle (`actionBegin` / `actionComplete`) and use `isAction` to record undo payloads. - Boundary checks: `updateMergedCellsFromSheet` enforces sheet row/column limits (max rows/cols) and trims spans that would exceed sheet dimensions. ## Desired Outputs (Post-Merge) - Model: `rowSpan` / `colSpan` set on anchor cell; negative spans on covered cells; optional `mergedCells` list updated on sheet model. - UI: Table cells updated with `rowSpan`/`colSpan` attributes; merged placeholders hidden; correct display across frozen panes and when rows/cols are hidden. - Notifications: `applyMerge`, `refreshChart`, `selectRange`, `actionBegin`/`actionComplete` for undo support. ## System-Level - Important types & events: - `MergeArgs`, `CellModel`, `SheetModel`, `MergedCellModel`, `applyMerge`, `setMerge`, `mergedRange`, `activeCellMergedRange`, `insertMerge`, `importModelUpdate`, `refreshChart`, `selectRange`. - Modules: - Core: `src/workbook/actions/merge.ts` (`WorkbookMerge`) - UI: `src/spreadsheet/actions/merge.ts` (`Merge`) ## Test / Verification Actions - Merge a rectangular range and verify anchor cell carries value/format and covered cells are placeholders (hidden or negative spans). - Merge horizontally and vertically edge cases (single-row, single-column) and verify resulting spans are correct. - Unmerge with `isAction` and verify undo model restores original cell contents. - Hide rows/columns inside a merge and verify UI shows/hides merged cells correctly and recalculates visible spans. - Insert rows/columns inside a merged range and verify `insertMerge` handler adjusts merge ranges and visual spans. ---