@syncfusion/ej2-spreadsheet
Version:
Feature-rich JavaScript Spreadsheet (Excel) control with built-in support for selection, editing, formatting, importing and exporting to Excel
113 lines (88 loc) • 7.42 kB
Markdown
# Insert Module data flow
## What It Does
Insert module handles inserting cells, rows, columns and sheets across both the core workbook model and the spreadsheet UI. It updates data structures (rows/columns/sheets), maintains ranges/usedRange, preserves styles/merges/conditional formats, repositions images and charts, and triggers UI refreshes and related notifications.
## Entry Points
**WorkbookInsert (Core)**
- `insertModel(args: InsertDeleteModelArgs)` - Primary core method that mutates `SheetModel`/`Workbook` data for Row/Column/Sheet insert operations. Handles model-level bookkeeping including `usedRange`, merges, conditional formats, comments, notes, and frozen pane adjustments.
**Insert (Spreadsheet / UI)**
- `insert(actionArgs: ActionEventArgs)` - UI-side handler that responds to the `insert` event, performs rendering updates, scroll/viewport adjustments, triggers comment/note pane refreshes, and completes user-facing actions.
## Core Logic Flow
1. User invokes an insert (API/UI menu/keyboard). UI creates `InsertDeleteEventArgs` and triggers the workflow.
2. `beginAction` may be raised (undo/redo and cancellation support). If cancelled, the flow stops.
3. Core: `WorkbookInsert.insertModel` runs and:
- Normalizes `start`/`end` and builds `model` array to insert.
- Emits `refreshInsertDelete` and prepares `insertArgs` describing start/end and isInsert flag.
- For Rows:
- Adjusts `rows`, `maxHgts`, frozen rows (`frozenRows`) and `usedRange`.
- Inserts empty RowModels and shifts existing row-level data.
- Propagates styles/format/wrap from adjacent cells into new rows where applicable.
- Handles merged cells that cross the insertion boundary.
- For Columns:
- Adjusts `columns`, `rows[].cells`, frozen columns (`frozenColumns`) and `usedRange`.
- Inserts column cell placeholders per row, shifting cell arrays and preserving adjacent styles.
- Collects merge adjustments to re-emit as `insertMerge` notifications.
- For Sheets:
- Creates new `SheetModel` instances and inserts them into `parent.sheets`.
- Updates `activeSheetIndex` and calls `createSheet` on workbook.
- Updates data-source ranges and notifies formula engine (`workbookFormulaOperation`) for sheet additions.
- Inserts conditional formats, comments and notes by adjusting addresses via `insertFormatRange` and re-indexing threaded comments/notes.
- Sends `refreshClipboard`, `refreshChart` notifications where appropriate.
4. Core emits the `insert` action event with `ActionEventArgs` to indicate the model change completed.
5. UI: `Insert.insert` listens for `insert` and:
- Calls `insertSheetTab` and triggers `renderModule.refreshSheet()` for sheets insertion.
- For Row/Column inserts, decides between full refresh or partial virtualization-aware refresh using viewport/frozen indexes.
- Adjusts scroll position using `updateScrollValue` if the top/left of the viewport needs shifting after insert.
- Re-selects current selection and refreshes comments/note panes via `refreshCommentsPane` and `updateNoteContainer`.
- Triggers `triggerDataChange` or `completeAction` depending on `isAction`/`isUndoRedo` flags and focuses the spreadsheet element.
6. UI also calls helper to reposition images/charts: `refreshImgChartElement` which iterates sheet cells and emits `refreshImagePosition` or chart refresh events when chart cell indices change.
## Operations Handled
- Insert Rows
- Inserts `RowModel` elements into `sheet.rows` at `index`.
- Updates `maxHgts` and `rowCount` and notifies UI via `updateRowColCount`.
- Transfers cell-level styles and wrap/format metadata from adjacent parent cell into new rows.
- Handles merged-cell rowSpan adjustments and emits merge notifications.
- Insert Columns
- Inserts column descriptors into `sheet.columns` and per-row cell placeholders into `rows[i].cells`.
- Updates `colCount` and notifies UI via `updateRowColCount`.
- Preserves adjacent cell styles and manages `colSpan` merge edge cases via `insertMerge` notifications.
- Insert Sheets
- Creates new `SheetModel` objects through `createSheet`.
- Updates `activeSheetIndex` and informs formula subsystem to register new sheet ids/names.
- Updates data ranges on sheets imported from data source.
- Conditional Formats
- Recomputes CF ranges using `insertFormatRange` when rows/columns are inserted.
- Comments & Notes
- Re-indexes existing `comments`/`notes` addresses when rows/columns are inserted.
- Restores previously deleted comments/notes when `prevAction === 'delete'` by re-inserting stored items.
- Merged Cells
- Detects merge cells adjacent to insertion boundaries and issues `insertMerge` events to adjust merge ranges.
- Images & Charts
- After model changes, UI iterates cells and emits `refreshImagePosition` for images and `refreshChartCellOnInit` for charts that moved.
## Validation & Safety
- Cancellation: `beginAction`/`eventArgs.cancel` allows intercepting insert operations.
- Undo/Redo: Flags `isUndoRedo` / `isRedo` control whether certain re-indexing or style-copy operations run.
- Count checks: `checkCount` prevents inserts when length matches expected values (defensive early return).
- Freeze/pane adjustments: Inserts that cross frozen boundaries update `frozenRows`/`frozenColumns` and set `freezePane` in event args so UI can refresh panes correctly.
- Boundary/usedRange updates: Core ensures `usedRange` is updated to avoid out-of-bounds issues after insertion.
## Desired Outputs (Post-Insert)
- Model: Updated `SheetModel` and `Workbook` state (rows, columns, sheets, `usedRange`, merges, conditional formats, comments, notes).
- Events: `insert` action emitted with `ActionEventArgs`; supporting notifications: `refreshInsertDelete`, `insertMerge`, `refreshClipboard`, `refreshChart`, `workbookFormulaOperation`.
- UI: Refreshed sheet/tab UI, updated viewport and scroll positions, updated comments pane and note container, repositioned images/charts.
- Undo/Redo entry: Proper action recorded for undo/redo stacks when `isAction` is true.
## System-Level
- Important types & models touched:
- `InsertDeleteEventArgs`, `ActionEventArgs`, `SheetModel`, `RowModel`, `CellModel`, `MergeArgs`, `ExtendedThreadedCommentModel`, `ExtendedNoteModel`.
- Key events/notifications used across layers:
- beginAction, insert, beforeInsert, refreshInsertDelete, insertMerge, refreshClipboard, refreshChart,
refreshCommentsPane, updateNoteContainer, refreshImagePosition, updateScrollValue, triggerDataChange, completeAction,
workbookFormulaOperation, updateRowColCount.
- Modules:
- Core: `src/workbook/actions/insert.ts` (`WorkbookInsert`)
- UI: `src/spreadsheet/actions/insert.ts` (`Insert`)
## Test / Verification Actions
- Insert a single row/column inside and outside frozen panes and verify `frozenRows`/`frozenColumns` changes and UI pane refresh.
- Insert multiple rows/columns with merged cells crossing the insert boundary and verify merges updated and no visual overlap occurs.
- Insert sheets and verify `activeSheetIndex` and formula engine notifications for sheet registration.
- Insert when comments/notes exist and verify their addresses were incremented and review pane reflects changes.
- Verify images and charts move with rows/columns and that `refreshImagePosition` / `refreshChartCellOnInit` are invoked.
---