@syncfusion/ej2-spreadsheet
Version:
Feature-rich JavaScript Spreadsheet (Excel) control with built-in support for selection, editing, formatting, importing and exporting to Excel
77 lines (70 loc) • 5.39 kB
Markdown
# Row Module data flow
## What It Does
- Summary: Manages row model data and renders row DOM for the spreadsheet grid. Covers height calculation, hidden/filtered state, row-header visuals, DPR alignment, and integration with the cell renderer. See `src/workbook/base/row.ts` and `src/spreadsheet/renderer/row.ts` for implementation.
## Entry Points (UI / Core)
- UI (Renderer):
- `RowRenderer.render(index?, isRowHeader?, preventHiddenCls?)` — create a `<tr>` with styles, classes and `aria-rowindex`.
- `RowRenderer.refresh(index, pRow, hRow?, header?, preventHiddenCls?)` — update row cells via the `cell` service; handle frozen columns and viewport ranges.
- `RowRenderer.destroy()` / lifecycle hooks — cleanup and respond to `deInitProperties`.
- Core (Model / Utilities):
- `Row` class — schema for `cells`, `index`, `height`, `hidden`, `customHeight`, `format`, `isReadOnly`, `isFiltered`.
- `getRow(sheet, rowIndex)`, `setRow(sheet, rowIndex, row)` — accessors and setters for `sheet.rows`.
- `isHiddenRow(sheet, index)`, `isFilterHidden(sheet, index)` — boolean checks.
- `getRowHeight(sheet, rowIndex, checkDPR?, addHidden?)`, `setRowHeight(sheet, rowIndex, height)`, `getRowsHeight(sheet, startRow, endRow, checkDPR?, addHidden?)` — height calculus and range sums.
## Core Logic Flow (ASCII)
User action or viewport/resizing
↓
Model update (`setRow`, `setRowHeight`) or viewport change
↓
Sheet data updated (`sheet.rows[...]`) + optional undo/redo record
↓
Renderer invoked (`RowRenderer.refresh` / `render`) for affected rows
↓
Row height computed via `getRowHeight` (DPR adjustment if requested)
↓
DOM `<tr>` created/updated with `style.height` / `lineHeight`, classes applied; cells rendered via `cellRenderer.render`
↓
Accessibility attributes and hidden/filtered classes applied
## Operations Handled (functions & notes)
- `Row` model: holds per-row metadata used across layers.
- `getRow(sheet, rowIndex)`: returns `sheet.rows[rowIndex]`.
- `setRow(sheet, rowIndex, row)`: ensures `sheet.rows[rowIndex]` exists and copies properties.
- `isHiddenRow` / `isFilterHidden`: read flags for hidden/filtered state.
- `getRowHeight(sheet, rowIndex, checkDPR?, addHidden?)`:
- Returns explicit row height or falls back to `sheet.standardHeight` or `20`.
- Hidden rows yield `0` height unless `addHidden` is `true`.
- When `checkDPR` is `true`, adjusts fractional pixels to align with `window.devicePixelRatio`.
- `setRowHeight(sheet, rowIndex, height)`: writes `height`, creating row entry if needed.
- `getRowsHeight(...)`: sums heights across a range, swapping start/end when necessary.
- `RowRenderer.render(...)`:
- Produces `e-header-row` for header creation; otherwise `e-row`.
- Computes `rowHeight` and `actualRowHgt`, sets inline `style.height` and `lineHeight`.
- Adds `aria-rowindex`.
- For row headers: applies `e-reach-fntsize`, `e-hide-start`, `e-hide-end` for hidden-range indicators.
- Calls `getBorderWidth()` for DPR-aware border offsets.
- `RowRenderer.refresh(...)`:
- Renders cells for frozen and scrollable regions.
- Uses helpers (`getCell`, `getCellAddress`, `getCellIndexes`, `skipHiddenIdx`, `isImported`, `isHiddenCol`) to decide which cells to render.
- Calls `cellRenderer.render` with `CellRenderArgs` (`isHeightCheckNeeded`, `skipFormatCheck`, `checkCF`, etc.).
- `getBorderWidth()`: computes fractional border width for crisp layout on high-DPR displays.
## Validation & Safety
- Defensive creation: `setRow` and `setRowHeight` create missing `sheet.rows` entries to avoid undefined references.
- Hidden row handling: `getRowHeight` returns `0` when `hidden` and `addHidden` is `false` to prevent layout expansion.
- DPR correction: fractional pixel adjustments when `checkDPR` are used to avoid blurry borders/lines.
- Skip hidden columns: renderer checks `isHiddenCol` to avoid rendering off-screen/hidden cells.
- Viewport & frozen support: `refresh` uses viewport indices and frozen counts to render split regions correctly.
- Minimal mutation: `setRow` performs a shallow copy of provided properties, avoiding unexpected deep merges.
## Desired Outputs
- User-Facing:
- Row sizing updates when user resizes or operations change the model.
- Hidden rows collapse visually (height=0) and show row-header indicators for hidden ranges.
- Row headers adjust for small heights (`e-reach-fntsize`) and remain accessible (`aria-rowindex`).
- Correct rendering across frozen panes and scrollable areas.
- System-Level:
- Model storage: `sheet.rows[index]` holds `RowModel` with `cells`, `height`, `hidden`, `isReadOnly`, `isFiltered`.
- DOM classes: `e-header-row`, `e-row`, `e-reach-fntsize`, `e-hide-start`, `e-hide-end`.
- Attributes/styles: each rendered `<tr>` has `aria-rowindex`, inline `style.height` and `lineHeight`.
- Services: renderer obtains `cell` service via service locator and delegates per-cell rendering to it.
- Events/lifecycle: renderer listens to `deInitProperties` to reset cached values; row model changes should trigger targeted refreshes.
- Undo/Redo (recommended): mutations to row properties (height, hidden, setRow) should produce undo/redo records for revertibility.
- Performance: use `getRowsHeight` and DPR-aware computations for layout, virtualization and to minimize reflow.