@gridengine/angular-datagrid-enterprise 0.5.0 → 0.6.0
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.
|
@@ -1723,6 +1723,264 @@ class RowLockEngine {
|
|
|
1723
1723
|
}
|
|
1724
1724
|
}
|
|
1725
1725
|
|
|
1726
|
+
function toComparable(value) {
|
|
1727
|
+
if (value === null || value === undefined)
|
|
1728
|
+
return null;
|
|
1729
|
+
if (typeof value === 'number')
|
|
1730
|
+
return value;
|
|
1731
|
+
if (typeof value === 'boolean')
|
|
1732
|
+
return value ? 1 : 0;
|
|
1733
|
+
if (value instanceof Date)
|
|
1734
|
+
return value.getTime();
|
|
1735
|
+
return String(value);
|
|
1736
|
+
}
|
|
1737
|
+
function evaluateCondition(cond, row) {
|
|
1738
|
+
const raw = row[cond.field];
|
|
1739
|
+
const op = cond.operator;
|
|
1740
|
+
const isEmpty = raw === null || raw === undefined || raw === '';
|
|
1741
|
+
if (op === 'isEmpty')
|
|
1742
|
+
return isEmpty;
|
|
1743
|
+
if (op === 'isNotEmpty')
|
|
1744
|
+
return !isEmpty;
|
|
1745
|
+
const target = cond.value;
|
|
1746
|
+
switch (op) {
|
|
1747
|
+
case 'equals':
|
|
1748
|
+
return toComparable(raw) === toComparable(target);
|
|
1749
|
+
case 'notEquals':
|
|
1750
|
+
return toComparable(raw) !== toComparable(target);
|
|
1751
|
+
case 'contains':
|
|
1752
|
+
return String(raw ?? '')
|
|
1753
|
+
.toLowerCase()
|
|
1754
|
+
.includes(String(target ?? '').toLowerCase());
|
|
1755
|
+
case 'notContains':
|
|
1756
|
+
return !String(raw ?? '')
|
|
1757
|
+
.toLowerCase()
|
|
1758
|
+
.includes(String(target ?? '').toLowerCase());
|
|
1759
|
+
case 'startsWith':
|
|
1760
|
+
return String(raw ?? '')
|
|
1761
|
+
.toLowerCase()
|
|
1762
|
+
.startsWith(String(target ?? '').toLowerCase());
|
|
1763
|
+
case 'endsWith':
|
|
1764
|
+
return String(raw ?? '')
|
|
1765
|
+
.toLowerCase()
|
|
1766
|
+
.endsWith(String(target ?? '').toLowerCase());
|
|
1767
|
+
case 'greaterThan':
|
|
1768
|
+
case 'greaterThanOrEqual':
|
|
1769
|
+
case 'lessThan':
|
|
1770
|
+
case 'lessThanOrEqual': {
|
|
1771
|
+
const a = toComparable(raw);
|
|
1772
|
+
const b = toComparable(target);
|
|
1773
|
+
if (a === null || b === null || typeof a !== typeof b)
|
|
1774
|
+
return false;
|
|
1775
|
+
if (op === 'greaterThan')
|
|
1776
|
+
return a > b;
|
|
1777
|
+
if (op === 'greaterThanOrEqual')
|
|
1778
|
+
return a >= b;
|
|
1779
|
+
if (op === 'lessThan')
|
|
1780
|
+
return a < b;
|
|
1781
|
+
return a <= b;
|
|
1782
|
+
}
|
|
1783
|
+
default:
|
|
1784
|
+
return false;
|
|
1785
|
+
}
|
|
1786
|
+
}
|
|
1787
|
+
/** Evaluate a filter node against a row. */
|
|
1788
|
+
function evaluateFilter(node, row) {
|
|
1789
|
+
if (node.kind === 'condition') {
|
|
1790
|
+
return evaluateCondition(node, row);
|
|
1791
|
+
}
|
|
1792
|
+
const group = node;
|
|
1793
|
+
let result;
|
|
1794
|
+
if (group.children.length === 0) {
|
|
1795
|
+
result = true; // an empty group matches everything
|
|
1796
|
+
}
|
|
1797
|
+
else if (group.combinator === 'and') {
|
|
1798
|
+
result = group.children.every((child) => evaluateFilter(child, row));
|
|
1799
|
+
}
|
|
1800
|
+
else {
|
|
1801
|
+
result = group.children.some((child) => evaluateFilter(child, row));
|
|
1802
|
+
}
|
|
1803
|
+
return group.not ? !result : result;
|
|
1804
|
+
}
|
|
1805
|
+
function toUrlSafe(b64) {
|
|
1806
|
+
return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
1807
|
+
}
|
|
1808
|
+
function fromUrlSafe(s) {
|
|
1809
|
+
const b64 = s.replace(/-/g, '+').replace(/_/g, '/');
|
|
1810
|
+
const pad = b64.length % 4 === 0 ? '' : '='.repeat(4 - (b64.length % 4));
|
|
1811
|
+
return b64 + pad;
|
|
1812
|
+
}
|
|
1813
|
+
/** Serialize a filter tree to a URL-safe string. */
|
|
1814
|
+
function serializeFilter(node) {
|
|
1815
|
+
return toUrlSafe(btoa(JSON.stringify(node)));
|
|
1816
|
+
}
|
|
1817
|
+
/** Deserialize a URL-safe string back into a filter tree. Throws if invalid. */
|
|
1818
|
+
function deserializeFilter(encoded) {
|
|
1819
|
+
const parsed = JSON.parse(atob(fromUrlSafe(encoded)));
|
|
1820
|
+
if (!parsed || (parsed.kind !== 'condition' && parsed.kind !== 'group')) {
|
|
1821
|
+
throw new Error('Invalid filter payload');
|
|
1822
|
+
}
|
|
1823
|
+
return parsed;
|
|
1824
|
+
}
|
|
1825
|
+
class FilterPresetEngine {
|
|
1826
|
+
_onSave;
|
|
1827
|
+
_generateId;
|
|
1828
|
+
_presets;
|
|
1829
|
+
_seq = 0;
|
|
1830
|
+
_onChange;
|
|
1831
|
+
constructor(options = {}) {
|
|
1832
|
+
this._onSave = options.onSave;
|
|
1833
|
+
this._generateId = options.generateId ?? (() => `preset-${++this._seq}`);
|
|
1834
|
+
this._presets = [...(options.presets ?? [])];
|
|
1835
|
+
}
|
|
1836
|
+
subscribe(listener) {
|
|
1837
|
+
this._onChange = listener;
|
|
1838
|
+
return () => {
|
|
1839
|
+
if (this._onChange === listener)
|
|
1840
|
+
this._onChange = undefined;
|
|
1841
|
+
};
|
|
1842
|
+
}
|
|
1843
|
+
getPresets() {
|
|
1844
|
+
return this._presets;
|
|
1845
|
+
}
|
|
1846
|
+
getPreset(id) {
|
|
1847
|
+
return this._presets.find((p) => p.id === id);
|
|
1848
|
+
}
|
|
1849
|
+
/** Save a new preset (or replace one with the same name). Returns it. */
|
|
1850
|
+
savePreset(name, filter, isShared = false) {
|
|
1851
|
+
const existing = this._presets.find((p) => p.name === name);
|
|
1852
|
+
const preset = existing
|
|
1853
|
+
? { ...existing, filter, isShared }
|
|
1854
|
+
: { id: this._generateId(), name, filter, isShared };
|
|
1855
|
+
if (existing) {
|
|
1856
|
+
this._presets = this._presets.map((p) => (p.id === existing.id ? preset : p));
|
|
1857
|
+
}
|
|
1858
|
+
else {
|
|
1859
|
+
this._presets = [...this._presets, preset];
|
|
1860
|
+
}
|
|
1861
|
+
this._onSave?.(preset);
|
|
1862
|
+
this._notify();
|
|
1863
|
+
return preset;
|
|
1864
|
+
}
|
|
1865
|
+
deletePreset(id) {
|
|
1866
|
+
const next = this._presets.filter((p) => p.id !== id);
|
|
1867
|
+
if (next.length !== this._presets.length) {
|
|
1868
|
+
this._presets = next;
|
|
1869
|
+
this._notify();
|
|
1870
|
+
}
|
|
1871
|
+
}
|
|
1872
|
+
/** Filter an array of rows through a filter tree. */
|
|
1873
|
+
applyFilter(node, rows) {
|
|
1874
|
+
return rows.filter((row) => evaluateFilter(node, row));
|
|
1875
|
+
}
|
|
1876
|
+
_notify() {
|
|
1877
|
+
this._onChange?.();
|
|
1878
|
+
}
|
|
1879
|
+
}
|
|
1880
|
+
|
|
1881
|
+
/**
|
|
1882
|
+
* SavedViewsEngine — manages named grid views (column layout, sort, filter,
|
|
1883
|
+
* group, density, etc.) across personal + admin-shared tiers. Server sync is
|
|
1884
|
+
* delegated to async callbacks so the engine stays pure and Node-testable.
|
|
1885
|
+
*/
|
|
1886
|
+
class SavedViewsEngine {
|
|
1887
|
+
_getSavedViews;
|
|
1888
|
+
_onSaveView;
|
|
1889
|
+
_onDeleteView;
|
|
1890
|
+
_onViewChange;
|
|
1891
|
+
_generateId;
|
|
1892
|
+
_views;
|
|
1893
|
+
_activeViewId = null;
|
|
1894
|
+
_seq = 0;
|
|
1895
|
+
_onChange;
|
|
1896
|
+
constructor(options = {}) {
|
|
1897
|
+
this._getSavedViews = options.getSavedViews;
|
|
1898
|
+
this._onSaveView = options.onSaveView;
|
|
1899
|
+
this._onDeleteView = options.onDeleteView;
|
|
1900
|
+
this._onViewChange = options.onViewChange;
|
|
1901
|
+
this._generateId = options.generateId ?? (() => `view-${++this._seq}`);
|
|
1902
|
+
this._views = [...(options.views ?? [])];
|
|
1903
|
+
}
|
|
1904
|
+
subscribe(listener) {
|
|
1905
|
+
this._onChange = listener;
|
|
1906
|
+
return () => {
|
|
1907
|
+
if (this._onChange === listener)
|
|
1908
|
+
this._onChange = undefined;
|
|
1909
|
+
};
|
|
1910
|
+
}
|
|
1911
|
+
/** Load views from the async source, replacing local state. */
|
|
1912
|
+
async load() {
|
|
1913
|
+
if (!this._getSavedViews)
|
|
1914
|
+
return;
|
|
1915
|
+
this._views = await this._getSavedViews();
|
|
1916
|
+
this._notify();
|
|
1917
|
+
}
|
|
1918
|
+
getViews() {
|
|
1919
|
+
return this._views;
|
|
1920
|
+
}
|
|
1921
|
+
getView(id) {
|
|
1922
|
+
return this._views.find((v) => v.id === id);
|
|
1923
|
+
}
|
|
1924
|
+
/** Personal (non-shared) views. */
|
|
1925
|
+
getPersonalViews() {
|
|
1926
|
+
return this._views.filter((v) => !v.isShared);
|
|
1927
|
+
}
|
|
1928
|
+
/** Admin-shared views. */
|
|
1929
|
+
getSharedViews() {
|
|
1930
|
+
return this._views.filter((v) => v.isShared);
|
|
1931
|
+
}
|
|
1932
|
+
getActiveView() {
|
|
1933
|
+
if (this._activeViewId === null)
|
|
1934
|
+
return null;
|
|
1935
|
+
return this.getView(this._activeViewId) ?? null;
|
|
1936
|
+
}
|
|
1937
|
+
/** Create a new view or update an existing one by name. Returns the view. */
|
|
1938
|
+
async saveView(name, layout, options = {}) {
|
|
1939
|
+
const existing = options.id
|
|
1940
|
+
? this._views.find((v) => v.id === options.id)
|
|
1941
|
+
: this._views.find((v) => v.name === name);
|
|
1942
|
+
const view = existing
|
|
1943
|
+
? { ...existing, name, layout, isShared: options.isShared ?? existing.isShared }
|
|
1944
|
+
: { id: this._generateId(), name, layout, isShared: options.isShared };
|
|
1945
|
+
if (existing) {
|
|
1946
|
+
this._views = this._views.map((v) => (v.id === existing.id ? view : v));
|
|
1947
|
+
}
|
|
1948
|
+
else {
|
|
1949
|
+
this._views = [...this._views, view];
|
|
1950
|
+
}
|
|
1951
|
+
await this._onSaveView?.(view);
|
|
1952
|
+
this._notify();
|
|
1953
|
+
return view;
|
|
1954
|
+
}
|
|
1955
|
+
/** Delete a view. If it was active, the active view is cleared. */
|
|
1956
|
+
async deleteView(id) {
|
|
1957
|
+
const next = this._views.filter((v) => v.id !== id);
|
|
1958
|
+
if (next.length === this._views.length)
|
|
1959
|
+
return;
|
|
1960
|
+
this._views = next;
|
|
1961
|
+
if (this._activeViewId === id) {
|
|
1962
|
+
this._activeViewId = null;
|
|
1963
|
+
this._onViewChange?.(null);
|
|
1964
|
+
}
|
|
1965
|
+
await this._onDeleteView?.(id);
|
|
1966
|
+
this._notify();
|
|
1967
|
+
}
|
|
1968
|
+
/** Activate a view (or clear with null). Fires onViewChange. */
|
|
1969
|
+
setActiveView(id) {
|
|
1970
|
+
if (id !== null && !this.getView(id)) {
|
|
1971
|
+
throw new Error(`SavedViewsEngine: unknown view '${id}'`);
|
|
1972
|
+
}
|
|
1973
|
+
if (this._activeViewId === id)
|
|
1974
|
+
return;
|
|
1975
|
+
this._activeViewId = id;
|
|
1976
|
+
this._onViewChange?.(this.getActiveView());
|
|
1977
|
+
this._notify();
|
|
1978
|
+
}
|
|
1979
|
+
_notify() {
|
|
1980
|
+
this._onChange?.();
|
|
1981
|
+
}
|
|
1982
|
+
}
|
|
1983
|
+
|
|
1726
1984
|
/*
|
|
1727
1985
|
* Public API Surface of @gridengine/angular-datagrid-enterprise
|
|
1728
1986
|
*
|
|
@@ -1735,5 +1993,5 @@ class RowLockEngine {
|
|
|
1735
1993
|
* Generated bundle index. Do not edit.
|
|
1736
1994
|
*/
|
|
1737
1995
|
|
|
1738
|
-
export { AuditTrailEngine, CellPermissionEngine, ClipboardEngine, DEFAULT_MASK, DataGridPro, FillHandleEngine, FormulaEngine, GridLicenseWatermark, LicenseManager, MasterDetailEngine, PRODUCT_ID, PURCHASE_URL, RangeSelectionEngine, RowLockEngine, SSRMEngine, TransactionEngine, UndoRedoManager, parseTSV, provideGridEngineLicense, toNumber, toTimestamp };
|
|
1996
|
+
export { AuditTrailEngine, CellPermissionEngine, ClipboardEngine, DEFAULT_MASK, DataGridPro, FillHandleEngine, FilterPresetEngine, FormulaEngine, GridLicenseWatermark, LicenseManager, MasterDetailEngine, PRODUCT_ID, PURCHASE_URL, RangeSelectionEngine, RowLockEngine, SSRMEngine, SavedViewsEngine, TransactionEngine, UndoRedoManager, deserializeFilter, evaluateFilter, parseTSV, provideGridEngineLicense, serializeFilter, toNumber, toTimestamp };
|
|
1739
1997
|
//# sourceMappingURL=gridengine-angular-datagrid-enterprise.mjs.map
|
|
@@ -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/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/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 * 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 * 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 { 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 * 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/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/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 * 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 * 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 { 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 * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["coreResolveFeatures"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -648,5 +648,125 @@ declare class RowLockEngine {
|
|
|
648
648
|
private _notify;
|
|
649
649
|
}
|
|
650
650
|
|
|
651
|
-
|
|
652
|
-
|
|
651
|
+
/**
|
|
652
|
+
* Advanced filter builder — a nestable AND/OR/NOT tree of conditions with a
|
|
653
|
+
* pure evaluator, URL-safe serialize/deserialize for shareable filter links,
|
|
654
|
+
* and a named-preset store. No React, no DOM.
|
|
655
|
+
*/
|
|
656
|
+
|
|
657
|
+
type FilterOperator = 'equals' | 'notEquals' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'greaterThan' | 'greaterThanOrEqual' | 'lessThan' | 'lessThanOrEqual' | 'isEmpty' | 'isNotEmpty';
|
|
658
|
+
/** A single leaf filter condition. */
|
|
659
|
+
interface FilterCondition {
|
|
660
|
+
kind: 'condition';
|
|
661
|
+
field: string;
|
|
662
|
+
operator: FilterOperator;
|
|
663
|
+
value?: unknown;
|
|
664
|
+
}
|
|
665
|
+
/** A nestable group of conditions/groups combined with AND or OR. */
|
|
666
|
+
interface FilterGroup {
|
|
667
|
+
kind: 'group';
|
|
668
|
+
combinator: 'and' | 'or';
|
|
669
|
+
/** Negates the entire group's result. */
|
|
670
|
+
not?: boolean;
|
|
671
|
+
children: FilterNode[];
|
|
672
|
+
}
|
|
673
|
+
type FilterNode = FilterCondition | FilterGroup;
|
|
674
|
+
/** A named, persistable filter preset. */
|
|
675
|
+
interface FilterPreset {
|
|
676
|
+
id: string;
|
|
677
|
+
name: string;
|
|
678
|
+
filter: FilterNode;
|
|
679
|
+
isShared?: boolean;
|
|
680
|
+
}
|
|
681
|
+
interface FilterPresetEngineOptions {
|
|
682
|
+
/** Presets to seed the store with. */
|
|
683
|
+
presets?: FilterPreset[];
|
|
684
|
+
/** Called when a preset is saved. */
|
|
685
|
+
onSave?: (preset: FilterPreset) => void | Promise<void>;
|
|
686
|
+
/** ID generator (injectable for tests). */
|
|
687
|
+
generateId?: () => string;
|
|
688
|
+
}
|
|
689
|
+
/** Evaluate a filter node against a row. */
|
|
690
|
+
declare function evaluateFilter(node: FilterNode, row: GridRow): boolean;
|
|
691
|
+
/** Serialize a filter tree to a URL-safe string. */
|
|
692
|
+
declare function serializeFilter(node: FilterNode): string;
|
|
693
|
+
/** Deserialize a URL-safe string back into a filter tree. Throws if invalid. */
|
|
694
|
+
declare function deserializeFilter(encoded: string): FilterNode;
|
|
695
|
+
declare class FilterPresetEngine {
|
|
696
|
+
private readonly _onSave?;
|
|
697
|
+
private readonly _generateId;
|
|
698
|
+
private _presets;
|
|
699
|
+
private _seq;
|
|
700
|
+
private _onChange?;
|
|
701
|
+
constructor(options?: FilterPresetEngineOptions);
|
|
702
|
+
subscribe(listener: () => void): () => void;
|
|
703
|
+
getPresets(): readonly FilterPreset[];
|
|
704
|
+
getPreset(id: string): FilterPreset | undefined;
|
|
705
|
+
/** Save a new preset (or replace one with the same name). Returns it. */
|
|
706
|
+
savePreset(name: string, filter: FilterNode, isShared?: boolean): FilterPreset;
|
|
707
|
+
deletePreset(id: string): void;
|
|
708
|
+
/** Filter an array of rows through a filter tree. */
|
|
709
|
+
applyFilter(node: FilterNode, rows: GridRow[]): GridRow[];
|
|
710
|
+
private _notify;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/**
|
|
714
|
+
* SavedViewsEngine — manages named grid views (column layout, sort, filter,
|
|
715
|
+
* group, density, etc.) across personal + admin-shared tiers. Server sync is
|
|
716
|
+
* delegated to async callbacks so the engine stays pure and Node-testable.
|
|
717
|
+
*/
|
|
718
|
+
interface SavedView {
|
|
719
|
+
id: string;
|
|
720
|
+
name: string;
|
|
721
|
+
isShared?: boolean;
|
|
722
|
+
layout: Record<string, unknown>;
|
|
723
|
+
}
|
|
724
|
+
interface SavedViewsEngineOptions {
|
|
725
|
+
/** Async loader for the user's saved views. */
|
|
726
|
+
getSavedViews?: () => Promise<SavedView[]>;
|
|
727
|
+
/** Persist a saved view. */
|
|
728
|
+
onSaveView?: (view: SavedView) => Promise<void> | void;
|
|
729
|
+
/** Delete a saved view. */
|
|
730
|
+
onDeleteView?: (viewId: string) => Promise<void> | void;
|
|
731
|
+
/** Notified when the active view changes. */
|
|
732
|
+
onViewChange?: (view: SavedView | null) => void;
|
|
733
|
+
/** Seed views (used when no async loader is supplied). */
|
|
734
|
+
views?: SavedView[];
|
|
735
|
+
/** ID generator (injectable for tests). */
|
|
736
|
+
generateId?: () => string;
|
|
737
|
+
}
|
|
738
|
+
declare class SavedViewsEngine {
|
|
739
|
+
private readonly _getSavedViews?;
|
|
740
|
+
private readonly _onSaveView?;
|
|
741
|
+
private readonly _onDeleteView?;
|
|
742
|
+
private readonly _onViewChange?;
|
|
743
|
+
private readonly _generateId;
|
|
744
|
+
private _views;
|
|
745
|
+
private _activeViewId;
|
|
746
|
+
private _seq;
|
|
747
|
+
private _onChange?;
|
|
748
|
+
constructor(options?: SavedViewsEngineOptions);
|
|
749
|
+
subscribe(listener: () => void): () => void;
|
|
750
|
+
/** Load views from the async source, replacing local state. */
|
|
751
|
+
load(): Promise<void>;
|
|
752
|
+
getViews(): readonly SavedView[];
|
|
753
|
+
getView(id: string): SavedView | undefined;
|
|
754
|
+
/** Personal (non-shared) views. */
|
|
755
|
+
getPersonalViews(): SavedView[];
|
|
756
|
+
/** Admin-shared views. */
|
|
757
|
+
getSharedViews(): SavedView[];
|
|
758
|
+
getActiveView(): SavedView | null;
|
|
759
|
+
/** Create a new view or update an existing one by name. Returns the view. */
|
|
760
|
+
saveView(name: string, layout: Record<string, unknown>, options?: {
|
|
761
|
+
isShared?: boolean;
|
|
762
|
+
id?: string;
|
|
763
|
+
}): Promise<SavedView>;
|
|
764
|
+
/** Delete a view. If it was active, the active view is cleared. */
|
|
765
|
+
deleteView(id: string): Promise<void>;
|
|
766
|
+
/** Activate a view (or clear with null). Fires onViewChange. */
|
|
767
|
+
setActiveView(id: string | null): void;
|
|
768
|
+
private _notify;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
export { AuditTrailEngine, CellPermissionEngine, ClipboardEngine, DEFAULT_MASK, DataGridPro, FillHandleEngine, FilterPresetEngine, FormulaEngine, GridLicenseWatermark, LicenseManager, MasterDetailEngine, PRODUCT_ID, PURCHASE_URL, RangeSelectionEngine, RowLockEngine, SSRMEngine, SavedViewsEngine, TransactionEngine, UndoRedoManager, deserializeFilter, evaluateFilter, parseTSV, provideGridEngineLicense, serializeFilter, toNumber, toTimestamp };
|
|
772
|
+
export type { AuditEntry, AuditTrailEngineOptions, Block, BlockState, CellEditCommand, CellPermission, CellPermissionEngineOptions, CellRange, ClipboardEngineOptions, DeleteCommand, DetailEntry, DetailLoadState, FillCell, FillCommand, FillDirection, FillHandleEngineOptions, FillResult, FilterCondition, FilterGroup, FilterNode, FilterOperator, FilterPreset, FilterPresetEngineOptions, FormulaEngineOptions, GridRow, LockedRow, MasterDetailEngineOptions, PasteCommand, RangeSelectionEngineOptions, RowLockEngineOptions, SSRMDataSource, SSRMEngineOptions, SSRMGetRowsParams, SSRMGetRowsResult, SavedView, SavedViewsEngineOptions, TransactionDelta, TransactionEngineOptions, UndoRedoCommand, UndoRedoManagerOptions };
|