UNPKG

@syncfusion/ej2-spreadsheet

Version:

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

101 lines (79 loc) 7.73 kB
# Number Format Module data flow ## What It Does Number Format subsystem handles parsing, localization, display and persistence of numeric/date/time/currency formats. The Workbook layer performs the core formatting logic, localized mapping and format IDs; the Spreadsheet layer applies formatted text to cell DOM, measures space for fill/padding, and provides UI refresh hooks. Primary implementation files: `src/workbook/integrations/number-format.ts` (Core/WorkbookNumberFormat) and `src/spreadsheet/integrations/number-format.ts` (UI/NumberFormat). ## Entry Points (UI) **Class:** `NumberFormat` (Spreadsheet layer) - Listens: `refreshCellElement`, `rowFillHandler`, `getTextSpace`. - Key handlers: - `refreshCellElement(args: NumberFormatArgs)` — refresh a cell node using formatting arguments. - `rowFillHandler(args)` — render repeated-fill text (custom format `*`) and measure available width to compute repeat count. - `getTextSpace(args)` — wrapper for measuring text width via `getTextWidth` and cell styles. - Lifecycle: `addEventListener()` / `removeEventListener()` register UI hooks. ## Entry Points (Core) **Class:** `WorkbookNumberFormat` (Workbook layer) - Listens / notifies: localized format actions, number formatting requests and related events (via notify hooks in code). - Key handlers: - `numberFormatting(args)` — apply a requested number format across a range; iterates cells, sets `cell.format` via `setCell` and calls UI refresh paths. - `getFormattedCell(args)` — central formatter that returns the formatted string for a cell value, delegating to type-specific helpers. - `updateLocalizedFormats(dependables)` / `localizedFormatAction()` / `parseToLocalizedFormat()` / `parseToDefaultFormat()` — map between localized format codes and default format IDs; support culture-specific decimal/group symbols and currency symbols. - Type-specific processors: `processCustomDateTime()`, `processCustomNumberFormat()`, `processCustomText()`, `applyNumberFormat()`, `currencyFormat()`, `percentageFormat()`, `accountingFormat()`, `scientificFormat()`, `fractionFormat()` — implement formatting rules and color/conditional segments. - Helpers: `isCustomType()`, `removeFormatColor()`, `getFormatForOtherCurrency()`, `convertToDefaultFormat()` and `configureLocalizedFormat()` for external mapping. - Validation: `checkDateFormat()` and `checkCustomTimeFormat()` for date/time format detection. ## ASCII Core Logic Flow User or API requests format change → UI or Core issues `numberFormatting`/format change ↓ `WorkbookNumberFormat.numberFormatting()` validates range, iterates target cells, computes formatted text via `getFormattedCell()` ↓ `getFormattedCell()` delegates to appropriate processor (date/time/number/text/currency) and returns `formattedText` and alignment info ↓ Core persists `cell.format` via `setCell()` and triggers UI refresh (render pipeline) ↓ Spreadsheet `NumberFormat.refreshCellElement()` or `rowFillHandler()` updates DOM (`td`) with formatted text, handles fill/padding icons and measurements ## Operations (functions & responsibilities) - `numberFormatting(args)` (Core) - Resolve sheet and range, compute `selectedRange`, iterate rows/cols, set `cell.format` using `setCell()` and trigger refresh or notify other subsystems (charts/conditional formats). - `getFormattedCell(args)` (Core) - Entry to format a single cell value. - Uses `Internationalization` for locale formatting when appropriate and calls helper functions for custom patterns and special formats. - `parseToLocalizedFormat()` / `parseToDefaultFormat()` / `updateLocalizedFormats()` (Core) - Translate format codes between localized culture representations and internal/default representations, update `localizedFormats` and `defaultFormats` maps. - Used by UI and export/import to ensure consistent format serialization. - `applyNumberFormat()` and type helpers (Core) - Compute final string for numbers, percentages, currencies, accounting, scientific and fractions, honoring color/conditional segments and placeholders. - `processCustomDateTime()` (Core) - Interpret custom date/time tokens, handle AM/PM variants and localized separators, return locale-correct date/time string. - `rowFillHandler()` (UI) - Render repeated character fill for custom formats containing `*` by measuring available text width and inserting repeated characters with adjusted letter-spacing if necessary. - `refreshCellElement()` (UI) - Called when a cell must be re-rendered; passes `NumberFormatArgs` to `parent.refreshNode()` to update DOM. - `configureLocalizedFormat()` / `convertToDefaultFormat()` (public API functions) - Allow external mapping of format ids/codes and convert culture-specific formats to the default format representation. ## Validation & Safety - Range validation: `numberFormatting()` checks target range against usedRange and skips out-of-range cells. - Locale correctness: `updateLocalizedFormats()` and dependent functions adapt formats to the workbook's `locale` and numeric separators; decimal/group changes are detected and parsed. - Readonly/Protection: callers should validate write permission before invoking `numberFormatting` (format application uses `setCell()` which triggers usual protection checks elsewhere). - Date/time validation: `checkDateFormat()` and `checkCustomTimeFormat()` ensure values interpreted as dates/times are valid before formatting. - Performance: heavy operations (formatting many cells) rely on batch updates and the UI layer refresh paths to avoid per-cell full reflows. ## Desired Outputs User-facing - Formatted cell text (numbers, currencies, dates, times, percentages, scientific, fractions, custom text) displayed correctly per locale and cell format rules. - Visual fill effects for formats with `*` and correct alignment (right/left) depending on detected type. - Proper behavior when editing: `isCustomType()` returns true in edit mode to preserve expected display. System-level - Events & Notifications: - Core format actions trigger internal notify flows to refresh views and related modules (charts, conditional formats). - Public notifications for localized format mapping: `localizedFormatAction` used to parse/convert localized formats. - Model artifacts: - `cell.format` persisted in `CellModel`; `defaultFormats` / `localizedFormats` maps maintained in `WorkbookNumberFormat` for id/code mapping. - DOM / CSS hooks: - UI expects to update cell content via `refreshCellElement` and uses classes like `.e-fill`, `.e-fill-before`, `.e-fill-sec` for fill rendering; filter buttons and iconset spans are considered when measuring space. - API: - `getFormatFromType(type)` and `getTypeFromFormat(format)` utilities map semantic types to format codes and vice versa. - `convertToDefaultFormat(context, format)` and `configureLocalizedFormat(context, formatOptions)` expose localization mapping for external consumers. ## Implementation Notes (short) - Maintain strict separation: Core owns format parsing/mapping and returning formatted strings; UI is responsible for DOM insertion, measuring and visual fill behavior. - Reuse `Internationalization` for culture-aware number/date formatting; always consider `localeObj.decimal` and `localeObj.group` when parsing user-input values. - Ensure batch updates when applying formats to ranges to avoid repeated DOM thrashing; use `parent.renderModule.refreshSheet()` or equivalent when needed. - Keep `localizedFormats` and `defaultFormats` synchronized when workbook locale changes; expose `configureLocalizedFormat()` to allow host apps to provide culture-specific mappings. ---