UNPKG

@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
# 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.