@gridengine/angular-datagrid-enterprise 0.11.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -139,7 +139,7 @@ class GridLicenseWatermark {
|
|
|
139
139
|
<div class="gd-license-watermark" aria-hidden="true">
|
|
140
140
|
{{ label() }} — unlicensed — <span class="gd-license-watermark__url">{{ url() }}</span>
|
|
141
141
|
</div>
|
|
142
|
-
`, isInline: true, styles: [".gd-license-watermark{position:absolute;bottom:
|
|
142
|
+
`, isInline: true, styles: [".gd-license-watermark{position:absolute;bottom:10px;right:10px;z-index:10;display:inline-flex;align-items:center;gap:5px;padding:5px 12px;border-radius:999px;font-family:sans-serif;font-size:12px;font-weight:700;letter-spacing:.02em;color:#7c2d12;background:linear-gradient(135deg,#fde68a,#fbbf24 55%,#f59e0b);border:1px solid #d97706;box-shadow:0 2px 6px #78350f59;pointer-events:none;-webkit-user-select:none;user-select:none}.gd-license-watermark:before{content:\"\\2605\";font-size:12px;line-height:1}.gd-license-watermark__url{text-decoration:underline}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
143
143
|
}
|
|
144
144
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: GridLicenseWatermark, decorators: [{
|
|
145
145
|
type: Component,
|
|
@@ -147,7 +147,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
147
147
|
<div class="gd-license-watermark" aria-hidden="true">
|
|
148
148
|
{{ label() }} — unlicensed — <span class="gd-license-watermark__url">{{ url() }}</span>
|
|
149
149
|
</div>
|
|
150
|
-
`, styles: [".gd-license-watermark{position:absolute;bottom:
|
|
150
|
+
`, styles: [".gd-license-watermark{position:absolute;bottom:10px;right:10px;z-index:10;display:inline-flex;align-items:center;gap:5px;padding:5px 12px;border-radius:999px;font-family:sans-serif;font-size:12px;font-weight:700;letter-spacing:.02em;color:#7c2d12;background:linear-gradient(135deg,#fde68a,#fbbf24 55%,#f59e0b);border:1px solid #d97706;box-shadow:0 2px 6px #78350f59;pointer-events:none;-webkit-user-select:none;user-select:none}.gd-license-watermark:before{content:\"\\2605\";font-size:12px;line-height:1}.gd-license-watermark__url{text-decoration:underline}\n"] }]
|
|
151
151
|
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], url: [{ type: i0.Input, args: [{ isSignal: true, alias: "url", required: false }] }] } });
|
|
152
152
|
|
|
153
153
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gridengine-angular-datagrid-enterprise.mjs","sources":["../../../projects/enterprise/src/lib/keyring.ts","../../../projects/enterprise/src/lib/license-manager.ts","../../../projects/enterprise/src/lib/license-watermark.ts","../../../projects/enterprise/src/lib/data-grid-pro.ts","../../../projects/enterprise/src/lib/provide-license.ts","../../../projects/enterprise/src/lib/features/range-selection.ts","../../../projects/enterprise/src/lib/features/clipboard.ts","../../../projects/enterprise/src/lib/features/fill-handle.ts","../../../projects/enterprise/src/lib/features/undo-redo.ts","../../../projects/enterprise/src/lib/features/formula.ts","../../../projects/enterprise/src/lib/features/ssrm.ts","../../../projects/enterprise/src/lib/features/transactions.ts","../../../projects/enterprise/src/lib/features/transaction-controller.ts","../../../projects/enterprise/src/lib/features/master-detail.ts","../../../projects/enterprise/src/lib/features/permissions.ts","../../../projects/enterprise/src/lib/features/audit-trail.ts","../../../projects/enterprise/src/lib/features/row-lock.ts","../../../projects/enterprise/src/lib/features/filter.ts","../../../projects/enterprise/src/lib/features/saved-views.ts","../../../projects/enterprise/src/lib/features/import.ts","../../../projects/enterprise/src/lib/features/pdf-export.ts","../../../projects/enterprise/src/lib/features/form-editor.ts","../../../projects/enterprise/src/lib/features/grid-integration.ts","../../../projects/enterprise/src/lib/features/range-selection.directive.ts","../../../projects/enterprise/src/public-api.ts","../../../projects/enterprise/src/gridengine-angular-datagrid-enterprise.ts"],"sourcesContent":["/**\n * Public verifying keys for GridEngine Angular license keys.\n *\n * These are Ed25519 PUBLIC keys, keyed by `keyId` — safe to ship in the bundle\n * (they can only verify signatures, never mint keys). The matching PRIVATE key\n * lives only in the GridEngine store backend (Azure Key Vault secret\n * `signing-angular-datagrid`). Rotate by adding a new keyId here alongside the\n * old one, until previously issued keys expire.\n */\nimport type { PublicKeyRing } from '@gridengine/license-core';\n\n/** The product id GridEngine license keys are scoped to for this package. */\nexport const PRODUCT_ID = 'angular-datagrid';\n\n/** Where a buyer can purchase / activate a license. */\nexport const PURCHASE_URL = 'https://angular.gridengine.dev/pricing';\n\nexport const PUBLIC_KEYRING: PublicKeyRing = {\n 'angular-datagrid-2026-08-09': 'GJx3r0A-xL2Q3-poGd3WbOh_B0EN9wwWOxMdksxs_S4',\n};\n","/**\n * LicenseManager — validates a `@gridengine/angular-datagrid-enterprise` license key.\n *\n * Verification uses `@gridengine/license-core` (Ed25519, keyring-based) — the\n * same scheme the GridEngine store uses to sign keys after a real purchase. The\n * private signing key lives only in the store's backend (Key Vault); this\n * package ships only the matching PUBLIC verifying key, so it can check a key's\n * authenticity but never mint one.\n *\n * This is soft licensing, not DRM: validation is synchronous and client-side,\n * and a determined user could strip the check from their own bundle. Server-\n * side entitlement checks remain authoritative for anything that matters.\n *\n * Feature access is derived from the license TIER (see `TIER_FEATURES`), with\n * `payload.features` allowed to grant additional flags on top. The support\n * level is metadata only — it never gates any in-bundle behaviour.\n */\nimport {\n validateLicense,\n resolveFeatures as coreResolveFeatures,\n TIER_FEATURES,\n type LicensePayload,\n type LicenseTier,\n type SupportLevel,\n type LicenseStatus,\n type LicenseValidationResult,\n type PublicKeyRing,\n} from '@gridengine/license-core';\nimport { PRODUCT_ID, PURCHASE_URL, PUBLIC_KEYRING } from './keyring';\n\nexport type {\n LicensePayload,\n LicenseTier,\n SupportLevel,\n LicenseStatus,\n LicenseValidationResult,\n};\nexport { TIER_FEATURES };\n\nconst _cache = new Map<string, LicenseValidationResult>();\n\n/**\n * Global license key, set once at app bootstrap (typically via\n * `provideGridEngineLicense(key)`) so every `<gd-data-grid-pro>` in the app\n * picks it up without needing a `licenseKey` input on each instance. A\n * `licenseKey` input, when given, still overrides this for that instance.\n */\nlet _globalLicenseKey: string | undefined;\n\n/** Set the license key once for the whole app (e.g. at app bootstrap). */\nfunction setLicenseKey(key: string | undefined): void {\n _globalLicenseKey = key;\n}\n\n/** The key previously set via `setLicenseKey`, if any. */\nfunction getLicenseKey(): string | undefined {\n return _globalLicenseKey;\n}\n\n/**\n * Validate a key against an arbitrary keyring. Exported (but not part of the\n * public `LicenseManager` API surface) so tests can verify against a throwaway\n * test keypair instead of the real production keyring.\n */\nexport function validateWithKeyring(\n key: string | undefined,\n keys: PublicKeyRing | string,\n): LicenseValidationResult {\n if (!key) {\n return {\n status: 'missing',\n payload: null,\n message:\n 'No @gridengine/angular-datagrid-enterprise license key provided. ' +\n 'A watermark will be displayed. ' +\n `Purchase a license at ${PURCHASE_URL}`,\n };\n }\n return validateLicense(key, keys, PRODUCT_ID);\n}\n\n/**\n * Validate a license key string. Results are cached per key so validation runs\n * at most once per key per session.\n */\nfunction validate(key: string | undefined): LicenseValidationResult {\n if (!key) return validateWithKeyring(key, PUBLIC_KEYRING);\n\n const cached = _cache.get(key);\n if (cached) return cached;\n\n const result = validateWithKeyring(key, PUBLIC_KEYRING);\n _cache.set(key, result);\n return result;\n}\n\n/**\n * The set of feature flags granted by a validated payload: the tier defaults\n * plus any explicit extras in `payload.features`.\n */\nfunction resolveFeatures(payload: LicensePayload): Set<string> {\n return coreResolveFeatures(payload);\n}\n\n/**\n * Check whether a specific feature is enabled for a key, against an arbitrary\n * keyring. Exported (but not part of the public `LicenseManager` API surface)\n * so tests can exercise this without the real production keyring.\n */\nexport function isFeatureEnabledWithKeyring(\n key: string | undefined,\n feature: string,\n keys: PublicKeyRing | string,\n): boolean {\n if (!key) return true; // evaluation mode\n const result = validateWithKeyring(key, keys);\n if (result.status !== 'valid' || !result.payload) return false;\n return resolveFeatures(result.payload).has(feature);\n}\n\n/**\n * Check whether a specific feature is enabled for a given key. Returns true\n * when no key is given (evaluation mode — features accessible but watermarked),\n * and false for any non-valid license.\n */\nfunction isFeatureEnabled(key: string | undefined, feature: string): boolean {\n if (!key) return true; // evaluation mode\n const result = validate(key);\n if (result.status !== 'valid' || !result.payload) return false;\n return resolveFeatures(result.payload).has(feature);\n}\n\nexport const LicenseManager = {\n validate,\n isFeatureEnabled,\n setLicenseKey,\n getLicenseKey,\n TIER_FEATURES,\n} as const;\n","/**\n * GridLicenseWatermark — a subtle, non-blocking evaluation watermark shown in\n * the corner of an enterprise grid when no valid license key is provided.\n *\n * The grid stays fully functional in evaluation mode; this only signals that a\n * license is required for production use. It is rendered automatically by\n * `<gd-data-grid-pro>` but is also exported for advanced consumers who compose\n * the grid themselves.\n */\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { PURCHASE_URL } from './keyring';\n\n@Component({\n selector: 'gd-license-watermark',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"gd-license-watermark\" aria-hidden=\"true\">\n {{ label() }} — unlicensed — <span class=\"gd-license-watermark__url\">{{ url() }}</span>\n </div>\n `,\n styles: [\n `\n .gd-license-watermark {\n position: absolute;\n bottom: 8px;\n right: 12px;\n z-index: 10;\n font-family: sans-serif;\n font-size: 11px;\n letter-spacing: 0.02em;\n color: rgba(0, 0, 0, 0.35);\n pointer-events: none;\n user-select: none;\n }\n .gd-license-watermark__url {\n text-decoration: underline;\n }\n `,\n ],\n})\nexport class GridLicenseWatermark {\n /** Package label shown in the watermark. */\n readonly label = input('@gridengine/angular-datagrid-enterprise');\n /** Purchase URL shown in the watermark. */\n readonly url = input(PURCHASE_URL);\n}\n","/**\n * DataGridPro — the license-aware wrapper for the GridEngine Angular grid.\n *\n * Projects a base `<gd-data-grid>` (or any content) and overlays an evaluation\n * watermark when no valid license key is present. The grid remains fully\n * functional without a license (evaluation mode); this component only adds the\n * watermark + a one-time console warning.\n *\n * ```html\n * <gd-data-grid-pro [licenseKey]=\"key\">\n * <gd-data-grid [rowData]=\"rows\" [columnDefs]=\"cols\" />\n * </gd-data-grid-pro>\n * ```\n *\n * A `[licenseKey]` input overrides the app-wide key set via\n * `provideGridEngineLicense()` / `LicenseManager.setLicenseKey()`.\n */\nimport { ChangeDetectionStrategy, Component, computed, effect, input } from '@angular/core';\nimport type { LicenseValidationResult } from '@gridengine/license-core';\nimport { LicenseManager } from './license-manager';\nimport { GridLicenseWatermark } from './license-watermark';\n\n@Component({\n selector: 'gd-data-grid-pro',\n standalone: true,\n imports: [GridLicenseWatermark],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"gd-data-grid-pro\">\n <ng-content />\n @if (showWatermark()) {\n <gd-license-watermark />\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .gd-data-grid-pro {\n position: relative;\n display: block;\n }\n `,\n ],\n})\nexport class DataGridPro {\n /** Per-instance license key; overrides the app-wide key when provided. */\n readonly licenseKey = input<string | undefined>(undefined);\n\n protected readonly licenseResult = computed<LicenseValidationResult>(() =>\n LicenseManager.validate(this.licenseKey() ?? LicenseManager.getLicenseKey()),\n );\n\n protected readonly showWatermark = computed(() => this.licenseResult().status !== 'valid');\n\n private warned = false;\n\n constructor() {\n effect(() => {\n const result = this.licenseResult();\n if (!this.warned && result.status !== 'valid') {\n console.warn(`[@gridengine/angular-datagrid-enterprise] ${result.message}`);\n this.warned = true;\n }\n });\n }\n\n /** The current license validation result (for advanced consumers). */\n getLicenseResult(): LicenseValidationResult {\n return this.licenseResult();\n }\n}\n","/**\n * `provideGridEngineLicense` — register a GridEngine Angular license key once\n * for the whole application at bootstrap.\n *\n * Usage (standalone bootstrap):\n *\n * ```ts\n * bootstrapApplication(App, {\n * providers: [provideGridEngineLicense('BASE64URL.payload.signature')],\n * });\n * ```\n *\n * Every `<gd-data-grid-pro>` in the app then picks the key up automatically via\n * `LicenseManager.getLicenseKey()`; a per-instance `[licenseKey]` input still\n * overrides it for that instance.\n */\nimport { makeEnvironmentProviders, provideEnvironmentInitializer } from '@angular/core';\nimport type { EnvironmentProviders } from '@angular/core';\nimport { LicenseManager } from './license-manager';\n\nexport function provideGridEngineLicense(key: string | undefined): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideEnvironmentInitializer(() => LicenseManager.setLicenseKey(key)),\n ]);\n}\n","/**\n * RangeSelectionEngine — tracks a rectangular cell selection (anchor +\n * extension) and notifies a listener on every change. Pure logic, no DOM.\n */\nimport type { CellRange } from './cell-range';\n\nexport interface RangeSelectionEngineOptions {\n /** Called whenever the selection changes. */\n onChange?: (range: CellRange | null) => void;\n}\n\nexport class RangeSelectionEngine {\n private _selection: CellRange | null = null;\n private _anchor: { rowIndex: number; colIndex: number } | null = null;\n private readonly _onChange?: (range: CellRange | null) => void;\n\n constructor(options: RangeSelectionEngineOptions = {}) {\n this._onChange = options.onChange;\n }\n\n /** Begin a new selection at an anchor cell (mouse down / keyboard). */\n startSelection(rowIndex: number, colIndex: number): void {\n this._anchor = { rowIndex, colIndex };\n this._selection = {\n startRowIndex: rowIndex,\n endRowIndex: rowIndex,\n startColIndex: colIndex,\n endColIndex: colIndex,\n };\n this._notify();\n }\n\n /** Extend the selection to a new endpoint (mouse move / Shift+arrow). */\n extendSelection(rowIndex: number, colIndex: number): void {\n if (!this._anchor) {\n this.startSelection(rowIndex, colIndex);\n return;\n }\n this._selection = RangeSelectionEngine._normalize(\n this._anchor.rowIndex,\n this._anchor.colIndex,\n rowIndex,\n colIndex,\n );\n this._notify();\n }\n\n /** Programmatically set the selection range. */\n setSelection(range: CellRange | null): void {\n this._selection = range;\n this._anchor = range\n ? { rowIndex: range.startRowIndex, colIndex: range.startColIndex }\n : null;\n this._notify();\n }\n\n /** Clear the selection. */\n clear(): void {\n this._selection = null;\n this._anchor = null;\n this._notify();\n }\n\n getSelection(): CellRange | null {\n return this._selection;\n }\n\n /** Returns true if the given cell falls within the current selection. */\n isCellSelected(rowIndex: number, colIndex: number): boolean {\n const s = this._selection;\n if (!s) return false;\n return (\n rowIndex >= s.startRowIndex &&\n rowIndex <= s.endRowIndex &&\n colIndex >= s.startColIndex &&\n colIndex <= s.endColIndex\n );\n }\n\n /** Expand/contract the selection one step in a direction (keyboard nav). */\n expandByKey(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight',\n totalRows: number,\n totalCols: number,\n ): void {\n const s = this._selection;\n if (!s || !this._anchor) return;\n\n let { endRowIndex, endColIndex } = s;\n\n switch (key) {\n case 'ArrowUp':\n endRowIndex = Math.max(0, endRowIndex - 1);\n break;\n case 'ArrowDown':\n endRowIndex = Math.min(totalRows - 1, endRowIndex + 1);\n break;\n case 'ArrowLeft':\n endColIndex = Math.max(0, endColIndex - 1);\n break;\n case 'ArrowRight':\n endColIndex = Math.min(totalCols - 1, endColIndex + 1);\n break;\n }\n\n this._selection = RangeSelectionEngine._normalize(\n this._anchor.rowIndex,\n this._anchor.colIndex,\n endRowIndex,\n endColIndex,\n );\n this._notify();\n }\n\n private _notify(): void {\n this._onChange?.(this._selection);\n }\n\n /** Normalise anchor + endpoint into a top-left / bottom-right rectangle. */\n private static _normalize(r1: number, c1: number, r2: number, c2: number): CellRange {\n return {\n startRowIndex: Math.min(r1, r2),\n endRowIndex: Math.max(r1, r2),\n startColIndex: Math.min(c1, c2),\n endColIndex: Math.max(c1, c2),\n };\n }\n}\n","/**\n * ClipboardEngine — Ctrl+C/X/V over a selected cell range, serialised as TSV\n * (tab-separated) so it round-trips with Excel / Google Sheets. Pure logic;\n * the caller supplies cell get/set accessors.\n */\nimport type { RangeSelectionEngine } from './range-selection';\n\nexport interface ClipboardEngineOptions {\n getCellValue: (rowIndex: number, colIndex: number) => unknown;\n setCellValue: (rowIndex: number, colIndex: number, value: string) => void;\n getTotalCols: () => number;\n getTotalRows: () => number;\n onCopy?: (data: string[][]) => void;\n onPaste?: (data: string[][], startRow: number, startCol: number) => boolean | void;\n rangeSelection: RangeSelectionEngine;\n}\n\n/** Escape a cell value for TSV: quote it if it contains tab/newline/quotes. */\nfunction escapeTSV(value: unknown): string {\n const str = value == null ? '' : String(value);\n if (str.includes('\\t') || str.includes('\\n') || str.includes('\"')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\n\n/**\n * Parse TSV text into a 2-D array of strings. Character-by-character so it\n * handles quoted cells with embedded tabs/newlines, escaped quotes (\"\"),\n * trailing tabs, and CRLF/LF line endings.\n */\nexport function parseTSV(tsv: string): string[][] {\n if (!tsv) return [];\n\n const rows: string[][] = [];\n let currentRow: string[] = [];\n let i = 0;\n\n while (i <= tsv.length) {\n if (i === tsv.length) {\n if (currentRow.length > 0) rows.push(currentRow);\n break;\n }\n\n let cell = '';\n\n if (tsv[i] === '\"') {\n i++; // skip opening quote\n while (i < tsv.length) {\n if (tsv[i] === '\"' && tsv[i + 1] === '\"') {\n cell += '\"';\n i += 2;\n } else if (tsv[i] === '\"') {\n i++; // skip closing quote\n break;\n } else {\n cell += tsv[i++];\n }\n }\n } else {\n while (i < tsv.length && tsv[i] !== '\\t' && tsv[i] !== '\\n' && tsv[i] !== '\\r') {\n cell += tsv[i++];\n }\n }\n\n currentRow.push(cell);\n\n if (i < tsv.length) {\n if (tsv[i] === '\\t') {\n i++;\n // A tab at true end-of-string leaves a trailing empty cell; a tab\n // before a newline is handled by the next iteration reading it.\n if (i >= tsv.length) {\n currentRow.push('');\n }\n } else if (tsv[i] === '\\r') {\n i++;\n if (i < tsv.length && tsv[i] === '\\n') i++; // consume \\n of CRLF\n rows.push(currentRow);\n currentRow = [];\n } else if (tsv[i] === '\\n') {\n i++;\n rows.push(currentRow);\n currentRow = [];\n }\n }\n }\n\n return rows;\n}\n\nexport class ClipboardEngine {\n private readonly _opts: ClipboardEngineOptions;\n\n constructor(options: ClipboardEngineOptions) {\n this._opts = options;\n }\n\n /** Copy the selected range to the system clipboard as TSV. */\n async copy(): Promise<void> {\n const data = this._getSelectedData();\n if (!data) return;\n const tsv = data.map((row) => row.map(escapeTSV).join('\\t')).join('\\n');\n await navigator.clipboard.writeText(tsv);\n this._opts.onCopy?.(data);\n }\n\n /** Cut: copy then clear the selected range. */\n async cut(): Promise<void> {\n await this.copy();\n this._clearSelection();\n }\n\n /** Paste from the system clipboard into the top-left of the selection. */\n async paste(): Promise<void> {\n const text = await navigator.clipboard.readText();\n if (!text) return;\n\n const data = parseTSV(text);\n const selection = this._opts.rangeSelection.getSelection();\n const startRow = selection?.startRowIndex ?? 0;\n const startCol = selection?.startColIndex ?? 0;\n\n const shouldProceed = this._opts.onPaste?.(data, startRow, startCol);\n if (shouldProceed === false) return;\n\n const totalRows = this._opts.getTotalRows();\n const totalCols = this._opts.getTotalCols();\n\n for (let r = 0; r < data.length; r++) {\n for (let c = 0; c < data[r].length; c++) {\n const targetRow = startRow + r;\n const targetCol = startCol + c;\n if (targetRow >= totalRows || targetCol >= totalCols) continue;\n this._opts.setCellValue(targetRow, targetCol, data[r][c]);\n }\n }\n\n this._opts.rangeSelection.setSelection({\n startRowIndex: startRow,\n endRowIndex: Math.min(startRow + data.length - 1, totalRows - 1),\n startColIndex: startCol,\n endColIndex: Math.min(startCol + (data[0]?.length ?? 1) - 1, totalCols - 1),\n });\n }\n\n /** The selected cells as a raw string matrix (unescaped). */\n private _getSelectedData(): string[][] | null {\n const selection = this._opts.rangeSelection.getSelection();\n if (!selection) return null;\n\n const { startRowIndex, endRowIndex, startColIndex, endColIndex } = selection;\n const rows: string[][] = [];\n\n for (let r = startRowIndex; r <= endRowIndex; r++) {\n const row: string[] = [];\n for (let c = startColIndex; c <= endColIndex; c++) {\n const v = this._opts.getCellValue(r, c);\n row.push(v == null ? '' : String(v));\n }\n rows.push(row);\n }\n return rows;\n }\n\n private _clearSelection(): void {\n const selection = this._opts.rangeSelection.getSelection();\n if (!selection) return;\n\n const { startRowIndex, endRowIndex, startColIndex, endColIndex } = selection;\n for (let r = startRowIndex; r <= endRowIndex; r++) {\n for (let c = startColIndex; c <= endColIndex; c++) {\n this._opts.setCellValue(r, c, '');\n }\n }\n }\n}\n","/**\n * FillHandleEngine — computes the values to write when the user drags the fill\n * handle at the bottom-right of a range selection. Pure logic, no DOM.\n *\n * Modes:\n * 'copy' — repeat the source values into every target cell.\n * 'series' — continue a detected numeric / date / day-name / month-name\n * series; falls back to 'copy' when no series is detected.\n */\nimport type { CellRange } from './cell-range';\n\nexport type FillDirection = 'down' | 'up' | 'right' | 'left';\n\nexport interface FillCell {\n rowIndex: number;\n colIndex: number;\n value: unknown;\n}\n\nexport interface FillResult {\n direction: FillDirection;\n cells: FillCell[];\n}\n\nexport interface FillHandleEngineOptions {\n mode: 'copy' | 'series';\n getCellValue: (rowIndex: number, colIndex: number) => unknown;\n}\n\n/** Parse a value as a finite number, or null. */\nexport function toNumber(value: unknown): number | null {\n if (typeof value === 'number' && isFinite(value)) return value;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const n = Number(trimmed);\n return isFinite(n) ? n : null;\n }\n return null;\n}\n\n/** Parse a value as a Date timestamp (ms), or null. */\nexport function toTimestamp(value: unknown): number | null {\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value.getTime();\n if (typeof value === 'string') {\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d.getTime();\n }\n return null;\n}\n\nconst DAY_NAMES = [\n ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'],\n ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'],\n];\nconst MONTH_NAMES = [\n ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'],\n ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'],\n];\n\ninterface NamedSeriesMatch {\n list: string[];\n index: number;\n originalCase: 'lower' | 'upper' | 'title';\n}\n\nfunction matchNamedSeries(value: unknown): NamedSeriesMatch | null {\n if (typeof value !== 'string') return null;\n const lower = value.trim().toLowerCase();\n for (const list of [...DAY_NAMES, ...MONTH_NAMES]) {\n const idx = list.indexOf(lower);\n if (idx !== -1) {\n const original = value.trim();\n const originalCase =\n original === original.toUpperCase()\n ? 'upper'\n : original[0] === original[0].toUpperCase()\n ? 'title'\n : 'lower';\n return { list, index: idx, originalCase };\n }\n }\n return null;\n}\n\nfunction applyCase(s: string, caseStyle: 'lower' | 'upper' | 'title'): string {\n if (caseStyle === 'upper') return s.toUpperCase();\n if (caseStyle === 'title') return s[0].toUpperCase() + s.slice(1).toLowerCase();\n return s.toLowerCase();\n}\n\nexport class FillHandleEngine {\n private readonly _opts: FillHandleEngineOptions;\n\n constructor(options: FillHandleEngineOptions) {\n this._opts = options;\n }\n\n /**\n * Compute the cells to fill given a source selection and the extended target\n * selection after dragging the handle. Returns null for an invalid drag.\n */\n computeFill(sourceRange: CellRange, targetRange: CellRange): FillResult | null {\n const direction = this._detectDirection(sourceRange, targetRange);\n if (!direction) return null;\n\n const sourceValues = this._extractSource(sourceRange, direction);\n const targetCells = this._buildTargetCells(sourceRange, targetRange, direction);\n\n const filledValues =\n this._opts.mode === 'series'\n ? this._fillSeries(sourceValues, targetCells.length)\n : this._fillCopy(sourceValues, targetCells.length);\n\n return {\n direction,\n cells: targetCells.map((cell, i) => ({ ...cell, value: filledValues[i] })),\n };\n }\n\n private _detectDirection(source: CellRange, target: CellRange): FillDirection | null {\n if (\n target.startRowIndex > source.startRowIndex ||\n target.endRowIndex < source.endRowIndex ||\n target.startColIndex > source.startColIndex ||\n target.endColIndex < source.endColIndex\n ) {\n return null;\n }\n\n const extendedDown = target.endRowIndex > source.endRowIndex;\n const extendedUp = target.startRowIndex < source.startRowIndex;\n const extendedRight = target.endColIndex > source.endColIndex;\n const extendedLeft = target.startColIndex < source.startColIndex;\n\n const directions = [extendedDown, extendedUp, extendedRight, extendedLeft].filter(Boolean);\n if (directions.length !== 1) return null;\n\n if (extendedDown) return 'down';\n if (extendedUp) return 'up';\n if (extendedRight) return 'right';\n return 'left';\n }\n\n private _extractSource(source: CellRange, direction: FillDirection): unknown[] {\n const values: unknown[] = [];\n if (direction === 'down' || direction === 'up') {\n for (let r = source.startRowIndex; r <= source.endRowIndex; r++) {\n values.push(this._opts.getCellValue(r, source.startColIndex));\n }\n } else {\n for (let c = source.startColIndex; c <= source.endColIndex; c++) {\n values.push(this._opts.getCellValue(source.startRowIndex, c));\n }\n }\n return values;\n }\n\n private _buildTargetCells(\n source: CellRange,\n target: CellRange,\n direction: FillDirection,\n ): { rowIndex: number; colIndex: number }[] {\n const cells: { rowIndex: number; colIndex: number }[] = [];\n\n if (direction === 'down') {\n for (let r = source.endRowIndex + 1; r <= target.endRowIndex; r++) {\n for (let c = source.startColIndex; c <= source.endColIndex; c++) {\n cells.push({ rowIndex: r, colIndex: c });\n }\n }\n } else if (direction === 'up') {\n for (let r = target.startRowIndex; r < source.startRowIndex; r++) {\n for (let c = source.startColIndex; c <= source.endColIndex; c++) {\n cells.push({ rowIndex: r, colIndex: c });\n }\n }\n } else if (direction === 'right') {\n for (let r = source.startRowIndex; r <= source.endRowIndex; r++) {\n for (let c = source.endColIndex + 1; c <= target.endColIndex; c++) {\n cells.push({ rowIndex: r, colIndex: c });\n }\n }\n } else {\n for (let r = source.startRowIndex; r <= source.endRowIndex; r++) {\n for (let c = target.startColIndex; c < source.startColIndex; c++) {\n cells.push({ rowIndex: r, colIndex: c });\n }\n }\n }\n\n return cells;\n }\n\n private _fillCopy(source: unknown[], count: number): unknown[] {\n const result: unknown[] = [];\n for (let i = 0; i < count; i++) {\n result.push(source[i % source.length]);\n }\n return result;\n }\n\n private _fillSeries(source: unknown[], count: number): unknown[] {\n if (source.length >= 1) {\n const match = matchNamedSeries(source[0]);\n if (match) return this._fillNamedSeries(source, count, match);\n }\n\n const nums = source.map(toNumber);\n if (nums.every((n) => n !== null)) {\n return this._fillNumericSeries(nums as number[], count);\n }\n\n const timestamps = source.map(toTimestamp);\n if (timestamps.every((t) => t !== null)) {\n return this._fillDateSeries(source, timestamps as number[], count);\n }\n\n return this._fillCopy(source, count);\n }\n\n private _fillNumericSeries(source: number[], count: number): number[] {\n const step = source.length > 1 ? source[1] - source[0] : 1;\n const last = source[source.length - 1];\n const result: number[] = [];\n for (let i = 1; i <= count; i++) {\n result.push(last + step * i);\n }\n return result;\n }\n\n private _fillDateSeries(originalSource: unknown[], timestamps: number[], count: number): string[] {\n const step = timestamps.length > 1 ? timestamps[1] - timestamps[0] : 24 * 60 * 60 * 1000;\n const last = timestamps[timestamps.length - 1];\n\n const sampleStr = typeof originalSource[0] === 'string' ? (originalSource[0] as string) : '';\n const isDateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(sampleStr.trim());\n\n return Array.from({ length: count }, (_, i) => {\n const d = new Date(last + step * (i + 1));\n return isDateOnly ? d.toISOString().slice(0, 10) : d.toISOString();\n });\n }\n\n private _fillNamedSeries(source: unknown[], count: number, match: NamedSeriesMatch): string[] {\n const { list, index: firstIndex, originalCase } = match;\n const indexOf = (v: unknown) =>\n typeof v === 'string' ? list.indexOf(v.trim().toLowerCase()) : -1;\n\n const lastIndex = indexOf(source[source.length - 1]);\n const startIndex = lastIndex >= 0 ? lastIndex : firstIndex;\n const secondIndex = source.length > 1 ? indexOf(source[1]) : -1;\n const step =\n secondIndex >= 0 ? ((secondIndex - firstIndex + list.length) % list.length) || 1 : 1;\n\n const result: string[] = [];\n for (let i = 1; i <= count; i++) {\n const nextIndex = (((startIndex + step * i) % list.length) + list.length) % list.length;\n result.push(applyCase(list[nextIndex], originalCase));\n }\n return result;\n }\n}\n","/**\n * UndoRedoManager — a bounded undo/redo command stack. Each command stores\n * enough state to reverse itself; the manager applies changes through the\n * `applyValue` callback the host supplies (it never mutates data directly).\n */\n\nexport interface CellEditCommand {\n type: 'cellEdit';\n rowId: string | number;\n field: string;\n prevValue: unknown;\n nextValue: unknown;\n}\n\nexport interface PasteCommand {\n type: 'paste';\n cells: { rowId: string | number; field: string; prevValue: unknown; nextValue: unknown }[];\n}\n\nexport interface FillCommand {\n type: 'fill';\n cells: { rowId: string | number; field: string; prevValue: unknown; nextValue: unknown }[];\n}\n\nexport interface DeleteCommand {\n type: 'delete';\n cells: { rowId: string | number; field: string; prevValue: unknown }[];\n}\n\nexport type UndoRedoCommand = CellEditCommand | PasteCommand | FillCommand | DeleteCommand;\n\nexport interface UndoRedoManagerOptions {\n /** Maximum number of undo steps to retain. Default: 100 */\n maxStackSize?: number;\n /** Called whenever canUndo or canRedo changes. */\n onChange?: (canUndo: boolean, canRedo: boolean) => void;\n /** Applies a value to a cell — the manager calls this to (un)apply commands. */\n applyValue: (rowId: string | number, field: string, value: unknown) => void;\n}\n\nexport class UndoRedoManager {\n private readonly _undoStack: UndoRedoCommand[] = [];\n private readonly _redoStack: UndoRedoCommand[] = [];\n private readonly _maxStackSize: number;\n private readonly _onChange?: (canUndo: boolean, canRedo: boolean) => void;\n private readonly _applyValue: (rowId: string | number, field: string, value: unknown) => void;\n\n constructor(options: UndoRedoManagerOptions) {\n this._maxStackSize = options.maxStackSize ?? 100;\n this._onChange = options.onChange;\n this._applyValue = options.applyValue;\n }\n\n /** Push a new command onto the undo stack. Clears the redo stack. */\n push(command: UndoRedoCommand): void {\n this._undoStack.push(command);\n if (this._undoStack.length > this._maxStackSize) {\n this._undoStack.shift();\n }\n this._redoStack.length = 0;\n this._notifyChange();\n }\n\n /** Undo the most recent command. */\n undo(): void {\n const command = this._undoStack.pop();\n if (!command) return;\n this._applyCommandReverse(command);\n this._redoStack.push(command);\n this._notifyChange();\n }\n\n /** Redo the most recently undone command. */\n redo(): void {\n const command = this._redoStack.pop();\n if (!command) return;\n this._applyCommandForward(command);\n this._undoStack.push(command);\n this._notifyChange();\n }\n\n canUndo(): boolean {\n return this._undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this._redoStack.length > 0;\n }\n\n /** Clear both stacks (e.g. after a full data reload). */\n clear(): void {\n this._undoStack.length = 0;\n this._redoStack.length = 0;\n this._notifyChange();\n }\n\n undoStackSize(): number {\n return this._undoStack.length;\n }\n\n redoStackSize(): number {\n return this._redoStack.length;\n }\n\n private _applyCommandReverse(command: UndoRedoCommand): void {\n switch (command.type) {\n case 'cellEdit':\n this._applyValue(command.rowId, command.field, command.prevValue);\n break;\n case 'paste':\n case 'fill':\n case 'delete':\n for (const cell of command.cells) {\n this._applyValue(cell.rowId, cell.field, cell.prevValue);\n }\n break;\n }\n }\n\n private _applyCommandForward(command: UndoRedoCommand): void {\n switch (command.type) {\n case 'cellEdit':\n this._applyValue(command.rowId, command.field, command.nextValue);\n break;\n case 'paste':\n case 'fill':\n for (const cell of command.cells) {\n this._applyValue(cell.rowId, cell.field, cell.nextValue);\n }\n break;\n case 'delete':\n for (const cell of command.cells) {\n this._applyValue(cell.rowId, cell.field, '');\n }\n break;\n }\n }\n\n private _notifyChange(): void {\n this._onChange?.(this.canUndo(), this.canRedo());\n }\n}\n","/**\n * FormulaEngine — evaluates Excel-like formula strings against row data.\n * Formulas start with '=' and reference other columns by field name.\n *\n * Functions: SUM, AVG, MIN, MAX, COUNT, IF, CONCAT, ROUND, ABS, FLOOR, CEIL,\n * LEN, UPPER, LOWER. Bare identifiers that aren't function names are treated as\n * field lookups on the current row.\n *\n * Error values: '#ERROR!', '#DIV/0!', '#REF!', '#CIRCULAR!', '#NAME?'.\n * A formula that directly/transitively references its own cell yields\n * '#CIRCULAR!'.\n */\n\ntype ASTNode =\n | { kind: 'number'; value: number }\n | { kind: 'string'; value: string }\n | { kind: 'field'; name: string }\n | { kind: 'call'; fn: string; args: ASTNode[] }\n | {\n kind: 'binary';\n op: '+' | '-' | '*' | '/' | '==' | '!=' | '<' | '<=' | '>' | '>=';\n left: ASTNode;\n right: ASTNode;\n }\n | { kind: 'unary'; op: '-'; operand: ASTNode };\n\nclass Parser {\n private _src: string;\n private _pos = 0;\n\n constructor(src: string) {\n this._src = src.trim();\n }\n\n parse(): ASTNode {\n const node = this._parseExpr();\n this._skipWS();\n if (this._pos < this._src.length) {\n throw new Error(`Unexpected character at position ${this._pos}: '${this._src[this._pos]}'`);\n }\n return node;\n }\n\n private _skipWS(): void {\n while (this._pos < this._src.length && /\\s/.test(this._src[this._pos])) {\n this._pos++;\n }\n }\n\n private _consume(ch: string): void {\n this._skipWS();\n if (this._src[this._pos] !== ch) {\n throw new Error(`Expected '${ch}' at position ${this._pos}`);\n }\n this._pos++;\n }\n\n private _parseExpr(): ASTNode {\n return this._parseComparison();\n }\n\n private _parseComparison(): ASTNode {\n let left = this._parseAddSub();\n this._skipWS();\n while (this._pos < this._src.length) {\n const ch = this._src[this._pos];\n const ch2 = this._src.slice(this._pos, this._pos + 2);\n if (ch2 === '==' || ch2 === '!=' || ch2 === '<=' || ch2 === '>=') {\n this._pos += 2;\n const right = this._parseAddSub();\n left = { kind: 'binary', op: ch2, left, right };\n } else if (ch === '<' || ch === '>') {\n this._pos++;\n const right = this._parseAddSub();\n left = { kind: 'binary', op: ch, left, right };\n } else {\n break;\n }\n this._skipWS();\n }\n return left;\n }\n\n private _parseAddSub(): ASTNode {\n let left = this._parseMulDiv();\n this._skipWS();\n while (\n this._pos < this._src.length &&\n (this._src[this._pos] === '+' || this._src[this._pos] === '-')\n ) {\n const op = this._src[this._pos++] as '+' | '-';\n const right = this._parseMulDiv();\n left = { kind: 'binary', op, left, right };\n this._skipWS();\n }\n return left;\n }\n\n private _parseMulDiv(): ASTNode {\n let left = this._parseUnary();\n this._skipWS();\n while (\n this._pos < this._src.length &&\n (this._src[this._pos] === '*' || this._src[this._pos] === '/')\n ) {\n const op = this._src[this._pos++] as '*' | '/';\n const right = this._parseUnary();\n left = { kind: 'binary', op, left, right };\n this._skipWS();\n }\n return left;\n }\n\n private _parseUnary(): ASTNode {\n this._skipWS();\n if (this._src[this._pos] === '-') {\n this._pos++;\n return { kind: 'unary', op: '-', operand: this._parseUnary() };\n }\n return this._parsePrimary();\n }\n\n private _parsePrimary(): ASTNode {\n this._skipWS();\n const ch = this._src[this._pos];\n\n if (ch === undefined) {\n throw new Error('Unexpected end of expression');\n }\n\n if (ch === '(') {\n this._pos++;\n const node = this._parseExpr();\n this._consume(')');\n return node;\n }\n\n if (ch === '\"' || ch === \"'\") {\n return this._parseString(ch);\n }\n\n if (ch === '.' || (ch >= '0' && ch <= '9')) {\n return this._parseNumber();\n }\n\n if (/[A-Za-z_]/.test(ch)) {\n return this._parseIdentifier();\n }\n\n throw new Error(`Unexpected token at position ${this._pos}: '${ch}'`);\n }\n\n private _parseString(quote: string): ASTNode {\n this._pos++; // skip opening quote\n let s = '';\n while (this._pos < this._src.length && this._src[this._pos] !== quote) {\n s += this._src[this._pos++];\n }\n this._pos++; // skip closing quote\n return { kind: 'string', value: s };\n }\n\n private _parseNumber(): ASTNode {\n let s = '';\n while (this._pos < this._src.length && /[\\d.]/.test(this._src[this._pos])) {\n s += this._src[this._pos++];\n }\n if (this._src[this._pos] === 'e' || this._src[this._pos] === 'E') {\n s += this._src[this._pos++];\n if (this._src[this._pos] === '+' || this._src[this._pos] === '-') {\n s += this._src[this._pos++];\n }\n while (this._pos < this._src.length && /\\d/.test(this._src[this._pos])) {\n s += this._src[this._pos++];\n }\n }\n return { kind: 'number', value: Number(s) };\n }\n\n private _parseIdentifier(): ASTNode {\n let name = '';\n while (this._pos < this._src.length && /[\\w]/.test(this._src[this._pos])) {\n name += this._src[this._pos++];\n }\n this._skipWS();\n if (this._src[this._pos] === '(') {\n this._pos++;\n const args: ASTNode[] = [];\n this._skipWS();\n if (this._src[this._pos] !== ')') {\n args.push(this._parseExpr());\n this._skipWS();\n while (this._src[this._pos] === ',') {\n this._pos++;\n args.push(this._parseExpr());\n this._skipWS();\n }\n }\n this._consume(')');\n return { kind: 'call', fn: name.toUpperCase(), args };\n }\n return { kind: 'field', name };\n }\n}\n\ntype Row = Record<string, unknown>;\n\nconst FUNCTIONS: Record<string, (args: unknown[]) => unknown> = {\n SUM: (args) => args.reduce<number>((acc, v) => acc + (Number(v) || 0), 0),\n AVG: (args) =>\n args.length === 0 ? 0 : args.reduce<number>((acc, v) => acc + (Number(v) || 0), 0) / args.length,\n MIN: (args) => Math.min(...args.map(Number)),\n MAX: (args) => Math.max(...args.map(Number)),\n COUNT: (args) => args.filter((v) => !isNaN(Number(v)) && v !== '' && v != null).length,\n CONCAT: (args) => args.join(''),\n ROUND: ([n, d]) => Number(Number(n).toFixed(Number(d ?? 0))),\n ABS: ([n]) => Math.abs(Number(n)),\n FLOOR: ([n]) => Math.floor(Number(n)),\n CEIL: ([n]) => Math.ceil(Number(n)),\n LEN: ([s]) => String(s ?? '').length,\n UPPER: ([s]) => String(s ?? '').toUpperCase(),\n LOWER: ([s]) => String(s ?? '').toLowerCase(),\n IF: ([cond, t, f]) => (cond ? t : f),\n};\n\nfunction evalBinary(op: Extract<ASTNode, { kind: 'binary' }>['op'], l: unknown, r: unknown): unknown {\n switch (op) {\n case '+':\n return typeof l === 'string' || typeof r === 'string'\n ? String(l) + String(r)\n : Number(l) + Number(r);\n case '-':\n return Number(l) - Number(r);\n case '*':\n return Number(l) * Number(r);\n case '/': {\n const divisor = Number(r);\n return divisor === 0 ? '#DIV/0!' : Number(l) / divisor;\n }\n case '==':\n return l == r;\n case '!=':\n return l != r;\n case '<':\n return Number(l) < Number(r);\n case '<=':\n return Number(l) <= Number(r);\n case '>':\n return Number(l) > Number(r);\n case '>=':\n return Number(l) >= Number(r);\n default:\n return '#ERROR!';\n }\n}\n\nfunction evaluate(node: ASTNode, row: Row, visiting: Set<string>): unknown {\n switch (node.kind) {\n case 'number':\n return node.value;\n case 'string':\n return node.value;\n\n case 'field': {\n const key = node.name;\n if (visiting.has(key)) return '#CIRCULAR!';\n const raw = row[key];\n if (typeof raw === 'string' && raw.startsWith('=')) {\n visiting.add(key);\n try {\n const ast = new Parser(raw.slice(1)).parse();\n return evaluate(ast, row, visiting);\n } finally {\n visiting.delete(key);\n }\n }\n if (raw === undefined) return '#REF!';\n return raw;\n }\n\n case 'unary': {\n const v = evaluate(node.operand, row, visiting);\n if (typeof v === 'string' && v.startsWith('#')) return v;\n return -Number(v);\n }\n\n case 'binary': {\n const l = evaluate(node.left, row, visiting);\n const r = evaluate(node.right, row, visiting);\n if (typeof l === 'string' && l.startsWith('#')) return l;\n if (typeof r === 'string' && r.startsWith('#')) return r;\n return evalBinary(node.op, l, r);\n }\n\n case 'call': {\n const fn = FUNCTIONS[node.fn];\n if (!fn) return '#NAME?';\n const args = node.args.map((a) => evaluate(a, row, visiting));\n const err = args.find((a) => typeof a === 'string' && a.startsWith('#'));\n if (err) return err;\n return fn(args);\n }\n }\n}\n\nexport interface FormulaEngineOptions {\n /**\n * Fields that contain formula definitions. Key = field name, value = formula\n * string (e.g. '=SUM(price, tax)'). The row's field value is replaced by the\n * evaluation result.\n */\n formulaFields: Record<string, string>;\n}\n\nexport class FormulaEngine {\n private readonly _formulaFields: Record<string, string>;\n\n constructor(options: FormulaEngineOptions) {\n this._formulaFields = options.formulaFields;\n }\n\n /** Evaluate all formula fields for a row, returning a new (unmutated) row. */\n evaluateRow(row: Row): Row {\n const result: Row = { ...row };\n for (const [field, formula] of Object.entries(this._formulaFields)) {\n result[field] = this.evaluateFormula(formula, row, field);\n }\n return result;\n }\n\n /** Evaluate a single formula string against a row. */\n evaluateFormula(formula: string, row: Row, selfField?: string): unknown {\n const expr = formula.startsWith('=') ? formula.slice(1) : formula;\n try {\n const ast = new Parser(expr).parse();\n const visiting = selfField ? new Set([selfField]) : new Set<string>();\n return evaluate(ast, row, visiting);\n } catch {\n return '#ERROR!';\n }\n }\n\n /** Whether a formula string is parseable (no evaluation). */\n isValidFormula(formula: string): boolean {\n const expr = formula.startsWith('=') ? formula.slice(1) : formula;\n try {\n new Parser(expr).parse();\n return true;\n } catch {\n return false;\n }\n }\n}\n","/**\n * SSRMEngine — Server-Side Row Model: a block-based LRU cache for server-driven\n * datasets of arbitrary size. Pure logic; the caller supplies a datasource with\n * a single async `getRows()` method. Filter/sort/group models are forwarded to\n * the server. Failed fetches retry up to 3 times with exponential backoff.\n */\nimport type { GridRow } from './row';\n\nexport interface SSRMGetRowsParams {\n startRow: number;\n endRow: number;\n filterModel: Record<string, unknown>;\n sortModel: { field: string; direction: 'asc' | 'desc' }[];\n groupKeys: string[];\n}\n\nexport interface SSRMGetRowsResult {\n rows: GridRow[];\n totalCount: number;\n}\n\nexport interface SSRMDataSource {\n getRows(params: SSRMGetRowsParams): Promise<SSRMGetRowsResult>;\n}\n\nexport type BlockState = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport interface Block {\n /** Zero-based block index (index * blockSize = startRow). */\n index: number;\n state: BlockState;\n rows: GridRow[];\n error?: Error;\n /** Monotonically increasing access counter — higher = more recently used. */\n lastAccessed: number;\n}\n\nexport interface SSRMEngineOptions {\n dataSource: SSRMDataSource;\n /** Rows per block. Default: 100 */\n blockSize?: number;\n /** Maximum blocks to keep in memory (LRU eviction). Default: 10 */\n maxBlocksInCache?: number;\n}\n\nexport class SSRMEngine {\n private readonly _dataSource: SSRMDataSource;\n readonly blockSize: number;\n readonly maxBlocksInCache: number;\n\n private readonly _blocks = new Map<number, Block>();\n private _accessClock = 0;\n private _totalCount: number | null = null;\n private _filterModel: Record<string, unknown> = {};\n private _sortModel: { field: string; direction: 'asc' | 'desc' }[] = [];\n private _groupKeys: string[] = [];\n private _onChange?: () => void;\n\n constructor(options: SSRMEngineOptions) {\n this._dataSource = options.dataSource;\n this.blockSize = options.blockSize ?? 100;\n this.maxBlocksInCache = options.maxBlocksInCache ?? 10;\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n setFilterModel(model: Record<string, unknown>): void {\n this._filterModel = model;\n this._invalidateAll();\n }\n\n setSortModel(model: { field: string; direction: 'asc' | 'desc' }[]): void {\n this._sortModel = model;\n this._invalidateAll();\n }\n\n setGroupKeys(keys: string[]): void {\n this._groupKeys = keys;\n this._invalidateAll();\n }\n\n /** Total row count from the last server response (null = not yet known). */\n getTotalCount(): number | null {\n return this._totalCount;\n }\n\n /**\n * Get the row at an absolute zero-based index, fetching the containing block\n * if needed. Returns null while the block is loading.\n */\n getRow(rowIndex: number): GridRow | null {\n const blockIndex = Math.floor(rowIndex / this.blockSize);\n const block = this._getOrCreateBlock(blockIndex);\n\n if (block.state === 'loaded') {\n const localIndex = rowIndex - blockIndex * this.blockSize;\n return block.rows[localIndex] ?? null;\n }\n return null;\n }\n\n /** Rows for the viewport [startRow, endRow); missing slots are null. */\n getRowSlice(startRow: number, endRow: number): (GridRow | null)[] {\n const result: (GridRow | null)[] = [];\n for (let i = startRow; i < endRow; i++) {\n result.push(this.getRow(i));\n }\n return result;\n }\n\n getBlockState(blockIndex: number): BlockState {\n return this._blocks.get(blockIndex)?.state ?? 'idle';\n }\n\n getBlocks(): ReadonlyMap<number, Block> {\n return this._blocks;\n }\n\n /** Evict all cached blocks and reset total count. */\n invalidateAll(): void {\n this._invalidateAll();\n }\n\n /** Evict a specific block (e.g. after a row mutation on that page). */\n invalidateBlock(blockIndex: number): void {\n this._blocks.delete(blockIndex);\n this._notify();\n }\n\n private _getOrCreateBlock(blockIndex: number): Block {\n let block = this._blocks.get(blockIndex);\n\n if (!block) {\n if (this._blocks.size >= this.maxBlocksInCache) {\n this._evictOldest();\n }\n block = { index: blockIndex, state: 'idle', rows: [], lastAccessed: ++this._accessClock };\n this._blocks.set(blockIndex, block);\n }\n\n block.lastAccessed = ++this._accessClock;\n\n if (block.state === 'idle' || block.state === 'error') {\n this._fetchBlock(block);\n }\n\n return block;\n }\n\n private _fetchBlock(block: Block, retryCount = 0): void {\n block.state = 'loading';\n this._notify();\n\n const startRow = block.index * this.blockSize;\n const params: SSRMGetRowsParams = {\n startRow,\n endRow: startRow + this.blockSize,\n filterModel: this._filterModel,\n sortModel: this._sortModel,\n groupKeys: this._groupKeys,\n };\n\n this._dataSource\n .getRows(params)\n .then((result: SSRMGetRowsResult) => {\n block.state = 'loaded';\n block.rows = result.rows;\n block.error = undefined;\n this._totalCount = result.totalCount;\n this._notify();\n })\n .catch((err: Error) => {\n if (retryCount < 3) {\n const delay = Math.pow(2, retryCount) * 1000; // 1s, 2s, 4s\n setTimeout(() => this._fetchBlock(block, retryCount + 1), delay);\n } else {\n block.state = 'error';\n block.error = err;\n this._notify();\n }\n });\n }\n\n private _evictOldest(): void {\n let oldest: Block | null = null;\n for (const block of this._blocks.values()) {\n if (!oldest || block.lastAccessed < oldest.lastAccessed) {\n oldest = block;\n }\n }\n if (oldest) {\n this._blocks.delete(oldest.index);\n }\n }\n\n private _invalidateAll(): void {\n this._blocks.clear();\n this._totalCount = null;\n this._notify();\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * TransactionEngine — stages add / update / remove operations against a row set\n * without mutating the original array. Changes are held until commit (fires\n * `onTransactionCommit` with the delta) or rollback (discards them). Row\n * identity comes from `rowIdField` (default 'id').\n */\nimport type { GridRow } from './row';\n\nexport interface TransactionDelta {\n added: GridRow[];\n updated: GridRow[];\n removedIds: (string | number)[];\n}\n\nexport interface TransactionEngineOptions {\n /** Initial rows loaded from the grid. */\n initialRows: GridRow[];\n /** Field used as the unique row ID. Default: 'id' */\n rowIdField?: string;\n onTransactionCommit?: (delta: TransactionDelta) => void;\n onTransactionRollback?: () => void;\n}\n\ntype DirtyState = 'added' | 'updated' | 'removed';\n\ninterface DirtyEntry {\n state: DirtyState;\n /** Row data as it was when first dirtied (for rollback); null for adds. */\n original: GridRow | null;\n /** Current (staged) data. */\n current: GridRow;\n}\n\nexport class TransactionEngine {\n private readonly _rowIdField: string;\n private readonly _onCommit?: (delta: TransactionDelta) => void;\n private readonly _onRollback?: () => void;\n\n private _baseRows: GridRow[];\n private readonly _dirty = new Map<string | number, DirtyEntry>();\n\n constructor(opts: TransactionEngineOptions) {\n this._rowIdField = opts.rowIdField ?? 'id';\n this._onCommit = opts.onTransactionCommit;\n this._onRollback = opts.onTransactionRollback;\n this._baseRows = [...opts.initialRows];\n }\n\n /** Stage new rows; an existing ID is treated as an update instead. */\n addRows(rows: GridRow[]): void {\n for (const row of rows) {\n const id = this._rowId(row);\n const existing = this._findBase(id);\n if (existing !== null) {\n this._stageUpdate(id, existing, row);\n } else {\n this._dirty.set(id, { state: 'added', original: null, current: { ...row } });\n }\n }\n }\n\n /** Stage updates for existing rows; unknown IDs are ignored with a warning. */\n updateRows(rows: GridRow[]): void {\n for (const row of rows) {\n const id = this._rowId(row);\n const existing = this._dirty.get(id);\n\n if (existing?.state === 'added') {\n existing.current = { ...existing.current, ...row };\n } else {\n const base = this._findBase(id);\n if (base === null) {\n console.warn(`TransactionEngine.updateRows: row with id '${id}' not found.`);\n continue;\n }\n this._stageUpdate(id, existing?.original ?? base, row);\n }\n }\n }\n\n /** Stage rows for removal by ID; a still-staged add is simply cancelled. */\n removeRows(ids: (string | number)[]): void {\n for (const id of ids) {\n const existing = this._dirty.get(id);\n\n if (existing?.state === 'added') {\n this._dirty.delete(id);\n continue;\n }\n\n const base = this._findBase(id);\n if (base === null) {\n console.warn(`TransactionEngine.removeRows: row with id '${id}' not found.`);\n continue;\n }\n\n this._dirty.set(id, { state: 'removed', original: existing?.original ?? base, current: base });\n }\n }\n\n commitTransaction(): void {\n const delta = this._buildDelta();\n\n for (const [id, entry] of this._dirty) {\n if (entry.state === 'added') {\n this._baseRows.push(entry.current);\n } else if (entry.state === 'updated') {\n const idx = this._baseRows.findIndex((r) => this._rowId(r) === id);\n if (idx !== -1) this._baseRows[idx] = entry.current;\n } else if (entry.state === 'removed') {\n this._baseRows = this._baseRows.filter((r) => this._rowId(r) !== id);\n }\n }\n\n this._dirty.clear();\n this._onCommit?.(delta);\n }\n\n rollbackTransaction(): void {\n this._dirty.clear();\n this._onRollback?.();\n }\n\n /** True if there are any staged (uncommitted) changes. */\n isDirty(): boolean {\n return this._dirty.size > 0;\n }\n\n /** All current staged changes, grouped by kind. */\n getDirtyRows(): { added: GridRow[]; updated: GridRow[]; removed: GridRow[] } {\n const added: GridRow[] = [];\n const updated: GridRow[] = [];\n const removed: GridRow[] = [];\n\n for (const entry of this._dirty.values()) {\n if (entry.state === 'added') added.push(entry.current);\n else if (entry.state === 'updated') updated.push(entry.current);\n else if (entry.state === 'removed' && entry.original !== null) removed.push(entry.original);\n }\n\n return { added, updated, removed };\n }\n\n /** The merged row list: base rows with staged changes applied. */\n getDisplayRows(): GridRow[] {\n const rows: GridRow[] = [];\n\n for (const baseRow of this._baseRows) {\n const id = this._rowId(baseRow);\n const entry = this._dirty.get(id);\n if (!entry) {\n rows.push(baseRow);\n } else if (entry.state === 'updated') {\n rows.push(entry.current);\n }\n // 'removed' rows are omitted; 'added' rows are appended below.\n }\n\n for (const entry of this._dirty.values()) {\n if (entry.state === 'added') rows.push(entry.current);\n }\n\n return rows;\n }\n\n /** Replace the base rows (e.g. after a refresh); staged changes are kept. */\n resetRows(rows: GridRow[]): void {\n this._baseRows = [...rows];\n }\n\n private _rowId(row: GridRow): string | number {\n const id = row[this._rowIdField];\n if (id === undefined || id === null) {\n throw new Error(\n `TransactionEngine: row has no '${this._rowIdField}' field. Set rowIdField to match your data.`,\n );\n }\n return id as string | number;\n }\n\n private _findBase(id: string | number): GridRow | null {\n return this._baseRows.find((r) => this._rowId(r) === id) ?? null;\n }\n\n private _stageUpdate(id: string | number, original: GridRow, next: GridRow): void {\n this._dirty.set(id, { state: 'updated', original, current: { ...original, ...next } });\n }\n\n private _buildDelta(): TransactionDelta {\n const added: GridRow[] = [];\n const updated: GridRow[] = [];\n const removedIds: (string | number)[] = [];\n\n for (const [id, entry] of this._dirty) {\n if (entry.state === 'added') added.push(entry.current);\n else if (entry.state === 'updated') updated.push(entry.current);\n else if (entry.state === 'removed') removedIds.push(id);\n }\n\n return { added, updated, removedIds };\n }\n}\n","/**\n * TransactionController — a reactive (signals) wrapper around `TransactionEngine`\n * for the open-source `<gd-data-grid>`. Bind `displayRows()` to `[rowData]` and\n * pipe `(cellValueChanged)` into `onCellValueChanged` to stage inline edits\n * without mutating the base data; then `commit()` / `rollback()`:\n *\n * ```html\n * <gd-data-grid [rowData]=\"txn.displayRows()\" [columnDefs]=\"cols\" [getRowId]=\"byId\"\n * (cellValueChanged)=\"txn.onCellValueChanged($event)\" />\n * <button [disabled]=\"!txn.isDirty()\" (click)=\"txn.commit()\">Save</button>\n * ```\n *\n * `displayRows()` returns shallow clones, so the grid's in-place cell edits\n * change the copy while the base stays clean (rollback restores it). Use a\n * field-based `getRowId` so row identity survives cloning.\n */\nimport { computed, signal, type Signal } from '@angular/core';\nimport { TransactionEngine, type TransactionDelta } from './transactions';\nimport type { GridRow } from './row';\n\nexport interface TransactionControllerOptions {\n /** Field used as the unique row ID. Default: 'id' */\n rowIdField?: string;\n onCommit?: (delta: TransactionDelta) => void;\n onRollback?: () => void;\n}\n\n/** Minimal shape of the grid's cellValueChanged event this controller needs. */\nexport interface CellValueChange<TData> {\n row: TData;\n field?: string;\n newValue: unknown;\n}\n\nexport class TransactionController<TData extends GridRow = GridRow> {\n private readonly _engine: TransactionEngine;\n private readonly _rowIdField: string;\n private readonly _version = signal(0);\n\n /** The current merged rows (base + staged changes) as shallow clones. */\n readonly displayRows: Signal<TData[]>;\n /** Whether there are uncommitted staged changes. */\n readonly isDirty: Signal<boolean>;\n\n constructor(initialRows: TData[], options: TransactionControllerOptions = {}) {\n this._rowIdField = options.rowIdField ?? 'id';\n this._engine = new TransactionEngine({\n initialRows,\n rowIdField: this._rowIdField,\n onTransactionCommit: options.onCommit,\n onTransactionRollback: options.onRollback,\n });\n this.displayRows = computed(() => {\n this._version();\n return this._engine.getDisplayRows().map((r) => ({ ...r }) as TData);\n });\n this.isDirty = computed(() => {\n this._version();\n return this._engine.isDirty();\n });\n }\n\n /** Stage an inline edit emitted by the grid's `(cellValueChanged)`. */\n onCellValueChanged(event: CellValueChange<TData>): void {\n if (!event.field) return;\n const id = event.row[this._rowIdField];\n this._engine.updateRows([{ [this._rowIdField]: id, [event.field]: event.newValue }]);\n this._bump();\n }\n\n addRows(rows: TData[]): void {\n this._engine.addRows(rows);\n this._bump();\n }\n\n updateRows(rows: TData[]): void {\n this._engine.updateRows(rows);\n this._bump();\n }\n\n removeRows(ids: (string | number)[]): void {\n this._engine.removeRows(ids);\n this._bump();\n }\n\n /** All current staged changes, grouped by kind. */\n getDirtyRows(): { added: GridRow[]; updated: GridRow[]; removed: GridRow[] } {\n return this._engine.getDirtyRows();\n }\n\n commit(): void {\n this._engine.commitTransaction();\n this._bump();\n }\n\n rollback(): void {\n this._engine.rollbackTransaction();\n this._bump();\n }\n\n /** Replace the base rows (e.g. after a server refresh); staged changes are kept. */\n resetRows(rows: TData[]): void {\n this._engine.resetRows(rows);\n this._bump();\n }\n\n private _bump(): void {\n this._version.update((v) => v + 1);\n }\n}\n","/**\n * MasterDetailEngine — manages expand/collapse state and lazy-loaded, cached\n * detail data for master rows. Pure logic. Detail data is fetched once per row\n * ID on first expand; subsequent expands reuse the cache.\n */\nimport type { GridRow } from './row';\n\nexport type DetailLoadState = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport interface DetailEntry {\n state: DetailLoadState;\n data: GridRow[];\n error?: Error;\n}\n\nexport interface MasterDetailEngineOptions {\n /** Loads detail rows for a master row; called at most once per row ID. */\n getDetailRowData: (masterRow: GridRow) => Promise<GridRow[]>;\n /** Called when a row's expanded state changes. */\n onExpand?: (masterRow: GridRow, expanded: boolean) => void;\n /** Field used as the row ID. Default: 'id' */\n rowIdField?: string;\n}\n\nexport class MasterDetailEngine {\n private readonly _getDetailRowData: (masterRow: GridRow) => Promise<GridRow[]>;\n private readonly _onExpand?: (masterRow: GridRow, expanded: boolean) => void;\n private readonly _rowIdField: string;\n\n private readonly _expanded = new Set<string | number>();\n private readonly _cache = new Map<string | number, DetailEntry>();\n private _onChange?: () => void;\n\n constructor(options: MasterDetailEngineOptions) {\n this._getDetailRowData = options.getDetailRowData;\n this._onExpand = options.onExpand;\n this._rowIdField = options.rowIdField ?? 'id';\n }\n\n /** Subscribe to state changes. Returns an unsubscribe function. */\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n isExpanded(rowId: string | number): boolean {\n return this._expanded.has(rowId);\n }\n\n getLoadState(rowId: string | number): DetailLoadState {\n return this._cache.get(rowId)?.state ?? 'idle';\n }\n\n /** Cached detail rows, or an empty array if not yet loaded. */\n getDetailData(rowId: string | number): GridRow[] {\n return this._cache.get(rowId)?.data ?? [];\n }\n\n /** Expand a master row, triggering a load if not already cached. */\n expand(masterRow: GridRow): void {\n const id = this._rowId(masterRow);\n if (this._expanded.has(id)) return;\n this._expanded.add(id);\n this._onExpand?.(masterRow, true);\n this._notify();\n this._ensureLoaded(masterRow, id);\n }\n\n /** Collapse a master row; cached data is retained for re-expansion. */\n collapse(masterRow: GridRow): void {\n const id = this._rowId(masterRow);\n if (!this._expanded.has(id)) return;\n this._expanded.delete(id);\n this._onExpand?.(masterRow, false);\n this._notify();\n }\n\n toggle(masterRow: GridRow): void {\n if (this.isExpanded(this._rowId(masterRow))) {\n this.collapse(masterRow);\n } else {\n this.expand(masterRow);\n }\n }\n\n /** Pre-fetch detail data without expanding (e.g. hover prefetch). */\n prefetch(masterRow: GridRow): void {\n this._ensureLoaded(masterRow, this._rowId(masterRow));\n }\n\n /** Invalidate one row's cache, or the entire cache when rowId is omitted. */\n invalidateCache(rowId?: string | number): void {\n if (rowId !== undefined) {\n this._cache.delete(rowId);\n } else {\n this._cache.clear();\n }\n this._notify();\n }\n\n /** Collapse all expanded rows. Cache is preserved. */\n collapseAll(): void {\n this._expanded.clear();\n this._notify();\n }\n\n /** A read-only snapshot of currently expanded row IDs. */\n getExpandedIds(): ReadonlySet<string | number> {\n return this._expanded;\n }\n\n private _rowId(row: GridRow): string | number {\n const id = row[this._rowIdField];\n if (id === undefined || id === null) {\n throw new Error(\n `MasterDetailEngine: row has no '${this._rowIdField}' field. Set rowIdField to the correct field name.`,\n );\n }\n return id as string | number;\n }\n\n private _ensureLoaded(masterRow: GridRow, id: string | number): void {\n const existing = this._cache.get(id);\n if (existing && (existing.state === 'loading' || existing.state === 'loaded')) return;\n\n this._cache.set(id, { state: 'loading', data: [] });\n this._notify();\n\n this._getDetailRowData(masterRow)\n .then((data) => {\n this._cache.set(id, { state: 'loaded', data });\n this._notify();\n })\n .catch((error: Error) => {\n this._cache.set(id, { state: 'error', data: [], error });\n this._notify();\n });\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * CellPermissionEngine — enforces per-cell read/edit permissions from a\n * caller-supplied policy. Unreadable cells are masked ('●●●') everywhere\n * (display, export, clipboard); non-editable cells can't be edited regardless\n * of the column's `editable`. Results are cached per (rowId, field). Pure logic.\n */\nimport type { GridRow } from './row';\n\nexport interface CellPermission {\n canRead: boolean;\n canEdit: boolean;\n}\n\n/** Default mask string used for unreadable cells. */\nexport const DEFAULT_MASK = '●●●';\n\nexport interface CellPermissionEngineOptions {\n /** Policy returning permissions for a cell; called once per (rowId, field). */\n policy: (row: GridRow, field: string) => CellPermission;\n /** Field used as the unique row ID. Default: 'id' */\n rowIdField?: string;\n /** String shown in place of unreadable cell values. Default: '●●●' */\n maskValue?: string;\n}\n\nexport class CellPermissionEngine {\n private readonly _policy: (row: GridRow, field: string) => CellPermission;\n private readonly _rowIdField: string;\n private readonly _maskValue: string;\n\n private readonly _cache = new Map<string, CellPermission>();\n\n constructor(options: CellPermissionEngineOptions) {\n this._policy = options.policy;\n this._rowIdField = options.rowIdField ?? 'id';\n this._maskValue = options.maskValue ?? DEFAULT_MASK;\n }\n\n /** The resolved permission for a cell (cached). */\n getPermission(row: GridRow, field: string): CellPermission {\n const key = this._key(row, field);\n let perm = this._cache.get(key);\n if (!perm) {\n perm = this._policy(row, field);\n this._cache.set(key, perm);\n }\n return perm;\n }\n\n canRead(row: GridRow, field: string): boolean {\n return this.getPermission(row, field).canRead;\n }\n\n canEdit(row: GridRow, field: string): boolean {\n const perm = this.getPermission(row, field);\n return perm.canRead && perm.canEdit; // an unreadable cell can never be edited\n }\n\n /** The display value for a cell, masked when not readable. */\n getDisplayValue(row: GridRow, field: string): unknown {\n return this.canRead(row, field) ? row[field] : this._maskValue;\n }\n\n /** The value for copy/export; unreadable cells return '' so data never leaks. */\n getExportValue(row: GridRow, field: string): unknown {\n return this.canRead(row, field) ? row[field] : '';\n }\n\n /** True if the given value is the mask placeholder. */\n isMasked(value: unknown): boolean {\n return value === this._maskValue;\n }\n\n get maskValue(): string {\n return this._maskValue;\n }\n\n /** Clear one row's cached permissions, or the whole cache when omitted. */\n clearCache(rowId?: string | number): void {\n if (rowId === undefined) {\n this._cache.clear();\n return;\n }\n const prefix = `${rowId}\\u0000`;\n for (const key of this._cache.keys()) {\n if (key.startsWith(prefix)) {\n this._cache.delete(key);\n }\n }\n }\n\n private _key(row: GridRow, field: string): string {\n const id = row[this._rowIdField];\n if (id === undefined || id === null) {\n throw new Error(\n `CellPermissionEngine: row has no '${this._rowIdField}' field. Set rowIdField to match your data.`,\n );\n }\n return `${id as string | number}\\u0000${field}`;\n }\n}\n","/**\n * AuditTrailEngine — records an immutable log of every cell edit (who/what/when\n * + prev/next values) in a bounded in-memory ring buffer, emitting each entry\n * via `onEntry` for persistence. Pure logic.\n */\n\nexport interface AuditEntry {\n timestamp: number;\n userId: string | undefined;\n rowId: string | number;\n field: string;\n prevValue: unknown;\n nextValue: unknown;\n}\n\nexport interface AuditTrailEngineOptions {\n /** User identifier stamped on every entry. */\n userId?: string;\n /** Called for every new entry — persist to a server here. */\n onEntry?: (entry: AuditEntry) => void;\n /** Maximum entries retained in memory (oldest evicted first). Default: 1000 */\n maxEntries?: number;\n /** Injectable clock for testing. Defaults to Date.now. */\n now?: () => number;\n}\n\nexport class AuditTrailEngine {\n private readonly _userId?: string;\n private readonly _onEntry?: (entry: AuditEntry) => void;\n private readonly _maxEntries: number;\n private readonly _now: () => number;\n\n private _entries: AuditEntry[] = [];\n private _onChange?: () => void;\n\n constructor(options: AuditTrailEngineOptions = {}) {\n this._userId = options.userId;\n this._onEntry = options.onEntry;\n this._maxEntries = options.maxEntries ?? 1000;\n this._now = options.now ?? Date.now;\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n /** Record a cell edit; no-op edits (prev === next) return null. */\n record(\n rowId: string | number,\n field: string,\n prevValue: unknown,\n nextValue: unknown,\n ): AuditEntry | null {\n if (Object.is(prevValue, nextValue)) return null;\n\n const entry: AuditEntry = {\n timestamp: this._now(),\n userId: this._userId,\n rowId,\n field,\n prevValue,\n nextValue,\n };\n\n this._entries.push(entry);\n if (this._entries.length > this._maxEntries) {\n this._entries.shift();\n }\n\n this._onEntry?.(entry);\n this._notify();\n return entry;\n }\n\n /** All entries, oldest first (read-only snapshot). */\n getEntries(): readonly AuditEntry[] {\n return this._entries;\n }\n\n /** Entries for a specific row, oldest first. */\n getEntriesForRow(rowId: string | number): AuditEntry[] {\n return this._entries.filter((e) => e.rowId === rowId);\n }\n\n /** Entries for a specific cell (row + field), oldest first. */\n getEntriesForCell(rowId: string | number, field: string): AuditEntry[] {\n return this._entries.filter((e) => e.rowId === rowId && e.field === field);\n }\n\n get size(): number {\n return this._entries.length;\n }\n\n /** Discard all entries. */\n clear(): void {\n this._entries = [];\n this._notify();\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * RowLockEngine — tracks which rows are locked (by other users) so the grid can\n * show a lock indicator and block edits. Supports an async source of locks\n * (e.g. polled from a collaboration server) plus optimistic local lock/unlock.\n * Pure logic.\n */\nimport type { GridRow } from './row';\n\nexport interface LockedRow {\n rowId: string | number;\n lockedByUserId: string;\n lockedByDisplayName?: string;\n lockedAt: number;\n}\n\nexport interface RowLockEngineOptions {\n /** The current user's ID. Locks held by this user do not block editing. */\n currentUserId?: string;\n /** Async source of currently locked rows (server state). */\n getLockedRows?: () => Promise<LockedRow[]>;\n /** Called when the current user attempts to edit a row locked by someone else. */\n onLockConflict?: (row: GridRow, lockedBy: string) => void;\n /** Field used as the unique row ID. Default: 'id' */\n rowIdField?: string;\n /** Injectable clock for testing. Defaults to Date.now. */\n now?: () => number;\n}\n\nexport class RowLockEngine {\n private readonly _currentUserId?: string;\n private readonly _getLockedRows?: () => Promise<LockedRow[]>;\n private readonly _onLockConflict?: (row: GridRow, lockedBy: string) => void;\n private readonly _rowIdField: string;\n private readonly _now: () => number;\n\n private _locks = new Map<string | number, LockedRow>();\n private _onChange?: () => void;\n\n constructor(options: RowLockEngineOptions = {}) {\n this._currentUserId = options.currentUserId;\n this._getLockedRows = options.getLockedRows;\n this._onLockConflict = options.onLockConflict;\n this._rowIdField = options.rowIdField ?? 'id';\n this._now = options.now ?? Date.now;\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n /** Load locks from the async source and replace local state. */\n async refresh(): Promise<void> {\n if (!this._getLockedRows) return;\n const locks = await this._getLockedRows();\n this._locks = new Map(locks.map((l) => [l.rowId, l] as [string | number, LockedRow]));\n this._notify();\n }\n\n /** Optimistically lock a row for a user. */\n lockRow(rowId: string | number, userId: string, displayName?: string): void {\n this._locks.set(rowId, {\n rowId,\n lockedByUserId: userId,\n lockedByDisplayName: displayName,\n lockedAt: this._now(),\n });\n this._notify();\n }\n\n /** Remove a lock. */\n unlockRow(rowId: string | number): void {\n if (this._locks.delete(rowId)) this._notify();\n }\n\n /** Remove all locks. */\n clear(): void {\n if (this._locks.size === 0) return;\n this._locks.clear();\n this._notify();\n }\n\n /** The lock for a row, or undefined if unlocked. */\n getLock(rowId: string | number): LockedRow | undefined {\n return this._locks.get(rowId);\n }\n\n /** True if the row is locked by anyone. */\n isLocked(rowId: string | number): boolean {\n return this._locks.has(rowId);\n }\n\n /** True if the row is locked by someone OTHER than the current user. */\n isLockedByOther(rowId: string | number): boolean {\n const lock = this._locks.get(rowId);\n if (!lock) return false;\n return lock.lockedByUserId !== this._currentUserId;\n }\n\n /** All current locks. */\n getLocks(): LockedRow[] {\n return Array.from(this._locks.values());\n }\n\n get size(): number {\n return this._locks.size;\n }\n\n /**\n * Whether the row may be edited by the current user. If it's locked by\n * another user, fires `onLockConflict` and returns false.\n */\n canEditRow(row: GridRow): boolean {\n const rowId = this._rowId(row);\n const lock = this._locks.get(rowId);\n if (!lock) return true;\n if (lock.lockedByUserId === this._currentUserId) return true;\n this._onLockConflict?.(row, lock.lockedByDisplayName ?? lock.lockedByUserId);\n return false;\n }\n\n private _rowId(row: GridRow): string | number {\n const id = row[this._rowIdField];\n if (id === undefined || id === null) {\n throw new Error(\n `RowLockEngine: row has no '${this._rowIdField}' field. Set rowIdField to match your data.`,\n );\n }\n return id as string | number;\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * Advanced filter builder — a nestable AND/OR/NOT tree of conditions with a\n * pure evaluator, URL-safe serialize/deserialize for shareable filter links,\n * and a named-preset store. No React, no DOM.\n */\nimport type { GridRow } from './row';\n\nexport type FilterOperator =\n | 'equals'\n | 'notEquals'\n | 'contains'\n | 'notContains'\n | 'startsWith'\n | 'endsWith'\n | 'greaterThan'\n | 'greaterThanOrEqual'\n | 'lessThan'\n | 'lessThanOrEqual'\n | 'isEmpty'\n | 'isNotEmpty';\n\n/** A single leaf filter condition. */\nexport interface FilterCondition {\n kind: 'condition';\n field: string;\n operator: FilterOperator;\n value?: unknown;\n}\n\n/** A nestable group of conditions/groups combined with AND or OR. */\nexport interface FilterGroup {\n kind: 'group';\n combinator: 'and' | 'or';\n /** Negates the entire group's result. */\n not?: boolean;\n children: FilterNode[];\n}\n\nexport type FilterNode = FilterCondition | FilterGroup;\n\n/** A named, persistable filter preset. */\nexport interface FilterPreset {\n id: string;\n name: string;\n filter: FilterNode;\n isShared?: boolean;\n}\n\nexport interface FilterPresetEngineOptions {\n /** Presets to seed the store with. */\n presets?: FilterPreset[];\n /** Called when a preset is saved. */\n onSave?: (preset: FilterPreset) => void | Promise<void>;\n /** ID generator (injectable for tests). */\n generateId?: () => string;\n}\n\nfunction toComparable(value: unknown): number | string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'number') return value;\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (value instanceof Date) return value.getTime();\n return String(value);\n}\n\nfunction evaluateCondition(cond: FilterCondition, row: GridRow): boolean {\n const raw = row[cond.field];\n const op = cond.operator;\n\n const isEmpty = raw === null || raw === undefined || raw === '';\n if (op === 'isEmpty') return isEmpty;\n if (op === 'isNotEmpty') return !isEmpty;\n\n const target = cond.value;\n\n switch (op) {\n case 'equals':\n return toComparable(raw) === toComparable(target);\n case 'notEquals':\n return toComparable(raw) !== toComparable(target);\n case 'contains':\n return String(raw ?? '')\n .toLowerCase()\n .includes(String(target ?? '').toLowerCase());\n case 'notContains':\n return !String(raw ?? '')\n .toLowerCase()\n .includes(String(target ?? '').toLowerCase());\n case 'startsWith':\n return String(raw ?? '')\n .toLowerCase()\n .startsWith(String(target ?? '').toLowerCase());\n case 'endsWith':\n return String(raw ?? '')\n .toLowerCase()\n .endsWith(String(target ?? '').toLowerCase());\n case 'greaterThan':\n case 'greaterThanOrEqual':\n case 'lessThan':\n case 'lessThanOrEqual': {\n const a = toComparable(raw);\n const b = toComparable(target);\n if (a === null || b === null || typeof a !== typeof b) return false;\n if (op === 'greaterThan') return a > b;\n if (op === 'greaterThanOrEqual') return a >= b;\n if (op === 'lessThan') return a < b;\n return a <= b;\n }\n default:\n return false;\n }\n}\n\n/** Evaluate a filter node against a row. */\nexport function evaluateFilter(node: FilterNode, row: GridRow): boolean {\n if (node.kind === 'condition') {\n return evaluateCondition(node, row);\n }\n const group = node;\n let result: boolean;\n if (group.children.length === 0) {\n result = true; // an empty group matches everything\n } else if (group.combinator === 'and') {\n result = group.children.every((child) => evaluateFilter(child, row));\n } else {\n result = group.children.some((child) => evaluateFilter(child, row));\n }\n return group.not ? !result : result;\n}\n\nfunction toUrlSafe(b64: string): string {\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\nfunction fromUrlSafe(s: string): string {\n const b64 = s.replace(/-/g, '+').replace(/_/g, '/');\n const pad = b64.length % 4 === 0 ? '' : '='.repeat(4 - (b64.length % 4));\n return b64 + pad;\n}\n\n/** Serialize a filter tree to a URL-safe string. */\nexport function serializeFilter(node: FilterNode): string {\n return toUrlSafe(btoa(JSON.stringify(node)));\n}\n\n/** Deserialize a URL-safe string back into a filter tree. Throws if invalid. */\nexport function deserializeFilter(encoded: string): FilterNode {\n const parsed = JSON.parse(atob(fromUrlSafe(encoded))) as FilterNode;\n if (!parsed || (parsed.kind !== 'condition' && parsed.kind !== 'group')) {\n throw new Error('Invalid filter payload');\n }\n return parsed;\n}\n\nexport class FilterPresetEngine {\n private readonly _onSave?: (preset: FilterPreset) => void | Promise<void>;\n private readonly _generateId: () => string;\n private _presets: FilterPreset[];\n private _seq = 0;\n private _onChange?: () => void;\n\n constructor(options: FilterPresetEngineOptions = {}) {\n this._onSave = options.onSave;\n this._generateId = options.generateId ?? (() => `preset-${++this._seq}`);\n this._presets = [...(options.presets ?? [])];\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n getPresets(): readonly FilterPreset[] {\n return this._presets;\n }\n\n getPreset(id: string): FilterPreset | undefined {\n return this._presets.find((p) => p.id === id);\n }\n\n /** Save a new preset (or replace one with the same name). Returns it. */\n savePreset(name: string, filter: FilterNode, isShared = false): FilterPreset {\n const existing = this._presets.find((p) => p.name === name);\n const preset: FilterPreset = existing\n ? { ...existing, filter, isShared }\n : { id: this._generateId(), name, filter, isShared };\n\n if (existing) {\n this._presets = this._presets.map((p) => (p.id === existing.id ? preset : p));\n } else {\n this._presets = [...this._presets, preset];\n }\n this._onSave?.(preset);\n this._notify();\n return preset;\n }\n\n deletePreset(id: string): void {\n const next = this._presets.filter((p) => p.id !== id);\n if (next.length !== this._presets.length) {\n this._presets = next;\n this._notify();\n }\n }\n\n /** Filter an array of rows through a filter tree. */\n applyFilter(node: FilterNode, rows: GridRow[]): GridRow[] {\n return rows.filter((row) => evaluateFilter(node, row));\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * SavedViewsEngine — manages named grid views (column layout, sort, filter,\n * group, density, etc.) across personal + admin-shared tiers. Server sync is\n * delegated to async callbacks so the engine stays pure and Node-testable.\n */\n\nexport interface SavedView {\n id: string;\n name: string;\n isShared?: boolean;\n layout: Record<string, unknown>;\n}\n\nexport interface SavedViewsEngineOptions {\n /** Async loader for the user's saved views. */\n getSavedViews?: () => Promise<SavedView[]>;\n /** Persist a saved view. */\n onSaveView?: (view: SavedView) => Promise<void> | void;\n /** Delete a saved view. */\n onDeleteView?: (viewId: string) => Promise<void> | void;\n /** Notified when the active view changes. */\n onViewChange?: (view: SavedView | null) => void;\n /** Seed views (used when no async loader is supplied). */\n views?: SavedView[];\n /** ID generator (injectable for tests). */\n generateId?: () => string;\n}\n\nexport class SavedViewsEngine {\n private readonly _getSavedViews?: () => Promise<SavedView[]>;\n private readonly _onSaveView?: (view: SavedView) => Promise<void> | void;\n private readonly _onDeleteView?: (viewId: string) => Promise<void> | void;\n private readonly _onViewChange?: (view: SavedView | null) => void;\n private readonly _generateId: () => string;\n\n private _views: SavedView[];\n private _activeViewId: string | null = null;\n private _seq = 0;\n private _onChange?: () => void;\n\n constructor(options: SavedViewsEngineOptions = {}) {\n this._getSavedViews = options.getSavedViews;\n this._onSaveView = options.onSaveView;\n this._onDeleteView = options.onDeleteView;\n this._onViewChange = options.onViewChange;\n this._generateId = options.generateId ?? (() => `view-${++this._seq}`);\n this._views = [...(options.views ?? [])];\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n /** Load views from the async source, replacing local state. */\n async load(): Promise<void> {\n if (!this._getSavedViews) return;\n this._views = await this._getSavedViews();\n this._notify();\n }\n\n getViews(): readonly SavedView[] {\n return this._views;\n }\n\n getView(id: string): SavedView | undefined {\n return this._views.find((v) => v.id === id);\n }\n\n /** Personal (non-shared) views. */\n getPersonalViews(): SavedView[] {\n return this._views.filter((v) => !v.isShared);\n }\n\n /** Admin-shared views. */\n getSharedViews(): SavedView[] {\n return this._views.filter((v) => v.isShared);\n }\n\n getActiveView(): SavedView | null {\n if (this._activeViewId === null) return null;\n return this.getView(this._activeViewId) ?? null;\n }\n\n /** Create a new view or update an existing one by name. Returns the view. */\n async saveView(\n name: string,\n layout: Record<string, unknown>,\n options: { isShared?: boolean; id?: string } = {},\n ): Promise<SavedView> {\n const existing = options.id\n ? this._views.find((v) => v.id === options.id)\n : this._views.find((v) => v.name === name);\n\n const view: SavedView = existing\n ? { ...existing, name, layout, isShared: options.isShared ?? existing.isShared }\n : { id: this._generateId(), name, layout, isShared: options.isShared };\n\n if (existing) {\n this._views = this._views.map((v) => (v.id === existing.id ? view : v));\n } else {\n this._views = [...this._views, view];\n }\n\n await this._onSaveView?.(view);\n this._notify();\n return view;\n }\n\n /** Delete a view. If it was active, the active view is cleared. */\n async deleteView(id: string): Promise<void> {\n const next = this._views.filter((v) => v.id !== id);\n if (next.length === this._views.length) return;\n this._views = next;\n if (this._activeViewId === id) {\n this._activeViewId = null;\n this._onViewChange?.(null);\n }\n await this._onDeleteView?.(id);\n this._notify();\n }\n\n /** Activate a view (or clear with null). Fires onViewChange. */\n setActiveView(id: string | null): void {\n if (id !== null && !this.getView(id)) {\n throw new Error(`SavedViewsEngine: unknown view '${id}'`);\n }\n if (this._activeViewId === id) return;\n this._activeViewId = id;\n this._onViewChange?.(this.getActiveView());\n this._notify();\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * ExcelImportEngine — a dependency-free import pipeline that turns a tabular\n * matrix (header row + data rows) into validated grid rows. File parsing is\n * kept OUT of the engine: use `parseCSV()` for delimited text, or feed a\n * `string[][]` produced by SheetJS for .xlsx. Pipeline: loadMatrix → (auto)\n * mapping → validate → buildRows.\n */\nimport type { GridRow } from './row';\n\n/** Data type used to validate and coerce imported cell values. */\nexport type ImportColumnType = 'string' | 'number' | 'boolean' | 'date';\n\nexport interface ImportColumn {\n /** Target grid field the source column maps to. */\n field: string;\n /** Header text used for auto-matching against the source sheet. */\n headerName: string;\n /** Expected data type. Values are validated/coerced against it. Default: 'string' */\n type?: ImportColumnType;\n /** Whether a value is required (empty cells produce a validation error). */\n required?: boolean;\n}\n\n/** A single validation problem found during import. */\nexport interface ImportValidationError {\n /** Zero-based index into the source data rows (excludes the header row). */\n rowIndex: number;\n field: string;\n value: string;\n message: string;\n}\n\nexport interface ExcelImportEngineOptions {\n /** Target columns the importer can map onto. */\n columns: ImportColumn[];\n /** Explicit source-header → target-field mapping, overriding auto-match. */\n columnMapping?: Record<string, string>;\n}\n\nexport interface ImportPreview {\n rows: GridRow[];\n errors: ImportValidationError[];\n}\n\n/**\n * Parse delimited text into a matrix of string cells. Handles quoted fields\n * containing the delimiter, newlines, and escaped quotes (`\"\"`), plus `\\n` and\n * `\\r\\n` line endings.\n */\nexport function parseCSV(text: string, delimiter = ','): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = '';\n let inQuotes = false;\n let i = 0;\n\n const pushCell = () => {\n row.push(cell);\n cell = '';\n };\n const pushRow = () => {\n pushCell();\n rows.push(row);\n row = [];\n };\n\n while (i < text.length) {\n const ch = text[i];\n\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n cell += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i++;\n continue;\n }\n cell += ch;\n i++;\n continue;\n }\n\n if (ch === '\"') {\n inQuotes = true;\n i++;\n continue;\n }\n if (ch === delimiter) {\n pushCell();\n i++;\n continue;\n }\n if (ch === '\\r') {\n pushRow();\n if (text[i + 1] === '\\n') i++;\n i++;\n continue;\n }\n if (ch === '\\n') {\n pushRow();\n i++;\n continue;\n }\n cell += ch;\n i++;\n }\n\n if (cell.length > 0 || row.length > 0) {\n pushRow();\n }\n return rows;\n}\n\nfunction normalizeHeader(h: string): string {\n return h.trim().toLowerCase().replace(/[\\s_-]+/g, '');\n}\n\ninterface CoerceResult {\n ok: boolean;\n value: unknown;\n message?: string;\n}\n\nfunction coerce(raw: string, type: ImportColumnType): CoerceResult {\n const trimmed = raw.trim();\n switch (type) {\n case 'number': {\n if (trimmed === '') return { ok: true, value: null };\n const n = Number(trimmed.replace(/,/g, ''));\n if (Number.isNaN(n)) return { ok: false, value: raw, message: `\"${raw}\" is not a number` };\n return { ok: true, value: n };\n }\n case 'boolean': {\n const t = trimmed.toLowerCase();\n if (['true', '1', 'yes', 'y'].includes(t)) return { ok: true, value: true };\n if (['false', '0', 'no', 'n', ''].includes(t)) return { ok: true, value: false };\n return { ok: false, value: raw, message: `\"${raw}\" is not a boolean` };\n }\n case 'date': {\n if (trimmed === '') return { ok: true, value: null };\n const ts = Date.parse(trimmed);\n if (Number.isNaN(ts)) return { ok: false, value: raw, message: `\"${raw}\" is not a valid date` };\n return { ok: true, value: new Date(ts).toISOString() };\n }\n case 'string':\n default:\n return { ok: true, value: raw };\n }\n}\n\nexport class ExcelImportEngine {\n private readonly _columns: ImportColumn[];\n private _headers: string[] = [];\n private _dataRows: string[][] = [];\n\n /** sourceHeader → targetField (null = unmapped). */\n private _mapping = new Map<string, string | null>();\n\n constructor(options: ExcelImportEngineOptions) {\n this._columns = options.columns;\n if (options.columnMapping) {\n for (const [header, field] of Object.entries(options.columnMapping)) {\n this._mapping.set(header, field);\n }\n }\n }\n\n /**\n * Load a matrix of raw cells.\n * @param matrix Full sheet, including the header row when hasHeaderRow.\n * @param hasHeaderRow When true (default) the first row is treated as headers.\n */\n loadMatrix(matrix: string[][], hasHeaderRow = true): void {\n if (matrix.length === 0) {\n this._headers = [];\n this._dataRows = [];\n return;\n }\n if (hasHeaderRow) {\n this._headers = matrix[0].map((h) => String(h ?? ''));\n this._dataRows = matrix.slice(1);\n } else {\n this._headers = matrix[0].map((_, idx) => `Col${idx + 1}`);\n this._dataRows = matrix;\n }\n this._autoMap();\n }\n\n /** Parse delimited text and load it as the source matrix. */\n loadCSV(text: string, delimiter = ',', hasHeaderRow = true): void {\n this.loadMatrix(parseCSV(text, delimiter), hasHeaderRow);\n }\n\n private _autoMap(): void {\n const fieldByNorm = new Map<string, string>();\n for (const col of this._columns) {\n fieldByNorm.set(normalizeHeader(col.headerName), col.field);\n fieldByNorm.set(normalizeHeader(col.field), col.field);\n }\n for (const header of this._headers) {\n if (this._mapping.has(header)) continue; // respect explicit mapping\n const match = fieldByNorm.get(normalizeHeader(header));\n this._mapping.set(header, match ?? null);\n }\n }\n\n getHeaders(): readonly string[] {\n return this._headers;\n }\n\n /** Current source-header → target-field mapping. */\n getMapping(): Record<string, string | null> {\n const out: Record<string, string | null> = {};\n for (const header of this._headers) {\n out[header] = this._mapping.get(header) ?? null;\n }\n return out;\n }\n\n /** Manually map (or unmap with null) a source header to a target field. */\n setMapping(sourceHeader: string, field: string | null): void {\n this._mapping.set(sourceHeader, field);\n }\n\n /** Source headers not yet mapped to a target field. */\n getUnmappedHeaders(): string[] {\n return this._headers.filter((h) => !this._mapping.get(h));\n }\n\n /** Target fields that have no source column mapped to them. */\n getUnmappedFields(): string[] {\n const mapped = new Set(\n this._headers.map((h) => this._mapping.get(h)).filter((f): f is string => !!f),\n );\n return this._columns.map((c) => c.field).filter((f) => !mapped.has(f));\n }\n\n /** Validate all data rows against the mapped column types. */\n validate(): ImportValidationError[] {\n return this._process().errors;\n }\n\n /** Build validated rows (rows with errors are still returned, best-effort). */\n buildRows(): GridRow[] {\n return this._process().rows;\n }\n\n /** Full preview: rows plus any validation errors. */\n preview(): ImportPreview {\n return this._process();\n }\n\n private _process(): ImportPreview {\n const rows: GridRow[] = [];\n const errors: ImportValidationError[] = [];\n\n const fieldToSourceIndex = new Map<string, number>();\n this._headers.forEach((header, idx) => {\n const field = this._mapping.get(header);\n if (field) fieldToSourceIndex.set(field, idx);\n });\n\n this._dataRows.forEach((sourceRow, rowIndex) => {\n const row: GridRow = {};\n for (const col of this._columns) {\n const srcIdx = fieldToSourceIndex.get(col.field);\n const raw = srcIdx === undefined ? '' : String(sourceRow[srcIdx] ?? '');\n const type = col.type ?? 'string';\n\n if (col.required && raw.trim() === '') {\n errors.push({ rowIndex, field: col.field, value: raw, message: `${col.headerName} is required` });\n }\n\n const result = coerce(raw, type);\n if (!result.ok) {\n errors.push({ rowIndex, field: col.field, value: raw, message: result.message ?? `Invalid ${type}` });\n row[col.field] = raw; // keep raw for user correction\n } else {\n row[col.field] = result.value;\n }\n }\n rows.push(row);\n });\n\n return { rows, errors };\n }\n\n /** Number of data rows currently loaded (excludes the header row). */\n get rowCount(): number {\n return this._dataRows.length;\n }\n}\n","/**\n * PDFExportEngine — turns rows + columns + branding options into a paginated,\n * renderer-agnostic document model (`PdfDocumentModel`). A thin adapter can feed\n * that model to jsPDF, pdfmake, or an HTML-to-PDF pipeline without this engine\n * depending on any of them. It preserves the given row/column order, so callers\n * pass the already filtered/sorted view (\"export what the user sees\").\n */\nimport type { GridRow } from './row';\n\nexport interface PdfExportOptions {\n /** Report title rendered in the header. */\n title?: string;\n /** Logo image URL rendered in the header. */\n logo?: string;\n /** Footer text rendered on every page. */\n footer?: string;\n /** Page size. Default: 'A4' */\n pageSize?: 'A4' | 'Letter' | 'Legal';\n /** Page orientation. Default: 'landscape' */\n orientation?: 'portrait' | 'landscape';\n /** Rows per page. Default: 25 */\n rowsPerPage?: number;\n}\n\nexport interface PdfColumn {\n field: string;\n headerName: string;\n /** Optional formatter for the cell value. */\n format?: (value: unknown, row: GridRow) => string;\n}\n\nexport interface PdfPageHeader {\n title?: string;\n logo?: string;\n /** ISO timestamp the export was generated. */\n generatedAt: string;\n}\n\nexport interface PdfPageFooter {\n text?: string;\n pageNumber: number;\n pageCount: number;\n}\n\nexport interface PdfPage {\n header: PdfPageHeader;\n footer: PdfPageFooter;\n columnHeaders: string[];\n /** Already-formatted cell text for each row on this page. */\n rows: string[][];\n}\n\nexport interface PdfDocumentModel {\n pageSize: NonNullable<PdfExportOptions['pageSize']>;\n orientation: NonNullable<PdfExportOptions['orientation']>;\n pages: PdfPage[];\n}\n\nexport interface PDFExportEngineOptions extends PdfExportOptions {\n columns: PdfColumn[];\n /** Injectable clock for deterministic timestamps in tests. */\n now?: () => Date;\n}\n\nconst DEFAULTS = {\n pageSize: 'A4' as const,\n orientation: 'landscape' as const,\n rowsPerPage: 25,\n};\n\nexport class PDFExportEngine {\n private readonly _columns: PdfColumn[];\n private readonly _options: PdfExportOptions;\n private readonly _now: () => Date;\n\n constructor(options: PDFExportEngineOptions) {\n const { columns, now, ...pdfOptions } = options;\n this._columns = columns;\n this._options = pdfOptions;\n this._now = now ?? (() => new Date());\n }\n\n /** Build the paginated document model from the given (already-visible) rows. */\n build(rows: GridRow[]): PdfDocumentModel {\n const rowsPerPage = Math.max(1, this._options.rowsPerPage ?? DEFAULTS.rowsPerPage);\n const pageSize = this._options.pageSize ?? DEFAULTS.pageSize;\n const orientation = this._options.orientation ?? DEFAULTS.orientation;\n const generatedAt = this._now().toISOString();\n\n const columnHeaders = this._columns.map((c) => c.headerName);\n const pageCount = Math.max(1, Math.ceil(rows.length / rowsPerPage));\n const pages: PdfPage[] = [];\n\n for (let p = 0; p < pageCount; p++) {\n const slice = rows.slice(p * rowsPerPage, (p + 1) * rowsPerPage);\n pages.push({\n header: { title: this._options.title, logo: this._options.logo, generatedAt },\n footer: { text: this._options.footer, pageNumber: p + 1, pageCount },\n columnHeaders,\n rows: slice.map((row) => this._formatRow(row)),\n });\n }\n\n return { pageSize, orientation, pages };\n }\n\n private _formatRow(row: GridRow): string[] {\n return this._columns.map((col) => {\n const value = row[col.field];\n if (col.format) return col.format(value, row);\n return value === null || value === undefined ? '' : String(value);\n });\n }\n}\n","/**\n * FormEditorEngine — backs a slide-in form editor panel: tracks which row is\n * open, holds an editable draft with dirty-state detection, and supports\n * prev/next navigation across the row set. Save/delete delegate to async\n * callbacks. Pure logic.\n */\nimport type { GridRow } from './row';\n\nexport interface FormEditorEngineOptions {\n /** The rows the editor navigates over (current visible order). */\n rows: GridRow[];\n /** Field used as the unique row ID. Default: 'id' */\n rowIdField?: string;\n onSave?: (row: GridRow) => void | Promise<void>;\n onDelete?: (row: GridRow) => void | Promise<void>;\n}\n\nexport class FormEditorEngine {\n private _rows: GridRow[];\n private readonly _rowIdField: string;\n private readonly _onSave?: (row: GridRow) => void | Promise<void>;\n private readonly _onDelete?: (row: GridRow) => void | Promise<void>;\n\n private _index = -1; // -1 = panel closed\n private _draft: GridRow | null = null;\n private _onChange?: () => void;\n\n constructor(options: FormEditorEngineOptions) {\n this._rows = [...options.rows];\n this._rowIdField = options.rowIdField ?? 'id';\n this._onSave = options.onSave;\n this._onDelete = options.onDelete;\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n /** Replace the row set; keeps the panel on the same rowId if still present. */\n setRows(rows: GridRow[]): void {\n const currentId = this.isOpen ? this._rowId(this._rows[this._index]) : undefined;\n this._rows = [...rows];\n if (currentId !== undefined) {\n const idx = this._rows.findIndex((r) => this._rowId(r) === currentId);\n if (idx === -1) {\n this.close();\n return;\n }\n this._index = idx;\n this._draft = { ...this._rows[idx] };\n }\n this._notify();\n }\n\n get isOpen(): boolean {\n return this._index >= 0 && this._index < this._rows.length;\n }\n\n get index(): number {\n return this._index;\n }\n\n /** Open the panel on a row by its ID. */\n openById(rowId: string | number): void {\n const idx = this._rows.findIndex((r) => this._rowId(r) === rowId);\n if (idx === -1) throw new Error(`FormEditorEngine: no row with id '${rowId}'`);\n this._openAt(idx);\n }\n\n /** Open the panel on a row by index. */\n openAt(index: number): void {\n if (index < 0 || index >= this._rows.length) {\n throw new Error(`FormEditorEngine: index ${index} out of range`);\n }\n this._openAt(index);\n }\n\n close(): void {\n this._index = -1;\n this._draft = null;\n this._notify();\n }\n\n private _openAt(index: number): void {\n this._index = index;\n this._draft = { ...this._rows[index] };\n this._notify();\n }\n\n /** The current editable draft (a copy of the row plus unsaved edits). */\n getDraft(): GridRow | null {\n return this._draft ? { ...this._draft } : null;\n }\n\n /** The original (unedited) row currently open. */\n getOriginal(): GridRow | null {\n return this.isOpen ? this._rows[this._index] : null;\n }\n\n setFieldValue(field: string, value: unknown): void {\n if (!this._draft) throw new Error('FormEditorEngine: no row open');\n this._draft[field] = value;\n this._notify();\n }\n\n /** True when the draft differs from the original row. */\n get isDirty(): boolean {\n if (!this._draft || !this.isOpen) return false;\n const original = this._rows[this._index];\n const keys = new Set([...Object.keys(original), ...Object.keys(this._draft)]);\n for (const key of keys) {\n if (!Object.is(original[key], this._draft[key])) return true;\n }\n return false;\n }\n\n /** Revert unsaved edits. */\n revert(): void {\n if (!this.isOpen) return;\n this._draft = { ...this._rows[this._index] };\n this._notify();\n }\n\n get canGoPrev(): boolean {\n return this._index > 0;\n }\n get canGoNext(): boolean {\n return this._index >= 0 && this._index < this._rows.length - 1;\n }\n\n next(): void {\n if (this.canGoNext) this._openAt(this._index + 1);\n }\n prev(): void {\n if (this.canGoPrev) this._openAt(this._index - 1);\n }\n\n /** Save the draft: commits it into the row set and calls onSave. */\n async save(): Promise<void> {\n if (!this._draft || !this.isOpen) throw new Error('FormEditorEngine: no row open');\n const saved = { ...this._draft };\n this._rows[this._index] = saved;\n await this._onSave?.(saved);\n this._notify();\n }\n\n /** Delete the open row: removes it and keeps the panel on the next row. */\n async delete(): Promise<void> {\n if (!this.isOpen) throw new Error('FormEditorEngine: no row open');\n const row = this._rows[this._index];\n this._rows = this._rows.filter((_, i) => i !== this._index);\n await this._onDelete?.(row);\n if (this._rows.length === 0) {\n this.close();\n } else {\n this._openAt(Math.min(this._index, this._rows.length - 1));\n }\n }\n\n private _rowId(row: GridRow): string | number {\n const id = row[this._rowIdField];\n if (id === undefined || id === null) {\n throw new Error(`FormEditorEngine: row has no '${this._rowIdField}' field.`);\n }\n return id as string | number;\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * Grid integration bridges — connect the framework-agnostic Pro engines to the\n * open-source `<gd-data-grid>`'s `ColDef` contract, without any DOM coupling.\n * Consumers feed the transformed column defs straight into `[columnDefs]`.\n */\nimport type { ColDef } from '@gridengine/angular-datagrid';\nimport type { GridRow } from './row';\nimport type { CellPermissionEngine } from './permissions';\nimport type { PdfColumn } from './pdf-export';\n\n/**\n * Return a copy of `columnDefs` whose cells honour a `CellPermissionEngine`:\n * unreadable cells resolve to the engine's mask value (so they never reach\n * renderers, sorting, filtering, or export), and non-editable cells become\n * non-editable regardless of the column's own `editable`. Columns without a\n * `field` (e.g. a checkbox-selection column) pass through unchanged.\n */\nexport function applyCellPermissions<TData>(\n columnDefs: ColDef<TData>[],\n engine: CellPermissionEngine,\n): ColDef<TData>[] {\n return columnDefs.map((col) => {\n const field = col.field;\n if (!field) return col;\n\n const originalGetter = col.valueGetter;\n const originalEditable = col.editable;\n\n return {\n ...col,\n valueGetter: (data: TData) => {\n const row = data as GridRow;\n if (!engine.canRead(row, field)) return engine.maskValue;\n return originalGetter ? originalGetter(data) : row[field];\n },\n editable: (row: TData) => {\n if (!engine.canEdit(row as GridRow, field)) return false;\n return typeof originalEditable === 'function'\n ? originalEditable(row)\n : (originalEditable ?? false);\n },\n };\n });\n}\n\n/**\n * Convert open-source grid column defs into `PdfColumn`s for `PDFExportEngine`,\n * carrying each column's `headerName` and `valueFormatter`. Hidden columns and\n * columns without a `field` are omitted.\n */\nexport function toPdfColumns<TData>(columnDefs: ColDef<TData>[]): PdfColumn[] {\n const out: PdfColumn[] = [];\n for (const col of columnDefs) {\n if (!col.field || col.hide) continue;\n const field = col.field;\n const fmt = col.valueFormatter;\n out.push({\n field,\n headerName: col.headerName ?? field,\n format: fmt ? (value) => fmt(value) : undefined,\n });\n }\n return out;\n}\n","/**\n * RangeSelectionDirective — Excel-like rectangular cell selection + copy for the\n * open-source `<gd-data-grid>`. Attach it to an element wrapping the grid:\n *\n * ```html\n * <div gdRangeSelection (rangeCopy)=\"onCopy($event)\">\n * <gd-data-grid [rowData]=\"rows\" [columnDefs]=\"cols\" />\n * </div>\n * ```\n *\n * Drag across cells to select a block, then Ctrl/Cmd+C to copy it as TSV\n * (paste-ready into Excel / Sheets). Ctrl/Cmd+V emits `(rangePaste)` with the\n * parsed matrix and Delete/Backspace emits `(rangeClear)` — the consumer writes\n * those back into its own data (one-way binding, like the grid's other events).\n * Cell coordinates come from the grid's ARIA attributes (`role=\"gridcell\"` +\n * `aria-colindex`, and the row's `aria-rowindex`), so no base-grid changes are\n * needed. Selection state is driven by the Pro `RangeSelectionEngine`.\n */\nimport { DOCUMENT } from '@angular/common';\nimport { Directive, ElementRef, HostListener, OnDestroy, inject, output } from '@angular/core';\nimport { RangeSelectionEngine } from './range-selection';\nimport { parseTSV } from './clipboard';\nimport type { CellRange } from './cell-range';\n\ninterface CellPos {\n row: number;\n col: number;\n}\n\n/** Payload emitted on paste: the parsed matrix anchored at the selection top-left. */\nexport interface RangePasteEvent {\n startRow: number;\n startCol: number;\n data: string[][];\n}\n\nconst STYLE_ID = 'gd-range-selection-styles';\nconst SELECTED_CLASS = 'gd-range-selected';\nconst NON_DATA_ROW = ['gd-row--header', 'gd-row--filter', 'gd-row--group', 'gd-row--detail'];\n\n@Directive({\n selector: '[gdRangeSelection]',\n standalone: true,\n})\nexport class RangeSelectionDirective implements OnDestroy {\n /** Emits the copied cell matrix (rows × cols of displayed text) on Ctrl/Cmd+C. */\n readonly rangeCopy = output<string[][]>();\n /** Emits the parsed clipboard matrix on Ctrl/Cmd+V for the consumer to write back. */\n readonly rangePaste = output<RangePasteEvent>();\n /** Emits the selected range on Delete/Backspace for the consumer to clear. */\n readonly rangeClear = output<CellRange>();\n\n private readonly _host = inject(ElementRef) as ElementRef<HTMLElement>;\n private readonly _doc = inject(DOCUMENT);\n private readonly _engine = new RangeSelectionEngine({ onChange: () => this._paint() });\n private _dragging = false;\n private readonly _onMouseUp = () => {\n this._dragging = false;\n };\n\n constructor() {\n this._ensureStyles();\n this._doc.addEventListener('mouseup', this._onMouseUp);\n }\n\n ngOnDestroy(): void {\n this._doc.removeEventListener('mouseup', this._onMouseUp);\n }\n\n @HostListener('mousedown', ['$event'])\n onMouseDown(event: MouseEvent): void {\n const pos = this._cellPos(event.target);\n if (!pos) return;\n this._dragging = true;\n this._engine.startSelection(pos.row, pos.col);\n }\n\n @HostListener('mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this._dragging) return;\n const pos = this._cellPos(event.target);\n if (pos) this._engine.extendSelection(pos.row, pos.col);\n }\n\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n const mod = event.ctrlKey || event.metaKey;\n if (mod && (event.key === 'c' || event.key === 'C')) {\n if (this._engine.getSelection()) event.preventDefault();\n this._copy();\n } else if (mod && (event.key === 'v' || event.key === 'V')) {\n this._paste();\n } else if (event.key === 'Delete' || event.key === 'Backspace') {\n this._clear(event);\n }\n }\n\n /** The current selection engine (for advanced consumers / testing). */\n get engine(): RangeSelectionEngine {\n return this._engine;\n }\n\n private _cellPos(target: EventTarget | null): CellPos | null {\n const el = target as HTMLElement | null;\n const cell = el?.closest?.('.gd-cell[role=\"gridcell\"]');\n if (!cell || !this._host.nativeElement.contains(cell)) return null;\n return this._cellPosFromCell(cell);\n }\n\n private _cellPosFromCell(cell: Element): CellPos | null {\n const row = cell.closest('.gd-row');\n if (!row || NON_DATA_ROW.some((c) => row.classList.contains(c))) return null;\n const ariaRow = row.getAttribute('aria-rowindex');\n const ariaCol = cell.getAttribute('aria-colindex');\n if (ariaRow === null || ariaCol === null) return null;\n return { row: Number(ariaRow) - 2, col: Number(ariaCol) - 1 };\n }\n\n private _paint(): void {\n const cells = this._host.nativeElement.querySelectorAll('.gd-cell[role=\"gridcell\"]');\n cells.forEach((cell) => {\n const pos = this._cellPosFromCell(cell);\n cell.classList.toggle(SELECTED_CLASS, !!pos && this._engine.isCellSelected(pos.row, pos.col));\n });\n }\n\n private _copy(): void {\n const selection = this._engine.getSelection();\n if (!selection) return;\n\n const byPos = new Map<string, string>();\n this._host.nativeElement.querySelectorAll('.gd-cell[role=\"gridcell\"]').forEach((cell) => {\n const pos = this._cellPosFromCell(cell);\n if (pos) byPos.set(`${pos.row},${pos.col}`, (cell.textContent ?? '').trim());\n });\n\n const matrix: string[][] = [];\n for (let r = selection.startRowIndex; r <= selection.endRowIndex; r++) {\n const rowCells: string[] = [];\n for (let c = selection.startColIndex; c <= selection.endColIndex; c++) {\n rowCells.push(byPos.get(`${r},${c}`) ?? '');\n }\n matrix.push(rowCells);\n }\n\n const tsv = matrix.map((r) => r.join('\\t')).join('\\n');\n void navigator.clipboard?.writeText?.(tsv);\n this.rangeCopy.emit(matrix);\n }\n\n private _paste(): void {\n const read = navigator.clipboard?.readText?.();\n if (!read) return;\n void read.then((text) => {\n if (!text) return;\n const selection = this._engine.getSelection();\n this.rangePaste.emit({\n startRow: selection?.startRowIndex ?? 0,\n startCol: selection?.startColIndex ?? 0,\n data: parseTSV(text),\n });\n });\n }\n\n private _clear(event: KeyboardEvent): void {\n const selection = this._engine.getSelection();\n if (!selection) return;\n event.preventDefault();\n this.rangeClear.emit(selection);\n }\n\n private _ensureStyles(): void {\n if (this._doc.getElementById(STYLE_ID)) return;\n const style = this._doc.createElement('style');\n style.id = STYLE_ID;\n style.textContent = `.${SELECTED_CLASS}{background:rgba(59,130,246,0.18)!important;}`;\n this._doc.head.appendChild(style);\n }\n}\n","/*\n * Public API Surface of @gridengine/angular-datagrid-enterprise\n *\n * Re-exports the open-source base grid so consumers need a single import, then\n * adds the license-gated Pro surface on top.\n */\n\n// ── Base grid (full re-export) ──────────────────────────────────────────────\nexport * from '@gridengine/angular-datagrid';\n\n// ── Pro component ───────────────────────────────────────────────────────────\nexport { DataGridPro } from './lib/data-grid-pro';\nexport { GridLicenseWatermark } from './lib/license-watermark';\n\n// ── License ─────────────────────────────────────────────────────────────────\nexport { LicenseManager, TIER_FEATURES } from './lib/license-manager';\nexport type {\n LicensePayload,\n LicenseTier,\n SupportLevel,\n LicenseStatus,\n LicenseValidationResult,\n} from './lib/license-manager';\nexport { provideGridEngineLicense } from './lib/provide-license';\nexport { PRODUCT_ID, PURCHASE_URL } from './lib/keyring';\n\n// ── Spreadsheet feature engines (framework-agnostic, usable standalone) ──────\nexport type { CellRange } from './lib/features/cell-range';\nexport { RangeSelectionEngine } from './lib/features/range-selection';\nexport type { RangeSelectionEngineOptions } from './lib/features/range-selection';\nexport { ClipboardEngine, parseTSV } from './lib/features/clipboard';\nexport type { ClipboardEngineOptions } from './lib/features/clipboard';\nexport { FillHandleEngine, toNumber, toTimestamp } from './lib/features/fill-handle';\nexport type {\n FillDirection,\n FillCell,\n FillResult,\n FillHandleEngineOptions,\n} from './lib/features/fill-handle';\nexport { UndoRedoManager } from './lib/features/undo-redo';\nexport type {\n UndoRedoCommand,\n CellEditCommand,\n PasteCommand,\n FillCommand,\n DeleteCommand,\n UndoRedoManagerOptions,\n} from './lib/features/undo-redo';\nexport { FormulaEngine } from './lib/features/formula';\nexport type { FormulaEngineOptions } from './lib/features/formula';\n\n// ── Data-architecture engines (framework-agnostic) ──────────────────────────\nexport type { GridRow } from './lib/features/row';\nexport { SSRMEngine } from './lib/features/ssrm';\nexport type {\n SSRMEngineOptions,\n SSRMDataSource,\n SSRMGetRowsParams,\n SSRMGetRowsResult,\n Block,\n BlockState,\n} from './lib/features/ssrm';\nexport { TransactionEngine } from './lib/features/transactions';\nexport type { TransactionEngineOptions, TransactionDelta } from './lib/features/transactions';\nexport { TransactionController } from './lib/features/transaction-controller';\nexport type {\n TransactionControllerOptions,\n CellValueChange,\n} from './lib/features/transaction-controller';\nexport { MasterDetailEngine } from './lib/features/master-detail';\nexport type {\n MasterDetailEngineOptions,\n DetailEntry,\n DetailLoadState,\n} from './lib/features/master-detail';\n\n// ── Security & governance engines (framework-agnostic) ──────────────────────\nexport { CellPermissionEngine, DEFAULT_MASK } from './lib/features/permissions';\nexport type { CellPermission, CellPermissionEngineOptions } from './lib/features/permissions';\nexport { AuditTrailEngine } from './lib/features/audit-trail';\nexport type { AuditEntry, AuditTrailEngineOptions } from './lib/features/audit-trail';\nexport { RowLockEngine } from './lib/features/row-lock';\nexport type { LockedRow, RowLockEngineOptions } from './lib/features/row-lock';\n\n// ── Advanced filtering & saved views (framework-agnostic) ───────────────────\nexport {\n FilterPresetEngine,\n evaluateFilter,\n serializeFilter,\n deserializeFilter,\n} from './lib/features/filter';\nexport type {\n FilterOperator,\n FilterCondition,\n FilterGroup,\n FilterNode,\n FilterPreset,\n FilterPresetEngineOptions,\n} from './lib/features/filter';\nexport { SavedViewsEngine } from './lib/features/saved-views';\nexport type { SavedView, SavedViewsEngineOptions } from './lib/features/saved-views';\n\n// ── Import / export & form editor (framework-agnostic) ──────────────────────\nexport { ExcelImportEngine, parseCSV } from './lib/features/import';\nexport type {\n ExcelImportEngineOptions,\n ImportColumn,\n ImportColumnType,\n ImportValidationError,\n ImportPreview,\n} from './lib/features/import';\nexport { PDFExportEngine } from './lib/features/pdf-export';\nexport type {\n PDFExportEngineOptions,\n PdfExportOptions,\n PdfColumn,\n PdfPage,\n PdfPageHeader,\n PdfPageFooter,\n PdfDocumentModel,\n} from './lib/features/pdf-export';\nexport { FormEditorEngine } from './lib/features/form-editor';\nexport type { FormEditorEngineOptions } from './lib/features/form-editor';\n\n// ── Grid integration bridges (engine → OSS <gd-data-grid> ColDef) ───────────\nexport { applyCellPermissions, toPdfColumns } from './lib/features/grid-integration';\nexport { RangeSelectionDirective } from './lib/features/range-selection.directive';\nexport type { RangePasteEvent } from './lib/features/range-selection.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["coreResolveFeatures"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gridengine-angular-datagrid-enterprise.mjs","sources":["../../../projects/enterprise/src/lib/keyring.ts","../../../projects/enterprise/src/lib/license-manager.ts","../../../projects/enterprise/src/lib/license-watermark.ts","../../../projects/enterprise/src/lib/data-grid-pro.ts","../../../projects/enterprise/src/lib/provide-license.ts","../../../projects/enterprise/src/lib/features/range-selection.ts","../../../projects/enterprise/src/lib/features/clipboard.ts","../../../projects/enterprise/src/lib/features/fill-handle.ts","../../../projects/enterprise/src/lib/features/undo-redo.ts","../../../projects/enterprise/src/lib/features/formula.ts","../../../projects/enterprise/src/lib/features/ssrm.ts","../../../projects/enterprise/src/lib/features/transactions.ts","../../../projects/enterprise/src/lib/features/transaction-controller.ts","../../../projects/enterprise/src/lib/features/master-detail.ts","../../../projects/enterprise/src/lib/features/permissions.ts","../../../projects/enterprise/src/lib/features/audit-trail.ts","../../../projects/enterprise/src/lib/features/row-lock.ts","../../../projects/enterprise/src/lib/features/filter.ts","../../../projects/enterprise/src/lib/features/saved-views.ts","../../../projects/enterprise/src/lib/features/import.ts","../../../projects/enterprise/src/lib/features/pdf-export.ts","../../../projects/enterprise/src/lib/features/form-editor.ts","../../../projects/enterprise/src/lib/features/grid-integration.ts","../../../projects/enterprise/src/lib/features/range-selection.directive.ts","../../../projects/enterprise/src/public-api.ts","../../../projects/enterprise/src/gridengine-angular-datagrid-enterprise.ts"],"sourcesContent":["/**\n * Public verifying keys for GridEngine Angular license keys.\n *\n * These are Ed25519 PUBLIC keys, keyed by `keyId` — safe to ship in the bundle\n * (they can only verify signatures, never mint keys). The matching PRIVATE key\n * lives only in the GridEngine store backend (Azure Key Vault secret\n * `signing-angular-datagrid`). Rotate by adding a new keyId here alongside the\n * old one, until previously issued keys expire.\n */\nimport type { PublicKeyRing } from '@gridengine/license-core';\n\n/** The product id GridEngine license keys are scoped to for this package. */\nexport const PRODUCT_ID = 'angular-datagrid';\n\n/** Where a buyer can purchase / activate a license. */\nexport const PURCHASE_URL = 'https://angular.gridengine.dev/pricing';\n\nexport const PUBLIC_KEYRING: PublicKeyRing = {\n 'angular-datagrid-2026-08-09': 'GJx3r0A-xL2Q3-poGd3WbOh_B0EN9wwWOxMdksxs_S4',\n};\n","/**\n * LicenseManager — validates a `@gridengine/angular-datagrid-enterprise` license key.\n *\n * Verification uses `@gridengine/license-core` (Ed25519, keyring-based) — the\n * same scheme the GridEngine store uses to sign keys after a real purchase. The\n * private signing key lives only in the store's backend (Key Vault); this\n * package ships only the matching PUBLIC verifying key, so it can check a key's\n * authenticity but never mint one.\n *\n * This is soft licensing, not DRM: validation is synchronous and client-side,\n * and a determined user could strip the check from their own bundle. Server-\n * side entitlement checks remain authoritative for anything that matters.\n *\n * Feature access is derived from the license TIER (see `TIER_FEATURES`), with\n * `payload.features` allowed to grant additional flags on top. The support\n * level is metadata only — it never gates any in-bundle behaviour.\n */\nimport {\n validateLicense,\n resolveFeatures as coreResolveFeatures,\n TIER_FEATURES,\n type LicensePayload,\n type LicenseTier,\n type SupportLevel,\n type LicenseStatus,\n type LicenseValidationResult,\n type PublicKeyRing,\n} from '@gridengine/license-core';\nimport { PRODUCT_ID, PURCHASE_URL, PUBLIC_KEYRING } from './keyring';\n\nexport type {\n LicensePayload,\n LicenseTier,\n SupportLevel,\n LicenseStatus,\n LicenseValidationResult,\n};\nexport { TIER_FEATURES };\n\nconst _cache = new Map<string, LicenseValidationResult>();\n\n/**\n * Global license key, set once at app bootstrap (typically via\n * `provideGridEngineLicense(key)`) so every `<gd-data-grid-pro>` in the app\n * picks it up without needing a `licenseKey` input on each instance. A\n * `licenseKey` input, when given, still overrides this for that instance.\n */\nlet _globalLicenseKey: string | undefined;\n\n/** Set the license key once for the whole app (e.g. at app bootstrap). */\nfunction setLicenseKey(key: string | undefined): void {\n _globalLicenseKey = key;\n}\n\n/** The key previously set via `setLicenseKey`, if any. */\nfunction getLicenseKey(): string | undefined {\n return _globalLicenseKey;\n}\n\n/**\n * Validate a key against an arbitrary keyring. Exported (but not part of the\n * public `LicenseManager` API surface) so tests can verify against a throwaway\n * test keypair instead of the real production keyring.\n */\nexport function validateWithKeyring(\n key: string | undefined,\n keys: PublicKeyRing | string,\n): LicenseValidationResult {\n if (!key) {\n return {\n status: 'missing',\n payload: null,\n message:\n 'No @gridengine/angular-datagrid-enterprise license key provided. ' +\n 'A watermark will be displayed. ' +\n `Purchase a license at ${PURCHASE_URL}`,\n };\n }\n return validateLicense(key, keys, PRODUCT_ID);\n}\n\n/**\n * Validate a license key string. Results are cached per key so validation runs\n * at most once per key per session.\n */\nfunction validate(key: string | undefined): LicenseValidationResult {\n if (!key) return validateWithKeyring(key, PUBLIC_KEYRING);\n\n const cached = _cache.get(key);\n if (cached) return cached;\n\n const result = validateWithKeyring(key, PUBLIC_KEYRING);\n _cache.set(key, result);\n return result;\n}\n\n/**\n * The set of feature flags granted by a validated payload: the tier defaults\n * plus any explicit extras in `payload.features`.\n */\nfunction resolveFeatures(payload: LicensePayload): Set<string> {\n return coreResolveFeatures(payload);\n}\n\n/**\n * Check whether a specific feature is enabled for a key, against an arbitrary\n * keyring. Exported (but not part of the public `LicenseManager` API surface)\n * so tests can exercise this without the real production keyring.\n */\nexport function isFeatureEnabledWithKeyring(\n key: string | undefined,\n feature: string,\n keys: PublicKeyRing | string,\n): boolean {\n if (!key) return true; // evaluation mode\n const result = validateWithKeyring(key, keys);\n if (result.status !== 'valid' || !result.payload) return false;\n return resolveFeatures(result.payload).has(feature);\n}\n\n/**\n * Check whether a specific feature is enabled for a given key. Returns true\n * when no key is given (evaluation mode — features accessible but watermarked),\n * and false for any non-valid license.\n */\nfunction isFeatureEnabled(key: string | undefined, feature: string): boolean {\n if (!key) return true; // evaluation mode\n const result = validate(key);\n if (result.status !== 'valid' || !result.payload) return false;\n return resolveFeatures(result.payload).has(feature);\n}\n\nexport const LicenseManager = {\n validate,\n isFeatureEnabled,\n setLicenseKey,\n getLicenseKey,\n TIER_FEATURES,\n} as const;\n","/**\n * GridLicenseWatermark — a subtle, non-blocking evaluation watermark shown in\n * the corner of an enterprise grid when no valid license key is provided.\n *\n * The grid stays fully functional in evaluation mode; this only signals that a\n * license is required for production use. It is rendered automatically by\n * `<gd-data-grid-pro>` but is also exported for advanced consumers who compose\n * the grid themselves.\n */\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { PURCHASE_URL } from './keyring';\n\n@Component({\n selector: 'gd-license-watermark',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"gd-license-watermark\" aria-hidden=\"true\">\n {{ label() }} — unlicensed — <span class=\"gd-license-watermark__url\">{{ url() }}</span>\n </div>\n `,\n styles: [\n `\n .gd-license-watermark {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 10;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border-radius: 999px;\n font-family: sans-serif;\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.02em;\n color: #7c2d12;\n background: linear-gradient(135deg, #fde68a 0%, #fbbf24 55%, #f59e0b 100%);\n border: 1px solid #d97706;\n box-shadow: 0 2px 6px rgba(120, 53, 15, 0.35);\n pointer-events: none;\n user-select: none;\n }\n .gd-license-watermark::before {\n content: '★';\n font-size: 12px;\n line-height: 1;\n }\n .gd-license-watermark__url {\n text-decoration: underline;\n }\n `,\n ],\n})\nexport class GridLicenseWatermark {\n /** Package label shown in the watermark. */\n readonly label = input('@gridengine/angular-datagrid-enterprise');\n /** Purchase URL shown in the watermark. */\n readonly url = input(PURCHASE_URL);\n}\n","/**\n * DataGridPro — the license-aware wrapper for the GridEngine Angular grid.\n *\n * Projects a base `<gd-data-grid>` (or any content) and overlays an evaluation\n * watermark when no valid license key is present. The grid remains fully\n * functional without a license (evaluation mode); this component only adds the\n * watermark + a one-time console warning.\n *\n * ```html\n * <gd-data-grid-pro [licenseKey]=\"key\">\n * <gd-data-grid [rowData]=\"rows\" [columnDefs]=\"cols\" />\n * </gd-data-grid-pro>\n * ```\n *\n * A `[licenseKey]` input overrides the app-wide key set via\n * `provideGridEngineLicense()` / `LicenseManager.setLicenseKey()`.\n */\nimport { ChangeDetectionStrategy, Component, computed, effect, input } from '@angular/core';\nimport type { LicenseValidationResult } from '@gridengine/license-core';\nimport { LicenseManager } from './license-manager';\nimport { GridLicenseWatermark } from './license-watermark';\n\n@Component({\n selector: 'gd-data-grid-pro',\n standalone: true,\n imports: [GridLicenseWatermark],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"gd-data-grid-pro\">\n <ng-content />\n @if (showWatermark()) {\n <gd-license-watermark />\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .gd-data-grid-pro {\n position: relative;\n display: block;\n }\n `,\n ],\n})\nexport class DataGridPro {\n /** Per-instance license key; overrides the app-wide key when provided. */\n readonly licenseKey = input<string | undefined>(undefined);\n\n protected readonly licenseResult = computed<LicenseValidationResult>(() =>\n LicenseManager.validate(this.licenseKey() ?? LicenseManager.getLicenseKey()),\n );\n\n protected readonly showWatermark = computed(() => this.licenseResult().status !== 'valid');\n\n private warned = false;\n\n constructor() {\n effect(() => {\n const result = this.licenseResult();\n if (!this.warned && result.status !== 'valid') {\n console.warn(`[@gridengine/angular-datagrid-enterprise] ${result.message}`);\n this.warned = true;\n }\n });\n }\n\n /** The current license validation result (for advanced consumers). */\n getLicenseResult(): LicenseValidationResult {\n return this.licenseResult();\n }\n}\n","/**\n * `provideGridEngineLicense` — register a GridEngine Angular license key once\n * for the whole application at bootstrap.\n *\n * Usage (standalone bootstrap):\n *\n * ```ts\n * bootstrapApplication(App, {\n * providers: [provideGridEngineLicense('BASE64URL.payload.signature')],\n * });\n * ```\n *\n * Every `<gd-data-grid-pro>` in the app then picks the key up automatically via\n * `LicenseManager.getLicenseKey()`; a per-instance `[licenseKey]` input still\n * overrides it for that instance.\n */\nimport { makeEnvironmentProviders, provideEnvironmentInitializer } from '@angular/core';\nimport type { EnvironmentProviders } from '@angular/core';\nimport { LicenseManager } from './license-manager';\n\nexport function provideGridEngineLicense(key: string | undefined): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideEnvironmentInitializer(() => LicenseManager.setLicenseKey(key)),\n ]);\n}\n","/**\n * RangeSelectionEngine — tracks a rectangular cell selection (anchor +\n * extension) and notifies a listener on every change. Pure logic, no DOM.\n */\nimport type { CellRange } from './cell-range';\n\nexport interface RangeSelectionEngineOptions {\n /** Called whenever the selection changes. */\n onChange?: (range: CellRange | null) => void;\n}\n\nexport class RangeSelectionEngine {\n private _selection: CellRange | null = null;\n private _anchor: { rowIndex: number; colIndex: number } | null = null;\n private readonly _onChange?: (range: CellRange | null) => void;\n\n constructor(options: RangeSelectionEngineOptions = {}) {\n this._onChange = options.onChange;\n }\n\n /** Begin a new selection at an anchor cell (mouse down / keyboard). */\n startSelection(rowIndex: number, colIndex: number): void {\n this._anchor = { rowIndex, colIndex };\n this._selection = {\n startRowIndex: rowIndex,\n endRowIndex: rowIndex,\n startColIndex: colIndex,\n endColIndex: colIndex,\n };\n this._notify();\n }\n\n /** Extend the selection to a new endpoint (mouse move / Shift+arrow). */\n extendSelection(rowIndex: number, colIndex: number): void {\n if (!this._anchor) {\n this.startSelection(rowIndex, colIndex);\n return;\n }\n this._selection = RangeSelectionEngine._normalize(\n this._anchor.rowIndex,\n this._anchor.colIndex,\n rowIndex,\n colIndex,\n );\n this._notify();\n }\n\n /** Programmatically set the selection range. */\n setSelection(range: CellRange | null): void {\n this._selection = range;\n this._anchor = range\n ? { rowIndex: range.startRowIndex, colIndex: range.startColIndex }\n : null;\n this._notify();\n }\n\n /** Clear the selection. */\n clear(): void {\n this._selection = null;\n this._anchor = null;\n this._notify();\n }\n\n getSelection(): CellRange | null {\n return this._selection;\n }\n\n /** Returns true if the given cell falls within the current selection. */\n isCellSelected(rowIndex: number, colIndex: number): boolean {\n const s = this._selection;\n if (!s) return false;\n return (\n rowIndex >= s.startRowIndex &&\n rowIndex <= s.endRowIndex &&\n colIndex >= s.startColIndex &&\n colIndex <= s.endColIndex\n );\n }\n\n /** Expand/contract the selection one step in a direction (keyboard nav). */\n expandByKey(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight',\n totalRows: number,\n totalCols: number,\n ): void {\n const s = this._selection;\n if (!s || !this._anchor) return;\n\n let { endRowIndex, endColIndex } = s;\n\n switch (key) {\n case 'ArrowUp':\n endRowIndex = Math.max(0, endRowIndex - 1);\n break;\n case 'ArrowDown':\n endRowIndex = Math.min(totalRows - 1, endRowIndex + 1);\n break;\n case 'ArrowLeft':\n endColIndex = Math.max(0, endColIndex - 1);\n break;\n case 'ArrowRight':\n endColIndex = Math.min(totalCols - 1, endColIndex + 1);\n break;\n }\n\n this._selection = RangeSelectionEngine._normalize(\n this._anchor.rowIndex,\n this._anchor.colIndex,\n endRowIndex,\n endColIndex,\n );\n this._notify();\n }\n\n private _notify(): void {\n this._onChange?.(this._selection);\n }\n\n /** Normalise anchor + endpoint into a top-left / bottom-right rectangle. */\n private static _normalize(r1: number, c1: number, r2: number, c2: number): CellRange {\n return {\n startRowIndex: Math.min(r1, r2),\n endRowIndex: Math.max(r1, r2),\n startColIndex: Math.min(c1, c2),\n endColIndex: Math.max(c1, c2),\n };\n }\n}\n","/**\n * ClipboardEngine — Ctrl+C/X/V over a selected cell range, serialised as TSV\n * (tab-separated) so it round-trips with Excel / Google Sheets. Pure logic;\n * the caller supplies cell get/set accessors.\n */\nimport type { RangeSelectionEngine } from './range-selection';\n\nexport interface ClipboardEngineOptions {\n getCellValue: (rowIndex: number, colIndex: number) => unknown;\n setCellValue: (rowIndex: number, colIndex: number, value: string) => void;\n getTotalCols: () => number;\n getTotalRows: () => number;\n onCopy?: (data: string[][]) => void;\n onPaste?: (data: string[][], startRow: number, startCol: number) => boolean | void;\n rangeSelection: RangeSelectionEngine;\n}\n\n/** Escape a cell value for TSV: quote it if it contains tab/newline/quotes. */\nfunction escapeTSV(value: unknown): string {\n const str = value == null ? '' : String(value);\n if (str.includes('\\t') || str.includes('\\n') || str.includes('\"')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\n\n/**\n * Parse TSV text into a 2-D array of strings. Character-by-character so it\n * handles quoted cells with embedded tabs/newlines, escaped quotes (\"\"),\n * trailing tabs, and CRLF/LF line endings.\n */\nexport function parseTSV(tsv: string): string[][] {\n if (!tsv) return [];\n\n const rows: string[][] = [];\n let currentRow: string[] = [];\n let i = 0;\n\n while (i <= tsv.length) {\n if (i === tsv.length) {\n if (currentRow.length > 0) rows.push(currentRow);\n break;\n }\n\n let cell = '';\n\n if (tsv[i] === '\"') {\n i++; // skip opening quote\n while (i < tsv.length) {\n if (tsv[i] === '\"' && tsv[i + 1] === '\"') {\n cell += '\"';\n i += 2;\n } else if (tsv[i] === '\"') {\n i++; // skip closing quote\n break;\n } else {\n cell += tsv[i++];\n }\n }\n } else {\n while (i < tsv.length && tsv[i] !== '\\t' && tsv[i] !== '\\n' && tsv[i] !== '\\r') {\n cell += tsv[i++];\n }\n }\n\n currentRow.push(cell);\n\n if (i < tsv.length) {\n if (tsv[i] === '\\t') {\n i++;\n // A tab at true end-of-string leaves a trailing empty cell; a tab\n // before a newline is handled by the next iteration reading it.\n if (i >= tsv.length) {\n currentRow.push('');\n }\n } else if (tsv[i] === '\\r') {\n i++;\n if (i < tsv.length && tsv[i] === '\\n') i++; // consume \\n of CRLF\n rows.push(currentRow);\n currentRow = [];\n } else if (tsv[i] === '\\n') {\n i++;\n rows.push(currentRow);\n currentRow = [];\n }\n }\n }\n\n return rows;\n}\n\nexport class ClipboardEngine {\n private readonly _opts: ClipboardEngineOptions;\n\n constructor(options: ClipboardEngineOptions) {\n this._opts = options;\n }\n\n /** Copy the selected range to the system clipboard as TSV. */\n async copy(): Promise<void> {\n const data = this._getSelectedData();\n if (!data) return;\n const tsv = data.map((row) => row.map(escapeTSV).join('\\t')).join('\\n');\n await navigator.clipboard.writeText(tsv);\n this._opts.onCopy?.(data);\n }\n\n /** Cut: copy then clear the selected range. */\n async cut(): Promise<void> {\n await this.copy();\n this._clearSelection();\n }\n\n /** Paste from the system clipboard into the top-left of the selection. */\n async paste(): Promise<void> {\n const text = await navigator.clipboard.readText();\n if (!text) return;\n\n const data = parseTSV(text);\n const selection = this._opts.rangeSelection.getSelection();\n const startRow = selection?.startRowIndex ?? 0;\n const startCol = selection?.startColIndex ?? 0;\n\n const shouldProceed = this._opts.onPaste?.(data, startRow, startCol);\n if (shouldProceed === false) return;\n\n const totalRows = this._opts.getTotalRows();\n const totalCols = this._opts.getTotalCols();\n\n for (let r = 0; r < data.length; r++) {\n for (let c = 0; c < data[r].length; c++) {\n const targetRow = startRow + r;\n const targetCol = startCol + c;\n if (targetRow >= totalRows || targetCol >= totalCols) continue;\n this._opts.setCellValue(targetRow, targetCol, data[r][c]);\n }\n }\n\n this._opts.rangeSelection.setSelection({\n startRowIndex: startRow,\n endRowIndex: Math.min(startRow + data.length - 1, totalRows - 1),\n startColIndex: startCol,\n endColIndex: Math.min(startCol + (data[0]?.length ?? 1) - 1, totalCols - 1),\n });\n }\n\n /** The selected cells as a raw string matrix (unescaped). */\n private _getSelectedData(): string[][] | null {\n const selection = this._opts.rangeSelection.getSelection();\n if (!selection) return null;\n\n const { startRowIndex, endRowIndex, startColIndex, endColIndex } = selection;\n const rows: string[][] = [];\n\n for (let r = startRowIndex; r <= endRowIndex; r++) {\n const row: string[] = [];\n for (let c = startColIndex; c <= endColIndex; c++) {\n const v = this._opts.getCellValue(r, c);\n row.push(v == null ? '' : String(v));\n }\n rows.push(row);\n }\n return rows;\n }\n\n private _clearSelection(): void {\n const selection = this._opts.rangeSelection.getSelection();\n if (!selection) return;\n\n const { startRowIndex, endRowIndex, startColIndex, endColIndex } = selection;\n for (let r = startRowIndex; r <= endRowIndex; r++) {\n for (let c = startColIndex; c <= endColIndex; c++) {\n this._opts.setCellValue(r, c, '');\n }\n }\n }\n}\n","/**\n * FillHandleEngine — computes the values to write when the user drags the fill\n * handle at the bottom-right of a range selection. Pure logic, no DOM.\n *\n * Modes:\n * 'copy' — repeat the source values into every target cell.\n * 'series' — continue a detected numeric / date / day-name / month-name\n * series; falls back to 'copy' when no series is detected.\n */\nimport type { CellRange } from './cell-range';\n\nexport type FillDirection = 'down' | 'up' | 'right' | 'left';\n\nexport interface FillCell {\n rowIndex: number;\n colIndex: number;\n value: unknown;\n}\n\nexport interface FillResult {\n direction: FillDirection;\n cells: FillCell[];\n}\n\nexport interface FillHandleEngineOptions {\n mode: 'copy' | 'series';\n getCellValue: (rowIndex: number, colIndex: number) => unknown;\n}\n\n/** Parse a value as a finite number, or null. */\nexport function toNumber(value: unknown): number | null {\n if (typeof value === 'number' && isFinite(value)) return value;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const n = Number(trimmed);\n return isFinite(n) ? n : null;\n }\n return null;\n}\n\n/** Parse a value as a Date timestamp (ms), or null. */\nexport function toTimestamp(value: unknown): number | null {\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value.getTime();\n if (typeof value === 'string') {\n const d = new Date(value);\n return isNaN(d.getTime()) ? null : d.getTime();\n }\n return null;\n}\n\nconst DAY_NAMES = [\n ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'],\n ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'],\n];\nconst MONTH_NAMES = [\n ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'],\n ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'],\n];\n\ninterface NamedSeriesMatch {\n list: string[];\n index: number;\n originalCase: 'lower' | 'upper' | 'title';\n}\n\nfunction matchNamedSeries(value: unknown): NamedSeriesMatch | null {\n if (typeof value !== 'string') return null;\n const lower = value.trim().toLowerCase();\n for (const list of [...DAY_NAMES, ...MONTH_NAMES]) {\n const idx = list.indexOf(lower);\n if (idx !== -1) {\n const original = value.trim();\n const originalCase =\n original === original.toUpperCase()\n ? 'upper'\n : original[0] === original[0].toUpperCase()\n ? 'title'\n : 'lower';\n return { list, index: idx, originalCase };\n }\n }\n return null;\n}\n\nfunction applyCase(s: string, caseStyle: 'lower' | 'upper' | 'title'): string {\n if (caseStyle === 'upper') return s.toUpperCase();\n if (caseStyle === 'title') return s[0].toUpperCase() + s.slice(1).toLowerCase();\n return s.toLowerCase();\n}\n\nexport class FillHandleEngine {\n private readonly _opts: FillHandleEngineOptions;\n\n constructor(options: FillHandleEngineOptions) {\n this._opts = options;\n }\n\n /**\n * Compute the cells to fill given a source selection and the extended target\n * selection after dragging the handle. Returns null for an invalid drag.\n */\n computeFill(sourceRange: CellRange, targetRange: CellRange): FillResult | null {\n const direction = this._detectDirection(sourceRange, targetRange);\n if (!direction) return null;\n\n const sourceValues = this._extractSource(sourceRange, direction);\n const targetCells = this._buildTargetCells(sourceRange, targetRange, direction);\n\n const filledValues =\n this._opts.mode === 'series'\n ? this._fillSeries(sourceValues, targetCells.length)\n : this._fillCopy(sourceValues, targetCells.length);\n\n return {\n direction,\n cells: targetCells.map((cell, i) => ({ ...cell, value: filledValues[i] })),\n };\n }\n\n private _detectDirection(source: CellRange, target: CellRange): FillDirection | null {\n if (\n target.startRowIndex > source.startRowIndex ||\n target.endRowIndex < source.endRowIndex ||\n target.startColIndex > source.startColIndex ||\n target.endColIndex < source.endColIndex\n ) {\n return null;\n }\n\n const extendedDown = target.endRowIndex > source.endRowIndex;\n const extendedUp = target.startRowIndex < source.startRowIndex;\n const extendedRight = target.endColIndex > source.endColIndex;\n const extendedLeft = target.startColIndex < source.startColIndex;\n\n const directions = [extendedDown, extendedUp, extendedRight, extendedLeft].filter(Boolean);\n if (directions.length !== 1) return null;\n\n if (extendedDown) return 'down';\n if (extendedUp) return 'up';\n if (extendedRight) return 'right';\n return 'left';\n }\n\n private _extractSource(source: CellRange, direction: FillDirection): unknown[] {\n const values: unknown[] = [];\n if (direction === 'down' || direction === 'up') {\n for (let r = source.startRowIndex; r <= source.endRowIndex; r++) {\n values.push(this._opts.getCellValue(r, source.startColIndex));\n }\n } else {\n for (let c = source.startColIndex; c <= source.endColIndex; c++) {\n values.push(this._opts.getCellValue(source.startRowIndex, c));\n }\n }\n return values;\n }\n\n private _buildTargetCells(\n source: CellRange,\n target: CellRange,\n direction: FillDirection,\n ): { rowIndex: number; colIndex: number }[] {\n const cells: { rowIndex: number; colIndex: number }[] = [];\n\n if (direction === 'down') {\n for (let r = source.endRowIndex + 1; r <= target.endRowIndex; r++) {\n for (let c = source.startColIndex; c <= source.endColIndex; c++) {\n cells.push({ rowIndex: r, colIndex: c });\n }\n }\n } else if (direction === 'up') {\n for (let r = target.startRowIndex; r < source.startRowIndex; r++) {\n for (let c = source.startColIndex; c <= source.endColIndex; c++) {\n cells.push({ rowIndex: r, colIndex: c });\n }\n }\n } else if (direction === 'right') {\n for (let r = source.startRowIndex; r <= source.endRowIndex; r++) {\n for (let c = source.endColIndex + 1; c <= target.endColIndex; c++) {\n cells.push({ rowIndex: r, colIndex: c });\n }\n }\n } else {\n for (let r = source.startRowIndex; r <= source.endRowIndex; r++) {\n for (let c = target.startColIndex; c < source.startColIndex; c++) {\n cells.push({ rowIndex: r, colIndex: c });\n }\n }\n }\n\n return cells;\n }\n\n private _fillCopy(source: unknown[], count: number): unknown[] {\n const result: unknown[] = [];\n for (let i = 0; i < count; i++) {\n result.push(source[i % source.length]);\n }\n return result;\n }\n\n private _fillSeries(source: unknown[], count: number): unknown[] {\n if (source.length >= 1) {\n const match = matchNamedSeries(source[0]);\n if (match) return this._fillNamedSeries(source, count, match);\n }\n\n const nums = source.map(toNumber);\n if (nums.every((n) => n !== null)) {\n return this._fillNumericSeries(nums as number[], count);\n }\n\n const timestamps = source.map(toTimestamp);\n if (timestamps.every((t) => t !== null)) {\n return this._fillDateSeries(source, timestamps as number[], count);\n }\n\n return this._fillCopy(source, count);\n }\n\n private _fillNumericSeries(source: number[], count: number): number[] {\n const step = source.length > 1 ? source[1] - source[0] : 1;\n const last = source[source.length - 1];\n const result: number[] = [];\n for (let i = 1; i <= count; i++) {\n result.push(last + step * i);\n }\n return result;\n }\n\n private _fillDateSeries(originalSource: unknown[], timestamps: number[], count: number): string[] {\n const step = timestamps.length > 1 ? timestamps[1] - timestamps[0] : 24 * 60 * 60 * 1000;\n const last = timestamps[timestamps.length - 1];\n\n const sampleStr = typeof originalSource[0] === 'string' ? (originalSource[0] as string) : '';\n const isDateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(sampleStr.trim());\n\n return Array.from({ length: count }, (_, i) => {\n const d = new Date(last + step * (i + 1));\n return isDateOnly ? d.toISOString().slice(0, 10) : d.toISOString();\n });\n }\n\n private _fillNamedSeries(source: unknown[], count: number, match: NamedSeriesMatch): string[] {\n const { list, index: firstIndex, originalCase } = match;\n const indexOf = (v: unknown) =>\n typeof v === 'string' ? list.indexOf(v.trim().toLowerCase()) : -1;\n\n const lastIndex = indexOf(source[source.length - 1]);\n const startIndex = lastIndex >= 0 ? lastIndex : firstIndex;\n const secondIndex = source.length > 1 ? indexOf(source[1]) : -1;\n const step =\n secondIndex >= 0 ? ((secondIndex - firstIndex + list.length) % list.length) || 1 : 1;\n\n const result: string[] = [];\n for (let i = 1; i <= count; i++) {\n const nextIndex = (((startIndex + step * i) % list.length) + list.length) % list.length;\n result.push(applyCase(list[nextIndex], originalCase));\n }\n return result;\n }\n}\n","/**\n * UndoRedoManager — a bounded undo/redo command stack. Each command stores\n * enough state to reverse itself; the manager applies changes through the\n * `applyValue` callback the host supplies (it never mutates data directly).\n */\n\nexport interface CellEditCommand {\n type: 'cellEdit';\n rowId: string | number;\n field: string;\n prevValue: unknown;\n nextValue: unknown;\n}\n\nexport interface PasteCommand {\n type: 'paste';\n cells: { rowId: string | number; field: string; prevValue: unknown; nextValue: unknown }[];\n}\n\nexport interface FillCommand {\n type: 'fill';\n cells: { rowId: string | number; field: string; prevValue: unknown; nextValue: unknown }[];\n}\n\nexport interface DeleteCommand {\n type: 'delete';\n cells: { rowId: string | number; field: string; prevValue: unknown }[];\n}\n\nexport type UndoRedoCommand = CellEditCommand | PasteCommand | FillCommand | DeleteCommand;\n\nexport interface UndoRedoManagerOptions {\n /** Maximum number of undo steps to retain. Default: 100 */\n maxStackSize?: number;\n /** Called whenever canUndo or canRedo changes. */\n onChange?: (canUndo: boolean, canRedo: boolean) => void;\n /** Applies a value to a cell — the manager calls this to (un)apply commands. */\n applyValue: (rowId: string | number, field: string, value: unknown) => void;\n}\n\nexport class UndoRedoManager {\n private readonly _undoStack: UndoRedoCommand[] = [];\n private readonly _redoStack: UndoRedoCommand[] = [];\n private readonly _maxStackSize: number;\n private readonly _onChange?: (canUndo: boolean, canRedo: boolean) => void;\n private readonly _applyValue: (rowId: string | number, field: string, value: unknown) => void;\n\n constructor(options: UndoRedoManagerOptions) {\n this._maxStackSize = options.maxStackSize ?? 100;\n this._onChange = options.onChange;\n this._applyValue = options.applyValue;\n }\n\n /** Push a new command onto the undo stack. Clears the redo stack. */\n push(command: UndoRedoCommand): void {\n this._undoStack.push(command);\n if (this._undoStack.length > this._maxStackSize) {\n this._undoStack.shift();\n }\n this._redoStack.length = 0;\n this._notifyChange();\n }\n\n /** Undo the most recent command. */\n undo(): void {\n const command = this._undoStack.pop();\n if (!command) return;\n this._applyCommandReverse(command);\n this._redoStack.push(command);\n this._notifyChange();\n }\n\n /** Redo the most recently undone command. */\n redo(): void {\n const command = this._redoStack.pop();\n if (!command) return;\n this._applyCommandForward(command);\n this._undoStack.push(command);\n this._notifyChange();\n }\n\n canUndo(): boolean {\n return this._undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this._redoStack.length > 0;\n }\n\n /** Clear both stacks (e.g. after a full data reload). */\n clear(): void {\n this._undoStack.length = 0;\n this._redoStack.length = 0;\n this._notifyChange();\n }\n\n undoStackSize(): number {\n return this._undoStack.length;\n }\n\n redoStackSize(): number {\n return this._redoStack.length;\n }\n\n private _applyCommandReverse(command: UndoRedoCommand): void {\n switch (command.type) {\n case 'cellEdit':\n this._applyValue(command.rowId, command.field, command.prevValue);\n break;\n case 'paste':\n case 'fill':\n case 'delete':\n for (const cell of command.cells) {\n this._applyValue(cell.rowId, cell.field, cell.prevValue);\n }\n break;\n }\n }\n\n private _applyCommandForward(command: UndoRedoCommand): void {\n switch (command.type) {\n case 'cellEdit':\n this._applyValue(command.rowId, command.field, command.nextValue);\n break;\n case 'paste':\n case 'fill':\n for (const cell of command.cells) {\n this._applyValue(cell.rowId, cell.field, cell.nextValue);\n }\n break;\n case 'delete':\n for (const cell of command.cells) {\n this._applyValue(cell.rowId, cell.field, '');\n }\n break;\n }\n }\n\n private _notifyChange(): void {\n this._onChange?.(this.canUndo(), this.canRedo());\n }\n}\n","/**\n * FormulaEngine — evaluates Excel-like formula strings against row data.\n * Formulas start with '=' and reference other columns by field name.\n *\n * Functions: SUM, AVG, MIN, MAX, COUNT, IF, CONCAT, ROUND, ABS, FLOOR, CEIL,\n * LEN, UPPER, LOWER. Bare identifiers that aren't function names are treated as\n * field lookups on the current row.\n *\n * Error values: '#ERROR!', '#DIV/0!', '#REF!', '#CIRCULAR!', '#NAME?'.\n * A formula that directly/transitively references its own cell yields\n * '#CIRCULAR!'.\n */\n\ntype ASTNode =\n | { kind: 'number'; value: number }\n | { kind: 'string'; value: string }\n | { kind: 'field'; name: string }\n | { kind: 'call'; fn: string; args: ASTNode[] }\n | {\n kind: 'binary';\n op: '+' | '-' | '*' | '/' | '==' | '!=' | '<' | '<=' | '>' | '>=';\n left: ASTNode;\n right: ASTNode;\n }\n | { kind: 'unary'; op: '-'; operand: ASTNode };\n\nclass Parser {\n private _src: string;\n private _pos = 0;\n\n constructor(src: string) {\n this._src = src.trim();\n }\n\n parse(): ASTNode {\n const node = this._parseExpr();\n this._skipWS();\n if (this._pos < this._src.length) {\n throw new Error(`Unexpected character at position ${this._pos}: '${this._src[this._pos]}'`);\n }\n return node;\n }\n\n private _skipWS(): void {\n while (this._pos < this._src.length && /\\s/.test(this._src[this._pos])) {\n this._pos++;\n }\n }\n\n private _consume(ch: string): void {\n this._skipWS();\n if (this._src[this._pos] !== ch) {\n throw new Error(`Expected '${ch}' at position ${this._pos}`);\n }\n this._pos++;\n }\n\n private _parseExpr(): ASTNode {\n return this._parseComparison();\n }\n\n private _parseComparison(): ASTNode {\n let left = this._parseAddSub();\n this._skipWS();\n while (this._pos < this._src.length) {\n const ch = this._src[this._pos];\n const ch2 = this._src.slice(this._pos, this._pos + 2);\n if (ch2 === '==' || ch2 === '!=' || ch2 === '<=' || ch2 === '>=') {\n this._pos += 2;\n const right = this._parseAddSub();\n left = { kind: 'binary', op: ch2, left, right };\n } else if (ch === '<' || ch === '>') {\n this._pos++;\n const right = this._parseAddSub();\n left = { kind: 'binary', op: ch, left, right };\n } else {\n break;\n }\n this._skipWS();\n }\n return left;\n }\n\n private _parseAddSub(): ASTNode {\n let left = this._parseMulDiv();\n this._skipWS();\n while (\n this._pos < this._src.length &&\n (this._src[this._pos] === '+' || this._src[this._pos] === '-')\n ) {\n const op = this._src[this._pos++] as '+' | '-';\n const right = this._parseMulDiv();\n left = { kind: 'binary', op, left, right };\n this._skipWS();\n }\n return left;\n }\n\n private _parseMulDiv(): ASTNode {\n let left = this._parseUnary();\n this._skipWS();\n while (\n this._pos < this._src.length &&\n (this._src[this._pos] === '*' || this._src[this._pos] === '/')\n ) {\n const op = this._src[this._pos++] as '*' | '/';\n const right = this._parseUnary();\n left = { kind: 'binary', op, left, right };\n this._skipWS();\n }\n return left;\n }\n\n private _parseUnary(): ASTNode {\n this._skipWS();\n if (this._src[this._pos] === '-') {\n this._pos++;\n return { kind: 'unary', op: '-', operand: this._parseUnary() };\n }\n return this._parsePrimary();\n }\n\n private _parsePrimary(): ASTNode {\n this._skipWS();\n const ch = this._src[this._pos];\n\n if (ch === undefined) {\n throw new Error('Unexpected end of expression');\n }\n\n if (ch === '(') {\n this._pos++;\n const node = this._parseExpr();\n this._consume(')');\n return node;\n }\n\n if (ch === '\"' || ch === \"'\") {\n return this._parseString(ch);\n }\n\n if (ch === '.' || (ch >= '0' && ch <= '9')) {\n return this._parseNumber();\n }\n\n if (/[A-Za-z_]/.test(ch)) {\n return this._parseIdentifier();\n }\n\n throw new Error(`Unexpected token at position ${this._pos}: '${ch}'`);\n }\n\n private _parseString(quote: string): ASTNode {\n this._pos++; // skip opening quote\n let s = '';\n while (this._pos < this._src.length && this._src[this._pos] !== quote) {\n s += this._src[this._pos++];\n }\n this._pos++; // skip closing quote\n return { kind: 'string', value: s };\n }\n\n private _parseNumber(): ASTNode {\n let s = '';\n while (this._pos < this._src.length && /[\\d.]/.test(this._src[this._pos])) {\n s += this._src[this._pos++];\n }\n if (this._src[this._pos] === 'e' || this._src[this._pos] === 'E') {\n s += this._src[this._pos++];\n if (this._src[this._pos] === '+' || this._src[this._pos] === '-') {\n s += this._src[this._pos++];\n }\n while (this._pos < this._src.length && /\\d/.test(this._src[this._pos])) {\n s += this._src[this._pos++];\n }\n }\n return { kind: 'number', value: Number(s) };\n }\n\n private _parseIdentifier(): ASTNode {\n let name = '';\n while (this._pos < this._src.length && /[\\w]/.test(this._src[this._pos])) {\n name += this._src[this._pos++];\n }\n this._skipWS();\n if (this._src[this._pos] === '(') {\n this._pos++;\n const args: ASTNode[] = [];\n this._skipWS();\n if (this._src[this._pos] !== ')') {\n args.push(this._parseExpr());\n this._skipWS();\n while (this._src[this._pos] === ',') {\n this._pos++;\n args.push(this._parseExpr());\n this._skipWS();\n }\n }\n this._consume(')');\n return { kind: 'call', fn: name.toUpperCase(), args };\n }\n return { kind: 'field', name };\n }\n}\n\ntype Row = Record<string, unknown>;\n\nconst FUNCTIONS: Record<string, (args: unknown[]) => unknown> = {\n SUM: (args) => args.reduce<number>((acc, v) => acc + (Number(v) || 0), 0),\n AVG: (args) =>\n args.length === 0 ? 0 : args.reduce<number>((acc, v) => acc + (Number(v) || 0), 0) / args.length,\n MIN: (args) => Math.min(...args.map(Number)),\n MAX: (args) => Math.max(...args.map(Number)),\n COUNT: (args) => args.filter((v) => !isNaN(Number(v)) && v !== '' && v != null).length,\n CONCAT: (args) => args.join(''),\n ROUND: ([n, d]) => Number(Number(n).toFixed(Number(d ?? 0))),\n ABS: ([n]) => Math.abs(Number(n)),\n FLOOR: ([n]) => Math.floor(Number(n)),\n CEIL: ([n]) => Math.ceil(Number(n)),\n LEN: ([s]) => String(s ?? '').length,\n UPPER: ([s]) => String(s ?? '').toUpperCase(),\n LOWER: ([s]) => String(s ?? '').toLowerCase(),\n IF: ([cond, t, f]) => (cond ? t : f),\n};\n\nfunction evalBinary(op: Extract<ASTNode, { kind: 'binary' }>['op'], l: unknown, r: unknown): unknown {\n switch (op) {\n case '+':\n return typeof l === 'string' || typeof r === 'string'\n ? String(l) + String(r)\n : Number(l) + Number(r);\n case '-':\n return Number(l) - Number(r);\n case '*':\n return Number(l) * Number(r);\n case '/': {\n const divisor = Number(r);\n return divisor === 0 ? '#DIV/0!' : Number(l) / divisor;\n }\n case '==':\n return l == r;\n case '!=':\n return l != r;\n case '<':\n return Number(l) < Number(r);\n case '<=':\n return Number(l) <= Number(r);\n case '>':\n return Number(l) > Number(r);\n case '>=':\n return Number(l) >= Number(r);\n default:\n return '#ERROR!';\n }\n}\n\nfunction evaluate(node: ASTNode, row: Row, visiting: Set<string>): unknown {\n switch (node.kind) {\n case 'number':\n return node.value;\n case 'string':\n return node.value;\n\n case 'field': {\n const key = node.name;\n if (visiting.has(key)) return '#CIRCULAR!';\n const raw = row[key];\n if (typeof raw === 'string' && raw.startsWith('=')) {\n visiting.add(key);\n try {\n const ast = new Parser(raw.slice(1)).parse();\n return evaluate(ast, row, visiting);\n } finally {\n visiting.delete(key);\n }\n }\n if (raw === undefined) return '#REF!';\n return raw;\n }\n\n case 'unary': {\n const v = evaluate(node.operand, row, visiting);\n if (typeof v === 'string' && v.startsWith('#')) return v;\n return -Number(v);\n }\n\n case 'binary': {\n const l = evaluate(node.left, row, visiting);\n const r = evaluate(node.right, row, visiting);\n if (typeof l === 'string' && l.startsWith('#')) return l;\n if (typeof r === 'string' && r.startsWith('#')) return r;\n return evalBinary(node.op, l, r);\n }\n\n case 'call': {\n const fn = FUNCTIONS[node.fn];\n if (!fn) return '#NAME?';\n const args = node.args.map((a) => evaluate(a, row, visiting));\n const err = args.find((a) => typeof a === 'string' && a.startsWith('#'));\n if (err) return err;\n return fn(args);\n }\n }\n}\n\nexport interface FormulaEngineOptions {\n /**\n * Fields that contain formula definitions. Key = field name, value = formula\n * string (e.g. '=SUM(price, tax)'). The row's field value is replaced by the\n * evaluation result.\n */\n formulaFields: Record<string, string>;\n}\n\nexport class FormulaEngine {\n private readonly _formulaFields: Record<string, string>;\n\n constructor(options: FormulaEngineOptions) {\n this._formulaFields = options.formulaFields;\n }\n\n /** Evaluate all formula fields for a row, returning a new (unmutated) row. */\n evaluateRow(row: Row): Row {\n const result: Row = { ...row };\n for (const [field, formula] of Object.entries(this._formulaFields)) {\n result[field] = this.evaluateFormula(formula, row, field);\n }\n return result;\n }\n\n /** Evaluate a single formula string against a row. */\n evaluateFormula(formula: string, row: Row, selfField?: string): unknown {\n const expr = formula.startsWith('=') ? formula.slice(1) : formula;\n try {\n const ast = new Parser(expr).parse();\n const visiting = selfField ? new Set([selfField]) : new Set<string>();\n return evaluate(ast, row, visiting);\n } catch {\n return '#ERROR!';\n }\n }\n\n /** Whether a formula string is parseable (no evaluation). */\n isValidFormula(formula: string): boolean {\n const expr = formula.startsWith('=') ? formula.slice(1) : formula;\n try {\n new Parser(expr).parse();\n return true;\n } catch {\n return false;\n }\n }\n}\n","/**\n * SSRMEngine — Server-Side Row Model: a block-based LRU cache for server-driven\n * datasets of arbitrary size. Pure logic; the caller supplies a datasource with\n * a single async `getRows()` method. Filter/sort/group models are forwarded to\n * the server. Failed fetches retry up to 3 times with exponential backoff.\n */\nimport type { GridRow } from './row';\n\nexport interface SSRMGetRowsParams {\n startRow: number;\n endRow: number;\n filterModel: Record<string, unknown>;\n sortModel: { field: string; direction: 'asc' | 'desc' }[];\n groupKeys: string[];\n}\n\nexport interface SSRMGetRowsResult {\n rows: GridRow[];\n totalCount: number;\n}\n\nexport interface SSRMDataSource {\n getRows(params: SSRMGetRowsParams): Promise<SSRMGetRowsResult>;\n}\n\nexport type BlockState = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport interface Block {\n /** Zero-based block index (index * blockSize = startRow). */\n index: number;\n state: BlockState;\n rows: GridRow[];\n error?: Error;\n /** Monotonically increasing access counter — higher = more recently used. */\n lastAccessed: number;\n}\n\nexport interface SSRMEngineOptions {\n dataSource: SSRMDataSource;\n /** Rows per block. Default: 100 */\n blockSize?: number;\n /** Maximum blocks to keep in memory (LRU eviction). Default: 10 */\n maxBlocksInCache?: number;\n}\n\nexport class SSRMEngine {\n private readonly _dataSource: SSRMDataSource;\n readonly blockSize: number;\n readonly maxBlocksInCache: number;\n\n private readonly _blocks = new Map<number, Block>();\n private _accessClock = 0;\n private _totalCount: number | null = null;\n private _filterModel: Record<string, unknown> = {};\n private _sortModel: { field: string; direction: 'asc' | 'desc' }[] = [];\n private _groupKeys: string[] = [];\n private _onChange?: () => void;\n\n constructor(options: SSRMEngineOptions) {\n this._dataSource = options.dataSource;\n this.blockSize = options.blockSize ?? 100;\n this.maxBlocksInCache = options.maxBlocksInCache ?? 10;\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n setFilterModel(model: Record<string, unknown>): void {\n this._filterModel = model;\n this._invalidateAll();\n }\n\n setSortModel(model: { field: string; direction: 'asc' | 'desc' }[]): void {\n this._sortModel = model;\n this._invalidateAll();\n }\n\n setGroupKeys(keys: string[]): void {\n this._groupKeys = keys;\n this._invalidateAll();\n }\n\n /** Total row count from the last server response (null = not yet known). */\n getTotalCount(): number | null {\n return this._totalCount;\n }\n\n /**\n * Get the row at an absolute zero-based index, fetching the containing block\n * if needed. Returns null while the block is loading.\n */\n getRow(rowIndex: number): GridRow | null {\n const blockIndex = Math.floor(rowIndex / this.blockSize);\n const block = this._getOrCreateBlock(blockIndex);\n\n if (block.state === 'loaded') {\n const localIndex = rowIndex - blockIndex * this.blockSize;\n return block.rows[localIndex] ?? null;\n }\n return null;\n }\n\n /** Rows for the viewport [startRow, endRow); missing slots are null. */\n getRowSlice(startRow: number, endRow: number): (GridRow | null)[] {\n const result: (GridRow | null)[] = [];\n for (let i = startRow; i < endRow; i++) {\n result.push(this.getRow(i));\n }\n return result;\n }\n\n getBlockState(blockIndex: number): BlockState {\n return this._blocks.get(blockIndex)?.state ?? 'idle';\n }\n\n getBlocks(): ReadonlyMap<number, Block> {\n return this._blocks;\n }\n\n /** Evict all cached blocks and reset total count. */\n invalidateAll(): void {\n this._invalidateAll();\n }\n\n /** Evict a specific block (e.g. after a row mutation on that page). */\n invalidateBlock(blockIndex: number): void {\n this._blocks.delete(blockIndex);\n this._notify();\n }\n\n private _getOrCreateBlock(blockIndex: number): Block {\n let block = this._blocks.get(blockIndex);\n\n if (!block) {\n if (this._blocks.size >= this.maxBlocksInCache) {\n this._evictOldest();\n }\n block = { index: blockIndex, state: 'idle', rows: [], lastAccessed: ++this._accessClock };\n this._blocks.set(blockIndex, block);\n }\n\n block.lastAccessed = ++this._accessClock;\n\n if (block.state === 'idle' || block.state === 'error') {\n this._fetchBlock(block);\n }\n\n return block;\n }\n\n private _fetchBlock(block: Block, retryCount = 0): void {\n block.state = 'loading';\n this._notify();\n\n const startRow = block.index * this.blockSize;\n const params: SSRMGetRowsParams = {\n startRow,\n endRow: startRow + this.blockSize,\n filterModel: this._filterModel,\n sortModel: this._sortModel,\n groupKeys: this._groupKeys,\n };\n\n this._dataSource\n .getRows(params)\n .then((result: SSRMGetRowsResult) => {\n block.state = 'loaded';\n block.rows = result.rows;\n block.error = undefined;\n this._totalCount = result.totalCount;\n this._notify();\n })\n .catch((err: Error) => {\n if (retryCount < 3) {\n const delay = Math.pow(2, retryCount) * 1000; // 1s, 2s, 4s\n setTimeout(() => this._fetchBlock(block, retryCount + 1), delay);\n } else {\n block.state = 'error';\n block.error = err;\n this._notify();\n }\n });\n }\n\n private _evictOldest(): void {\n let oldest: Block | null = null;\n for (const block of this._blocks.values()) {\n if (!oldest || block.lastAccessed < oldest.lastAccessed) {\n oldest = block;\n }\n }\n if (oldest) {\n this._blocks.delete(oldest.index);\n }\n }\n\n private _invalidateAll(): void {\n this._blocks.clear();\n this._totalCount = null;\n this._notify();\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * TransactionEngine — stages add / update / remove operations against a row set\n * without mutating the original array. Changes are held until commit (fires\n * `onTransactionCommit` with the delta) or rollback (discards them). Row\n * identity comes from `rowIdField` (default 'id').\n */\nimport type { GridRow } from './row';\n\nexport interface TransactionDelta {\n added: GridRow[];\n updated: GridRow[];\n removedIds: (string | number)[];\n}\n\nexport interface TransactionEngineOptions {\n /** Initial rows loaded from the grid. */\n initialRows: GridRow[];\n /** Field used as the unique row ID. Default: 'id' */\n rowIdField?: string;\n onTransactionCommit?: (delta: TransactionDelta) => void;\n onTransactionRollback?: () => void;\n}\n\ntype DirtyState = 'added' | 'updated' | 'removed';\n\ninterface DirtyEntry {\n state: DirtyState;\n /** Row data as it was when first dirtied (for rollback); null for adds. */\n original: GridRow | null;\n /** Current (staged) data. */\n current: GridRow;\n}\n\nexport class TransactionEngine {\n private readonly _rowIdField: string;\n private readonly _onCommit?: (delta: TransactionDelta) => void;\n private readonly _onRollback?: () => void;\n\n private _baseRows: GridRow[];\n private readonly _dirty = new Map<string | number, DirtyEntry>();\n\n constructor(opts: TransactionEngineOptions) {\n this._rowIdField = opts.rowIdField ?? 'id';\n this._onCommit = opts.onTransactionCommit;\n this._onRollback = opts.onTransactionRollback;\n this._baseRows = [...opts.initialRows];\n }\n\n /** Stage new rows; an existing ID is treated as an update instead. */\n addRows(rows: GridRow[]): void {\n for (const row of rows) {\n const id = this._rowId(row);\n const existing = this._findBase(id);\n if (existing !== null) {\n this._stageUpdate(id, existing, row);\n } else {\n this._dirty.set(id, { state: 'added', original: null, current: { ...row } });\n }\n }\n }\n\n /** Stage updates for existing rows; unknown IDs are ignored with a warning. */\n updateRows(rows: GridRow[]): void {\n for (const row of rows) {\n const id = this._rowId(row);\n const existing = this._dirty.get(id);\n\n if (existing?.state === 'added') {\n existing.current = { ...existing.current, ...row };\n } else {\n const base = this._findBase(id);\n if (base === null) {\n console.warn(`TransactionEngine.updateRows: row with id '${id}' not found.`);\n continue;\n }\n this._stageUpdate(id, existing?.original ?? base, row);\n }\n }\n }\n\n /** Stage rows for removal by ID; a still-staged add is simply cancelled. */\n removeRows(ids: (string | number)[]): void {\n for (const id of ids) {\n const existing = this._dirty.get(id);\n\n if (existing?.state === 'added') {\n this._dirty.delete(id);\n continue;\n }\n\n const base = this._findBase(id);\n if (base === null) {\n console.warn(`TransactionEngine.removeRows: row with id '${id}' not found.`);\n continue;\n }\n\n this._dirty.set(id, { state: 'removed', original: existing?.original ?? base, current: base });\n }\n }\n\n commitTransaction(): void {\n const delta = this._buildDelta();\n\n for (const [id, entry] of this._dirty) {\n if (entry.state === 'added') {\n this._baseRows.push(entry.current);\n } else if (entry.state === 'updated') {\n const idx = this._baseRows.findIndex((r) => this._rowId(r) === id);\n if (idx !== -1) this._baseRows[idx] = entry.current;\n } else if (entry.state === 'removed') {\n this._baseRows = this._baseRows.filter((r) => this._rowId(r) !== id);\n }\n }\n\n this._dirty.clear();\n this._onCommit?.(delta);\n }\n\n rollbackTransaction(): void {\n this._dirty.clear();\n this._onRollback?.();\n }\n\n /** True if there are any staged (uncommitted) changes. */\n isDirty(): boolean {\n return this._dirty.size > 0;\n }\n\n /** All current staged changes, grouped by kind. */\n getDirtyRows(): { added: GridRow[]; updated: GridRow[]; removed: GridRow[] } {\n const added: GridRow[] = [];\n const updated: GridRow[] = [];\n const removed: GridRow[] = [];\n\n for (const entry of this._dirty.values()) {\n if (entry.state === 'added') added.push(entry.current);\n else if (entry.state === 'updated') updated.push(entry.current);\n else if (entry.state === 'removed' && entry.original !== null) removed.push(entry.original);\n }\n\n return { added, updated, removed };\n }\n\n /** The merged row list: base rows with staged changes applied. */\n getDisplayRows(): GridRow[] {\n const rows: GridRow[] = [];\n\n for (const baseRow of this._baseRows) {\n const id = this._rowId(baseRow);\n const entry = this._dirty.get(id);\n if (!entry) {\n rows.push(baseRow);\n } else if (entry.state === 'updated') {\n rows.push(entry.current);\n }\n // 'removed' rows are omitted; 'added' rows are appended below.\n }\n\n for (const entry of this._dirty.values()) {\n if (entry.state === 'added') rows.push(entry.current);\n }\n\n return rows;\n }\n\n /** Replace the base rows (e.g. after a refresh); staged changes are kept. */\n resetRows(rows: GridRow[]): void {\n this._baseRows = [...rows];\n }\n\n private _rowId(row: GridRow): string | number {\n const id = row[this._rowIdField];\n if (id === undefined || id === null) {\n throw new Error(\n `TransactionEngine: row has no '${this._rowIdField}' field. Set rowIdField to match your data.`,\n );\n }\n return id as string | number;\n }\n\n private _findBase(id: string | number): GridRow | null {\n return this._baseRows.find((r) => this._rowId(r) === id) ?? null;\n }\n\n private _stageUpdate(id: string | number, original: GridRow, next: GridRow): void {\n this._dirty.set(id, { state: 'updated', original, current: { ...original, ...next } });\n }\n\n private _buildDelta(): TransactionDelta {\n const added: GridRow[] = [];\n const updated: GridRow[] = [];\n const removedIds: (string | number)[] = [];\n\n for (const [id, entry] of this._dirty) {\n if (entry.state === 'added') added.push(entry.current);\n else if (entry.state === 'updated') updated.push(entry.current);\n else if (entry.state === 'removed') removedIds.push(id);\n }\n\n return { added, updated, removedIds };\n }\n}\n","/**\n * TransactionController — a reactive (signals) wrapper around `TransactionEngine`\n * for the open-source `<gd-data-grid>`. Bind `displayRows()` to `[rowData]` and\n * pipe `(cellValueChanged)` into `onCellValueChanged` to stage inline edits\n * without mutating the base data; then `commit()` / `rollback()`:\n *\n * ```html\n * <gd-data-grid [rowData]=\"txn.displayRows()\" [columnDefs]=\"cols\" [getRowId]=\"byId\"\n * (cellValueChanged)=\"txn.onCellValueChanged($event)\" />\n * <button [disabled]=\"!txn.isDirty()\" (click)=\"txn.commit()\">Save</button>\n * ```\n *\n * `displayRows()` returns shallow clones, so the grid's in-place cell edits\n * change the copy while the base stays clean (rollback restores it). Use a\n * field-based `getRowId` so row identity survives cloning.\n */\nimport { computed, signal, type Signal } from '@angular/core';\nimport { TransactionEngine, type TransactionDelta } from './transactions';\nimport type { GridRow } from './row';\n\nexport interface TransactionControllerOptions {\n /** Field used as the unique row ID. Default: 'id' */\n rowIdField?: string;\n onCommit?: (delta: TransactionDelta) => void;\n onRollback?: () => void;\n}\n\n/** Minimal shape of the grid's cellValueChanged event this controller needs. */\nexport interface CellValueChange<TData> {\n row: TData;\n field?: string;\n newValue: unknown;\n}\n\nexport class TransactionController<TData extends GridRow = GridRow> {\n private readonly _engine: TransactionEngine;\n private readonly _rowIdField: string;\n private readonly _version = signal(0);\n\n /** The current merged rows (base + staged changes) as shallow clones. */\n readonly displayRows: Signal<TData[]>;\n /** Whether there are uncommitted staged changes. */\n readonly isDirty: Signal<boolean>;\n\n constructor(initialRows: TData[], options: TransactionControllerOptions = {}) {\n this._rowIdField = options.rowIdField ?? 'id';\n this._engine = new TransactionEngine({\n initialRows,\n rowIdField: this._rowIdField,\n onTransactionCommit: options.onCommit,\n onTransactionRollback: options.onRollback,\n });\n this.displayRows = computed(() => {\n this._version();\n return this._engine.getDisplayRows().map((r) => ({ ...r }) as TData);\n });\n this.isDirty = computed(() => {\n this._version();\n return this._engine.isDirty();\n });\n }\n\n /** Stage an inline edit emitted by the grid's `(cellValueChanged)`. */\n onCellValueChanged(event: CellValueChange<TData>): void {\n if (!event.field) return;\n const id = event.row[this._rowIdField];\n this._engine.updateRows([{ [this._rowIdField]: id, [event.field]: event.newValue }]);\n this._bump();\n }\n\n addRows(rows: TData[]): void {\n this._engine.addRows(rows);\n this._bump();\n }\n\n updateRows(rows: TData[]): void {\n this._engine.updateRows(rows);\n this._bump();\n }\n\n removeRows(ids: (string | number)[]): void {\n this._engine.removeRows(ids);\n this._bump();\n }\n\n /** All current staged changes, grouped by kind. */\n getDirtyRows(): { added: GridRow[]; updated: GridRow[]; removed: GridRow[] } {\n return this._engine.getDirtyRows();\n }\n\n commit(): void {\n this._engine.commitTransaction();\n this._bump();\n }\n\n rollback(): void {\n this._engine.rollbackTransaction();\n this._bump();\n }\n\n /** Replace the base rows (e.g. after a server refresh); staged changes are kept. */\n resetRows(rows: TData[]): void {\n this._engine.resetRows(rows);\n this._bump();\n }\n\n private _bump(): void {\n this._version.update((v) => v + 1);\n }\n}\n","/**\n * MasterDetailEngine — manages expand/collapse state and lazy-loaded, cached\n * detail data for master rows. Pure logic. Detail data is fetched once per row\n * ID on first expand; subsequent expands reuse the cache.\n */\nimport type { GridRow } from './row';\n\nexport type DetailLoadState = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport interface DetailEntry {\n state: DetailLoadState;\n data: GridRow[];\n error?: Error;\n}\n\nexport interface MasterDetailEngineOptions {\n /** Loads detail rows for a master row; called at most once per row ID. */\n getDetailRowData: (masterRow: GridRow) => Promise<GridRow[]>;\n /** Called when a row's expanded state changes. */\n onExpand?: (masterRow: GridRow, expanded: boolean) => void;\n /** Field used as the row ID. Default: 'id' */\n rowIdField?: string;\n}\n\nexport class MasterDetailEngine {\n private readonly _getDetailRowData: (masterRow: GridRow) => Promise<GridRow[]>;\n private readonly _onExpand?: (masterRow: GridRow, expanded: boolean) => void;\n private readonly _rowIdField: string;\n\n private readonly _expanded = new Set<string | number>();\n private readonly _cache = new Map<string | number, DetailEntry>();\n private _onChange?: () => void;\n\n constructor(options: MasterDetailEngineOptions) {\n this._getDetailRowData = options.getDetailRowData;\n this._onExpand = options.onExpand;\n this._rowIdField = options.rowIdField ?? 'id';\n }\n\n /** Subscribe to state changes. Returns an unsubscribe function. */\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n isExpanded(rowId: string | number): boolean {\n return this._expanded.has(rowId);\n }\n\n getLoadState(rowId: string | number): DetailLoadState {\n return this._cache.get(rowId)?.state ?? 'idle';\n }\n\n /** Cached detail rows, or an empty array if not yet loaded. */\n getDetailData(rowId: string | number): GridRow[] {\n return this._cache.get(rowId)?.data ?? [];\n }\n\n /** Expand a master row, triggering a load if not already cached. */\n expand(masterRow: GridRow): void {\n const id = this._rowId(masterRow);\n if (this._expanded.has(id)) return;\n this._expanded.add(id);\n this._onExpand?.(masterRow, true);\n this._notify();\n this._ensureLoaded(masterRow, id);\n }\n\n /** Collapse a master row; cached data is retained for re-expansion. */\n collapse(masterRow: GridRow): void {\n const id = this._rowId(masterRow);\n if (!this._expanded.has(id)) return;\n this._expanded.delete(id);\n this._onExpand?.(masterRow, false);\n this._notify();\n }\n\n toggle(masterRow: GridRow): void {\n if (this.isExpanded(this._rowId(masterRow))) {\n this.collapse(masterRow);\n } else {\n this.expand(masterRow);\n }\n }\n\n /** Pre-fetch detail data without expanding (e.g. hover prefetch). */\n prefetch(masterRow: GridRow): void {\n this._ensureLoaded(masterRow, this._rowId(masterRow));\n }\n\n /** Invalidate one row's cache, or the entire cache when rowId is omitted. */\n invalidateCache(rowId?: string | number): void {\n if (rowId !== undefined) {\n this._cache.delete(rowId);\n } else {\n this._cache.clear();\n }\n this._notify();\n }\n\n /** Collapse all expanded rows. Cache is preserved. */\n collapseAll(): void {\n this._expanded.clear();\n this._notify();\n }\n\n /** A read-only snapshot of currently expanded row IDs. */\n getExpandedIds(): ReadonlySet<string | number> {\n return this._expanded;\n }\n\n private _rowId(row: GridRow): string | number {\n const id = row[this._rowIdField];\n if (id === undefined || id === null) {\n throw new Error(\n `MasterDetailEngine: row has no '${this._rowIdField}' field. Set rowIdField to the correct field name.`,\n );\n }\n return id as string | number;\n }\n\n private _ensureLoaded(masterRow: GridRow, id: string | number): void {\n const existing = this._cache.get(id);\n if (existing && (existing.state === 'loading' || existing.state === 'loaded')) return;\n\n this._cache.set(id, { state: 'loading', data: [] });\n this._notify();\n\n this._getDetailRowData(masterRow)\n .then((data) => {\n this._cache.set(id, { state: 'loaded', data });\n this._notify();\n })\n .catch((error: Error) => {\n this._cache.set(id, { state: 'error', data: [], error });\n this._notify();\n });\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * CellPermissionEngine — enforces per-cell read/edit permissions from a\n * caller-supplied policy. Unreadable cells are masked ('●●●') everywhere\n * (display, export, clipboard); non-editable cells can't be edited regardless\n * of the column's `editable`. Results are cached per (rowId, field). Pure logic.\n */\nimport type { GridRow } from './row';\n\nexport interface CellPermission {\n canRead: boolean;\n canEdit: boolean;\n}\n\n/** Default mask string used for unreadable cells. */\nexport const DEFAULT_MASK = '●●●';\n\nexport interface CellPermissionEngineOptions {\n /** Policy returning permissions for a cell; called once per (rowId, field). */\n policy: (row: GridRow, field: string) => CellPermission;\n /** Field used as the unique row ID. Default: 'id' */\n rowIdField?: string;\n /** String shown in place of unreadable cell values. Default: '●●●' */\n maskValue?: string;\n}\n\nexport class CellPermissionEngine {\n private readonly _policy: (row: GridRow, field: string) => CellPermission;\n private readonly _rowIdField: string;\n private readonly _maskValue: string;\n\n private readonly _cache = new Map<string, CellPermission>();\n\n constructor(options: CellPermissionEngineOptions) {\n this._policy = options.policy;\n this._rowIdField = options.rowIdField ?? 'id';\n this._maskValue = options.maskValue ?? DEFAULT_MASK;\n }\n\n /** The resolved permission for a cell (cached). */\n getPermission(row: GridRow, field: string): CellPermission {\n const key = this._key(row, field);\n let perm = this._cache.get(key);\n if (!perm) {\n perm = this._policy(row, field);\n this._cache.set(key, perm);\n }\n return perm;\n }\n\n canRead(row: GridRow, field: string): boolean {\n return this.getPermission(row, field).canRead;\n }\n\n canEdit(row: GridRow, field: string): boolean {\n const perm = this.getPermission(row, field);\n return perm.canRead && perm.canEdit; // an unreadable cell can never be edited\n }\n\n /** The display value for a cell, masked when not readable. */\n getDisplayValue(row: GridRow, field: string): unknown {\n return this.canRead(row, field) ? row[field] : this._maskValue;\n }\n\n /** The value for copy/export; unreadable cells return '' so data never leaks. */\n getExportValue(row: GridRow, field: string): unknown {\n return this.canRead(row, field) ? row[field] : '';\n }\n\n /** True if the given value is the mask placeholder. */\n isMasked(value: unknown): boolean {\n return value === this._maskValue;\n }\n\n get maskValue(): string {\n return this._maskValue;\n }\n\n /** Clear one row's cached permissions, or the whole cache when omitted. */\n clearCache(rowId?: string | number): void {\n if (rowId === undefined) {\n this._cache.clear();\n return;\n }\n const prefix = `${rowId}\\u0000`;\n for (const key of this._cache.keys()) {\n if (key.startsWith(prefix)) {\n this._cache.delete(key);\n }\n }\n }\n\n private _key(row: GridRow, field: string): string {\n const id = row[this._rowIdField];\n if (id === undefined || id === null) {\n throw new Error(\n `CellPermissionEngine: row has no '${this._rowIdField}' field. Set rowIdField to match your data.`,\n );\n }\n return `${id as string | number}\\u0000${field}`;\n }\n}\n","/**\n * AuditTrailEngine — records an immutable log of every cell edit (who/what/when\n * + prev/next values) in a bounded in-memory ring buffer, emitting each entry\n * via `onEntry` for persistence. Pure logic.\n */\n\nexport interface AuditEntry {\n timestamp: number;\n userId: string | undefined;\n rowId: string | number;\n field: string;\n prevValue: unknown;\n nextValue: unknown;\n}\n\nexport interface AuditTrailEngineOptions {\n /** User identifier stamped on every entry. */\n userId?: string;\n /** Called for every new entry — persist to a server here. */\n onEntry?: (entry: AuditEntry) => void;\n /** Maximum entries retained in memory (oldest evicted first). Default: 1000 */\n maxEntries?: number;\n /** Injectable clock for testing. Defaults to Date.now. */\n now?: () => number;\n}\n\nexport class AuditTrailEngine {\n private readonly _userId?: string;\n private readonly _onEntry?: (entry: AuditEntry) => void;\n private readonly _maxEntries: number;\n private readonly _now: () => number;\n\n private _entries: AuditEntry[] = [];\n private _onChange?: () => void;\n\n constructor(options: AuditTrailEngineOptions = {}) {\n this._userId = options.userId;\n this._onEntry = options.onEntry;\n this._maxEntries = options.maxEntries ?? 1000;\n this._now = options.now ?? Date.now;\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n /** Record a cell edit; no-op edits (prev === next) return null. */\n record(\n rowId: string | number,\n field: string,\n prevValue: unknown,\n nextValue: unknown,\n ): AuditEntry | null {\n if (Object.is(prevValue, nextValue)) return null;\n\n const entry: AuditEntry = {\n timestamp: this._now(),\n userId: this._userId,\n rowId,\n field,\n prevValue,\n nextValue,\n };\n\n this._entries.push(entry);\n if (this._entries.length > this._maxEntries) {\n this._entries.shift();\n }\n\n this._onEntry?.(entry);\n this._notify();\n return entry;\n }\n\n /** All entries, oldest first (read-only snapshot). */\n getEntries(): readonly AuditEntry[] {\n return this._entries;\n }\n\n /** Entries for a specific row, oldest first. */\n getEntriesForRow(rowId: string | number): AuditEntry[] {\n return this._entries.filter((e) => e.rowId === rowId);\n }\n\n /** Entries for a specific cell (row + field), oldest first. */\n getEntriesForCell(rowId: string | number, field: string): AuditEntry[] {\n return this._entries.filter((e) => e.rowId === rowId && e.field === field);\n }\n\n get size(): number {\n return this._entries.length;\n }\n\n /** Discard all entries. */\n clear(): void {\n this._entries = [];\n this._notify();\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * RowLockEngine — tracks which rows are locked (by other users) so the grid can\n * show a lock indicator and block edits. Supports an async source of locks\n * (e.g. polled from a collaboration server) plus optimistic local lock/unlock.\n * Pure logic.\n */\nimport type { GridRow } from './row';\n\nexport interface LockedRow {\n rowId: string | number;\n lockedByUserId: string;\n lockedByDisplayName?: string;\n lockedAt: number;\n}\n\nexport interface RowLockEngineOptions {\n /** The current user's ID. Locks held by this user do not block editing. */\n currentUserId?: string;\n /** Async source of currently locked rows (server state). */\n getLockedRows?: () => Promise<LockedRow[]>;\n /** Called when the current user attempts to edit a row locked by someone else. */\n onLockConflict?: (row: GridRow, lockedBy: string) => void;\n /** Field used as the unique row ID. Default: 'id' */\n rowIdField?: string;\n /** Injectable clock for testing. Defaults to Date.now. */\n now?: () => number;\n}\n\nexport class RowLockEngine {\n private readonly _currentUserId?: string;\n private readonly _getLockedRows?: () => Promise<LockedRow[]>;\n private readonly _onLockConflict?: (row: GridRow, lockedBy: string) => void;\n private readonly _rowIdField: string;\n private readonly _now: () => number;\n\n private _locks = new Map<string | number, LockedRow>();\n private _onChange?: () => void;\n\n constructor(options: RowLockEngineOptions = {}) {\n this._currentUserId = options.currentUserId;\n this._getLockedRows = options.getLockedRows;\n this._onLockConflict = options.onLockConflict;\n this._rowIdField = options.rowIdField ?? 'id';\n this._now = options.now ?? Date.now;\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n /** Load locks from the async source and replace local state. */\n async refresh(): Promise<void> {\n if (!this._getLockedRows) return;\n const locks = await this._getLockedRows();\n this._locks = new Map(locks.map((l) => [l.rowId, l] as [string | number, LockedRow]));\n this._notify();\n }\n\n /** Optimistically lock a row for a user. */\n lockRow(rowId: string | number, userId: string, displayName?: string): void {\n this._locks.set(rowId, {\n rowId,\n lockedByUserId: userId,\n lockedByDisplayName: displayName,\n lockedAt: this._now(),\n });\n this._notify();\n }\n\n /** Remove a lock. */\n unlockRow(rowId: string | number): void {\n if (this._locks.delete(rowId)) this._notify();\n }\n\n /** Remove all locks. */\n clear(): void {\n if (this._locks.size === 0) return;\n this._locks.clear();\n this._notify();\n }\n\n /** The lock for a row, or undefined if unlocked. */\n getLock(rowId: string | number): LockedRow | undefined {\n return this._locks.get(rowId);\n }\n\n /** True if the row is locked by anyone. */\n isLocked(rowId: string | number): boolean {\n return this._locks.has(rowId);\n }\n\n /** True if the row is locked by someone OTHER than the current user. */\n isLockedByOther(rowId: string | number): boolean {\n const lock = this._locks.get(rowId);\n if (!lock) return false;\n return lock.lockedByUserId !== this._currentUserId;\n }\n\n /** All current locks. */\n getLocks(): LockedRow[] {\n return Array.from(this._locks.values());\n }\n\n get size(): number {\n return this._locks.size;\n }\n\n /**\n * Whether the row may be edited by the current user. If it's locked by\n * another user, fires `onLockConflict` and returns false.\n */\n canEditRow(row: GridRow): boolean {\n const rowId = this._rowId(row);\n const lock = this._locks.get(rowId);\n if (!lock) return true;\n if (lock.lockedByUserId === this._currentUserId) return true;\n this._onLockConflict?.(row, lock.lockedByDisplayName ?? lock.lockedByUserId);\n return false;\n }\n\n private _rowId(row: GridRow): string | number {\n const id = row[this._rowIdField];\n if (id === undefined || id === null) {\n throw new Error(\n `RowLockEngine: row has no '${this._rowIdField}' field. Set rowIdField to match your data.`,\n );\n }\n return id as string | number;\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * Advanced filter builder — a nestable AND/OR/NOT tree of conditions with a\n * pure evaluator, URL-safe serialize/deserialize for shareable filter links,\n * and a named-preset store. No React, no DOM.\n */\nimport type { GridRow } from './row';\n\nexport type FilterOperator =\n | 'equals'\n | 'notEquals'\n | 'contains'\n | 'notContains'\n | 'startsWith'\n | 'endsWith'\n | 'greaterThan'\n | 'greaterThanOrEqual'\n | 'lessThan'\n | 'lessThanOrEqual'\n | 'isEmpty'\n | 'isNotEmpty';\n\n/** A single leaf filter condition. */\nexport interface FilterCondition {\n kind: 'condition';\n field: string;\n operator: FilterOperator;\n value?: unknown;\n}\n\n/** A nestable group of conditions/groups combined with AND or OR. */\nexport interface FilterGroup {\n kind: 'group';\n combinator: 'and' | 'or';\n /** Negates the entire group's result. */\n not?: boolean;\n children: FilterNode[];\n}\n\nexport type FilterNode = FilterCondition | FilterGroup;\n\n/** A named, persistable filter preset. */\nexport interface FilterPreset {\n id: string;\n name: string;\n filter: FilterNode;\n isShared?: boolean;\n}\n\nexport interface FilterPresetEngineOptions {\n /** Presets to seed the store with. */\n presets?: FilterPreset[];\n /** Called when a preset is saved. */\n onSave?: (preset: FilterPreset) => void | Promise<void>;\n /** ID generator (injectable for tests). */\n generateId?: () => string;\n}\n\nfunction toComparable(value: unknown): number | string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'number') return value;\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (value instanceof Date) return value.getTime();\n return String(value);\n}\n\nfunction evaluateCondition(cond: FilterCondition, row: GridRow): boolean {\n const raw = row[cond.field];\n const op = cond.operator;\n\n const isEmpty = raw === null || raw === undefined || raw === '';\n if (op === 'isEmpty') return isEmpty;\n if (op === 'isNotEmpty') return !isEmpty;\n\n const target = cond.value;\n\n switch (op) {\n case 'equals':\n return toComparable(raw) === toComparable(target);\n case 'notEquals':\n return toComparable(raw) !== toComparable(target);\n case 'contains':\n return String(raw ?? '')\n .toLowerCase()\n .includes(String(target ?? '').toLowerCase());\n case 'notContains':\n return !String(raw ?? '')\n .toLowerCase()\n .includes(String(target ?? '').toLowerCase());\n case 'startsWith':\n return String(raw ?? '')\n .toLowerCase()\n .startsWith(String(target ?? '').toLowerCase());\n case 'endsWith':\n return String(raw ?? '')\n .toLowerCase()\n .endsWith(String(target ?? '').toLowerCase());\n case 'greaterThan':\n case 'greaterThanOrEqual':\n case 'lessThan':\n case 'lessThanOrEqual': {\n const a = toComparable(raw);\n const b = toComparable(target);\n if (a === null || b === null || typeof a !== typeof b) return false;\n if (op === 'greaterThan') return a > b;\n if (op === 'greaterThanOrEqual') return a >= b;\n if (op === 'lessThan') return a < b;\n return a <= b;\n }\n default:\n return false;\n }\n}\n\n/** Evaluate a filter node against a row. */\nexport function evaluateFilter(node: FilterNode, row: GridRow): boolean {\n if (node.kind === 'condition') {\n return evaluateCondition(node, row);\n }\n const group = node;\n let result: boolean;\n if (group.children.length === 0) {\n result = true; // an empty group matches everything\n } else if (group.combinator === 'and') {\n result = group.children.every((child) => evaluateFilter(child, row));\n } else {\n result = group.children.some((child) => evaluateFilter(child, row));\n }\n return group.not ? !result : result;\n}\n\nfunction toUrlSafe(b64: string): string {\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\nfunction fromUrlSafe(s: string): string {\n const b64 = s.replace(/-/g, '+').replace(/_/g, '/');\n const pad = b64.length % 4 === 0 ? '' : '='.repeat(4 - (b64.length % 4));\n return b64 + pad;\n}\n\n/** Serialize a filter tree to a URL-safe string. */\nexport function serializeFilter(node: FilterNode): string {\n return toUrlSafe(btoa(JSON.stringify(node)));\n}\n\n/** Deserialize a URL-safe string back into a filter tree. Throws if invalid. */\nexport function deserializeFilter(encoded: string): FilterNode {\n const parsed = JSON.parse(atob(fromUrlSafe(encoded))) as FilterNode;\n if (!parsed || (parsed.kind !== 'condition' && parsed.kind !== 'group')) {\n throw new Error('Invalid filter payload');\n }\n return parsed;\n}\n\nexport class FilterPresetEngine {\n private readonly _onSave?: (preset: FilterPreset) => void | Promise<void>;\n private readonly _generateId: () => string;\n private _presets: FilterPreset[];\n private _seq = 0;\n private _onChange?: () => void;\n\n constructor(options: FilterPresetEngineOptions = {}) {\n this._onSave = options.onSave;\n this._generateId = options.generateId ?? (() => `preset-${++this._seq}`);\n this._presets = [...(options.presets ?? [])];\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n getPresets(): readonly FilterPreset[] {\n return this._presets;\n }\n\n getPreset(id: string): FilterPreset | undefined {\n return this._presets.find((p) => p.id === id);\n }\n\n /** Save a new preset (or replace one with the same name). Returns it. */\n savePreset(name: string, filter: FilterNode, isShared = false): FilterPreset {\n const existing = this._presets.find((p) => p.name === name);\n const preset: FilterPreset = existing\n ? { ...existing, filter, isShared }\n : { id: this._generateId(), name, filter, isShared };\n\n if (existing) {\n this._presets = this._presets.map((p) => (p.id === existing.id ? preset : p));\n } else {\n this._presets = [...this._presets, preset];\n }\n this._onSave?.(preset);\n this._notify();\n return preset;\n }\n\n deletePreset(id: string): void {\n const next = this._presets.filter((p) => p.id !== id);\n if (next.length !== this._presets.length) {\n this._presets = next;\n this._notify();\n }\n }\n\n /** Filter an array of rows through a filter tree. */\n applyFilter(node: FilterNode, rows: GridRow[]): GridRow[] {\n return rows.filter((row) => evaluateFilter(node, row));\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * SavedViewsEngine — manages named grid views (column layout, sort, filter,\n * group, density, etc.) across personal + admin-shared tiers. Server sync is\n * delegated to async callbacks so the engine stays pure and Node-testable.\n */\n\nexport interface SavedView {\n id: string;\n name: string;\n isShared?: boolean;\n layout: Record<string, unknown>;\n}\n\nexport interface SavedViewsEngineOptions {\n /** Async loader for the user's saved views. */\n getSavedViews?: () => Promise<SavedView[]>;\n /** Persist a saved view. */\n onSaveView?: (view: SavedView) => Promise<void> | void;\n /** Delete a saved view. */\n onDeleteView?: (viewId: string) => Promise<void> | void;\n /** Notified when the active view changes. */\n onViewChange?: (view: SavedView | null) => void;\n /** Seed views (used when no async loader is supplied). */\n views?: SavedView[];\n /** ID generator (injectable for tests). */\n generateId?: () => string;\n}\n\nexport class SavedViewsEngine {\n private readonly _getSavedViews?: () => Promise<SavedView[]>;\n private readonly _onSaveView?: (view: SavedView) => Promise<void> | void;\n private readonly _onDeleteView?: (viewId: string) => Promise<void> | void;\n private readonly _onViewChange?: (view: SavedView | null) => void;\n private readonly _generateId: () => string;\n\n private _views: SavedView[];\n private _activeViewId: string | null = null;\n private _seq = 0;\n private _onChange?: () => void;\n\n constructor(options: SavedViewsEngineOptions = {}) {\n this._getSavedViews = options.getSavedViews;\n this._onSaveView = options.onSaveView;\n this._onDeleteView = options.onDeleteView;\n this._onViewChange = options.onViewChange;\n this._generateId = options.generateId ?? (() => `view-${++this._seq}`);\n this._views = [...(options.views ?? [])];\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n /** Load views from the async source, replacing local state. */\n async load(): Promise<void> {\n if (!this._getSavedViews) return;\n this._views = await this._getSavedViews();\n this._notify();\n }\n\n getViews(): readonly SavedView[] {\n return this._views;\n }\n\n getView(id: string): SavedView | undefined {\n return this._views.find((v) => v.id === id);\n }\n\n /** Personal (non-shared) views. */\n getPersonalViews(): SavedView[] {\n return this._views.filter((v) => !v.isShared);\n }\n\n /** Admin-shared views. */\n getSharedViews(): SavedView[] {\n return this._views.filter((v) => v.isShared);\n }\n\n getActiveView(): SavedView | null {\n if (this._activeViewId === null) return null;\n return this.getView(this._activeViewId) ?? null;\n }\n\n /** Create a new view or update an existing one by name. Returns the view. */\n async saveView(\n name: string,\n layout: Record<string, unknown>,\n options: { isShared?: boolean; id?: string } = {},\n ): Promise<SavedView> {\n const existing = options.id\n ? this._views.find((v) => v.id === options.id)\n : this._views.find((v) => v.name === name);\n\n const view: SavedView = existing\n ? { ...existing, name, layout, isShared: options.isShared ?? existing.isShared }\n : { id: this._generateId(), name, layout, isShared: options.isShared };\n\n if (existing) {\n this._views = this._views.map((v) => (v.id === existing.id ? view : v));\n } else {\n this._views = [...this._views, view];\n }\n\n await this._onSaveView?.(view);\n this._notify();\n return view;\n }\n\n /** Delete a view. If it was active, the active view is cleared. */\n async deleteView(id: string): Promise<void> {\n const next = this._views.filter((v) => v.id !== id);\n if (next.length === this._views.length) return;\n this._views = next;\n if (this._activeViewId === id) {\n this._activeViewId = null;\n this._onViewChange?.(null);\n }\n await this._onDeleteView?.(id);\n this._notify();\n }\n\n /** Activate a view (or clear with null). Fires onViewChange. */\n setActiveView(id: string | null): void {\n if (id !== null && !this.getView(id)) {\n throw new Error(`SavedViewsEngine: unknown view '${id}'`);\n }\n if (this._activeViewId === id) return;\n this._activeViewId = id;\n this._onViewChange?.(this.getActiveView());\n this._notify();\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * ExcelImportEngine — a dependency-free import pipeline that turns a tabular\n * matrix (header row + data rows) into validated grid rows. File parsing is\n * kept OUT of the engine: use `parseCSV()` for delimited text, or feed a\n * `string[][]` produced by SheetJS for .xlsx. Pipeline: loadMatrix → (auto)\n * mapping → validate → buildRows.\n */\nimport type { GridRow } from './row';\n\n/** Data type used to validate and coerce imported cell values. */\nexport type ImportColumnType = 'string' | 'number' | 'boolean' | 'date';\n\nexport interface ImportColumn {\n /** Target grid field the source column maps to. */\n field: string;\n /** Header text used for auto-matching against the source sheet. */\n headerName: string;\n /** Expected data type. Values are validated/coerced against it. Default: 'string' */\n type?: ImportColumnType;\n /** Whether a value is required (empty cells produce a validation error). */\n required?: boolean;\n}\n\n/** A single validation problem found during import. */\nexport interface ImportValidationError {\n /** Zero-based index into the source data rows (excludes the header row). */\n rowIndex: number;\n field: string;\n value: string;\n message: string;\n}\n\nexport interface ExcelImportEngineOptions {\n /** Target columns the importer can map onto. */\n columns: ImportColumn[];\n /** Explicit source-header → target-field mapping, overriding auto-match. */\n columnMapping?: Record<string, string>;\n}\n\nexport interface ImportPreview {\n rows: GridRow[];\n errors: ImportValidationError[];\n}\n\n/**\n * Parse delimited text into a matrix of string cells. Handles quoted fields\n * containing the delimiter, newlines, and escaped quotes (`\"\"`), plus `\\n` and\n * `\\r\\n` line endings.\n */\nexport function parseCSV(text: string, delimiter = ','): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = '';\n let inQuotes = false;\n let i = 0;\n\n const pushCell = () => {\n row.push(cell);\n cell = '';\n };\n const pushRow = () => {\n pushCell();\n rows.push(row);\n row = [];\n };\n\n while (i < text.length) {\n const ch = text[i];\n\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n cell += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i++;\n continue;\n }\n cell += ch;\n i++;\n continue;\n }\n\n if (ch === '\"') {\n inQuotes = true;\n i++;\n continue;\n }\n if (ch === delimiter) {\n pushCell();\n i++;\n continue;\n }\n if (ch === '\\r') {\n pushRow();\n if (text[i + 1] === '\\n') i++;\n i++;\n continue;\n }\n if (ch === '\\n') {\n pushRow();\n i++;\n continue;\n }\n cell += ch;\n i++;\n }\n\n if (cell.length > 0 || row.length > 0) {\n pushRow();\n }\n return rows;\n}\n\nfunction normalizeHeader(h: string): string {\n return h.trim().toLowerCase().replace(/[\\s_-]+/g, '');\n}\n\ninterface CoerceResult {\n ok: boolean;\n value: unknown;\n message?: string;\n}\n\nfunction coerce(raw: string, type: ImportColumnType): CoerceResult {\n const trimmed = raw.trim();\n switch (type) {\n case 'number': {\n if (trimmed === '') return { ok: true, value: null };\n const n = Number(trimmed.replace(/,/g, ''));\n if (Number.isNaN(n)) return { ok: false, value: raw, message: `\"${raw}\" is not a number` };\n return { ok: true, value: n };\n }\n case 'boolean': {\n const t = trimmed.toLowerCase();\n if (['true', '1', 'yes', 'y'].includes(t)) return { ok: true, value: true };\n if (['false', '0', 'no', 'n', ''].includes(t)) return { ok: true, value: false };\n return { ok: false, value: raw, message: `\"${raw}\" is not a boolean` };\n }\n case 'date': {\n if (trimmed === '') return { ok: true, value: null };\n const ts = Date.parse(trimmed);\n if (Number.isNaN(ts)) return { ok: false, value: raw, message: `\"${raw}\" is not a valid date` };\n return { ok: true, value: new Date(ts).toISOString() };\n }\n case 'string':\n default:\n return { ok: true, value: raw };\n }\n}\n\nexport class ExcelImportEngine {\n private readonly _columns: ImportColumn[];\n private _headers: string[] = [];\n private _dataRows: string[][] = [];\n\n /** sourceHeader → targetField (null = unmapped). */\n private _mapping = new Map<string, string | null>();\n\n constructor(options: ExcelImportEngineOptions) {\n this._columns = options.columns;\n if (options.columnMapping) {\n for (const [header, field] of Object.entries(options.columnMapping)) {\n this._mapping.set(header, field);\n }\n }\n }\n\n /**\n * Load a matrix of raw cells.\n * @param matrix Full sheet, including the header row when hasHeaderRow.\n * @param hasHeaderRow When true (default) the first row is treated as headers.\n */\n loadMatrix(matrix: string[][], hasHeaderRow = true): void {\n if (matrix.length === 0) {\n this._headers = [];\n this._dataRows = [];\n return;\n }\n if (hasHeaderRow) {\n this._headers = matrix[0].map((h) => String(h ?? ''));\n this._dataRows = matrix.slice(1);\n } else {\n this._headers = matrix[0].map((_, idx) => `Col${idx + 1}`);\n this._dataRows = matrix;\n }\n this._autoMap();\n }\n\n /** Parse delimited text and load it as the source matrix. */\n loadCSV(text: string, delimiter = ',', hasHeaderRow = true): void {\n this.loadMatrix(parseCSV(text, delimiter), hasHeaderRow);\n }\n\n private _autoMap(): void {\n const fieldByNorm = new Map<string, string>();\n for (const col of this._columns) {\n fieldByNorm.set(normalizeHeader(col.headerName), col.field);\n fieldByNorm.set(normalizeHeader(col.field), col.field);\n }\n for (const header of this._headers) {\n if (this._mapping.has(header)) continue; // respect explicit mapping\n const match = fieldByNorm.get(normalizeHeader(header));\n this._mapping.set(header, match ?? null);\n }\n }\n\n getHeaders(): readonly string[] {\n return this._headers;\n }\n\n /** Current source-header → target-field mapping. */\n getMapping(): Record<string, string | null> {\n const out: Record<string, string | null> = {};\n for (const header of this._headers) {\n out[header] = this._mapping.get(header) ?? null;\n }\n return out;\n }\n\n /** Manually map (or unmap with null) a source header to a target field. */\n setMapping(sourceHeader: string, field: string | null): void {\n this._mapping.set(sourceHeader, field);\n }\n\n /** Source headers not yet mapped to a target field. */\n getUnmappedHeaders(): string[] {\n return this._headers.filter((h) => !this._mapping.get(h));\n }\n\n /** Target fields that have no source column mapped to them. */\n getUnmappedFields(): string[] {\n const mapped = new Set(\n this._headers.map((h) => this._mapping.get(h)).filter((f): f is string => !!f),\n );\n return this._columns.map((c) => c.field).filter((f) => !mapped.has(f));\n }\n\n /** Validate all data rows against the mapped column types. */\n validate(): ImportValidationError[] {\n return this._process().errors;\n }\n\n /** Build validated rows (rows with errors are still returned, best-effort). */\n buildRows(): GridRow[] {\n return this._process().rows;\n }\n\n /** Full preview: rows plus any validation errors. */\n preview(): ImportPreview {\n return this._process();\n }\n\n private _process(): ImportPreview {\n const rows: GridRow[] = [];\n const errors: ImportValidationError[] = [];\n\n const fieldToSourceIndex = new Map<string, number>();\n this._headers.forEach((header, idx) => {\n const field = this._mapping.get(header);\n if (field) fieldToSourceIndex.set(field, idx);\n });\n\n this._dataRows.forEach((sourceRow, rowIndex) => {\n const row: GridRow = {};\n for (const col of this._columns) {\n const srcIdx = fieldToSourceIndex.get(col.field);\n const raw = srcIdx === undefined ? '' : String(sourceRow[srcIdx] ?? '');\n const type = col.type ?? 'string';\n\n if (col.required && raw.trim() === '') {\n errors.push({ rowIndex, field: col.field, value: raw, message: `${col.headerName} is required` });\n }\n\n const result = coerce(raw, type);\n if (!result.ok) {\n errors.push({ rowIndex, field: col.field, value: raw, message: result.message ?? `Invalid ${type}` });\n row[col.field] = raw; // keep raw for user correction\n } else {\n row[col.field] = result.value;\n }\n }\n rows.push(row);\n });\n\n return { rows, errors };\n }\n\n /** Number of data rows currently loaded (excludes the header row). */\n get rowCount(): number {\n return this._dataRows.length;\n }\n}\n","/**\n * PDFExportEngine — turns rows + columns + branding options into a paginated,\n * renderer-agnostic document model (`PdfDocumentModel`). A thin adapter can feed\n * that model to jsPDF, pdfmake, or an HTML-to-PDF pipeline without this engine\n * depending on any of them. It preserves the given row/column order, so callers\n * pass the already filtered/sorted view (\"export what the user sees\").\n */\nimport type { GridRow } from './row';\n\nexport interface PdfExportOptions {\n /** Report title rendered in the header. */\n title?: string;\n /** Logo image URL rendered in the header. */\n logo?: string;\n /** Footer text rendered on every page. */\n footer?: string;\n /** Page size. Default: 'A4' */\n pageSize?: 'A4' | 'Letter' | 'Legal';\n /** Page orientation. Default: 'landscape' */\n orientation?: 'portrait' | 'landscape';\n /** Rows per page. Default: 25 */\n rowsPerPage?: number;\n}\n\nexport interface PdfColumn {\n field: string;\n headerName: string;\n /** Optional formatter for the cell value. */\n format?: (value: unknown, row: GridRow) => string;\n}\n\nexport interface PdfPageHeader {\n title?: string;\n logo?: string;\n /** ISO timestamp the export was generated. */\n generatedAt: string;\n}\n\nexport interface PdfPageFooter {\n text?: string;\n pageNumber: number;\n pageCount: number;\n}\n\nexport interface PdfPage {\n header: PdfPageHeader;\n footer: PdfPageFooter;\n columnHeaders: string[];\n /** Already-formatted cell text for each row on this page. */\n rows: string[][];\n}\n\nexport interface PdfDocumentModel {\n pageSize: NonNullable<PdfExportOptions['pageSize']>;\n orientation: NonNullable<PdfExportOptions['orientation']>;\n pages: PdfPage[];\n}\n\nexport interface PDFExportEngineOptions extends PdfExportOptions {\n columns: PdfColumn[];\n /** Injectable clock for deterministic timestamps in tests. */\n now?: () => Date;\n}\n\nconst DEFAULTS = {\n pageSize: 'A4' as const,\n orientation: 'landscape' as const,\n rowsPerPage: 25,\n};\n\nexport class PDFExportEngine {\n private readonly _columns: PdfColumn[];\n private readonly _options: PdfExportOptions;\n private readonly _now: () => Date;\n\n constructor(options: PDFExportEngineOptions) {\n const { columns, now, ...pdfOptions } = options;\n this._columns = columns;\n this._options = pdfOptions;\n this._now = now ?? (() => new Date());\n }\n\n /** Build the paginated document model from the given (already-visible) rows. */\n build(rows: GridRow[]): PdfDocumentModel {\n const rowsPerPage = Math.max(1, this._options.rowsPerPage ?? DEFAULTS.rowsPerPage);\n const pageSize = this._options.pageSize ?? DEFAULTS.pageSize;\n const orientation = this._options.orientation ?? DEFAULTS.orientation;\n const generatedAt = this._now().toISOString();\n\n const columnHeaders = this._columns.map((c) => c.headerName);\n const pageCount = Math.max(1, Math.ceil(rows.length / rowsPerPage));\n const pages: PdfPage[] = [];\n\n for (let p = 0; p < pageCount; p++) {\n const slice = rows.slice(p * rowsPerPage, (p + 1) * rowsPerPage);\n pages.push({\n header: { title: this._options.title, logo: this._options.logo, generatedAt },\n footer: { text: this._options.footer, pageNumber: p + 1, pageCount },\n columnHeaders,\n rows: slice.map((row) => this._formatRow(row)),\n });\n }\n\n return { pageSize, orientation, pages };\n }\n\n private _formatRow(row: GridRow): string[] {\n return this._columns.map((col) => {\n const value = row[col.field];\n if (col.format) return col.format(value, row);\n return value === null || value === undefined ? '' : String(value);\n });\n }\n}\n","/**\n * FormEditorEngine — backs a slide-in form editor panel: tracks which row is\n * open, holds an editable draft with dirty-state detection, and supports\n * prev/next navigation across the row set. Save/delete delegate to async\n * callbacks. Pure logic.\n */\nimport type { GridRow } from './row';\n\nexport interface FormEditorEngineOptions {\n /** The rows the editor navigates over (current visible order). */\n rows: GridRow[];\n /** Field used as the unique row ID. Default: 'id' */\n rowIdField?: string;\n onSave?: (row: GridRow) => void | Promise<void>;\n onDelete?: (row: GridRow) => void | Promise<void>;\n}\n\nexport class FormEditorEngine {\n private _rows: GridRow[];\n private readonly _rowIdField: string;\n private readonly _onSave?: (row: GridRow) => void | Promise<void>;\n private readonly _onDelete?: (row: GridRow) => void | Promise<void>;\n\n private _index = -1; // -1 = panel closed\n private _draft: GridRow | null = null;\n private _onChange?: () => void;\n\n constructor(options: FormEditorEngineOptions) {\n this._rows = [...options.rows];\n this._rowIdField = options.rowIdField ?? 'id';\n this._onSave = options.onSave;\n this._onDelete = options.onDelete;\n }\n\n subscribe(listener: () => void): () => void {\n this._onChange = listener;\n return () => {\n if (this._onChange === listener) this._onChange = undefined;\n };\n }\n\n /** Replace the row set; keeps the panel on the same rowId if still present. */\n setRows(rows: GridRow[]): void {\n const currentId = this.isOpen ? this._rowId(this._rows[this._index]) : undefined;\n this._rows = [...rows];\n if (currentId !== undefined) {\n const idx = this._rows.findIndex((r) => this._rowId(r) === currentId);\n if (idx === -1) {\n this.close();\n return;\n }\n this._index = idx;\n this._draft = { ...this._rows[idx] };\n }\n this._notify();\n }\n\n get isOpen(): boolean {\n return this._index >= 0 && this._index < this._rows.length;\n }\n\n get index(): number {\n return this._index;\n }\n\n /** Open the panel on a row by its ID. */\n openById(rowId: string | number): void {\n const idx = this._rows.findIndex((r) => this._rowId(r) === rowId);\n if (idx === -1) throw new Error(`FormEditorEngine: no row with id '${rowId}'`);\n this._openAt(idx);\n }\n\n /** Open the panel on a row by index. */\n openAt(index: number): void {\n if (index < 0 || index >= this._rows.length) {\n throw new Error(`FormEditorEngine: index ${index} out of range`);\n }\n this._openAt(index);\n }\n\n close(): void {\n this._index = -1;\n this._draft = null;\n this._notify();\n }\n\n private _openAt(index: number): void {\n this._index = index;\n this._draft = { ...this._rows[index] };\n this._notify();\n }\n\n /** The current editable draft (a copy of the row plus unsaved edits). */\n getDraft(): GridRow | null {\n return this._draft ? { ...this._draft } : null;\n }\n\n /** The original (unedited) row currently open. */\n getOriginal(): GridRow | null {\n return this.isOpen ? this._rows[this._index] : null;\n }\n\n setFieldValue(field: string, value: unknown): void {\n if (!this._draft) throw new Error('FormEditorEngine: no row open');\n this._draft[field] = value;\n this._notify();\n }\n\n /** True when the draft differs from the original row. */\n get isDirty(): boolean {\n if (!this._draft || !this.isOpen) return false;\n const original = this._rows[this._index];\n const keys = new Set([...Object.keys(original), ...Object.keys(this._draft)]);\n for (const key of keys) {\n if (!Object.is(original[key], this._draft[key])) return true;\n }\n return false;\n }\n\n /** Revert unsaved edits. */\n revert(): void {\n if (!this.isOpen) return;\n this._draft = { ...this._rows[this._index] };\n this._notify();\n }\n\n get canGoPrev(): boolean {\n return this._index > 0;\n }\n get canGoNext(): boolean {\n return this._index >= 0 && this._index < this._rows.length - 1;\n }\n\n next(): void {\n if (this.canGoNext) this._openAt(this._index + 1);\n }\n prev(): void {\n if (this.canGoPrev) this._openAt(this._index - 1);\n }\n\n /** Save the draft: commits it into the row set and calls onSave. */\n async save(): Promise<void> {\n if (!this._draft || !this.isOpen) throw new Error('FormEditorEngine: no row open');\n const saved = { ...this._draft };\n this._rows[this._index] = saved;\n await this._onSave?.(saved);\n this._notify();\n }\n\n /** Delete the open row: removes it and keeps the panel on the next row. */\n async delete(): Promise<void> {\n if (!this.isOpen) throw new Error('FormEditorEngine: no row open');\n const row = this._rows[this._index];\n this._rows = this._rows.filter((_, i) => i !== this._index);\n await this._onDelete?.(row);\n if (this._rows.length === 0) {\n this.close();\n } else {\n this._openAt(Math.min(this._index, this._rows.length - 1));\n }\n }\n\n private _rowId(row: GridRow): string | number {\n const id = row[this._rowIdField];\n if (id === undefined || id === null) {\n throw new Error(`FormEditorEngine: row has no '${this._rowIdField}' field.`);\n }\n return id as string | number;\n }\n\n private _notify(): void {\n this._onChange?.();\n }\n}\n","/**\n * Grid integration bridges — connect the framework-agnostic Pro engines to the\n * open-source `<gd-data-grid>`'s `ColDef` contract, without any DOM coupling.\n * Consumers feed the transformed column defs straight into `[columnDefs]`.\n */\nimport type { ColDef } from '@gridengine/angular-datagrid';\nimport type { GridRow } from './row';\nimport type { CellPermissionEngine } from './permissions';\nimport type { PdfColumn } from './pdf-export';\n\n/**\n * Return a copy of `columnDefs` whose cells honour a `CellPermissionEngine`:\n * unreadable cells resolve to the engine's mask value (so they never reach\n * renderers, sorting, filtering, or export), and non-editable cells become\n * non-editable regardless of the column's own `editable`. Columns without a\n * `field` (e.g. a checkbox-selection column) pass through unchanged.\n */\nexport function applyCellPermissions<TData>(\n columnDefs: ColDef<TData>[],\n engine: CellPermissionEngine,\n): ColDef<TData>[] {\n return columnDefs.map((col) => {\n const field = col.field;\n if (!field) return col;\n\n const originalGetter = col.valueGetter;\n const originalEditable = col.editable;\n\n return {\n ...col,\n valueGetter: (data: TData) => {\n const row = data as GridRow;\n if (!engine.canRead(row, field)) return engine.maskValue;\n return originalGetter ? originalGetter(data) : row[field];\n },\n editable: (row: TData) => {\n if (!engine.canEdit(row as GridRow, field)) return false;\n return typeof originalEditable === 'function'\n ? originalEditable(row)\n : (originalEditable ?? false);\n },\n };\n });\n}\n\n/**\n * Convert open-source grid column defs into `PdfColumn`s for `PDFExportEngine`,\n * carrying each column's `headerName` and `valueFormatter`. Hidden columns and\n * columns without a `field` are omitted.\n */\nexport function toPdfColumns<TData>(columnDefs: ColDef<TData>[]): PdfColumn[] {\n const out: PdfColumn[] = [];\n for (const col of columnDefs) {\n if (!col.field || col.hide) continue;\n const field = col.field;\n const fmt = col.valueFormatter;\n out.push({\n field,\n headerName: col.headerName ?? field,\n format: fmt ? (value) => fmt(value) : undefined,\n });\n }\n return out;\n}\n","/**\n * RangeSelectionDirective — Excel-like rectangular cell selection + copy for the\n * open-source `<gd-data-grid>`. Attach it to an element wrapping the grid:\n *\n * ```html\n * <div gdRangeSelection (rangeCopy)=\"onCopy($event)\">\n * <gd-data-grid [rowData]=\"rows\" [columnDefs]=\"cols\" />\n * </div>\n * ```\n *\n * Drag across cells to select a block, then Ctrl/Cmd+C to copy it as TSV\n * (paste-ready into Excel / Sheets). Ctrl/Cmd+V emits `(rangePaste)` with the\n * parsed matrix and Delete/Backspace emits `(rangeClear)` — the consumer writes\n * those back into its own data (one-way binding, like the grid's other events).\n * Cell coordinates come from the grid's ARIA attributes (`role=\"gridcell\"` +\n * `aria-colindex`, and the row's `aria-rowindex`), so no base-grid changes are\n * needed. Selection state is driven by the Pro `RangeSelectionEngine`.\n */\nimport { DOCUMENT } from '@angular/common';\nimport { Directive, ElementRef, HostListener, OnDestroy, inject, output } from '@angular/core';\nimport { RangeSelectionEngine } from './range-selection';\nimport { parseTSV } from './clipboard';\nimport type { CellRange } from './cell-range';\n\ninterface CellPos {\n row: number;\n col: number;\n}\n\n/** Payload emitted on paste: the parsed matrix anchored at the selection top-left. */\nexport interface RangePasteEvent {\n startRow: number;\n startCol: number;\n data: string[][];\n}\n\nconst STYLE_ID = 'gd-range-selection-styles';\nconst SELECTED_CLASS = 'gd-range-selected';\nconst NON_DATA_ROW = ['gd-row--header', 'gd-row--filter', 'gd-row--group', 'gd-row--detail'];\n\n@Directive({\n selector: '[gdRangeSelection]',\n standalone: true,\n})\nexport class RangeSelectionDirective implements OnDestroy {\n /** Emits the copied cell matrix (rows × cols of displayed text) on Ctrl/Cmd+C. */\n readonly rangeCopy = output<string[][]>();\n /** Emits the parsed clipboard matrix on Ctrl/Cmd+V for the consumer to write back. */\n readonly rangePaste = output<RangePasteEvent>();\n /** Emits the selected range on Delete/Backspace for the consumer to clear. */\n readonly rangeClear = output<CellRange>();\n\n private readonly _host = inject(ElementRef) as ElementRef<HTMLElement>;\n private readonly _doc = inject(DOCUMENT);\n private readonly _engine = new RangeSelectionEngine({ onChange: () => this._paint() });\n private _dragging = false;\n private readonly _onMouseUp = () => {\n this._dragging = false;\n };\n\n constructor() {\n this._ensureStyles();\n this._doc.addEventListener('mouseup', this._onMouseUp);\n }\n\n ngOnDestroy(): void {\n this._doc.removeEventListener('mouseup', this._onMouseUp);\n }\n\n @HostListener('mousedown', ['$event'])\n onMouseDown(event: MouseEvent): void {\n const pos = this._cellPos(event.target);\n if (!pos) return;\n this._dragging = true;\n this._engine.startSelection(pos.row, pos.col);\n }\n\n @HostListener('mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this._dragging) return;\n const pos = this._cellPos(event.target);\n if (pos) this._engine.extendSelection(pos.row, pos.col);\n }\n\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n const mod = event.ctrlKey || event.metaKey;\n if (mod && (event.key === 'c' || event.key === 'C')) {\n if (this._engine.getSelection()) event.preventDefault();\n this._copy();\n } else if (mod && (event.key === 'v' || event.key === 'V')) {\n this._paste();\n } else if (event.key === 'Delete' || event.key === 'Backspace') {\n this._clear(event);\n }\n }\n\n /** The current selection engine (for advanced consumers / testing). */\n get engine(): RangeSelectionEngine {\n return this._engine;\n }\n\n private _cellPos(target: EventTarget | null): CellPos | null {\n const el = target as HTMLElement | null;\n const cell = el?.closest?.('.gd-cell[role=\"gridcell\"]');\n if (!cell || !this._host.nativeElement.contains(cell)) return null;\n return this._cellPosFromCell(cell);\n }\n\n private _cellPosFromCell(cell: Element): CellPos | null {\n const row = cell.closest('.gd-row');\n if (!row || NON_DATA_ROW.some((c) => row.classList.contains(c))) return null;\n const ariaRow = row.getAttribute('aria-rowindex');\n const ariaCol = cell.getAttribute('aria-colindex');\n if (ariaRow === null || ariaCol === null) return null;\n return { row: Number(ariaRow) - 2, col: Number(ariaCol) - 1 };\n }\n\n private _paint(): void {\n const cells = this._host.nativeElement.querySelectorAll('.gd-cell[role=\"gridcell\"]');\n cells.forEach((cell) => {\n const pos = this._cellPosFromCell(cell);\n cell.classList.toggle(SELECTED_CLASS, !!pos && this._engine.isCellSelected(pos.row, pos.col));\n });\n }\n\n private _copy(): void {\n const selection = this._engine.getSelection();\n if (!selection) return;\n\n const byPos = new Map<string, string>();\n this._host.nativeElement.querySelectorAll('.gd-cell[role=\"gridcell\"]').forEach((cell) => {\n const pos = this._cellPosFromCell(cell);\n if (pos) byPos.set(`${pos.row},${pos.col}`, (cell.textContent ?? '').trim());\n });\n\n const matrix: string[][] = [];\n for (let r = selection.startRowIndex; r <= selection.endRowIndex; r++) {\n const rowCells: string[] = [];\n for (let c = selection.startColIndex; c <= selection.endColIndex; c++) {\n rowCells.push(byPos.get(`${r},${c}`) ?? '');\n }\n matrix.push(rowCells);\n }\n\n const tsv = matrix.map((r) => r.join('\\t')).join('\\n');\n void navigator.clipboard?.writeText?.(tsv);\n this.rangeCopy.emit(matrix);\n }\n\n private _paste(): void {\n const read = navigator.clipboard?.readText?.();\n if (!read) return;\n void read.then((text) => {\n if (!text) return;\n const selection = this._engine.getSelection();\n this.rangePaste.emit({\n startRow: selection?.startRowIndex ?? 0,\n startCol: selection?.startColIndex ?? 0,\n data: parseTSV(text),\n });\n });\n }\n\n private _clear(event: KeyboardEvent): void {\n const selection = this._engine.getSelection();\n if (!selection) return;\n event.preventDefault();\n this.rangeClear.emit(selection);\n }\n\n private _ensureStyles(): void {\n if (this._doc.getElementById(STYLE_ID)) return;\n const style = this._doc.createElement('style');\n style.id = STYLE_ID;\n style.textContent = `.${SELECTED_CLASS}{background:rgba(59,130,246,0.18)!important;}`;\n this._doc.head.appendChild(style);\n }\n}\n","/*\n * Public API Surface of @gridengine/angular-datagrid-enterprise\n *\n * Re-exports the open-source base grid so consumers need a single import, then\n * adds the license-gated Pro surface on top.\n */\n\n// ── Base grid (full re-export) ──────────────────────────────────────────────\nexport * from '@gridengine/angular-datagrid';\n\n// ── Pro component ───────────────────────────────────────────────────────────\nexport { DataGridPro } from './lib/data-grid-pro';\nexport { GridLicenseWatermark } from './lib/license-watermark';\n\n// ── License ─────────────────────────────────────────────────────────────────\nexport { LicenseManager, TIER_FEATURES } from './lib/license-manager';\nexport type {\n LicensePayload,\n LicenseTier,\n SupportLevel,\n LicenseStatus,\n LicenseValidationResult,\n} from './lib/license-manager';\nexport { provideGridEngineLicense } from './lib/provide-license';\nexport { PRODUCT_ID, PURCHASE_URL } from './lib/keyring';\n\n// ── Spreadsheet feature engines (framework-agnostic, usable standalone) ──────\nexport type { CellRange } from './lib/features/cell-range';\nexport { RangeSelectionEngine } from './lib/features/range-selection';\nexport type { RangeSelectionEngineOptions } from './lib/features/range-selection';\nexport { ClipboardEngine, parseTSV } from './lib/features/clipboard';\nexport type { ClipboardEngineOptions } from './lib/features/clipboard';\nexport { FillHandleEngine, toNumber, toTimestamp } from './lib/features/fill-handle';\nexport type {\n FillDirection,\n FillCell,\n FillResult,\n FillHandleEngineOptions,\n} from './lib/features/fill-handle';\nexport { UndoRedoManager } from './lib/features/undo-redo';\nexport type {\n UndoRedoCommand,\n CellEditCommand,\n PasteCommand,\n FillCommand,\n DeleteCommand,\n UndoRedoManagerOptions,\n} from './lib/features/undo-redo';\nexport { FormulaEngine } from './lib/features/formula';\nexport type { FormulaEngineOptions } from './lib/features/formula';\n\n// ── Data-architecture engines (framework-agnostic) ──────────────────────────\nexport type { GridRow } from './lib/features/row';\nexport { SSRMEngine } from './lib/features/ssrm';\nexport type {\n SSRMEngineOptions,\n SSRMDataSource,\n SSRMGetRowsParams,\n SSRMGetRowsResult,\n Block,\n BlockState,\n} from './lib/features/ssrm';\nexport { TransactionEngine } from './lib/features/transactions';\nexport type { TransactionEngineOptions, TransactionDelta } from './lib/features/transactions';\nexport { TransactionController } from './lib/features/transaction-controller';\nexport type {\n TransactionControllerOptions,\n CellValueChange,\n} from './lib/features/transaction-controller';\nexport { MasterDetailEngine } from './lib/features/master-detail';\nexport type {\n MasterDetailEngineOptions,\n DetailEntry,\n DetailLoadState,\n} from './lib/features/master-detail';\n\n// ── Security & governance engines (framework-agnostic) ──────────────────────\nexport { CellPermissionEngine, DEFAULT_MASK } from './lib/features/permissions';\nexport type { CellPermission, CellPermissionEngineOptions } from './lib/features/permissions';\nexport { AuditTrailEngine } from './lib/features/audit-trail';\nexport type { AuditEntry, AuditTrailEngineOptions } from './lib/features/audit-trail';\nexport { RowLockEngine } from './lib/features/row-lock';\nexport type { LockedRow, RowLockEngineOptions } from './lib/features/row-lock';\n\n// ── Advanced filtering & saved views (framework-agnostic) ───────────────────\nexport {\n FilterPresetEngine,\n evaluateFilter,\n serializeFilter,\n deserializeFilter,\n} from './lib/features/filter';\nexport type {\n FilterOperator,\n FilterCondition,\n FilterGroup,\n FilterNode,\n FilterPreset,\n FilterPresetEngineOptions,\n} from './lib/features/filter';\nexport { SavedViewsEngine } from './lib/features/saved-views';\nexport type { SavedView, SavedViewsEngineOptions } from './lib/features/saved-views';\n\n// ── Import / export & form editor (framework-agnostic) ──────────────────────\nexport { ExcelImportEngine, parseCSV } from './lib/features/import';\nexport type {\n ExcelImportEngineOptions,\n ImportColumn,\n ImportColumnType,\n ImportValidationError,\n ImportPreview,\n} from './lib/features/import';\nexport { PDFExportEngine } from './lib/features/pdf-export';\nexport type {\n PDFExportEngineOptions,\n PdfExportOptions,\n PdfColumn,\n PdfPage,\n PdfPageHeader,\n PdfPageFooter,\n PdfDocumentModel,\n} from './lib/features/pdf-export';\nexport { FormEditorEngine } from './lib/features/form-editor';\nexport type { FormEditorEngineOptions } from './lib/features/form-editor';\n\n// ── Grid integration bridges (engine → OSS <gd-data-grid> ColDef) ───────────\nexport { applyCellPermissions, toPdfColumns } from './lib/features/grid-integration';\nexport { RangeSelectionDirective } from './lib/features/range-selection.directive';\nexport type { RangePasteEvent } from './lib/features/range-selection.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["coreResolveFeatures"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gridengine/angular-datagrid-enterprise",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"description": "Pro/Enterprise features for the GridEngine Angular data grid (license-gated).",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"publishConfig": {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"@angular/cdk": "^22.1.0",
|
|
15
15
|
"@angular/common": "^22.1.0",
|
|
16
16
|
"@angular/core": "^22.1.0",
|
|
17
|
-
"@gridengine/angular-datagrid": "^0.23.
|
|
17
|
+
"@gridengine/angular-datagrid": "^0.23.2",
|
|
18
18
|
"@gridengine/license-core": "^0.1.0"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|