@agile-team/mach-table 0.18.0 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../package.json","../src/core/eventBus.ts","../src/lib/path.ts","../src/lib/advancedFilter.ts","../src/core/resolveOptions.ts","../src/services/column.ts","../src/services/columnGroup.ts","../src/types/colDef.ts","../src/lib/layout.ts","../src/services/columnModel.ts","../src/services/filterService.ts","../src/lib/compare.ts","../src/services/sortService.ts","../src/lib/aggregate.ts","../src/services/rowModel.ts","../src/services/selectionService.ts","../src/services/resizeService.ts","../src/lib/dom.ts","../src/services/columnDragService.ts","../src/lib/csv.ts","../src/lib/clipboard.ts","../src/services/keyboardService.ts","../src/services/editors.ts","../src/render/runtimeState.ts","../src/render/cellContent.ts","../src/services/editingService.ts","../src/lib/locale.ts","../src/services/filterPopup.ts","../src/services/columnMenuService.ts","../src/services/contextMenuService.ts","../src/services/tooltipService.ts","../src/services/watermarkService.ts","../src/services/undoRedoService.ts","../src/services/changeTrackingService.ts","../src/services/performanceMonitor.ts","../src/types/events.ts","../src/lib/download.ts","../src/core/gridOptionMetadata.ts","../src/core/gridOptionRuntime.ts","../src/lib/gridState.ts","../src/lib/batchSave.ts","../src/services/gridApi.ts","../src/render/skeleton.ts","../src/lib/filterSummary.ts","../src/render/headerRenderer.ts","../src/services/rangeSelectionModel.ts","../src/services/rowDragController.ts","../src/render/bodyRenderer.ts","../src/render/summaryRenderer.ts","../src/render/paginationBar.ts","../src/render/pinnedRowsRenderer.ts","../src/render/statusBarService.ts","../src/lib/columnStateStore.ts","../src/lib/gridStateStore.ts","../src/lib/presetRenderers.ts","../src/lib/componentRegistry.ts","../src/lib/validateDefs.ts","../src/lib/validateOptions.ts","../src/lib/featureManifest.ts","../src/core/gridCore.ts","../src/core/createGrid.ts","../src/lib/schema.ts","../src/lib/controller.ts","../src/lib/presetColumns.ts","../src/lib/columnHelper.ts","../src/lib/presets.ts","../src/lib/configuration.ts","../src/lib/businessColumns.ts","../src/lib/gridViewStore.ts"],"sourcesContent":["import packageJson from \"../package.json\";\n\nexport { createGrid } from \"./core/createGrid\";\nexport { GridCore } from \"./core/gridCore\";\nexport { EventBus } from \"./core/eventBus\";\nexport { defaultComparator } from \"./lib/compare\";\nexport { getByPath, setByPath, isSafePath } from \"./lib/path\";\nexport { computeColumnWidths, fitColumnWidths } from \"./lib/layout\";\nexport type { WidthInput } from \"./lib/layout\";\n\nexport type {\n ColDef,\n ColDefGroup,\n ColDefOrGroup,\n ColumnState,\n ColumnFilter,\n FilterModel,\n FilterType,\n SortModel,\n SortModelItem,\n SortDirection,\n PinnedDirection,\n TextFilterMatch,\n NumberFilterMatch,\n DateFilterMatch,\n TextFilterCondition,\n NumberFilterCondition,\n DateFilterCondition,\n SetFilterCondition,\n SelectEditorParams,\n SetFilterParams,\n CellRendererFn,\n CellClassRule,\n CellEditorFactory,\n CellStyleRule,\n CellAlign\n} from \"./types/colDef\";\nexport type {\n AdvancedFilterCondition,\n AdvancedFilterGroup,\n AdvancedFilterModel,\n AdvancedFilterNode\n} from \"./types/advancedFilter\";\nexport {\n advancedFilterCondition,\n advancedFilterGroup,\n normalizeAdvancedFilterModel,\n normalizeColumnFilter,\n normalizeFilterModel\n} from \"./lib/advancedFilter\";\nexport { isColDefGroup } from \"./types/colDef\";\nexport type {\n ValueGetterParams,\n ValueFormatterParams,\n ValueSetterParams,\n CellRendererParams,\n CellClassParams,\n EditableParams,\n CellEditorParams,\n GetRowIdParams,\n GetRowHeightParams,\n HeaderComponentParams,\n ICellEditor,\n ICellRendererResult,\n CellRendererOutput\n} from \"./types/params\";\nexport type {\n GridOptions,\n ResolvedGridOptions,\n EventHandlers,\n RowSelectionMode,\n GridSize,\n ColumnLayoutMode,\n DomLayoutMode,\n ThemeMode,\n GridEditType,\n EditableIndicator,\n RowEditValidationParams,\n RowEditValidationResult,\n DetailRowRendererParams,\n TreeDataLoadParams,\n GridComponents,\n GridFeature,\n GridFeatureContext,\n OverlayContent,\n OverlayTemplate,\n ColumnStateStore,\n GridStateStore,\n StatusBarPanel,\n StatusBarConfig,\n GridDatasource,\n InfiniteGetRowsParams,\n PaginationConfig,\n WatermarkConfig,\n ActionPolicy,\n ActionPolicyContext\n} from \"./types/options\";\nexport { GRID_SIZE_PRESETS } from \"./core/resolveOptions\";\nexport type { GridSizePreset } from \"./core/resolveOptions\";\nexport { GRID_OPTION_META, GRID_OPTION_KEYS, DIRECT_GRID_OPTION_KEYS } from \"./core/gridOptionMetadata\";\nexport { matchesGridOptionKind, sanitizeGridOptionPatch } from \"./core/gridOptionRuntime\";\nexport type {\n GridOptionKey,\n GridOptionMetadata,\n GridOptionUpdateMode,\n GridOptionValueKind\n} from \"./core/gridOptionMetadata\";\nexport { describeFilter } from \"./lib/filterSummary\";\nexport { validateGridOptions } from \"./lib/validateOptions\";\nexport type { GridValidationCode, GridValidationIssue } from \"./lib/validateOptions\";\nexport { resolveGridFeatures } from \"./lib/featureManifest\";\nexport type { GridFeatureIssue, GridFeatureIssueCode, ResolvedGridFeatures } from \"./lib/featureManifest\";\nexport { buildColDefsFromSchema } from \"./lib/schema\";\nexport type { GridSchema, GridSchemaField, GridSchemaGroup, GridSchemaFieldType, SchemaSelectOption } from \"./lib/schema\";\nexport {\n saveColumnState,\n loadColumnState,\n clearColumnState,\n createColumnStateKey,\n createLocalColumnStateStore\n} from \"./lib/columnStateStore\";\nexport { saveGridState, loadGridState, clearGridState, createLocalGridStateStore } from \"./lib/gridStateStore\";\nexport type { LocalGridStateStoreOptions, ManagedGridStateStore, StoredGridState } from \"./lib/gridStateStore\";\nexport type {\n ColumnStateKeyParts,\n ColumnStateStorage,\n LocalColumnStateStoreOptions,\n ManagedColumnStateStore,\n StoredColumnState\n} from \"./lib/columnStateStore\";\nexport { BUILTIN_AGG_FUNCS, createAggResolver } from \"./lib/aggregate\";\nexport type { AggFunction, AggValues } from \"./lib/aggregate\";\nexport { DEFAULT_LOCALE, LOCALE_EN, matchLocaleKey, formatText, formatTwo } from \"./lib/locale\";\nexport type { RgLocale, RgLocaleKey } from \"./lib/locale\";\nexport { toTsv, parseTsv, parseCsv, parseDelimited } from \"./lib/clipboard\";\nexport { escapeHtml, downloadFile } from \"./lib/download\";\nexport { createMachTableCommands } from \"./lib/controller\";\nexport type { MachTableCommandOptions, MachTableCommands } from \"./lib/controller\";\nexport { sanitizeFormulaCell } from \"./lib/csv\";\nexport {\n registerCellRenderer,\n registerCellEditor,\n getCellRenderer,\n getCellEditor,\n clearComponentRegistries\n} from \"./lib/componentRegistry\";\nexport {\n createStatusTagRenderer,\n createProgressBarRenderer,\n createActionButtonsRenderer,\n createRowActionsRenderer,\n linkRenderer,\n resolveTagVariant,\n registerBuiltinRenderers\n} from \"./lib/presetRenderers\";\nexport type {\n TagVariant,\n StatusTagConfig,\n ProgressConfig,\n ActionItem,\n ActionButtonsConfig,\n RowActionsConfig,\n ActionVariant,\n ActionOverflowMode,\n BuiltInActionIcon\n} from \"./lib/presetRenderers\";\nexport { selectionColumn, indexColumn, dragColumn, actionsColumn, rowActionsColumn } from \"./lib/presetColumns\";\nexport { createColumnHelper, defineColumns } from \"./lib/columnHelper\";\nexport type { ColumnHelper } from \"./lib/columnHelper\";\nexport type { FieldPath, FieldPathValue } from \"./types/path\";\nexport { createMachTablePreset, createEnterprisePreset, defineMachTablePreset, defineGridOptions } from \"./lib/presets\";\nexport {\n defineMachTableConfig,\n mergeMachTableConfig,\n normalizeMachTableConfig,\n resolveMachTableGridOptions\n} from \"./lib/configuration\";\nexport type {\n MachTableConfigWarning,\n MachTableOptionExplanation,\n MachTablePresetSelection,\n MachTableRuntimeConfig,\n ResolvedMachTableConfig,\n ResolvedMachTableGridOptions\n} from \"./lib/configuration\";\nexport {\n createBusinessColumnTypes,\n createCachedDictionary,\n createDictionaryRenderer\n} from \"./lib/businessColumns\";\nexport type {\n BusinessColumnType,\n BusinessColumnTypeOptions,\n CachedDictionary,\n CachedDictionaryOptions,\n DictionaryEntry,\n DictionaryKey,\n DictionaryRendererOptions\n} from \"./lib/businessColumns\";\nexport type { TooltipParams, ContextMenuParams, ContextMenuItem } from \"./types/params\";\nexport type {\n GridApi,\n CsvExportParams,\n RowTransaction,\n GridCellChange,\n GridChange,\n GridBatchSaveResult,\n SaveChangeConflict,\n SaveChangeIssue,\n GridDiagnosticError,\n GridDiagnostics,\n GridPerformanceSnapshot,\n ColumnWorkbenchItem,\n SaveChangesResult,\n SaveChangesHandler,\n ImportCsvOptions,\n PrintOptions\n} from \"./types/api\";\nexport { createSaveSnapshot, normalizeBatchSaveResult, resolveSaveConflict } from \"./lib/batchSave\";\nexport type { RowNode } from \"./types/row\";\nexport type {\n GridState,\n GridStateInput,\n LegacyGridStateV1,\n GridStateSection,\n ApplyGridStateOptions\n} from \"./types/state\";\nexport { migrateGridState } from \"./lib/gridState\";\nexport type {\n GridViewManager,\n GridViewState,\n GridViewStore,\n SavedGridView\n} from \"./types/views\";\nexport {\n applyGridViewState,\n captureGridViewState,\n createGridViewManager,\n createLocalGridViewStore,\n normalizeGridViewState,\n normalizeSavedGridView\n} from \"./lib/gridViewStore\";\nexport type { LocalGridViewStoreOptions } from \"./lib/gridViewStore\";\nexport type {\n GridEventMap,\n GridEventType,\n GridEventBase,\n GridReadyEvent,\n CellClickEvent,\n CellDoubleClickEvent,\n CellContextMenuEvent,\n RowClickEvent,\n SelectionChangedEvent,\n SortChangedEvent,\n FilterChangedEvent,\n ColumnResizedEvent,\n ColumnMovedEvent,\n ColumnVisibilityChangedEvent,\n CellValueChangedEvent,\n CellEditingStartedEvent,\n CellEditingStoppedEvent,\n RowEditingStartedEvent,\n RowEditingStoppedEvent,\n RowEditChange,\n ModelUpdatedEvent,\n DetailToggledEvent,\n TreeChildrenLoadedEvent,\n TreeChildrenLoadFailedEvent,\n RowDragEndEvent,\n RangeSelectionChangedEvent,\n GridCellRange,\n PaginationChangedEvent,\n GridErrorEvent,\n GridErrorCode,\n DirtyStateChangedEvent\n} from \"./types/events\";\nexport { EVENT_TYPES } from \"./types/events\";\nexport { Column } from \"./services/column\";\nexport { evaluateColumnFilter } from \"./services/filterService\";\nexport { sortNodes } from \"./services/sortService\";\n\nexport const version: string = packageJson.version;\n","{\n \"name\": \"@agile-team/mach-table\",\n \"version\": \"0.18.0\",\n \"description\": \"Enterprise-grade, framework-agnostic TypeScript data grid with virtualization, editing, grouping and extensibility\",\n \"keywords\": [\n \"data-grid\",\n \"table\",\n \"virtualization\",\n \"typescript\",\n \"enterprise\",\n \"vue\",\n \"react\"\n ],\n \"author\": \"ChenyCHENYU (Agile Team)\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"homepage\": \"https://github.com/ChenyCHENYU/MachTable#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/ChenyCHENYU/MachTable/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ChenyCHENYU/MachTable.git\",\n \"directory\": \"packages/core\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./styles/mach-table.css\": {\n \"types\": \"./styles/mach-table.css.d.ts\",\n \"default\": \"./styles/mach-table.css\"\n }\n },\n \"files\": [\n \"dist\",\n \"styles\"\n ],\n \"sideEffects\": [\n \"**/*.css\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:coverage\": \"vitest run --coverage\"\n }\n}\n","type EventKey<TEvents extends object> = Extract<keyof TEvents, string>;\ntype Listener<TEvent> = (event: TEvent) => void;\n\nexport class EventBus<TEvents extends object = Record<string, any>> {\n private listeners = new Map<EventKey<TEvents>, Set<Listener<any>>>();\n\n constructor(private onListenerError?: (error: unknown, eventType: EventKey<TEvents>) => void) {}\n\n on<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): () => void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener as Listener<any>);\n return () => {\n set.delete(listener);\n };\n }\n\n once<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): () => void {\n const off = this.on(type, (event) => {\n off();\n listener(event);\n });\n return off;\n }\n\n off<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): void {\n const set = this.listeners.get(type);\n if (set) {\n set.delete(listener as Listener<any>);\n if (set.size === 0) this.listeners.delete(type);\n }\n }\n\n emit<K extends EventKey<TEvents>>(type: K, payload?: TEvents[K]): void {\n const set = this.listeners.get(type);\n if (!set) return;\n for (const listener of [...set]) {\n try {\n listener(payload);\n } catch (err) {\n console.error(`[mach-table] error in \"${type}\" listener`, err);\n this.onListenerError?.(err, type);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","const UNSAFE_PATH_SEGMENTS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\nexport function isSafePath(path: string): boolean {\n if (typeof path !== \"string\" || path.length === 0) return false;\n const parts = path.split(\".\");\n return parts.every((part) => part.length > 0 && !UNSAFE_PATH_SEGMENTS.has(part));\n}\n\nexport function getByPath(obj: any, path: string): any {\n if (obj == null) return undefined;\n if (!isSafePath(path)) return undefined;\n const dot = path.indexOf(\".\");\n if (dot < 0) return obj[path];\n let cur = obj;\n let start = 0;\n while (start < path.length) {\n if (cur == null) return undefined;\n const idx = path.indexOf(\".\", start);\n if (idx < 0) {\n cur = cur[path.slice(start)];\n break;\n }\n cur = cur[path.slice(start, idx)];\n start = idx + 1;\n }\n return cur;\n}\n\nexport function setByPath(obj: any, path: string, value: any): boolean {\n if (obj == null || !isSafePath(path)) return false;\n const parts = path.split(\".\");\n let cur = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n if ((typeof cur !== \"object\" && typeof cur !== \"function\") || cur === null) return false;\n if (cur[parts[i]] == null) cur[parts[i]] = {};\n cur = cur[parts[i]];\n }\n if ((typeof cur !== \"object\" && typeof cur !== \"function\") || cur === null) return false;\n cur[parts[parts.length - 1]] = value;\n return true;\n}\n","import type { ColumnFilter } from \"../types/colDef\";\nimport type {\n AdvancedFilterCondition,\n AdvancedFilterGroup,\n AdvancedFilterModel,\n AdvancedFilterNode\n} from \"../types/advancedFilter\";\n\nconst MAX_DEPTH = 16;\nconst MAX_NODES = 512;\nconst MAX_CONDITIONS = 20;\nconst MAX_SET_VALUES = 2_000;\nconst MAX_FILTER_COLUMNS = 2_000;\n\nconst TEXT_MATCHES = new Set([\n \"contains\", \"notContains\", \"equals\", \"notEquals\", \"startsWith\", \"endsWith\", \"blank\", \"notBlank\"\n]);\nconst NUMBER_MATCHES = new Set([\n \"equals\", \"notEquals\", \"lessThan\", \"lessThanOrEqual\", \"greaterThan\", \"greaterThanOrEqual\", \"inRange\", \"blank\", \"notBlank\"\n]);\nconst DATE_MATCHES = new Set([\"equals\", \"notEquals\", \"lessThan\", \"greaterThan\", \"inRange\", \"blank\", \"notBlank\"]);\n\nfunction primitive(value: unknown): value is string | number | null {\n return value == null || typeof value === \"string\" || (typeof value === \"number\" && Number.isFinite(value));\n}\n\nfunction matchesFor(type: \"text\" | \"number\" | \"date\"): ReadonlySet<string> {\n if (type === \"text\") return TEXT_MATCHES;\n return type === \"number\" ? NUMBER_MATCHES : DATE_MATCHES;\n}\n\nfunction normalizedCondition(\n entry: unknown,\n type: \"text\" | \"number\" | \"date\",\n matches: ReadonlySet<string>\n): Record<string, unknown> | null {\n if (entry == null || typeof entry !== \"object\") return null;\n const condition = entry as Record<string, unknown>;\n if (typeof condition.match !== \"string\" || !matches.has(condition.match)) return null;\n return { match: condition.match, ...conditionValues(condition, type) };\n}\n\nfunction conditionValues(\n condition: Record<string, unknown>,\n type: \"text\" | \"number\" | \"date\"\n): Record<string, unknown> {\n const value = type === \"number\"\n ? finiteNumber(condition.value)\n : typeof condition.value === \"string\" ? condition.value : undefined;\n const value2 = type === \"number\"\n ? finiteNumber(condition.value2)\n : typeof condition.value2 === \"string\" ? condition.value2 : undefined;\n return { ...(value !== undefined ? { value } : {}), ...(value2 !== undefined ? { value2 } : {}) };\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction normalizedConditions(\n input: unknown[],\n type: \"text\" | \"number\" | \"date\"\n): Array<Record<string, unknown>> {\n const output: Array<Record<string, unknown>> = [];\n const matches = matchesFor(type);\n for (const entry of input.slice(0, MAX_CONDITIONS)) {\n const condition = normalizedCondition(entry, type, matches);\n if (condition) output.push(condition);\n }\n return output;\n}\n\nexport function normalizeColumnFilter(input: unknown): ColumnFilter | null {\n if (input == null || typeof input !== \"object\") return null;\n const source = input as Record<string, unknown>;\n if (source.type === \"set\") {\n if (!Array.isArray(source.values)) return null;\n return { type: \"set\", values: source.values.filter(primitive).slice(0, MAX_SET_VALUES) };\n }\n if (source.type !== \"text\" && source.type !== \"number\" && source.type !== \"date\") return null;\n if (!Array.isArray(source.conditions)) return null;\n return {\n type: source.type,\n ...(source.operator === \"or\" || source.operator === \"and\" ? { operator: source.operator } : {}),\n conditions: normalizedConditions(source.conditions, source.type)\n } as unknown as ColumnFilter;\n}\n\ninterface AdvancedNormalizationContext {\n ancestors: WeakSet<object>;\n nodes: number;\n validColumnIds?: ReadonlySet<string>;\n}\n\nfunction normalizeConditionNode(\n node: Record<string, unknown>,\n context: AdvancedNormalizationContext\n): AdvancedFilterCondition | null {\n if (typeof node.colId !== \"string\" || !node.colId.trim()) return null;\n const colId = node.colId.trim();\n if (context.validColumnIds?.has(colId) === false) return null;\n const filter = normalizeColumnFilter(node.filter);\n return filter ? { kind: \"condition\", colId, filter } : null;\n}\n\nfunction normalizeGroupNode(\n node: Record<string, unknown>,\n depth: number,\n context: AdvancedNormalizationContext\n): AdvancedFilterGroup | null {\n if (!Array.isArray(node.children)) return null;\n const children: AdvancedFilterNode[] = [];\n for (const child of node.children) {\n const normalized = normalizeAdvancedNode(child, depth + 1, context);\n if (normalized) children.push(normalized);\n }\n if (children.length === 0) return null;\n return {\n kind: \"group\",\n operator: node.operator === \"or\" ? \"or\" : \"and\",\n children,\n ...(node.not === true ? { not: true } : {})\n };\n}\n\nfunction canNormalizeNode(value: unknown, depth: number, context: AdvancedNormalizationContext): value is object {\n return depth <= MAX_DEPTH && context.nodes < MAX_NODES && value != null && typeof value === \"object\";\n}\n\nfunction normalizeAdvancedNode(\n value: unknown,\n depth: number,\n context: AdvancedNormalizationContext\n): AdvancedFilterNode | null {\n if (!canNormalizeNode(value, depth, context)) return null;\n if (context.ancestors.has(value)) return null;\n context.ancestors.add(value);\n context.nodes++;\n const node = value as Record<string, unknown>;\n const result = node.kind === \"condition\"\n ? normalizeConditionNode(node, context)\n : node.kind === \"group\" ? normalizeGroupNode(node, depth, context) : null;\n context.ancestors.delete(value);\n return result;\n}\n\n/** Clones and bounds untrusted JSON before it reaches the row pipeline. */\nexport function normalizeAdvancedFilterModel(\n input: unknown,\n validColumnIds?: ReadonlySet<string>\n): AdvancedFilterModel | null {\n if (input == null || typeof input !== \"object\") return null;\n const source = input as Partial<AdvancedFilterModel>;\n if (source.version !== 1 || source.root == null) return null;\n const root = normalizeAdvancedNode(source.root, 0, {\n ancestors: new WeakSet<object>(), nodes: 0, validColumnIds\n });\n return root ? { version: 1, root } : null;\n}\n\nexport function advancedFilterCondition(colId: string, filter: ColumnFilter): AdvancedFilterCondition {\n return { kind: \"condition\", colId, filter };\n}\n\nexport function normalizeFilterModel(\n input: unknown,\n validColumnIds?: ReadonlySet<string>\n): import(\"../types/colDef\").FilterModel {\n if (input == null || typeof input !== \"object\" || Array.isArray(input)) return {};\n const output: import(\"../types/colDef\").FilterModel = {};\n for (const [rawId, value] of Object.entries(input).slice(0, MAX_FILTER_COLUMNS)) {\n const colId = rawId.trim();\n if (!colId || validColumnIds?.has(colId) === false) continue;\n const filter = normalizeColumnFilter(value);\n if (filter) output[colId] = filter;\n }\n return output;\n}\n\nexport function advancedFilterGroup(\n operator: \"and\" | \"or\",\n children: AdvancedFilterNode[],\n options: { not?: boolean } = {}\n): AdvancedFilterGroup {\n return { kind: \"group\", operator, children, ...(options.not ? { not: true } : {}) };\n}\n","import type { GridOptions, GridSize, ResolvedGridOptions } from \"../types/options\";\nimport type { ColDef } from \"../types/colDef\";\nimport { getByPath } from \"../lib/path\";\nimport { normalizeAdvancedFilterModel } from \"../lib/advancedFilter\";\n\nexport const DEFAULT_COL_DEF: Partial<ColDef> = {\n sortable: true,\n resizable: true,\n movable: true,\n filter: false,\n minWidth: 80\n};\n\nexport interface GridSizePreset {\n rowHeight: number;\n headerHeight: number;\n fontSize: number;\n cellPadding: number;\n}\n\nexport const GRID_SIZE_PRESETS: Record<GridSize, GridSizePreset> = {\n compact: { rowHeight: 30, headerHeight: 34, fontSize: 12, cellPadding: 6 },\n normal: { rowHeight: 36, headerHeight: 40, fontSize: 13, cellPadding: 9 },\n large: { rowHeight: 44, headerHeight: 48, fontSize: 14, cellPadding: 12 }\n};\n\nfunction finiteAtLeast(value: unknown, fallback: number, min: number, integer = false): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < min) return fallback;\n return integer ? Math.floor(value) : value;\n}\n\nfunction resolveSize(value: GridOptions[\"size\"]): GridSize {\n return value && Object.prototype.hasOwnProperty.call(GRID_SIZE_PRESETS, value) ? value : \"normal\";\n}\n\nfunction resolveTheme(options: GridOptions): ResolvedGridOptions[\"theme\"] {\n if (options.theme === \"light\" || options.theme === \"dark\" || options.theme === \"auto\") return options.theme;\n return options.className?.includes(\"mach-theme-dark\") ? \"dark\" : \"light\";\n}\n\nfunction resolvePageSizeOptions<TData>(options: GridOptions<TData>, pageSize: number): number[] {\n const requested =\n typeof options.pagination === \"object\" && Array.isArray(options.pagination.pageSizeOptions)\n ? options.pagination.pageSizeOptions\n : undefined;\n const values = requested\n ? [...new Set(requested.map((value) => finiteAtLeast(value, 0, 1, true)).filter(Boolean))]\n : [10, 20, 50, 100];\n if (!values.includes(pageSize)) values.push(pageSize);\n return values.sort((left, right) => left - right);\n}\n\nexport function rowIdFromKey<TData>(rowKey: NonNullable<GridOptions<TData>[\"rowKey\"]>, data: TData): string {\n const value = typeof rowKey === \"function\" ? rowKey(data) : getByPath(data, rowKey);\n return value == null ? \"\" : String(value);\n}\n\nfunction resolveRowIdentity<TData>(options: GridOptions<TData>): Pick<ResolvedGridOptions<TData>, \"getRowId\" | \"rowKey\"> {\n const rowKey = options.rowKey;\n const getRowId = options.getRowId ?? (rowKey\n ? ({ data }: { data: TData }) => rowIdFromKey(rowKey, data)\n : undefined);\n return {\n ...(getRowId ? { getRowId } : {}),\n ...(rowKey ? { rowKey } : {})\n };\n}\n\nfunction resolveDataAndLayout<TData>(options: GridOptions<TData>, size: GridSize) {\n const preset = GRID_SIZE_PRESETS[size];\n return {\n columnDefs: Array.isArray(options.columnDefs) ? options.columnDefs : [],\n rowData: Array.isArray(options.rowData) ? options.rowData : [],\n defaultColDef: { ...DEFAULT_COL_DEF, ...(options.defaultColDef ?? {}) },\n columnTypes: options.columnTypes ?? {},\n ...resolveRowIdentity(options),\n rowHeight: finiteAtLeast(options.rowHeight, preset.rowHeight, 1),\n headerHeight: finiteAtLeast(options.headerHeight, preset.headerHeight, 1),\n rowBuffer: finiteAtLeast(options.rowBuffer, 8, 0, true),\n columnLayout: options.columnLayout === \"fit\" ? \"fit\" as const : \"normal\" as const,\n enableColumnResize: options.enableColumnResize === true,\n domLayout: options.domLayout === \"autoHeight\" ? \"autoHeight\" as const : \"normal\" as const,\n rowSelection:\n options.rowSelection === \"single\" || options.rowSelection === \"multiple\"\n ? options.rowSelection\n : \"none\" as const,\n multiSort: options.multiSort ?? true,\n size,\n pinnedTopRowData: Array.isArray(options.pinnedTopRowData) ? options.pinnedTopRowData : [],\n pinnedBottomRowData: Array.isArray(options.pinnedBottomRowData) ? options.pinnedBottomRowData : []\n };\n}\n\nfunction resolveAppearance(options: GridOptions) {\n return {\n stripedRows: options.stripedRows ?? false,\n showCellBorders: options.showCellBorders ?? false,\n theme: resolveTheme(options),\n quickFilterText: options.quickFilterText ?? null,\n suppressCellFocus: options.suppressCellFocus ?? false,\n suppressRowHoverHighlight: options.suppressRowHoverHighlight ?? false,\n suppressNoRowsOverlay: options.suppressNoRowsOverlay ?? false,\n suppressHeaderFocus: options.suppressHeaderFocus ?? false,\n loading: options.loading ?? false,\n error: options.error ?? null,\n className: options.className ?? \"\"\n };\n}\n\nfunction resolveEditingAndHistory(options: GridOptions) {\n return {\n editType: options.editType === \"fullRow\" ? \"fullRow\" as const : \"cell\" as const,\n editableIndicator:\n options.editableIndicator === \"always\" || options.editableIndicator === \"none\"\n ? options.editableIndicator\n : \"hover\" as const,\n singleClickEdit: options.singleClickEdit ?? false,\n manualSorting: options.manualSorting ?? false,\n manualFiltering: options.manualFiltering ?? false,\n showSummary: options.showSummary ?? false,\n indexOffset: options.indexOffset ?? 0,\n applyRowDrag: options.applyRowDrag ?? true,\n undoStackSize: finiteAtLeast(options.undoStackSize, 100, 0, true),\n asyncTransactionWaitMillis: finiteAtLeast(options.asyncTransactionWaitMillis, 16, 0, true)\n };\n}\n\nfunction resolveHierarchy(options: GridOptions) {\n return {\n masterDetail: options.masterDetail ?? false,\n detailRowHeight: finiteAtLeast(options.detailRowHeight, 240, 1),\n detailToggleColumn: options.detailToggleColumn ?? true,\n treeData: options.treeData ?? false,\n childrenKey: options.childrenKey ?? \"children\",\n autoCheckedChildren: options.autoCheckedChildren ?? true,\n defaultExpandAll: options.defaultExpandAll ?? false\n };\n}\n\nfunction resolvePagination<TData>(options: GridOptions<TData>) {\n const config = typeof options.pagination === \"object\" ? options.pagination : undefined;\n const pageSize = finiteAtLeast(\n config?.pageSize,\n 20,\n 1,\n true\n );\n return {\n paginationEnabled: options.pagination !== false && options.datasource == null,\n paginationMode: config?.mode === \"server\" ? \"server\" as const : \"client\" as const,\n paginationPage: finiteAtLeast(config?.page, 1, 1, true),\n paginationTotal: finiteAtLeast(config?.total, 0, 0, true),\n paginationPageSize: pageSize,\n paginationPageSizeOptions: resolvePageSizeOptions(options, pageSize),\n paginationShowTotal: config ? config.showTotal !== false : true,\n paginationShowSizeSelector: config ? config.showPageSizeSelector !== false : true\n };\n}\n\nfunction resolveWatermark(options: GridOptions) {\n return {\n watermarkEnabled: options.watermark != null && options.watermark !== false,\n watermarkConfig:\n options.watermark == null || options.watermark === false\n ? null\n : options.watermark === true\n ? { text: \"MachTable\" }\n : options.watermark\n };\n}\n\nfunction resolveInteraction(options: GridOptions) {\n return {\n columnMenu: options.columnMenu ?? false,\n columnStateKey: options.columnStateKey ?? null,\n advancedFilterModel: normalizeAdvancedFilterModel(options.advancedFilterModel),\n ...resolveStatePersistence(options),\n locale: options.locale ?? {},\n suppressWarnings: options.suppressWarnings ?? false,\n enableRangeSelection: options.enableRangeSelection ?? false,\n suppressClipboard: options.suppressClipboard ?? false,\n contextMenu: options.contextMenu ?? false,\n tooltipShowDelay: finiteAtLeast(options.tooltipShowDelay, 600, 0),\n flashCells: options.flashCells ?? true,\n fillHandle: options.fillHandle ?? true,\n statusBarEnabled:\n options.statusBar === true || (typeof options.statusBar === \"object\" && options.statusBar != null),\n statusBarPanels:\n typeof options.statusBar === \"object\" && options.statusBar?.panels\n ? options.statusBar.panels\n : [\"rowCount\", \"selectedRowCount\", \"rangeAggregate\"] as const\n };\n}\n\nfunction resolveStatePersistence(options: GridOptions) {\n return {\n stateKey: options.stateKey ?? null,\n stateSaveDebounceMs: finiteAtLeast(options.stateSaveDebounceMs, 160, 0, true)\n };\n}\n\nfunction resolveDatasource(options: GridOptions) {\n return {\n blockSize: finiteAtLeast(options.blockSize, 100, 1, true),\n infiniteBufferRows: finiteAtLeast(options.infiniteBufferRows, 40, 0, true),\n datasourceRetryCount: finiteAtLeast(options.datasourceRetryCount, 2, 0, true),\n datasourceRetryDelay: finiteAtLeast(options.datasourceRetryDelay, 300, 0, true)\n };\n}\n\nfunction resolveAccessibility(options: GridOptions) {\n return {\n ariaLabel: options.ariaLabel ?? \"MachTable data grid\",\n ariaLabelledBy: options.ariaLabelledBy ?? \"\",\n ariaDescribedBy: options.ariaDescribedBy ?? \"\",\n overlayNoRowsTemplate: options.overlayNoRowsTemplate ?? \"\",\n overlayLoadingTemplate: options.overlayLoadingTemplate ?? \"\",\n overlayErrorTemplate: options.overlayErrorTemplate ?? \"\",\n allowUnsafeOverlayHtml: options.allowUnsafeOverlayHtml ?? false\n };\n}\n\nconst OPTIONAL_OPTION_KEYS = [\n \"stateStore\",\n \"detailRowRenderer\",\n \"isRowExpandable\",\n \"columnStateStore\",\n \"aggFuncs\",\n \"components\",\n \"actionPolicy\",\n \"summaryMethod\",\n \"datasource\",\n \"getRowHeight\",\n \"tooltipComponent\",\n \"getContextMenuItems\",\n \"initialState\",\n \"rowEditValidator\",\n \"isTreeRowExpandable\",\n \"loadTreeChildren\"\n] as const;\n\nfunction copyOptionalOptions<TData>(\n source: GridOptions<TData>,\n target: ResolvedGridOptions<TData>\n): void {\n for (const key of OPTIONAL_OPTION_KEYS) {\n if (source[key]) Object.assign(target, { [key]: source[key] });\n }\n}\n\nfunction copyEventHandlers<TData>(source: GridOptions<TData>, target: ResolvedGridOptions<TData>): void {\n for (const key of Object.keys(source) as (keyof GridOptions<TData>)[]) {\n if (key.startsWith(\"on\") && typeof source[key] === \"function\") {\n Object.assign(target, { [key]: source[key] });\n }\n }\n}\n\nexport function resolveOptions<TData>(userOptions: GridOptions<TData>): ResolvedGridOptions<TData> {\n const size = resolveSize(userOptions.size);\n const resolved = {\n ...resolveDataAndLayout(userOptions, size),\n ...resolveAppearance(userOptions),\n ...resolveEditingAndHistory(userOptions),\n ...resolveHierarchy(userOptions),\n ...resolvePagination(userOptions),\n ...resolveWatermark(userOptions),\n ...resolveInteraction(userOptions),\n ...resolveDatasource(userOptions),\n ...resolveAccessibility(userOptions),\n features: Array.isArray(userOptions.features) ? userOptions.features : []\n } as ResolvedGridOptions<TData>;\n\n copyOptionalOptions(userOptions, resolved);\n copyEventHandlers(userOptions, resolved);\n\n return resolved;\n}\n\nexport function columnTypeNames(type: ColDef[\"type\"]): readonly string[] {\n if (Array.isArray(type)) return type.filter((name): name is string => typeof name === \"string\" && name.length > 0);\n return typeof type === \"string\" && type.length > 0 ? [type] : [];\n}\n\nexport function hasColumnType(colDef: Pick<ColDef, \"type\">, name: string): boolean {\n return columnTypeNames(colDef.type).includes(name);\n}\n\nexport function mergeColDef<TData>(\n colDef: ColDef<TData>,\n defaults: Partial<ColDef<TData>>,\n columnTypes: Readonly<Record<string, Partial<ColDef<TData>>>> = {}\n): ColDef<TData> {\n const typedDefaults: Partial<ColDef<TData>> = {};\n for (const name of columnTypeNames(colDef.type)) {\n const definition = columnTypes[name];\n if (definition) Object.assign(typedDefaults, definition);\n }\n return { ...defaults, ...typedDefaults, ...colDef } as ColDef<TData>;\n}\n","import type { ColDef, FilterType, PinnedDirection } from \"../types/colDef\";\nimport type { ColumnGroup } from \"./columnGroup\";\n\nexport class Column<TData = any> {\n readonly id: string;\n readonly colDef: ColDef<TData>;\n hide: boolean;\n pinned: PinnedDirection | null;\n manualWidth: number | null = null;\n flex: number | null = null;\n currentWidth = 0;\n parentGroup: ColumnGroup<TData> | null = null;\n level = 0;\n isDetailToggle = false;\n\n constructor(id: string, colDef: ColDef<TData>) {\n this.id = id;\n this.colDef = colDef;\n this.hide = colDef.hide ?? false;\n const p = colDef.pinned;\n this.pinned = p === true ? \"left\" : p === false || p == null ? null : p;\n this.resetWidth();\n }\n\n get sortable(): boolean {\n return this.colDef.sortable !== false;\n }\n\n get resizable(): boolean {\n return this.colDef.resizable !== false;\n }\n\n get movable(): boolean {\n return this.colDef.movable !== false;\n }\n\n get filterable(): boolean {\n return this.colDef.filter != null && this.colDef.filter !== false;\n }\n\n get filterType(): FilterType {\n const f = this.colDef.filter;\n return f === true ? \"text\" : (f as FilterType) ?? \"text\";\n }\n\n get hasCheckbox(): boolean {\n return this.colDef.checkboxSelection === true;\n }\n\n resetWidth(): void {\n this.manualWidth = null;\n this.flex = typeof this.colDef.flex === \"number\" && Number.isFinite(this.colDef.flex) && this.colDef.flex > 0\n ? this.colDef.flex\n : null;\n }\n}\n","import type { ColDefGroup } from \"../types/colDef\";\nimport type { Column } from \"./column\";\n\nexport class ColumnGroup<TData = any> {\n readonly groupId: string;\n readonly def: ColDefGroup<TData>;\n parent: ColumnGroup<TData> | null = null;\n children: (ColumnGroup<TData> | Column<TData>)[] = [];\n\n constructor(groupId: string, def: ColDefGroup<TData>) {\n this.groupId = groupId;\n this.def = def;\n }\n\n get headerName(): string {\n return this.def.headerName ?? this.def.groupId ?? \"\";\n }\n\n getLeafColumns(out: Column<TData>[] = []): Column<TData>[] {\n for (const child of this.children) {\n if (child instanceof ColumnGroup) child.getLeafColumns(out);\n else out.push(child);\n }\n return out;\n }\n}\n","import type {\n CellClassParams,\n CellEditorParams,\n CellRendererParams,\n EditableParams,\n HeaderComponentParams,\n ICellEditor,\n ICellRendererResult,\n ValueFormatterParams,\n ValueGetterParams,\n ValueSetterParams\n} from \"./params\";\nimport type { CellClickEvent, CellDoubleClickEvent } from \"./events\";\nimport type { RowNode } from \"./row\";\n\nexport type SortDirection = \"asc\" | \"desc\";\nexport type PinnedDirection = \"left\" | \"right\";\nexport type FilterType = \"text\" | \"number\" | \"date\" | \"set\";\nexport type CellAlign = \"left\" | \"center\" | \"right\";\n\nexport type TextFilterMatch =\n | \"contains\"\n | \"notContains\"\n | \"equals\"\n | \"notEquals\"\n | \"startsWith\"\n | \"endsWith\"\n | \"blank\"\n | \"notBlank\";\n\nexport type NumberFilterMatch =\n | \"equals\"\n | \"notEquals\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"inRange\"\n | \"blank\"\n | \"notBlank\";\n\nexport type DateFilterMatch =\n | \"equals\"\n | \"notEquals\"\n | \"lessThan\"\n | \"greaterThan\"\n | \"inRange\"\n | \"blank\"\n | \"notBlank\";\n\nexport interface TextFilterCondition {\n match: TextFilterMatch;\n value?: string;\n}\n\nexport interface NumberFilterCondition {\n match: NumberFilterMatch;\n value?: number;\n value2?: number;\n}\n\nexport interface DateFilterCondition {\n match: DateFilterMatch;\n value?: string;\n value2?: string;\n}\n\nexport interface SetFilterCondition {\n values: (string | number | null)[];\n}\n\nexport interface TextColumnFilter {\n type: \"text\";\n operator?: \"and\" | \"or\";\n conditions: TextFilterCondition[];\n}\n\nexport interface NumberColumnFilter {\n type: \"number\";\n operator?: \"and\" | \"or\";\n conditions: NumberFilterCondition[];\n}\n\nexport interface DateColumnFilter {\n type: \"date\";\n operator?: \"and\" | \"or\";\n conditions: DateFilterCondition[];\n}\n\nexport interface SetColumnFilter {\n type: \"set\";\n values: (string | number | null)[];\n}\n\nexport type ColumnFilter = TextColumnFilter | NumberColumnFilter | DateColumnFilter | SetColumnFilter;\nexport type FilterModel = Record<string, ColumnFilter>;\n\nexport interface SortModelItem {\n colId: string;\n direction: SortDirection;\n}\nexport type SortModel = SortModelItem[];\n\nexport interface SelectEditorParams {\n values: (string | number)[];\n}\n\nexport interface SetFilterParams {\n values?: (string | number | null)[];\n maxValues?: number;\n}\n\nexport type CellEditorFactory = (params: CellEditorParams) => ICellEditor;\n\nexport type CellRendererFn = (params: CellRendererParams) => string | HTMLElement | ICellRendererResult | null | undefined;\n\nexport type CellClassRule = string | string[] | ((params: CellClassParams) => string | string[] | null | undefined);\n\nexport type CellStyleRule = Partial<CSSStyleDeclaration> | ((params: CellClassParams<any, any>) => Partial<CSSStyleDeclaration> | null | undefined);\n\nexport interface ColDef<TData = any, TValue = any> {\n colId?: string;\n field?: string;\n headerName?: string;\n align?: CellAlign;\n headerAlign?: CellAlign;\n headerClass?: string | string[];\n headerTooltip?: string;\n headerComponent?: (params: HeaderComponentParams<TData>) => string | HTMLElement | ICellRendererResult | null | undefined;\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n /** Excludes the column from `columnLayout: \"fit\"` scaling. */\n suppressSizeToFit?: boolean;\n hide?: boolean;\n pinned?: PinnedDirection | boolean;\n sortable?: boolean;\n resizable?: boolean;\n movable?: boolean;\n filter?: boolean | FilterType;\n filterParams?: SetFilterParams;\n editable?: boolean | ((params: EditableParams<TData, TValue>) => boolean);\n cellEditor?: \"text\" | \"number\" | \"date\" | \"select\" | CellEditorFactory | string;\n cellEditorParams?: SelectEditorParams;\n wrapText?: boolean;\n checkboxSelection?: boolean;\n rowGroup?: boolean;\n aggFunc?: string;\n cellStyle?: CellStyleRule;\n selectable?: (params: CellClassParams<TData, TValue>) => boolean;\n singleClickEdit?: boolean;\n tooltipValueGetter?: (params: ValueFormatterParams<TData, TValue>) => string | null | undefined;\n rowSpan?: (params: CellClassParams<TData, TValue>) => number;\n autoRowSpan?: boolean;\n colSpan?: (params: CellClassParams<TData, TValue>) => number;\n autoHeight?: boolean;\n validate?: (\n newValue: TValue,\n params: ValueSetterParams<TData, TValue>\n ) => string | true | null | undefined | Promise<string | true | null | undefined>;\n rowDrag?: boolean;\n valueGetter?: (params: ValueGetterParams<TData, TValue>) => TValue;\n valueSetter?: (params: ValueSetterParams<TData, TValue>) => boolean;\n valueFormatter?: (params: ValueFormatterParams<TData, TValue>) => any;\n cellRenderer?: CellRendererFn | string;\n cellRendererParams?: Record<string, any>;\n cellClass?: CellClassRule;\n comparator?: (valueA: any, valueB: any, nodeA: RowNode<TData>, nodeB: RowNode<TData>) => number;\n /** Named column type(s), resolved left-to-right before this column definition. */\n type?: string | readonly string[];\n initialSort?: SortDirection;\n onCellClick?: (event: CellClickEvent<TData, TValue>) => void;\n onCellDoubleClick?: (event: CellDoubleClickEvent<TData, TValue>) => void;\n}\n\nexport interface ColDefGroup<TData = any> {\n groupId?: string;\n headerName?: string;\n headerClass?: string | string[];\n children: (ColDefGroup<TData> | ColDef<TData>)[];\n}\n\nexport type ColDefOrGroup<TData = any> = ColDefGroup<TData> | ColDef<TData>;\n\nexport function isColDefGroup<TData = any>(def: ColDefOrGroup<TData>): def is ColDefGroup<TData> {\n return Array.isArray((def as ColDefGroup<TData>).children);\n}\n\nexport interface ColumnState {\n colId: string;\n hide?: boolean;\n width?: number;\n /** Active flex weight. A resize clears flex and turns width into a manual override. */\n flex?: number | null;\n /** Distinguishes responsive/definition width from an explicit user or API override. */\n widthMode?: \"auto\" | \"manual\";\n pinned?: \"left\" | \"right\" | null;\n sort?: SortDirection | null;\n sortIndex?: number | null;\n}\n","export interface WidthInput {\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n}\n\nexport const DEFAULT_COLUMN_WIDTH = 150;\nexport const DEFAULT_MIN_WIDTH = 80;\n\nfunction positiveFinite(value: unknown, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction widthBounds(input: WidthInput): { min: number; max: number } {\n const min = positiveFinite(input.minWidth, DEFAULT_MIN_WIDTH);\n return { min, max: Math.max(min, positiveFinite(input.maxWidth, Number.MAX_SAFE_INTEGER)) };\n}\n\nexport function clampWidth(w: number, input: WidthInput): number {\n const { min, max } = widthBounds(input);\n const width = positiveFinite(w, positiveFinite(input.width, DEFAULT_COLUMN_WIDTH));\n return Math.max(min, Math.min(max, width));\n}\n\nexport function computeColumnWidths(cols: WidthInput[], availableWidth: number): number[] {\n const widths = cols.map((c) => clampWidth(c.width ?? DEFAULT_COLUMN_WIDTH, c));\n\n const flexCols: number[] = [];\n let flexTotal = 0;\n cols.forEach((c, i) => {\n const f = c.flex ?? 0;\n if (f > 0) {\n flexCols.push(i);\n flexTotal += f;\n }\n });\n\n let total = 0;\n for (const w of widths) total += w;\n\n if (flexTotal > 0 && availableWidth > total) {\n let extra = availableWidth - total;\n for (let pass = 0; pass < 4 && extra > 0.5 && flexCols.length > 0; pass++) {\n const remainingFlex: number[] = [];\n let remainingTotal = 0;\n for (const i of flexCols) {\n const f = cols[i].flex ?? 0;\n remainingFlex.push(i);\n remainingTotal += f;\n }\n const consumed: number[] = [];\n for (let k = 0; k < remainingFlex.length; k++) {\n const i = remainingFlex[k];\n const f = cols[i].flex ?? 0;\n const share = (extra * f) / remainingTotal;\n const before = widths[i];\n widths[i] = clampWidth(before + share, cols[i]);\n consumed.push(widths[i] - before);\n }\n let used = 0;\n for (const c of consumed) used += c;\n extra -= used;\n const stillFlexible = remainingFlex.filter((_index, k) => consumed[k] > 0.001);\n if (stillFlexible.length === remainingFlex.length) break;\n flexCols.length = 0;\n for (const i of stillFlexible) flexCols.push(i);\n }\n }\n\n return widths;\n}\n\n/** Fits columns into a viewport while honoring every min/max bound. */\nexport function fitColumnWidths(cols: WidthInput[], availableWidth: number): number[] {\n const widths = cols.map((column) => clampWidth(column.width ?? DEFAULT_COLUMN_WIDTH, column));\n if (!Number.isFinite(availableWidth) || availableWidth <= 0 || cols.length === 0) return widths;\n\n const active = new Set(cols.map((_column, index) => index));\n let remainingWidth = availableWidth;\n for (let pass = 0; pass < cols.length + 1 && active.size > 0; pass++) {\n let weightTotal = 0;\n for (const index of active) weightTotal += Math.max(1, widths[index]);\n if (weightTotal <= 0) break;\n\n let constrained = false;\n for (const index of [...active]) {\n const target = remainingWidth * (Math.max(1, widths[index]) / weightTotal);\n const fitted = clampWidth(target, cols[index]);\n const { min, max } = widthBounds(cols[index]);\n if (target < min || target > max) {\n widths[index] = fitted;\n remainingWidth -= fitted;\n active.delete(index);\n constrained = true;\n }\n }\n if (!constrained) {\n for (const index of active) {\n widths[index] = clampWidth(\n remainingWidth * (Math.max(1, widths[index]) / weightTotal),\n cols[index]\n );\n }\n break;\n }\n remainingWidth = Math.max(0, remainingWidth);\n }\n\n const drift = availableWidth - widths.reduce((sum, width) => sum + width, 0);\n if (Math.abs(drift) > 0.01) {\n for (let index = widths.length - 1; index >= 0; index--) {\n const candidate = clampWidth(widths[index] + drift, cols[index]);\n if (Math.abs(candidate - widths[index]) > 0.01) {\n widths[index] = candidate;\n break;\n }\n }\n }\n return widths;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { Column } from \"./column\";\nimport { ColumnGroup } from \"./columnGroup\";\nimport type {\n ColDef,\n ColDefOrGroup,\n ColumnState,\n SortModel,\n SortModelItem,\n SortDirection,\n PinnedDirection\n} from \"../types/colDef\";\nimport { isColDefGroup } from \"../types/colDef\";\nimport { mergeColDef } from \"../core/resolveOptions\";\nimport { computeColumnWidths, fitColumnWidths, clampWidth, DEFAULT_COLUMN_WIDTH } from \"../lib/layout\";\n\nexport type PaneType = \"left\" | \"center\" | \"right\";\n\nexport const DETAIL_TOGGLE_COL_ID = \"__rg_detail_toggle__\";\ntype ColumnModelContext = Pick<GridCore<any>, \"options\">;\n\nfunction isPositiveFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0;\n}\n\nexport class ColumnModel {\n private columns: Column[] = [];\n private rootChildren: (ColumnGroup<any> | Column<any>)[] = [];\n private left: Column[] = [];\n private center: Column[] = [];\n private right: Column[] = [];\n private sortModel: SortModelItem[] = [];\n private defs: ColDefOrGroup<any>[] = [];\n private headerDepth = 1;\n private flatIndexById = new Map<string, number>();\n viewportWidth = 0;\n\n constructor(private core: ColumnModelContext) {}\n\n setColumnDefs(colDefs: ColDefOrGroup<any>[] | null | undefined): void {\n this.defs = colDefs ? [...colDefs] : [];\n const prev = new Map(this.columns.map((c) => [c.id, c]));\n const defaults = this.core.options.defaultColDef;\n const usedIds = new Set<string>(\n this.core.options.masterDetail && this.core.options.detailToggleColumn\n ? [DETAIL_TOGGLE_COL_ID]\n : []\n );\n\n const build = (list: ColDefOrGroup<any>[], parent: ColumnGroup<any> | null, level: number): (ColumnGroup<any> | Column<any>)[] =>\n list.map((def, i) => {\n if (isColDefGroup(def)) {\n const groupId = def.groupId ?? def.headerName ?? `group_${i}_${level}`;\n const group = new ColumnGroup(groupId, def);\n group.parent = parent;\n group.children = build(def.children, group, level + 1);\n return group;\n }\n const colDef = def as ColDef<any>;\n const id = colDef.colId ?? colDef.field ?? `col_${i}`;\n let uniqueId = id;\n let suffix = 2;\n while (usedIds.has(uniqueId)) uniqueId = `${id}_${suffix++}`;\n usedIds.add(uniqueId);\n const column = new Column(uniqueId, mergeColDef(colDef, defaults, this.core.options.columnTypes));\n column.parentGroup = parent;\n column.level = level;\n const p = prev.get(uniqueId);\n if (p) {\n column.manualWidth = p.manualWidth;\n column.flex = p.flex;\n column.hide = p.hide;\n column.pinned = p.pinned;\n }\n return column;\n });\n\n this.rootChildren = build(this.defs, null, 0);\n\n if (this.core.options.masterDetail && this.core.options.detailToggleColumn) {\n const toggleCol = new Column(DETAIL_TOGGLE_COL_ID, {\n colId: DETAIL_TOGGLE_COL_ID,\n headerName: \"\",\n width: 38,\n pinned: \"left\",\n sortable: false,\n resizable: false,\n movable: false,\n filter: false\n });\n toggleCol.isDetailToggle = true;\n this.rootChildren.unshift(toggleCol);\n }\n\n this.columns = this.collectLeaves(this.rootChildren);\n this.headerDepth = this.columns.reduce((max, c) => Math.max(max, c.level + 1), 1);\n\n this.sortModel = this.sortModel.filter((s) => this.columns.some((c) => c.id === s.colId));\n if (this.sortModel.length === 0) {\n const initial: SortModelItem[] = [];\n for (const c of this.columns) {\n if (c.colDef.initialSort) initial.push({ colId: c.id, direction: c.colDef.initialSort });\n }\n this.sortModel = initial;\n }\n\n this.regroup();\n }\n\n private collectLeaves(children: (ColumnGroup<any> | Column<any>)[], out: Column<any>[] = []): Column<any>[] {\n for (const child of children) {\n if (child instanceof ColumnGroup) this.collectLeaves(child.children, out);\n else out.push(child);\n }\n return out;\n }\n\n private regroup(): void {\n const visible = this.columns.filter((c) => !c.hide);\n this.left = visible.filter((c) => c.pinned === \"left\");\n this.right = visible.filter((c) => c.pinned === \"right\");\n this.center = visible.filter((c) => c.pinned === null);\n this.flatIndexById.clear();\n this.getOrderedVisible().forEach((c, i) => this.flatIndexById.set(c.id, i));\n }\n\n getFlatIndex(colId: string): number {\n return this.flatIndexById.get(colId) ?? -1;\n }\n\n getColumns(): Column[] {\n return this.columns;\n }\n\n getColumnDefs(): ColDefOrGroup<any>[] {\n return this.defs;\n }\n\n getRootChildren(): (ColumnGroup<any> | Column<any>)[] {\n return this.rootChildren;\n }\n\n getHeaderDepth(): number {\n return this.headerDepth;\n }\n\n getColumn(colId: string): Column | undefined {\n return this.columns.find((c) => c.id === colId);\n }\n\n getPaneColumns(pane: PaneType): Column[] {\n return pane === \"left\" ? this.left : pane === \"right\" ? this.right : this.center;\n }\n\n getOrderedVisible(): Column[] {\n return [...this.left, ...this.center, ...this.right];\n }\n\n getRowGroupColumns(): Column[] {\n return this.getOrderedVisible().filter((c) => c.colDef.rowGroup === true);\n }\n\n getAggColumns(): Column[] {\n return this.getOrderedVisible().filter((c) => c.colDef.aggFunc != null && c.colDef.rowGroup !== true);\n }\n\n hasColSpan(): boolean {\n return this.center.some((c) => c.colDef.colSpan != null);\n }\n\n getGroupLabelColumn(): Column | undefined {\n const ordered = this.getOrderedVisible();\n return (\n this.center.find((c) => !c.hasCheckbox && !c.isDetailToggle) ??\n ordered.find((c) => !c.hasCheckbox && !c.isDetailToggle) ??\n ordered[0]\n );\n }\n\n paneOf(column: Column): PaneType {\n return column.pinned === \"left\" ? \"left\" : column.pinned === \"right\" ? \"right\" : \"center\";\n }\n\n computeLayout(viewportWidth: number): void {\n this.viewportWidth = viewportWidth;\n\n let pinnedTotal = 0;\n for (const c of [...this.left, ...this.right]) {\n c.currentWidth = clampWidth(c.manualWidth ?? c.colDef.width ?? DEFAULT_COLUMN_WIDTH, this.widthInputOf(c));\n pinnedTotal += c.currentWidth;\n }\n\n const available = Math.max(0, viewportWidth - pinnedTotal);\n const scalable: Column[] = [];\n const fixed: Column[] = [];\n for (const column of this.center) {\n (column.colDef.suppressSizeToFit || column.manualWidth != null ? fixed : scalable).push(column);\n }\n let fixedTotal = 0;\n for (const column of fixed) {\n column.currentWidth = clampWidth(\n column.manualWidth ?? column.colDef.width ?? DEFAULT_COLUMN_WIDTH,\n this.widthInputOf(column)\n );\n fixedTotal += column.currentWidth;\n }\n const scalableInputs = scalable.map((column) => this.widthInputOf(column));\n const scalableWidth = Math.max(0, available - fixedTotal);\n const widths = this.core.options.columnLayout === \"fit\"\n ? fitColumnWidths(scalableInputs, scalableWidth)\n : computeColumnWidths(scalableInputs, scalableWidth);\n scalable.forEach((column, index) => {\n column.currentWidth = widths[index];\n });\n }\n\n private widthInputOf(c: Column): { width?: number; minWidth?: number; maxWidth?: number; flex?: number } {\n const def = c.colDef;\n if (c.manualWidth != null) {\n return { width: c.manualWidth, minWidth: def.minWidth, maxWidth: def.maxWidth };\n }\n return {\n width: def.width,\n minWidth: def.minWidth,\n maxWidth: def.maxWidth,\n ...(c.flex != null ? { flex: c.flex } : {})\n };\n }\n\n setColumnWidth(column: Column, width: number): boolean {\n if (!isPositiveFiniteNumber(width)) return false;\n column.manualWidth = clampWidth(width, this.widthInputOf(column));\n column.flex = null;\n return true;\n }\n\n setColumnVisibility(colId: string, visible: boolean): void {\n const column = this.getColumn(colId);\n if (!column || column.hide === !visible) return;\n column.hide = !visible;\n this.regroup();\n }\n\n moveColumn(colId: string, toIndex: number): boolean {\n const column = this.getColumn(colId);\n if (!column) return false;\n\n const pane = this.paneOf(column);\n const inScope = (child: Column<any>) =>\n column.parentGroup ? true : this.paneOf(child) === pane;\n\n const container: (ColumnGroup<any> | Column<any>)[] = column.parentGroup\n ? column.parentGroup.children\n : this.rootChildren;\n\n const siblings = container.filter(\n (child): child is Column<any> => child instanceof Column && !child.hide && inScope(child)\n );\n const from = siblings.indexOf(column);\n if (from < 0) return false;\n siblings.splice(from, 1);\n const target = Math.max(0, Math.min(toIndex, siblings.length));\n siblings.splice(target, 0, column);\n\n const leafSlots: number[] = [];\n container.forEach((child, idx) => {\n if (child instanceof Column && !child.hide && inScope(child)) leafSlots.push(idx);\n });\n if (leafSlots.length !== siblings.length) return false;\n leafSlots.forEach((slotIdx, i) => {\n container[slotIdx] = siblings[i];\n });\n\n this.columns = this.collectLeaves(this.rootChildren);\n this.regroup();\n return true;\n }\n\n setColumnPinned(colId: string, pinned: PinnedDirection | null): void {\n const column = this.getColumn(colId);\n if (!column) return;\n column.pinned = pinned;\n this.regroup();\n }\n\n getColumnState(): ColumnState[] {\n return this.columns.map((c) => {\n const sortIndex = this.sortModel.findIndex((s) => s.colId === c.id);\n const state: ColumnState = {\n colId: c.id,\n hide: c.hide,\n width: c.manualWidth ?? c.currentWidth,\n flex: c.flex,\n widthMode: c.manualWidth == null ? \"auto\" : \"manual\",\n pinned: c.pinned\n };\n if (sortIndex >= 0) {\n state.sort = this.sortModel[sortIndex].direction;\n state.sortIndex = sortIndex;\n } else {\n state.sort = null;\n state.sortIndex = null;\n }\n return state;\n });\n }\n\n applyColumnState(states: ColumnState[]): void {\n const stateById = new Map(states.map((s) => [s.colId, s]));\n for (const c of this.columns) {\n const s = stateById.get(c.id);\n if (s) this.applyColumnViewState(c, s);\n }\n this.sortModel = this.sortModelFromState(states);\n this.applyStateOrder(states);\n this.regroup();\n }\n\n private applyColumnViewState(column: Column, state: ColumnState): void {\n if (typeof state.hide === \"boolean\") column.hide = state.hide;\n if (state.widthMode === \"auto\") {\n column.resetWidth();\n if (isPositiveFiniteNumber(state.flex)) column.flex = state.flex;\n } else if (isPositiveFiniteNumber(state.flex)) {\n column.flex = state.flex;\n column.manualWidth = null;\n } else if (isPositiveFiniteNumber(state.width)) {\n column.manualWidth = clampWidth(state.width, this.widthInputOf(column));\n column.flex = null;\n }\n if (state.pinned === \"left\" || state.pinned === \"right\" || state.pinned === null) {\n column.pinned = state.pinned;\n }\n }\n\n private sortModelFromState(states: ColumnState[]): SortModelItem[] {\n const knownIds = new Set(this.columns.map((column) => column.id));\n const seenIds = new Set<string>();\n const nextSort: { colId: string; direction: SortDirection; sortIndex: number }[] = [];\n for (const s of states) {\n if ((s.sort !== \"asc\" && s.sort !== \"desc\") || !knownIds.has(s.colId) || seenIds.has(s.colId)) continue;\n seenIds.add(s.colId);\n const sortIndex = typeof s.sortIndex === \"number\" && Number.isInteger(s.sortIndex) && s.sortIndex >= 0\n ? s.sortIndex\n : nextSort.length;\n nextSort.push({ colId: s.colId, direction: s.sort, sortIndex });\n }\n nextSort.sort((a, b) => a.sortIndex - b.sortIndex);\n return nextSort.map(({ colId, direction }) => ({ colId, direction }));\n }\n\n private applyStateOrder(states: ColumnState[]): void {\n const orderById = new Map<string, number>();\n states.forEach((s, i) => orderById.set(s.colId, i));\n const paneOfCol = (c: Column) => (c.pinned === \"left\" ? \"left\" : c.pinned === \"right\" ? \"right\" : \"center\");\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const current = this.rootChildren.filter(\n (child): child is Column<any> =>\n child instanceof Column && !child.hide && child.parentGroup === null && paneOfCol(child) === pane\n );\n if (current.length < 2) continue;\n const sorted = current\n .slice()\n .sort((a, b) => (orderById.get(a.id) ?? Number.MAX_SAFE_INTEGER) - (orderById.get(b.id) ?? Number.MAX_SAFE_INTEGER));\n if (sorted.every((c, i) => c === current[i])) continue;\n\n const slots: number[] = [];\n this.rootChildren.forEach((child, idx) => {\n if (child instanceof Column && !child.hide && child.parentGroup === null && paneOfCol(child) === pane) {\n slots.push(idx);\n }\n });\n slots.forEach((slotIdx, i) => {\n this.rootChildren[slotIdx] = sorted[i];\n });\n }\n this.columns = this.collectLeaves(this.rootChildren);\n }\n\n resetColumnState(): void {\n for (const c of this.columns) {\n c.resetWidth();\n c.hide = c.colDef.hide ?? false;\n const p = c.colDef.pinned;\n c.pinned = p === true ? \"left\" : p === false || p == null ? null : p;\n }\n this.sortModel = [];\n this.regroup();\n }\n\n getSortModel(): SortModel {\n return this.sortModel.map((s) => ({ ...s }));\n }\n\n applySortModel(sortModel: SortModel | null): void {\n if (!sortModel || sortModel.length === 0) {\n this.sortModel = [];\n return;\n }\n this.sortModel = sortModel\n .filter((s) => this.columns.some((c) => c.id === s.colId) && (s.direction === \"asc\" || s.direction === \"desc\"))\n .map((s) => ({ colId: s.colId, direction: s.direction }));\n }\n\n cycleSort(column: Column, additive: boolean): void {\n const model = [...this.sortModel];\n const idx = model.findIndex((s) => s.colId === column.id);\n const current = idx >= 0 ? model[idx].direction : null;\n const next: SortDirection | null = current === null ? \"asc\" : current === \"asc\" ? \"desc\" : null;\n const multi = additive && this.core.options.multiSort;\n\n if (multi) {\n if (next === null) {\n if (idx >= 0) model.splice(idx, 1);\n } else if (idx >= 0) {\n model[idx] = { colId: column.id, direction: next };\n } else {\n model.push({ colId: column.id, direction: next });\n }\n } else {\n model.length = 0;\n if (next) model.push({ colId: column.id, direction: next });\n }\n this.sortModel = model;\n }\n}\n","import type { ColumnFilter, FilterModel, TextFilterCondition, NumberFilterCondition, DateFilterCondition } from \"../types/colDef\";\nimport type { AdvancedFilterModel, AdvancedFilterNode } from \"../types/advancedFilter\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"./column\";\n\nfunction textOf(value: any): string {\n return value == null ? \"\" : String(value).toLowerCase();\n}\n\nexport function evaluateTextFilter(value: any, conditions: TextFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const v = textOf(value);\n const results = conditions.map((c) => {\n const fv = (c.value ?? \"\").toLowerCase();\n switch (c.match) {\n case \"contains\":\n return v.includes(fv);\n case \"notContains\":\n return !v.includes(fv);\n case \"equals\":\n return v === fv;\n case \"notEquals\":\n return v !== fv;\n case \"startsWith\":\n return v.startsWith(fv);\n case \"endsWith\":\n return v.endsWith(fv);\n case \"blank\":\n return v === \"\";\n case \"notBlank\":\n return v !== \"\";\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nexport function evaluateNumberFilter(value: any, conditions: NumberFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const results = conditions.map((c) => {\n const isBlank = value == null || value === \"\";\n if (c.match === \"blank\") return isBlank;\n if (c.match === \"notBlank\") return !isBlank;\n if (isBlank) return false;\n const n = typeof value === \"number\" ? value : Number(value);\n if (isNaN(n)) return false;\n const f = c.value;\n if (f == null || isNaN(f)) return false;\n switch (c.match) {\n case \"equals\":\n return n === f;\n case \"notEquals\":\n return n !== f;\n case \"lessThan\":\n return n < f;\n case \"lessThanOrEqual\":\n return n <= f;\n case \"greaterThan\":\n return n > f;\n case \"greaterThanOrEqual\":\n return n >= f;\n case \"inRange\":\n return n >= f && n <= (c.value2 ?? f);\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nfunction toTime(value: any): number | null {\n if (value == null || value === \"\") return null;\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value.getTime();\n if (typeof value === \"number\") return value;\n const t = Date.parse(String(value));\n return isNaN(t) ? null : t;\n}\n\nexport function evaluateDateFilter(value: any, conditions: DateFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const results = conditions.map((c) => {\n const isBlank = toTime(value) == null;\n if (c.match === \"blank\") return isBlank;\n if (c.match === \"notBlank\") return !isBlank;\n if (isBlank) return false;\n const t = toTime(value)!;\n const f = c.value != null ? toTime(c.value) : null;\n if (f == null) return false;\n switch (c.match) {\n case \"equals\":\n return t === f;\n case \"notEquals\":\n return t !== f;\n case \"lessThan\":\n return t < f;\n case \"greaterThan\":\n return t > f;\n case \"inRange\": {\n const f2 = c.value2 != null ? toTime(c.value2) : null;\n return f2 != null ? t >= f && t <= f2 : t >= f;\n }\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nexport function evaluateSetFilter(value: any, filterValues: (string | number | null)[]): boolean {\n if (filterValues.length === 0) return true;\n return filterValues.some((v) => (v == null && value == null) || v === value);\n}\n\nexport function evaluateColumnFilter(value: any, filter: ColumnFilter): boolean {\n const operator = filter.type !== \"set\" && filter.operator === \"or\" ? \"or\" : \"and\";\n switch (filter.type) {\n case \"text\":\n return evaluateTextFilter(value, filter.conditions, operator);\n case \"number\":\n return evaluateNumberFilter(value, filter.conditions, operator);\n case \"date\":\n return evaluateDateFilter(value, filter.conditions, operator);\n case \"set\":\n return evaluateSetFilter(value, filter.values);\n default:\n return true;\n }\n}\n\nfunction evaluateAdvancedNode(\n node: AdvancedFilterNode,\n columns: ReadonlyMap<string, Column>,\n row: RowNode<any>,\n getCellValue: (row: RowNode<any>, column: Column) => any\n): boolean {\n if (node.kind === \"condition\") {\n const column = columns.get(node.colId);\n return !column || evaluateColumnFilter(getCellValue(row, column), node.filter);\n }\n const passed = node.operator === \"or\"\n ? node.children.some((child) => evaluateAdvancedNode(child, columns, row, getCellValue))\n : node.children.every((child) => evaluateAdvancedNode(child, columns, row, getCellValue));\n return node.not ? !passed : passed;\n}\n\nexport function evaluateAdvancedFilter(\n row: RowNode<any>,\n columns: Column[],\n model: AdvancedFilterModel | null,\n getCellValue: (row: RowNode<any>, column: Column) => any\n): boolean {\n if (!model) return true;\n return evaluateAdvancedNode(model.root, new Map(columns.map((column) => [column.id, column])), row, getCellValue);\n}\n\nexport function doesNodePassFilters(\n node: RowNode<any>,\n columns: Column[],\n filterModel: FilterModel,\n advancedFilterModel: AdvancedFilterModel | null,\n quickFilter: string | null,\n getCellValue: (node: RowNode<any>, column: Column) => any\n): boolean {\n for (const colId of Object.keys(filterModel)) {\n const filter = filterModel[colId];\n const column = columns.find((c) => c.id === colId);\n if (!column) continue;\n const value = getCellValue(node, column);\n if (!evaluateColumnFilter(value, filter)) return false;\n }\n\n if (!evaluateAdvancedFilter(node, columns, advancedFilterModel, getCellValue)) return false;\n\n if (quickFilter && quickFilter.trim() !== \"\") {\n const tokens = quickFilter.trim().toLowerCase().split(/\\s+/);\n for (const token of tokens) {\n const hit = columns.some((column) => textOf(getCellValue(node, column)).includes(token));\n if (!hit) return false;\n }\n }\n\n return true;\n}\n","const collator = typeof Intl !== \"undefined\"\n ? new Intl.Collator(undefined, { numeric: true, sensitivity: \"base\" })\n : null;\n\nexport function defaultComparator(valueA: any, valueB: any): number {\n const aEmpty = valueA == null || valueA === \"\";\n const bEmpty = valueB == null || valueB === \"\";\n if (aEmpty && bEmpty) return 0;\n if (aEmpty) return 1;\n if (bEmpty) return -1;\n\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n if (isNaN(valueA) && isNaN(valueB)) return 0;\n if (isNaN(valueA)) return 1;\n if (isNaN(valueB)) return -1;\n return valueA - valueB;\n }\n if (valueA instanceof Date && valueB instanceof Date) {\n return valueA.getTime() - valueB.getTime();\n }\n if (typeof valueA === \"boolean\" && typeof valueB === \"boolean\") {\n return valueA === valueB ? 0 : valueA ? 1 : -1;\n }\n const a = String(valueA);\n const b = String(valueB);\n return collator ? collator.compare(a, b) : a.localeCompare(b);\n}\n","import { defaultComparator } from \"../lib/compare\";\nimport type { SortModel } from \"../types/colDef\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"./column\";\n\nexport function sortNodes<TData>(\n nodes: RowNode<TData>[],\n sortModel: SortModel,\n columns: Column[],\n getCellValue: (node: RowNode<TData>, column: Column) => any\n): RowNode<TData>[] {\n const colById = new Map<string, Column>();\n for (const c of columns) colById.set(c.id, c);\n\n const comparators: ((a: any, b: any, na: RowNode<TData>, nb: RowNode<TData>) => number)[] = [];\n const directions: (\"asc\" | \"desc\")[] = [];\n for (const item of sortModel) {\n const column = colById.get(item.colId);\n if (!column) continue;\n comparators.push(column.colDef.comparator ?? defaultComparator);\n directions.push(item.direction);\n }\n\n const decorated = nodes.map((node) => ({\n node,\n values: sortModel.map((s) => getCellValue(node, colById.get(s.colId)!))\n }));\n\n decorated.sort((a, b) => {\n for (let i = 0; i < comparators.length; i++) {\n const r = comparators[i](a.values[i], b.values[i], a.node, b.node);\n if (r !== 0) return directions[i] === \"asc\" ? r : -r;\n }\n return 0;\n });\n\n return decorated.map((d) => d.node);\n}\n","export type AggValues = Record<string, any>;\n\nexport type AggFunction = (values: any[]) => any;\n\nfunction numeric(values: any[]): number[] {\n return values.filter((v): v is number => typeof v === \"number\" && !isNaN(v));\n}\n\nexport const BUILTIN_AGG_FUNCS: Record<string, AggFunction> = {\n sum: (values) => numeric(values).reduce((acc, v) => acc + v, 0),\n avg: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : nums.reduce((acc, v) => acc + v, 0) / nums.length;\n },\n count: (values) => values.length,\n min: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : Math.min(...nums);\n },\n max: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : Math.max(...nums);\n },\n first: (values) => (values.length > 0 ? values[0] : null),\n last: (values) => (values.length > 0 ? values[values.length - 1] : null)\n};\n\nexport function createAggResolver(custom?: Record<string, AggFunction>): (name: string) => AggFunction | undefined {\n const merged = { ...BUILTIN_AGG_FUNCS, ...(custom ?? {}) };\n return (name: string) => merged[name];\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\nimport type { FilterModel } from \"../types/colDef\";\nimport type { AdvancedFilterModel } from \"../types/advancedFilter\";\nimport type { RowTransaction } from \"../types/api\";\nimport { doesNodePassFilters } from \"./filterService\";\nimport { sortNodes } from \"./sortService\";\nimport { createAggResolver } from \"../lib/aggregate\";\nimport { defaultComparator } from \"../lib/compare\";\nimport { normalizeAdvancedFilterModel, normalizeFilterModel } from \"../lib/advancedFilter\";\n\ntype ColumnLike = import(\"./column\").Column;\ntype RowModelContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"changeTracker\"\n | \"columnModel\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"getLocaleText\"\n | \"headerRenderer\"\n | \"isDestroyed\"\n | \"nextId\"\n | \"options\"\n | \"relayout\"\n | \"reportError\"\n | \"selectionService\"\n | \"skeleton\"\n | \"undoService\"\n>;\n\nfunction readChildren(data: unknown, key: string): unknown[] | undefined {\n if (data == null || typeof data !== \"object\") return undefined;\n const value = (data as Record<string, unknown>)[key];\n return Array.isArray(value) ? value : undefined;\n}\n\nexport class RowModel<TData = any> {\n private all: RowNode<TData>[] = [];\n private roots: RowNode<TData>[] = [];\n private childIds = new Map<string, string[]>();\n private displayed: RowNode<TData>[] = [];\n private nodesById = new Map<string, RowNode<TData>>();\n private filterModel: FilterModel = {};\n private advancedFilterModel: AdvancedFilterModel | null = null;\n private quickFilter: string | null = null;\n private expandedIds = new Set<string>();\n private groupExpandedIds = new Set<string>();\n private knownGroupIds: string[] = [];\n private spanInfo = new Map<string, Int32Array>();\n private mastersBuf: RowNode<TData>[] = [];\n private infiniteLastRow: number | null = null;\n private infiniteRequested = false;\n private infiniteLoading = false;\n private infiniteSeq = 0;\n private infiniteAbort: AbortController | null = null;\n private infiniteRetryTimer: ReturnType<typeof setTimeout> | null = null;\n private infinitePendingResolve: (() => void) | null = null;\n private treeDepth = new WeakMap<RowNode<TData>, number>();\n private rowSequence = new WeakMap<RowNode<TData>, number>();\n private treeLoadControllers = new Map<string, AbortController>();\n private treeLoadPromises = new Map<string, Promise<readonly TData[]>>();\n\n constructor(private core: RowModelContext) {\n this.advancedFilterModel = normalizeAdvancedFilterModel(core.options.advancedFilterModel);\n }\n\n resolveRowId(data: TData, index: number, fallback: string): string {\n const getRowId = this.core.options.getRowId;\n if (!getRowId) return fallback;\n try {\n const id = getRowId({ data, index, api: this.core.getApi() });\n if (typeof id === \"string\" && id.length > 0) return id;\n this.core.reportError(new Error(\"getRowId must return a non-empty string\"), \"getRowId\", { index });\n } catch (error) {\n this.core.reportError(error, \"getRowId\", { index });\n }\n return fallback;\n }\n\n get isTree(): boolean {\n return this.core.options.treeData;\n }\n\n get isInfinite(): boolean {\n return this.core.options.datasource != null;\n }\n\n getDisplayTotalCount(): number {\n if (this.isInfinite) {\n const detailRows = Math.max(0, this.displayed.length - this.all.length);\n return (this.infiniteLastRow ?? this.all.length) + detailRows;\n }\n return this.displayed.length;\n }\n\n isLoadingInfinite(): boolean {\n return this.infiniteLoading;\n }\n\n startInfinite(): Promise<void> {\n if (!this.isInfinite) return Promise.resolve();\n this.cancelInfiniteRequest();\n this.infiniteLastRow = null;\n this.infiniteRequested = false;\n this.all = [];\n this.roots = [];\n this.nodesById.clear();\n this.expandedIds.clear();\n this.core.undoService.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return this.loadBlock(0);\n }\n\n reloadInfinite(): Promise<void> {\n if (!this.isInfinite) return Promise.resolve();\n return this.startInfinite();\n }\n\n private setInfiniteLoading(v: boolean): void {\n this.infiniteLoading = v;\n this.core.skeleton.setInfiniteLoading(v, this.core.getLocaleText(\"loading\"));\n }\n\n private loadBlock(start: number, end?: number): Promise<void> {\n if (!this.isInfinite || this.infiniteRequested) return Promise.resolve();\n if (this.infiniteLastRow != null && start >= this.infiniteLastRow) return Promise.resolve();\n const datasource = this.core.options.datasource!;\n const blockSize = this.core.options.blockSize;\n const stop = end ?? start + blockSize;\n if (stop <= start) return Promise.resolve();\n const seq = ++this.infiniteSeq;\n const controller = new AbortController();\n this.infiniteAbort = controller;\n this.infiniteRequested = true;\n this.setInfiniteLoading(true);\n\n return new Promise<void>((resolve) => {\n let settled = false;\n let attempt = 0;\n this.infinitePendingResolve = resolve;\n const done = (reason?: unknown) => {\n if (settled) return;\n settled = true;\n if (seq === this.infiniteSeq) {\n this.infiniteRequested = false;\n this.infiniteAbort = null;\n this.infinitePendingResolve = null;\n this.setInfiniteLoading(false);\n if (reason != null && (reason as { name?: string })?.name !== \"AbortError\") {\n this.core.reportError(reason, \"datasource.getRows\", { startRow: start, endRow: stop });\n }\n }\n resolve();\n };\n\n const runAttempt = () => {\n if (settled || seq !== this.infiniteSeq || controller.signal.aborted || this.core.isDestroyed()) {\n done();\n return;\n }\n attempt++;\n let attemptSettled = false;\n const failAttempt = (reason?: unknown) => {\n if (attemptSettled || settled) return;\n attemptSettled = true;\n if (seq !== this.infiniteSeq || controller.signal.aborted || this.core.isDestroyed()) {\n done();\n return;\n }\n if (attempt <= this.core.options.datasourceRetryCount) {\n const delay = Math.min(\n this.core.options.datasourceRetryDelay * 2 ** Math.max(0, attempt - 1),\n 30_000\n );\n this.infiniteRetryTimer = setTimeout(() => {\n this.infiniteRetryTimer = null;\n runAttempt();\n }, delay);\n return;\n }\n done(reason ?? new Error(\"Datasource request failed\"));\n };\n\n try {\n const request = datasource.getRows({\n startRow: start,\n endRow: stop,\n sortModel: this.core.columnModel.getSortModel(),\n filterModel: this.getFilterModel(),\n advancedFilterModel: this.getAdvancedFilterModel(),\n quickFilterText: this.quickFilter,\n signal: controller.signal,\n onSuccess: (rows, lastRow) => {\n if (attemptSettled || settled) return;\n attemptSettled = true;\n if (seq !== this.infiniteSeq || this.core.isDestroyed() || controller.signal.aborted) {\n done();\n return;\n }\n const received = rows ?? [];\n if (typeof lastRow === \"number\" && lastRow >= 0) {\n this.infiniteLastRow = lastRow;\n } else if (received.length < stop - start) {\n this.infiniteLastRow = start + received.length;\n }\n const wasEmpty = this.all.length === 0;\n this.appendInfiniteRows(received);\n done();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n if (wasEmpty) this.core.relayout();\n this.core.headerRenderer.refreshSelectAllCheckbox();\n },\n fail: failAttempt\n });\n if (request && typeof request.catch === \"function\") {\n void request.catch(failAttempt);\n }\n } catch (error) {\n failAttempt(error);\n }\n };\n\n runAttempt();\n });\n }\n\n private cancelInfiniteRequest(): void {\n this.infiniteSeq++;\n if (this.infiniteRetryTimer != null) clearTimeout(this.infiniteRetryTimer);\n this.infiniteRetryTimer = null;\n this.infiniteAbort?.abort();\n this.infiniteAbort = null;\n this.infiniteRequested = false;\n this.setInfiniteLoading(false);\n this.infinitePendingResolve?.();\n this.infinitePendingResolve = null;\n }\n\n private appendInfiniteRows(rows: TData[]): void {\n for (const data of rows) {\n if (data == null) continue;\n const index = this.all.length;\n const id = this.resolveRowId(data, index, `inf-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"datasource.getRows\", { rowId: id });\n continue;\n }\n const node: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: this.core.selectionService.isSelected(id)\n };\n this.all.push(node);\n this.nodesById.set(id, node);\n this.roots.push(node);\n }\n }\n\n checkInfiniteScroll(lastVisibleIndex: number): void {\n if (!this.isInfinite || this.infiniteRequested) return;\n const loaded = this.all.length;\n if (this.infiniteLastRow != null && loaded >= this.infiniteLastRow) return;\n const buffer = this.core.options.infiniteBufferRows;\n if (lastVisibleIndex + buffer < loaded && lastVisibleIndex < loaded) return;\n const blockSize = this.core.options.blockSize;\n const stop = this.infiniteLastRow == null\n ? loaded + blockSize\n : Math.min(this.infiniteLastRow, loaded + blockSize);\n void this.loadBlock(loaded, stop);\n }\n\n onServerParamsChanged(): Promise<void> {\n return this.reloadInfinite();\n }\n\n onDatasourceChanged(): Promise<void> {\n this.cancelInfiniteRequest();\n if (this.isInfinite) return this.startInfinite();\n this.infiniteLastRow = null;\n this.setRowData(this.core.options.rowData);\n this.core.bodyRenderer.onDataChanged();\n return Promise.resolve();\n }\n\n destroy(): void {\n this.cancelInfiniteRequest();\n this.cancelTreeLoads();\n }\n\n setRowData(rows: TData[] | null | undefined): void {\n this.cancelTreeLoads();\n this.core.changeTracker.clear();\n const getRowId = this.core.options.getRowId;\n const childrenKey = this.core.options.childrenKey;\n const next: RowNode<TData>[] = [];\n const roots: RowNode<TData>[] = [];\n const byId = new Map<string, RowNode<TData>>();\n const childIds = new Map<string, string[]>();\n let autoSeq = 0;\n\n const buildNode = (data: TData, depth: number, parentId: string | null): RowNode<TData> | null => {\n const index = autoSeq++;\n const id = this.resolveRowId(data, index, `auto-${index}`);\n if (byId.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"rowData\", { rowId: id, index });\n return null;\n }\n const children = this.isTree ? readChildren(data, childrenKey) : undefined;\n const node: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: false,\n treeChildrenLoaded: Array.isArray(children)\n };\n this.treeDepth.set(node, depth);\n next.push(node);\n byId.set(id, node);\n if (parentId != null) {\n const list = childIds.get(parentId) ?? [];\n list.push(id);\n childIds.set(parentId, list);\n } else {\n roots.push(node);\n }\n if (this.isTree && Array.isArray(children)) {\n for (const child of children) {\n if (child != null) buildNode(child as TData, depth + 1, id);\n }\n }\n return node;\n };\n\n (rows ?? []).forEach((data) => {\n if (data != null) buildNode(data, 0, null);\n });\n\n this.all = next;\n this.roots = roots;\n this.childIds = childIds;\n this.nodesById = byId;\n this.core.undoService.clear();\n for (const id of [...this.expandedIds]) {\n if (!byId.has(id)) this.expandedIds.delete(id);\n }\n if (this.core.options.defaultExpandAll) {\n for (const node of next) {\n if (this.getChildrenCount(node.id) > 0) this.expandedIds.add(node.id);\n }\n }\n\n this.core.selectionService.onRowsRebuilt(getRowId != null);\n this.refreshPipeline();\n }\n\n getChildrenIds(id: string): string[] {\n return this.childIds.get(id) ?? [];\n }\n\n getChildrenCount(id: string): number {\n return this.childIds.get(id)?.length ?? 0;\n }\n\n hasChildren(id: string): boolean {\n return this.getChildrenCount(id) > 0;\n }\n\n isTreeRowLoading(id: string): boolean {\n return this.nodesById.get(id)?.treeLoading === true;\n }\n\n private cancelTreeLoads(): void {\n for (const controller of this.treeLoadControllers.values()) controller.abort();\n this.treeLoadControllers.clear();\n this.treeLoadPromises.clear();\n }\n\n loadTreeChildren(id: string, force = false): Promise<readonly TData[]> {\n const node = this.nodesById.get(id);\n const loader = this.core.options.loadTreeChildren;\n if (!this.isTree || !node?.data || !loader) return Promise.resolve([]);\n if (!force && node.treeChildrenLoaded) {\n return Promise.resolve(this.getChildrenIds(id).flatMap((childId) => {\n const data = this.nodesById.get(childId)?.data;\n return data == null ? [] : [data];\n }));\n }\n const pending = this.treeLoadPromises.get(id);\n if (pending && !force) return pending;\n this.treeLoadControllers.get(id)?.abort();\n const controller = new AbortController();\n this.treeLoadControllers.set(id, controller);\n node.treeLoading = true;\n node.treeLoadError = undefined;\n this.core.bodyRenderer.onDataChanged();\n\n const request = Promise.resolve().then(() => loader({\n data: node.data!,\n node,\n api: this.core.getApi(),\n signal: controller.signal\n })).then((children) => {\n if (controller.signal.aborted || this.core.isDestroyed()) return [];\n if (!Array.isArray(children)) {\n throw new TypeError(\"[MachTable] loadTreeChildren must resolve to an array.\");\n }\n this.replaceTreeChildren(node, children as readonly TData[]);\n node.treeChildrenLoaded = true;\n node.treeLoadError = undefined;\n this.core.emit(\"treeChildrenLoaded\", { rowId: id, rowNode: node, children });\n return children;\n }).catch((error: unknown) => {\n if (controller.signal.aborted || (error as { name?: string })?.name === \"AbortError\") return [];\n node.treeLoadError = error;\n node.treeChildrenLoaded = false;\n this.core.reportError(error, \"treeData.loadChildren\", { rowId: id });\n this.core.emit(\"treeChildrenLoadFailed\", { rowId: id, rowNode: node, error });\n throw error;\n }).finally(() => {\n if (this.treeLoadControllers.get(id) === controller) {\n this.treeLoadControllers.delete(id);\n this.treeLoadPromises.delete(id);\n node.treeLoading = false;\n this.core.bodyRenderer.onDataChanged();\n }\n });\n this.treeLoadPromises.set(id, request);\n return request;\n }\n\n private replaceTreeChildren(parent: RowNode<TData>, children: readonly TData[]): void {\n const removed = new Set<string>();\n const stack = [...this.getChildrenIds(parent.id)];\n while (stack.length > 0) {\n const childId = stack.pop()!;\n if (removed.has(childId)) continue;\n removed.add(childId);\n stack.push(...this.getChildrenIds(childId));\n }\n this.validateTreeChildren(children, removed);\n for (const childId of removed) {\n this.treeLoadControllers.get(childId)?.abort();\n this.treeLoadControllers.delete(childId);\n this.treeLoadPromises.delete(childId);\n this.childIds.delete(childId);\n this.nodesById.delete(childId);\n this.expandedIds.delete(childId);\n }\n this.childIds.delete(parent.id);\n const depth = this.getTreeDepth(parent) + 1;\n for (const child of children) {\n if (child != null) this.buildChildNodes(parent, child, depth);\n }\n this.reindexAll();\n this.core.selectionService.onRowsRebuilt(this.core.options.getRowId != null);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n private validateTreeChildren(children: readonly TData[], replacedIds: ReadonlySet<string>): void {\n const getRowId = this.core.options.getRowId;\n const reserved = getRowId\n ? new Set([...this.nodesById.keys()].filter((id) => !replacedIds.has(id)))\n : null;\n const seenObjects = new WeakSet<object>();\n const stack = [...children];\n let index = 0;\n while (stack.length > 0) {\n const data = stack.pop()!;\n if (data == null) continue;\n if (typeof data === \"object\") {\n if (seenObjects.has(data)) throw new TypeError(\"[MachTable] Lazy tree children contain a cyclic object graph.\");\n seenObjects.add(data);\n }\n if (getRowId && reserved) {\n const id = getRowId({ data, index: index++, api: this.core.getApi() });\n if (typeof id !== \"string\" || id.length === 0) {\n throw new TypeError(\"[MachTable] getRowId must return a non-empty string for lazy tree children.\");\n }\n if (reserved.has(id)) throw new Error(`Duplicate row id: ${id}`);\n reserved.add(id);\n }\n const nested = readChildren(data, this.core.options.childrenKey);\n if (nested) stack.push(...nested as TData[]);\n }\n }\n\n applyTransaction(transaction: RowTransaction<TData>, refresh = true): void {\n const getRowId = this.core.options.getRowId;\n const touched: RowNode<TData>[] = [];\n const externallyReplacedIds: string[] = [];\n\n if (transaction.remove?.length) {\n const removeIds = new Set<string>();\n const removeRefs = new Set<TData>();\n const collect = (data: TData) => {\n if (getRowId) {\n const id = this.resolveRowId(data, -1, `__missing_remove_${this.core.nextId()}`);\n const stack = [id];\n while (stack.length > 0) {\n const cur = stack.pop()!;\n if (removeIds.has(cur)) continue;\n removeIds.add(cur);\n for (const childId of this.childIds.get(cur) ?? []) stack.push(childId);\n }\n } else {\n const stack: TData[] = [data];\n while (stack.length > 0) {\n const cur = stack.pop()!;\n removeRefs.add(cur);\n const kids = this.isTree ? readChildren(cur, this.core.options.childrenKey) : undefined;\n if (kids) {\n for (const kid of kids) stack.push(kid as TData);\n }\n }\n }\n };\n transaction.remove.forEach(collect);\n this.all = this.all.filter((node) => {\n const drop = removeIds.has(node.id) || (node.data != null && removeRefs.has(node.data));\n if (drop) {\n externallyReplacedIds.push(node.id);\n this.nodesById.delete(node.id);\n this.childIds.delete(node.id);\n }\n return !drop;\n });\n const remaining = new Set(this.all);\n this.roots = this.roots.filter((node) => remaining.has(node));\n }\n\n if (transaction.update?.length) {\n for (const data of transaction.update) {\n let node: RowNode<TData> | undefined;\n if (getRowId) {\n node = this.nodesById.get(this.resolveRowId(data, -1, `__missing_update_${this.core.nextId()}`));\n } else {\n node = this.all.find((n) => n.data === data);\n }\n if (node) {\n node.data = data;\n externallyReplacedIds.push(node.id);\n this.core.bodyRenderer.invalidateRowHeight(node);\n touched.push(node);\n }\n }\n }\n\n if (transaction.add?.length) {\n const startIndex = transaction.addIndex != null ? Math.max(0, Math.min(transaction.addIndex, this.roots.length)) : this.roots.length;\n const added: RowNode<TData>[] = [];\n transaction.add.forEach((data, i) => {\n const id = this.resolveRowId(data, startIndex + i, `add-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"transaction.add\", { rowId: id });\n return;\n }\n const node: RowNode<TData> = { id, data, rowIndex: -1, selected: false };\n this.nodesById.set(id, node);\n this.treeDepth.set(node, 0);\n const children = this.isTree ? readChildren(data, this.core.options.childrenKey) : undefined;\n if (children) {\n for (const child of children) {\n if (child != null) this.buildChildNodes(node, child as TData, 1);\n }\n }\n added.push(node);\n });\n this.roots.splice(startIndex, 0, ...added);\n this.reindexAll();\n }\n\n if (refresh) {\n this.refreshPipeline();\n for (const node of touched) {\n if (node.rowIndex >= 0) this.core.bodyRenderer.refreshRows([node.rowIndex]);\n }\n }\n this.core.changeTracker.clearRows(externallyReplacedIds);\n }\n\n applyTransactions(transactions: readonly RowTransaction<TData>[]): void {\n if (transactions.length === 0) return;\n for (const transaction of transactions) this.applyTransaction(transaction, false);\n this.refreshPipeline();\n }\n\n private buildChildNodes(parent: RowNode<TData>, data: TData, depth: number): void {\n const id = this.resolveRowId(data, -1, `add-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"transaction.add\", { rowId: id });\n return;\n }\n const children = readChildren(data, this.core.options.childrenKey);\n const child: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: false,\n treeChildrenLoaded: Array.isArray(children)\n };\n this.nodesById.set(id, child);\n this.treeDepth.set(child, depth);\n const list = this.childIds.get(parent.id) ?? [];\n list.push(child.id);\n this.childIds.set(parent.id, list);\n if (!children) return;\n for (const nested of children) {\n if (nested != null) this.buildChildNodes(child, nested as TData, depth + 1);\n }\n }\n\n private reindexAll(): void {\n this.all = [];\n const walk = (node: RowNode<TData>) => {\n this.all.push(node);\n if (!this.nodesById.has(node.id)) this.nodesById.set(node.id, node);\n for (const childId of this.childIds.get(node.id) ?? []) {\n const child = this.nodesById.get(childId);\n if (child) walk(child);\n }\n };\n for (const root of this.roots) walk(root);\n }\n\n setFilterModel(filterModel: FilterModel | null): boolean {\n const before = JSON.stringify(this.filterModel);\n const columns = new Set(this.core.columnModel.getColumns().map((column) => column.id));\n this.filterModel = normalizeFilterModel(filterModel, columns);\n return JSON.stringify(this.filterModel) !== before;\n }\n\n getFilterModel(): FilterModel {\n return { ...this.filterModel };\n }\n\n setAdvancedFilterModel(model: AdvancedFilterModel | null | undefined): boolean {\n const columns = new Set(this.core.columnModel.getColumns().map((column) => column.id));\n const next = normalizeAdvancedFilterModel(model, columns);\n const before = JSON.stringify(this.advancedFilterModel);\n this.advancedFilterModel = next;\n this.core.options.advancedFilterModel = next;\n return JSON.stringify(next) !== before;\n }\n\n getAdvancedFilterModel(): AdvancedFilterModel | null {\n return normalizeAdvancedFilterModel(this.advancedFilterModel);\n }\n\n setQuickFilter(text: string | null | undefined): boolean {\n const next = text != null && text.trim() !== \"\" ? text : null;\n if (next === this.quickFilter) return false;\n this.quickFilter = next;\n return true;\n }\n\n getQuickFilter(): string | null {\n return this.quickFilter;\n }\n\n isFilterPresent(): boolean {\n return Object.keys(this.filterModel).length > 0 || this.advancedFilterModel != null || this.quickFilter != null;\n }\n\n refreshPipeline(): void {\n const columns = this.core.columnModel.getOrderedVisible();\n const getCellValue = (node: RowNode<any>, column: ColumnLike) => this.core.getCellValue(node, column);\n\n if (this.isInfinite) {\n this.all.forEach((node, index) => {\n node.rowIndex = index;\n this.rowSequence.set(node, index + 1);\n });\n this.displayed = this.all;\n this.pipelineRows = this.all;\n this.spanInfo.clear();\n this.core.emit(\"modelUpdated\", { rowCount: this.all.length });\n return;\n }\n\n let rows: RowNode<TData>[];\n\n if (this.isTree) {\n rows = this.buildTreeDisplay(columns, getCellValue);\n } else {\n rows = this.all;\n const filteringLocally = this.isFilterPresent() && !this.core.options.manualFiltering;\n if (filteringLocally) {\n rows = rows.filter((node) => doesNodePassFilters(\n node, columns, this.filterModel, this.advancedFilterModel, this.quickFilter, getCellValue\n ));\n }\n const sortModel = this.core.columnModel.getSortModel();\n if (sortModel.length > 0 && !this.core.options.manualSorting) {\n try {\n rows = sortNodes(rows, sortModel, columns, getCellValue);\n } catch (error) {\n this.core.reportError(error, \"comparator\", { sortModel });\n }\n }\n\n const groupCols = this.core.columnModel.getRowGroupColumns();\n if (groupCols.length > 0) {\n rows = this.buildGrouped(rows, groupCols);\n } else if (this.core.options.masterDetail) {\n const withDetails: RowNode<TData>[] = [];\n for (const node of rows) {\n withDetails.push(node);\n if (this.expandedIds.has(node.id) && this.isRowExpandable(node)) {\n withDetails.push({\n id: `__detail__${node.id}`,\n data: node.data,\n rowIndex: -1,\n selected: false,\n isDetail: true,\n masterId: node.id\n });\n }\n }\n rows = withDetails;\n }\n }\n\n for (const node of this.all) node.rowIndex = -1;\n\n let seq = 0;\n rows.forEach((node, index) => {\n node.rowIndex = index;\n if (!node.isDetail && !node.isGroup) {\n seq++;\n this.rowSequence.set(node, seq);\n }\n });\n this.pipelineRows = rows;\n this.applyPagination();\n\n this.computeSpans(getCellValue);\n this.core.emit(\"modelUpdated\", { rowCount: rows.length });\n }\n\n private pipelineRows: RowNode<TData>[] = [];\n private page = 1;\n private pageSize = 20;\n\n get paginationActive(): boolean {\n return this.core.options.paginationEnabled && !this.isInfinite;\n }\n\n private applyPagination(): void {\n if (!this.paginationActive) {\n this.displayed = this.pipelineRows;\n return;\n }\n const size = this.effectivePageSize();\n const pageCount = this.getPageCount();\n if (this.page > pageCount) this.page = pageCount;\n if (this.page < 1) this.page = 1;\n this.core.options.paginationPage = this.page;\n if (this.core.options.paginationMode === \"server\") {\n this.pipelineRows.forEach((node, index) => {\n node.rowIndex = index;\n });\n this.displayed = this.pipelineRows;\n return;\n }\n const start = (this.page - 1) * size;\n const slice = this.pipelineRows.slice(start, start + size);\n slice.forEach((node, index) => {\n node.rowIndex = index;\n });\n this.displayed = slice;\n }\n\n private effectivePageSize(): number {\n this.pageSize = this.core.options.paginationPageSize;\n return Math.max(1, this.pageSize);\n }\n\n getCurrentPage(): number {\n return this.paginationActive ? this.page : 1;\n }\n\n getTotalRowCount(): number {\n if (this.isInfinite) return this.getDisplayTotalCount();\n if (this.paginationActive && this.core.options.paginationMode === \"server\") {\n return this.core.options.paginationTotal;\n }\n return this.pipelineRows.length;\n }\n\n getPageCount(): number {\n if (!this.paginationActive) return 1;\n return Math.max(1, Math.ceil(this.getTotalRowCount() / this.effectivePageSize()));\n }\n\n getPipelineRows(): RowNode<TData>[] {\n return this.pipelineRows;\n }\n\n setPage(page: number, silent = false): void {\n if (!this.paginationActive) return;\n const pageCount = this.getPageCount();\n const next = Math.max(1, Math.min(Math.round(page) || 1, pageCount));\n if (next === this.page) return;\n this.page = next;\n this.core.options.paginationPage = next;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.core.bodyRenderer.scrollToIndex(0, \"top\");\n if (!silent) this.emitPaginationChanged();\n }\n\n setPageSize(size: number): void {\n if (!this.paginationActive) return;\n const next = Math.max(1, Math.round(size) || this.effectivePageSize());\n const firstVisible = (this.page - 1) * this.effectivePageSize();\n this.core.options.paginationPageSize = next;\n this.pageSize = next;\n this.page = Math.floor(firstVisible / next) + 1;\n this.core.options.paginationPage = this.page;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n restorePagination(page: number, pageSize: number): void {\n this.pageSize = Math.max(1, Math.round(pageSize) || 1);\n this.core.options.paginationPageSize = this.pageSize;\n this.page = Math.max(1, Math.round(page) || 1);\n this.core.options.paginationPage = this.page;\n }\n\n setPaginationEnabled(enabled: boolean): void {\n if (this.core.options.paginationEnabled === enabled) return;\n this.core.options.paginationEnabled = enabled && !this.isInfinite;\n if (this.core.options.paginationEnabled) this.page = 1;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n onPaginationOptionsChanged(): void {\n if (!this.paginationActive) return;\n this.page = this.core.options.paginationMode === \"server\"\n ? this.core.options.paginationPage\n : 1;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n private emitPaginationChanged(): void {\n this.core.emit(\"paginationChanged\", {\n page: this.getCurrentPage(),\n pageSize: this.effectivePageSize(),\n pageCount: this.getPageCount(),\n total: this.getTotalRowCount()\n });\n }\n\n private buildTreeDisplay(\n columns: ColumnLike[],\n getCellValue: (node: RowNode<any>, column: ColumnLike) => any\n ): RowNode<TData>[] {\n const sortModel = this.core.options.manualSorting ? [] : this.core.columnModel.getSortModel();\n const passCache = new Map<string, boolean>();\n const filterPresent = this.isFilterPresent() && !this.core.options.manualFiltering;\n\n const nodePasses = (node: RowNode<TData>): boolean => {\n const cached = passCache.get(node.id);\n if (cached !== undefined) return cached;\n let pass = true;\n if (filterPresent) {\n pass = doesNodePassFilters(\n node, columns, this.filterModel, this.advancedFilterModel, this.quickFilter, getCellValue\n );\n for (const childId of this.childIds.get(node.id) ?? []) {\n const child = this.nodesById.get(childId);\n if (child && nodePasses(child)) pass = true;\n }\n }\n passCache.set(node.id, pass);\n return pass;\n };\n\n const out: RowNode<TData>[] = [];\n const walk = (nodes: RowNode<TData>[]) => {\n let ordered = nodes;\n if (sortModel.length > 0) {\n ordered = sortNodes(nodes, sortModel, columns, getCellValue);\n }\n for (const node of ordered) {\n if (!nodePasses(node)) continue;\n out.push(node);\n if (this.expandedIds.has(node.id)) {\n const childNodes = (this.childIds.get(node.id) ?? [])\n .map((id) => this.nodesById.get(id))\n .filter((n): n is RowNode<TData> => n != null);\n walk(childNodes);\n }\n }\n };\n walk(this.roots);\n return out;\n }\n\n private computeSpans(getCellValue: (node: RowNode<any>, column: ColumnLike) => any): void {\n this.spanInfo.clear();\n if (this.isTree) return;\n if (this.core.options.masterDetail) return;\n if (this.core.columnModel.getRowGroupColumns().length > 0) return;\n\n const spanColumns = this.core.columnModel.getOrderedVisible().filter(\n (c) => c.colDef.rowSpan != null || c.colDef.autoRowSpan === true\n );\n if (spanColumns.length === 0) return;\n\n const masters = this.mastersBuf;\n let m = 0;\n for (const node of this.displayed) {\n if (!node.isDetail && !node.isGroup) masters[m++] = node;\n }\n masters.length = m;\n const n = m;\n if (n === 0) return;\n\n for (const col of spanColumns) {\n const arr = new Int32Array(n);\n let i = 0;\n while (i < n) {\n const node = masters[i];\n const value = getCellValue(node, col);\n let span = 1;\n if (col.colDef.rowSpan) {\n try {\n const out = col.colDef.rowSpan({\n api: this.core.getApi(),\n colDef: col.colDef,\n column: col,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n });\n span = Math.max(1, Math.min(Math.round(out) || 1, n - i));\n } catch (error) {\n this.core.reportError(error, \"rowSpan\", { colId: col.id, rowId: node.id });\n }\n } else if (col.colDef.autoRowSpan) {\n while (\n i + span < n &&\n value != null &&\n value !== \"\" &&\n defaultComparator(value, getCellValue(masters[i + span], col)) === 0\n ) {\n span++;\n }\n }\n arr[i] = span;\n for (let k = 1; k < span; k++) arr[i + k] = -1;\n i += span;\n }\n this.spanInfo.set(col.id, arr);\n }\n }\n\n getSpanInfo(colId: string): Int32Array | undefined {\n return this.spanInfo.get(colId);\n }\n\n getRowSeq(node: RowNode<TData>): number {\n return this.rowSequence.get(node) ?? 0;\n }\n\n getTreeDepth(node: RowNode<TData>): number {\n return this.treeDepth.get(node) ?? 0;\n }\n\n private buildGrouped(rows: RowNode<TData>[], groupCols: ColumnLike[]): RowNode<TData>[] {\n const aggResolve = createAggResolver(this.core.options.aggFuncs);\n const aggCols = this.core.columnModel.getAggColumns();\n this.knownGroupIds = [];\n\n const computeAgg = (leaves: RowNode<TData>[]): Record<string, any> => {\n const values: Record<string, any> = {};\n for (const col of aggCols) {\n const fn = aggResolve(col.colDef.aggFunc!);\n if (!fn) continue;\n try {\n values[col.id] = fn(leaves.map((leaf) => this.core.getCellValue(leaf, col)));\n } catch (error) {\n this.core.reportError(error, \"aggFunc\", { colId: col.id, aggFunc: col.colDef.aggFunc });\n values[col.id] = null;\n }\n }\n return values;\n };\n\n const build = (\n nodes: RowNode<TData>[],\n level: number,\n parentPath: string\n ): { display: RowNode<TData>[]; leaves: RowNode<TData>[] } => {\n if (level >= groupCols.length) {\n return { display: nodes, leaves: nodes };\n }\n const col = groupCols[level];\n const groups = new Map<string, RowNode<TData>[]>();\n const order: string[] = [];\n for (const node of nodes) {\n const raw = this.core.getCellValue(node, col);\n const key = raw == null ? \"(空)\" : String(raw);\n let bucket = groups.get(key);\n if (!bucket) {\n bucket = [];\n groups.set(key, bucket);\n order.push(key);\n }\n bucket.push(node);\n }\n order.sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: \"base\" }));\n\n const display: RowNode<TData>[] = [];\n const leaves: RowNode<TData>[] = [];\n for (const key of order) {\n const children = groups.get(key)!;\n const groupId = `${parentPath}/g${level}:${key}`;\n this.knownGroupIds.push(groupId);\n const child = build(children, level + 1, groupId);\n const groupNode: RowNode<TData> = {\n id: groupId,\n data: null,\n rowIndex: -1,\n selected: false,\n isGroup: true,\n groupLevel: level,\n groupKey: key,\n leafNodes: child.leaves,\n aggValues: computeAgg(child.leaves)\n };\n display.push(groupNode);\n if (this.groupExpandedIds.has(groupId)) {\n display.push(...child.display);\n }\n leaves.push(...child.leaves);\n }\n return { display, leaves };\n };\n\n return build(rows, 0, \"\").display;\n }\n\n isRowExpandable(node: RowNode<TData>): boolean {\n if (this.isTree) {\n if (this.hasChildren(node.id)) return true;\n if (node.treeLoading) return true;\n if (node.treeChildrenLoaded || !node.data || !this.core.options.loadTreeChildren) return false;\n const checkTree = this.core.options.isTreeRowExpandable;\n if (!checkTree) return false;\n try {\n return checkTree({ data: node.data, node, api: this.core.getApi() });\n } catch (error) {\n this.core.reportError(error, \"isTreeRowExpandable\", { rowId: node.id });\n return false;\n }\n }\n if (!this.core.options.masterDetail) return false;\n const check = this.core.options.isRowExpandable;\n if (check) {\n try {\n return check({ data: node.data, node, api: this.core.getApi() });\n } catch (error) {\n this.core.reportError(error, \"isRowExpandable\", { rowId: node.id });\n return false;\n }\n }\n return true;\n }\n\n isRowExpanded(id: string): boolean {\n return this.expandedIds.has(id);\n }\n\n getExpandedRowIds(): string[] {\n return [...this.expandedIds];\n }\n\n getExpandedGroupIds(): string[] {\n return [...this.groupExpandedIds];\n }\n\n restoreExpansion(rowIds: readonly string[], groupIds: readonly string[]): void {\n this.expandedIds = new Set(rowIds.filter((id) => this.nodesById.has(id)));\n this.groupExpandedIds = new Set(groupIds);\n }\n\n expandRow(id: string): boolean {\n return this.setDetailExpanded(id, true);\n }\n\n collapseRow(id: string): boolean {\n return this.setDetailExpanded(id, false);\n }\n\n toggleDetail(id: string): boolean {\n return this.setDetailExpanded(id, !this.expandedIds.has(id));\n }\n\n private setDetailExpanded(id: string, expanded: boolean): boolean {\n const node = this.nodesById.get(id);\n if (!node || (expanded && !this.isRowExpandable(node))) return false;\n if (expanded === this.expandedIds.has(id)) return expanded;\n if (expanded) this.expandedIds.add(id);\n else this.expandedIds.delete(id);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n this.core.emit(\"detailToggled\", { rowId: id, rowNode: node, expanded });\n if (expanded && this.isTree && !this.hasChildren(id) && !node.treeLoading) {\n void this.loadTreeChildren(id).catch(() => undefined);\n }\n return expanded;\n }\n\n expandAllDetails(): void {\n let changed = false;\n for (const node of this.all) {\n if (!this.expandedIds.has(node.id) && this.isRowExpandable(node)) {\n this.expandedIds.add(node.id);\n changed = true;\n }\n }\n if (changed) {\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n collapseAllDetails(): void {\n if (this.expandedIds.size === 0) return;\n this.expandedIds.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n toggleGroup(groupId: string): boolean {\n return this.setGroupExpanded(groupId, !this.groupExpandedIds.has(groupId));\n }\n\n isGroupExpanded(groupId: string): boolean {\n return this.groupExpandedIds.has(groupId);\n }\n\n getGroupNode(groupId: string): RowNode<TData> | undefined {\n return this.displayed.find((n) => n.isGroup && n.id === groupId);\n }\n\n expandAllGroups(): void {\n if (this.knownGroupIds.length === 0) return;\n let changed = false;\n for (const id of this.knownGroupIds) {\n if (!this.groupExpandedIds.has(id)) {\n this.groupExpandedIds.add(id);\n changed = true;\n }\n }\n if (changed) {\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n collapseAllGroups(): void {\n if (this.groupExpandedIds.size === 0) return;\n this.groupExpandedIds.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n private setGroupExpanded(groupId: string, expanded: boolean): boolean {\n if (!this.knownGroupIds.includes(groupId)) return expanded;\n if (expanded === this.groupExpandedIds.has(groupId)) return expanded;\n if (expanded) this.groupExpandedIds.add(groupId);\n else this.groupExpandedIds.delete(groupId);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return expanded;\n }\n\n reorderRowsByDisplayed(fromIndex: number, toIndex: number): boolean {\n if (this.isTree) return false;\n const fromNode = this.getDisplayedRow(fromIndex);\n const toNode = this.getDisplayedRow(toIndex);\n if (!fromNode || !toNode || fromNode.isDetail || toNode.isDetail || fromNode.isGroup || toNode.isGroup) return false;\n\n const fromAllIdx = this.all.indexOf(fromNode);\n let toAllIdx = this.all.indexOf(toNode);\n if (fromAllIdx < 0 || toAllIdx < 0) return false;\n if (toAllIdx > fromAllIdx) {\n let idx = toAllIdx;\n while (idx + 1 < this.all.length && this.all[idx + 1].isDetail) idx++;\n toAllIdx = idx;\n }\n if (fromAllIdx === toAllIdx) return false;\n\n this.all.splice(fromAllIdx, 1);\n const insertAt = this.all.indexOf(toNode);\n this.all.splice(toAllIdx > fromAllIdx ? insertAt + 1 : insertAt, 0, fromNode);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return true;\n }\n\n getAllNodes(): RowNode<TData>[] {\n return this.all;\n }\n\n getRootNodes(): RowNode<TData>[] {\n return this.roots;\n }\n\n getDisplayedRows(): RowNode<TData>[] {\n return this.displayed;\n }\n\n getDisplayedRowCount(): number {\n return this.displayed.length;\n }\n\n getDisplayedRow(index: number): RowNode<TData> | undefined {\n return this.displayed[index];\n }\n\n getNodeById(id: string): RowNode<TData> | undefined {\n return this.nodesById.get(id);\n }\n\n forEachNode(callback: (node: RowNode<TData>, index: number) => void): void {\n this.all.forEach(callback);\n }\n\n forEachNodeAfterFilterAndSort(callback: (node: RowNode<TData>, index: number) => void): void {\n let index = 0;\n for (const node of this.pipelineRows) {\n if (node.isDetail || node.isGroup) continue;\n callback(node, index++);\n }\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\n\ntype SelectionContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"headerRenderer\"\n | \"options\"\n | \"reportError\"\n | \"rowModel\"\n>;\n\nexport class SelectionService {\n private selectedIds = new Set<string>();\n private anchorId: string | null = null;\n private indeterminateIds = new Set<string>();\n\n constructor(private core: SelectionContext) {}\n\n isSelected(id: string): boolean {\n return this.selectedIds.has(id);\n }\n\n isIndeterminate(id: string): boolean {\n return this.indeterminateIds.has(id);\n }\n\n isSelectable(node: RowNode<any>): boolean {\n const column = this.findSelectableColumn(node);\n const check = column?.colDef.selectable;\n if (!column || !check) return true;\n try {\n return check({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex: node.rowIndex\n });\n } catch (error) {\n this.core.reportError(error, \"selectable\", { rowId: node.id, colId: column?.id });\n return false;\n }\n }\n\n private findSelectableColumn(node: RowNode<any>) {\n if (node.isGroup || node.isDetail) return undefined;\n return this.core.columnModel\n .getOrderedVisible()\n .find((column) => column.hasCheckbox && column.colDef.selectable != null);\n }\n\n getSelectedNodes(): RowNode<any>[] {\n return this.core.rowModel.getAllNodes().filter((n) => this.selectedIds.has(n.id));\n }\n\n getSelectedRows(): any[] {\n return this.getSelectedNodes().filter((n) => n.data != null).map((n) => n.data);\n }\n\n getSelectedIds(): string[] {\n return [...this.selectedIds];\n }\n\n restoreSelection(ids: readonly string[]): void {\n const requested = new Set(ids);\n const changes = this.core.rowModel\n .getAllNodes()\n .filter((node) => requested.has(node.id) && !node.isDetail && !node.isGroup)\n .map((node) => ({ node, selected: true }));\n this.applySelection(changes, true);\n }\n\n onRowsRebuilt(preserveIds: boolean): void {\n if (!preserveIds) {\n this.selectedIds.clear();\n this.anchorId = null;\n } else {\n const existing = new Set(this.core.rowModel.getAllNodes().map((n) => n.id));\n for (const id of [...this.selectedIds]) {\n if (!existing.has(id)) this.selectedIds.delete(id);\n }\n if (this.anchorId != null && !existing.has(this.anchorId)) this.anchorId = null;\n }\n for (const node of this.core.rowModel.getAllNodes()) {\n node.selected = this.selectedIds.has(node.id);\n }\n this.recomputeTriState();\n }\n\n getGroupSelectionState(groupNode: RowNode<any>): { all: boolean; some: boolean } {\n const leaves = groupNode.leafNodes ?? [];\n if (leaves.length === 0) return { all: false, some: false };\n let selectableCount = 0;\n let count = 0;\n for (const leaf of leaves) {\n if (!this.isSelectable(leaf)) continue;\n selectableCount++;\n if (this.selectedIds.has(leaf.id)) count++;\n }\n if (selectableCount === 0) return { all: false, some: false };\n return { all: count === selectableCount, some: count > 0 };\n }\n\n setGroupSelected(groupNode: RowNode<any>, selected: boolean): void {\n const leaves = (groupNode.leafNodes ?? []).filter((n) => this.isSelectable(n));\n if (leaves.length === 0) return;\n this.applySelection(leaves.map((node) => ({ node, selected })));\n }\n\n setNodeSelected(node: RowNode<any>, selected: boolean, clearOthers = false): void {\n this.applySelection([{ node, selected, clearOthers }]);\n }\n\n selectNodeById(nodeId: string, selected = true, clearOthers = true): void {\n const node = this.core.rowModel.getNodeById(nodeId);\n if (node) this.setNodeSelected(node, selected, clearOthers);\n }\n\n onRowClick(node: RowNode<any>, event: MouseEvent, fromCheckbox: boolean): void {\n const mode = this.core.options.rowSelection;\n if (mode === \"none\") return;\n if (!this.isSelectable(node)) return;\n\n if (fromCheckbox) {\n const single = mode === \"single\";\n this.applySelection([{ node, selected: single ? true : !node.selected, clearOthers: single }]);\n this.anchorId = node.id;\n return;\n }\n\n const multi = mode === \"multiple\";\n if (multi && (event.ctrlKey || event.metaKey)) {\n this.applySelection([{ node, selected: !node.selected }]);\n this.anchorId = node.id;\n return;\n }\n\n if (multi && event.shiftKey && this.anchorId != null) {\n const anchor = this.core.rowModel.getNodeById(this.anchorId);\n if (anchor && anchor.rowIndex >= 0 && node.rowIndex >= 0) {\n const start = Math.min(anchor.rowIndex, node.rowIndex);\n const end = Math.max(anchor.rowIndex, node.rowIndex);\n const changes = [];\n for (let i = start; i <= end; i++) {\n const row = this.core.rowModel.getDisplayedRow(i);\n if (row && !row.isDetail && !row.isGroup && this.isSelectable(row)) {\n changes.push({ node: row, selected: true });\n }\n }\n this.applySelection(changes);\n return;\n }\n }\n\n this.applySelection([{ node, selected: true, clearOthers: true }]);\n this.anchorId = node.id;\n }\n\n selectAll(filteredOnly = true): void {\n const mode = this.core.options.rowSelection;\n if (mode === \"none\") return;\n const candidates = filteredOnly ? this.core.rowModel.getDisplayedRows() : this.core.rowModel.getAllNodes();\n const selectable = candidates.filter((n) => !n.isDetail && !n.isGroup && this.isSelectable(n));\n if (selectable.length === 0) return;\n if (mode === \"single\") {\n this.applySelection([{ node: selectable[0], selected: true, clearOthers: true }]);\n return;\n }\n this.applySelection(selectable.map((node) => ({ node, selected: true })));\n }\n\n deselectAll(): void {\n this.applySelection([], true);\n }\n\n isSelectAllActive(): boolean {\n const rows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const selectable = rows.filter((n) => this.isSelectable(n));\n if (selectable.length === 0) return false;\n if (this.core.rowModel.isInfinite) {\n const total = this.core.rowModel.getDisplayTotalCount();\n if (selectable.length < total) return false;\n }\n return selectable.every((n) => this.selectedIds.has(n.id));\n }\n\n isSelectAllIndeterminate(): boolean {\n const rows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const selectable = rows.filter((n) => this.isSelectable(n));\n const count = selectable.reduce((acc, n) => acc + (this.selectedIds.has(n.id) ? 1 : 0), 0);\n if (count === 0) return false;\n if (this.core.rowModel.isInfinite) {\n const total = this.core.rowModel.getDisplayTotalCount();\n if (selectable.length < total) return true;\n }\n return count > 0 && count < selectable.length;\n }\n\n applySelectionPublic(\n changes: { node: RowNode<any>; selected: boolean; clearOthers?: boolean }[],\n clearOthers = false\n ): void {\n this.applySelection(changes, clearOthers);\n }\n\n private applySelection(\n changes: { node: RowNode<any>; selected: boolean; clearOthers?: boolean }[],\n clearAll = false\n ): void {\n const before = new Set(this.selectedIds);\n const clearOthers = clearAll || changes.some((c) => c.clearOthers);\n const isTree = this.core.rowModel.isTree && this.core.options.autoCheckedChildren;\n\n if (clearOthers) {\n const keep = clearAll\n ? new Set<string>()\n : new Set(changes.filter((c) => c.selected).flatMap((c) => (isTree ? this.subtreeIds(c.node) : [c.node.id])));\n this.selectedIds = keep;\n }\n\n for (const c of changes) {\n if (!this.isSelectable(c.node)) continue;\n const targets = isTree ? this.subtreeIds(c.node) : [c.node.id];\n for (const id of targets) {\n if (c.selected) this.selectedIds.add(id);\n else this.selectedIds.delete(id);\n }\n }\n\n const changedIds = new Set<string>();\n for (const id of new Set([...before, ...this.selectedIds])) {\n if (before.has(id) !== this.selectedIds.has(id)) changedIds.add(id);\n }\n\n const prevSelected = new Map<string, boolean>();\n for (const node of this.core.rowModel.getAllNodes()) {\n prevSelected.set(node.id, node.selected);\n }\n const prevIndeterminate = new Set(this.indeterminateIds);\n\n this.recomputeTriState();\n\n const refreshIndexes: number[] = [];\n const touched = new Set<string>([...changedIds, ...prevIndeterminate, ...this.indeterminateIds]);\n for (const node of this.core.rowModel.getAllNodes()) {\n const isSel = this.selectedIds.has(node.id);\n node.selected = isSel;\n if (touched.has(node.id) || prevSelected.get(node.id) !== isSel) {\n if (node.rowIndex >= 0) refreshIndexes.push(node.rowIndex);\n }\n }\n\n if (changedIds.size > 0) {\n this.core.bodyRenderer.refreshRows(refreshIndexes);\n this.core.headerRenderer.refreshSelectAllCheckbox();\n this.core.emit(\"selectionChanged\", {\n selectedNodes: this.getSelectedNodes(),\n selectedRows: this.getSelectedRows()\n });\n }\n }\n\n private subtreeIds(node: RowNode<any>): string[] {\n const out: string[] = [node.id];\n const walk = (id: string) => {\n for (const childId of this.core.rowModel.getChildrenIds(id)) {\n out.push(childId);\n walk(childId);\n }\n };\n walk(node.id);\n return out;\n }\n\n private recomputeTriState(): void {\n this.indeterminateIds.clear();\n if (!this.core.rowModel.isTree) return;\n\n const evaluate = (id: string): { all: boolean; some: boolean } => {\n const childIds = this.core.rowModel.getChildrenIds(id);\n if (childIds.length === 0) {\n return { all: this.selectedIds.has(id), some: this.selectedIds.has(id) };\n }\n let all = true;\n let some = false;\n for (const childId of childIds) {\n const state = evaluate(childId);\n if (state.all) some = true;\n else if (state.some) {\n some = true;\n all = false;\n } else {\n all = false;\n }\n }\n if (some && !all) this.indeterminateIds.add(id);\n if (all) this.selectedIds.add(id);\n else this.selectedIds.delete(id);\n return { all, some };\n };\n\n for (const root of this.core.rowModel.getRootNodes()) {\n evaluate(root.id);\n }\n for (const node of this.core.rowModel.getAllNodes()) {\n node.selected = this.selectedIds.has(node.id);\n }\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\n\ntype ResizeContext = Pick<\n GridCore<any>,\n | \"columnModel\"\n | \"commitColumnWidths\"\n | \"emitColumnResize\"\n | \"options\"\n | \"relayoutColumns\"\n | \"skeleton\"\n>;\n\ninterface ActiveResize {\n column: Column;\n didResize: boolean;\n handle: HTMLElement;\n pointerId: number;\n startFlex: number | null;\n startManualWidth: number | null;\n startWidth: number;\n startX: number;\n}\n\nexport class ResizeService {\n private active: ActiveResize | null = null;\n private rafId = 0;\n private pendingWidth = 0;\n\n constructor(private core: ResizeContext) {}\n\n startResize(event: PointerEvent, column: Column): void {\n if (!this.core.options.enableColumnResize || !column.resizable || event.isPrimary === false) return;\n this.cancelResize();\n\n const handle = event.currentTarget as HTMLElement;\n const startWidth = column.currentWidth;\n this.pendingWidth = startWidth;\n this.active = {\n column,\n didResize: false,\n handle,\n pointerId: event.pointerId,\n startFlex: column.flex,\n startManualWidth: column.manualWidth,\n startWidth,\n startX: event.clientX\n };\n\n window.addEventListener(\"pointermove\", this.onMove);\n // Capture phase finalizes before the browser's normal lostpointercapture event.\n window.addEventListener(\"pointerup\", this.onUp, true);\n window.addEventListener(\"pointercancel\", this.onCancel, true);\n handle.addEventListener(\"lostpointercapture\", this.onLostPointerCapture);\n try {\n handle.setPointerCapture?.(event.pointerId);\n } catch {\n // Window listeners keep resizing functional when pointer capture is unavailable.\n }\n this.core.skeleton.root.classList.add(\"mach-root--resizing\");\n }\n\n cancelResize(restore = true): void {\n const active = this.active;\n if (!active) return;\n this.active = null;\n this.clearFrame();\n this.removeListeners(active);\n if (restore) {\n active.column.manualWidth = active.startManualWidth;\n active.column.flex = active.startFlex;\n this.core.relayoutColumns();\n }\n this.core.skeleton.root.classList.remove(\"mach-root--resizing\");\n }\n\n private onMove = (event: PointerEvent): void => {\n const active = this.matchActivePointer(event);\n if (!active) return;\n this.pendingWidth = this.widthFromPointer(active, event.clientX);\n active.didResize ||= Math.abs(this.pendingWidth - active.startWidth) >= 0.5;\n if (this.rafId) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = 0;\n this.applyPendingWidth();\n });\n };\n\n private onUp = (event: PointerEvent): void => {\n const active = this.matchActivePointer(event);\n if (!active) return;\n this.pendingWidth = this.widthFromPointer(active, event.clientX);\n active.didResize ||= Math.abs(this.pendingWidth - active.startWidth) >= 0.5;\n this.finishResize(active);\n };\n\n private onCancel = (event: PointerEvent): void => {\n if (!this.matchActivePointer(event)) return;\n this.cancelResize();\n };\n\n private onLostPointerCapture = (): void => {\n this.cancelResize();\n };\n\n private finishResize(active: ActiveResize): void {\n this.active = null;\n this.clearFrame();\n if (active.didResize) {\n if (Math.abs(this.pendingWidth - active.startWidth) < 0.5) {\n active.column.manualWidth = active.startManualWidth;\n active.column.flex = active.startFlex;\n } else {\n this.core.columnModel.setColumnWidth(active.column, this.pendingWidth);\n }\n this.core.relayoutColumns();\n }\n this.removeListeners(active);\n try {\n active.handle.releasePointerCapture?.(active.pointerId);\n } catch {\n // The capture can already be released by the browser.\n }\n this.core.skeleton.root.classList.remove(\"mach-root--resizing\");\n if (active.didResize) this.core.commitColumnWidths([active.column]);\n }\n\n private applyPendingWidth(): void {\n const active = this.active;\n if (!active || !this.core.columnModel.setColumnWidth(active.column, this.pendingWidth)) return;\n this.core.relayoutColumns();\n this.core.emitColumnResize(active.column, false);\n }\n\n private widthFromPointer(active: ActiveResize, clientX: number): number {\n const pointerX = Number.isFinite(clientX) ? clientX : active.startX;\n return active.startWidth + pointerX - active.startX;\n }\n\n private matchActivePointer(event: PointerEvent): ActiveResize | null {\n const active = this.active;\n return active && event.pointerId === active.pointerId ? active : null;\n }\n\n private clearFrame(): void {\n if (this.rafId) cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n }\n\n private removeListeners(active: ActiveResize): void {\n window.removeEventListener(\"pointermove\", this.onMove);\n window.removeEventListener(\"pointerup\", this.onUp, true);\n window.removeEventListener(\"pointercancel\", this.onCancel, true);\n active.handle.removeEventListener(\"lostpointercapture\", this.onLostPointerCapture);\n }\n\n destroy(): void {\n this.cancelResize(false);\n this.clearFrame();\n this.core.skeleton.root?.classList.remove(\"mach-root--resizing\");\n }\n}\n","export function el(tag: string, className?: string, attrs?: Record<string, string>): HTMLElement {\n const e = document.createElement(tag);\n if (className) e.className = className;\n if (attrs) {\n for (const key of Object.keys(attrs)) {\n e.setAttribute(key, attrs[key]);\n }\n }\n return e;\n}\n\nexport function setStyles(e: HTMLElement, styles: Partial<CSSStyleDeclaration>): void {\n Object.assign(e.style, styles);\n}\n\nexport function clamp(v: number, min: number, max: number): number {\n return v < min ? min : v > max ? max : v;\n}\n\nlet uidCounter = 0;\n\nexport function nextUid(prefix = \"rg\"): string {\n uidCounter++;\n return `${prefix}-${uidCounter}`;\n}\n\nexport function toPx(n: number): string {\n return `${n}px`;\n}\n\nexport const FILTER_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 3.5h12L9.5 8v4.5L6.5 14V8L2 3.5z\"/></svg>';\n\nexport const SORT_ASC_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" fill=\"currentColor\"><path d=\"M8 3l4 5H4l4-5z\"/></svg>';\n\nexport const SORT_DESC_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" fill=\"currentColor\"><path d=\"M8 13l4-5H4l4 5z\"/></svg>';\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el } from \"../lib/dom\";\n\nconst DRAG_THRESHOLD = 6;\ntype ColumnDragContext = Pick<\n GridCore<any>,\n \"bodyRenderer\" | \"columnModel\" | \"moveColumn\" | \"skeleton\"\n>;\n\nexport class ColumnDragService {\n private pending: { column: Column; startX: number; startY: number } | null = null;\n private dragging: { column: Column; cellEl: HTMLElement; indicator: HTMLElement; targetIndex: number } | null = null;\n private suppressClick = false;\n\n constructor(private core: ColumnDragContext) {}\n\n onPointerDown(e: PointerEvent, column: Column): void {\n if (e.button !== 0) return;\n if (!column.movable) return;\n this.pending = { column, startX: e.clientX, startY: e.clientY };\n window.addEventListener(\"pointermove\", this.onMove);\n window.addEventListener(\"pointerup\", this.onUp);\n window.addEventListener(\"pointercancel\", this.onUp);\n }\n\n didDrag(): boolean {\n const value = this.suppressClick;\n this.suppressClick = false;\n return value;\n }\n\n private onMove = (e: PointerEvent): void => {\n if (this.dragging) {\n this.updateIndicator(e);\n return;\n }\n const pending = this.pending;\n if (!pending) return;\n if (Math.abs(e.clientX - pending.startX) < DRAG_THRESHOLD && Math.abs(e.clientY - pending.startY) < DRAG_THRESHOLD) {\n return;\n }\n this.startDrag(e);\n };\n\n private startDrag(e: PointerEvent): void {\n const pending = this.pending;\n if (!pending) return;\n const cellEl = this.findHeaderCell(pending.column);\n if (!cellEl || !cellEl.parentElement) {\n this.cleanup();\n return;\n }\n this.suppressClick = true;\n const indicator = el(\"div\", \"mach-drop-indicator\");\n cellEl.parentElement.appendChild(indicator);\n cellEl.classList.add(\"mach-header-cell--dragging\");\n this.core.skeleton.root.classList.add(\"mach-root--dragging\");\n this.dragging = { column: pending.column, cellEl, indicator, targetIndex: -1 };\n this.updateIndicator(e);\n }\n\n private findHeaderCell(column: Column): HTMLElement | null {\n const pane = this.core.bodyRenderer.paneForColumn(column);\n const container = this.core.skeleton.headerRowContainers[pane];\n return container.querySelector<HTMLElement>(`.mach-header-cell[data-col-id=\"${cssEscape(column.id)}\"]`);\n }\n\n private updateIndicator(e: PointerEvent): void {\n const dragging = this.dragging;\n if (!dragging) return;\n const pane = this.core.bodyRenderer.paneForColumn(dragging.column);\n const container = this.core.skeleton.headerRowContainers[pane];\n const rowRect = container.getBoundingClientRect();\n const cols = this.core.columnModel.getPaneColumns(pane);\n const fromIndex = cols.indexOf(dragging.column);\n\n const x = e.clientX - rowRect.left;\n let target = -1;\n let indicatorX = 0;\n let acc = 0;\n for (let i = 0; i < cols.length; i++) {\n const mid = acc + cols[i].currentWidth / 2;\n if (x < mid) {\n target = i;\n indicatorX = acc;\n break;\n }\n acc += cols[i].currentWidth;\n }\n if (target < 0) {\n target = cols.length;\n indicatorX = acc;\n }\n\n dragging.targetIndex = target > fromIndex ? target - 1 : target;\n dragging.indicator.style.left = `${indicatorX}px`;\n }\n\n private onUp = (): void => {\n const dragging = this.dragging;\n this.pending = null;\n this.cleanup();\n if (!dragging) return;\n this.dragging = null;\n dragging.cellEl.classList.remove(\"mach-header-cell--dragging\");\n dragging.indicator.remove();\n this.core.skeleton.root.classList.remove(\"mach-root--dragging\");\n if (dragging.targetIndex >= 0) {\n this.core.moveColumn(dragging.column.id, dragging.targetIndex);\n }\n };\n\n private cleanup(): void {\n window.removeEventListener(\"pointermove\", this.onMove);\n window.removeEventListener(\"pointerup\", this.onUp);\n window.removeEventListener(\"pointercancel\", this.onUp);\n };\n\n destroy(): void {\n this.cleanup();\n if (this.dragging) {\n this.dragging.cellEl.classList.remove(\"mach-header-cell--dragging\");\n this.dragging.indicator.remove();\n this.core.skeleton.root.classList.remove(\"mach-root--dragging\");\n this.dragging = null;\n }\n this.pending = null;\n }\n}\n\nfunction cssEscape(value: string): string {\n return typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\"\n ? CSS.escape(value)\n : value.replace(/[^a-zA-Z0-9_-]/g, \"\\\\$&\");\n}\n","import type { CsvExportParams } from \"../types/api\";\n\nexport function csvEscape(value: any, separator: string): string {\n const s = value == null ? \"\" : String(value);\n if (s.includes(separator) || s.includes('\"') || s.includes(\"\\n\") || s.includes(\"\\r\")) {\n return '\"' + s.replace(/\"/g, '\"\"') + '\"';\n }\n return s;\n}\n\nexport function sanitizeFormulaCell(value: any): any {\n if (typeof value !== \"string\" || value === \"\") return value;\n if (/^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(value)) return value;\n if (/^[\\s\\u0000-\\u001f]*[=+\\-@]/.test(value)) return \"'\" + value;\n return value;\n}\n\nexport interface CsvRowAccessor<T> {\n getHeaderLabels(): string[];\n getRowValues(): T[][];\n}\n\nexport function buildCsv<T>(accessor: CsvRowAccessor<T>, params: CsvExportParams = {}): string {\n const separator = params.columnSeparator ?? \",\";\n const includeHeader = params.includeHeader ?? true;\n const protectFormulas = params.protectFormulas ?? true;\n const lines: string[] = [];\n\n if (includeHeader) {\n lines.push(accessor.getHeaderLabels().map((l) => csvEscape(l, separator)).join(separator));\n }\n for (const row of accessor.getRowValues()) {\n lines.push(\n row.map((v) => csvEscape(protectFormulas ? sanitizeFormulaCell(v) : v, separator)).join(separator)\n );\n }\n\n const body = lines.join(\"\\r\\n\");\n return params.prependBOM ? \"\\uFEFF\" + body : body;\n}\n","import { sanitizeFormulaCell } from \"./csv\";\n\nfunction escapeCell(value: any, protectFormulas: boolean): string {\n const safe = protectFormulas ? sanitizeFormulaCell(value) : value;\n const s = safe == null ? \"\" : String(safe);\n if (/[\"\\t\\n\\r]/.test(s)) {\n return '\"' + s.replace(/\"/g, '\"\"') + '\"';\n }\n return s;\n}\n\nexport function toTsv(rows: any[][], protectFormulas = true): string {\n return rows.map((row) => row.map((value) => escapeCell(value, protectFormulas)).join(\"\\t\")).join(\"\\n\");\n}\n\nexport function parseTsv(text: string): string[][] {\n return parseDelimited(text, \"\\t\");\n}\n\nexport function parseCsv(text: string, separator = \",\"): string[][] {\n return parseDelimited(text, separator);\n}\n\nexport function parseDelimited(text: string, separator: string): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = \"\";\n let inQuotes = false;\n let i = 0;\n\n while (i < text.length) {\n const ch = text[i];\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n cell += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i++;\n continue;\n }\n cell += ch;\n i++;\n continue;\n }\n if (ch === '\"' && cell === \"\") {\n inQuotes = true;\n i++;\n continue;\n }\n if (ch === separator) {\n row.push(cell);\n cell = \"\";\n i++;\n continue;\n }\n if (ch === \"\\n\" || ch === \"\\r\") {\n row.push(cell);\n rows.push(row);\n row = [];\n cell = \"\";\n if (ch === \"\\r\" && text[i + 1] === \"\\n\") i += 2;\n else i++;\n continue;\n }\n cell += ch;\n i++;\n }\n\n if (cell !== \"\" || row.length > 0) {\n row.push(cell);\n rows.push(row);\n }\n return rows;\n}\n\nexport function fallbackCopyText(text: string): boolean {\n let ta: HTMLTextAreaElement | null = null;\n try {\n ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.focus();\n ta.select();\n const ok = document.execCommand(\"copy\");\n return ok;\n } catch {\n return false;\n } finally {\n ta?.remove();\n }\n}\n\nexport async function writeClipboard(text: string): Promise<boolean> {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n void 0;\n }\n return fallbackCopyText(text);\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { writeClipboard } from \"../lib/clipboard\";\n\ntype KeyboardContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"buildRangeTsv\"\n | \"clearRangeValues\"\n | \"columnModel\"\n | \"editingService\"\n | \"isDestroyed\"\n | \"options\"\n | \"pasteText\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n | \"undoService\"\n>;\n\nconst NAVIGATION_KEYS = new Set([\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Enter\",\n \"F2\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"Tab\",\n \" \",\n \"Escape\",\n \"Delete\",\n \"Backspace\"\n]);\n\nconst MOVEMENT_KEYS = new Set([\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\"\n]);\n\ninterface KeyboardPosition {\n colIdx: number;\n row: number;\n}\n\nexport class KeyboardService {\n constructor(private core: KeyboardContext) {}\n\n init(): void {\n this.core.skeleton.root.addEventListener(\"keydown\", this.onKeyDown);\n this.core.skeleton.root.addEventListener(\"copy\", this.onCopy as EventListener);\n this.core.skeleton.root.addEventListener(\"cut\", this.onCut as EventListener);\n this.core.skeleton.root.addEventListener(\"paste\", this.onPaste as EventListener);\n }\n\n destroy(): void {\n this.core.skeleton.root.removeEventListener(\"keydown\", this.onKeyDown);\n this.core.skeleton.root.removeEventListener(\"copy\", this.onCopy as EventListener);\n this.core.skeleton.root.removeEventListener(\"cut\", this.onCut as EventListener);\n this.core.skeleton.root.removeEventListener(\"paste\", this.onPaste as EventListener);\n }\n\n nextEditable(rowIndex: number, colId: string, dir: 1 | -1): { rowIndex: number; column: Column } | null {\n const cols = this.core.columnModel.getOrderedVisible();\n const start = cols.findIndex((c) => c.id === colId);\n if (start < 0) return null;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n let i = start;\n let row = rowIndex;\n\n for (let guard = 0; guard < (cols.length + 1) * (rowCount + 1); guard++) {\n i += dir;\n if (i >= cols.length) {\n if (row >= rowCount - 1) return null;\n i = 0;\n row = this.skipDetailRows(row + 1, 1);\n } else if (i < 0) {\n if (row <= 0) return null;\n i = cols.length - 1;\n row = this.skipDetailRows(row - 1, -1);\n }\n if (row < 0 || row >= rowCount) return null;\n const node = this.core.rowModel.getDisplayedRow(row);\n if (node && !node.isDetail && this.core.editingService.isEditable(node, cols[i])) {\n return { rowIndex: row, column: cols[i] };\n }\n }\n return null;\n }\n\n private skipDetailRows(row: number, dir: 1 | -1): number {\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n let guard = 0;\n while (row >= 0 && row < rowCount) {\n const node = this.core.rowModel.getDisplayedRow(row);\n if (!node || !node.isDetail) return row;\n row += dir;\n guard++;\n if (guard > rowCount + 2) break;\n }\n return -1;\n }\n\n private onCopy = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const range = this.core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const text = this.core.buildRangeTsv(range);\n const dt = e.clipboardData;\n if (dt && typeof dt.setData === \"function\") {\n dt.setData(\"text/plain\", text);\n } else {\n void writeClipboard(text);\n }\n e.preventDefault();\n };\n\n private onCut = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const range = this.core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const text = this.core.buildRangeTsv(range);\n const dt = e.clipboardData;\n if (dt && typeof dt.setData === \"function\") {\n dt.setData(\"text/plain\", text);\n } else {\n void writeClipboard(text);\n }\n this.core.clearRangeValues(range);\n e.preventDefault();\n };\n\n private onPaste = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const start = this.core.bodyRenderer.getPasteStart();\n if (!start) return;\n const dt = e.clipboardData;\n const text = dt && typeof dt.getData === \"function\" ? dt.getData(\"text/plain\") : null;\n if (typeof text !== \"string\" || text === \"\") return;\n e.preventDefault();\n this.core.pasteText(text, start.row, start.colIdx);\n };\n\n private onKeyDown = (e: KeyboardEvent): void => {\n if (this.core.isDestroyed() || this.core.editingService.isEditing()) return;\n if (this.handleSelectAll(e) || this.handleHistoryShortcut(e)) return;\n if (!NAVIGATION_KEYS.has(e.key)) return;\n if (this.handleRangeCommand(e)) return;\n if (this.focusFirstCell(e)) return;\n this.handleFocusedKey(e);\n };\n\n private handleSelectAll(e: KeyboardEvent): boolean {\n const modifier = e.ctrlKey || e.metaKey;\n if (!modifier || e.key.toLowerCase() !== \"a\") return false;\n if (this.core.options.rowSelection === \"multiple\") {\n e.preventDefault();\n this.core.selectionService.selectAll(true);\n }\n return true;\n }\n\n private handleHistoryShortcut(e: KeyboardEvent): boolean {\n if ((!e.ctrlKey && !e.metaKey) || e.altKey) return false;\n const key = e.key.toLowerCase();\n if (key === \"z\") {\n e.preventDefault();\n if (e.shiftKey) this.core.undoService.redo();\n else this.core.undoService.undo();\n return true;\n }\n if (key !== \"y\") return false;\n e.preventDefault();\n this.core.undoService.redo();\n return true;\n }\n\n private handleRangeCommand(e: KeyboardEvent): boolean {\n const body = this.core.bodyRenderer;\n if (e.key === \"Escape\") {\n if (this.core.options.enableRangeSelection && body.normalizedRange()) {\n e.preventDefault();\n body.clearRangeSelection();\n }\n return true;\n }\n if (e.key !== \"Delete\" && e.key !== \"Backspace\") return false;\n if (!this.core.options.enableRangeSelection) return true;\n const range = body.normalizedRange();\n if (range && !(range.r1 === range.r2 && range.c1 === range.c2)) {\n e.preventDefault();\n this.core.clearRangeValues(range);\n }\n return true;\n }\n\n private focusFirstCell(e: KeyboardEvent): boolean {\n if (this.core.bodyRenderer.focusedCell) return false;\n const columns = this.core.columnModel.getOrderedVisible();\n if (this.core.rowModel.getDisplayedRowCount() > 0 && columns.length > 0) {\n e.preventDefault();\n this.core.bodyRenderer.setFocusedCell(0, columns[0].id);\n }\n return true;\n }\n\n private handleFocusedKey(e: KeyboardEvent): void {\n const body = this.core.bodyRenderer;\n const focus = body.focusedCell;\n if (!focus) return;\n const columns = this.core.columnModel.getOrderedVisible();\n const colIdx = columns.findIndex((column) => column.id === focus.colId);\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n if (colIdx < 0 || rowCount === 0) return;\n\n const start = { row: focus.rowIndex, colIdx };\n const position = this.resolveKeyPosition(e, start, columns, rowCount);\n if (!position) return;\n e.preventDefault();\n\n const moved = position.row !== start.row || position.colIdx !== start.colIdx;\n if (e.shiftKey && this.core.options.enableRangeSelection && moved) {\n body.moveRangeEnd(position.row, position.colIdx);\n return;\n }\n if (moved) body.setFocusedCell(position.row, columns[position.colIdx].id);\n }\n\n private resolveKeyPosition(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columns: readonly Column[],\n rowCount: number\n ): KeyboardPosition | null {\n if (MOVEMENT_KEYS.has(e.key)) return this.movePosition(e, position, columns.length, rowCount);\n if (e.key === \"Enter\" || e.key === \"F2\") {\n return this.activateEditor(e, position, columns, rowCount);\n }\n if (e.key === \" \") {\n this.toggleFocusedRow(position.row);\n return position;\n }\n if (e.key === \"Tab\") return this.moveToEditable(e, position, columns);\n return null;\n }\n\n private movePosition(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columnCount: number,\n rowCount: number\n ): KeyboardPosition {\n let { row, colIdx } = position;\n switch (e.key) {\n case \"ArrowUp\":\n row = this.validSkippedRow(row, this.skipDetailRows(row - 1, -1), rowCount);\n break;\n case \"ArrowDown\":\n row = this.validSkippedRow(row, this.skipDetailRows(row + 1, 1), rowCount);\n break;\n case \"ArrowLeft\":\n colIdx = Math.max(0, colIdx - 1);\n break;\n case \"ArrowRight\":\n colIdx = Math.min(columnCount - 1, colIdx + 1);\n break;\n case \"Home\":\n colIdx = 0;\n if (e.ctrlKey) row = 0;\n break;\n case \"End\":\n colIdx = columnCount - 1;\n if (e.ctrlKey) row = Math.max(0, this.skipDetailRows(rowCount - 1, -1));\n break;\n case \"PageUp\":\n case \"PageDown\":\n row = this.movePage(e.key, row, rowCount);\n break;\n }\n return { row, colIdx };\n }\n\n private validSkippedRow(current: number, candidate: number, rowCount: number): number {\n return candidate >= 0 && candidate < rowCount ? candidate : current;\n }\n\n private movePage(key: string, row: number, rowCount: number): number {\n const viewport = this.core.skeleton.bodyViewports.center;\n const pageRows = Math.max(1, Math.floor(viewport.clientHeight / this.core.options.rowHeight));\n const direction: 1 | -1 = key === \"PageUp\" ? -1 : 1;\n const target = Math.max(0, Math.min(rowCount - 1, row + pageRows * direction));\n return this.validSkippedRow(row, this.skipDetailRows(target, direction), rowCount);\n }\n\n private activateEditor(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columns: readonly Column[],\n rowCount: number\n ): KeyboardPosition {\n const node = this.core.rowModel.getDisplayedRow(position.row);\n const column = columns[position.colIdx];\n if (node && !node.isDetail && column && this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(position.row, column, e.key === \"F2\" ? e.key : null);\n return position;\n }\n const down = this.skipDetailRows(position.row + 1, 1);\n return { ...position, row: this.validSkippedRow(position.row, down, rowCount) };\n }\n\n private toggleFocusedRow(row: number): void {\n const node = this.core.rowModel.getDisplayedRow(row);\n if (!node || node.isDetail) return;\n if (node.isGroup) {\n this.core.rowModel.toggleGroup(node.id);\n return;\n }\n if (this.core.options.rowSelection === \"none\") return;\n this.core.selectionService.setNodeSelected(\n node,\n !node.selected,\n this.core.options.rowSelection === \"single\"\n );\n }\n\n private moveToEditable(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columns: readonly Column[]\n ): KeyboardPosition | null {\n const next = this.nextEditable(position.row, columns[position.colIdx].id, e.shiftKey ? -1 : 1);\n if (!next) return null;\n this.core.bodyRenderer.setFocusedCell(next.rowIndex, next.column.id);\n this.core.editingService.start(next.rowIndex, next.column);\n return position;\n }\n}\n","import type { ICellEditor } from \"../types/params\";\nimport type { Column } from \"./column\";\n\nfunction baseInput(type: string, value: any): HTMLInputElement {\n const input = document.createElement(\"input\");\n input.type = type;\n input.className = \"mach-editor-input\";\n if (value != null && value !== \"\") {\n input.value = type === \"date\" ? String(value).slice(0, 10) : String(value);\n }\n return input;\n}\n\nfunction inferEditorType(value: any, selectValues?: (string | number)[]): string {\n if (selectValues && selectValues.length > 0) return \"select\";\n if (typeof value === \"number\") return \"number\";\n if (value instanceof Date) return \"date\";\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) return \"date\";\n return \"text\";\n}\n\nexport function createEditor(column: Column, value: any, keyPress?: string | null): ICellEditor {\n const def = column.colDef;\n const name = typeof def.cellEditor === \"string\" ? def.cellEditor : inferEditorType(value, def.cellEditorParams?.values);\n\n if (name === \"number\") {\n const input = baseInput(\"number\", value);\n return {\n el: input,\n getValue: () => (input.value === \"\" ? null : Number(input.value)),\n focus: () => {\n input.focus();\n input.select();\n }\n };\n }\n\n if (name === \"date\") {\n const input = baseInput(\"date\", value);\n const raw = value == null ? \"\" : String(value);\n const timeMatch = raw.match(/T(\\d{2}:\\d{2})/);\n return {\n el: input,\n getValue: () => {\n if (input.value === \"\") return null;\n if (timeMatch) return `${input.value}T${timeMatch[1]}`;\n return input.value;\n },\n focus: () => input.focus()\n };\n }\n\n if (name === \"select\") {\n const values = def.cellEditorParams?.values ?? [];\n const select = document.createElement(\"select\");\n select.className = \"mach-editor-select\";\n for (const v of values) {\n const option = document.createElement(\"option\");\n option.value = String(v);\n option.textContent = String(v);\n if (String(value) === String(v)) option.selected = true;\n select.appendChild(option);\n }\n return {\n el: select,\n getValue: () => {\n const match = values.find((v) => String(v) === select.value);\n return match !== undefined ? match : select.value;\n },\n focus: () => select.focus()\n };\n }\n\n const input = baseInput(\"text\", value);\n if (keyPress && keyPress.length === 1) input.value = keyPress;\n return {\n el: input,\n getValue: () => input.value,\n focus: () => {\n input.focus();\n input.select();\n }\n };\n}\n","/** Runtime-only DOM state kept out of public elements and their string keys. */\nexport interface CellRuntimeState {\n destroy?: () => void;\n refresh?: (params: import(\"../types/params\").CellRendererParams) => boolean | void;\n rendererDefinition?: unknown;\n rendererRowId?: string;\n rendererColumnId?: string;\n flashTimer?: number;\n styleKeys?: string[];\n}\n\nconst cellStates = new WeakMap<HTMLElement, CellRuntimeState>();\nconst detailDestroyers = new WeakMap<HTMLElement, () => void>();\nconst headerDestroyers = new WeakMap<HTMLElement, () => void>();\n\nexport function getCellRuntimeState(element: HTMLElement): CellRuntimeState {\n let state = cellStates.get(element);\n if (!state) {\n state = {};\n cellStates.set(element, state);\n }\n return state;\n}\n\nexport function peekCellRuntimeState(element: HTMLElement): CellRuntimeState | undefined {\n return cellStates.get(element);\n}\n\nexport function setDetailDestroyer(element: HTMLElement, destroy: (() => void) | undefined): void {\n if (destroy) detailDestroyers.set(element, destroy);\n else detailDestroyers.delete(element);\n}\n\nexport function takeDetailDestroyer(element: HTMLElement): (() => void) | undefined {\n const destroy = detailDestroyers.get(element);\n detailDestroyers.delete(element);\n return destroy;\n}\n\nexport function setHeaderDestroyer(element: HTMLElement, destroy: (() => void) | undefined): void {\n if (destroy) headerDestroyers.set(element, destroy);\n else headerDestroyers.delete(element);\n}\n\nexport function takeHeaderDestroyer(element: HTMLElement): (() => void) | undefined {\n const destroy = headerDestroyers.get(element);\n headerDestroyers.delete(element);\n return destroy;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"../services/column\";\nimport { hasColumnType } from \"../core/resolveOptions\";\nimport type { CellClassParams, CellRendererParams } from \"../types/params\";\nimport { getCellRuntimeState, peekCellRuntimeState } from \"./runtimeState\";\n\ntype ErrorContext = Pick<GridCore<any>, \"reportError\">;\ntype CellValueContext = Pick<GridCore<any>, \"getApi\" | \"getCellValue\" | \"reportError\">;\ntype CellRenderContext = CellValueContext & Pick<GridCore<any>, \"options\" | \"resolveCellRenderer\">;\n\nexport function defaultFormat(value: any): string {\n if (value == null) return \"\";\n if (value instanceof Date) return value.toLocaleDateString();\n if (typeof value === \"object\") {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n return String(value);\n}\n\nexport function cleanupCellContent(core: ErrorContext, cell: HTMLElement): void {\n const state = peekCellRuntimeState(cell);\n if (!state) return;\n if (state.flashTimer) clearTimeout(state.flashTimer);\n state.flashTimer = undefined;\n const destroy = state.destroy;\n state.destroy = undefined;\n state.refresh = undefined;\n state.rendererDefinition = undefined;\n state.rendererRowId = undefined;\n state.rendererColumnId = undefined;\n if (!destroy) return;\n try {\n destroy();\n } catch (error) {\n core.reportError(error, \"cellRenderer.destroy\", { colId: cell.dataset.colId });\n }\n}\n\nfunction updateCellTooltip(\n core: CellRenderContext,\n cell: HTMLElement,\n node: RowNode<any>,\n column: Column,\n value: any,\n formatted: string\n): void {\n let tooltip = core.options.tooltipComponent ? \"\" : formatted;\n const tooltipGetter = column.colDef.tooltipValueGetter;\n if (tooltipGetter) {\n try {\n tooltip = tooltipGetter({\n api: core.getApi(), colDef: column.colDef, column, node, data: node.data, value\n }) ?? formatted;\n } catch (error) {\n core.reportError(error, \"tooltipValueGetter\", { colId: column.id, rowId: node.id });\n }\n }\n if (tooltip) cell.setAttribute(\"title\", tooltip);\n else cell.removeAttribute(\"title\");\n}\n\nfunction tryRefreshRenderer(\n core: CellRenderContext,\n cell: HTMLElement,\n node: RowNode<any>,\n column: Column,\n renderer: unknown,\n params: CellRendererParams\n): boolean {\n const state = peekCellRuntimeState(cell);\n if (\n !state?.refresh ||\n state.rendererDefinition !== renderer ||\n state.rendererRowId !== node.id ||\n state.rendererColumnId !== column.id\n ) return false;\n try {\n cell.querySelector(\":scope > .mach-cell-edit-trigger\")?.remove();\n return state.refresh(params) !== false;\n } catch (error) {\n core.reportError(error, \"cellRenderer.refresh\", { colId: column.id, rowId: node.id });\n return false;\n }\n}\n\nexport function formatCellValue(core: CellValueContext, node: RowNode<any>, column: Column): string {\n const value = core.getCellValue(node, column);\n const formatter = column.colDef.valueFormatter;\n if (formatter) {\n try {\n const out = formatter({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value\n });\n return out == null ? \"\" : String(out);\n } catch (error) {\n core.reportError(error, \"valueFormatter\", { colId: column.id, rowId: node.id });\n }\n }\n return defaultFormat(value);\n}\n\nexport function formatCellValueWith(core: CellValueContext, node: RowNode<any>, column: Column, value: any): string {\n const formatter = column.colDef.valueFormatter;\n if (formatter) {\n try {\n const out = formatter({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value\n });\n return out == null ? \"\" : String(out);\n } catch (error) {\n core.reportError(error, \"valueFormatter\", { colId: column.id, rowId: node.id });\n }\n }\n return defaultFormat(value);\n}\n\nexport function applyCellStyle(core: CellValueContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const rule = column.colDef.cellStyle;\n const state = getCellRuntimeState(cell);\n const prevKeys = state.styleKeys;\n if (prevKeys) {\n for (const key of prevKeys) {\n Reflect.set(cell.style, key, \"\");\n }\n }\n if (!rule) {\n state.styleKeys = undefined;\n return;\n }\n let styles: Partial<CSSStyleDeclaration> | null | undefined;\n if (typeof rule === \"function\") {\n const value = core.getCellValue(node, column);\n try {\n styles = rule({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n });\n } catch (error) {\n core.reportError(error, \"cellStyle\", { colId: column.id, rowId: node.id });\n styles = null;\n }\n } else {\n styles = rule;\n }\n if (!styles) {\n state.styleKeys = undefined;\n return;\n }\n const keys = Object.keys(styles);\n for (const key of keys) {\n Reflect.set(cell.style, key, Reflect.get(styles, key));\n }\n state.styleKeys = keys;\n}\n\nexport function renderCellContent(core: CellRenderContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const value = core.getCellValue(node, column);\n const formatted = formatCellValue(core, node, column);\n const rendererDef = column.colDef.cellRenderer;\n const renderer =\n typeof rendererDef === \"string\" ? core.resolveCellRenderer(rendererDef) : rendererDef;\n\n if (renderer) {\n const params: CellRendererParams = {\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n formatted,\n rowIndex: node.rowIndex,\n rendererParams: column.colDef.cellRendererParams\n };\n if (tryRefreshRenderer(core, cell, node, column, renderer, params)) {\n updateCellTooltip(core, cell, node, column, value, formatted);\n return;\n }\n cleanupCellContent(core, cell);\n let out: ReturnType<typeof renderer>;\n try {\n out = renderer(params);\n } catch (error) {\n core.reportError(error, \"cellRenderer\", { colId: column.id, rowId: node.id });\n cell.textContent = formatted;\n return;\n }\n if (typeof out === \"string\") {\n cell.textContent = out;\n } else if (out instanceof HTMLElement) {\n cell.replaceChildren(out);\n } else if (out && typeof out === \"object\" && out.el instanceof HTMLElement) {\n const result = out;\n cell.replaceChildren(result.el);\n const state = getCellRuntimeState(cell);\n state.destroy = result.destroy;\n if (result.refresh) {\n state.refresh = (next) => result.refresh!(next);\n state.rendererDefinition = renderer;\n state.rendererRowId = node.id;\n state.rendererColumnId = column.id;\n }\n } else {\n cell.textContent = \"\";\n }\n } else {\n cleanupCellContent(core, cell);\n cell.textContent = formatted;\n }\n updateCellTooltip(core, cell, node, column, value, formatted);\n}\n\nexport function applyCellClasses(core: CellValueContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const value = core.getCellValue(node, column);\n const classes = [\"mach-cell\"];\n const align = column.colDef.align;\n if (align === \"center\") {\n classes.push(\"mach-cell--center\");\n } else if (align === \"right\") {\n classes.push(\"mach-cell--right\");\n } else if (hasColumnType(column.colDef, \"rightAligned\") || hasColumnType(column.colDef, \"numericColumn\") || (typeof value === \"number\" && value != null)) {\n classes.push(\"mach-cell--num\");\n }\n\n const rule = column.colDef.cellClass;\n if (rule) {\n if (typeof rule === \"function\") {\n const params: CellClassParams = {\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n };\n try {\n const result = rule(params);\n if (typeof result === \"string\") classes.push(result);\n else if (Array.isArray(result)) classes.push(...result);\n } catch (error) {\n core.reportError(error, \"cellClass\", { colId: column.id, rowId: node.id });\n }\n } else if (typeof rule === \"string\") {\n classes.push(rule);\n } else if (Array.isArray(rule)) {\n classes.push(...rule);\n }\n }\n\n const hadFocus = cell.classList.contains(\"mach-cell--focus\");\n const hadEditing = cell.classList.contains(\"mach-cell--editing\");\n if (hadFocus) classes.push(\"mach-cell--focus\");\n if (hadEditing) classes.push(\"mach-cell--editing\");\n if (column.colDef.wrapText) classes.push(\"mach-cell--wrap\");\n\n const className = classes.join(\" \");\n if (cell.className !== className) cell.className = className;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type { RowNode } from \"../types/row\";\nimport type { ICellEditor } from \"../types/params\";\nimport { createEditor } from \"./editors\";\nimport { cleanupCellContent } from \"../render/cellContent\";\n\ntype EditingContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"keyboardService\"\n | \"notifyCellValueChanged\"\n | \"options\"\n | \"reportError\"\n | \"resolveCellEditor\"\n | \"rowModel\"\n | \"setCellValue\"\n | \"statusBarService\"\n | \"summaryRenderer\"\n | \"undoService\"\n | \"writeValue\"\n>;\n\ninterface MountedEditor {\n editor: ICellEditor;\n cell: HTMLElement;\n shell: HTMLElement;\n keydown: (event: KeyboardEvent) => void;\n input?: (event: Event) => void;\n}\n\ninterface CellEditingState extends MountedEditor {\n node: RowNode<any>;\n column: Column;\n rowIndex: number;\n oldValue: any;\n confirmButton: HTMLButtonElement;\n cancelButton: HTMLButtonElement;\n}\n\ninterface RowDraft {\n column: Column;\n oldValue: any;\n value: any;\n mounted: MountedEditor | null;\n error?: string;\n}\n\ninterface RowEditingState {\n node: RowNode<any>;\n rowIndex: number;\n drafts: Map<string, RowDraft>;\n validating: boolean;\n}\n\nconst CHECK_PATH = '<path d=\"M3 8.5 6.4 12 13.5 4\"/>';\nconst CLOSE_PATH = '<path d=\"m4 4 8 8m0-8-8 8\"/>';\n\nfunction createEditButton(kind: \"confirm\" | \"cancel\", label: string): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = `mach-edit-control mach-edit-control--${kind}`;\n button.setAttribute(\"aria-label\", label);\n button.title = label;\n button.innerHTML = `<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${kind === \"confirm\" ? CHECK_PATH : CLOSE_PATH}</svg>`;\n button.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n });\n return button;\n}\n\nexport class EditingService {\n private cellEditing: CellEditingState | null = null;\n private rowEditing: RowEditingState | null = null;\n private stopPromise: Promise<boolean> | null = null;\n private stopToken = 0;\n\n constructor(private core: EditingContext) {}\n\n isEditing(rowIndex?: number, colId?: string): boolean {\n if (this.cellEditing) {\n if (rowIndex == null && colId == null) return true;\n return this.cellEditing.rowIndex === rowIndex && this.cellEditing.column.id === colId;\n }\n if (!this.rowEditing) return false;\n if (rowIndex == null && colId == null) return true;\n if (this.currentRowIndex(this.rowEditing) !== rowIndex) return false;\n return colId == null || this.rowEditing.drafts.has(colId);\n }\n\n isCellEditing(): boolean {\n return this.cellEditing != null;\n }\n\n isRowEditing(rowIndex?: number): boolean {\n if (!this.rowEditing) return false;\n return rowIndex == null || this.currentRowIndex(this.rowEditing) === rowIndex;\n }\n\n isEditable(node: RowNode<any>, column: Column): boolean {\n if (node.isDetail || node.isGroup || node.data == null) return false;\n const editable = column.colDef.editable;\n if (!editable) return false;\n if (typeof editable === \"function\") {\n try {\n return editable({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex: node.rowIndex\n });\n } catch (error) {\n this.core.reportError(error, \"editable\", { colId: column.id, rowId: node.id });\n return false;\n }\n }\n return true;\n }\n\n start(rowIndex: number, column: Column, keyPress?: string | null): boolean {\n if (this.core.options.editType === \"fullRow\") return this.startRow(rowIndex, column.id);\n if (this.cellEditing || this.rowEditing) return false;\n const node = this.core.rowModel.getDisplayedRow(rowIndex);\n if (!node || node.data == null || !this.isEditable(node, column)) return false;\n const cell = this.core.bodyRenderer.getCellElement(rowIndex, column.id);\n if (!cell) return false;\n\n const oldValue = this.core.getCellValue(node, column);\n const editor = this.createCellEditor(node, column, rowIndex, oldValue, keyPress);\n if (!editor) return false;\n\n cleanupCellContent(this.core, cell);\n const shell = document.createElement(\"div\");\n shell.className = \"mach-cell-editor-shell\";\n const controls = document.createElement(\"div\");\n controls.className = \"mach-cell-editor-controls\";\n const confirmButton = createEditButton(\"confirm\", \"Confirm edit\");\n const cancelButton = createEditButton(\"cancel\", \"Cancel edit\");\n controls.append(confirmButton, cancelButton);\n shell.append(editor.el, controls);\n cell.replaceChildren(shell);\n cell.classList.add(\"mach-cell--editing\");\n cell.removeAttribute(\"title\");\n\n const keydown = this.onCellEditorKeyDown;\n editor.el.addEventListener(\"keydown\", keydown);\n editor.el.addEventListener(\"focusout\", this.onCellEditorBlur);\n confirmButton.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n void this.stopAsync(false);\n });\n cancelButton.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n void this.stopAsync(true);\n });\n\n this.cellEditing = {\n node,\n column,\n editor,\n rowIndex,\n oldValue,\n cell,\n shell,\n keydown,\n confirmButton,\n cancelButton\n };\n this.focusEditor(editor, column, node);\n this.core.emit(\"cellEditingStarted\", { rowIndex, colId: column.id, rowNode: node });\n return true;\n }\n\n startRow(rowIndex: number, preferredColId?: string): boolean {\n if (this.cellEditing || this.rowEditing) return false;\n const node = this.core.rowModel.getDisplayedRow(rowIndex);\n if (!node || node.data == null || node.isDetail || node.isGroup) return false;\n\n const drafts = new Map<string, RowDraft>();\n for (const column of this.core.columnModel.getOrderedVisible()) {\n if (!this.isEditable(node, column)) continue;\n const oldValue = this.core.getCellValue(node, column);\n drafts.set(column.id, { column, oldValue, value: oldValue, mounted: null });\n }\n if (drafts.size === 0) return false;\n\n const row: RowEditingState = { node, rowIndex, drafts, validating: false };\n this.rowEditing = row;\n this.core.bodyRenderer.refreshRows([rowIndex]);\n if (drafts.size === 0) {\n this.rowEditing = null;\n this.core.bodyRenderer.refreshRows([rowIndex]);\n return false;\n }\n const first = drafts.values().next().value;\n const target = (preferredColId ? drafts.get(preferredColId) : undefined) ?? first;\n if (target?.mounted) this.focusEditor(target.mounted.editor, target.column, node);\n this.core.emit(\"rowEditingStarted\", { rowIndex, rowNode: node, data: node.data });\n return true;\n }\n\n /** Called by BodyRenderer so row editors survive horizontal/vertical virtualization. */\n renderEditor(rowIndex: number, node: RowNode<any>, column: Column, cell: HTMLElement): boolean {\n if (this.cellEditing) return this.cellEditing.node === node && this.cellEditing.column.id === column.id;\n const row = this.rowEditing;\n if (!row || row.node !== node) return false;\n const draft = row.drafts.get(column.id);\n if (!draft) return false;\n if (draft.mounted?.cell !== cell) {\n if (draft.mounted) this.unmountRowDraft(draft);\n if (!this.mountRowDraft(rowIndex, row, draft, cell)) {\n row.drafts.delete(column.id);\n return false;\n }\n }\n return true;\n }\n\n /** Captures a staged value before a pooled/virtual cell is reused. */\n releaseCell(rowIndex: number, colId: string, cell: HTMLElement): void {\n const row = this.rowEditing;\n if (row && this.currentRowIndex(row) === rowIndex) {\n const draft = row.drafts.get(colId);\n if (draft?.mounted?.cell === cell) this.unmountRowDraft(draft);\n return;\n }\n if (this.cellEditing?.cell === cell) {\n const editing = this.cellEditing;\n void this.stopAsync(false);\n // A pooled cell cannot safely retain an editor while async validation is pending.\n // Synchronous commits have already completed; pending editors are cancelled cleanly.\n if (this.cellEditing === editing) void this.stopAsync(true);\n }\n }\n\n stop(cancel = false): void {\n void this.stopAsync(cancel);\n }\n\n stopAsync(cancel = false): Promise<boolean> {\n if (this.rowEditing) return this.stopRowAsync(cancel);\n const editing = this.cellEditing;\n if (!editing) return Promise.resolve(false);\n if (cancel) {\n this.stopToken++;\n this.stopPromise = null;\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n if (this.stopPromise) return this.stopPromise;\n\n let newValue: any;\n try {\n newValue = editing.editor.getValue();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.getValue\", { colId: editing.column.id, rowId: editing.node.id });\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n try {\n if (editing.editor.isCancelAfterEnd?.(newValue)) {\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n } catch (error) {\n this.core.reportError(error, \"cellEditor.isCancelAfterEnd\", { colId: editing.column.id, rowId: editing.node.id });\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n\n const validation = this.validateValue(editing.node, editing.column, editing.oldValue, newValue);\n if (validation && typeof (validation as Promise<unknown>).then === \"function\") {\n const token = ++this.stopToken;\n this.setCellBusy(editing, true);\n const task = Promise.resolve(validation)\n .then((result) => {\n if (token !== this.stopToken || this.cellEditing !== editing) return false;\n if (typeof result === \"string\") {\n this.showError(editing.editor, result);\n return false;\n }\n return this.finishCellStop(editing, false, newValue);\n })\n .catch((error) => {\n if (token !== this.stopToken || this.cellEditing !== editing) return false;\n this.core.reportError(error, \"validate\", { colId: editing.column.id, rowId: editing.node.id });\n this.showError(editing.editor, \"Validation failed\");\n return false;\n })\n .finally(() => {\n if (this.stopPromise === task) this.stopPromise = null;\n });\n this.stopPromise = task;\n return task;\n }\n if (typeof validation === \"string\") {\n this.showError(editing.editor, validation);\n return Promise.resolve(false);\n }\n return Promise.resolve(this.finishCellStop(editing, false, newValue));\n }\n\n stopRowAsync(cancel = false): Promise<boolean> {\n const row = this.rowEditing;\n if (!row) return Promise.resolve(false);\n if (cancel) {\n this.stopToken++;\n this.stopPromise = null;\n return Promise.resolve(this.finishRowStop(row, true));\n }\n if (this.stopPromise) return this.stopPromise;\n\n for (const draft of row.drafts.values()) this.captureRowDraft(draft);\n const changed = [...row.drafts.values()].filter((draft) => !Object.is(draft.oldValue, draft.value));\n if (changed.length === 0) return Promise.resolve(this.finishRowStop(row, false));\n\n const token = ++this.stopToken;\n for (const draft of changed) draft.error = undefined;\n row.validating = true;\n this.setRowBusy(row, true);\n const task = Promise.all(\n changed.map(async (draft) => {\n try {\n const result = await this.validateValue(row.node, draft.column, draft.oldValue, draft.value);\n return { draft, message: typeof result === \"string\" ? result : null };\n } catch (error) {\n this.core.reportError(error, \"validate\", { colId: draft.column.id, rowId: row.node.id });\n return { draft, message: \"Validation failed\" };\n }\n })\n )\n .then(async (results) => {\n if (token !== this.stopToken || this.rowEditing !== row) return false;\n const invalid = results.filter((result) => result.message != null);\n if (invalid.length > 0) {\n this.showRowErrors(row, invalid.map((result) => ({ draft: result.draft, message: result.message! })));\n return false;\n }\n const rowErrors = await this.validateRowDraft(row, changed);\n if (token !== this.stopToken || this.rowEditing !== row) return false;\n if (rowErrors.length > 0) {\n this.showRowErrors(row, rowErrors);\n return false;\n }\n return this.finishRowStop(row, false);\n })\n .finally(() => {\n if (this.stopPromise === task) this.stopPromise = null;\n });\n this.stopPromise = task;\n return task;\n }\n\n private finishCellStop(editing: CellEditingState, cancel: boolean, newValue: any): boolean {\n if (this.cellEditing !== editing) return false;\n this.cellEditing = null;\n const changed = !cancel && this.applyValue(editing.node, editing.column, editing.oldValue, newValue);\n this.destroyMountedEditor(editing, true);\n\n this.core.emit(\"cellEditingStopped\", {\n rowIndex: editing.rowIndex,\n colId: editing.column.id,\n rowNode: editing.node,\n oldValue: editing.oldValue,\n newValue: changed ? newValue : editing.oldValue\n });\n if (editing.node.rowIndex >= 0) this.core.bodyRenderer.refreshRows([editing.node.rowIndex]);\n this.core.summaryRenderer.refresh();\n this.core.statusBarService.refresh();\n return true;\n }\n\n private finishRowStop(row: RowEditingState, cancelled: boolean): boolean {\n if (this.rowEditing !== row) return false;\n const changes = cancelled ? [] : this.commitRowDrafts(row);\n if (changes == null) return false;\n for (const draft of row.drafts.values()) {\n if (!cancelled) this.captureRowDraft(draft);\n if (draft.mounted) this.destroyMountedEditor(draft.mounted, true);\n draft.mounted = null;\n }\n this.rowEditing = null;\n\n const rowIndex = this.currentRowIndex(row);\n this.core.emit(\"rowEditingStopped\", {\n rowIndex,\n rowNode: row.node,\n data: row.node.data!,\n cancelled,\n changes\n });\n if (rowIndex >= 0) this.core.bodyRenderer.refreshRows([rowIndex]);\n this.core.summaryRenderer.refresh();\n this.core.statusBarService.refresh();\n return true;\n }\n\n private commitRowDrafts(\n row: RowEditingState\n ): Array<{ colId: string; oldValue: unknown; newValue: unknown }> | null {\n const changed = [...row.drafts.values()].filter((draft) => !Object.is(draft.oldValue, draft.value));\n if (changed.length === 0) return [];\n const applied: RowDraft[] = [];\n this.core.undoService.beginBatch();\n for (const draft of changed) {\n if (!this.core.writeValue(row.node, draft.column, draft.value, draft.oldValue)) {\n let rollbackFailed = false;\n for (const previous of [...applied].reverse()) {\n if (!this.core.writeValue(row.node, previous.column, previous.oldValue, previous.value)) rollbackFailed = true;\n }\n this.core.undoService.cancelBatch();\n if (rollbackFailed) {\n this.core.reportError(new Error(\"A valueSetter rejected full-row rollback\"), \"rowEditRollback\", {\n rowId: row.node.id,\n colId: draft.column.id\n });\n }\n this.showRowErrors(row, [{ draft, message: \"Value was rejected by the column setter\" }]);\n return null;\n }\n applied.push(draft);\n }\n for (const draft of applied) {\n this.core.notifyCellValueChanged(row.node, draft.column, draft.oldValue, draft.value);\n }\n this.core.undoService.endBatch();\n return applied.map((draft) => ({\n colId: draft.column.id,\n oldValue: draft.oldValue,\n newValue: draft.value\n }));\n }\n\n private mountRowDraft(rowIndex: number, row: RowEditingState, draft: RowDraft, cell: HTMLElement): boolean {\n const editor = this.createCellEditor(row.node, draft.column, rowIndex, draft.value, null);\n if (!editor) return false;\n cleanupCellContent(this.core, cell);\n const shell = document.createElement(\"div\");\n shell.className = \"mach-row-editor-shell\";\n shell.appendChild(editor.el);\n cell.replaceChildren(shell);\n cell.classList.add(\"mach-cell--editing\", \"mach-cell--row-editing\");\n cell.removeAttribute(\"title\");\n\n const keydown = (event: KeyboardEvent) => this.onRowEditorKeyDown(event, row, draft);\n const input = () => {\n try {\n draft.value = editor.getValue();\n draft.error = undefined;\n } catch {\n // getValue is retried at commit and reported with column context there.\n }\n };\n editor.el.addEventListener(\"keydown\", keydown);\n editor.el.addEventListener(\"input\", input);\n draft.mounted = { editor, cell, shell, keydown, input };\n if (draft.error) this.showError(editor, draft.error);\n if (row.validating) {\n editor.el.classList.add(\"mach-editor-validating\");\n editor.el.setAttribute(\"aria-busy\", \"true\");\n editor.el.inert = true;\n }\n return true;\n }\n\n private unmountRowDraft(draft: RowDraft): void {\n if (!draft.mounted) return;\n this.captureRowDraft(draft);\n this.destroyMountedEditor(draft.mounted, true);\n draft.mounted = null;\n }\n\n private captureRowDraft(draft: RowDraft): void {\n if (!draft.mounted) return;\n try {\n const next = draft.mounted.editor.getValue();\n if (next !== undefined) draft.value = next;\n } catch (error) {\n this.core.reportError(error, \"cellEditor.getValue\", {\n colId: draft.column.id,\n rowId: this.rowEditing?.node.id\n });\n }\n }\n\n private createCellEditor(\n node: RowNode<any>,\n column: Column,\n rowIndex: number,\n value: any,\n keyPress?: string | null\n ): ICellEditor | null {\n const def = column.colDef;\n let editor: ICellEditor;\n try {\n const params = {\n api: this.core.getApi(),\n colDef: def,\n column,\n node,\n data: node.data,\n value,\n rowIndex,\n keyPress\n };\n if (typeof def.cellEditor === \"function\") {\n editor = def.cellEditor(params);\n } else if (typeof def.cellEditor === \"string\" && ![\"text\", \"number\", \"date\", \"select\"].includes(def.cellEditor)) {\n editor = this.core.resolveCellEditor(def.cellEditor)?.(params) ?? createEditor(column, value, keyPress);\n } else {\n editor = createEditor(column, value, keyPress);\n }\n } catch (error) {\n this.core.reportError(error, \"cellEditor\", { colId: column.id, rowId: node.id });\n return null;\n }\n if (!editor || !(editor.el instanceof HTMLElement)) {\n this.core.reportError(new Error(\"cellEditor must return an editor with an HTMLElement el\"), \"cellEditor\", {\n colId: column.id,\n rowId: node.id\n });\n return null;\n }\n try {\n if (editor.isCancelBeforeStart?.()) {\n editor.destroy?.();\n return null;\n }\n } catch (error) {\n this.core.reportError(error, \"cellEditor.isCancelBeforeStart\", { colId: column.id, rowId: node.id });\n try { editor.destroy?.(); } catch { void 0; }\n return null;\n }\n return editor;\n }\n\n private validateValue(\n node: RowNode<any>,\n column: Column,\n oldValue: any,\n newValue: any\n ): string | true | null | undefined | Promise<string | true | null | undefined> {\n const validate = column.colDef.validate;\n if (!validate) return true;\n try {\n return validate(newValue, {\n oldValue,\n newValue,\n data: node.data!,\n node,\n colDef: column.colDef,\n column,\n api: this.core.getApi()\n });\n } catch (error) {\n this.core.reportError(error, \"validate\", { colId: column.id, rowId: node.id });\n return \"Validation failed\";\n }\n }\n\n private async validateRowDraft(\n row: RowEditingState,\n changed: RowDraft[]\n ): Promise<Array<{ draft: RowDraft; message: string }>> {\n const validator = this.core.options.rowEditValidator;\n if (!validator) return [];\n const values: Record<string, unknown> = Object.create(null);\n for (const [colId, draft] of row.drafts) values[colId] = draft.value;\n const changes = changed.map((draft) => ({\n colId: draft.column.id,\n oldValue: draft.oldValue,\n newValue: draft.value\n }));\n let result: import(\"../types/options\").RowEditValidationResult;\n try {\n result = await validator({ data: row.node.data!, node: row.node, values, changes, api: this.core.getApi() });\n } catch (error) {\n this.core.reportError(error, \"rowEditValidator\", { rowId: row.node.id });\n return [{ draft: changed[0], message: \"Row validation failed\" }];\n }\n if (typeof result === \"string\") return [{ draft: changed[0], message: result }];\n if (!result || result === true || typeof result !== \"object\") return [];\n const errors: Array<{ draft: RowDraft; message: string }> = [];\n for (const [colId, message] of Object.entries(result)) {\n const draft = row.drafts.get(colId);\n if (draft && typeof message === \"string\" && message) errors.push({ draft, message });\n }\n if (errors.length === 0) {\n const firstMessage = Object.values(result).find((message) => typeof message === \"string\" && message);\n if (typeof firstMessage === \"string\") errors.push({ draft: changed[0], message: firstMessage });\n }\n return errors;\n }\n\n private showRowErrors(row: RowEditingState, errors: Array<{ draft: RowDraft; message: string }>): void {\n row.validating = false;\n this.setRowBusy(row, false);\n for (const { draft, message } of errors) {\n draft.error = message;\n if (draft.mounted) this.showError(draft.mounted.editor, message);\n }\n errors[0].draft.mounted?.editor.focus?.();\n }\n\n private showError(editor: ICellEditor, message: string): void {\n const editorEl = editor.el;\n editorEl.classList.add(\"mach-editor-invalid\");\n editorEl.setAttribute(\"title\", message);\n editorEl.setAttribute(\"aria-invalid\", \"true\");\n editorEl.classList.remove(\"mach-editor-validating\");\n editorEl.removeAttribute(\"aria-busy\");\n editorEl.inert = false;\n const input = editorEl.querySelector(\"input, select, textarea\") ?? editorEl;\n (input as HTMLElement).focus?.();\n const clear = () => {\n editorEl.classList.remove(\"mach-editor-invalid\");\n editorEl.removeAttribute(\"title\");\n editorEl.removeAttribute(\"aria-invalid\");\n };\n editorEl.addEventListener(\"input\", clear, { once: true });\n }\n\n private setCellBusy(editing: CellEditingState, busy: boolean): void {\n editing.editor.el.classList.toggle(\"mach-editor-validating\", busy);\n if (busy) editing.editor.el.setAttribute(\"aria-busy\", \"true\");\n else editing.editor.el.removeAttribute(\"aria-busy\");\n editing.editor.el.inert = busy;\n editing.confirmButton.disabled = busy;\n editing.cancelButton.disabled = false;\n editing.shell.classList.toggle(\"mach-editor-shell--busy\", busy);\n }\n\n private setRowBusy(row: RowEditingState, busy: boolean): void {\n for (const draft of row.drafts.values()) {\n const editorEl = draft.mounted?.editor.el;\n if (!editorEl) continue;\n editorEl.classList.toggle(\"mach-editor-validating\", busy);\n if (busy) editorEl.setAttribute(\"aria-busy\", \"true\");\n else editorEl.removeAttribute(\"aria-busy\");\n editorEl.inert = busy;\n }\n }\n\n private applyValue(node: RowNode<any>, column: Column, oldValue: any, newValue: any): boolean {\n if (newValue === undefined) return false;\n return this.core.setCellValue(node, column, newValue, oldValue);\n }\n\n private focusEditor(editor: ICellEditor, column: Column, node: RowNode<any>): void {\n try {\n editor.focus?.();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.focus\", { colId: column.id, rowId: node.id });\n }\n }\n\n private destroyMountedEditor(mounted: MountedEditor, removeCellState: boolean): void {\n mounted.editor.el.removeEventListener(\"keydown\", mounted.keydown);\n if (mounted.input) mounted.editor.el.removeEventListener(\"input\", mounted.input);\n mounted.editor.el.removeEventListener(\"focusout\", this.onCellEditorBlur);\n mounted.editor.el.classList.remove(\"mach-editor-validating\");\n mounted.editor.el.removeAttribute(\"aria-busy\");\n mounted.editor.el.inert = false;\n try {\n mounted.editor.destroy?.();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.destroy\", { colId: mounted.cell.dataset.colId });\n }\n if (removeCellState) mounted.cell.classList.remove(\"mach-cell--editing\", \"mach-cell--row-editing\", \"mach-cell--error\");\n }\n\n private currentRowIndex(row: RowEditingState): number {\n return row.node.rowIndex >= 0 ? row.node.rowIndex : row.rowIndex;\n }\n\n private onCellEditorKeyDown = (event: KeyboardEvent): void => {\n if (!this.cellEditing) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n void this.stopAsync(false);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n void this.stopAsync(true);\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n event.stopPropagation();\n const current = this.cellEditing;\n const next = this.core.keyboardService.nextEditable(current.rowIndex, current.column.id, event.shiftKey ? -1 : 1);\n void this.stopAsync(false).then((stopped) => {\n if (stopped && next) {\n this.core.bodyRenderer.scrollToIndex(next.rowIndex, \"nearest\");\n this.core.bodyRenderer.setFocusedCell(next.rowIndex, next.column.id);\n this.start(next.rowIndex, next.column);\n }\n });\n }\n };\n\n private onRowEditorKeyDown(event: KeyboardEvent, row: RowEditingState, draft: RowDraft): void {\n if (this.rowEditing !== row) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n void this.stopRowAsync(true);\n return;\n }\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n event.stopPropagation();\n void this.stopRowAsync(false);\n return;\n }\n if (event.key !== \"Tab\") return;\n event.preventDefault();\n event.stopPropagation();\n this.captureRowDraft(draft);\n const drafts = [...row.drafts.values()];\n const currentIndex = drafts.indexOf(draft);\n const direction = event.shiftKey ? -1 : 1;\n for (let offset = 1; offset <= drafts.length; offset++) {\n const next = drafts[(currentIndex + direction * offset + drafts.length) % drafts.length];\n if (!next.mounted) continue;\n this.focusEditor(next.mounted.editor, next.column, row.node);\n break;\n }\n }\n\n private onCellEditorBlur = (): void => {\n window.setTimeout(() => {\n if (this.cellEditing) void this.stopAsync(false);\n }, 0);\n };\n\n destroy(): void {\n if (this.cellEditing || this.rowEditing) void this.stopAsync(true);\n }\n}\n","export const DEFAULT_LOCALE = {\n matchContains: \"包含\",\n matchNotContains: \"不包含\",\n matchEquals: \"等于\",\n matchNotEquals: \"不等于\",\n matchStartsWith: \"开头是\",\n matchEndsWith: \"结尾是\",\n matchBlank: \"为空\",\n matchNotBlank: \"不为空\",\n matchLessThan: \"小于\",\n matchLessThanOrEqual: \"小于等于\",\n matchGreaterThan: \"大于\",\n matchGreaterThanOrEqual: \"大于等于\",\n matchInRange: \"在范围内\",\n apply: \"应用\",\n reset: \"重置\",\n search: \"搜索...\",\n emptySetLabel: \"(空)\",\n selectedCount: \"已选 {n} 项\",\n sortAsc: \"升序\",\n sortDesc: \"降序\",\n clearSort: \"取消排序\",\n pinLeft: \"固定左侧\",\n pinRight: \"固定右侧\",\n clearPin: \"取消固定\",\n autoSize: \"自适应列宽\",\n hideColumn: \"隐藏此列\",\n columnVisibility: \"列显示\",\n resetAll: \"重置全部\",\n autoSizeAll: \"全部自适应\",\n columnSettings: \"列设置\",\n totalLabel: \"合计\",\n totalRowsLabel: \"共 {n} 行\",\n menuCopy: \"复制\",\n menuPaste: \"粘贴\",\n menuClearContents: \"清除内容\",\n loading: \"加载中...\",\n statusSelected: \"已选 {n} 行\",\n statusSum: \"和 {n}\",\n statusAvg: \"均 {n}\",\n statusCount: \"计 {n}\",\n emptyRows: \"暂无数据\",\n emptyRowsHint: \"没有可显示的行\",\n paginationTotal: \"共 {n} 条\",\n paginationPage: \"第 {a} / {b} 页\",\n perPage: \"{n} 条/页\",\n pageFirst: \"首页\",\n pagePrev: \"上一页\",\n pageNext: \"下一页\",\n pageLast: \"末页\",\n requestFailed: \"数据加载失败\",\n requestFailedHint: \"请检查网络后重试\",\n actionView: \"查看\",\n actionEdit: \"编辑\",\n actionDelete: \"删除\",\n actionConfirm: \"确认\",\n actionSave: \"保存\",\n actionCancel: \"取消\",\n actionMore: \"更多操作\"\n} as const;\n\nexport type RgLocaleKey = keyof typeof DEFAULT_LOCALE;\nexport type RgLocale = Partial<Record<RgLocaleKey, string>>;\n\nexport const LOCALE_EN: RgLocale = {\n matchContains: \"Contains\",\n matchNotContains: \"Not Contains\",\n matchEquals: \"Equals\",\n matchNotEquals: \"Not Equals\",\n matchStartsWith: \"Starts With\",\n matchEndsWith: \"Ends With\",\n matchBlank: \"Blank\",\n matchNotBlank: \"Not Blank\",\n matchLessThan: \"Less Than\",\n matchLessThanOrEqual: \"≤\",\n matchGreaterThan: \"Greater Than\",\n matchGreaterThanOrEqual: \"≥\",\n matchInRange: \"In Range\",\n apply: \"Apply\",\n reset: \"Reset\",\n search: \"Search...\",\n emptySetLabel: \"(blank)\",\n selectedCount: \"{n} selected\",\n sortAsc: \"Ascending\",\n sortDesc: \"Descending\",\n clearSort: \"Clear Sort\",\n pinLeft: \"Pin Left\",\n pinRight: \"Pin Right\",\n clearPin: \"Unpin\",\n autoSize: \"Auto Fit\",\n hideColumn: \"Hide Column\",\n columnVisibility: \"Columns\",\n resetAll: \"Reset All\",\n autoSizeAll: \"Fit All\",\n columnSettings: \"Column Settings\",\n totalLabel: \"Total\",\n totalRowsLabel: \"{n} rows\",\n menuCopy: \"Copy\",\n menuPaste: \"Paste\",\n menuClearContents: \"Clear Contents\",\n loading: \"Loading...\",\n statusSelected: \"{n} selected\",\n statusSum: \"Sum {n}\",\n statusAvg: \"Avg {n}\",\n statusCount: \"Cnt {n}\",\n emptyRows: \"No Data\",\n emptyRowsHint: \"No rows to display\",\n paginationTotal: \"{n} items\",\n paginationPage: \"Page {a} / {b}\",\n perPage: \"{n} / page\",\n pageFirst: \"First\",\n pagePrev: \"Previous\",\n pageNext: \"Next\",\n pageLast: \"Last\",\n requestFailed: \"Unable to load data\",\n requestFailedHint: \"Check your connection and try again\",\n actionView: \"View\",\n actionEdit: \"Edit\",\n actionDelete: \"Delete\",\n actionConfirm: \"Confirm\",\n actionSave: \"Save\",\n actionCancel: \"Cancel\",\n actionMore: \"More actions\"\n};\n\nconst MATCH_LOCALE_KEYS: Record<string, RgLocaleKey> = {\n contains: \"matchContains\",\n notContains: \"matchNotContains\",\n equals: \"matchEquals\",\n notEquals: \"matchNotEquals\",\n startsWith: \"matchStartsWith\",\n endsWith: \"matchEndsWith\",\n blank: \"matchBlank\",\n notBlank: \"matchNotBlank\",\n lessThan: \"matchLessThan\",\n lessThanOrEqual: \"matchLessThanOrEqual\",\n greaterThan: \"matchGreaterThan\",\n greaterThanOrEqual: \"matchGreaterThanOrEqual\",\n inRange: \"matchInRange\"\n};\n\nexport function matchLocaleKey(match: string): RgLocaleKey {\n return MATCH_LOCALE_KEYS[match] ?? (\"matchEquals\");\n}\n\nexport function formatText(template: string, n: number | string): string {\n return template.replace(\"{n}\", String(n));\n}\n\nexport function formatTwo(template: string, a: number | string, b: number | string): string {\n return template.replace(\"{a}\", String(a)).replace(\"{b}\", String(b));\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type {\n ColumnFilter,\n DateFilterMatch,\n NumberFilterMatch,\n TextFilterMatch\n} from \"../types/colDef\";\nimport { el, clamp } from \"../lib/dom\";\nimport { matchLocaleKey } from \"../lib/locale\";\n\ntype FilterPopupContext = Pick<\n GridCore<any>,\n \"applyColumnFilter\" | \"getCellValue\" | \"getLocaleText\" | \"rowModel\"\n>;\n\nconst TEXT_MATCHES: TextFilterMatch[] = [\n \"contains\",\n \"notContains\",\n \"equals\",\n \"notEquals\",\n \"startsWith\",\n \"endsWith\",\n \"blank\",\n \"notBlank\"\n];\nconst NUMBER_MATCHES: NumberFilterMatch[] = [\n \"equals\",\n \"notEquals\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"inRange\",\n \"blank\",\n \"notBlank\"\n];\nconst DATE_MATCHES: DateFilterMatch[] = [\"equals\", \"notEquals\", \"lessThan\", \"greaterThan\", \"inRange\", \"blank\", \"notBlank\"];\n\nexport class FilterPopupService {\n private panel: HTMLElement | null = null;\n private openColId: string | null = null;\n\n constructor(private core: FilterPopupContext) {}\n\n toggle(column: Column, anchor: HTMLElement): void {\n if (this.openColId === column.id) {\n this.close();\n return;\n }\n this.close();\n this.open(column, anchor);\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n\n private open(column: Column, anchor: HTMLElement): void {\n const filter = this.core.rowModel.getFilterModel()[column.id] ?? null;\n const type = filter?.type ?? column.filterType;\n const panel = el(\"div\", \"mach-filter-panel\");\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", `${column.id} filter`);\n\n if (type === \"set\") this.buildSetBody(panel, column, filter);\n else this.buildConditionBody(panel, column, type, filter);\n\n const footer = el(\"div\", \"mach-filter-footer\");\n const resetBtn = el(\"button\", \"mach-filter-btn-reset\") as HTMLButtonElement;\n resetBtn.type = \"button\";\n resetBtn.textContent = this.core.getLocaleText(\"reset\");\n resetBtn.addEventListener(\"click\", () => {\n this.core.applyColumnFilter(column, null);\n this.close();\n });\n const applyBtn = el(\"button\", \"mach-filter-btn-apply\") as HTMLButtonElement;\n applyBtn.type = \"button\";\n applyBtn.textContent = this.core.getLocaleText(\"apply\");\n applyBtn.addEventListener(\"click\", () => {\n const next = this.readFilter(panel);\n this.core.applyColumnFilter(column, next);\n this.close();\n });\n footer.append(resetBtn, applyBtn);\n panel.appendChild(footer);\n\n document.body.appendChild(panel);\n this.panel = panel;\n this.openColId = column.id;\n\n const rect = anchor.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, window.innerWidth - panelRect.width - 8);\n let top = rect.bottom + 4;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 4);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n const firstInput = panel.querySelector<HTMLInputElement>(\"input, select\");\n firstInput?.focus();\n }\n\n close(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n this.openColId = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private buildConditionBody(\n panel: HTMLElement,\n column: Column,\n type: \"text\" | \"number\" | \"date\",\n filter: ColumnFilter | null\n ): void {\n const matches = type === \"text\" ? TEXT_MATCHES : type === \"number\" ? NUMBER_MATCHES : DATE_MATCHES;\n const existing =\n filter && filter.type !== \"set\" && filter.conditions.length > 0 ? filter.conditions[0] : null;\n const currentMatch: TextFilterMatch | NumberFilterMatch | DateFilterMatch =\n existing?.match ?? (type === \"text\" ? \"contains\" : \"equals\");\n const isBlank = currentMatch === \"blank\" || currentMatch === \"notBlank\";\n\n const select = el(\"select\", \"mach-filter-select\") as HTMLSelectElement;\n for (const m of matches) {\n const option = document.createElement(\"option\");\n option.value = m;\n option.textContent = this.core.getLocaleText(matchLocaleKey(m));\n select.appendChild(option);\n }\n select.value = currentMatch;\n\n const valueInput = el(\"input\", \"mach-filter-input\") as HTMLInputElement;\n if (type === \"number\") valueInput.type = \"number\";\n if (type === \"date\") valueInput.type = \"date\";\n if (existing && existing.value != null && !isBlank) {\n valueInput.value = type === \"date\" ? String(existing.value).slice(0, 10) : String(existing.value);\n }\n\n const value2Input = el(\"input\", \"mach-filter-input mach-filter-input--second\") as HTMLInputElement;\n if (type === \"number\") value2Input.type = \"number\";\n if (type === \"date\") value2Input.type = \"date\";\n if (existing && \"value2\" in existing && existing.value2 != null) {\n value2Input.value = String(existing.value2).slice(0, 10);\n }\n value2Input.style.display = currentMatch === \"inRange\" ? \"\" : \"none\";\n\n select.addEventListener(\"change\", () => {\n const blank = select.value === \"blank\" || select.value === \"notBlank\";\n valueInput.style.display = blank ? \"none\" : \"\";\n value2Input.style.display = select.value === \"inRange\" ? \"\" : \"none\";\n });\n\n const enterApply = (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n const next = this.readFilter(panel);\n this.core.applyColumnFilter(column, next);\n this.close();\n }\n };\n valueInput.addEventListener(\"keydown\", enterApply);\n value2Input.addEventListener(\"keydown\", enterApply);\n\n const body = el(\"div\", \"mach-filter-body\");\n body.append(select, valueInput, value2Input);\n panel.appendChild(body);\n panel.dataset.filterType = type;\n }\n\n private buildSetBody(panel: HTMLElement, column: Column, filter: ColumnFilter | null): void {\n const def = column.colDef;\n const params = def.filterParams;\n let values: (string | number | null)[];\n\n if (params?.values) {\n values = params.values;\n } else {\n const seen = new Set<string>();\n values = [];\n const nodes = this.core.rowModel.getAllNodes();\n const cap = Math.min(nodes.length, params?.maxValues ?? 500);\n for (let i = 0; i < cap; i++) {\n const v = this.core.getCellValue(nodes[i], column);\n const key = v == null ? \"__null__\" : String(v);\n if (seen.has(key)) continue;\n seen.add(key);\n values.push(v);\n }\n }\n\n const selected = new Set<string>(\n filter?.type === \"set\" ? filter.values.map((v) => (v == null ? \"__null__\" : String(v))) : values.map((v) => (v == null ? \"__null__\" : String(v)))\n );\n\n const search = el(\"input\", \"mach-filter-input mach-filter-input--search\") as HTMLInputElement;\n search.type = \"text\";\n search.placeholder = this.core.getLocaleText(\"search\");\n\n const list = el(\"div\", \"mach-filter-set-list\");\n const checkboxes: HTMLInputElement[] = [];\n const valueByKey = new Map<string, string | number | null>();\n\n const renderList = (query: string) => {\n list.textContent = \"\";\n checkboxes.length = 0;\n const q = query.trim().toLowerCase();\n for (const v of values) {\n const text = v == null ? this.core.getLocaleText(\"emptySetLabel\") : String(v);\n if (q && !text.toLowerCase().includes(q)) continue;\n const key = v == null ? \"__null__\" : String(v);\n valueByKey.set(key, v);\n const label = el(\"label\", \"mach-filter-set-item\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.checked = selected.has(key);\n cb.addEventListener(\"change\", () => {\n if (cb.checked) selected.add(key);\n else selected.delete(key);\n });\n const span = el(\"span\");\n span.textContent = text;\n label.append(cb, span);\n list.appendChild(label);\n checkboxes.push(cb);\n }\n };\n\n search.addEventListener(\"input\", () => renderList(search.value));\n renderList(\"\");\n panel.dataset.filterType = \"set\";\n panel.dataset.setValues = JSON.stringify([...valueByKey.entries()]);\n\n const updateSetValues = () => {\n const entries = [...valueByKey.entries()];\n panel.dataset.setValues = JSON.stringify(entries);\n };\n updateSetValues();\n\n const body = el(\"div\", \"mach-filter-body mach-filter-body--set\");\n body.append(search, list);\n panel.appendChild(body);\n }\n\n private readFilter(panel: HTMLElement): ColumnFilter | null {\n const type = panel.dataset.filterType;\n\n if (type === \"set\") {\n let entries: [string, string | number | null][] = [];\n try {\n entries = JSON.parse(panel.dataset.setValues ?? \"[]\");\n } catch {\n entries = [];\n }\n const selectedKeys = new Set<string>();\n panel.querySelectorAll<HTMLInputElement>(\".mach-filter-set-item input:checked\").forEach((cb) => {\n const item = cb.closest(\".mach-filter-set-item\")!;\n const span = item.querySelector(\"span\")!;\n const emptyLabel = this.core.getLocaleText(\"emptySetLabel\");\n const text = span.textContent === emptyLabel ? \"__null__\" : span.textContent ?? \"\";\n selectedKeys.add(text);\n });\n const picked = entries.filter(([key]) => selectedKeys.has(key)).map(([, v]) => v);\n if (picked.length === entries.length || picked.length === 0) return null;\n return { type: \"set\", values: picked };\n }\n\n const select = panel.querySelector<HTMLSelectElement>(\".mach-filter-select\");\n const inputs = panel.querySelectorAll<HTMLInputElement>(\".mach-filter-input\");\n const valueInput = inputs[0];\n const value2Input = inputs[1];\n if (!select || !valueInput) return null;\n\n const match = select.value;\n if (match === \"blank\" || match === \"notBlank\") {\n return { type, conditions: [{ match: match }] } as ColumnFilter;\n }\n const raw = valueInput.value;\n if (raw === \"\" && !(match === \"inRange\")) return null;\n\n if (type === \"number\") {\n const value = Number(raw);\n if (isNaN(value)) return null;\n if (match === \"inRange\") {\n const value2 = value2Input && value2Input.value !== \"\" ? Number(value2Input.value) : value;\n if (isNaN(value2)) return null;\n return { type: \"number\", conditions: [{ match: \"inRange\", value, value2 }] };\n }\n return { type: \"number\", conditions: [{ match: match as NumberFilterMatch, value }] };\n }\n\n if (type === \"date\") {\n const value = raw;\n if (match === \"inRange\") {\n const value2 = value2Input && value2Input.value !== \"\" ? value2Input.value : value;\n return { type: \"date\", conditions: [{ match: \"inRange\", value, value2 }] };\n }\n return { type: \"date\", conditions: [{ match: match as DateFilterMatch, value }] };\n }\n\n return { type: \"text\", conditions: [{ match: match as TextFilterMatch, value: raw }] };\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el, clamp } from \"../lib/dom\";\n\ntype ColumnMenuContext = Pick<\n GridCore<any>,\n \"columnModel\" | \"getApi\" | \"getLocaleText\" | \"options\" | \"skeleton\"\n>;\n\nexport class ColumnMenuService {\n private panel: HTMLElement | null = null;\n private openColId: string | null = null;\n private standaloneAnchor: HTMLElement | null = null;\n private searchText = \"\";\n\n constructor(private core: ColumnMenuContext) {}\n\n toggle(column: Column, anchor: HTMLElement): void {\n if (this.openColId === column.id) {\n this.close();\n return;\n }\n this.close();\n this.open(column, anchor);\n }\n\n openStandalone(anchor?: HTMLElement): void {\n this.close();\n const target =\n anchor ??\n (() => {\n const root = this.core.skeleton.root;\n const rect = root.getBoundingClientRect();\n const fake = document.createElement(\"div\");\n fake.style.position = \"fixed\";\n fake.style.left = `${rect.right - 16}px`;\n fake.style.top = `${rect.top + this.core.options.headerHeight}px`;\n fake.style.width = \"1px\";\n fake.style.height = \"1px\";\n document.body.appendChild(fake);\n this.standaloneAnchor = fake;\n return fake;\n })();\n this.open(null, target);\n }\n\n close(): void {\n if (this.standaloneAnchor) {\n this.standaloneAnchor.remove();\n this.standaloneAnchor = null;\n }\n this.panel?.remove();\n this.panel = null;\n this.openColId = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n\n private open(column: Column | null, anchor: HTMLElement): void {\n const api = this.core.getApi();\n const panel = el(\"div\", \"mach-filter-panel mach-column-panel\");\n panel.setAttribute(\"role\", column ? \"menu\" : \"dialog\");\n if (!column) {\n panel.setAttribute(\"aria-modal\", \"false\");\n panel.setAttribute(\"aria-label\", this.core.getLocaleText(\"columnSettings\"));\n }\n\n const title = el(\"div\", \"mach-column-panel-title\");\n title.textContent = column\n ? column.colDef.headerName ?? column.colDef.field ?? column.id\n : this.core.getLocaleText(\"columnSettings\");\n panel.appendChild(title);\n\n if (column && column.sortable) {\n const sortRow = el(\"div\", \"mach-column-panel-actions\");\n const makeSortBtn = (labelKey: \"sortAsc\" | \"sortDesc\" | \"clearSort\", dir: \"asc\" | \"desc\" | null) => {\n const btn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = this.core.getLocaleText(labelKey);\n btn.addEventListener(\"click\", () => {\n api.setSortModel(dir ? [{ colId: column.id, direction: dir }] : []);\n this.close();\n });\n return btn;\n };\n sortRow.append(makeSortBtn(\"sortAsc\", \"asc\"), makeSortBtn(\"sortDesc\", \"desc\"), makeSortBtn(\"clearSort\", null));\n panel.appendChild(sortRow);\n }\n\n const pinRow = el(\"div\", \"mach-column-panel-actions\");\n const makePinBtn = (labelKey: \"pinLeft\" | \"pinRight\" | \"clearPin\", pinned: \"left\" | \"right\" | null) => {\n const btn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = this.core.getLocaleText(labelKey);\n btn.addEventListener(\"click\", () => {\n if (column) api.setColumnPinned(column.id, pinned);\n this.close();\n });\n return btn;\n };\n if (column) {\n pinRow.append(makePinBtn(\"pinLeft\", \"left\"), makePinBtn(\"pinRight\", \"right\"), makePinBtn(\"clearPin\", null));\n panel.appendChild(pinRow);\n }\n\n const toolRow = el(\"div\", \"mach-column-panel-actions\");\n const fitBtn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n fitBtn.type = \"button\";\n fitBtn.textContent = this.core.getLocaleText(\"autoSize\");\n fitBtn.addEventListener(\"click\", () => {\n if (column) api.autoSizeColumn(column.id);\n else api.autoSizeAllColumns();\n this.close();\n });\n const hideBtn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n hideBtn.type = \"button\";\n hideBtn.textContent = this.core.getLocaleText(\"hideColumn\");\n hideBtn.addEventListener(\"click\", () => {\n if (column) api.setColumnVisibility(column.id, false);\n this.close();\n });\n if (column) {\n toolRow.append(fitBtn, hideBtn);\n panel.appendChild(toolRow);\n }\n\n const divider = el(\"div\", \"mach-column-panel-divider\");\n panel.appendChild(divider);\n\n const listTitle = el(\"div\", \"mach-column-panel-subtitle\");\n listTitle.textContent = this.core.getLocaleText(\"columnVisibility\");\n panel.appendChild(listTitle);\n\n if (!column) {\n const search = document.createElement(\"input\");\n search.type = \"search\";\n search.className = \"mach-column-workbench-search\";\n search.placeholder = this.core.getLocaleText(\"search\");\n search.setAttribute(\"aria-label\", this.core.getLocaleText(\"search\"));\n search.value = this.searchText;\n search.addEventListener(\"input\", () => {\n this.searchText = search.value.trim().toLocaleLowerCase();\n this.renderColumnList(list, true);\n });\n panel.appendChild(search);\n }\n\n const list = el(\"div\", \"mach-column-panel-list\");\n this.renderColumnList(list, !column);\n panel.appendChild(list);\n\n const footer = el(\"div\", \"mach-filter-footer\");\n const resetBtn = el(\"button\", \"mach-filter-btn-reset\") as HTMLButtonElement;\n resetBtn.type = \"button\";\n resetBtn.textContent = this.core.getLocaleText(\"resetAll\");\n resetBtn.addEventListener(\"click\", () => {\n api.resetColumnState();\n this.close();\n });\n const allFitBtn = el(\"button\", \"mach-filter-btn-apply\") as HTMLButtonElement;\n allFitBtn.type = \"button\";\n allFitBtn.textContent = this.core.getLocaleText(\"autoSizeAll\");\n allFitBtn.addEventListener(\"click\", () => {\n api.autoSizeAllColumns();\n this.close();\n });\n footer.append(resetBtn, allFitBtn);\n panel.appendChild(footer);\n\n document.body.appendChild(panel);\n this.panel = panel;\n this.openColId = column ? column.id : \"__standalone__\";\n\n const rect = anchor.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, window.innerWidth - panelRect.width - 8);\n let top = rect.bottom + 4;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 4);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n private rebuildListStates(): void {\n if (!this.panel) return;\n const list = this.panel.querySelector<HTMLElement>(\".mach-column-panel-list\");\n if (list) this.renderColumnList(list, this.openColId === \"__standalone__\");\n }\n\n private renderColumnList(list: HTMLElement, workbench: boolean): void {\n const api = this.core.getApi();\n list.replaceChildren();\n const columns = this.core.columnModel.getColumns().filter((candidate) => {\n if (candidate.isDetailToggle) return false;\n if (!workbench || !this.searchText) return true;\n const label = candidate.colDef.headerName ?? candidate.colDef.field ?? candidate.id;\n return `${label} ${candidate.id}`.toLocaleLowerCase().includes(this.searchText);\n });\n for (const col of columns) {\n const row = el(\"div\", workbench ? \"mach-column-workbench-item\" : \"mach-filter-set-item\");\n const label = el(\"label\", \"mach-column-workbench-label\");\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.checked = !col.hide;\n checkbox.disabled = col.hasCheckbox;\n checkbox.addEventListener(\"change\", () => {\n api.setColumnVisibility(col.id, checkbox.checked);\n this.rebuildListStates();\n });\n const text = el(\"span\", \"mach-column-workbench-name\");\n text.textContent = col.colDef.headerName ?? col.colDef.field ?? col.id;\n text.title = `${text.textContent} (${col.id})`;\n label.append(checkbox, text);\n row.appendChild(label);\n\n if (workbench) {\n const pin = document.createElement(\"select\");\n pin.className = \"mach-column-workbench-pin\";\n pin.setAttribute(\"aria-label\", `${text.textContent} ${this.core.getLocaleText(\"clearPin\")}`);\n for (const [value, caption] of [\n [\"\", this.core.getLocaleText(\"clearPin\")],\n [\"left\", this.core.getLocaleText(\"pinLeft\")],\n [\"right\", this.core.getLocaleText(\"pinRight\")]\n ] as const) {\n const option = document.createElement(\"option\");\n option.value = value;\n option.textContent = caption;\n pin.appendChild(option);\n }\n pin.value = col.pinned ?? \"\";\n pin.addEventListener(\"change\", () => {\n api.setColumnPinned(col.id, pin.value === \"left\" || pin.value === \"right\" ? pin.value : null);\n this.rebuildListStates();\n });\n row.appendChild(pin);\n\n const siblings = this.core.columnModel.getColumns().filter((candidate) =>\n !candidate.hide &&\n candidate.parentGroup === col.parentGroup &&\n (col.parentGroup != null || candidate.pinned === col.pinned)\n );\n const position = siblings.indexOf(col);\n const move = (caption: string, next: number, disabled: boolean) => {\n const button = el(\"button\", \"mach-column-workbench-move\") as HTMLButtonElement;\n button.type = \"button\";\n button.textContent = caption;\n button.disabled = disabled || col.hide || !col.movable;\n button.addEventListener(\"click\", () => {\n api.moveColumn(col.id, next);\n this.rebuildListStates();\n });\n return button;\n };\n row.append(move(\"↑\", position - 1, position <= 0), move(\"↓\", position + 1, position < 0 || position >= siblings.length - 1));\n }\n list.appendChild(row);\n }\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el, clamp } from \"../lib/dom\";\n\ntype ContextMenuContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"clearRangeValues\"\n | \"columnModel\"\n | \"copyActiveRange\"\n | \"getApi\"\n | \"getCellValue\"\n | \"getLocaleText\"\n | \"options\"\n | \"pasteFromSystemClipboard\"\n | \"reportError\"\n | \"rowModel\"\n>;\n\nexport class ContextMenuService {\n private panel: HTMLElement | null = null;\n\n constructor(private core: ContextMenuContext) {}\n\n open(x: number, y: number, anchor?: { rowIndex: number; colId: string }): void {\n this.close();\n const core = this.core;\n let node: import(\"../types/row\").RowNode<any> | undefined;\n let anchorCol: Column | undefined;\n\n if (anchor) {\n node = core.rowModel.getDisplayedRow(anchor.rowIndex);\n anchorCol = core.columnModel.getColumn(anchor.colId);\n } else {\n const range = core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const flat = core.columnModel.getOrderedVisible();\n node = core.rowModel.getDisplayedRow(range.r1);\n anchorCol = flat[range.c1];\n }\n if (!node || !anchorCol) return;\n const anchorIndex = node.rowIndex;\n\n const panel = el(\"div\", \"mach-context-menu\");\n panel.setAttribute(\"role\", \"menu\");\n\n const customGetter = core.options.getContextMenuItems;\n if (customGetter) {\n let items;\n try {\n items = customGetter({\n data: node.data,\n node,\n api: core.getApi(),\n colId: anchorCol.id,\n value: core.getCellValue(node, anchorCol),\n rowIndex: anchorIndex\n });\n } catch (error) {\n core.reportError(error, \"getContextMenuItems\", { colId: anchorCol.id, rowId: node.id });\n return;\n }\n if (items === null || items === undefined) return;\n let hasEnabled = false;\n for (const item of items) {\n if (item.separator) {\n const sep = el(\"div\", \"mach-context-menu-separator\");\n panel.appendChild(sep);\n continue;\n }\n const btn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = item.label ?? \"\";\n if (item.danger) btn.classList.add(\"mach-context-menu-item--danger\");\n if (item.disabled) {\n btn.disabled = true;\n } else {\n hasEnabled = true;\n btn.addEventListener(\"click\", () => {\n this.close();\n try {\n item.action?.();\n } catch (error) {\n core.reportError(error, \"contextMenu.action\", { colId: anchorCol.id, rowId: node.id });\n }\n });\n }\n panel.appendChild(btn);\n }\n if (!hasEnabled) {\n panel.remove();\n return;\n }\n this.attach(panel, x, y);\n return;\n }\n\n const copyBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n copyBtn.type = \"button\";\n copyBtn.textContent = core.getLocaleText(\"menuCopy\");\n copyBtn.addEventListener(\"click\", () => {\n void core.copyActiveRange();\n this.close();\n });\n panel.appendChild(copyBtn);\n\n if (!core.options.suppressClipboard) {\n const pasteBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n pasteBtn.type = \"button\";\n pasteBtn.textContent = core.getLocaleText(\"menuPaste\");\n pasteBtn.addEventListener(\"click\", () => {\n void core.pasteFromSystemClipboard();\n this.close();\n });\n panel.appendChild(pasteBtn);\n\n const clearBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n clearBtn.type = \"button\";\n clearBtn.textContent = core.getLocaleText(\"menuClearContents\");\n clearBtn.addEventListener(\"click\", () => {\n const active = core.bodyRenderer.getNormalizedRangeOrFocus();\n if (active) core.clearRangeValues(active);\n this.close();\n });\n panel.appendChild(clearBtn);\n }\n\n this.attach(panel, x, y);\n }\n\n private attach(panel: HTMLElement, x: number, y: number): void {\n document.body.appendChild(panel);\n this.panel = panel;\n const rect = panel.getBoundingClientRect();\n const left = clamp(x, 8, Math.max(8, window.innerWidth - rect.width - 8));\n const top = clamp(y, 8, Math.max(8, window.innerHeight - rect.height - 8));\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n close(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type { TooltipParams } from \"../types/params\";\nimport { el, clamp } from \"../lib/dom\";\nimport { formatCellValue } from \"../render/cellContent\";\n\ntype TooltipContext = Pick<\n GridCore<any>,\n | \"columnModel\"\n | \"getApi\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"reportError\"\n | \"rowModel\"\n | \"skeleton\"\n>;\n\nexport class TooltipService {\n private panel: HTMLElement | null = null;\n private showTimer = 0;\n private hideTimer = 0;\n private currentCell: HTMLElement | null = null;\n\n constructor(private core: TooltipContext) {}\n\n init(): void {\n const body = this.core.skeleton.bodyEl;\n body.addEventListener(\"mouseover\", this.onMouseOver);\n body.addEventListener(\"mouseleave\", this.onBodyLeave);\n }\n\n destroy(): void {\n this.clearTimers();\n this.removePanel();\n const body = this.core.skeleton.bodyEl;\n body.removeEventListener(\"mouseover\", this.onMouseOver);\n body.removeEventListener(\"mouseleave\", this.onBodyLeave);\n this.currentCell = null;\n }\n\n hide(): void {\n this.clearTimers();\n this.removePanel();\n this.currentCell = null;\n }\n\n private clearTimers(): void {\n if (this.showTimer) {\n clearTimeout(this.showTimer);\n this.showTimer = 0;\n }\n if (this.hideTimer) {\n clearTimeout(this.hideTimer);\n this.hideTimer = 0;\n }\n }\n\n private removePanel(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n }\n\n private onMouseOver = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n if (!this.core.options.tooltipComponent) return;\n const target = e.target as HTMLElement;\n const cell = target.closest<HTMLElement>(\".mach-cell\");\n if (!cell || cell === this.currentCell) return;\n\n this.clearTimers();\n this.removePanel();\n this.currentCell = cell;\n\n const colId = cell.dataset.colId ?? \"\";\n const rowEl = cell.closest<HTMLElement>(\".mach-row\");\n const index = Number(rowEl?.dataset.index);\n const node = Number.isNaN(index) ? undefined : this.core.rowModel.getDisplayedRow(index);\n const column: Column | undefined = colId ? this.core.columnModel.getColumn(colId) : undefined;\n if (!node || !column || node.isDetail || node.isGroup) return;\n if (cell.classList.contains(\"mach-cell--editing\")) return;\n\n const value = this.core.getCellValue(node, column);\n const params: TooltipParams<any> = {\n data: node.data,\n node,\n api: this.core.getApi(),\n colId: column.id,\n value,\n formatted: formatCellValue(this.core, node, column),\n rowIndex: index\n };\n\n const getter = column.colDef.tooltipValueGetter;\n let fallback = params.formatted;\n if (getter) {\n try {\n fallback = getter({ ...params, colDef: column.colDef, column }) ?? params.formatted;\n } catch (error) {\n this.core.reportError(error, \"tooltipValueGetter\", { colId: column.id, rowId: node.id });\n }\n }\n if (!fallback && !column.colDef.tooltipValueGetter) return;\n\n this.showTimer = setTimeout(() => {\n if (this.core.isDestroyed() || this.currentCell !== cell) return;\n this.showPanel(cell, params);\n }, Math.max(0, this.core.options.tooltipShowDelay));\n };\n\n private onBodyLeave = (): void => {\n this.hide();\n };\n\n private showPanel(cell: HTMLElement, params: TooltipParams<any>): void {\n this.removePanel();\n const component = this.core.options.tooltipComponent;\n if (!component) return;\n\n const panel = el(\"div\", \"mach-tooltip\");\n panel.setAttribute(\"role\", \"tooltip\");\n let content: string | HTMLElement;\n try {\n content = component(params);\n } catch (err) {\n this.core.reportError(err, \"tooltipComponent\", { colId: params.colId, rowIndex: params.rowIndex });\n return;\n }\n if (typeof content === \"string\") {\n panel.textContent = content;\n } else {\n panel.appendChild(content);\n }\n\n document.body.appendChild(panel);\n this.panel = panel;\n const rect = cell.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, Math.max(8, window.innerWidth - panelRect.width - 8));\n let top = rect.bottom + 6;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 6);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { WatermarkConfig } from \"../types/options\";\n\ntype WatermarkContext = Pick<GridCore<any>, \"isDestroyed\" | \"options\" | \"skeleton\">;\n\nexport class WatermarkService {\n private overlay: HTMLElement | null = null;\n\n constructor(private core: WatermarkContext) {}\n\n init(): void {\n this.overlay = document.createElement(\"div\");\n this.overlay.className = \"mach-watermark\";\n this.overlay.setAttribute(\"aria-hidden\", \"true\");\n this.overlay.style.pointerEvents = \"none\";\n this.core.skeleton.root.appendChild(this.overlay);\n this.apply();\n }\n\n apply(): void {\n if (!this.overlay || this.core.isDestroyed()) return;\n const config = this.core.options.watermarkEnabled ? this.core.options.watermarkConfig : null;\n if (!config || !config.text) {\n this.overlay.style.display = \"none\";\n this.overlay.style.backgroundImage = \"\";\n return;\n }\n const url = this.buildTile(config);\n this.overlay.style.display = \"\";\n if (url) {\n this.overlay.style.backgroundImage = `url(${url})`;\n this.overlay.style.backgroundColor = \"\";\n } else {\n this.overlay.style.backgroundImage = \"\";\n }\n }\n\n private buildTile(config: WatermarkConfig): string | null {\n try {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n const fontSize = config.fontSize ?? 14;\n const gap = config.gap ?? 160;\n const angle = config.angle ?? -22;\n const color = config.color ?? (this.isDark() ? \"rgba(255,255,255,0.9)\" : \"rgba(31,55,88,0.9)\");\n const opacity = config.opacity ?? 0.06;\n\n ctx.font = `500 ${fontSize}px sans-serif`;\n const metrics = ctx.measureText(config.text);\n const textW = Math.ceil(metrics.width);\n\n const tile = Math.max(gap, textW + 40);\n canvas.width = tile;\n canvas.height = tile;\n\n const ctx2 = canvas.getContext(\"2d\")!;\n ctx2.clearRect(0, 0, tile, tile);\n ctx2.globalAlpha = opacity;\n ctx2.fillStyle = color;\n ctx2.font = `500 ${fontSize}px sans-serif`;\n ctx2.translate(tile / 2, tile / 2);\n ctx2.rotate((angle * Math.PI) / 180);\n ctx2.textAlign = \"center\";\n ctx2.textBaseline = \"middle\";\n ctx2.fillText(config.text, 0, 0);\n\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n }\n }\n\n private isDark(): boolean {\n return this.core.skeleton.root.classList.contains(\"mach-theme-dark\");\n }\n\n refresh(): void {\n this.apply();\n }\n\n destroy(): void {\n this.overlay?.remove();\n this.overlay = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\n\ntype UndoContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"options\"\n | \"rowModel\"\n | \"statusBarService\"\n | \"summaryRenderer\"\n | \"writeValue\"\n>;\n\nexport interface UndoEntry {\n nodeId: string;\n columnId: string;\n oldValue: any;\n newValue: any;\n}\n\nexport class UndoRedoService {\n private stack: UndoEntry[][] = [];\n private pointer = -1;\n private pending: UndoEntry[] | null = null;\n\n constructor(private core: UndoContext) {}\n\n beginBatch(): void {\n if (this.pending) return;\n this.pending = [];\n }\n\n endBatch(): void {\n if (!this.pending) return;\n const batch = this.pending;\n this.pending = null;\n if (batch.length > 0) this.push(batch);\n }\n\n cancelBatch(): void {\n this.pending = null;\n }\n\n record(entry: UndoEntry): void {\n if (this.pending) {\n this.pending.push(entry);\n return;\n }\n this.push([entry]);\n }\n\n private push(batch: UndoEntry[]): void {\n const maxSize = Math.max(0, this.core.options.undoStackSize);\n if (maxSize === 0) return;\n this.stack.length = this.pointer + 1;\n this.stack.push(batch);\n while (this.stack.length > maxSize) this.stack.shift();\n this.pointer = this.stack.length - 1;\n }\n\n trimToSize(): void {\n const maxSize = Math.max(0, this.core.options.undoStackSize);\n if (maxSize === 0) {\n this.clear();\n return;\n }\n while (this.stack.length > maxSize) {\n this.stack.shift();\n this.pointer--;\n }\n if (this.pointer < -1) this.pointer = -1;\n }\n\n canUndo(): boolean {\n return this.pointer >= 0;\n }\n\n canRedo(): boolean {\n return this.pointer < this.stack.length - 1;\n }\n\n undo(): boolean {\n if (!this.canUndo()) return false;\n this.apply(this.stack[this.pointer], false);\n this.pointer--;\n return true;\n }\n\n redo(): boolean {\n if (!this.canRedo()) return false;\n this.pointer++;\n this.apply(this.stack[this.pointer], true);\n return true;\n }\n\n private apply(batch: UndoEntry[], redo: boolean): void {\n const core = this.core;\n const refreshIndexes: number[] = [];\n for (const entry of batch) {\n const node = core.rowModel.getNodeById(entry.nodeId);\n const column = core.columnModel.getColumn(entry.columnId);\n if (!node || !column || node.data == null) continue;\n const value = redo ? entry.newValue : entry.oldValue;\n const replaced = redo ? entry.oldValue : entry.newValue;\n if (core.writeValue(node, column, value, replaced)) {\n core.bodyRenderer.invalidateRowHeight(node);\n core.bodyRenderer.queueFlash([node.rowIndex], [column.id]);\n if (node.rowIndex >= 0) refreshIndexes.push(node.rowIndex);\n core.emit(\"cellValueChanged\", {\n oldValue: replaced,\n newValue: value,\n rowNode: node,\n rowIndex: node.rowIndex,\n column,\n colDef: column.colDef,\n data: node.data\n });\n }\n }\n if (refreshIndexes.length > 0) core.bodyRenderer.refreshRows(refreshIndexes);\n core.summaryRenderer.refresh();\n core.statusBarService.refresh();\n }\n\n clear(): void {\n this.stack = [];\n this.pointer = -1;\n this.pending = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { GridChange } from \"../types/api\";\nimport type { CellValueChangedEvent } from \"../types/events\";\n\ntype ChangeTrackingContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"eventBus\"\n | \"getCellValue\"\n | \"rowModel\"\n | \"statusBarService\"\n | \"summaryRenderer\"\n | \"writeValue\"\n>;\n\ninterface CellChange {\n rowId: string;\n colId: string;\n originalValue: unknown;\n value: unknown;\n}\n\nexport class ChangeTrackingService<TData = any> {\n private changes = new Map<string, CellChange>();\n private rollingBack = false;\n private unsubscribe: (() => void) | null = null;\n\n constructor(private core: ChangeTrackingContext) {}\n\n init(): void {\n this.unsubscribe = this.core.eventBus.on(\"cellValueChanged\", (event) => {\n if (!this.rollingBack) this.record(event as CellValueChangedEvent<TData>);\n });\n }\n\n private record(event: CellValueChangedEvent<TData>): void {\n const key = `${event.rowNode.id}\\u0000${event.column.id}`;\n const existing = this.changes.get(key);\n const originalValue = existing?.originalValue ?? event.oldValue;\n if (Object.is(event.newValue, originalValue)) this.changes.delete(key);\n else {\n this.changes.set(key, {\n rowId: event.rowNode.id,\n colId: event.column.id,\n originalValue,\n value: event.newValue\n });\n }\n this.emitChanged();\n }\n\n getDirtyRowIds(): string[] {\n return [...new Set([...this.changes.values()].map((change) => change.rowId))];\n }\n\n getChanges(): GridChange<TData>[] {\n const byRow = new Map<string, GridChange<TData>>();\n for (const change of this.changes.values()) {\n const node = this.core.rowModel.getNodeById(change.rowId);\n if (!node?.data) continue;\n let row = byRow.get(change.rowId);\n if (!row) {\n row = { rowId: change.rowId, data: node.data, cells: [] };\n byRow.set(change.rowId, row);\n }\n row.cells.push({\n colId: change.colId,\n originalValue: change.originalValue,\n value: change.value\n });\n }\n return [...byRow.values()];\n }\n\n markSaved(rowIds?: readonly string[]): void {\n if (!rowIds) this.changes.clear();\n else {\n const ids = new Set(rowIds);\n for (const [key, change] of this.changes) {\n if (ids.has(change.rowId)) this.changes.delete(key);\n }\n }\n this.emitChanged();\n }\n\n acknowledge(saved: readonly GridChange<TData>[]): void {\n for (const row of saved) {\n for (const cell of row.cells) {\n const key = `${row.rowId}\\u0000${cell.colId}`;\n const current = this.changes.get(key);\n if (current) {\n if (Object.is(current.value, cell.value)) this.changes.delete(key);\n else current.originalValue = cell.value;\n continue;\n }\n const node = this.core.rowModel.getNodeById(row.rowId);\n const column = this.core.columnModel.getColumn(cell.colId);\n if (!node || !column || node.data == null) continue;\n const value = this.core.getCellValue(node, column);\n if (!Object.is(value, cell.value)) {\n this.changes.set(key, {\n rowId: row.rowId,\n colId: cell.colId,\n originalValue: cell.value,\n value\n });\n }\n }\n }\n this.emitChanged();\n }\n\n rollback(rowIds?: readonly string[]): boolean {\n const ids = rowIds ? new Set(rowIds) : null;\n const targets = [...this.changes.entries()].filter(([, change]) => !ids || ids.has(change.rowId));\n if (targets.length === 0) return false;\n const refresh = new Set<number>();\n const completed = new Set<string>();\n this.rollingBack = true;\n try {\n for (const [key, change] of targets) {\n const node = this.core.rowModel.getNodeById(change.rowId);\n const column = this.core.columnModel.getColumn(change.colId);\n if (!node || !column || node.data == null) continue;\n const current = this.core.getCellValue(node, column);\n if (Object.is(current, change.originalValue)) {\n completed.add(key);\n continue;\n }\n if (!this.core.writeValue(node, column, change.originalValue, current)) continue;\n completed.add(key);\n this.core.bodyRenderer.invalidateRowHeight(node);\n if (node.rowIndex >= 0) refresh.add(node.rowIndex);\n this.core.emit(\"cellValueChanged\", {\n oldValue: current,\n newValue: change.originalValue,\n rowNode: node,\n rowIndex: node.rowIndex,\n column,\n colDef: column.colDef,\n data: node.data\n });\n }\n } finally {\n this.rollingBack = false;\n }\n for (const key of completed) this.changes.delete(key);\n if (refresh.size > 0) this.core.bodyRenderer.refreshRows([...refresh]);\n this.core.summaryRenderer.refresh();\n this.core.statusBarService.refresh();\n this.emitChanged();\n return completed.size > 0;\n }\n\n clearRows(rowIds: readonly string[]): void {\n if (rowIds.length === 0) return;\n const ids = new Set(rowIds);\n for (const [key, change] of this.changes) {\n if (ids.has(change.rowId)) this.changes.delete(key);\n }\n this.emitChanged();\n }\n\n clear(): void {\n if (this.changes.size === 0) return;\n this.changes.clear();\n this.emitChanged();\n }\n\n destroy(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.changes.clear();\n }\n\n private emitChanged(): void {\n this.core.emit(\"dirtyStateChanged\", { dirtyRowIds: this.getDirtyRowIds() });\n }\n}\n","import type { GridPerformanceSnapshot } from \"../types/api\";\n\ninterface RenderSample {\n duration: number;\n rows: number;\n columns: number;\n}\n\nconst MAX_SAMPLES = 120;\nconst LONG_FRAME_MS = 16.7;\n\nfunction now(): number {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nexport class PerformanceMonitor {\n private samples: RenderSample[] = [];\n\n start(): number { return now(); }\n\n recordRender(startedAt: number, rows: number, columns: number): void {\n this.samples.push({ duration: Math.max(0, now() - startedAt), rows, columns });\n if (this.samples.length > MAX_SAMPLES) this.samples.shift();\n }\n\n snapshot(): GridPerformanceSnapshot {\n const durations = this.samples.map((sample) => sample.duration);\n const last = this.samples[this.samples.length - 1];\n const sorted = [...durations].sort((left, right) => left - right);\n const percentileIndex = Math.max(0, Math.ceil(sorted.length * 0.95) - 1);\n return {\n sampleCount: durations.length,\n lastRenderMs: last?.duration ?? 0,\n averageRenderMs: durations.length > 0\n ? durations.reduce((total, duration) => total + duration, 0) / durations.length\n : 0,\n maxRenderMs: sorted[sorted.length - 1] ?? 0,\n p95RenderMs: sorted[percentileIndex] ?? 0,\n longRenderCount: durations.filter((duration) => duration > LONG_FRAME_MS).length,\n renderedRows: last?.rows ?? 0,\n renderedColumns: last?.columns ?? 0,\n renderedCells: (last?.rows ?? 0) * (last?.columns ?? 0)\n };\n }\n\n reset(): void { this.samples = []; }\n}\n","import type { ColDef } from \"./colDef\";\nimport type { FilterModel, SortModel } from \"./colDef\";\nimport type { AdvancedFilterModel } from \"./advancedFilter\";\nimport type { RowNode } from \"./row\";\nimport type { GridApi } from \"./api\";\nimport type { Column } from \"../services/column\";\n\nexport const EVENT_TYPES = [\n \"gridReady\",\n \"gridDestroyed\",\n \"modelUpdated\",\n \"cellClicked\",\n \"cellDoubleClicked\",\n \"cellContextMenu\",\n \"rowClicked\",\n \"rowDoubleClicked\",\n \"selectionChanged\",\n \"sortChanged\",\n \"filterChanged\",\n \"columnResized\",\n \"columnMoved\",\n \"columnVisibilityChanged\",\n \"cellValueChanged\",\n \"cellEditingStarted\",\n \"cellEditingStopped\",\n \"rowEditingStarted\",\n \"rowEditingStopped\",\n \"detailToggled\",\n \"treeChildrenLoaded\",\n \"treeChildrenLoadFailed\",\n \"rowDragEnd\",\n \"rangeSelectionChanged\",\n \"paginationChanged\",\n \"displayedColumnsChanged\",\n \"gridError\",\n \"dirtyStateChanged\"\n] as const;\n\nexport type GridEventType = (typeof EVENT_TYPES)[number];\n\nexport type GridErrorCode =\n | \"DATA_SOURCE_ERROR\"\n | \"DATA_INTEGRITY_ERROR\"\n | \"VALIDATION_ERROR\"\n | \"RENDERER_ERROR\"\n | \"EDITOR_ERROR\"\n | \"FEATURE_ERROR\"\n | \"STATE_ERROR\"\n | \"EVENT_HANDLER_ERROR\"\n | \"GRID_ERROR\";\n\nexport interface GridEventBase<TData = any> {\n type: GridEventType;\n api: GridApi<TData>;\n}\n\nexport interface GridReadyEvent<TData = any> extends GridEventBase<TData> {\n type: \"gridReady\";\n}\n\nexport interface GridDestroyedEvent<TData = any> extends GridEventBase<TData> {\n type: \"gridDestroyed\";\n}\n\nexport interface ModelUpdatedEvent<TData = any> extends GridEventBase<TData> {\n type: \"modelUpdated\";\n rowCount: number;\n}\n\nexport interface CellClickEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface CellDoubleClickEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellDoubleClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface CellContextMenuEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellContextMenu\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface RowClickEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowClicked\" | \"rowDoubleClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n}\n\nexport interface SelectionChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"selectionChanged\";\n selectedNodes: RowNode<TData>[];\n selectedRows: TData[];\n}\n\nexport interface SortChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"sortChanged\";\n sortModel: SortModel;\n}\n\nexport interface FilterChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"filterChanged\";\n filterModel: FilterModel;\n advancedFilterModel: AdvancedFilterModel | null;\n}\n\nexport interface ColumnResizedEvent<TData = any> extends GridEventBase<TData> {\n type: \"columnResized\";\n colId: string;\n width: number;\n finished: boolean;\n}\n\nexport interface ColumnMovedEvent<TData = any> extends GridEventBase<TData> {\n type: \"columnMoved\";\n colId: string;\n toIndex: number;\n}\n\nexport interface ColumnVisibilityChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"columnVisibilityChanged\";\n colId: string;\n visible: boolean;\n}\n\nexport interface CellValueChangedEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellValueChanged\";\n oldValue: TValue;\n newValue: TValue;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n data: TData;\n}\n\nexport interface CellEditingStartedEvent<TData = any> extends GridEventBase<TData> {\n type: \"cellEditingStarted\";\n rowIndex: number;\n colId: string;\n rowNode: RowNode<TData>;\n}\n\nexport interface CellEditingStoppedEvent<TData = any> extends GridEventBase<TData> {\n type: \"cellEditingStopped\";\n rowIndex: number;\n colId: string;\n rowNode: RowNode<TData>;\n oldValue: any;\n newValue: any;\n}\n\nexport interface RowEditChange {\n colId: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport interface RowEditingStartedEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowEditingStarted\";\n rowIndex: number;\n rowNode: RowNode<TData>;\n data: TData;\n}\n\nexport interface RowEditingStoppedEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowEditingStopped\";\n rowIndex: number;\n rowNode: RowNode<TData>;\n data: TData;\n cancelled: boolean;\n changes: RowEditChange[];\n}\n\nexport interface DetailToggledEvent<TData = any> extends GridEventBase<TData> {\n type: \"detailToggled\";\n rowId: string;\n rowNode: RowNode<TData>;\n expanded: boolean;\n}\n\nexport interface TreeChildrenLoadedEvent<TData = any> extends GridEventBase<TData> {\n type: \"treeChildrenLoaded\";\n rowId: string;\n rowNode: RowNode<TData>;\n children: readonly TData[];\n}\n\nexport interface TreeChildrenLoadFailedEvent<TData = any> extends GridEventBase<TData> {\n type: \"treeChildrenLoadFailed\";\n rowId: string;\n rowNode: RowNode<TData>;\n error: unknown;\n}\n\nexport interface GridCellRange {\n row1: number;\n row2: number;\n colId1: string;\n colId2: string;\n}\n\nexport interface RangeSelectionChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"rangeSelectionChanged\";\n range: GridCellRange | null;\n}\n\nexport interface RowDragEndEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowDragEnd\";\n rowNode: RowNode<TData>;\n fromIndex: number;\n toIndex: number;\n}\n\nexport interface PaginationChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"paginationChanged\";\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface DisplayedColumnsChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"displayedColumnsChanged\";\n}\n\nexport interface GridErrorEvent<TData = any> extends GridEventBase<TData> {\n type: \"gridError\";\n code: GridErrorCode;\n error: unknown;\n source: string;\n context?: Record<string, unknown>;\n}\n\nexport interface DirtyStateChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"dirtyStateChanged\";\n dirtyRowIds: string[];\n}\n\nexport interface GridEventMap<TData = any> {\n gridReady: GridReadyEvent<TData>;\n gridDestroyed: GridDestroyedEvent<TData>;\n modelUpdated: ModelUpdatedEvent<TData>;\n cellClicked: CellClickEvent<TData>;\n cellDoubleClicked: CellDoubleClickEvent<TData>;\n cellContextMenu: CellContextMenuEvent<TData>;\n rowClicked: RowClickEvent<TData>;\n rowDoubleClicked: RowClickEvent<TData>;\n selectionChanged: SelectionChangedEvent<TData>;\n sortChanged: SortChangedEvent<TData>;\n filterChanged: FilterChangedEvent<TData>;\n columnResized: ColumnResizedEvent<TData>;\n columnMoved: ColumnMovedEvent<TData>;\n columnVisibilityChanged: ColumnVisibilityChangedEvent<TData>;\n cellValueChanged: CellValueChangedEvent<TData>;\n cellEditingStarted: CellEditingStartedEvent<TData>;\n cellEditingStopped: CellEditingStoppedEvent<TData>;\n rowEditingStarted: RowEditingStartedEvent<TData>;\n rowEditingStopped: RowEditingStoppedEvent<TData>;\n detailToggled: DetailToggledEvent<TData>;\n treeChildrenLoaded: TreeChildrenLoadedEvent<TData>;\n treeChildrenLoadFailed: TreeChildrenLoadFailedEvent<TData>;\n rowDragEnd: RowDragEndEvent<TData>;\n rangeSelectionChanged: RangeSelectionChangedEvent<TData>;\n paginationChanged: PaginationChangedEvent<TData>;\n displayedColumnsChanged: DisplayedColumnsChangedEvent<TData>;\n gridError: GridErrorEvent<TData>;\n dirtyStateChanged: DirtyStateChangedEvent<TData>;\n}\n\nexport type GridEventHandler<K extends GridEventType, TData = any> = (event: GridEventMap<TData>[K]) => void;\n\nexport type EventHandlerName<K extends GridEventType> = `on${Capitalize<K>}`;\n","export function escapeHtml(value: any): string {\n const s = value == null ? \"\" : String(value);\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nexport function downloadFile(filename: string, content: string, mime = \"text/plain;charset=utf-8\"): boolean {\n try {\n if (typeof document === \"undefined\" || typeof Blob === \"undefined\") return false;\n const a = document.createElement(\"a\");\n if (typeof URL !== \"undefined\" && typeof URL.createObjectURL === \"function\") {\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n a.href = url;\n a.download = filename;\n a.click();\n const revoke = typeof URL.revokeObjectURL === \"function\" ? URL.revokeObjectURL.bind(URL) : null;\n if (revoke) setTimeout(() => {\n try {\n revoke(url);\n } catch {\n void 0;\n }\n }, 0);\n } else {\n a.href = `data:${mime},${encodeURIComponent(content)}`;\n a.download = filename;\n a.click();\n }\n return true;\n } catch {\n return false;\n }\n}\n","import type { GridOptions } from \"../types/options\";\nimport type { GridEventType } from \"../types/events\";\n\nexport type GridOptionValueKind =\n | \"array\"\n | \"boolean\"\n | \"boolean-object\"\n | \"function\"\n | \"number\"\n | \"object\"\n | \"string\"\n | \"unknown\";\n\nexport type GridOptionUpdateMode = \"columnDefs\" | \"options\" | \"quickFilter\" | \"rowData\";\n\nexport interface GridOptionMetadata {\n /** Runtime value category used by framework adapters. */\n kind: GridOptionValueKind;\n /** How a changed framework prop is forwarded to GridApi. */\n update: GridOptionUpdateMode;\n}\n\ntype EventOptionKey = `on${Capitalize<GridEventType>}`;\nexport type GridOptionKey = Exclude<keyof GridOptions<any>, EventOptionKey>;\n\n/**\n * Runtime single source of truth for every non-event GridOptions property.\n *\n * The mapped `satisfies` type intentionally makes adding a GridOptions field a\n * compile error until its adapter/update behavior is declared here.\n */\nexport const GRID_OPTION_META = {\n columnDefs: { kind: \"array\", update: \"columnDefs\" },\n rowData: { kind: \"array\", update: \"rowData\" },\n defaultColDef: { kind: \"object\", update: \"options\" },\n columnTypes: { kind: \"object\", update: \"options\" },\n getRowId: { kind: \"function\", update: \"options\" },\n rowKey: { kind: \"unknown\", update: \"options\" },\n rowHeight: { kind: \"number\", update: \"options\" },\n headerHeight: { kind: \"number\", update: \"options\" },\n rowBuffer: { kind: \"number\", update: \"options\" },\n columnLayout: { kind: \"string\", update: \"options\" },\n enableColumnResize: { kind: \"boolean\", update: \"options\" },\n domLayout: { kind: \"string\", update: \"options\" },\n rowSelection: { kind: \"string\", update: \"options\" },\n multiSort: { kind: \"boolean\", update: \"options\" },\n size: { kind: \"string\", update: \"options\" },\n stripedRows: { kind: \"boolean\", update: \"options\" },\n showCellBorders: { kind: \"boolean\", update: \"options\" },\n theme: { kind: \"string\", update: \"options\" },\n quickFilterText: { kind: \"string\", update: \"quickFilter\" },\n advancedFilterModel: { kind: \"object\", update: \"options\" },\n masterDetail: { kind: \"boolean\", update: \"options\" },\n detailRowHeight: { kind: \"number\", update: \"options\" },\n detailRowRenderer: { kind: \"function\", update: \"options\" },\n isRowExpandable: { kind: \"function\", update: \"options\" },\n detailToggleColumn: { kind: \"boolean\", update: \"options\" },\n columnMenu: { kind: \"boolean\", update: \"options\" },\n columnStateKey: { kind: \"string\", update: \"options\" },\n columnStateStore: { kind: \"object\", update: \"options\" },\n aggFuncs: { kind: \"object\", update: \"options\" },\n components: { kind: \"object\", update: \"options\" },\n actionPolicy: { kind: \"object\", update: \"options\" },\n features: { kind: \"array\", update: \"options\" },\n initialState: { kind: \"object\", update: \"options\" },\n stateKey: { kind: \"string\", update: \"options\" },\n stateStore: { kind: \"object\", update: \"options\" },\n stateSaveDebounceMs: { kind: \"number\", update: \"options\" },\n locale: { kind: \"object\", update: \"options\" },\n editType: { kind: \"string\", update: \"options\" },\n editableIndicator: { kind: \"string\", update: \"options\" },\n rowEditValidator: { kind: \"function\", update: \"options\" },\n singleClickEdit: { kind: \"boolean\", update: \"options\" },\n manualSorting: { kind: \"boolean\", update: \"options\" },\n manualFiltering: { kind: \"boolean\", update: \"options\" },\n showSummary: { kind: \"boolean\", update: \"options\" },\n summaryMethod: { kind: \"function\", update: \"options\" },\n treeData: { kind: \"boolean\", update: \"options\" },\n childrenKey: { kind: \"string\", update: \"options\" },\n isTreeRowExpandable: { kind: \"function\", update: \"options\" },\n loadTreeChildren: { kind: \"function\", update: \"options\" },\n autoCheckedChildren: { kind: \"boolean\", update: \"options\" },\n defaultExpandAll: { kind: \"boolean\", update: \"options\" },\n indexOffset: { kind: \"number\", update: \"options\" },\n applyRowDrag: { kind: \"boolean\", update: \"options\" },\n undoStackSize: { kind: \"number\", update: \"options\" },\n asyncTransactionWaitMillis: { kind: \"number\", update: \"options\" },\n getRowHeight: { kind: \"function\", update: \"options\" },\n pinnedTopRowData: { kind: \"array\", update: \"options\" },\n pinnedBottomRowData: { kind: \"array\", update: \"options\" },\n pagination: { kind: \"boolean-object\", update: \"options\" },\n watermark: { kind: \"boolean-object\", update: \"options\" },\n suppressWarnings: { kind: \"boolean\", update: \"options\" },\n enableRangeSelection: { kind: \"boolean\", update: \"options\" },\n suppressClipboard: { kind: \"boolean\", update: \"options\" },\n contextMenu: { kind: \"boolean\", update: \"options\" },\n getContextMenuItems: { kind: \"function\", update: \"options\" },\n tooltipComponent: { kind: \"function\", update: \"options\" },\n tooltipShowDelay: { kind: \"number\", update: \"options\" },\n flashCells: { kind: \"boolean\", update: \"options\" },\n fillHandle: { kind: \"boolean\", update: \"options\" },\n statusBar: { kind: \"boolean-object\", update: \"options\" },\n datasource: { kind: \"object\", update: \"options\" },\n blockSize: { kind: \"number\", update: \"options\" },\n infiniteBufferRows: { kind: \"number\", update: \"options\" },\n datasourceRetryCount: { kind: \"number\", update: \"options\" },\n datasourceRetryDelay: { kind: \"number\", update: \"options\" },\n suppressCellFocus: { kind: \"boolean\", update: \"options\" },\n suppressRowHoverHighlight: { kind: \"boolean\", update: \"options\" },\n suppressNoRowsOverlay: { kind: \"boolean\", update: \"options\" },\n suppressHeaderFocus: { kind: \"boolean\", update: \"options\" },\n ariaLabel: { kind: \"string\", update: \"options\" },\n ariaLabelledBy: { kind: \"string\", update: \"options\" },\n ariaDescribedBy: { kind: \"string\", update: \"options\" },\n loading: { kind: \"boolean\", update: \"options\" },\n error: { kind: \"unknown\", update: \"options\" },\n overlayNoRowsTemplate: { kind: \"unknown\", update: \"options\" },\n overlayLoadingTemplate: { kind: \"unknown\", update: \"options\" },\n overlayErrorTemplate: { kind: \"unknown\", update: \"options\" },\n allowUnsafeOverlayHtml: { kind: \"boolean\", update: \"options\" },\n className: { kind: \"string\", update: \"options\" }\n} as const satisfies { [K in GridOptionKey]: GridOptionMetadata };\n\nexport const GRID_OPTION_KEYS = Object.freeze(Object.keys(GRID_OPTION_META) as GridOptionKey[]);\n\nexport const DIRECT_GRID_OPTION_KEYS = Object.freeze(\n GRID_OPTION_KEYS.filter((key) => GRID_OPTION_META[key].update === \"options\")\n);\n","import { EVENT_TYPES } from \"../types/events\";\nimport type { GridOptions } from \"../types/options\";\nimport {\n GRID_OPTION_META,\n type GridOptionKey,\n type GridOptionValueKind\n} from \"./gridOptionMetadata\";\n\nconst EVENT_OPTION_KEYS = new Set(\n EVENT_TYPES.map((type) => `on${type.charAt(0).toUpperCase()}${type.slice(1)}`)\n);\n\nexport function matchesGridOptionKind(value: unknown, kind: GridOptionValueKind): boolean {\n if (value == null || kind === \"unknown\") return true;\n if (kind === \"array\") return Array.isArray(value);\n if (kind === \"boolean-object\") {\n return typeof value === \"boolean\" || (typeof value === \"object\" && !Array.isArray(value));\n }\n if (kind === \"object\") return typeof value === \"object\" && !Array.isArray(value);\n if (kind === \"number\") return typeof value === \"number\" && Number.isFinite(value);\n return typeof value === kind;\n}\n\n/**\n * Drops unknown and runtime-invalid options before they can partially mutate a grid.\n * Validation still reports the original patch, while this function guarantees that\n * JavaScript/JSON callers receive the same safety boundary as TypeScript callers.\n */\nexport function sanitizeGridOptionPatch<TData>(\n input: Partial<GridOptions<TData>> | Record<string, unknown>\n): Partial<GridOptions<TData>> {\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input)) {\n if (EVENT_OPTION_KEYS.has(key)) {\n if (value == null || typeof value === \"function\") output[key] = value;\n continue;\n }\n const metadata = GRID_OPTION_META[key as GridOptionKey];\n if (!metadata || !matchesGridOptionKind(value, metadata.kind)) continue;\n output[key] = value;\n }\n return output;\n}\n","import type { ColumnState, SortModel } from \"../types/colDef\";\nimport type { GridState, GridStateInput } from \"../types/state\";\nimport { normalizeAdvancedFilterModel, normalizeFilterModel } from \"./advancedFilter\";\n\nconst MAX_COLUMNS = 2_000;\nconst MAX_ROW_IDS = 100_000;\nconst MAX_ID_LENGTH = 512;\nconst MAX_QUICK_FILTER_LENGTH = 10_000;\n\nfunction stringIds(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return [...new Set(value.slice(0, MAX_ROW_IDS).filter((entry): entry is string =>\n typeof entry === \"string\" && entry.length > 0 && entry.length <= MAX_ID_LENGTH\n ))];\n}\n\nfunction positiveInteger(value: unknown, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 1\n ? Math.floor(value)\n : fallback;\n}\n\nfunction positiveNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : undefined;\n}\n\nfunction addColumnSizing(state: ColumnState, source: Record<string, unknown>): void {\n const width = positiveNumber(source.width);\n const flex = positiveNumber(source.flex);\n if (width !== undefined) state.width = width;\n if (source.flex === null) state.flex = null;\n else if (flex !== undefined) state.flex = flex;\n if (source.widthMode === \"auto\" || source.widthMode === \"manual\") state.widthMode = source.widthMode;\n}\n\nfunction addColumnLayout(state: ColumnState, source: Record<string, unknown>): void {\n if (typeof source.hide === \"boolean\") state.hide = source.hide;\n if (source.pinned === null || source.pinned === \"left\" || source.pinned === \"right\") state.pinned = source.pinned;\n}\n\nfunction addColumnSort(state: ColumnState, source: Record<string, unknown>): void {\n if (source.sort === null || source.sort === \"asc\" || source.sort === \"desc\") state.sort = source.sort;\n if (source.sortIndex === null) state.sortIndex = null;\n else if (typeof source.sortIndex === \"number\" && Number.isInteger(source.sortIndex) && source.sortIndex >= 0) {\n state.sortIndex = source.sortIndex;\n }\n}\n\nfunction normalizeColumnEntry(input: unknown, seen: Set<string>): ColumnState | null {\n if (input == null || typeof input !== \"object\") return null;\n const source = input as Record<string, unknown>;\n const colId = typeof source.colId === \"string\" ? source.colId.trim() : \"\";\n if (!colId || colId.length > MAX_ID_LENGTH || seen.has(colId)) return null;\n seen.add(colId);\n const state: ColumnState = { colId };\n addColumnLayout(state, source);\n addColumnSizing(state, source);\n addColumnSort(state, source);\n return state;\n}\n\nfunction normalizeColumns(value: unknown): ColumnState[] {\n if (!Array.isArray(value)) return [];\n const output: ColumnState[] = [];\n const seen = new Set<string>();\n for (const input of value.slice(0, MAX_COLUMNS)) {\n const state = normalizeColumnEntry(input, seen);\n if (state) output.push(state);\n }\n return output;\n}\n\nfunction normalizeSortModel(value: unknown): SortModel {\n if (!Array.isArray(value)) return [];\n const output: SortModel = [];\n const seen = new Set<string>();\n for (const input of value.slice(0, MAX_COLUMNS)) {\n if (input == null || typeof input !== \"object\") continue;\n const source = input as Record<string, unknown>;\n const colId = typeof source.colId === \"string\" ? source.colId.trim() : \"\";\n if (!colId || colId.length > MAX_ID_LENGTH || seen.has(colId)) continue;\n if (source.direction !== \"asc\" && source.direction !== \"desc\") continue;\n seen.add(colId);\n output.push({ colId, direction: source.direction });\n }\n return output;\n}\n\n/** Migrates and bounds persisted state before it mutates a live grid. */\nexport function migrateGridState(input: unknown): GridState | null {\n if (input == null || typeof input !== \"object\") return null;\n const state = input as Partial<GridStateInput> & Record<string, unknown>;\n if (state.version !== 1 && state.version !== 2) return null;\n if (!Array.isArray(state.columns) || !Array.isArray(state.sortModel)) return null;\n const pagination = state.pagination != null && typeof state.pagination === \"object\"\n ? state.pagination as Record<string, unknown>\n : {};\n return {\n version: 2,\n columns: normalizeColumns(state.columns),\n sortModel: normalizeSortModel(state.sortModel),\n filterModel: normalizeFilterModel(state.filterModel),\n advancedFilterModel: state.version === 2\n ? normalizeAdvancedFilterModel(state.advancedFilterModel)\n : null,\n quickFilterText: typeof state.quickFilterText === \"string\" && state.quickFilterText.trim()\n ? state.quickFilterText.slice(0, MAX_QUICK_FILTER_LENGTH)\n : null,\n pagination: {\n enabled: pagination.enabled === true,\n page: positiveInteger(pagination.page, 1),\n pageSize: positiveInteger(pagination.pageSize, 20)\n },\n selectedRowIds: stringIds(state.selectedRowIds),\n expandedRowIds: stringIds(state.expandedRowIds),\n expandedGroupIds: stringIds(state.expandedGroupIds)\n };\n}\n","import type {\n GridBatchSaveResult,\n GridChange,\n SaveChangeConflict,\n SaveChangeIssue,\n SaveChangesResult\n} from \"../types/api\";\nimport type { GridApi } from \"../types/api\";\n\nfunction cloneSnapshotData<T>(data: T): T {\n try { if (typeof structuredClone === \"function\") return structuredClone(data); }\n catch { /* rows with platform values use a shallow snapshot */ }\n if (Array.isArray(data)) return [...data] as T;\n if (data != null && typeof data === \"object\") return { ...data };\n return data;\n}\n\nexport function createSaveSnapshot<TData>(\n changes: readonly GridChange<TData>[],\n rowIds?: readonly string[]\n): GridChange<TData>[] {\n const ids = rowIds ? new Set(rowIds.map(String)) : null;\n return changes.filter((change) => !ids || ids.has(change.rowId)).map((change) => ({\n ...change,\n data: cloneSnapshotData(change.data),\n cells: change.cells.map((cell) => ({ ...cell }))\n }));\n}\n\nfunction normalizeIssue<T extends SaveChangeIssue>(issue: T, submittedIds: ReadonlySet<string>): T | null {\n const rowId = typeof issue?.rowId === \"string\" ? issue.rowId : \"\";\n if (!submittedIds.has(rowId) || typeof issue.message !== \"string\" || !issue.message.trim()) return null;\n return {\n ...issue,\n rowId,\n message: issue.message.trim(),\n ...(typeof issue.code === \"string\" && issue.code.trim() ? { code: issue.code.trim() } : {}),\n ...(Array.isArray(issue.colIds)\n ? { colIds: [...new Set(issue.colIds.filter((id): id is string => typeof id === \"string\" && id.length > 0))] }\n : {})\n };\n}\n\nfunction uniqueIssues<T extends SaveChangeIssue>(\n input: readonly T[] | undefined,\n submittedIds: ReadonlySet<string>\n): T[] {\n const byRow = new Map<string, T>();\n for (const issue of input ?? []) {\n const normalized = normalizeIssue(issue, submittedIds);\n if (normalized && !byRow.has(normalized.rowId)) byRow.set(normalized.rowId, normalized);\n }\n return [...byRow.values()];\n}\n\nexport function normalizeBatchSaveResult<TData>(\n submitted: GridChange<TData>[],\n response: void | SaveChangesResult<TData>\n): GridBatchSaveResult<TData> {\n const submittedIds = new Set(submitted.map((change) => change.rowId));\n const conflicts = uniqueIssues<SaveChangeConflict<TData>>(response?.conflicts, submittedIds);\n const conflictIds = new Set(conflicts.map((conflict) => conflict.rowId));\n const failures = uniqueIssues(response?.failures, submittedIds)\n .filter((failure) => !conflictIds.has(failure.rowId));\n const blocked = new Set([...failures, ...conflicts].map((issue) => issue.rowId));\n const explicitlySaved = response?.savedRowIds == null\n ? null\n : new Set(response.savedRowIds.map(String).filter((id) => submittedIds.has(id)));\n const saved = submitted.filter((change) =>\n !blocked.has(change.rowId) && (explicitlySaved == null || explicitlySaved.has(change.rowId))\n );\n return { submitted, saved, failures, conflicts };\n}\n\nfunction conflictUpdateData<TData>(\n api: GridApi<TData>,\n conflict: SaveChangeConflict<TData>\n): { data: TData; mergeIntoCurrent: boolean } | null {\n if (conflict.serverData === undefined) return null;\n const node = api.getNodeById(conflict.rowId);\n if (!node || node.data == null) return null;\n const getRowId = api.getGridOption(\"getRowId\");\n if (getRowId) {\n try {\n const id = getRowId({ data: conflict.serverData, index: node.rowIndex, api });\n return id === conflict.rowId ? { data: conflict.serverData, mergeIntoCurrent: false } : null;\n } catch {\n return null;\n }\n }\n const current = node.data;\n const mergeable = current != null && conflict.serverData != null &&\n typeof current === \"object\" && typeof conflict.serverData === \"object\";\n return mergeable ? { data: current, mergeIntoCurrent: true } : null;\n}\n\nexport function resolveSaveConflict<TData>(\n api: GridApi<TData>,\n conflict: SaveChangeConflict<TData>,\n strategy: \"acceptServer\" | \"keepLocal\"\n): boolean {\n if (api.isDestroyed()) return false;\n if (strategy === \"keepLocal\") return true;\n const update = conflictUpdateData(api, conflict);\n if (!update) return false;\n api.rollbackChanges([conflict.rowId]);\n if (update.mergeIntoCurrent) Object.assign(update.data as object, conflict.serverData as object);\n api.applyTransaction({ update: [update.data] });\n api.markChangesSaved([conflict.rowId]);\n return true;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { CsvExportParams, ImportCsvOptions, RowTransaction } from \"../types/api\";\nimport type { GridApi } from \"../types/api\";\nimport type { GridOptions } from \"../types/options\";\nimport type { ApplyGridStateOptions, GridState, GridStateInput, GridStateSection } from \"../types/state\";\nimport type { AdvancedFilterModel } from \"../types/advancedFilter\";\nimport type { Column } from \"./column\";\nimport { EVENT_TYPES } from \"../types/events\";\nimport type { ColDefOrGroup, ColumnState, FilterModel, SortModel } from \"../types/colDef\";\nimport { DEFAULT_COL_DEF, GRID_SIZE_PRESETS, rowIdFromKey } from \"../core/resolveOptions\";\nimport { buildCsv } from \"../lib/csv\";\nimport { parseCsv, toTsv } from \"../lib/clipboard\";\nimport { escapeHtml } from \"../lib/download\";\nimport { setByPath } from \"../lib/path\";\nimport { formatCellValue } from \"../render/cellContent\";\nimport { sanitizeGridOptionPatch } from \"../core/gridOptionRuntime\";\nimport { migrateGridState } from \"../lib/gridState\";\nimport { createSaveSnapshot, normalizeBatchSaveResult } from \"../lib/batchSave\";\n\ninterface OptionUpdateEffects {\n datasourceChanged: boolean;\n filterChanged: boolean;\n needsCellRefresh: boolean;\n needsColumnRebuild: boolean;\n needsHeaderRebuild: boolean;\n needsPoolRebuild: boolean;\n needsRelayout: boolean;\n needsRowRebuild: boolean;\n needsStateLoad: boolean;\n needsSummaryRefresh: boolean;\n stateToApply?: GridStateInput;\n}\n\ninterface CsvFieldBinding {\n field: string;\n index: number;\n}\n\nfunction createOptionUpdateEffects(): OptionUpdateEffects {\n return {\n datasourceChanged: false,\n filterChanged: false,\n needsCellRefresh: false,\n needsColumnRebuild: false,\n needsHeaderRebuild: false,\n needsPoolRebuild: false,\n needsRelayout: false,\n needsRowRebuild: false,\n needsStateLoad: false,\n needsSummaryRefresh: false\n };\n}\n\nfunction hasOwnOption<T extends object>(options: T, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(options, key);\n}\n\nfunction normalizeFinite(value: unknown, min: number, integer = false): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < min) return undefined;\n return integer ? Math.floor(value) : value;\n}\n\nfunction changedFinite(\n value: unknown,\n current: number,\n min: number,\n integer = false\n): number | undefined {\n const normalized = normalizeFinite(value, min, integer);\n return normalized === undefined || normalized === current ? undefined : normalized;\n}\n\nexport class GridApiImpl<TData = any> implements GridApi<TData> {\n private measureCanvas: HTMLCanvasElement | null = null;\n private asyncTransactions: RowTransaction<TData>[] = [];\n private asyncTransactionTimer: ReturnType<typeof setTimeout> | null = null;\n private asyncTransactionResolvers: Array<() => void> = [];\n\n constructor(private core: GridCore<TData>) {}\n\n whenReady(): Promise<import(\"../types/api\").GridApi<TData>> {\n return this.core.whenReady();\n }\n\n getRootElement(): HTMLElement | null {\n return this.core.isDestroyed() ? null : this.core.skeleton.root;\n }\n\n setRowData(rows: TData[] | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.rowData = rows ?? [];\n if (this.core.rowModel.isInfinite) return;\n this.core.rowModel.setRowData(rows);\n this.core.bodyRenderer.onDataChanged();\n }\n\n applyTransaction(transaction: RowTransaction<TData>): void {\n if (this.core.isDestroyed() || this.core.rowModel.isInfinite) return;\n this.core.rowModel.applyTransaction(transaction);\n this.core.bodyRenderer.onDataChanged();\n }\n\n applyTransactionAsync(transaction: RowTransaction<TData>): Promise<void> {\n if (this.core.isDestroyed() || this.core.rowModel.isInfinite) return Promise.resolve();\n this.asyncTransactions.push(transaction);\n if (this.asyncTransactionTimer == null) {\n this.asyncTransactionTimer = setTimeout(\n () => this.flushAsyncTransactions(),\n this.core.options.asyncTransactionWaitMillis\n );\n }\n return new Promise((resolve) => this.asyncTransactionResolvers.push(resolve));\n }\n\n flushAsyncTransactions(): void {\n if (this.asyncTransactionTimer != null) clearTimeout(this.asyncTransactionTimer);\n this.asyncTransactionTimer = null;\n const transactions = this.asyncTransactions;\n const resolvers = this.asyncTransactionResolvers;\n this.asyncTransactions = [];\n this.asyncTransactionResolvers = [];\n if (transactions.length > 0 && !this.core.isDestroyed() && !this.core.rowModel.isInfinite) {\n this.core.rowModel.applyTransactions(transactions);\n this.core.bodyRenderer.onDataChanged();\n }\n for (const resolve of resolvers) resolve();\n }\n\n getColumnDefs(): ColDefOrGroup<TData>[] | null {\n return this.core.columnModel.getColumnDefs() as ColDefOrGroup<TData>[];\n }\n\n setColumnDefs(colDefs: ColDefOrGroup<TData>[] | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.columnDefs = colDefs ?? [];\n this.core.columnModel.setColumnDefs(colDefs);\n this.core.loadPersistedColumnState();\n this.core.onColumnsStructureChanged();\n if (this.core.rowModel.isInfinite) void this.core.rowModel.onServerParamsChanged();\n else {\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n getColumnState(): ColumnState[] {\n return this.core.columnModel.getColumnState();\n }\n\n setColumnState(state: ColumnState[]): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.applyColumnState(state);\n this.core.onColumnsStructureChanged();\n this.core.applySortModel();\n this.core.persistColumnState();\n }\n\n resetColumnState(): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.resetColumnState();\n this.core.onColumnsStructureChanged();\n this.core.applySortModel();\n this.core.persistColumnState();\n }\n\n setColumnVisibility(colId: string, visible: boolean): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.setColumnVisibility(colId, visible);\n this.core.onColumnsStructureChanged();\n this.core.emit(\"columnVisibilityChanged\", { colId, visible });\n this.core.persistColumnState();\n }\n\n moveColumn(colId: string, toIndex: number): void {\n if (this.core.isDestroyed()) return;\n this.core.moveColumn(colId, toIndex);\n }\n\n setColumnPinned(colId: string, pinned: \"left\" | \"right\" | null): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.setColumnPinned(colId, pinned);\n this.core.onColumnsStructureChanged();\n this.core.persistColumnState();\n }\n\n setColumnWidth(colId: string, width: number): boolean {\n if (this.core.isDestroyed()) return false;\n const column = this.core.columnModel.getColumn(colId);\n if (!column || !this.core.columnModel.setColumnWidth(column, width)) return false;\n this.core.relayoutColumns();\n this.core.commitColumnWidths([column]);\n return true;\n }\n\n sizeColumnsToFit(width?: number): void {\n if (this.core.isDestroyed()) return;\n const cols = this.core.columnModel.getOrderedVisible();\n if (cols.length === 0) return;\n const target = width ?? this.core.skeleton.measureViewportWidth();\n if (target <= 0) return;\n const total = cols.reduce((acc, c) => acc + c.currentWidth, 0);\n if (total <= 0) return;\n const changed = cols.filter((col) =>\n this.core.columnModel.setColumnWidth(col, Math.max(30, Math.floor((col.currentWidth * target) / total)))\n );\n this.core.relayoutColumns();\n this.core.commitColumnWidths(changed);\n }\n\n autoSizeColumn(colId: string, skipHeader = false): void {\n if (this.core.isDestroyed()) return;\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n\n if (this.autoSizeColumnInternal(column, skipHeader)) {\n this.core.relayoutColumns();\n this.core.commitColumnWidths([column]);\n }\n }\n\n private autoSizeColumnInternal(\n column: Column<TData>,\n skipHeader: boolean\n ): boolean {\n\n if (column.hasCheckbox || column.isDetailToggle) {\n return this.core.columnModel.setColumnWidth(column, column.isDetailToggle ? 38 : 46);\n }\n\n this.measureCanvas ??= document.createElement(\"canvas\");\n const ctx = this.measureCanvas.getContext(\"2d\");\n if (!ctx) return false;\n const style = window.getComputedStyle(this.core.skeleton.root);\n ctx.font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n\n let maxWidth = 0;\n const consider = (text: string) => {\n if (!text) return;\n const w = ctx.measureText(text).width;\n if (w > maxWidth) maxWidth = w;\n };\n\n if (!skipHeader) {\n consider(column.colDef.headerName ?? column.colDef.field ?? column.id);\n }\n const nodes = this.core.rowModel.getAllNodes();\n const cap = Math.min(nodes.length, 2000);\n for (let i = 0; i < cap; i++) {\n consider(formatCellValue(this.core, nodes[i], column));\n }\n\n const extra = (column.sortable ? 20 : 0) + (column.filterable ? 28 : 0) + (this.core.options.columnMenu ? 22 : 0) + 28;\n return this.core.columnModel.setColumnWidth(column, Math.ceil(maxWidth) + extra);\n }\n\n autoSizeAllColumns(skipHeader?: boolean): void {\n if (this.core.isDestroyed()) return;\n const changed: Column<TData>[] = [];\n for (const col of this.core.columnModel.getOrderedVisible()) {\n if (this.autoSizeColumnInternal(col, skipHeader ?? false)) changed.push(col);\n }\n if (changed.length > 0) {\n this.core.relayoutColumns();\n this.core.commitColumnWidths(changed);\n }\n }\n\n getSortModel(): SortModel {\n return this.core.columnModel.getSortModel();\n }\n\n setSortModel(sortModel: SortModel | null): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.applySortModel(sortModel);\n this.core.applySortModel();\n }\n\n getFilterModel(): FilterModel {\n return this.core.rowModel.getFilterModel();\n }\n\n setFilterModel(filterModel: FilterModel | null): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setFilterModel(filterModel);\n this.core.headerRenderer.refreshFilterIcons();\n this.emitFilterChanged();\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n return;\n }\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n getAdvancedFilterModel(): AdvancedFilterModel | null {\n return this.core.rowModel.getAdvancedFilterModel();\n }\n\n setAdvancedFilterModel(model: AdvancedFilterModel | null): void {\n if (this.core.isDestroyed() || !this.core.rowModel.setAdvancedFilterModel(model)) return;\n this.emitFilterChanged();\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n return;\n }\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n private emitFilterChanged(): void {\n this.core.emit(\"filterChanged\", {\n filterModel: this.core.rowModel.getFilterModel(),\n advancedFilterModel: this.core.rowModel.getAdvancedFilterModel()\n });\n }\n\n isColumnFilterPresent(colId: string): boolean {\n return Object.prototype.hasOwnProperty.call(this.core.rowModel.getFilterModel(), colId);\n }\n\n setQuickFilter(text: string | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.quickFilterText = text != null && text.trim() !== \"\" ? text : null;\n if (this.core.rowModel.setQuickFilter(text)) {\n this.core.applyQuickFilter();\n }\n }\n\n getQuickFilter(): string | null {\n return this.core.rowModel.getQuickFilter();\n }\n\n getRowSelection(): \"none\" | \"single\" | \"multiple\" {\n return this.core.options.rowSelection;\n }\n\n setRowSelection(mode: \"none\" | \"single\" | \"multiple\"): void {\n if (this.core.isDestroyed()) return;\n if (this.core.options.rowSelection === mode) return;\n this.core.options.rowSelection = mode;\n if (mode === \"none\") this.deselectAll();\n this.core.headerRenderer.build();\n this.core.bodyRenderer.rebuildPool();\n }\n\n getSelectedNodes() {\n return this.core.selectionService.getSelectedNodes();\n }\n\n getSelectedRows(): TData[] {\n return this.core.selectionService.getSelectedRows();\n }\n\n selectNodeById(nodeId: string, selected = true, clearOthers = true): void {\n this.core.selectionService.selectNodeById(nodeId, selected, clearOthers);\n }\n\n selectAll(filteredOnly = true): void {\n this.core.selectionService.selectAll(filteredOnly);\n }\n\n deselectAll(): void {\n this.core.selectionService.deselectAll();\n }\n\n getDisplayedRowCount(): number {\n return this.core.rowModel.getDisplayedRowCount();\n }\n\n getRowNode(rowIndex: number) {\n return this.core.rowModel.getDisplayedRow(rowIndex);\n }\n\n getNodeById(id: string) {\n return this.core.rowModel.getNodeById(id);\n }\n\n forEachNode(callback: (node: any, index: number) => void): void {\n this.core.rowModel.forEachNode(callback);\n }\n\n forEachNodeAfterFilterAndSort(callback: (node: any, index: number) => void): void {\n this.core.rowModel.forEachNodeAfterFilterAndSort(callback);\n }\n\n scrollToIndex(rowIndex: number, position: \"top\" | \"bottom\" | \"middle\" | \"nearest\" = \"top\"): void {\n this.core.bodyRenderer.scrollToIndex(rowIndex, position);\n }\n\n expandRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.expandRow(rowId);\n }\n\n collapseRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.collapseRow(rowId);\n }\n\n toggleDetailRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.toggleDetail(rowId);\n }\n\n isRowExpanded(rowId: string): boolean {\n return this.core.rowModel.isRowExpanded(rowId);\n }\n\n expandAllDetails(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.expandAllDetails();\n }\n\n collapseAllDetails(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.collapseAllDetails();\n }\n\n loadTreeChildren(rowId: string, options: { force?: boolean } = {}): Promise<readonly TData[]> {\n if (this.core.isDestroyed()) return Promise.resolve([]);\n return this.core.rowModel.loadTreeChildren(rowId, options.force === true);\n }\n\n retryTreeChildren(rowId: string): Promise<readonly TData[]> {\n return this.loadTreeChildren(rowId, { force: true });\n }\n\n isTreeRowLoading(rowId: string): boolean {\n return !this.core.isDestroyed() && this.core.rowModel.isTreeRowLoading(rowId);\n }\n\n toggleRowGroup(groupId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.toggleGroup(groupId);\n }\n\n reorderRows(fromIndex: number, toIndex: number): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.reorderRowsByDisplayed(fromIndex, toIndex);\n }\n\n isGroupExpanded(groupId: string): boolean {\n return this.core.rowModel.isGroupExpanded(groupId);\n }\n\n expandAllGroups(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.expandAllGroups();\n }\n\n collapseAllGroups(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.collapseAllGroups();\n }\n\n setSelection(rows: TData[], clearOthers = true): void {\n if (this.core.isDestroyed()) return;\n const getRowId = this.core.options.getRowId;\n const changes: { node: any; selected: boolean }[] = [];\n for (const row of rows) {\n const node = getRowId\n ? this.core.rowModel.getNodeById(\n this.core.rowModel.resolveRowId(row, -1, `__missing_selection_${this.core.nextId()}`)\n )\n : this.core.rowModel.getAllNodes().find((n) => n.data === row);\n if (node) changes.push({ node, selected: true });\n }\n if (changes.length > 0) {\n this.core.selectionService.applySelectionPublic(changes, clearOthers);\n } else if (clearOthers) {\n this.deselectAll();\n }\n }\n\n getVisibleSelection(): TData[] {\n const selectedIds = new Set(this.core.selectionService.getSelectedNodes().map((n) => n.id));\n return this.core.rowModel\n .getDisplayedRows()\n .filter((n) => !n.isDetail && !n.isGroup && selectedIds.has(n.id))\n .map((n) => n.data!)\n .filter(Boolean);\n }\n\n getSelectedIds(): string[] {\n return this.core.selectionService.getSelectedIds();\n }\n\n undo(): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.undoService.undo();\n }\n\n redo(): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.undoService.redo();\n }\n\n canUndo(): boolean {\n return this.core.undoService.canUndo();\n }\n\n canRedo(): boolean {\n return this.core.undoService.canRedo();\n }\n\n getDirtyRowIds(): string[] {\n return this.core.changeTracker.getDirtyRowIds();\n }\n\n getChanges(): import(\"../types/api\").GridChange<TData>[] {\n return this.core.changeTracker.getChanges();\n }\n\n markChangesSaved(rowIds?: readonly string[]): void {\n this.core.changeTracker.markSaved(rowIds);\n }\n\n async saveChanges(\n handler: import(\"../types/api\").SaveChangesHandler<TData>,\n rowIds?: readonly string[]\n ): Promise<import(\"../types/api\").GridChange<TData>[]> {\n return (await this.saveChangesDetailed(handler, rowIds)).saved;\n }\n\n async saveChangesDetailed(\n handler: import(\"../types/api\").SaveChangesHandler<TData>,\n rowIds?: readonly string[]\n ): Promise<import(\"../types/api\").GridBatchSaveResult<TData>> {\n const snapshot = createSaveSnapshot(this.core.changeTracker.getChanges(), rowIds);\n if (snapshot.length === 0) return { submitted: [], saved: [], failures: [], conflicts: [] };\n const result = normalizeBatchSaveResult(snapshot, await handler(snapshot));\n if (!this.core.isDestroyed()) this.core.changeTracker.acknowledge(result.saved);\n return result;\n }\n\n rollbackChanges(rowIds?: readonly string[]): boolean {\n return this.core.changeTracker.rollback(rowIds);\n }\n\n setPinnedTopRowData(rows: TData[] | null): void {\n if (this.core.isDestroyed()) return;\n this.core.options.pinnedTopRowData = rows ?? [];\n this.core.pinnedRowsRenderer.setTopData(this.core.options.pinnedTopRowData);\n }\n\n getPinnedTopRowData(): TData[] {\n return this.core.pinnedRowsRenderer.getTopData();\n }\n\n setPinnedBottomRowData(rows: TData[] | null): void {\n if (this.core.isDestroyed()) return;\n this.core.options.pinnedBottomRowData = rows ?? [];\n this.core.pinnedRowsRenderer.setBottomData(this.core.options.pinnedBottomRowData);\n }\n\n getPinnedBottomRowData(): TData[] {\n return this.core.pinnedRowsRenderer.getBottomData();\n }\n\n getRangeSelection(): import(\"../types/events\").GridCellRange | null {\n return this.core.bodyRenderer.getRangeSelection();\n }\n\n clearRangeSelection(): void {\n if (this.core.isDestroyed()) return;\n this.core.bodyRenderer.clearRangeSelection();\n }\n\n copyRangeToClipboard(): Promise<boolean> {\n if (this.core.isDestroyed()) return Promise.resolve(false);\n return this.core.copyActiveRange();\n }\n\n openColumnPanel(anchor?: HTMLElement): void {\n this.openColumnWorkbench(anchor);\n }\n\n openColumnWorkbench(anchor?: HTMLElement): void {\n if (this.core.isDestroyed()) return;\n this.core.columnMenu.openStandalone(anchor);\n }\n\n closeColumnWorkbench(): void {\n this.core.columnMenu.close();\n }\n\n getColumnWorkbenchItems(): import(\"../types/api\").ColumnWorkbenchItem[] {\n return this.core.columnModel.getColumns()\n .filter((column) => !column.isDetailToggle)\n .map((column) => ({\n colId: column.id,\n label: column.colDef.headerName ?? column.colDef.field ?? column.id,\n visible: !column.hide,\n pinned: column.pinned,\n width: column.currentWidth || column.manualWidth || column.colDef.width || 0,\n movable: column.movable,\n hideable: !column.hasCheckbox\n }));\n }\n\n refreshLayout(): void {\n if (this.core.isDestroyed()) return;\n this.core.relayout();\n this.core.bodyRenderer.syncScroll();\n }\n\n isInfinite(): boolean {\n return this.core.rowModel.isInfinite;\n }\n\n reload(): Promise<void> {\n if (this.core.isDestroyed()) return Promise.resolve();\n if (this.core.rowModel.isInfinite) {\n return this.core.rowModel.reloadInfinite();\n } else {\n this.core.rowModel.setRowData(this.core.options.rowData);\n this.core.bodyRenderer.onDataChanged();\n return Promise.resolve();\n }\n }\n\n paginationEnabled(): boolean {\n return this.core.rowModel.paginationActive;\n }\n\n setPaginationEnabled(enabled: boolean): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPaginationEnabled(enabled);\n }\n\n getPage(): number {\n return this.core.rowModel.getCurrentPage();\n }\n\n setPage(page: number): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPage(page);\n }\n\n getPageSize(): number {\n return this.core.options.paginationPageSize;\n }\n\n setPageSize(size: number): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPageSize(size);\n }\n\n getPageCount(): number {\n return this.core.rowModel.getPageCount();\n }\n\n getTotalRowCount(): number {\n return this.core.rowModel.getTotalRowCount();\n }\n\n importCsv(text: string, options: ImportCsvOptions = {}): boolean {\n if (this.core.isDestroyed() || !text) return false;\n const grid = parseCsv(text, options.separator ?? \",\");\n if (grid.length === 0) return false;\n const headerRow = grid[options.headerRowIndex ?? 0] ?? [];\n const body = grid.slice((options.headerRowIndex ?? 0) + 1).filter((r) => r.some((c) => c !== \"\"));\n const mode = options.mode ?? \"replace\";\n\n if (mode === \"paste\") {\n this.core.pasteText(toTsv(body, false), 0, 0);\n return true;\n }\n\n const columns = this.core.columnModel.getOrderedVisible().filter((column) => column.colDef.field);\n const fieldOrder = this.resolveCsvFieldOrder(headerRow, columns);\n const records = this.buildCsvRecords(body, fieldOrder, options);\n\n if (mode === \"append\") {\n this.core.rowModel.applyTransaction({ add: records as unknown as TData[] });\n } else {\n this.core.rowModel.setRowData(records as unknown as TData[]);\n }\n this.core.bodyRenderer.onDataChanged();\n return true;\n }\n\n private resolveCsvFieldOrder(headerRow: string[], columns: readonly Column[]): CsvFieldBinding[] {\n const byHeader = new Map<string, string>();\n for (const column of columns) {\n const field = column.colDef.field;\n if (!field) continue;\n byHeader.set(String(column.colDef.headerName ?? field), field);\n byHeader.set(field, field);\n }\n if (headerRow.length > 0) headerRow[0] = headerRow[0].replace(/^\\uFEFF/, \"\");\n const matched = headerRow\n .map((header, index) => ({ field: byHeader.get(String(header).trim()) ?? null, index }))\n .filter((entry): entry is { field: string; index: number } => entry.field != null);\n if (matched.length > 0) return matched;\n return columns.map((column, index) => ({ field: column.colDef.field!, index }));\n }\n\n private buildCsvRecords(\n rows: string[][],\n fieldOrder: CsvFieldBinding[],\n options: ImportCsvOptions\n ): Array<Record<string, any>> {\n return rows.map((row, rowIndex) => {\n const record: Record<string, any> = {};\n fieldOrder.forEach(({ field, index }) => {\n const raw = row[index];\n if (raw === undefined) return;\n const value = this.parseCsvValue(raw, field, rowIndex, index, options);\n if (!setByPath(record, field, value)) {\n this.core.reportError(new Error(`Unsafe CSV field: ${field}`), \"csv.import\", { field });\n }\n });\n return record;\n });\n }\n\n private parseCsvValue(\n raw: string,\n field: string,\n rowIndex: number,\n columnIndex: number,\n options: ImportCsvOptions\n ): any {\n if (options.parseValue) {\n try {\n return options.parseValue({ value: raw, field, rowIndex, columnIndex });\n } catch (error) {\n this.core.reportError(error, \"csv.parseValue\", { field, rowIndex, columnIndex });\n return raw;\n }\n }\n if (raw === \"\") return null;\n const isNumeric = /^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(raw);\n const hasLeadingZero = /^[+-]?0\\d/.test(raw);\n return options.coerceNumbers !== false && isNumeric && !hasLeadingZero ? Number(raw) : raw;\n }\n\n print(options: import(\"../types/api\").PrintOptions = {}): boolean {\n if (this.core.isDestroyed()) return false;\n try {\n const win = window.open(\"\", \"_blank\", \"width=980,height=720\");\n if (!win) return false;\n const cols = this.core.columnModel\n .getOrderedVisible()\n .filter((c) => !c.hasCheckbox && !c.isDetailToggle && !c.colDef.rowDrag);\n const nodes = this.core.rowModel.getPipelineRows().filter((n) => !n.isDetail && !n.isGroup);\n const includeHeader = options.includeHeader !== false;\n const headerCells = includeHeader\n ? `<tr>${cols.map((c) => `<th>${escapeHtml(c.colDef.headerName ?? c.colDef.field ?? c.id)}</th>`).join(\"\")}</tr>`\n : \"\";\n const bodyRows = nodes\n .map(\n (node) =>\n `<tr>${cols\n .map((c) => {\n const v = formatCellValue(this.core, node, c);\n return `<td>${escapeHtml(v)}</td>`;\n })\n .join(\"\")}</tr>`\n )\n .join(\"\");\n const html =\n `<!doctype html><html><head><meta charset=\"utf-8\"><title>${escapeHtml(options.title ?? \"MachTable\")}</title>` +\n `<style>body{font-family:system-ui,\"PingFang SC\",\"Microsoft YaHei\",sans-serif;padding:20px}` +\n `h3{margin:0 0 12px;font-size:16px}` +\n `table{border-collapse:collapse;width:100%;font-size:12px}` +\n `th,td{border:1px solid #bbb;padding:5px 8px;text-align:left;word-break:break-all}` +\n `th{background:#f2f5f9;font-weight:600}` +\n `@page{margin:12mm}</style></head><body>` +\n `<h3>${escapeHtml(options.title ?? \"\")}</h3><table>${headerCells}${bodyRows}</table>` +\n `</body></html>`;\n win.document.write(html);\n win.document.close();\n win.focus();\n win.print();\n return true;\n } catch {\n return false;\n }\n }\n\n startEditingCell(params: { rowIndex: number; colId: string; keyPress?: string }): boolean {\n const column = this.core.columnModel.getColumn(params.colId);\n if (!column) return false;\n return this.core.editingService.start(params.rowIndex, column, params.keyPress ?? null);\n }\n\n startEditingRow(rowIndex: number): boolean {\n return this.core.editingService.startRow(rowIndex);\n }\n\n isRowEditing(rowIndex?: number): boolean {\n return this.core.editingService.isRowEditing(rowIndex);\n }\n\n stopEditing(cancel?: boolean): void {\n this.core.editingService.stop(cancel ?? false);\n }\n\n stopEditingAsync(cancel?: boolean): Promise<boolean> {\n return this.core.editingService.stopAsync(cancel ?? false);\n }\n\n stopEditingRow(cancel?: boolean): Promise<boolean> {\n return this.core.editingService.stopRowAsync(cancel ?? false);\n }\n\n refreshCells(): void {\n this.core.bodyRenderer.refreshAllCells();\n this.core.pinnedRowsRenderer.refresh();\n this.core.summaryRenderer.refresh();\n }\n\n getGridOption<K extends keyof GridOptions<TData>>(key: K): GridOptions<TData>[K] {\n return (this.core.options as unknown as GridOptions<TData>)[key];\n }\n\n setGridOption<K extends keyof GridOptions<TData>>(key: K, value: GridOptions<TData>[K]): void {\n this.updateOptions({ [key]: value });\n }\n\n updateOptions(options: Partial<GridOptions<TData>>): void {\n if (this.core.isDestroyed()) return;\n this.core.checkWarnings(options);\n options = sanitizeGridOptionPatch(options);\n const effects = createOptionUpdateEffects();\n const previousColumnMenu = this.core.options.columnMenu;\n\n this.updateSourceOptions(options, effects);\n this.updateDimensionOptions(options, effects);\n this.updateEditingOptions(options, effects);\n this.updateInteractionOptions(options, effects);\n this.updatePaginationOptions(options);\n this.updatePresentationOptions(options, effects);\n this.updateAccessibilityOptions(options, effects);\n this.updateRowModelOptions(options, effects);\n this.updateExtensionOptions(options, effects);\n this.updateDatasourceOptions(options, effects);\n this.applyOptionUpdateEffects(options, effects, previousColumnMenu);\n }\n\n private updateSourceOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (hasOwnOption(options, \"columnDefs\") && options.columnDefs !== resolved.columnDefs) {\n resolved.columnDefs = Array.isArray(options.columnDefs) ? options.columnDefs : [];\n effects.needsColumnRebuild = true;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"rowData\")) {\n resolved.rowData = Array.isArray(options.rowData) ? options.rowData : [];\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"initialState\") && options.initialState) {\n resolved.initialState = options.initialState;\n effects.stateToApply = options.initialState;\n }\n this.updateEventHandlers(options);\n }\n\n private updateEventHandlers(options: Partial<GridOptions<TData>>): void {\n for (const eventType of EVENT_TYPES) {\n const key = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}` as keyof GridOptions<TData>;\n if (hasOwnOption(options, key)) Object.assign(this.core.options, { [key]: options[key] });\n }\n }\n\n private updateDimensionOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n const rowHeight = changedFinite(options.rowHeight, resolved.rowHeight, 1);\n const headerHeight = changedFinite(options.headerHeight, resolved.headerHeight, 1);\n const rowBuffer = changedFinite(options.rowBuffer, resolved.rowBuffer, 0, true);\n const detailHeight = changedFinite(options.detailRowHeight, resolved.detailRowHeight, 1);\n\n if (rowHeight !== undefined) {\n resolved.rowHeight = rowHeight;\n effects.needsRelayout = true;\n }\n if (headerHeight !== undefined) {\n resolved.headerHeight = headerHeight;\n effects.needsRelayout = true;\n effects.needsHeaderRebuild = true;\n }\n if (rowBuffer !== undefined) {\n resolved.rowBuffer = rowBuffer;\n effects.needsRelayout = true;\n }\n if (options.columnLayout != null && options.columnLayout !== resolved.columnLayout) {\n resolved.columnLayout = options.columnLayout === \"fit\" ? \"fit\" : \"normal\";\n effects.needsRelayout = true;\n }\n if (options.domLayout != null && options.domLayout !== resolved.domLayout) {\n resolved.domLayout = options.domLayout === \"autoHeight\" ? \"autoHeight\" : \"normal\";\n this.core.skeleton.applyDomLayout(resolved.domLayout);\n effects.needsPoolRebuild = true;\n }\n if (options.multiSort != null) resolved.multiSort = options.multiSort;\n if (detailHeight !== undefined) {\n resolved.detailRowHeight = detailHeight;\n this.core.bodyRenderer.applyContainerSizes();\n this.core.bodyRenderer.updateRange(true);\n }\n }\n\n private updateEditingOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.editType != null && options.editType !== resolved.editType) {\n this.core.editingService.stop(true);\n resolved.editType = options.editType === \"fullRow\" ? \"fullRow\" : \"cell\";\n effects.needsCellRefresh = true;\n }\n if (options.editableIndicator != null && options.editableIndicator !== resolved.editableIndicator) {\n resolved.editableIndicator =\n options.editableIndicator === \"always\" || options.editableIndicator === \"none\"\n ? options.editableIndicator\n : \"hover\";\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"rowEditValidator\")) resolved.rowEditValidator = options.rowEditValidator;\n if (options.singleClickEdit != null) resolved.singleClickEdit = options.singleClickEdit;\n if (options.manualSorting != null) resolved.manualSorting = options.manualSorting;\n if (options.manualFiltering != null) resolved.manualFiltering = options.manualFiltering;\n }\n\n private updateInteractionOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (\n typeof options.enableColumnResize === \"boolean\" &&\n options.enableColumnResize !== resolved.enableColumnResize\n ) {\n this.core.resizeService.cancelResize();\n resolved.enableColumnResize = options.enableColumnResize;\n effects.needsHeaderRebuild = true;\n }\n if (options.locale != null && options.locale !== resolved.locale) {\n resolved.locale = options.locale;\n effects.needsHeaderRebuild = true;\n effects.needsCellRefresh = true;\n this.core.paginationBar.rebuild();\n this.core.statusBarService.rebuild();\n }\n if (options.indexOffset != null && options.indexOffset !== resolved.indexOffset) {\n resolved.indexOffset = options.indexOffset;\n effects.needsCellRefresh = true;\n }\n if (options.showSummary != null && options.showSummary !== resolved.showSummary) {\n resolved.showSummary = options.showSummary;\n effects.needsSummaryRefresh = true;\n effects.needsRelayout = true;\n }\n const undoStackSize = changedFinite(options.undoStackSize, resolved.undoStackSize, 0, true);\n if (undoStackSize !== undefined) {\n resolved.undoStackSize = undoStackSize;\n this.core.undoService.trimToSize();\n }\n const wait = normalizeFinite(options.asyncTransactionWaitMillis, 0, true);\n if (wait !== undefined) resolved.asyncTransactionWaitMillis = wait;\n this.updateDynamicRowHeight(options, effects);\n this.updateRangeAndFeedbackOptions(options);\n }\n\n private updateDynamicRowHeight(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n if (!hasOwnOption(options, \"getRowHeight\")) return;\n const changed = this.core.options.getRowHeight !== options.getRowHeight;\n this.core.options.getRowHeight = options.getRowHeight;\n if (changed) this.core.bodyRenderer.invalidateAllRowHeights();\n effects.needsRelayout = true;\n }\n\n private updateRangeAndFeedbackOptions(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (options.enableRangeSelection != null) {\n resolved.enableRangeSelection = options.enableRangeSelection;\n if (!options.enableRangeSelection) this.clearRangeSelection();\n }\n if (hasOwnOption(options, \"tooltipComponent\")) resolved.tooltipComponent = options.tooltipComponent;\n const tooltipDelay = normalizeFinite(options.tooltipShowDelay, 0);\n if (tooltipDelay !== undefined) resolved.tooltipShowDelay = tooltipDelay;\n if (options.flashCells != null) resolved.flashCells = options.flashCells;\n if (hasOwnOption(options, \"getContextMenuItems\")) {\n resolved.getContextMenuItems = options.getContextMenuItems;\n }\n if (options.theme != null && options.theme !== resolved.theme) {\n resolved.theme = options.theme;\n this.core.skeleton.applyTheme(options.theme);\n this.core.watermarkService.refresh();\n }\n }\n\n private updatePaginationOptions(options: Partial<GridOptions<TData>>): void {\n if (options.pagination === undefined) return;\n const resolved = this.core.options;\n const config = options.pagination;\n const enabled = config !== false && resolved.datasource == null;\n if (enabled !== resolved.paginationEnabled) this.core.rowModel.setPaginationEnabled(enabled);\n if (typeof config === \"object\" && config) this.updatePaginationConfig(config);\n if (resolved.paginationEnabled) this.core.rowModel.onPaginationOptionsChanged();\n this.core.paginationBar.rebuild();\n }\n\n private updatePaginationConfig(config: Exclude<GridOptions<TData>[\"pagination\"], boolean | undefined>): void {\n const resolved = this.core.options;\n resolved.paginationMode = config.mode === \"server\" ? \"server\" : \"client\";\n const page = normalizeFinite(config.page, 1, true);\n const total = normalizeFinite(config.total, 0, true);\n if (page !== undefined) resolved.paginationPage = page;\n if (total !== undefined) resolved.paginationTotal = total;\n if (config.pageSize != null) resolved.paginationPageSize = config.pageSize;\n if (config.pageSizeOptions != null) resolved.paginationPageSizeOptions = config.pageSizeOptions;\n if (config.showTotal != null) resolved.paginationShowTotal = config.showTotal;\n if (config.showPageSizeSelector != null) {\n resolved.paginationShowSizeSelector = config.showPageSizeSelector;\n }\n }\n\n private updatePresentationOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n this.updateWatermarkAndStatus(options, effects);\n this.updateSizePreset(options, effects);\n const resolved = this.core.options;\n if (options.stripedRows != null && options.stripedRows !== resolved.stripedRows) {\n resolved.stripedRows = options.stripedRows;\n this.core.skeleton.setStriped(options.stripedRows);\n }\n if (options.showCellBorders != null && options.showCellBorders !== resolved.showCellBorders) {\n resolved.showCellBorders = options.showCellBorders;\n this.core.skeleton.setCellBorders(options.showCellBorders);\n }\n }\n\n private updateWatermarkAndStatus(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.watermark !== undefined) {\n resolved.watermarkEnabled = options.watermark != null && options.watermark !== false;\n resolved.watermarkConfig =\n options.watermark == null || options.watermark === false\n ? null\n : options.watermark === true\n ? { text: \"MachTable\" }\n : options.watermark;\n this.core.watermarkService.refresh();\n }\n this.updateStatusOptions(options);\n if (hasOwnOption(options, \"summaryMethod\")) {\n resolved.summaryMethod = options.summaryMethod;\n effects.needsSummaryRefresh = true;\n }\n }\n\n private updateStatusOptions(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (options.suppressClipboard != null) resolved.suppressClipboard = options.suppressClipboard;\n if (options.contextMenu != null) resolved.contextMenu = options.contextMenu;\n if (options.columnMenu != null) resolved.columnMenu = options.columnMenu;\n if (options.fillHandle != null) resolved.fillHandle = options.fillHandle;\n if (options.statusBar !== undefined) {\n resolved.statusBarEnabled =\n options.statusBar === true || (typeof options.statusBar === \"object\" && options.statusBar != null);\n if (typeof options.statusBar === \"object\" && options.statusBar?.panels) {\n resolved.statusBarPanels = options.statusBar.panels;\n }\n this.core.statusBarService.rebuild();\n }\n }\n\n private updateSizePreset(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const { size } = options;\n if (size == null || !hasOwnOption(GRID_SIZE_PRESETS, size) || size === this.core.options.size) return;\n const preset = GRID_SIZE_PRESETS[size];\n this.core.options.size = size;\n this.core.options.rowHeight = options.rowHeight ?? preset.rowHeight;\n this.core.options.headerHeight = options.headerHeight ?? preset.headerHeight;\n this.core.skeleton.applySize(size);\n effects.needsRelayout = true;\n effects.needsHeaderRebuild = true;\n }\n\n private updateAccessibilityOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.suppressCellFocus != null) resolved.suppressCellFocus = options.suppressCellFocus;\n if (options.suppressRowHoverHighlight != null) {\n resolved.suppressRowHoverHighlight = options.suppressRowHoverHighlight;\n }\n if (options.suppressNoRowsOverlay != null) resolved.suppressNoRowsOverlay = options.suppressNoRowsOverlay;\n if (options.suppressHeaderFocus != null && options.suppressHeaderFocus !== resolved.suppressHeaderFocus) {\n resolved.suppressHeaderFocus = options.suppressHeaderFocus;\n effects.needsHeaderRebuild = true;\n }\n this.updateAriaLabels(options);\n this.updateOverlayOptions(options);\n }\n\n private updateAriaLabels(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n let changed = false;\n if (hasOwnOption(options, \"ariaLabel\")) {\n resolved.ariaLabel = options.ariaLabel ?? \"MachTable data grid\";\n changed = true;\n }\n if (hasOwnOption(options, \"ariaLabelledBy\")) {\n resolved.ariaLabelledBy = options.ariaLabelledBy ?? \"\";\n changed = true;\n }\n if (hasOwnOption(options, \"ariaDescribedBy\")) {\n resolved.ariaDescribedBy = options.ariaDescribedBy ?? \"\";\n changed = true;\n }\n if (changed) this.core.skeleton.applyAriaLabels(resolved);\n }\n\n private updateOverlayOptions(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (hasOwnOption(options, \"overlayNoRowsTemplate\")) {\n resolved.overlayNoRowsTemplate = options.overlayNoRowsTemplate ?? \"\";\n }\n if (hasOwnOption(options, \"overlayLoadingTemplate\")) {\n resolved.overlayLoadingTemplate = options.overlayLoadingTemplate ?? \"\";\n }\n if (hasOwnOption(options, \"overlayErrorTemplate\")) {\n resolved.overlayErrorTemplate = options.overlayErrorTemplate ?? \"\";\n }\n if (options.allowUnsafeOverlayHtml != null) resolved.allowUnsafeOverlayHtml = options.allowUnsafeOverlayHtml;\n if (hasOwnOption(options, \"className\")) {\n resolved.className = options.className ?? \"\";\n this.core.skeleton.setCustomClass(resolved.className);\n }\n if (options.loading != null) resolved.loading = options.loading;\n if (hasOwnOption(options, \"error\")) resolved.error = options.error ?? null;\n }\n\n private updateRowModelOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n this.updateSelectionAndColumns(options, effects);\n this.updateHierarchyOptions(options, effects);\n const resolved = this.core.options;\n if (options.autoCheckedChildren != null) resolved.autoCheckedChildren = options.autoCheckedChildren;\n if (options.defaultExpandAll != null && options.defaultExpandAll !== resolved.defaultExpandAll) {\n resolved.defaultExpandAll = options.defaultExpandAll;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"advancedFilterModel\")) {\n effects.filterChanged = this.core.rowModel.setAdvancedFilterModel(options.advancedFilterModel) || effects.filterChanged;\n }\n if (options.applyRowDrag != null) resolved.applyRowDrag = options.applyRowDrag;\n if (options.suppressWarnings != null) resolved.suppressWarnings = options.suppressWarnings;\n }\n\n private updateSelectionAndColumns(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.rowSelection != null && options.rowSelection !== resolved.rowSelection) {\n resolved.rowSelection = options.rowSelection;\n if (options.rowSelection === \"none\") this.deselectAll();\n effects.needsHeaderRebuild = true;\n effects.needsPoolRebuild = true;\n this.core.refreshAriaState();\n }\n if (options.quickFilterText !== undefined) this.setQuickFilter(options.quickFilterText);\n if (options.defaultColDef !== undefined && options.defaultColDef !== resolved.defaultColDef) {\n resolved.defaultColDef = { ...DEFAULT_COL_DEF, ...options.defaultColDef };\n effects.needsColumnRebuild = true;\n }\n if (hasOwnOption(options, \"columnTypes\") && options.columnTypes !== resolved.columnTypes) {\n resolved.columnTypes = options.columnTypes ?? {};\n effects.needsColumnRebuild = true;\n }\n if (hasOwnOption(options, \"getRowId\") && options.getRowId !== resolved.getRowId) {\n resolved.getRowId = options.getRowId;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"rowKey\")) {\n resolved.rowKey = options.rowKey;\n if (!hasOwnOption(options, \"getRowId\")) {\n const rowKey = options.rowKey;\n resolved.getRowId = rowKey\n ? ({ data }) => rowIdFromKey(rowKey, data)\n : undefined;\n }\n effects.needsRowRebuild = true;\n }\n }\n\n private updateHierarchyOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.masterDetail != null && options.masterDetail !== resolved.masterDetail) {\n resolved.masterDetail = options.masterDetail;\n effects.needsColumnRebuild = true;\n effects.needsRowRebuild = true;\n }\n if (options.detailToggleColumn != null && options.detailToggleColumn !== resolved.detailToggleColumn) {\n resolved.detailToggleColumn = options.detailToggleColumn;\n effects.needsColumnRebuild = true;\n }\n if (options.treeData != null && options.treeData !== resolved.treeData) {\n resolved.treeData = options.treeData;\n effects.needsRowRebuild = true;\n effects.needsColumnRebuild = true;\n this.core.refreshAriaState();\n }\n if (options.childrenKey != null && options.childrenKey !== resolved.childrenKey) {\n resolved.childrenKey = options.childrenKey;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"isTreeRowExpandable\")) {\n resolved.isTreeRowExpandable = options.isTreeRowExpandable;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"loadTreeChildren\")) {\n resolved.loadTreeChildren = options.loadTreeChildren;\n effects.needsCellRefresh = true;\n }\n }\n\n private updateExtensionOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n let reloadGridState = false;\n if (hasOwnOption(options, \"aggFuncs\")) {\n resolved.aggFuncs = options.aggFuncs;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"components\")) {\n resolved.components = options.components;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"actionPolicy\")) {\n resolved.actionPolicy = options.actionPolicy;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"features\")) {\n resolved.features = Array.isArray(options.features) ? options.features : [];\n this.core.setFeatures(resolved.features);\n }\n if (hasOwnOption(options, \"columnStateStore\")) {\n resolved.columnStateStore = options.columnStateStore;\n effects.needsStateLoad = true;\n }\n if (hasOwnOption(options, \"columnStateKey\")) {\n resolved.columnStateKey = options.columnStateKey ?? null;\n effects.needsStateLoad = true;\n }\n if (hasOwnOption(options, \"stateStore\")) {\n resolved.stateStore = options.stateStore;\n reloadGridState = true;\n }\n if (hasOwnOption(options, \"stateKey\")) {\n resolved.stateKey = options.stateKey ?? null;\n reloadGridState = true;\n }\n const stateDebounce = normalizeFinite(options.stateSaveDebounceMs, 0, true);\n if (stateDebounce !== undefined) resolved.stateSaveDebounceMs = stateDebounce;\n if (reloadGridState) this.core.loadPersistedGridState();\n }\n\n private updateDatasourceOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n const blockSize = normalizeFinite(options.blockSize, 1, true);\n const bufferRows = normalizeFinite(options.infiniteBufferRows, 0, true);\n const retryCount = normalizeFinite(options.datasourceRetryCount, 0, true);\n const retryDelay = normalizeFinite(options.datasourceRetryDelay, 0, true);\n if (blockSize !== undefined) resolved.blockSize = blockSize;\n if (bufferRows !== undefined) resolved.infiniteBufferRows = bufferRows;\n if (retryCount !== undefined) resolved.datasourceRetryCount = retryCount;\n if (retryDelay !== undefined) resolved.datasourceRetryDelay = retryDelay;\n this.updateDatasourceReference(options, effects);\n this.updatePinnedRows(options);\n }\n\n private updateDatasourceReference(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (hasOwnOption(options, \"datasource\") && options.datasource !== resolved.datasource) {\n resolved.datasource = options.datasource;\n resolved.paginationEnabled = options.datasource == null && resolved.paginationEnabled;\n effects.datasourceChanged = true;\n this.core.paginationBar.rebuild();\n }\n if (hasOwnOption(options, \"detailRowRenderer\")) {\n resolved.detailRowRenderer = options.detailRowRenderer;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"isRowExpandable\")) {\n resolved.isRowExpandable = options.isRowExpandable;\n effects.needsCellRefresh = true;\n }\n }\n\n private updatePinnedRows(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (options.pinnedTopRowData !== undefined) {\n resolved.pinnedTopRowData = options.pinnedTopRowData ?? [];\n this.core.pinnedRowsRenderer.setTopData(resolved.pinnedTopRowData);\n }\n if (options.pinnedBottomRowData !== undefined) {\n resolved.pinnedBottomRowData = options.pinnedBottomRowData ?? [];\n this.core.pinnedRowsRenderer.setBottomData(resolved.pinnedBottomRowData);\n }\n }\n\n private applyOptionUpdateEffects(\n options: Partial<GridOptions<TData>>,\n effects: OptionUpdateEffects,\n previousColumnMenu: boolean\n ): void {\n const resolved = this.core.options;\n if (effects.needsColumnRebuild) {\n this.core.columnModel.setColumnDefs(resolved.columnDefs);\n this.core.onColumnsStructureChanged();\n effects.needsHeaderRebuild = false;\n effects.needsPoolRebuild = false;\n }\n if (effects.needsStateLoad) {\n this.core.loadPersistedColumnState();\n this.core.onColumnsStructureChanged();\n }\n this.applyRowUpdateEffect(effects);\n if (effects.filterChanged) {\n this.emitFilterChanged();\n if (!effects.datasourceChanged && !effects.needsRowRebuild) {\n if (this.core.rowModel.isInfinite) void this.core.rowModel.onServerParamsChanged();\n else {\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n }\n if (effects.needsRelayout) {\n this.core.skeleton.updateHeights(resolved.rowHeight, resolved.headerHeight);\n this.core.relayout();\n this.core.relayoutColumns(false);\n }\n if (options.columnMenu != null && options.columnMenu !== previousColumnMenu) {\n effects.needsHeaderRebuild = true;\n }\n if (effects.needsHeaderRebuild) this.core.headerRenderer.build();\n if (effects.needsPoolRebuild) this.core.bodyRenderer.rebuildPool();\n else if (effects.needsCellRefresh) this.refreshCells();\n if (effects.needsSummaryRefresh) this.core.summaryRenderer.refresh();\n if (effects.stateToApply) this.applyState(effects.stateToApply);\n this.core.bodyRenderer.refreshOverlays();\n }\n\n private applyRowUpdateEffect(effects: OptionUpdateEffects): void {\n if (effects.datasourceChanged) {\n void this.core.rowModel.onDatasourceChanged();\n return;\n }\n if (!effects.needsRowRebuild) return;\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n return;\n }\n this.core.rowModel.setRowData(this.core.options.rowData);\n this.core.bodyRenderer.onDataChanged();\n }\n\n getDataAsCsv(params: CsvExportParams = {}): string {\n const cols = this.core.columnModel.getOrderedVisible().filter((c) => !c.hasCheckbox && !c.isDetailToggle);\n if (params.headersOnly) {\n return buildCsv(\n {\n getHeaderLabels: () => cols.map((c) => c.colDef.headerName ?? c.colDef.field ?? c.id),\n getRowValues: () => []\n },\n params\n );\n }\n const nodes = params.onlySelected\n ? this.core.selectionService.getSelectedNodes().slice().sort((a, b) => a.rowIndex - b.rowIndex)\n : params.onlyAllDisplayed\n ? this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup)\n : this.core.rowModel.getPipelineRows().filter((n) => !n.isDetail && !n.isGroup);\n\n return buildCsv({\n getHeaderLabels: () => cols.map((c) => c.colDef.headerName ?? c.colDef.field ?? c.id),\n getRowValues: () =>\n nodes.map((node) =>\n cols.map((c) => {\n const v = this.core.getCellValue(node, c);\n if (typeof v === \"number\") return v;\n return formatCellValue(this.core, node, c);\n })\n )\n }, params);\n }\n\n getState(): GridState {\n return {\n version: 2,\n columns: this.getColumnState(),\n sortModel: this.getSortModel(),\n filterModel: this.getFilterModel(),\n advancedFilterModel: this.getAdvancedFilterModel(),\n quickFilterText: this.getQuickFilter(),\n pagination: {\n enabled: this.paginationEnabled(),\n page: this.getPage(),\n pageSize: this.getPageSize()\n },\n selectedRowIds: this.getSelectedIds(),\n expandedRowIds: this.core.rowModel.getExpandedRowIds(),\n expandedGroupIds: this.core.rowModel.getExpandedGroupIds()\n };\n }\n\n applyState(input: GridStateInput, options: ApplyGridStateOptions = {}): void {\n if (this.core.isDestroyed()) return;\n const state = migrateGridState(input);\n if (!state) return;\n const all: readonly GridStateSection[] = [\"columns\", \"sort\", \"filter\", \"pagination\", \"selection\", \"expansion\"];\n const sections = new Set(options.sections ?? all);\n this.core.editingService.stop(true);\n\n this.restoreStateSections(state, sections);\n this.refreshAfterStateRestore(state, sections);\n if (options.emitEvents !== false) this.emitStateEvents(sections);\n }\n\n private restoreStateSections(state: GridState, sections: ReadonlySet<GridStateSection>): void {\n if (sections.has(\"columns\")) this.core.columnModel.applyColumnState(state.columns ?? []);\n if (sections.has(\"sort\")) this.core.columnModel.applySortModel(state.sortModel ?? []);\n if (sections.has(\"filter\")) {\n this.core.rowModel.setFilterModel(state.filterModel ?? {});\n this.core.rowModel.setAdvancedFilterModel(state.advancedFilterModel);\n this.core.rowModel.setQuickFilter(state.quickFilterText);\n }\n if (sections.has(\"expansion\")) {\n this.core.rowModel.restoreExpansion(state.expandedRowIds ?? [], state.expandedGroupIds ?? []);\n }\n if (sections.has(\"pagination\") && state.pagination) {\n this.core.options.paginationEnabled = state.pagination.enabled && !this.core.rowModel.isInfinite;\n this.core.rowModel.restorePagination(state.pagination.page, state.pagination.pageSize);\n this.core.paginationBar.rebuild();\n }\n }\n\n private refreshAfterStateRestore(state: GridState, sections: ReadonlySet<GridStateSection>): void {\n if (sections.has(\"columns\")) this.core.onColumnsStructureChanged();\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n } else {\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n this.core.headerRenderer.refreshSortIndicators();\n this.core.headerRenderer.refreshFilterIcons();\n if (sections.has(\"selection\")) this.core.selectionService.restoreSelection(state.selectedRowIds ?? []);\n this.core.persistColumnState();\n }\n\n private emitStateEvents(sections: ReadonlySet<GridStateSection>): void {\n if (sections.has(\"sort\")) this.core.emit(\"sortChanged\", { sortModel: this.getSortModel() });\n if (sections.has(\"filter\")) this.emitFilterChanged();\n if (sections.has(\"pagination\")) {\n this.core.emit(\"paginationChanged\", {\n page: this.getPage(),\n pageSize: this.getPageSize(),\n pageCount: this.getPageCount(),\n total: this.getTotalRowCount()\n });\n }\n }\n\n getDiagnostics(): import(\"../types/api\").GridDiagnostics {\n return this.core.getDiagnostics();\n }\n\n getPerformanceSnapshot(): import(\"../types/api\").GridPerformanceSnapshot {\n return this.core.performanceMonitor.snapshot();\n }\n\n resetPerformanceMetrics(): void {\n this.core.performanceMonitor.reset();\n }\n\n setOverlay(type: \"loading\" | \"noRows\" | \"error\" | null): void {\n if (type === \"loading\") {\n this.core.skeleton.showOverlay(\n \"loading\",\n this.core.options.overlayLoadingTemplate,\n this.core.options.allowUnsafeOverlayHtml\n );\n } else if (type === \"noRows\") {\n const content = this.core.options.overlayNoRowsTemplate || this.core.buildDefaultEmptyState();\n this.core.skeleton.showOverlay(\"noRows\", content, this.core.options.allowUnsafeOverlayHtml);\n } else if (type === \"error\") {\n const content = this.core.options.overlayErrorTemplate || this.core.buildDefaultErrorState();\n this.core.skeleton.showOverlay(\"error\", content, this.core.options.allowUnsafeOverlayHtml);\n } else {\n this.core.skeleton.hideOverlay();\n }\n }\n\n hideOverlays(): void {\n this.core.skeleton.hideOverlay();\n }\n\n addEventListener<K extends import(\"../types/events\").GridEventType>(\n eventType: K,\n listener: (event: any) => void\n ): () => void {\n return this.core.eventBus.on(eventType, listener);\n }\n\n removeEventListener<K extends import(\"../types/events\").GridEventType>(\n eventType: K,\n listener: (event: any) => void\n ): void {\n this.core.eventBus.off(eventType, listener);\n }\n\n destroy(): void {\n if (this.asyncTransactionTimer != null) clearTimeout(this.asyncTransactionTimer);\n this.asyncTransactionTimer = null;\n this.asyncTransactions = [];\n const resolvers = this.asyncTransactionResolvers;\n this.asyncTransactionResolvers = [];\n for (const resolve of resolvers) resolve();\n this.core.destroy();\n }\n\n isDestroyed(): boolean {\n return this.core.isDestroyed();\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { GridSize, OverlayTemplate, ResolvedGridOptions, ThemeMode } from \"../types/options\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el } from \"../lib/dom\";\n\nconst SIZE_CLASSES: GridSize[] = [\"compact\", \"normal\", \"large\"];\ntype SkeletonContext = Pick<GridCore<any>, \"options\" | \"relayout\" | \"reportError\">;\n\nexport class GridSkeleton {\n root!: HTMLElement;\n headerEl!: HTMLElement;\n bodyEl!: HTMLElement;\n pinnedTopEl!: HTMLElement;\n pinnedBottomEl!: HTMLElement;\n headerRows: Record<PaneType, HTMLElement[]> = { left: [], center: [], right: [] };\n headerRowContainers: Record<PaneType, HTMLElement> = {} as Record<PaneType, HTMLElement>;\n bodyViewports!: Record<PaneType, HTMLElement>;\n rowContainers!: Record<PaneType, HTMLElement>;\n\n private headerPanes!: Record<PaneType, HTMLElement>;\n private bodyPanes!: Record<PaneType, HTMLElement>;\n private overlayWrapper!: HTMLElement;\n private overlayContent!: HTMLElement;\n private infiniteLoadingEl!: HTMLElement;\n private infiniteLoadingText!: HTMLElement;\n private currentOverlay: \"loading\" | \"noRows\" | \"error\" | null = null;\n private currentOverlayContent: OverlayTemplate | null = null;\n private currentOverlayAllowsHtml = false;\n private overlayCleanup: (() => void) | null = null;\n private customClassTokens: string[] = [];\n private resizeObserver: ResizeObserver | null = null;\n private headerDepth = 1;\n\n constructor(private core: SkeletonContext) {}\n\n init(container: HTMLElement, options: ResolvedGridOptions): void {\n const classes = [\"mach-root\", `mach-size--${options.size}`];\n if (options.stripedRows) classes.push(\"mach-striped\");\n if (options.showCellBorders) classes.push(\"mach-cell-borders\");\n if (options.domLayout === \"autoHeight\") classes.push(\"mach-dom-layout--auto-height\");\n this.root = el(\"div\", classes.join(\" \"));\n this.setCustomClass(options.className);\n this.root.style.setProperty(\"--mach-row-h\", `${options.rowHeight}px`);\n this.root.style.setProperty(\"--mach-header-h\", `${options.headerHeight}px`);\n this.root.setAttribute(\"role\", \"grid\");\n this.root.tabIndex = 0;\n this.applyAriaLabels(options);\n\n this.headerEl = el(\"div\", \"mach-header\");\n this.headerEl.setAttribute(\"role\", \"rowgroup\");\n this.headerRows = { left: [], center: [], right: [] };\n this.headerPanes = {} as Record<PaneType, HTMLElement>;\n this.headerRowContainers = {} as Record<PaneType, HTMLElement>;\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const paneEl = el(\"div\", `mach-pane mach-pane--${pane} mach-header-pane`);\n const rowsContainer = el(\"div\", \"mach-header-rows\");\n if (pane === \"center\") {\n const viewport = el(\"div\", \"mach-header-viewport\");\n viewport.appendChild(rowsContainer);\n paneEl.appendChild(viewport);\n } else {\n paneEl.appendChild(rowsContainer);\n }\n this.headerEl.appendChild(paneEl);\n this.headerPanes[pane] = paneEl;\n this.headerRowContainers[pane] = rowsContainer;\n }\n\n this.setHeaderRowCount(1);\n\n this.bodyEl = el(\"div\", \"mach-body\");\n this.pinnedTopEl = el(\"div\", \"mach-pinned-rows mach-pinned-rows--top\");\n this.pinnedTopEl.style.display = \"none\";\n this.pinnedBottomEl = el(\"div\", \"mach-pinned-rows mach-pinned-rows--bottom\");\n this.pinnedBottomEl.style.display = \"none\";\n this.bodyViewports = {} as Record<PaneType, HTMLElement>;\n this.rowContainers = {} as Record<PaneType, HTMLElement>;\n this.bodyPanes = {} as Record<PaneType, HTMLElement>;\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const paneEl = el(\"div\", `mach-pane mach-pane--${pane} mach-body-pane`);\n const viewport = el(\"div\", `mach-body-viewport${pane === \"center\" ? \" mach-body-viewport--scroll\" : \"\"}`);\n const container = el(\"div\", \"mach-row-container\");\n viewport.appendChild(container);\n paneEl.appendChild(viewport);\n this.bodyEl.appendChild(paneEl);\n this.bodyPanes[pane] = paneEl;\n this.bodyViewports[pane] = viewport;\n this.rowContainers[pane] = container;\n }\n\n this.overlayWrapper = el(\"div\", \"mach-overlay\");\n this.overlayWrapper.style.display = \"none\";\n this.overlayWrapper.setAttribute(\"role\", \"status\");\n this.overlayWrapper.setAttribute(\"aria-live\", \"polite\");\n this.overlayContent = el(\"div\", \"mach-overlay-content\");\n this.overlayWrapper.appendChild(this.overlayContent);\n\n this.infiniteLoadingEl = el(\"div\", \"mach-infinite-loading\");\n this.infiniteLoadingEl.style.display = \"none\";\n this.infiniteLoadingEl.appendChild(el(\"div\", \"mach-spinner\"));\n this.infiniteLoadingText = el(\"span\");\n this.infiniteLoadingEl.appendChild(this.infiniteLoadingText);\n\n this.root.append(\n this.headerEl,\n this.pinnedTopEl,\n this.bodyEl,\n this.pinnedBottomEl,\n this.overlayWrapper,\n this.infiniteLoadingEl\n );\n container.appendChild(this.root);\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.core.relayout());\n this.resizeObserver.observe(this.root);\n }\n\n this.applyTheme(options.theme);\n }\n\n applyAriaLabels(options: Pick<ResolvedGridOptions, \"ariaLabel\" | \"ariaLabelledBy\" | \"ariaDescribedBy\">): void {\n if (options.ariaLabelledBy) {\n this.root.setAttribute(\"aria-labelledby\", options.ariaLabelledBy);\n this.root.removeAttribute(\"aria-label\");\n } else {\n this.root.removeAttribute(\"aria-labelledby\");\n this.root.setAttribute(\"aria-label\", options.ariaLabel);\n }\n if (options.ariaDescribedBy) this.root.setAttribute(\"aria-describedby\", options.ariaDescribedBy);\n else this.root.removeAttribute(\"aria-describedby\");\n }\n\n setHeaderRowCount(depth: number): void {\n this.headerDepth = depth;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const container = this.headerRowContainers[pane];\n const rows = this.headerRows[pane];\n while (rows.length < depth) {\n const row = el(\"div\", \"mach-header-row\");\n row.setAttribute(\"role\", \"row\");\n row.setAttribute(\"aria-rowindex\", String(rows.length + 1));\n row.style.top = `${rows.length * this.core.options.headerHeight}px`;\n row.style.height = `${this.core.options.headerHeight}px`;\n container.appendChild(row);\n rows.push(row);\n }\n while (rows.length > depth) {\n rows.pop()!.remove();\n }\n }\n this.applyHeaderHeight();\n }\n\n getHeaderRowCount(): number {\n return this.headerDepth;\n }\n\n private applyHeaderHeight(): void {\n this.headerEl.style.height = `${this.headerDepth * this.core.options.headerHeight}px`;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.headerRows[pane];\n rows.forEach((row, i) => {\n row.style.top = `${i * this.core.options.headerHeight}px`;\n row.style.height = `${this.core.options.headerHeight}px`;\n });\n }\n }\n\n setPaneWidths(left: number, right: number): void {\n this.applyPaneWidth(\"left\", left);\n this.applyPaneWidth(\"right\", right);\n }\n\n private applyPaneWidth(pane: PaneType, width: number): void {\n const hp = this.headerPanes[pane];\n const bp = this.bodyPanes[pane];\n hp.style.width = `${width}px`;\n bp.style.width = `${width}px`;\n const hidden = width <= 0;\n hp.classList.toggle(\"mach-pane--hidden\", hidden);\n bp.classList.toggle(\"mach-pane--hidden\", hidden);\n }\n\n measureViewportWidth(): number {\n return this.bodyViewports.center.clientWidth;\n }\n\n updateHeights(rowHeight: number, headerHeight: number): void {\n this.root.style.setProperty(\"--mach-row-h\", `${rowHeight}px`);\n this.root.style.setProperty(\"--mach-header-h\", `${headerHeight}px`);\n this.applyHeaderHeight();\n }\n\n applySize(size: GridSize): void {\n for (const s of SIZE_CLASSES) {\n this.root.classList.toggle(`mach-size--${s}`, s === size);\n }\n }\n\n private themeUnsub: (() => void) | null = null;\n\n applyTheme(theme: ThemeMode): void {\n if (!this.root) return;\n this.themeUnsub?.();\n this.themeUnsub = null;\n const dark = theme === \"dark\" || (theme === \"auto\" && this.systemPrefersDark());\n this.root.classList.toggle(\"mach-theme-dark\", dark);\n\n if (theme === \"auto\" && typeof window !== \"undefined\" && typeof window.matchMedia === \"function\") {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handler = () => this.root.classList.toggle(\"mach-theme-dark\", mq.matches);\n if (typeof mq.addEventListener === \"function\") {\n mq.addEventListener(\"change\", handler);\n this.themeUnsub = () => mq.removeEventListener(\"change\", handler);\n } else if (typeof mq.addListener === \"function\") {\n mq.addListener(handler);\n this.themeUnsub = () => mq.removeListener(handler);\n }\n }\n }\n\n private systemPrefersDark(): boolean {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return false;\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n }\n\n setStriped(on: boolean): void {\n this.root.classList.toggle(\"mach-striped\", on);\n }\n\n setCellBorders(on: boolean): void {\n this.root.classList.toggle(\"mach-cell-borders\", on);\n }\n\n applyDomLayout(layout: import(\"../types/options\").DomLayoutMode): void {\n this.root.classList.toggle(\"mach-dom-layout--auto-height\", layout === \"autoHeight\");\n }\n\n setCustomClass(className: string | null | undefined): void {\n for (const token of this.customClassTokens) this.root.classList.remove(token);\n this.customClassTokens = [];\n for (const token of String(className ?? \"\").split(/\\s+/).filter(Boolean)) {\n if (this.root.classList.contains(token)) continue;\n this.root.classList.add(token);\n this.customClassTokens.push(token);\n }\n }\n\n showOverlay(type: \"loading\" | \"noRows\" | \"error\", content: OverlayTemplate, allowUnsafeHtml = false): void {\n if (\n this.currentOverlay === type &&\n this.currentOverlayContent === content &&\n this.currentOverlayAllowsHtml === allowUnsafeHtml\n ) return;\n this.currentOverlay = type;\n this.currentOverlayContent = content;\n this.currentOverlayAllowsHtml = allowUnsafeHtml;\n this.cleanupOverlayContent();\n this.overlayContent.replaceChildren();\n\n let resolved: import(\"../types/options\").OverlayContent;\n try {\n resolved = typeof content === \"function\" ? content() : content;\n } catch (error) {\n this.core.reportError(error, \"overlayTemplate\");\n resolved = \"\";\n }\n\n if (typeof resolved === \"object\" && resolved != null && \"el\" in resolved) {\n this.overlayContent.appendChild(resolved.el);\n this.overlayCleanup = resolved.destroy ?? null;\n } else if (resolved instanceof HTMLElement) {\n this.overlayContent.appendChild(resolved);\n } else if (resolved && allowUnsafeHtml) {\n this.overlayContent.innerHTML = resolved;\n } else if (resolved) {\n this.overlayContent.textContent = resolved;\n } else if (type === \"loading\") {\n const spinner = el(\"div\", \"mach-spinner\");\n spinner.setAttribute(\"aria-label\", \"loading\");\n this.overlayContent.appendChild(spinner);\n }\n this.overlayWrapper.style.display = \"\";\n this.applyOverlayRole(type);\n this.root.setAttribute(\"aria-busy\", type === \"loading\" ? \"true\" : \"false\");\n }\n\n hideOverlay(): void {\n if (!this.currentOverlay) return;\n this.currentOverlay = null;\n this.currentOverlayContent = null;\n this.currentOverlayAllowsHtml = false;\n this.overlayWrapper.style.display = \"none\";\n this.cleanupOverlayContent();\n this.overlayContent.replaceChildren();\n this.root.setAttribute(\"aria-busy\", \"false\");\n }\n\n private applyOverlayRole(type: \"loading\" | \"noRows\" | \"error\"): void {\n this.overlayWrapper.setAttribute(\"role\", type === \"error\" ? \"alert\" : \"status\");\n }\n\n setInfiniteLoading(active: boolean, text: string): void {\n if (!this.infiniteLoadingEl) return;\n if (active) {\n if (this.infiniteLoadingText.textContent !== text) this.infiniteLoadingText.textContent = text;\n this.infiniteLoadingEl.style.display = \"\";\n this.root.setAttribute(\"aria-busy\", \"true\");\n } else {\n this.infiniteLoadingEl.style.display = \"none\";\n if (this.currentOverlay !== \"loading\") this.root.setAttribute(\"aria-busy\", \"false\");\n }\n }\n\n destroy(): void {\n this.themeUnsub?.();\n this.themeUnsub = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.cleanupOverlayContent();\n this.root.remove();\n }\n\n private cleanupOverlayContent(): void {\n if (!this.overlayCleanup) return;\n const cleanup = this.overlayCleanup;\n this.overlayCleanup = null;\n try {\n cleanup();\n } catch (error) {\n this.core.reportError(error, \"overlayTemplate.destroy\");\n }\n }\n\n}\n","import type { ColumnFilter } from \"../types/colDef\";\n\nconst MATCH_LABELS: Record<string, string> = {\n contains: \"包含\",\n notContains: \"不包含\",\n equals: \"=\",\n notEquals: \"≠\",\n startsWith: \"开头\",\n endsWith: \"结尾\",\n blank: \"为空\",\n notBlank: \"非空\",\n lessThan: \"<\",\n lessThanOrEqual: \"≤\",\n greaterThan: \">\",\n greaterThanOrEqual: \"≥\",\n inRange: \"范围\"\n};\n\nexport function describeFilter(filter: ColumnFilter): string {\n if (!filter) return \"\";\n if (filter.type === \"set\") {\n const count = filter.values.length;\n return `已选 ${count} 项`;\n }\n const parts: string[] = [];\n for (const condition of filter.conditions) {\n const label = MATCH_LABELS[condition.match] ?? condition.match;\n const value = condition.value;\n const value2 = \"value2\" in condition ? condition.value2 : undefined;\n if (condition.match === \"blank\" || condition.match === \"notBlank\") {\n parts.push(label);\n } else if (condition.match === \"inRange\" && value != null) {\n parts.push(`${label} ${value}~${value2 ?? value}`);\n } else if (value != null && String(value) !== \"\") {\n parts.push(`${label} ${value}`);\n } else {\n parts.push(label);\n }\n }\n const operator = filter.operator === \"or\" ? \" 或 \" : \" 且 \";\n return parts.join(operator);\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"../services/column\";\nimport { ColumnGroup } from \"../services/columnGroup\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el, FILTER_ICON, SORT_ASC_ICON, SORT_DESC_ICON } from \"../lib/dom\";\nimport { describeFilter } from \"../lib/filterSummary\";\nimport { setHeaderDestroyer, takeHeaderDestroyer } from \"./runtimeState\";\n\ntype HeaderContext = Pick<\n GridCore<any>,\n | \"columnDragService\"\n | \"columnMenu\"\n | \"columnModel\"\n | \"commitColumnWidths\"\n | \"cycleSort\"\n | \"emit\"\n | \"filterPopup\"\n | \"getApi\"\n | \"isDestroyed\"\n | \"moveColumn\"\n | \"options\"\n | \"relayoutColumns\"\n | \"reportError\"\n | \"resizeService\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n>;\n\ninterface HeaderCell {\n column: Column;\n el: HTMLElement;\n sortEl: HTMLElement;\n filterBtn?: HTMLButtonElement;\n filterTagEl?: HTMLElement;\n selectAllEl?: HTMLInputElement;\n}\n\ninterface GroupCell {\n group: ColumnGroup<any>;\n el: HTMLElement;\n}\n\ninterface PaneTree {\n column?: Column;\n group?: ColumnGroup<any>;\n level: number;\n children: PaneTree[];\n}\n\nexport class HeaderRenderer {\n private leafCells: HeaderCell[] = [];\n private groupCells: GroupCell[] = [];\n private paneTrees: Record<PaneType, PaneTree[]> = { left: [], center: [], right: [] };\n\n constructor(private core: HeaderContext) {}\n\n build(): void {\n this.core.resizeService.cancelResize();\n for (const cell of this.leafCells) {\n const destroy = takeHeaderDestroyer(cell.el);\n if (destroy) {\n try {\n destroy();\n } catch (error) {\n this.core.reportError(error, \"headerComponent.destroy\", { colId: cell.column.id });\n }\n }\n }\n this.leafCells = [];\n this.groupCells = [];\n const depth = this.core.columnModel.getHeaderDepth();\n this.core.skeleton.setHeaderRowCount(depth);\n\n const paneOf = (col: Column): PaneType =>\n col.pinned === \"left\" ? \"left\" : col.pinned === \"right\" ? \"right\" : \"center\";\n\n const buildTree = (\n children: (ColumnGroup<any> | Column<any>)[],\n level: number,\n pane: PaneType\n ): PaneTree[] => {\n const out: PaneTree[] = [];\n for (const child of children) {\n if (child instanceof ColumnGroup) {\n const subtree = buildTree(child.children, level + 1, pane);\n if (subtree.length > 0) out.push({ group: child, level, children: subtree });\n } else {\n if (!child.hide && paneOf(child) === pane) {\n out.push({ column: child, level, children: [] });\n }\n }\n }\n return out;\n };\n\n const roots = this.core.columnModel.getRootChildren();\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n this.paneTrees[pane] = buildTree(roots, 0, pane);\n }\n\n const perRowHeight = this.core.options.headerHeight;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.core.skeleton.headerRows[pane];\n for (const row of rows) row.textContent = \"\";\n const appendCell = (tree: PaneTree) => {\n const row = rows[Math.min(tree.level, rows.length - 1)];\n if (tree.column) {\n const cell = this.createLeafCell(tree.column, depth - tree.level, perRowHeight);\n row.appendChild(cell.el);\n this.leafCells.push(cell);\n } else if (tree.group) {\n const cell = this.createGroupCell(tree.group);\n row.appendChild(cell);\n this.groupCells.push({ group: tree.group, el: cell });\n }\n for (const child of tree.children) appendCell(child);\n };\n for (const tree of this.paneTrees[pane]) appendCell(tree);\n }\n\n if (!this.core.options.suppressHeaderFocus) {\n this.leafCells.forEach((cell, index) => {\n cell.el.tabIndex = index === 0 ? 0 : -1;\n });\n }\n\n this.applyLayout();\n this.refreshSortIndicators();\n this.refreshFilterIcons();\n this.refreshSelectAllCheckbox();\n }\n\n private createLeafCell(column: Column, rowSpan: number, perRowHeight: number): HeaderCell {\n const colDef = column.colDef;\n const cellEl = el(\"div\", \"mach-header-cell mach-header-cell--leaf\");\n cellEl.dataset.colId = column.id;\n cellEl.setAttribute(\"role\", \"columnheader\");\n cellEl.style.height = `${rowSpan * perRowHeight}px`;\n\n if (typeof colDef.headerClass === \"string\") cellEl.classList.add(colDef.headerClass);\n else if (Array.isArray(colDef.headerClass)) cellEl.classList.add(...colDef.headerClass);\n if (colDef.headerTooltip) cellEl.setAttribute(\"title\", colDef.headerTooltip);\n\n const headerAlign = colDef.headerAlign ?? colDef.align;\n if (headerAlign === \"center\") cellEl.classList.add(\"mach-header-cell--center\");\n else if (headerAlign === \"right\") cellEl.classList.add(\"mach-header-cell--right\");\n\n if (!this.core.options.suppressHeaderFocus) {\n cellEl.tabIndex = -1;\n cellEl.addEventListener(\"mousedown\", () => this.focusHeaderCell(column));\n cellEl.addEventListener(\"keydown\", (e: KeyboardEvent) => this.onHeaderKeyDown(e, column));\n }\n\n let selectAllEl: HTMLInputElement | undefined;\n if (column.hasCheckbox && this.core.options.rowSelection === \"multiple\") {\n selectAllEl = document.createElement(\"input\");\n selectAllEl.type = \"checkbox\";\n selectAllEl.className = \"mach-select-all\";\n selectAllEl.setAttribute(\"aria-label\", \"select all rows\");\n selectAllEl.addEventListener(\"click\", (e) => e.stopPropagation());\n selectAllEl.addEventListener(\"change\", () => {\n if (selectAllEl!.checked) this.core.selectionService.selectAll(true);\n else this.core.selectionService.deselectAll();\n });\n cellEl.appendChild(selectAllEl);\n }\n\n const headerComponent = colDef.headerComponent;\n if (headerComponent) {\n let out: string | HTMLElement | { el: HTMLElement; destroy?: () => void } | null | undefined;\n try {\n out = headerComponent({ colDef, column, api: this.core.getApi() });\n } catch (err) {\n this.core.reportError(err, \"headerComponent\", { colId: column.id });\n out = null;\n }\n if (typeof out === \"string\") {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = out;\n cellEl.appendChild(labelEl);\n } else if (out instanceof HTMLElement) {\n const wrapper = el(\"span\", \"mach-header-label mach-header-label--custom\");\n wrapper.appendChild(out);\n cellEl.appendChild(wrapper);\n } else if (out && typeof out === \"object\" && out.el instanceof HTMLElement) {\n const wrapper = el(\"span\", \"mach-header-label mach-header-label--custom\");\n wrapper.appendChild(out.el);\n cellEl.appendChild(wrapper);\n setHeaderDestroyer(cellEl, out.destroy);\n } else {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = colDef.headerName ?? colDef.field ?? column.id;\n cellEl.appendChild(labelEl);\n }\n } else {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = colDef.headerName ?? colDef.field ?? column.id;\n cellEl.appendChild(labelEl);\n }\n\n const sortEl = el(\"span\", \"mach-sort-indicator\");\n cellEl.appendChild(sortEl);\n\n let filterBtn: HTMLButtonElement | undefined;\n let filterTagEl: HTMLElement | undefined;\n if (column.filterable) {\n filterBtn = document.createElement(\"button\");\n filterBtn.type = \"button\";\n filterBtn.className = \"mach-filter-btn\";\n filterBtn.setAttribute(\"aria-label\", `filter ${column.id}`);\n filterBtn.innerHTML = FILTER_ICON;\n filterBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.core.filterPopup.toggle(column, filterBtn!);\n });\n cellEl.appendChild(filterBtn);\n filterTagEl = el(\"span\", \"mach-filter-tag\");\n cellEl.appendChild(filterTagEl);\n }\n\n if (this.core.options.columnMenu) {\n const menuBtn = document.createElement(\"button\");\n menuBtn.type = \"button\";\n menuBtn.className = \"mach-menu-btn\";\n menuBtn.setAttribute(\"aria-label\", \"column menu\");\n menuBtn.textContent = \"⋯\";\n menuBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.core.columnMenu.toggle(column, menuBtn);\n });\n cellEl.appendChild(menuBtn);\n }\n\n if (this.canResizeColumn(column)) {\n const resizeEl = el(\"div\", \"mach-header-resize\");\n resizeEl.setAttribute(\"aria-hidden\", \"true\");\n resizeEl.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n this.core.resizeService.startResize(e, column);\n });\n resizeEl.addEventListener(\"dblclick\", (e) => {\n e.stopPropagation();\n this.core.getApi().autoSizeColumn(column.id);\n });\n resizeEl.addEventListener(\"click\", (e) => e.stopPropagation());\n cellEl.appendChild(resizeEl);\n }\n\n cellEl.addEventListener(\"click\", (e) => {\n if (this.core.columnDragService.didDrag()) return;\n const target = e.target as HTMLElement;\n if (target.closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n if (column.sortable) this.core.cycleSort(column, e.shiftKey);\n });\n\n cellEl.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (target.closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n this.core.columnDragService.onPointerDown(e, column);\n });\n\n return { column, el: cellEl, sortEl, filterBtn, filterTagEl, selectAllEl };\n }\n\n private createGroupCell(group: ColumnGroup<any>): HTMLElement {\n const cellEl = el(\"div\", \"mach-header-cell mach-header-cell--group\");\n if (group.groupId) cellEl.dataset.groupId = group.groupId;\n cellEl.setAttribute(\"role\", \"columnheader\");\n const def = group.def;\n if (typeof def.headerClass === \"string\") cellEl.classList.add(def.headerClass);\n else if (Array.isArray(def.headerClass)) cellEl.classList.add(...def.headerClass);\n const labelEl = el(\"span\", \"mach-header-label mach-header-label--group\");\n labelEl.textContent = group.headerName;\n cellEl.appendChild(labelEl);\n return cellEl;\n }\n\n applyLayout(): void {\n let flatIndex = 1;\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.core.skeleton.headerRows[pane];\n let x = 0;\n const leafLefts = new Map<string, number>();\n for (const cell of this.leafCells) {\n if (this.core.columnModel.paneOf(cell.column) !== pane) continue;\n leafLefts.set(cell.column.id, x);\n x += cell.column.currentWidth;\n }\n const perRowHeight = this.core.options.headerHeight;\n for (const cell of this.leafCells) {\n if (this.core.columnModel.paneOf(cell.column) !== pane) continue;\n const left = leafLefts.get(cell.column.id) ?? 0;\n cell.el.style.width = `${cell.column.currentWidth}px`;\n cell.el.style.left = `${left}px`;\n cell.el.setAttribute(\"aria-colindex\", String(flatIndex++));\n }\n\n for (const gc of this.groupCells) {\n const leaves = this.visiblePaneLeaves(gc.group, pane);\n if (leaves.length === 0) continue;\n const left = leafLefts.get(leaves[0].id) ?? 0;\n let width = 0;\n for (const leaf of leaves) width += leaf.currentWidth;\n gc.el.style.left = `${left}px`;\n gc.el.style.width = `${width}px`;\n gc.el.style.height = `${perRowHeight}px`;\n gc.el.setAttribute(\"aria-colspan\", String(leaves.length));\n }\n\n for (const row of rows) row.style.width = `${x}px`;\n widths[pane] = x;\n }\n this.core.skeleton.setPaneWidths(widths.left, widths.right);\n }\n\n private visiblePaneLeaves(group: ColumnGroup<any>, pane: PaneType): Column[] {\n return group\n .getLeafColumns()\n .filter((c) => !c.hide && this.core.columnModel.paneOf(c) === pane);\n }\n\n private onHeaderKeyDown(e: KeyboardEvent, column: Column): void {\n if (this.core.isDestroyed()) return;\n const resize = (delta: number): void => {\n const next = Math.max(\n column.colDef.minWidth ?? 40,\n column.currentWidth + delta\n );\n this.core.columnModel.setColumnWidth(column, next);\n this.core.relayoutColumns();\n this.core.commitColumnWidths([column]);\n e.preventDefault();\n };\n\n switch (true) {\n case e.key === \"Enter\" || e.key === \" \":\n if ((e.target as HTMLElement).closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n e.preventDefault();\n if (column.sortable) this.core.cycleSort(column, e.shiftKey);\n return;\n case e.altKey && (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\"):\n if (!this.canResizeColumn(column)) return;\n resize(e.key === \"ArrowRight\" ? 24 : -24);\n return;\n case e.ctrlKey && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\"):\n if (!column.movable) return;\n e.preventDefault(); {\n const pane = this.core.columnModel.paneOf(column);\n const siblings = this.core.columnModel.getPaneColumns(pane);\n const from = siblings.indexOf(column);\n const to = e.key === \"ArrowRight\" ? Math.min(siblings.length - 1, from + 1) : Math.max(0, from - 1);\n if (to !== from) this.core.moveColumn(column.id, to);\n }\n return;\n case !e.altKey && !e.ctrlKey && !e.metaKey && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\"):\n e.preventDefault(); {\n const current = this.leafCells.findIndex((cell) => cell.column.id === column.id);\n const next = e.key === \"ArrowRight\"\n ? Math.min(this.leafCells.length - 1, current + 1)\n : Math.max(0, current - 1);\n if (current >= 0) this.focusHeaderCell(this.leafCells[next].column);\n }\n return;\n case e.key === \"Home\" || e.key === \"End\":\n e.preventDefault();\n if (this.leafCells.length > 0) {\n this.focusHeaderCell(e.key === \"Home\" ? this.leafCells[0].column : this.leafCells[this.leafCells.length - 1].column);\n }\n return;\n }\n }\n\n private focusHeaderCell(column: Column): void {\n const target = this.leafCells.find((cell) => cell.column.id === column.id);\n if (!target) return;\n for (const cell of this.leafCells) cell.el.tabIndex = cell === target ? 0 : -1;\n target.el.focus({ preventScroll: true });\n }\n\n private canResizeColumn(column: Column): boolean {\n return this.core.options.enableColumnResize && column.resizable;\n }\n\n refreshSortIndicators(): void {\n const model = this.core.columnModel.getSortModel();\n const multi = model.length > 1;\n for (const hc of this.leafCells) {\n const idx = model.findIndex((s) => s.colId === hc.column.id);\n if (idx >= 0) {\n const dir = model[idx].direction;\n const badge = multi ? `<span class=\"mach-sort-badge\">${idx + 1}</span>` : \"\";\n hc.sortEl.innerHTML = (dir === \"asc\" ? SORT_ASC_ICON : SORT_DESC_ICON) + badge;\n hc.el.setAttribute(\"aria-sort\", dir === \"asc\" ? \"ascending\" : \"descending\");\n hc.el.classList.add(\"mach-header-cell--sorted\");\n } else {\n hc.sortEl.innerHTML = \"\";\n hc.el.removeAttribute(\"aria-sort\");\n hc.el.classList.remove(\"mach-header-cell--sorted\");\n }\n }\n }\n\n refreshFilterIcons(): void {\n const fm = this.core.rowModel.getFilterModel();\n for (const hc of this.leafCells) {\n if (!hc.filterBtn) continue;\n const filter = fm[hc.column.id];\n const active = filter != null;\n hc.filterBtn.classList.toggle(\"mach-filter-btn--active\", active);\n if (hc.filterTagEl) {\n const summary = active ? describeFilter(filter) : \"\";\n hc.filterTagEl.style.display = summary ? \"\" : \"none\";\n if (summary) hc.filterTagEl.textContent = summary;\n }\n }\n }\n\n refreshSelectAllCheckbox(): void {\n for (const hc of this.leafCells) {\n if (!hc.selectAllEl) continue;\n hc.selectAllEl.checked = this.core.selectionService.isSelectAllActive();\n hc.selectAllEl.indeterminate = this.core.selectionService.isSelectAllIndeterminate();\n }\n }\n\n destroy(): void {\n for (const cell of this.leafCells) {\n const destroy = takeHeaderDestroyer(cell.el);\n if (!destroy) continue;\n try {\n destroy();\n } catch (error) {\n console.error(\"[mach-table] headerComponent destroy error\", error);\n }\n }\n this.leafCells = [];\n this.groupCells = [];\n }\n}\n","export interface GridPoint {\n row: number;\n colIdx: number;\n}\n\nexport interface NormalizedRange {\n r1: number;\n c1: number;\n r2: number;\n c2: number;\n}\n\n/** Pure state model for range selection; DOM painting stays in BodyRenderer. */\nexport class RangeSelectionModel {\n private anchor: GridPoint | null = null;\n private end: GridPoint | null = null;\n private cache: NormalizedRange | null | false = false;\n private cacheRowCount = -1;\n private cacheColCount = -1;\n\n getAnchor(): GridPoint | null {\n return this.anchor;\n }\n\n getEnd(): GridPoint | null {\n return this.end;\n }\n\n hasAnchor(): boolean {\n return this.anchor != null;\n }\n\n start(point: GridPoint, extend: boolean): void {\n if (!extend || !this.anchor) this.anchor = { ...point };\n this.end = { ...point };\n this.invalidate();\n }\n\n ensureAnchor(point: GridPoint): boolean {\n if (this.anchor) return true;\n if (point.colIdx < 0) return false;\n this.anchor = { ...point };\n this.invalidate();\n return true;\n }\n\n setEnd(point: GridPoint): void {\n this.end = { ...point };\n this.invalidate();\n }\n\n clear(): void {\n this.anchor = null;\n this.end = null;\n this.invalidate();\n }\n\n invalidate(): void {\n this.cache = false;\n this.cacheRowCount = -1;\n this.cacheColCount = -1;\n }\n\n normalize(rowCount: number, colCount: number): NormalizedRange | null {\n if (\n this.cache !== false &&\n this.cacheRowCount === rowCount &&\n this.cacheColCount === colCount\n ) return this.cache;\n this.cacheRowCount = rowCount;\n this.cacheColCount = colCount;\n if (!this.anchor || !this.end || rowCount <= 0 || colCount <= 0) {\n this.cache = null;\n return null;\n }\n this.cache = {\n r1: Math.max(0, Math.min(this.anchor.row, this.end.row, rowCount - 1)),\n r2: Math.max(0, Math.min(Math.max(this.anchor.row, this.end.row), rowCount - 1)),\n c1: Math.max(0, Math.min(this.anchor.colIdx, this.end.colIdx, colCount - 1)),\n c2: Math.max(0, Math.min(Math.max(this.anchor.colIdx, this.end.colIdx), colCount - 1))\n };\n return this.cache;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport type { RowNode } from \"../types/row\";\n\ntype RowDragContext = Pick<GridCore<any>, \"emit\" | \"options\" | \"rowModel\" | \"skeleton\">;\n\ninterface RowDragState {\n node: RowNode<any>;\n startY: number;\n indicator: HTMLElement;\n targetIndex: number;\n active: boolean;\n}\n\n/** Owns row-drag global listeners, indicator DOM and completion semantics. */\nexport class RowDragController {\n private state: RowDragState | null = null;\n\n constructor(\n private core: RowDragContext,\n private getPositions: () => Float64Array\n ) {}\n\n start(event: PointerEvent, node: RowNode<any>): void {\n this.destroy();\n const indicator = el(\"div\", \"mach-row-drop-indicator\");\n this.core.skeleton.rowContainers.center.appendChild(indicator);\n this.state = {\n node,\n startY: event.clientY,\n indicator,\n targetIndex: -1,\n active: false\n };\n window.addEventListener(\"pointermove\", this.onMove);\n window.addEventListener(\"pointerup\", this.onUp);\n window.addEventListener(\"pointercancel\", this.onUp);\n }\n\n private onMove = (event: PointerEvent): void => {\n const drag = this.state;\n if (!drag) return;\n if (!drag.active) {\n if (Math.abs(event.clientY - drag.startY) < 5) return;\n drag.active = true;\n this.core.skeleton.root.classList.add(\"mach-root--row-dragging\");\n }\n\n const container = this.core.skeleton.rowContainers.center;\n const y = event.clientY - container.getBoundingClientRect().top;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const positions = this.getPositions();\n let targetIndex = rowCount;\n let indicatorY = positions[rowCount] ?? 0;\n for (let index = 0; index < rowCount; index++) {\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node || node.isDetail || node.isGroup) continue;\n const top = positions[index];\n const bottom = positions[index + 1];\n if (y < top + (bottom - top) / 2) {\n targetIndex = index;\n indicatorY = top;\n break;\n }\n }\n drag.targetIndex = targetIndex;\n drag.indicator.style.top = `${indicatorY}px`;\n };\n\n private onUp = (): void => {\n const drag = this.takeState();\n if (!drag || !drag.active || drag.targetIndex < 0) return;\n const from = drag.node.rowIndex;\n const to = Math.max(0, Math.min(drag.targetIndex, this.core.rowModel.getDisplayedRowCount()));\n if (from === to || from === to - 1) return;\n this.core.emit(\"rowDragEnd\", { rowNode: drag.node, fromIndex: from, toIndex: to });\n if (this.core.options.applyRowDrag && !this.core.rowModel.isTree) {\n this.core.rowModel.reorderRowsByDisplayed(from, to > from ? to - 1 : to);\n }\n };\n\n private takeState(): RowDragState | null {\n const drag = this.state;\n this.state = null;\n this.detachListeners();\n drag?.indicator.remove();\n return drag;\n }\n\n private detachListeners(): void {\n window.removeEventListener(\"pointermove\", this.onMove);\n window.removeEventListener(\"pointerup\", this.onUp);\n window.removeEventListener(\"pointercancel\", this.onUp);\n this.core.skeleton.root.classList.remove(\"mach-root--row-dragging\");\n }\n\n destroy(): void {\n this.takeState();\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport type { Column } from \"../services/column\";\nimport { hasColumnType } from \"../core/resolveOptions\";\nimport type { RowNode } from \"../types/row\";\nimport { RangeSelectionModel, type NormalizedRange } from \"../services/rangeSelectionModel\";\nimport { RowDragController } from \"../services/rowDragController\";\nimport { el, clamp } from \"../lib/dom\";\nimport { renderCellContent, cleanupCellContent, applyCellClasses, applyCellStyle, formatCellValue, formatCellValueWith, defaultFormat } from \"./cellContent\";\nimport {\n getCellRuntimeState,\n setDetailDestroyer,\n takeDetailDestroyer\n} from \"./runtimeState\";\n\nconst PANES: PaneType[] = [\"left\", \"center\", \"right\"];\ntype BodyContext = Pick<\n GridCore<any>,\n | \"buildDefaultEmptyState\"\n | \"buildDefaultErrorState\"\n | \"columnModel\"\n | \"contextMenuService\"\n | \"editingService\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"gridId\"\n | \"isDestroyed\"\n | \"options\"\n | \"performanceMonitor\"\n | \"pinnedRowsRenderer\"\n | \"reportError\"\n | \"resolveCellRenderer\"\n | \"rowModel\"\n | \"selectionService\"\n | \"setCellValue\"\n | \"skeleton\"\n | \"summaryRenderer\"\n | \"toggleDetail\"\n | \"tooltipService\"\n | \"undoService\"\n>;\n\ninterface RowSlot {\n index: number;\n nodeId: string;\n kind: \"master\" | \"detail\";\n rows: Partial<Record<PaneType, HTMLElement>>;\n cells: Partial<Record<PaneType, HTMLElement[]>>;\n cellColIds: Partial<Record<PaneType, string[]>>;\n detailRow?: HTMLElement;\n}\n\ntype CellRenderKind = \"standard\" | \"group\" | \"detail\" | \"checkbox\" | \"drag\" | \"index\" | \"tree\";\n\nexport interface FocusedCell {\n rowIndex: number;\n colId: string;\n}\n\nfunction lowerBound(positions: Float64Array, y: number, count: number): number {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (positions[mid + 1] <= y) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nexport class BodyRenderer {\n private pool: RowSlot[] = [];\n private poolSize = 0;\n private first = 0;\n private lastExcl = -1;\n private rafId = 0;\n private hoverIndex = -1;\n private positions = new Float64Array(1);\n private rangeSelection = new RangeSelectionModel();\n private rangeDragging = false;\n private colFirst = 0;\n private colLastExcl = Number.MAX_SAFE_INTEGER;\n focusedCell: FocusedCell | null = null;\n private rowDragController: RowDragController;\n\n constructor(private core: BodyContext) {\n this.rowDragController = new RowDragController(core, () => this.positions);\n }\n\n init(): void {\n const viewport = this.core.skeleton.bodyViewports.center;\n viewport.addEventListener(\"scroll\", this.onScroll, { passive: true });\n const body = this.core.skeleton.bodyEl;\n body.addEventListener(\"click\", this.onBodyClick);\n body.addEventListener(\"dblclick\", this.onBodyDblClick);\n body.addEventListener(\"contextmenu\", this.onContextMenu);\n body.addEventListener(\"mousedown\", this.onMouseDown);\n body.addEventListener(\"mouseover\", this.onMouseOver);\n body.addEventListener(\"mouseleave\", this.onMouseLeave);\n body.addEventListener(\"pointerdown\", this.onDragHandlePointerDown);\n window.addEventListener(\"mouseup\", this.onWindowMouseUp);\n }\n\n destroy(): void {\n cancelAnimationFrame(this.rafId);\n const viewport = this.core.skeleton.bodyViewports.center;\n viewport.removeEventListener(\"scroll\", this.onScroll);\n const body = this.core.skeleton.bodyEl;\n body.removeEventListener(\"click\", this.onBodyClick);\n body.removeEventListener(\"dblclick\", this.onBodyDblClick);\n body.removeEventListener(\"contextmenu\", this.onContextMenu);\n body.removeEventListener(\"mousedown\", this.onMouseDown);\n body.removeEventListener(\"mouseover\", this.onMouseOver);\n body.removeEventListener(\"mouseleave\", this.onMouseLeave);\n body.removeEventListener(\"pointerdown\", this.onDragHandlePointerDown);\n window.removeEventListener(\"mouseup\", this.onWindowMouseUp);\n this.cancelFillDrag();\n this.rowDragController.destroy();\n for (const slot of this.pool) {\n if (slot.detailRow) this.cleanupDetail(slot.detailRow);\n for (const pane of PANES) {\n for (const cell of slot.cells[pane] ?? []) {\n if (slot.index >= 0) this.core.editingService.releaseCell(slot.index, cell.dataset.colId ?? \"\", cell);\n cleanupCellContent(this.core, cell);\n }\n }\n }\n this.fillHandleEl?.remove();\n this.fillDragIndicator?.remove();\n }\n\n paneForColumn(column: Column): PaneType {\n return column.pinned === \"left\" ? \"left\" : column.pinned === \"right\" ? \"right\" : \"center\";\n }\n\n private onScroll = (): void => {\n if (this.rafId) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = 0;\n this.syncScroll();\n });\n };\n\n syncScroll(): void {\n if (this.core.isDestroyed()) return;\n const sk = this.core.skeleton;\n const viewport = sk.bodyViewports.center;\n sk.headerRowContainers.center.style.transform = `translateX(${-viewport.scrollLeft}px)`;\n sk.rowContainers.left.style.transform = `translateY(${-viewport.scrollTop}px)`;\n sk.rowContainers.right.style.transform = `translateY(${-viewport.scrollTop}px)`;\n this.core.pinnedRowsRenderer.onScrollLeft(viewport.scrollLeft);\n this.core.tooltipService.hide();\n this.updateRange();\n this.core.rowModel.checkInfiniteScroll(this.lastExcl - 1);\n }\n\n private paneWidths(): Record<PaneType, number> {\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n for (const pane of PANES) {\n widths[pane] = this.core.columnModel.getPaneColumns(pane).reduce((a, c) => a + c.currentWidth, 0);\n }\n return widths;\n }\n\n private positionsBuf = new Float64Array(new ArrayBuffer(64 * 8));\n private lastMinRowHeight = 0;\n private rowHeightCache = new WeakMap<RowNode<any>, number>();\n private pendingFlash: Array<[number, string]> = [];\n private measureCanvas: HTMLCanvasElement | null = null;\n\n applyContainerSizes(): void {\n const sk = this.core.skeleton;\n const widths = this.paneWidths();\n const viewport = sk.bodyViewports.center;\n const displayed = this.core.rowModel.getDisplayedRows();\n const rowCount = this.core.rowModel.getDisplayTotalCount();\n const positionedCount = Math.min(rowCount, displayed.length);\n const rowHeight = this.core.options.rowHeight;\n const detailHeight = this.core.options.detailRowHeight;\n const getRowHeight = this.core.options.getRowHeight;\n const api = this.core.getApi();\n\n if (this.positionsBuf.length < positionedCount + 1) {\n let cap = this.positionsBuf.length;\n while (cap < positionedCount + 1) cap *= 2;\n this.positionsBuf = new Float64Array(new ArrayBuffer(cap * 8));\n }\n const positions = this.positionsBuf;\n const autoHeightCols = this.core.options.masterDetail ? [] : this.collectAutoHeightColumns();\n let y = 0;\n let minH = rowHeight;\n for (let i = 0; i < positionedCount; i++) {\n positions[i] = y;\n const node = i < displayed.length ? displayed[i] : undefined;\n let h: number;\n if (node?.isDetail) {\n h = detailHeight;\n } else if (node && (getRowHeight || autoHeightCols.length > 0)) {\n const cached = this.rowHeightCache.get(node);\n if (cached !== undefined) {\n h = cached;\n } else {\n h = rowHeight;\n if (getRowHeight) {\n try {\n const requested = getRowHeight({ data: node.data, node, api });\n h = Number.isFinite(requested) ? Math.max(1, requested || rowHeight) : rowHeight;\n } catch (error) {\n this.core.reportError(error, \"getRowHeight\", { rowId: node.id });\n }\n }\n if (autoHeightCols.length > 0) {\n const measured = this.measureAutoHeight(node, autoHeightCols);\n if (measured > h) h = measured;\n }\n this.rowHeightCache.set(node, h);\n }\n if (h < minH) minH = h;\n } else {\n h = rowHeight;\n }\n y += h;\n }\n positions[positionedCount] = y;\n const totalHeight = y + Math.max(0, rowCount - positionedCount) * rowHeight;\n this.lastMinRowHeight = minH;\n this.positions = positions.subarray(0, positionedCount + 1);\n\n const centerAvailable = Math.max(0, viewport.clientWidth - widths.left - widths.right);\n const centerWidth = Math.max(widths.center, centerAvailable);\n\n for (const pane of PANES) {\n const container = sk.rowContainers[pane];\n container.style.height = `${totalHeight}px`;\n if (pane === \"center\") container.style.width = `${centerWidth}px`;\n }\n this.applyDomLayoutHeight(totalHeight);\n\n sk.root.setAttribute(\"aria-rowcount\", String(rowCount + sk.getHeaderRowCount()));\n }\n\n invalidateRowHeight(node: RowNode<any>): void {\n this.rowHeightCache.delete(node);\n }\n\n private applyDomLayoutHeight(totalHeight: number): void {\n this.core.skeleton.bodyEl.style.height = this.core.options.domLayout === \"autoHeight\" ? `${totalHeight}px` : \"\";\n }\n\n invalidateAllRowHeights(): void {\n this.rowHeightCache = new WeakMap();\n }\n\n private collectAutoHeightColumns(): Column[] {\n return this.core.columnModel.getOrderedVisible().filter((c) => c.colDef.autoHeight === true);\n }\n\n private get hasAnyAutoHeight(): boolean {\n return this.core.columnModel.getOrderedVisible().some((c) => c.colDef.autoHeight === true);\n }\n\n private measureAutoHeight(node: RowNode<any>, cols: Column[]): number {\n this.measureCanvas ??= document.createElement(\"canvas\");\n const ctx = this.measureCanvas.getContext(\"2d\");\n if (!ctx) return 0;\n const style = window.getComputedStyle(this.core.skeleton.root);\n const fontSize = parseFloat(style.fontSize) || 13;\n ctx.font = `${style.fontStyle} ${style.fontWeight} ${fontSize}px ${style.fontFamily}`;\n const padding = parseFloat(style.getPropertyValue(\"--mach-cell-padding\")) || 9;\n const lineHeight = Math.round(fontSize * 1.45);\n let maxLines = 1;\n\n for (const col of cols) {\n const text = formatCellValue(this.core, node, col);\n if (!text) continue;\n const availW = Math.max(10, col.currentWidth - padding * 2 - 2);\n let lines = 1;\n let w = 0;\n for (const ch of text) {\n const cw = ctx.measureText(ch).width;\n if (w > 0 && w + cw > availW) {\n lines++;\n w = cw;\n } else {\n w += cw;\n }\n if (lines >= 12) break;\n }\n if (lines > maxLines) maxLines = lines;\n }\n return maxLines * lineHeight + Math.round(padding * 0.9);\n }\n\n queueFlash(rowIndexes: number[], colIds: string[]): void {\n if (!this.core.options.flashCells) return;\n for (const rowIndex of rowIndexes) {\n for (const colId of colIds) this.pendingFlash.push([rowIndex, colId]);\n }\n }\n\n flushFlash(): void {\n if (this.pendingFlash.length === 0) return;\n const entries = this.pendingFlash;\n this.pendingFlash = [];\n for (const [rowIndex, colId] of entries) {\n const cell = this.getCellElement(rowIndex, colId);\n if (!cell) continue;\n cell.classList.remove(\"mach-cell--flash\");\n void cell.offsetWidth;\n cell.classList.add(\"mach-cell--flash\");\n const runtime = getCellRuntimeState(cell);\n const timer = runtime.flashTimer;\n if (timer) clearTimeout(timer);\n runtime.flashTimer = setTimeout(() => {\n cell.classList.remove(\"mach-cell--flash\");\n runtime.flashTimer = undefined;\n }, 800);\n }\n }\n\n relayout(): void {\n this.applyContainerSizes();\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowHeight = this.core.options.rowHeight;\n let minRowHeight = rowHeight;\n if (this.core.options.masterDetail) {\n minRowHeight = Math.min(minRowHeight, this.core.options.detailRowHeight);\n }\n if (this.lastMinRowHeight > 0) {\n minRowHeight = Math.min(minRowHeight, this.lastMinRowHeight);\n }\n const visible = Math.ceil(viewport.clientHeight / Math.max(1, minRowHeight));\n const needed = this.core.options.domLayout === \"autoHeight\"\n ? this.core.rowModel.getDisplayedRowCount()\n : visible + this.core.options.rowBuffer * 2 + 1;\n const colWindowChanged = this.computeColWindow();\n if (colWindowChanged) {\n for (const slot of this.pool) this.reconcilePaneCells(slot, \"center\");\n }\n if (needed > this.poolSize) this.growPool(needed);\n this.applyCellLayout();\n this.updateRange(true);\n this.refreshOverlays();\n }\n\n private growPool(needed: number): void {\n while (this.poolSize < needed) {\n const slot: RowSlot = { index: -1, nodeId: \"\", kind: \"master\", rows: {}, cells: {}, cellColIds: {} };\n const sk = this.core.skeleton;\n for (const pane of PANES) {\n const cols = this.core.columnModel.getPaneColumns(pane);\n if (cols.length === 0) continue;\n const row = el(\"div\", \"mach-row\");\n row.style.height = `${this.core.options.rowHeight}px`;\n row.setAttribute(\"role\", \"row\");\n row.style.display = \"none\";\n sk.rowContainers[pane].appendChild(row);\n slot.rows[pane] = row;\n slot.cells[pane] = [];\n slot.cellColIds[pane] = [];\n this.reconcilePaneCells(slot, pane);\n }\n if (this.core.options.masterDetail) {\n const detailRow = el(\"div\", \"mach-row mach-detail-row\");\n detailRow.style.height = `${this.core.options.detailRowHeight}px`;\n detailRow.setAttribute(\"role\", \"row\");\n detailRow.style.display = \"none\";\n sk.rowContainers.center.appendChild(detailRow);\n slot.detailRow = detailRow;\n }\n this.pool.push(slot);\n this.poolSize++;\n }\n }\n\n private activePaneColumns(pane: PaneType): Column[] {\n const cols = this.core.columnModel.getPaneColumns(pane);\n if (pane !== \"center\" || cols.length <= 20 || this.core.columnModel.hasColSpan()) return cols;\n return cols.slice(this.colFirst, this.colLastExcl);\n }\n\n private createCell(column: Column): HTMLElement {\n const cell = el(\"div\", \"mach-cell\");\n cell.dataset.colId = column.id;\n cell.setAttribute(\"role\", \"gridcell\");\n if (column.hasCheckbox) {\n const input = document.createElement(\"input\");\n input.type = this.core.options.rowSelection === \"single\" ? \"radio\" : \"checkbox\";\n input.className = \"mach-row-checkbox\";\n if (input.type === \"radio\") input.name = `mach-radio-${this.core.gridId}`;\n input.setAttribute(\"aria-label\", \"select row\");\n cell.appendChild(input);\n cell.classList.add(\"mach-cell--selection\");\n }\n return cell;\n }\n\n private reconcilePaneCells(slot: RowSlot, pane: PaneType): void {\n const row = slot.rows[pane];\n if (!row) return;\n const columns = this.activePaneColumns(pane);\n const existingCells = slot.cells[pane] ?? [];\n const existingIds = slot.cellColIds[pane] ?? [];\n if (existingIds.length === columns.length && existingIds.every((id, index) => id === columns[index].id)) return;\n\n const byId = new Map<string, HTMLElement>();\n existingIds.forEach((id, index) => byId.set(id, existingCells[index]));\n const nextCells: HTMLElement[] = [];\n const nextIds: string[] = [];\n for (const column of columns) {\n const cell = byId.get(column.id) ?? this.createCell(column);\n byId.delete(column.id);\n row.appendChild(cell);\n nextCells.push(cell);\n nextIds.push(column.id);\n }\n for (const cell of byId.values()) {\n if (slot.index >= 0) this.core.editingService.releaseCell(slot.index, cell.dataset.colId ?? \"\", cell);\n cleanupCellContent(this.core, cell);\n cell.remove();\n }\n slot.cells[pane] = nextCells;\n slot.cellColIds[pane] = nextIds;\n }\n\n rebuildPool(): void {\n this.treeColumnCache = undefined;\n this.invalidateRangeCache();\n for (const slot of this.pool) {\n if (slot.detailRow) this.cleanupDetail(slot.detailRow);\n for (const pane of PANES) {\n for (const cell of slot.cells[pane] ?? []) cleanupCellContent(this.core, cell);\n slot.rows[pane]?.remove();\n }\n slot.detailRow?.remove();\n }\n this.pool = [];\n this.poolSize = 0;\n this.first = 0;\n this.lastExcl = -1;\n this.relayout();\n }\n\n applyCellLayout(): void {\n const variableHeights =\n this.core.options.masterDetail ||\n this.core.options.getRowHeight != null ||\n this.hasAnyAutoHeight;\n for (const pane of PANES) {\n const allPaneCols = this.core.columnModel.getPaneColumns(pane);\n const cols = this.activePaneColumns(pane);\n let x = 0;\n const lefts: number[] = [];\n if (pane === \"center\" && cols.length > 0) {\n const first = allPaneCols.indexOf(cols[0]);\n for (let i = 0; i < first; i++) x += allPaneCols[i].currentWidth;\n }\n for (const col of cols) {\n lefts.push(x);\n x += col.currentWidth;\n }\n for (const slot of this.pool) {\n const cells = slot.cells[pane];\n const row = slot.rows[pane];\n if (!cells || !row) continue;\n if (!variableHeights) {\n row.style.height = `${this.core.options.rowHeight}px`;\n }\n for (let i = 0; i < cols.length && i < cells.length; i++) {\n cells[i].style.width = `${cols[i].currentWidth}px`;\n cells[i].style.left = `${lefts[i]}px`;\n cells[i].setAttribute(\"aria-colindex\", String(this.core.columnModel.getFlatIndex(cols[i].id) + 1));\n }\n }\n if (this.core.options.masterDetail) {\n for (const slot of this.pool) {\n slot.detailRow?.style.setProperty(\"--mach-detail-h\", `${this.core.options.detailRowHeight}px`);\n }\n }\n }\n }\n\n private computeColWindow(): boolean {\n const viewport = this.core.skeleton.bodyViewports.center;\n const cols = this.core.columnModel.getPaneColumns(\"center\");\n const prevFirst = this.colFirst;\n const prevLast = this.colLastExcl;\n let first = 0;\n let last = cols.length;\n\n if (cols.length > 20) {\n const width = viewport.clientWidth;\n let total = 0;\n for (const col of cols) total += col.currentWidth;\n if (width > 0 && total > width) {\n const scrollLeft = viewport.scrollLeft;\n let x = 0;\n for (let i = 0; i < cols.length; i++) {\n if (x + cols[i].currentWidth <= scrollLeft) first = i + 1;\n else break;\n x += cols[i].currentWidth;\n }\n let acc = x;\n for (let i = first; i < cols.length; i++) {\n acc += cols[i].currentWidth;\n if (acc >= scrollLeft + width) {\n last = i + 1;\n break;\n }\n }\n if (last > cols.length) last = cols.length;\n first = Math.max(0, first - 2);\n last = Math.min(cols.length, last + 2);\n }\n }\n\n this.colFirst = first;\n this.colLastExcl = last;\n return first !== prevFirst || last !== prevLast;\n }\n\n updateRange(force = false): void {\n const startedAt = this.core.performanceMonitor.start();\n if (!this.updateRangeInner(force)) return;\n const rows = Math.max(0, this.lastExcl - this.first);\n const columns = this.core.columnModel.getPaneColumns(\"left\").length +\n this.activePaneColumns(\"center\").length +\n this.core.columnModel.getPaneColumns(\"right\").length;\n this.core.performanceMonitor.recordRender(startedAt, rows, columns);\n }\n\n private updateRangeInner(force: boolean): boolean {\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const buffer = this.core.options.rowBuffer;\n const colWindowChanged = this.computeColWindow();\n this.reconcileColumnWindow(colWindowChanged);\n\n if (rowCount === 0) {\n for (const slot of this.pool) this.hideSlot(slot);\n this.first = 0;\n this.lastExcl = 0;\n return true;\n }\n\n if (this.renderAutoHeightRange(rowCount, force)) return true;\n\n const { first, lastExcl } = this.calculateVisibleRange(viewport, rowCount, buffer);\n\n if (!force && first === this.first && lastExcl === this.lastExcl) return colWindowChanged;\n this.first = first;\n this.lastExcl = lastExcl;\n this.hideOutsideRange(first, lastExcl);\n this.renderVirtualRange(first, lastExcl, force, colWindowChanged);\n return true;\n }\n\n private calculateVisibleRange(\n viewport: HTMLElement,\n rowCount: number,\n buffer: number\n ): { first: number; lastExcl: number } {\n const firstVisible = lowerBound(this.positions, viewport.scrollTop, rowCount);\n const viewBottom = viewport.scrollTop + viewport.clientHeight;\n const lastVisible = Math.min(rowCount, lowerBound(this.positions, viewBottom, rowCount) + 1);\n return {\n first: clamp(firstVisible - buffer, 0, rowCount - 1),\n lastExcl: clamp(lastVisible + buffer, 1, rowCount)\n };\n }\n\n private hideOutsideRange(first: number, lastExcl: number): void {\n for (const slot of this.pool) {\n if (slot.index !== -1 && (slot.index < first || slot.index >= lastExcl)) this.hideSlot(slot);\n }\n }\n\n private renderVirtualRange(first: number, lastExcl: number, force: boolean, columnsChanged: boolean): void {\n for (let i = first; i < lastExcl; i++) {\n const node = this.core.rowModel.getDisplayedRow(i);\n const slot = this.pool[i % this.poolSize];\n if (!slot || !node) continue;\n if (!force && slot.index === i && slot.nodeId === node.id) {\n if (columnsChanged && slot.kind === \"master\") this.renderPaneCells(slot, node, \"center\");\n continue;\n }\n this.assignSlot(slot, i);\n }\n }\n\n private reconcileColumnWindow(changed: boolean): void {\n if (!changed) return;\n for (const slot of this.pool) this.reconcilePaneCells(slot, \"center\");\n this.applyCellLayout();\n }\n\n private renderAutoHeightRange(rowCount: number, force: boolean): boolean {\n if (this.core.options.domLayout !== \"autoHeight\") return false;\n if (!force && this.first === 0 && this.lastExcl === rowCount) return true;\n this.first = 0;\n this.lastExcl = rowCount;\n for (let index = 0; index < rowCount; index++) {\n const node = this.core.rowModel.getDisplayedRow(index);\n const slot = this.pool[index];\n if (!slot || !node) continue;\n if (force || slot.index !== index || slot.nodeId !== node.id) this.assignSlot(slot, index);\n }\n return true;\n }\n\n private hideSlot(slot: RowSlot): void {\n this.releaseSlotEditors(slot);\n if (this.focusedCell?.rowIndex === slot.index) {\n this.core.skeleton.root.removeAttribute(\"aria-activedescendant\");\n }\n slot.index = -1;\n slot.nodeId = \"\";\n slot.kind = \"master\";\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (row) row.style.display = \"none\";\n }\n if (slot.detailRow) {\n this.cleanupDetail(slot.detailRow);\n slot.detailRow.style.display = \"none\";\n }\n }\n\n private assignSlot(slot: RowSlot, index: number): void {\n if (slot.index >= 0 && slot.index !== index) this.releaseSlotEditors(slot);\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) {\n this.hideSlot(slot);\n return;\n }\n slot.index = index;\n slot.nodeId = node.id;\n const y = this.positions[index];\n const h = this.positions[index + 1] - this.positions[index];\n\n if (node.isDetail) {\n slot.kind = \"detail\";\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (row) row.style.display = \"none\";\n }\n const detailRow = slot.detailRow;\n if (detailRow) {\n detailRow.style.display = \"\";\n detailRow.style.transform = `translateY(${y}px)`;\n detailRow.style.height = `${h}px`;\n detailRow.dataset.index = String(index);\n detailRow.setAttribute(\"aria-rowindex\", String(index + this.core.skeleton.getHeaderRowCount() + 1));\n this.renderDetailContent(detailRow, node);\n }\n return;\n }\n\n slot.kind = \"master\";\n if (slot.detailRow) slot.detailRow.style.display = \"none\";\n\n const isTreeRow = this.core.rowModel.isTree;\n const isGroupRow = node.isGroup === true;\n const hasTreeChildren = isTreeRow && this.core.rowModel.hasChildren(node.id);\n const isExpandable = isGroupRow || hasTreeChildren ||\n (this.core.options.masterDetail && this.core.rowModel.isRowExpandable(node));\n const expanded = isGroupRow\n ? this.core.rowModel.isGroupExpanded(node.id)\n : this.core.rowModel.isRowExpanded(node.id);\n const level = isGroupRow\n ? (node.groupLevel ?? 0) + 1\n : isTreeRow\n ? this.core.rowModel.getTreeDepth(node) + 1\n : null;\n\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (!row) continue;\n row.style.display = \"\";\n row.style.transform = `translateY(${y}px)`;\n row.style.height = `${h}px`;\n row.dataset.index = String(index);\n row.dataset.id = node.id;\n row.setAttribute(\"aria-rowindex\", String(index + this.core.skeleton.getHeaderRowCount() + 1));\n row.classList.toggle(\"mach-row--selected\", node.selected);\n row.classList.toggle(\"mach-row--hover\", this.hoverIndex === index && !this.core.options.suppressRowHoverHighlight);\n row.classList.toggle(\"mach-row--odd\", index % 2 === 1);\n row.setAttribute(\"aria-selected\", node.selected ? \"true\" : \"false\");\n if (isExpandable) row.setAttribute(\"aria-expanded\", expanded ? \"true\" : \"false\");\n else row.removeAttribute(\"aria-expanded\");\n if (level != null) row.setAttribute(\"aria-level\", String(level));\n else row.removeAttribute(\"aria-level\");\n\n this.renderPaneCells(slot, node, pane);\n }\n\n if (this.focusedCell && this.focusedCell.rowIndex === index) {\n this.applyFocusClass();\n }\n }\n\n private renderPaneCells(slot: RowSlot, node: RowNode<any>, pane: PaneType): void {\n const cols = this.activePaneColumns(pane);\n const cells = slot.cells[pane];\n if (!cells) return;\n const index = slot.index;\n const hasColSpan = pane === \"center\" && this.core.columnModel.hasColSpan();\n let coverage = 0;\n slot.rows[pane]?.classList.toggle(\"mach-row--editing\", this.core.editingService.isRowEditing(index));\n\n for (let i = 0; i < cols.length; i++) {\n const col = cols[i];\n const cell = cells[i];\n\n if (hasColSpan && coverage > 0) {\n coverage--;\n cleanupCellContent(this.core, cell);\n cell.setAttribute(\"aria-hidden\", \"true\");\n if (cell.style.display !== \"none\") cell.style.display = \"none\";\n continue;\n }\n\n if (cell.style.display === \"none\") cell.style.display = \"\";\n cell.removeAttribute(\"aria-hidden\");\n\n if (hasColSpan) {\n const span = this.resolveColSpan(node, col, index, cols.length - i);\n if (span > 1) {\n coverage = span - 1;\n this.applySpanWidth(cell, cols, i, span);\n } else {\n cell.removeAttribute(\"aria-colspan\");\n if (cell.style.width !== `${col.currentWidth}px`) cell.style.width = `${col.currentWidth}px`;\n }\n } else {\n cell.removeAttribute(\"aria-colspan\");\n }\n\n if (this.core.editingService.renderEditor(index, node, col, cell)) continue;\n this.renderCell(cell, node, col);\n this.applyRangeClass(cell, index, col);\n }\n }\n\n private resolveColSpan(node: RowNode<any>, column: Column, rowIndex: number, remaining: number): number {\n const fn = column.colDef.colSpan;\n if (!fn) return 1;\n try {\n const span = fn({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex\n });\n return Math.max(1, Math.min(Math.round(span) || 1, remaining));\n } catch (error) {\n this.core.reportError(error, \"colSpan\", { colId: column.id, rowId: node.id });\n return 1;\n }\n }\n\n private applySpanWidth(cell: HTMLElement, cols: Column[], start: number, span: number): void {\n let w = 0;\n for (let i = start; i < start + span && i < cols.length; i++) w += cols[i].currentWidth;\n cell.style.width = `${w}px`;\n cell.setAttribute(\"aria-colspan\", String(span));\n }\n\n private renderDetailContent(row: HTMLElement, node: RowNode<any>): void {\n this.cleanupDetail(row);\n const master = node.masterId != null ? this.core.rowModel.getNodeById(node.masterId) : node;\n const container = el(\"div\", \"mach-detail\");\n row.appendChild(container);\n const renderer = this.core.options.detailRowRenderer;\n if (renderer) {\n const params = { data: node.data, node: master ?? node, api: this.core.getApi() };\n let out: string | HTMLElement | { el: HTMLElement; destroy?: () => void } | null | undefined;\n try {\n out = renderer(params);\n } catch (err) {\n this.core.reportError(err, \"detailRowRenderer\", { rowId: node.id });\n out = null;\n }\n if (typeof out === \"string\") {\n container.textContent = out;\n } else if (out instanceof HTMLElement) {\n container.appendChild(out);\n } else if (out && typeof out === \"object\" && out.el instanceof HTMLElement) {\n container.appendChild(out.el);\n setDetailDestroyer(row, out.destroy);\n }\n }\n }\n\n private cleanupDetail(row: HTMLElement): void {\n const destroy = takeDetailDestroyer(row);\n if (destroy) {\n try {\n destroy();\n } catch (err) {\n this.core.reportError(err, \"detailRowRenderer.destroy\");\n }\n }\n row.textContent = \"\";\n }\n\n private renderCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n cell.setAttribute(\"aria-readonly\", this.core.editingService.isEditable(node, column) ? \"false\" : \"true\");\n cell.removeAttribute(\"aria-expanded\");\n cell.removeAttribute(\"aria-level\");\n const kind = this.cellRenderKind(node, column);\n if (kind !== \"standard\") {\n cleanupCellContent(this.core, cell);\n this.renderStructuralCell(kind, cell, node, column);\n return;\n }\n renderCellContent(this.core, cell, node, column);\n applyCellClasses(this.core, cell, node, column);\n applyCellStyle(this.core, cell, node, column);\n this.applyCellSpanStyle(cell, node, column);\n this.appendEditableIndicator(cell, node, column);\n }\n\n private cellRenderKind(node: RowNode<any>, column: Column): CellRenderKind {\n if (node.isGroup) return \"group\";\n if (column.isDetailToggle) return \"detail\";\n if (column.hasCheckbox) return \"checkbox\";\n if (column.colDef.rowDrag) return \"drag\";\n if (hasColumnType(column.colDef, \"index\")) return \"index\";\n if (this.core.rowModel.isTree && this.getTreeColumn()?.id === column.id) return \"tree\";\n return \"standard\";\n }\n\n private renderStructuralCell(\n kind: Exclude<CellRenderKind, \"standard\">,\n cell: HTMLElement,\n node: RowNode<any>,\n column: Column\n ): void {\n if (kind === \"group\") {\n this.renderGroupCell(cell, node, column);\n } else if (kind === \"detail\") {\n const expanded = this.core.rowModel.isRowExpanded(node.id);\n const toggle = el(\"span\", `mach-detail-toggle${expanded ? \" mach-detail-toggle--open\" : \"\"}`);\n toggle.textContent = \"▶\";\n cell.replaceChildren(toggle);\n cell.classList.add(\"mach-cell--detail-toggle\");\n this.resetSpanStyle(cell);\n } else if (kind === \"checkbox\") {\n const input = cell.querySelector<HTMLInputElement>(\".mach-row-checkbox\");\n if (input) {\n input.checked = node.selected;\n input.indeterminate = this.core.selectionService.isIndeterminate(node.id);\n input.disabled = !this.core.selectionService.isSelectable(node);\n }\n if (cell.className !== \"mach-cell mach-cell--selection\") cell.className = \"mach-cell mach-cell--selection\";\n this.resetSpanStyle(cell);\n } else if (kind === \"drag\") {\n const handle = el(\"span\", \"mach-row-drag-handle\");\n handle.textContent = \"⠿\";\n cell.replaceChildren(handle);\n if (cell.className !== \"mach-cell mach-cell--drag\") cell.className = \"mach-cell mach-cell--drag\";\n this.resetSpanStyle(cell);\n } else if (kind === \"index\") {\n cell.textContent = String(this.core.rowModel.getRowSeq(node) + this.core.options.indexOffset);\n if (cell.className !== \"mach-cell mach-cell--index\") cell.className = \"mach-cell mach-cell--index\";\n this.applyCellSpanStyle(cell, node, column);\n } else {\n this.renderTreeCell(cell, node, column);\n }\n }\n\n private appendEditableIndicator(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n if (\n this.core.options.editType !== \"cell\" ||\n this.core.options.editableIndicator === \"none\" ||\n !this.core.editingService.isEditable(node, column)\n ) return;\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = `mach-cell-edit-trigger mach-cell-edit-trigger--${this.core.options.editableIndicator}`;\n button.tabIndex = -1;\n button.title = \"Edit cell\";\n button.setAttribute(\"aria-label\", \"Edit cell\");\n button.innerHTML = '<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m10.8 2.7 2.5 2.5L5.5 13H3v-2.5z\"/><path d=\"m9.5 4 2.5 2.5\"/></svg>';\n button.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n });\n button.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.setFocusedCell(node.rowIndex, column.id);\n this.core.editingService.start(node.rowIndex, column);\n });\n cell.appendChild(button);\n }\n\n private releaseSlotEditors(slot: RowSlot): void {\n if (slot.index < 0) return;\n for (const pane of PANES) {\n for (const cell of slot.cells[pane] ?? []) {\n this.core.editingService.releaseCell(slot.index, cell.dataset.colId ?? \"\", cell);\n }\n }\n }\n\n private treeColumnCache: Column | null | undefined;\n\n private getTreeColumn(): Column | null {\n if (this.treeColumnCache !== undefined) return this.treeColumnCache;\n this.treeColumnCache =\n this.core.columnModel.getOrderedVisible().find(\n (c) => !c.hasCheckbox && !c.isDetailToggle && !c.colDef.rowDrag && !hasColumnType(c.colDef, \"index\")\n ) ?? null;\n return this.treeColumnCache;\n }\n\n private renderTreeCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const expandable = this.core.rowModel.isRowExpandable(node);\n const depth = this.getNodeDepth(node);\n const indent = el(\"span\", \"mach-tree-indent\");\n indent.style.width = `${depth * 16}px`;\n const wrap = el(\"span\", \"mach-tree-cell\");\n wrap.appendChild(indent);\n if (expandable) {\n const expanded = this.core.rowModel.isRowExpanded(node.id);\n cell.setAttribute(\"aria-expanded\", expanded ? \"true\" : \"false\");\n cell.setAttribute(\"aria-level\", String(depth + 1));\n const stateClass = node.treeLoading\n ? \" mach-detail-toggle--loading\"\n : node.treeLoadError\n ? \" mach-detail-toggle--error\"\n : \"\";\n const toggle = el(\"span\", `mach-detail-toggle${expanded ? \" mach-detail-toggle--open\" : \"\"}${stateClass}`);\n if (node.treeLoadError) toggle.title = \"Retry loading children\";\n toggle.textContent = \"▶\";\n wrap.appendChild(toggle);\n } else {\n const spacer = el(\"span\", \"mach-tree-toggle-spacer\");\n wrap.appendChild(spacer);\n }\n const text = el(\"span\", \"mach-tree-text\");\n text.textContent = formatCellValueWith(this.core, node, column, this.core.getCellValue(node, column));\n wrap.appendChild(text);\n cell.replaceChildren(wrap);\n applyCellClasses(this.core, cell, node, column);\n }\n\n private getNodeDepth(node: RowNode<any>): number {\n return this.core.rowModel.getTreeDepth(node);\n }\n\n private resetSpanStyle(cell: HTMLElement): void {\n if (cell.style.height !== \"\") cell.style.height = \"\";\n if (cell.style.zIndex !== \"\") cell.style.zIndex = \"\";\n if (cell.style.display === \"none\") cell.style.display = \"\";\n cell.removeAttribute(\"aria-rowspan\");\n }\n\n private applyCellSpanStyle(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const spans = this.core.rowModel.getSpanInfo(column.id);\n if (!spans || node.isDetail) {\n this.resetSpanStyle(cell);\n return;\n }\n const idx = this.core.rowModel.getRowSeq(node) - 1;\n if (idx < 0 || idx >= spans.length) {\n this.resetSpanStyle(cell);\n return;\n }\n const value = spans[idx];\n if (value === -1) {\n cell.style.display = \"none\";\n cell.setAttribute(\"aria-hidden\", \"true\");\n return;\n }\n if (cell.style.display === \"none\") cell.style.display = \"\";\n cell.removeAttribute(\"aria-hidden\");\n if (value > 1) {\n const end = Math.min(idx + value, this.positions.length - 1);\n const height = this.positions[end] - this.positions[idx];\n cell.style.height = `${height > 0 ? height : value * this.core.options.rowHeight}px`;\n cell.style.zIndex = \"1\";\n cell.setAttribute(\"aria-rowspan\", String(value));\n } else {\n this.resetSpanStyle(cell);\n }\n }\n\n private renderGroupCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const base = \"mach-cell\";\n if (column.hasCheckbox) {\n const input = cell.querySelector<HTMLInputElement>(\".mach-row-checkbox\");\n if (input) {\n const state = this.core.selectionService.getGroupSelectionState(node);\n input.checked = state.all;\n input.indeterminate = state.some && !state.all;\n }\n if (cell.className !== `${base} mach-cell--selection`) cell.className = `${base} mach-cell--selection`;\n return;\n }\n if (column.isDetailToggle) {\n cell.textContent = \"\";\n if (cell.className !== base) cell.className = base;\n return;\n }\n const labelCol = this.core.columnModel.getGroupLabelColumn();\n if (labelCol && column.id === labelCol.id) {\n cell.setAttribute(\"aria-expanded\", this.core.rowModel.isGroupExpanded(node.id) ? \"true\" : \"false\");\n cell.setAttribute(\"aria-level\", String((node.groupLevel ?? 0) + 1));\n const wrap = el(\"span\", \"mach-group-label\");\n wrap.style.paddingLeft = `${(node.groupLevel ?? 0) * 16}px`;\n const toggle = el(\"span\", `mach-detail-toggle${this.core.rowModel.isGroupExpanded(node.id) ? \" mach-detail-toggle--open\" : \"\"}`);\n toggle.textContent = \"▶\";\n const text = el(\"span\", \"mach-group-text\");\n const groupCol = this.core.columnModel.getRowGroupColumns()[node.groupLevel ?? 0];\n const prefix = groupCol?.colDef.headerName ? `${groupCol.colDef.headerName}: ` : \"\";\n text.textContent = `${prefix}${node.groupKey ?? \"\"}`;\n const count = el(\"span\", \"mach-group-count\");\n count.textContent = `(${node.leafNodes?.length ?? 0})`;\n wrap.append(toggle, text, count);\n cell.replaceChildren(wrap);\n if (cell.className !== `${base} mach-cell--group`) cell.className = `${base} mach-cell--group`;\n return;\n }\n if (column.colDef.aggFunc && node.aggValues && Object.prototype.hasOwnProperty.call(node.aggValues, column.id)) {\n const value = node.aggValues[column.id];\n const formatted =\n column.colDef.valueFormatter != null\n ? formatCellValueWith(this.core, node, column, value)\n : defaultFormat(value);\n cell.textContent = formatted;\n if (cell.className !== `${base} mach-cell--num`) cell.className = `${base} mach-cell--num`;\n return;\n }\n cell.textContent = \"\";\n if (cell.className !== base) cell.className = base;\n }\n\n refreshRows(indexes: number[]): void {\n if (this.core.isDestroyed()) return;\n const seen = new Set<number>();\n for (const index of indexes) {\n if (index < 0 || seen.has(index)) continue;\n seen.add(index);\n const slot = this.pool[index % this.poolSize];\n if (!slot || slot.index !== index) continue;\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) continue;\n if (slot.kind === \"detail\") {\n if (slot.detailRow) this.renderDetailContent(slot.detailRow, node);\n continue;\n }\n for (const pane of PANES) {\n const cells = slot.cells[pane];\n if (!cells) continue;\n this.renderPaneCells(slot, node, pane);\n }\n }\n this.applyFocusClass();\n this.flushFlash();\n }\n\n refreshAllCells(): void {\n if (this.core.isDestroyed()) return;\n for (const slot of this.pool) {\n if (slot.index < 0) continue;\n const node = this.core.rowModel.getDisplayedRow(slot.index);\n if (!node) continue;\n if (slot.kind === \"detail\") {\n if (slot.detailRow) this.renderDetailContent(slot.detailRow, node);\n continue;\n }\n for (const pane of PANES) {\n const cells = slot.cells[pane];\n if (!cells) continue;\n this.renderPaneCells(slot, node, pane);\n }\n }\n this.applyFocusClass();\n this.flushFlash();\n }\n\n onDataChanged(): void {\n if (this.core.isDestroyed()) return;\n if (this.focusedCell && this.focusedCell.rowIndex >= this.core.rowModel.getDisplayedRowCount()) {\n this.setFocusedCell(null, null);\n }\n this.invalidateRangeCache();\n this.applyContainerSizes();\n this.updateRange(true);\n this.updateFillHandle();\n this.refreshOverlays();\n this.core.summaryRenderer.refresh();\n }\n\n refreshOverlays(): void {\n const options = this.core.options;\n if (options.loading) {\n this.core.skeleton.showOverlay(\"loading\", options.overlayLoadingTemplate, options.allowUnsafeOverlayHtml);\n return;\n }\n if (options.error != null) {\n const template = options.overlayErrorTemplate || this.core.buildDefaultErrorState();\n this.core.skeleton.showOverlay(\"error\", template, options.allowUnsafeOverlayHtml);\n return;\n }\n if (this.core.rowModel.getDisplayedRowCount() === 0 && !options.suppressNoRowsOverlay) {\n const template = options.overlayNoRowsTemplate || this.core.buildDefaultEmptyState();\n this.core.skeleton.showOverlay(\"noRows\", template, options.allowUnsafeOverlayHtml);\n return;\n }\n this.core.skeleton.hideOverlay();\n }\n\n getCellElement(rowIndex: number, colId: string): HTMLElement | null {\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return null;\n const pane = this.paneForColumn(column);\n const colIdx = this.pool[rowIndex % Math.max(1, this.poolSize)]?.cellColIds[pane]?.indexOf(column.id) ?? -1;\n if (colIdx < 0) return null;\n const slot = this.pool[rowIndex % this.poolSize];\n if (!slot || slot.index !== rowIndex || slot.kind !== \"master\") return null;\n return slot.cells[pane]?.[colIdx] ?? null;\n }\n\n private invalidateRangeCache(): void {\n this.rangeSelection.invalidate();\n }\n\n normalizedRange(): NormalizedRange | null {\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const colCount = this.core.columnModel.getOrderedVisible().length;\n return this.rangeSelection.normalize(rowCount, colCount);\n }\n\n getNormalizedRangeOrFocus(): NormalizedRange | null {\n const range = this.normalizedRange();\n if (range) return range;\n const focus = this.focusedCell;\n if (focus) {\n const ci = this.core.columnModel.getFlatIndex(focus.colId);\n if (ci >= 0) return { r1: focus.rowIndex, c1: ci, r2: focus.rowIndex, c2: ci };\n }\n return null;\n }\n\n getRangeSelection(): { row1: number; row2: number; colId1: string; colId2: string } | null {\n const range = this.normalizedRange();\n if (!range) return null;\n const flat = this.core.columnModel.getOrderedVisible();\n return {\n row1: range.r1,\n row2: range.r2,\n colId1: flat[range.c1]?.id ?? \"\",\n colId2: flat[range.c2]?.id ?? \"\"\n };\n }\n\n getPasteStart(): { row: number; colIdx: number } | null {\n const anchor = this.rangeSelection.getAnchor();\n if (anchor) {\n return { row: anchor.row, colIdx: anchor.colIdx };\n }\n const focus = this.getNormalizedRangeOrFocus();\n return focus ? { row: focus.r1, colIdx: focus.c1 } : null;\n }\n\n clearRangeSelection(): void {\n const old = this.normalizedRange();\n this.rangeSelection.clear();\n if (old) {\n this.refreshRowRange(old, null);\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: null });\n }\n }\n\n private refreshRowRange(\n a: { r1: number; r2: number } | null,\n b: { r1: number; r2: number } | null\n ): void {\n const indexes: number[] = [];\n const collect = (r: { r1: number; r2: number } | null) => {\n if (!r) return;\n for (let i = r.r1; i <= r.r2; i++) indexes.push(i);\n };\n collect(a);\n collect(b);\n if (indexes.length > 0) this.refreshRows(indexes);\n }\n\n startRange(row: number, colIdx: number, extend: boolean): void {\n const old = this.normalizedRange();\n this.rangeSelection.start({ row, colIdx }, extend);\n const next = this.normalizedRange();\n this.refreshRowRange(old, next);\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n\n moveRangeEnd(row: number, colIdx: number): void {\n if (!this.rangeSelection.hasAnchor()) {\n const focus = this.focusedCell;\n if (!focus) return;\n const col = this.core.columnModel.getFlatIndex(focus.colId);\n if (!this.rangeSelection.ensureAnchor({ row: focus.rowIndex, colIdx: col })) return;\n }\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const colCount = this.core.columnModel.getOrderedVisible().length;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({\n row: Math.max(0, Math.min(row, rowCount - 1)),\n colIdx: Math.max(0, Math.min(colIdx, colCount - 1))\n });\n const next = this.normalizedRange();\n this.refreshRowRange(old, next);\n this.updateFillHandle();\n const flat = this.core.columnModel.getOrderedVisible();\n const end = this.rangeSelection.getEnd();\n if (end && end.colIdx < flat.length) {\n this.setFocusedCell(end.row, flat[end.colIdx].id);\n }\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n\n private applyRangeClass(cell: HTMLElement, rowIndex: number, column: Column): void {\n const range = this.normalizedRange();\n if (!range) {\n if (cell.classList.contains(\"mach-cell--range\")) {\n cell.classList.remove(\"mach-cell--range\", \"mach-cell--range-top\", \"mach-cell--range-bottom\", \"mach-cell--range-left\", \"mach-cell--range-right\");\n }\n return;\n }\n const ci = this.core.columnModel.getFlatIndex(column.id);\n if (ci < 0) return;\n const inRange = rowIndex >= range.r1 && rowIndex <= range.r2 && ci >= range.c1 && ci <= range.c2;\n cell.classList.toggle(\"mach-cell--range\", inRange);\n if (inRange) {\n cell.classList.toggle(\"mach-cell--range-top\", rowIndex === range.r1);\n cell.classList.toggle(\"mach-cell--range-bottom\", rowIndex === range.r2);\n cell.classList.toggle(\"mach-cell--range-left\", ci === range.c1);\n cell.classList.toggle(\"mach-cell--range-right\", ci === range.c2);\n } else {\n cell.classList.remove(\"mach-cell--range-top\", \"mach-cell--range-bottom\", \"mach-cell--range-left\", \"mach-cell--range-right\");\n }\n }\n\n private fillHandleEl: HTMLElement | null = null;\n private fillDrag: {\n r1: number;\n r2: number;\n c1: number;\n c2: number;\n startX: number;\n startY: number;\n axis: \"h\" | \"v\" | null;\n active: boolean;\n } | null = null;\n private fillFromPointer = false;\n\n private ensureFillHandle(): HTMLElement {\n if (this.fillHandleEl) return this.fillHandleEl;\n const handle = el(\"div\", \"mach-fill-handle\");\n handle.style.display = \"none\";\n handle.addEventListener(\"pointerdown\", (e) => {\n this.fillFromPointer = true;\n this.onFillHandleDown(e);\n });\n handle.addEventListener(\"mousedown\", (e) => {\n if (this.fillFromPointer) return;\n this.onFillHandleDown(e);\n });\n this.core.skeleton.rowContainers.center.appendChild(handle);\n this.fillHandleEl = handle;\n return handle;\n }\n\n private updateFillHandle(): void {\n const handle = this.ensureFillHandle();\n const range = this.normalizedRange();\n if (\n !this.core.options.enableRangeSelection ||\n !this.core.options.fillHandle ||\n !range\n ) {\n handle.style.display = \"none\";\n return;\n }\n const cm = this.core.columnModel;\n const leftCount = cm.getPaneColumns(\"left\").length;\n const centerCols = cm.getPaneColumns(\"center\");\n if (range.c2 < leftCount || range.c2 >= leftCount + centerCols.length) {\n handle.style.display = \"none\";\n return;\n }\n const local = range.c2 - leftCount;\n let x = 0;\n for (let i = 0; i <= local && i < centerCols.length; i++) x += centerCols[i].currentWidth;\n const bottom = this.positions[Math.min(range.r2 + 1, this.positions.length - 1)] ?? (range.r2 + 1) * this.core.options.rowHeight;\n handle.style.display = \"\";\n handle.style.left = `${x - 4}px`;\n handle.style.top = `${bottom - 4}px`;\n }\n\n private onFillHandleDown(e: MouseEvent): void {\n if (this.core.isDestroyed() || e.button !== 0) return;\n const range = this.normalizedRange();\n if (!range) return;\n e.preventDefault();\n e.stopPropagation();\n this.fillDrag = {\n r1: range.r1,\n r2: range.r2,\n c1: range.c1,\n c2: range.c2,\n startX: e.clientX,\n startY: e.clientY,\n axis: null,\n active: false\n };\n window.addEventListener(\"pointermove\", this.onFillMove);\n window.addEventListener(\"mousemove\", this.onFillMove);\n window.addEventListener(\"pointerup\", this.onFillUp);\n window.addEventListener(\"mouseup\", this.onFillUp);\n window.addEventListener(\"pointercancel\", this.onFillUp);\n }\n\n private fillTargetRow(e: MouseEvent): number {\n const container = this.core.skeleton.rowContainers.center;\n const rect = container.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const row = lowerBound(this.positions, y, rowCount);\n return Math.max(this.fillDrag!.r2, Math.min(row, rowCount - 1));\n }\n\n private fillTargetCol(e: MouseEvent): number {\n const container = this.core.skeleton.rowContainers.center;\n const rect = container.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const cm = this.core.columnModel;\n const leftCount = cm.getPaneColumns(\"left\").length;\n const centerCols = cm.getPaneColumns(\"center\");\n let acc = 0;\n for (let i = 0; i < centerCols.length; i++) {\n if (x < acc + centerCols[i].currentWidth / 2) return leftCount + i;\n acc += centerCols[i].currentWidth;\n }\n return leftCount + centerCols.length - 1;\n }\n\n private fillDragIndicator: HTMLElement | null = null;\n\n private cancelFillDrag(): void {\n this.fillDrag = null;\n this.fillFromPointer = false;\n window.removeEventListener(\"pointermove\", this.onFillMove);\n window.removeEventListener(\"mousemove\", this.onFillMove);\n window.removeEventListener(\"pointerup\", this.onFillUp);\n window.removeEventListener(\"mouseup\", this.onFillUp);\n window.removeEventListener(\"pointercancel\", this.onFillUp);\n this.core.skeleton.root.classList.remove(\"mach-root--filling\");\n }\n\n private onFillMove = (e: Event): void => {\n const drag = this.fillDrag;\n if (!drag) return;\n const me = e as MouseEvent;\n if (typeof me.clientX !== \"number\") return;\n\n if (!drag.active) {\n const dx = Math.abs(me.clientX - drag.startX);\n const dy = Math.abs(me.clientY - drag.startY);\n if (dx < 4 && dy < 4) return;\n drag.active = true;\n drag.axis = dx >= dy ? \"h\" : \"v\";\n this.core.skeleton.root.classList.add(\"mach-root--filling\");\n }\n\n if (drag.axis === \"v\") {\n const target = this.fillTargetRow(me);\n const end = this.rangeSelection.getEnd();\n if (end && end.row !== target) {\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: target, colIdx: end.colIdx });\n this.refreshRowRange(old, this.normalizedRange());\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n return;\n }\n\n const targetCol = Math.max(drag.c2 + 1, this.fillTargetCol(me));\n const end = this.rangeSelection.getEnd();\n if (end && end.colIdx !== targetCol) {\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: end.row, colIdx: targetCol });\n this.refreshRowRange(old, this.normalizedRange());\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n };\n\n private fillHorizontal(\n r1: number,\n r2: number,\n c1: number,\n c2: number,\n targetEnd: number\n ): void {\n const flat = this.core.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.core.undoService.beginBatch();\n try {\n for (let r = r1; r <= r2; r++) {\n const srcNode = this.core.rowModel.getDisplayedRow(r);\n if (!srcNode || srcNode.isDetail || srcNode.isGroup) continue;\n const sources: any[] = [];\n for (let c = c1; c <= c2; c++) {\n const col = flat[c];\n sources.push(col ? this.core.getCellValue(srcNode, col) : undefined);\n }\n const n = c2 - c1 + 1;\n const allNumeric =\n n > 1 && sources.every((v) => typeof v === \"number\" && !isNaN(v));\n const diff = allNumeric ? (sources[n - 1] - sources[0]) / (n - 1) : 0;\n const intPattern =\n !allNumeric || sources.every((v) => Number.isInteger(v));\n\n for (let t = c2 + 1; t <= targetEnd; t++) {\n const col = flat[t];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n if (!this.core.editingService.isEditable(srcNode, col)) continue;\n const colOffset = t - c1;\n let value: any;\n if (n === 1) {\n value = sources[0];\n } else if (allNumeric) {\n const steps = colOffset - (n - 1);\n value = sources[n - 1] + diff * steps;\n value = intPattern ? Math.round(value) : Math.round(value * 1e6) / 1e6;\n } else {\n value = sources[colOffset % n];\n }\n const old = this.core.getCellValue(srcNode, col);\n if (this.core.setCellValue(srcNode, col, value, old)) changedRows.add(r);\n }\n }\n } finally {\n this.core.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.refreshRows([...changedRows]);\n this.core.summaryRenderer.refresh();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n }\n\n private onFillUp = (e: Event): void => {\n const drag = this.fillDrag;\n if (!drag) return;\n const me = e as MouseEvent;\n\n const finish = (): void => {\n this.cancelFillDrag();\n };\n\n if (!drag.active) {\n finish();\n return;\n }\n\n if (drag.axis === \"h\") {\n const targetCol =\n typeof me.clientX === \"number\" ? Math.max(drag.c2 + 1, this.fillTargetCol(me)) : drag.c2 + 1;\n finish();\n if (targetCol > drag.c2) {\n this.fillHorizontal(drag.r1, drag.r2, drag.c1, drag.c2, targetCol);\n this.updateFillHandle();\n } else {\n const end = this.rangeSelection.getEnd();\n if (!end || end.colIdx === drag.c2) return;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: end.row, colIdx: drag.c2 });\n this.refreshRowRange(old, this.normalizedRange());\n }\n return;\n }\n\n const targetRow = typeof me.clientY === \"number\" ? this.fillTargetRow(me) : drag.r2;\n finish();\n if (targetRow > drag.r2) {\n this.fillValues(drag.r1, drag.r2, drag.c1, drag.c2, targetRow);\n this.updateFillHandle();\n } else {\n const end = this.rangeSelection.getEnd();\n if (!end || end.row === drag.r2) return;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: drag.r2, colIdx: end.colIdx });\n this.refreshRowRange(old, this.normalizedRange());\n }\n };\n\n private fillValues(r1: number, r2: number, c1: number, c2: number, targetEnd: number): void {\n const flat = this.core.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.core.undoService.beginBatch();\n try {\n this.fillValuesInner(r1, r2, c1, c2, targetEnd, flat, changedRows);\n } finally {\n this.core.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.refreshRows([...changedRows]);\n this.core.summaryRenderer.refresh();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n }\n\n private fillValuesInner(\n r1: number,\n r2: number,\n c1: number,\n c2: number,\n targetEnd: number,\n flat: Column[],\n changedRows: Set<number>\n ): void {\n for (let c = c1; c <= c2; c++) {\n const col = flat[c];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n\n const sources: any[] = [];\n let allNumeric = r1 < r2;\n for (let r = r1; r <= r2; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node) {\n allNumeric = false;\n sources.push(undefined);\n continue;\n }\n const v = this.core.getCellValue(node, col);\n sources.push(v);\n if (typeof v !== \"number\" || isNaN(v)) allNumeric = false;\n }\n if (sources[0] === undefined && sources.length === 1) continue;\n\n const n = r2 - r1 + 1;\n let diff = 0;\n let intPattern = true;\n if (allNumeric) {\n diff = (sources[n - 1] - sources[0]) / (n - 1);\n for (const v of sources) if (!Number.isInteger(v)) intPattern = false;\n }\n\n for (let r = r2 + 1; r <= targetEnd; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n if (!this.core.editingService.isEditable(node, col)) continue;\n let value: any;\n if (n === 1) {\n value = sources[0];\n } else if (allNumeric) {\n const steps = r - r2;\n value = sources[n - 1] + diff * steps;\n value = intPattern ? Math.round(value) : Math.round(value * 1e6) / 1e6;\n } else {\n value = sources[(r - r1) % n];\n }\n const old = this.core.getCellValue(node, col);\n if (this.core.setCellValue(node, col, value, old)) changedRows.add(r);\n }\n }\n }\n\n setFocusedCell(rowIndex: number | null, colId: string | null): void {\n this.clearFocusClass();\n if (rowIndex == null || colId == null) {\n this.focusedCell = null;\n return;\n }\n this.focusedCell = { rowIndex, colId };\n this.applyFocusClass();\n this.ensureFocusedCellVisible();\n }\n\n private applyFocusClass(): void {\n if (!this.focusedCell) return;\n const cell = this.getCellElement(this.focusedCell.rowIndex, this.focusedCell.colId);\n if (cell) {\n const colIndex = Math.max(0, this.core.columnModel.getFlatIndex(this.focusedCell.colId));\n cell.id = `mach-grid-${this.core.gridId}-r${this.focusedCell.rowIndex}-c${colIndex}`;\n cell.classList.add(\"mach-cell--focus\");\n this.core.skeleton.root.setAttribute(\"aria-activedescendant\", cell.id);\n }\n }\n\n private clearFocusClass(): void {\n if (this.focusedCell) {\n const cell = this.getCellElement(this.focusedCell.rowIndex, this.focusedCell.colId);\n if (cell) {\n cell.classList.remove(\"mach-cell--focus\");\n cell.removeAttribute(\"id\");\n }\n }\n this.core.skeleton.root.removeAttribute(\"aria-activedescendant\");\n }\n\n private ensureFocusedCellVisible(): void {\n if (!this.focusedCell) return;\n this.scrollToIndex(this.focusedCell.rowIndex, \"nearest\");\n\n const column = this.core.columnModel.getColumn(this.focusedCell.colId);\n if (!column || column.pinned) return;\n const viewport = this.core.skeleton.bodyViewports.center;\n let x = 0;\n for (const col of this.core.columnModel.getPaneColumns(\"center\")) {\n if (col.id === column.id) break;\n x += col.currentWidth;\n }\n const left = viewport.scrollLeft;\n const width = viewport.clientWidth;\n if (x < left) viewport.scrollLeft = x;\n else if (x + column.currentWidth > left + width) {\n viewport.scrollLeft = x + column.currentWidth - width;\n }\n }\n\n scrollToIndex(rowIndex: number, position: \"top\" | \"bottom\" | \"middle\" | \"nearest\" = \"top\"): void {\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n if (rowCount === 0) return;\n const index = clamp(rowIndex, 0, rowCount - 1);\n const viewportHeight = viewport.clientHeight;\n const scrollTop = viewport.scrollTop;\n const rowTop = this.positions[index];\n const rowBottom = this.positions[index + 1];\n\n let target = scrollTop;\n if (position === \"top\") {\n target = rowTop;\n } else if (position === \"bottom\") {\n target = rowBottom - viewportHeight;\n } else if (position === \"middle\") {\n target = rowTop - (viewportHeight - (rowBottom - rowTop)) / 2;\n } else {\n if (rowTop < scrollTop) target = rowTop;\n else if (rowBottom > scrollTop + viewportHeight) target = rowBottom - viewportHeight;\n }\n\n const maxScroll = Math.max(0, this.positions[rowCount] - viewportHeight);\n viewport.scrollTop = clamp(target, 0, maxScroll);\n }\n\n private setHoverIndex(index: number): void {\n if (this.hoverIndex === index) return;\n const prev = this.hoverIndex;\n this.hoverIndex = index;\n this.toggleHover(prev, false);\n this.toggleHover(index, true);\n }\n\n private toggleHover(index: number, hover: boolean): void {\n if (index < 0) return;\n const slot = this.pool[index % this.poolSize];\n if (!slot || slot.index !== index || slot.kind !== \"master\") return;\n for (const pane of PANES) {\n slot.rows[pane]?.classList.toggle(\"mach-row--hover\", hover);\n }\n }\n\n focusGridRoot(): void {\n this.core.skeleton.root.focus({ preventScroll: true });\n }\n\n private resolveEventTarget(e: MouseEvent): { node: RowNode<any>; index: number; cellEl: HTMLElement | null } | null {\n const target = e.target as HTMLElement;\n const rowEl = target.closest<HTMLElement>(\".mach-row\");\n if (!rowEl) return null;\n const index = Number(rowEl.dataset.index);\n if (Number.isNaN(index)) return null;\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) return null;\n const cellEl = target.closest<HTMLElement>(\".mach-cell\");\n return { node, index, cellEl };\n }\n\n private onBodyClick = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved) return;\n const { node, index, cellEl } = resolved;\n\n if (node.isGroup) {\n this.focusGridRoot();\n const checkbox = (e.target as HTMLElement).closest?.(\".mach-row-checkbox\");\n if (checkbox) {\n this.core.selectionService.setGroupSelected(node, !this.core.selectionService.getGroupSelectionState(node).all);\n return;\n }\n const labelCol = this.core.columnModel.getGroupLabelColumn();\n if (!labelCol || !cellEl || cellEl.dataset.colId === labelCol.id) {\n this.core.rowModel.toggleGroup(node.id);\n }\n return;\n }\n\n const target = e.target as HTMLElement;\n\n if (this.handleTreeToggleClick(target, node, cellEl)) return;\n\n const colId = cellEl?.dataset.colId ?? \"\";\n const column = colId ? this.core.columnModel.getColumn(colId) : undefined;\n\n if (column?.isDetailToggle && !node.isDetail) {\n this.focusGridRoot();\n this.core.toggleDetail(node.id);\n return;\n }\n\n if (node.isDetail) return;\n\n if (target.closest?.(\".mach-row-checkbox\")) {\n this.focusGridRoot();\n if (!this.core.options.suppressCellFocus) this.setFocusedCell(index, this.firstCheckboxColId());\n this.core.selectionService.onRowClick(node, e, true);\n return;\n }\n\n if (!cellEl || !column) return;\n\n this.focusGridRoot();\n if (!this.core.options.suppressCellFocus) this.setFocusedCell(index, colId);\n this.core.selectionService.onRowClick(node, e, false);\n\n const value = this.core.getCellValue(node, column);\n const event = this.core.emit(\"cellClicked\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value\n });\n column.colDef.onCellClick?.(event);\n this.core.emit(\"rowClicked\", { event: e, rowNode: node, rowIndex: index });\n\n const singleClick = this.core.options.singleClickEdit || column.colDef.singleClickEdit === true;\n if (singleClick && !node.isGroup && this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(index, column);\n }\n };\n\n private handleTreeToggleClick(target: HTMLElement, node: RowNode<any>, cell: HTMLElement | null): boolean {\n if (!this.core.rowModel.isTree || !target.closest(\".mach-detail-toggle\")) return false;\n const treeColumn = this.getTreeColumn();\n if (!treeColumn || cell?.dataset.colId !== treeColumn.id || !this.core.rowModel.isRowExpandable(node)) return false;\n this.focusGridRoot();\n if (node.treeLoadError) void this.core.rowModel.loadTreeChildren(node.id, true).catch(() => undefined);\n else this.core.rowModel.toggleDetail(node.id);\n return true;\n }\n\n private firstCheckboxColId(): string {\n for (const col of this.core.columnModel.getOrderedVisible()) {\n if (col.hasCheckbox) return col.id;\n }\n return this.core.columnModel.getOrderedVisible()[0]?.id ?? \"\";\n }\n\n private onBodyDblClick = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved) return;\n const { node, index, cellEl } = resolved;\n if (node.isDetail || node.isGroup || !cellEl) return;\n const colId = cellEl.dataset.colId ?? \"\";\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n\n const value = this.core.getCellValue(node, column);\n const event = this.core.emit(\"cellDoubleClicked\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value\n });\n column.colDef.onCellDoubleClick?.(event);\n this.core.emit(\"rowDoubleClicked\", { event: e, rowNode: node, rowIndex: index });\n\n if (this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(index, column);\n }\n };\n\n private onContextMenu = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved || resolved.node.isDetail || resolved.node.isGroup || !resolved.cellEl) return;\n const { node, index, cellEl } = resolved;\n const colId = cellEl.dataset.colId ?? \"\";\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n this.core.emit(\"cellContextMenu\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value: this.core.getCellValue(node, column)\n });\n if (this.core.options.contextMenu) {\n e.preventDefault();\n if (this.core.options.enableRangeSelection && !this.normalizedRange()) {\n const colIdx = this.core.columnModel.getFlatIndex(colId);\n if (colIdx >= 0) this.startRange(index, colIdx, false);\n }\n this.core.contextMenuService.open(e.clientX, e.clientY, { rowIndex: index, colId });\n }\n };\n\n private onMouseDown = (e: MouseEvent): void => {\n if (this.core.editingService.isCellEditing()) {\n this.core.editingService.stop(false);\n }\n if (this.core.options.enableRangeSelection && e.button === 0) {\n const resolved = this.resolveEventTarget(e);\n if (\n resolved &&\n !resolved.node.isDetail &&\n !resolved.node.isGroup &&\n resolved.cellEl &&\n !(e.target as HTMLElement).closest?.(\".mach-row-checkbox\")\n ) {\n const colIdx = this.core.columnModel.getFlatIndex(resolved.cellEl.dataset.colId ?? \"\");\n if (colIdx >= 0) {\n this.startRange(resolved.index, colIdx, e.shiftKey);\n this.rangeDragging = true;\n if (!e.shiftKey && !this.core.options.suppressCellFocus) {\n this.setFocusedCell(resolved.index, resolved.cellEl.dataset.colId ?? \"\");\n }\n }\n }\n }\n };\n\n private onWindowMouseUp = (): void => {\n this.rangeDragging = false;\n };\n\n private onMouseOver = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (this.rangeDragging) {\n if (resolved && !resolved.node.isDetail && !resolved.node.isGroup && resolved.cellEl) {\n const colIdx = this.core.columnModel.getFlatIndex(resolved.cellEl.dataset.colId ?? \"\");\n const end = this.rangeSelection.getEnd();\n if (colIdx >= 0 && end && (end.row !== resolved.index || end.colIdx !== colIdx)) {\n this.startRange(resolved.index, colIdx, true);\n }\n }\n }\n if (this.core.options.suppressRowHoverHighlight) return;\n if (!resolved || resolved.node.isDetail) return;\n this.setHoverIndex(resolved.index);\n };\n\n private onMouseLeave = (): void => {\n this.setHoverIndex(-1);\n };\n\n private onDragHandlePointerDown = (e: PointerEvent): void => {\n if (this.core.isDestroyed() || e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (!target.closest(\".mach-row-drag-handle\")) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved || resolved.node.isDetail || resolved.node.isGroup) return;\n\n this.rowDragController.start(e, resolved.node);\n e.preventDefault();\n };\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText } from \"../lib/locale\";\n\ntype SummaryContext = Pick<\n GridCore<any>,\n \"columnModel\" | \"getCellValue\" | \"isDestroyed\" | \"options\" | \"reportError\" | \"rowModel\" | \"skeleton\"\n>;\n\nexport class SummaryRenderer {\n private footerEl: HTMLElement | null = null;\n private rows: Record<PaneType, HTMLElement> = { left: undefined!, center: undefined!, right: undefined! };\n private cellsByPane: Record<PaneType, HTMLElement[]> = { left: [], center: [], right: [] };\n\n constructor(private core: SummaryContext) {}\n\n init(): void {\n this.footerEl = el(\"div\", \"mach-footer\");\n this.footerEl.style.display = \"none\";\n this.footerEl.setAttribute(\"role\", \"row\");\n this.core.skeleton.root.appendChild(this.footerEl);\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const row = el(\"div\", `mach-footer-row mach-footer-row--${pane}`);\n row.style.height = `${this.core.options.rowHeight}px`;\n this.footerEl.appendChild(row);\n this.rows[pane] = row;\n }\n }\n\n setVisible(visible: boolean): void {\n if (!this.footerEl) return;\n this.footerEl.style.display = visible ? \"\" : \"none\";\n }\n\n refresh(): void {\n if (!this.footerEl || this.core.isDestroyed()) return;\n const show = this.core.options.showSummary;\n this.setVisible(show);\n if (!show) return;\n\n const method = this.core.options.summaryMethod;\n const masterRows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const locale = { ...DEFAULT_LOCALE, ...this.core.options.locale };\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const cols = this.core.columnModel.getPaneColumns(pane);\n const row = this.rows[pane];\n if (this.cellsByPane[pane].length !== cols.length) {\n row.textContent = \"\";\n this.cellsByPane[pane] = cols.map(() => {\n const cell = el(\"div\", \"mach-footer-cell\");\n cell.setAttribute(\"role\", \"cell\");\n row.appendChild(cell);\n return cell;\n });\n }\n let x = 0;\n cols.forEach((col, i) => {\n const cell = this.cellsByPane[pane][i];\n cell.style.left = `${x}px`;\n cell.style.width = `${col.currentWidth}px`;\n x += col.currentWidth;\n\n if (col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) {\n cell.textContent = \"\";\n return;\n }\n if (method) {\n try {\n cell.textContent = method({\n colId: col.id,\n column: col,\n values: masterRows.map((node) => this.core.getCellValue(node, col))\n });\n } catch (error) {\n this.core.reportError(error, \"summaryMethod\", { colId: col.id });\n cell.textContent = \"\";\n }\n } else if (i === 0 && pane === \"left\") {\n cell.textContent = formatText(locale.totalRowsLabel, masterRows.length);\n } else {\n cell.textContent = \"\";\n }\n });\n }\n }\n\n destroy(): void {\n this.footerEl?.remove();\n this.footerEl = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText, formatTwo } from \"../lib/locale\";\n\ntype PaginationContext = Pick<\n GridCore<any>,\n \"eventBus\" | \"isDestroyed\" | \"options\" | \"rowModel\" | \"skeleton\"\n>;\n\nexport class PaginationBar {\n private barEl: HTMLElement | null = null;\n private totalEl: HTMLElement | null = null;\n private pageEl: HTMLElement | null = null;\n private sizeSelect: HTMLSelectElement | null = null;\n private firstBtn: HTMLButtonElement | null = null;\n private prevBtn: HTMLButtonElement | null = null;\n private nextBtn: HTMLButtonElement | null = null;\n private lastBtn: HTMLButtonElement | null = null;\n private offs: (() => void)[] = [];\n\n constructor(private core: PaginationContext) {}\n\n init(): void {\n this.barEl = el(\"div\", \"mach-pagination\");\n this.barEl.style.display = \"none\";\n this.barEl.setAttribute(\"role\", \"navigation\");\n\n const mkBtn = (cls: string, label: string, text: string): HTMLButtonElement => {\n const btn = el(\"button\", `mach-pagination-btn ${cls}`) as HTMLButtonElement;\n btn.type = \"button\";\n btn.title = label;\n btn.setAttribute(\"aria-label\", label);\n btn.textContent = text;\n return btn;\n };\n\n this.totalEl = el(\"span\", \"mach-pagination-total\");\n this.firstBtn = mkBtn(\"mach-pagination-first\", this.t(\"pageFirst\"), \"«\");\n this.prevBtn = mkBtn(\"mach-pagination-prev\", this.t(\"pagePrev\"), \"‹\");\n this.pageEl = el(\"span\", \"mach-pagination-page\");\n this.nextBtn = mkBtn(\"mach-pagination-next\", this.t(\"pageNext\"), \"›\");\n this.lastBtn = mkBtn(\"mach-pagination-last\", this.t(\"pageLast\"), \"»\");\n\n this.firstBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(1));\n this.prevBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getCurrentPage() - 1));\n this.nextBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getCurrentPage() + 1));\n this.lastBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getPageCount()));\n\n this.barEl.append(this.totalEl, this.firstBtn, this.prevBtn, this.pageEl, this.nextBtn, this.lastBtn);\n\n if (this.core.options.paginationShowSizeSelector) {\n this.sizeSelect = document.createElement(\"select\");\n this.sizeSelect.className = \"mach-pagination-size\";\n this.sizeSelect.setAttribute(\"aria-label\", \"page size\");\n this.buildSizeOptions();\n this.sizeSelect.addEventListener(\"change\", () => {\n const size = Number(this.sizeSelect!.value);\n if (!Number.isNaN(size)) this.core.rowModel.setPageSize(size);\n });\n this.barEl.appendChild(this.sizeSelect);\n }\n\n this.core.skeleton.root.appendChild(this.barEl);\n\n this.offs.push(\n this.core.eventBus.on(\"modelUpdated\", () => this.refresh()),\n this.core.eventBus.on(\"paginationChanged\", () => this.refresh())\n );\n this.refresh();\n }\n\n private buildSizeOptions(): void {\n if (!this.sizeSelect) return;\n const options = this.core.options.paginationPageSizeOptions;\n const current = this.core.options.paginationPageSize;\n if (!options.includes(current)) {\n options.push(current);\n options.sort((a, b) => a - b);\n }\n this.sizeSelect.textContent = \"\";\n for (const size of options) {\n const option = document.createElement(\"option\");\n option.value = String(size);\n option.textContent = formatText(this.t(\"perPage\"), size);\n if (size === current) option.selected = true;\n this.sizeSelect.appendChild(option);\n }\n }\n\n private t(key: Parameters<GridCore<any>[\"getLocaleText\"]>[0]): string {\n return this.core.options.locale?.[key] ?? DEFAULT_LOCALE[key];\n }\n\n rebuild(): void {\n if (!this.barEl) return;\n if (this.sizeSelect && this.core.options.paginationShowSizeSelector) {\n this.buildSizeOptions();\n }\n this.refresh();\n }\n\n refresh(): void {\n if (!this.barEl || this.core.isDestroyed()) return;\n const rm = this.core.rowModel;\n const active = rm.paginationActive;\n const total = rm.getTotalRowCount();\n const visible = active && total > 0;\n this.barEl.style.display = visible ? \"\" : \"none\";\n if (!visible) return;\n\n const page = rm.getCurrentPage();\n const pageCount = rm.getPageCount();\n\n if (this.totalEl && this.core.options.paginationShowTotal) {\n const text = formatText(this.t(\"paginationTotal\"), total);\n if (this.totalEl.textContent !== text) this.totalEl.textContent = text;\n }\n if (this.pageEl) {\n const text = formatTwo(this.t(\"paginationPage\"), page, pageCount);\n if (this.pageEl.textContent !== text) this.pageEl.textContent = text;\n }\n if (this.firstBtn) this.firstBtn.disabled = page <= 1;\n if (this.prevBtn) this.prevBtn.disabled = page <= 1;\n if (this.nextBtn) this.nextBtn.disabled = page >= pageCount;\n if (this.lastBtn) this.lastBtn.disabled = page >= pageCount;\n if (this.sizeSelect && Number(this.sizeSelect.value) !== this.core.options.paginationPageSize) {\n this.sizeSelect.value = String(this.core.options.paginationPageSize);\n }\n }\n\n destroy(): void {\n for (const off of this.offs) off();\n this.offs = [];\n this.barEl?.remove();\n this.barEl = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport type { RowNode } from \"../types/row\";\nimport { el } from \"../lib/dom\";\nimport { renderCellContent, cleanupCellContent, applyCellClasses, applyCellStyle } from \"./cellContent\";\n\ntype PinnedRowsContext = Pick<\n GridCore<any>,\n | \"columnModel\"\n | \"getApi\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"relayout\"\n | \"reportError\"\n | \"resolveCellRenderer\"\n | \"skeleton\"\n>;\n\nconst PANES: PaneType[] = [\"left\", \"center\", \"right\"];\n\ninterface SideState {\n root: HTMLElement;\n segments: Record<PaneType, HTMLElement>;\n centerViewport: HTMLElement;\n rowWrappers: Record<PaneType, HTMLElement[]>;\n cells: Record<PaneType, HTMLElement[]>[];\n data: any[];\n}\n\nexport class PinnedRowsRenderer {\n private top: SideState | null = null;\n private bottom: SideState | null = null;\n\n constructor(private core: PinnedRowsContext) {}\n\n init(): void {\n this.top = this.createSide(this.core.skeleton.pinnedTopEl);\n this.bottom = this.createSide(this.core.skeleton.pinnedBottomEl);\n }\n\n private createSide(root: HTMLElement): SideState {\n const state: SideState = {\n root,\n segments: { left: el(\"div\"), center: el(\"div\"), right: el(\"div\") },\n centerViewport: el(\"div\", \"mach-pinned-viewport\"),\n rowWrappers: { left: [], center: [], right: [] },\n cells: [],\n data: []\n };\n for (const pane of PANES) {\n state.segments[pane].className = `mach-pinned-seg mach-pinned-seg--${pane}`;\n if (pane !== \"center\") state.segments[pane].classList.add(\"mach-pane--hidden\");\n if (pane === \"center\") {\n state.centerViewport.appendChild(state.segments[pane]);\n }\n }\n root.append(state.segments.left, state.centerViewport, state.segments.right);\n return state;\n }\n\n setData(top: any[] | null, bottom: any[] | null): void {\n if (this.core.isDestroyed() || !this.top || !this.bottom) return;\n this.top.data = top ?? [];\n this.bottom.data = bottom ?? [];\n this.rebuild();\n this.applyLayout();\n this.core.relayout();\n }\n\n setTopData(rows: any[] | null): void {\n if (this.core.isDestroyed() || !this.top) return;\n this.top.data = rows ?? [];\n this.rebuildSide(this.top, \"top\");\n this.applyLayout();\n this.core.relayout();\n }\n\n setBottomData(rows: any[] | null): void {\n if (this.core.isDestroyed() || !this.bottom) return;\n this.bottom.data = rows ?? [];\n this.rebuildSide(this.bottom, \"bottom\");\n this.applyLayout();\n this.core.relayout();\n }\n\n getTopData(): any[] {\n return this.top ? this.top.data.slice() : [];\n }\n\n getBottomData(): any[] {\n return this.bottom ? this.bottom.data.slice() : [];\n }\n\n rebuild(): void {\n if (!this.top || !this.bottom) return;\n this.rebuildSide(this.top, \"top\");\n this.rebuildSide(this.bottom, \"bottom\");\n }\n\n private rebuildSide(side: SideState, sideName: \"top\" | \"bottom\"): void {\n for (const row of side.cells) {\n for (const pane of PANES) {\n for (const cell of row[pane]) cleanupCellContent(this.core, cell);\n }\n }\n for (const pane of PANES) {\n for (const wrapper of side.rowWrappers[pane]) wrapper.remove();\n side.rowWrappers[pane] = [];\n }\n side.cells = [];\n side.root.style.display = side.data.length > 0 ? \"\" : \"none\";\n if (side.data.length === 0) return;\n\n const rowHeight = this.core.options.rowHeight;\n const cm = this.core.columnModel;\n\n side.data.forEach((data, i) => {\n const node: RowNode<any> = {\n id: `__pinned_${sideName}_${i}`,\n data,\n rowIndex: -1,\n selected: false\n };\n const cellsByPane = {} as Record<PaneType, HTMLElement[]>;\n for (const pane of PANES) {\n const wrapper = el(\"div\", \"mach-pinned-row\");\n wrapper.style.height = `${rowHeight}px`;\n wrapper.setAttribute(\"role\", \"row\");\n cellsByPane[pane] = [];\n for (const col of cm.getPaneColumns(pane)) {\n const cell = el(\"div\", \"mach-cell\");\n cell.dataset.colId = col.id;\n cell.setAttribute(\"role\", \"gridcell\");\n if (col.hasCheckbox) cell.classList.add(\"mach-cell--selection\");\n if (!col.hasCheckbox && !col.isDetailToggle && !col.colDef.rowDrag && col.colDef.type !== \"index\") {\n try {\n renderCellContent(this.core, cell, node, col);\n applyCellClasses(this.core, cell, node, col);\n applyCellStyle(this.core, cell, node, col);\n } catch (err) {\n this.core.reportError(err, \"pinnedRow.render\", { colId: col.id, side: sideName, rowIndex: i });\n }\n }\n wrapper.appendChild(cell);\n cellsByPane[pane].push(cell);\n }\n side.segments[pane].appendChild(wrapper);\n side.rowWrappers[pane].push(wrapper);\n }\n side.cells.push(cellsByPane);\n });\n }\n\n applyLayout(): void {\n if (!this.top || !this.bottom) return;\n const cm = this.core.columnModel;\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n const lefts: Record<PaneType, number[]> = { left: [], center: [], right: [] };\n for (const pane of PANES) {\n let x = 0;\n for (const col of cm.getPaneColumns(pane)) {\n lefts[pane].push(x);\n x += col.currentWidth;\n }\n widths[pane] = x;\n }\n\n for (const side of [this.top, this.bottom]) {\n const hidden = side.data.length === 0;\n side.segments.left.classList.toggle(\"mach-pane--hidden\", hidden || widths.left <= 0);\n side.segments.right.classList.toggle(\"mach-pane--hidden\", hidden || widths.right <= 0);\n side.segments.left.style.width = `${widths.left}px`;\n side.segments.right.style.width = `${widths.right}px`;\n side.segments.center.style.width = `${widths.center}px`;\n side.cells.forEach((cellsByPane) => {\n let globalColOffset = 0;\n for (const pane of PANES) {\n const cols = cm.getPaneColumns(pane);\n cellsByPane[pane].forEach((cell, i) => {\n cell.style.width = `${cols[i].currentWidth}px`;\n cell.style.left = `${lefts[pane][i]}px`;\n cell.setAttribute(\"aria-colindex\", String(globalColOffset + i + 1));\n });\n globalColOffset += cols.length;\n }\n });\n }\n }\n\n onScrollLeft(scrollLeft: number): void {\n if (this.top) this.top.segments.center.style.transform = `translateX(${-scrollLeft}px)`;\n if (this.bottom) this.bottom.segments.center.style.transform = `translateX(${-scrollLeft}px)`;\n }\n\n refresh(): void {\n this.rebuild();\n this.applyLayout();\n }\n\n destroy(): void {\n for (const side of [this.top, this.bottom]) {\n if (!side) continue;\n for (const row of side.cells) {\n for (const pane of PANES) {\n for (const cell of row[pane]) cleanupCellContent(this.core, cell);\n }\n }\n }\n this.top = null;\n this.bottom = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText, type RgLocaleKey } from \"../lib/locale\";\nimport type { StatusBarPanel } from \"../types/options\";\n\ntype AnyLocale = Record<string, string | undefined>;\ntype StatusBarContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"eventBus\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n>;\n\nexport class StatusBarService {\n private barEl: HTMLElement | null = null;\n private items: Partial<Record<StatusBarPanel, HTMLElement>> = {};\n private offs: (() => void)[] = [];\n\n constructor(private core: StatusBarContext) {}\n\n init(): void {\n this.barEl = el(\"div\", \"mach-statusbar\");\n this.barEl.style.display = \"none\";\n this.barEl.setAttribute(\"role\", \"status\");\n this.core.skeleton.root.appendChild(this.barEl);\n this.rebuild();\n\n this.offs.push(\n this.core.eventBus.on(\"modelUpdated\", () => this.refresh()),\n this.core.eventBus.on(\"selectionChanged\", () => this.refresh()),\n this.core.eventBus.on(\"rangeSelectionChanged\", () => this.refresh()),\n this.core.eventBus.on(\"cellValueChanged\", () => this.refresh())\n );\n }\n\n rebuild(): void {\n if (!this.barEl) return;\n this.barEl.textContent = \"\";\n this.items = {};\n const options = this.core.options;\n if (!options.statusBarEnabled) {\n this.barEl.style.display = \"none\";\n return;\n }\n for (const panel of options.statusBarPanels) {\n const item = el(\"span\", `mach-statusbar-item mach-statusbar-item--${panel}`);\n this.barEl.appendChild(item);\n this.items[panel] = item;\n }\n this.refresh();\n }\n\n refresh(): void {\n if (!this.barEl || this.core.isDestroyed()) return;\n const options = this.core.options;\n this.barEl.style.display = options.statusBarEnabled ? \"\" : \"none\";\n if (!options.statusBarEnabled) return;\n\n const locale: AnyLocale = { ...DEFAULT_LOCALE, ...options.locale };\n const text = (key: RgLocaleKey, value?: number | string): string => {\n const template = locale[key] ?? DEFAULT_LOCALE[key];\n return value === undefined ? template : formatText(template, typeof value === \"number\" ? value : parseFloat(String(value)) || 0);\n };\n\n if (this.items.rowCount) {\n const rm = this.core.rowModel;\n const total = rm.getDisplayTotalCount();\n const loaded = rm.paginationActive ? rm.getTotalRowCount() : rm.getDisplayedRowCount();\n const value =\n rm.isInfinite && total > loaded\n ? `${formatText(text(\"totalRowsLabel\"), loaded)} / ${total}`\n : formatText(text(\"totalRowsLabel\"), loaded);\n if (this.items.rowCount.textContent !== value) this.items.rowCount.textContent = value;\n }\n\n if (this.items.selectedRowCount) {\n const count = this.core.selectionService.getSelectedNodes().length;\n const value = formatText(text(\"statusSelected\"), count);\n if (this.items.selectedRowCount.textContent !== value) {\n this.items.selectedRowCount.textContent = value;\n }\n }\n\n if (this.items.rangeAggregate) {\n const range = this.core.bodyRenderer.normalizedRange();\n let value = \"\";\n if (range) {\n const flat = this.core.columnModel.getOrderedVisible();\n let sum = 0;\n let count = 0;\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n for (let c = range.c1; c <= range.c2; c++) {\n const col = flat[c];\n if (!col) continue;\n const v = this.core.getCellValue(node, col);\n if (typeof v === \"number\" && !isNaN(v)) {\n sum += v;\n count++;\n }\n }\n }\n if (count > 0) {\n const avg = Math.round((sum / count) * 100) / 100;\n const sumText = Number.isInteger(sum) ? String(sum) : String(Math.round(sum * 100) / 100);\n value = `${text(\"statusSum\", sumText)} · ${text(\"statusAvg\", String(avg))} · ${text(\"statusCount\", String(count))}`;\n }\n }\n if (this.items.rangeAggregate.textContent !== value) this.items.rangeAggregate.textContent = value;\n }\n }\n\n destroy(): void {\n for (const off of this.offs) off();\n this.offs = [];\n this.barEl?.remove();\n this.barEl = null;\n }\n}\n","import type { ColumnState } from \"../types/colDef\";\nimport type { ColumnStateStore } from \"../types/options\";\n\nexport interface ColumnStateStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport interface StoredColumnState {\n version: number;\n savedAt: number;\n columns: ColumnState[];\n}\n\nexport interface LocalColumnStateStoreOptions {\n /** Storage prefix. Separate applications or environments with different values. */\n namespace?: string;\n /** Schema version for migrations when column identifiers or meanings change. */\n version?: number;\n storage?: ColumnStateStorage;\n maxColumns?: number;\n migrate?(\n columns: readonly ColumnState[],\n fromVersion: number,\n toVersion: number\n ): ColumnState[] | null;\n onError?(error: unknown, operation: \"load\" | \"save\" | \"clear\", key: string): void;\n}\n\nexport interface ManagedColumnStateStore extends ColumnStateStore {\n clear(key: string): void;\n storageKey(key: string): string;\n}\n\nexport interface ColumnStateKeyParts {\n app?: string;\n tenant?: string | number;\n user?: string | number;\n route?: string;\n table: string;\n schema?: string | number;\n}\n\nfunction currentStorage(): ColumnStateStorage | null {\n try {\n return typeof localStorage === \"undefined\" ? null : localStorage;\n } catch {\n return null;\n }\n}\n\nfunction safeSegment(value: string | number): string {\n return encodeURIComponent(String(value).trim()).replace(/%/g, \"~\");\n}\n\nfunction copyColumnDimensions(source: Record<string, unknown>, state: ColumnState): void {\n if (typeof source.width === \"number\" && Number.isFinite(source.width) && source.width > 0) {\n state.width = source.width;\n }\n if (source.flex === null) state.flex = null;\n else if (typeof source.flex === \"number\" && Number.isFinite(source.flex) && source.flex > 0) {\n state.flex = source.flex;\n }\n if (source.widthMode === \"auto\" || source.widthMode === \"manual\") state.widthMode = source.widthMode;\n}\n\nfunction copyColumnSort(source: Record<string, unknown>, state: ColumnState): void {\n if (source.sort === \"asc\" || source.sort === \"desc\" || source.sort === null) state.sort = source.sort;\n if (source.sortIndex === null) state.sortIndex = null;\n else if (typeof source.sortIndex === \"number\" && Number.isInteger(source.sortIndex) && source.sortIndex >= 0) {\n state.sortIndex = source.sortIndex;\n }\n}\n\n/** Builds a collision-resistant key for per-user/per-route table preferences. */\nexport function createColumnStateKey(parts: ColumnStateKeyParts): string {\n const segments: Array<[string, string | number | undefined]> = [\n [\"app\", parts.app],\n [\"tenant\", parts.tenant],\n [\"user\", parts.user],\n [\"route\", parts.route],\n [\"table\", parts.table],\n [\"schema\", parts.schema]\n ];\n return segments\n .filter((entry): entry is [string, string | number] => entry[1] !== undefined && String(entry[1]).trim() !== \"\")\n .map(([name, value]) => `${name}=${safeSegment(value)}`)\n .join(\";\");\n}\n\nfunction sanitizeColumnState(value: unknown, maxColumns: number): ColumnState[] | null {\n if (!Array.isArray(value) || value.length > maxColumns) return null;\n const result: ColumnState[] = [];\n const ids = new Set<string>();\n for (const item of value) {\n if (item == null || typeof item !== \"object\") continue;\n const source = item as Record<string, unknown>;\n if (typeof source.colId !== \"string\" || source.colId.length === 0 || source.colId.length > 256 || ids.has(source.colId)) continue;\n ids.add(source.colId);\n const state: ColumnState = { colId: source.colId };\n if (typeof source.hide === \"boolean\") state.hide = source.hide;\n copyColumnDimensions(source, state);\n if (source.pinned === \"left\" || source.pinned === \"right\" || source.pinned === null) state.pinned = source.pinned;\n copyColumnSort(source, state);\n result.push(state);\n }\n return result;\n}\n\n/**\n * Creates a versioned local state adapter. Legacy array payloads are read as\n * version 0, so existing users can migrate without losing preferences.\n */\nexport function createLocalColumnStateStore(options: LocalColumnStateStoreOptions = {}): ManagedColumnStateStore {\n const namespace = (options.namespace ?? \"mach-table:col-state\").replace(/:+$/, \"\");\n const version = Math.max(1, Math.floor(options.version ?? 1));\n const maxColumns = Math.max(1, Math.floor(options.maxColumns ?? 1_000));\n const storageKey = (key: string): string => `${namespace}:${key}`;\n const report = (error: unknown, operation: \"load\" | \"save\" | \"clear\", key: string): void => {\n try { options.onError?.(error, operation, key); } catch { /* error observers must not break the grid */ }\n };\n\n return {\n storageKey,\n load(key) {\n try {\n const raw = (options.storage ?? currentStorage())?.getItem(storageKey(key));\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n const legacy = sanitizeColumnState(parsed, maxColumns);\n if (!legacy || !options.migrate) return legacy;\n return sanitizeColumnState(options.migrate(legacy, 0, version), maxColumns);\n }\n if (parsed == null || typeof parsed !== \"object\") return null;\n const envelope = parsed as Partial<StoredColumnState>;\n if (!Number.isInteger(envelope.version) || typeof envelope.version !== \"number\") return null;\n const columns = sanitizeColumnState(envelope.columns, maxColumns);\n if (!columns) return null;\n if (envelope.version === version) return columns;\n return options.migrate\n ? sanitizeColumnState(options.migrate(columns, envelope.version, version), maxColumns)\n : null;\n } catch (error) {\n report(error, \"load\", key);\n return null;\n }\n },\n save(key, state) {\n try {\n const columns = sanitizeColumnState(state, maxColumns);\n if (!columns) throw new TypeError(`[MachTable] Invalid column state for \"${key}\".`);\n const envelope: StoredColumnState = { version, savedAt: Date.now(), columns };\n (options.storage ?? currentStorage())?.setItem(storageKey(key), JSON.stringify(envelope));\n } catch (error) {\n report(error, \"save\", key);\n }\n },\n clear(key) {\n try {\n (options.storage ?? currentStorage())?.removeItem(storageKey(key));\n } catch (error) {\n report(error, \"clear\", key);\n }\n }\n };\n}\n\nconst defaultStore = createLocalColumnStateStore();\n\nexport function saveColumnState(key: string, state: ColumnState[]): void {\n void defaultStore.save(key, state);\n}\n\nexport function loadColumnState(key: string): ColumnState[] | null {\n return defaultStore.load(key) as ColumnState[] | null;\n}\n\nexport function clearColumnState(key: string): void {\n void defaultStore.clear(key);\n}\n","import type { GridState } from \"../types/state\";\nimport type { GridStateStore } from \"../types/options\";\nimport type { ColumnStateStorage } from \"./columnStateStore\";\nimport { migrateGridState } from \"./gridState\";\n\nexport interface StoredGridState {\n schemaVersion: 2;\n savedAt: number;\n state: GridState;\n}\n\nexport interface LocalGridStateStoreOptions {\n namespace?: string;\n storage?: ColumnStateStorage;\n /** Reject unexpectedly large or corrupted payloads. Defaults to 512 KiB. */\n maxBytes?: number;\n onError?(error: unknown, operation: \"load\" | \"save\" | \"clear\", key: string): void;\n}\n\nexport interface ManagedGridStateStore extends GridStateStore {\n clear(key: string): void;\n storageKey(key: string): string;\n}\n\nfunction currentStorage(): ColumnStateStorage | null {\n try {\n return typeof localStorage === \"undefined\" ? null : localStorage;\n } catch {\n return null;\n }\n}\n\nfunction storageBytes(value: string): number {\n return typeof TextEncoder === \"undefined\" ? value.length * 2 : new TextEncoder().encode(value).byteLength;\n}\n\n/** Safe, versioned localStorage adapter for full grid state. */\nexport function createLocalGridStateStore(options: LocalGridStateStoreOptions = {}): ManagedGridStateStore {\n const namespace = (options.namespace ?? \"mach-table:grid-state\").replace(/:+$/, \"\");\n const maxBytes = Math.max(1_024, Math.floor(options.maxBytes ?? 512 * 1_024));\n const storageKey = (key: string): string => `${namespace}:${key}`;\n const report = (error: unknown, operation: \"load\" | \"save\" | \"clear\", key: string): void => {\n try { options.onError?.(error, operation, key); } catch { /* observers cannot break the grid */ }\n };\n\n return {\n storageKey,\n load(key) {\n try {\n const raw = (options.storage ?? currentStorage())?.getItem(storageKey(key));\n if (!raw || storageBytes(raw) > maxBytes) return null;\n const parsed = JSON.parse(raw) as { schemaVersion?: unknown; state?: unknown };\n if (parsed?.schemaVersion !== 1 && parsed?.schemaVersion !== 2) return null;\n return migrateGridState(parsed.state);\n } catch (error) {\n report(error, \"load\", key);\n return null;\n }\n },\n save(key, state) {\n try {\n const normalized = migrateGridState(state);\n if (!normalized) throw new TypeError(`[MachTable] Invalid grid state for \"${key}\".`);\n const payload = JSON.stringify({ schemaVersion: 2, savedAt: Date.now(), state: normalized } satisfies StoredGridState);\n if (storageBytes(payload) > maxBytes) throw new RangeError(`[MachTable] Grid state for \"${key}\" exceeds ${maxBytes} bytes.`);\n (options.storage ?? currentStorage())?.setItem(storageKey(key), payload);\n } catch (error) {\n report(error, \"save\", key);\n }\n },\n clear(key) {\n try {\n (options.storage ?? currentStorage())?.removeItem(storageKey(key));\n } catch (error) {\n report(error, \"clear\", key);\n }\n }\n };\n}\n\nconst defaultStore = createLocalGridStateStore();\n\nexport function saveGridState(key: string, state: import(\"../types/state\").GridStateInput): void {\n void defaultStore.save(key, state);\n}\n\nexport function loadGridState(key: string): GridState | null {\n return defaultStore.load(key) as GridState | null;\n}\n\nexport function clearGridState(key: string): void {\n defaultStore.clear(key);\n}\n","import type { CellRendererParams } from \"../types/params\";\nimport type { CellRendererFn } from \"../types/colDef\";\nimport type { ActionPolicyContext } from \"../types/options\";\nimport type { GridChange } from \"../types/api\";\nimport { DEFAULT_LOCALE } from \"./locale\";\n\nexport type TagVariant = \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n\nexport interface StatusTagConfig {\n variantMap?: Record<string, TagVariant>;\n labelMap?: Record<string, string>;\n}\n\nconst DEFAULT_STATUS_VARIANTS: Array<[RegExp, TagVariant]> = [\n [/^(success|ok|done|complete|completed|normal|active|enabled|启用|正常|完成|已完成|运行|运行中|在线|生效)$/i, \"success\"],\n [/^(warning|warn|hold|pending|standby|待机|待审核|暂停|预警|部分完成)$/i, \"warning\"],\n [/^(error|fail|failed|danger|fault|offline|disabled|故障|失败|错误|异常|停用|离线|断开)$/i, \"danger\"],\n [/^(info|processing|new|draft|进行中|新建|草稿|审批中|同步中)$/i, \"info\"]\n];\n\nexport function resolveTagVariant(value: any, variantMap?: Record<string, TagVariant>): TagVariant {\n const key = String(value ?? \"\");\n if (variantMap) {\n const exact = variantMap[key];\n if (exact) return exact;\n const lower = variantMap[key.toLowerCase()];\n if (lower) return lower;\n }\n for (const [pattern, variant] of DEFAULT_STATUS_VARIANTS) {\n if (pattern.test(key)) return variant;\n }\n return \"neutral\";\n}\n\nexport function createStatusTagRenderer(config: StatusTagConfig = {}): CellRendererFn {\n return (params: CellRendererParams) => {\n if (params.value == null || params.value === \"\") return \"\";\n const variant = resolveTagVariant(params.value, config.variantMap);\n const label = config.labelMap?.[String(params.value)] ?? (params.formatted || String(params.value));\n const tag = document.createElement(\"span\");\n tag.className = `mach-tag mach-tag--${variant}`;\n tag.textContent = label;\n return tag;\n };\n}\n\nexport interface ProgressConfig {\n showValue?: boolean;\n unit?: string;\n color?: string;\n}\n\nexport function createProgressBarRenderer(config: ProgressConfig = {}): CellRendererFn {\n return (params: CellRendererParams) => {\n const raw = Number(params.value);\n if (isNaN(raw)) return params.formatted;\n const pct = Math.max(0, Math.min(100, raw));\n const wrap = document.createElement(\"div\");\n wrap.className = \"mach-progress\";\n const track = document.createElement(\"div\");\n track.className = \"mach-progress__track\";\n const bar = document.createElement(\"div\");\n bar.className = \"mach-progress__bar\";\n bar.style.width = `${pct}%`;\n if (config.color) bar.style.background = config.color;\n track.appendChild(bar);\n wrap.appendChild(track);\n if (config.showValue !== false) {\n const label = document.createElement(\"span\");\n label.className = \"mach-progress__label\";\n label.textContent = `${Math.round(pct)}${config.unit ?? \"%\"}`;\n wrap.appendChild(label);\n }\n return wrap;\n };\n}\n\nexport function linkRenderer(params: CellRendererParams): string | HTMLElement {\n if (params.value == null || params.value === \"\") return \"\";\n const link = document.createElement(\"span\");\n link.className = \"mach-link\";\n link.textContent = params.formatted || String(params.value);\n return link;\n}\n\nconst ICON_PATHS = {\n edit: '<path d=\"M11.5 2.5l2 2L5 13H3v-2l8.5-8.5z\"/>',\n delete: '<path d=\"M3 5h10M6 5V3h4v2M5 5l.7 8h4.6L11 5\"/>',\n view: '<path d=\"M1.5 8s2.4-4.2 6.5-4.2S14.5 8 14.5 8s-2.4 4.2-6.5 4.2S1.5 8 1.5 8z\"/><circle cx=\"8\" cy=\"8\" r=\"1.8\"/>',\n copy: '<rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1\"/><path d=\"M3 11V3h8\"/>',\n download: '<path d=\"M8 2v8m0 0l-3-3m3 3l3-3M2.5 13.5h11\"/>',\n refresh: '<path d=\"M13 3v4h-4M3 13V9h4\"/><path d=\"M13 7a5.5 5.5 0 00-9.7-2.6M3 9a5.5 5.5 0 009.7 2.6\"/>',\n close: '<path d=\"M3.5 3.5l9 9m0-9l-9 9\"/>',\n check: '<path d=\"M2.5 8.5l3.5 3.5 7.5-8\"/>',\n plus: '<path d=\"M8 2.5v11M2.5 8h11\"/>',\n search: '<circle cx=\"7\" cy=\"7\" r=\"4.5\"/><path d=\"M10.5 10.5L14 14\"/>',\n more: '<circle cx=\"3\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"13\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/>'\n} as const;\n\nexport type BuiltInActionIcon = keyof typeof ICON_PATHS;\n\nfunction iconSvg(name: BuiltInActionIcon, size = 14): string {\n const path = ICON_PATHS[name] ?? \"\";\n return `<svg viewBox=\"0 0 16 16\" width=\"${size}\" height=\"${size}\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${path}</svg>`;\n}\n\nexport type ActionVariant = \"default\" | \"primary\" | \"warning\" | \"success\" | \"danger\";\nexport type ActionOverflowMode = \"menu\" | \"drawer\" | \"inline\";\n\nexport interface ActionItem<TData = any> {\n /** Stable identifier used by permission, telemetry and error policies. */\n id?: string;\n icon?: BuiltInActionIcon;\n label?: string;\n title?: string;\n /** Backwards-compatible shorthand for variant=\"danger\". */\n danger?: boolean;\n variant?: ActionVariant;\n show?: (params: CellRendererParams<TData>) => boolean;\n disabled?: boolean | ((params: CellRendererParams<TData>) => boolean);\n loading?: boolean | ((params: CellRendererParams<TData>) => boolean);\n /** One or more UI permissions. Access is resolved by GridOptions.actionPolicy. */\n permission?: string | readonly string[];\n /** Ask for confirmation before running. A string becomes the confirmation message. */\n confirm?: boolean | string | ((params: CellRendererParams<TData>) => boolean | string | Promise<boolean | string>);\n onClick: (params: CellRendererParams<TData>) => unknown | Promise<unknown>;\n}\n\nexport interface ActionButtonsConfig<TData = any> {\n actions: ActionItem<TData>[];\n max?: number;\n /** menu is compact, drawer suits touch/complex actions, inline never renders an ellipsis. */\n overflow?: ActionOverflowMode;\n moreLabel?: string;\n drawerTitle?: string;\n}\n\nexport interface RowActionsConfig<TData = any> extends Omit<ActionButtonsConfig<TData>, \"actions\"> {\n onView?: (params: CellRendererParams<TData>) => unknown | Promise<unknown>;\n onDelete?: (params: CellRendererParams<TData>) => unknown | Promise<unknown>;\n /** Persists the just-validated row. Failures reopen row editing and keep the change dirty. */\n onSave?: (\n params: CellRendererParams<TData>,\n changes: readonly GridChange<TData>[]\n ) => unknown | Promise<unknown>;\n /** Set false when this table has no full-row edit workflow. */\n edit?: boolean;\n extraActions?: ActionItem<TData>[];\n labels?: Partial<Record<\"view\" | \"edit\" | \"delete\" | \"confirm\" | \"save\" | \"cancel\", string>>;\n permissions?: Partial<Record<\"view\" | \"edit\" | \"delete\", string | readonly string[]>>;\n /** Defaults to the translated delete label when true. */\n confirmDelete?: boolean | string | ((params: CellRendererParams<TData>) => boolean | string | Promise<boolean | string>);\n}\n\nlet openActionSurface: HTMLElement | null = null;\nlet openActionAnchor: HTMLElement | null = null;\n\nfunction closeActionSurface(restoreFocus = false): void {\n openActionSurface?.remove();\n openActionSurface = null;\n if (openActionAnchor) {\n openActionAnchor.setAttribute(\"aria-expanded\", \"false\");\n if (restoreFocus && openActionAnchor.isConnected) openActionAnchor.focus({ preventScroll: true });\n }\n openActionAnchor = null;\n document.removeEventListener(\"mousedown\", onActionSurfaceOutside, true);\n document.removeEventListener(\"keydown\", onActionSurfaceKeyDown, true);\n}\n\nfunction onActionSurfaceOutside(event: MouseEvent): void {\n if (\n openActionSurface &&\n !openActionSurface.contains(event.target as Node) &&\n !openActionAnchor?.contains(event.target as Node)\n ) closeActionSurface();\n}\n\nfunction onActionSurfaceKeyDown(event: KeyboardEvent): void {\n if (!openActionSurface) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n closeActionSurface(true);\n return;\n }\n const buttons = [...openActionSurface.querySelectorAll<HTMLButtonElement>(\"button:not(:disabled)\")];\n if (buttons.length === 0) return;\n if (event.key === \"Tab\") {\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if ((!event.shiftKey && current === buttons.length - 1) || (event.shiftKey && current <= 0)) {\n event.preventDefault();\n buttons[event.shiftKey ? buttons.length - 1 : 0].focus();\n }\n return;\n }\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n event.preventDefault();\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n const delta = event.key === \"ArrowDown\" ? 1 : -1;\n buttons[(current + delta + buttons.length) % buttons.length].focus();\n}\n\ninterface SurfaceItem {\n label: string;\n icon?: BuiltInActionIcon;\n variant?: ActionVariant;\n disabled?: boolean;\n pick: (button: HTMLButtonElement) => void;\n}\n\nfunction makeSurfaceButton(item: SurfaceItem, className: string): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = className;\n if (item.variant && item.variant !== \"default\") button.classList.add(`${className}--${item.variant}`);\n button.disabled = item.disabled === true;\n if (item.icon && ICON_PATHS[item.icon]) button.innerHTML = `${iconSvg(item.icon, 16)}<span>${item.label}</span>`;\n else button.textContent = item.label;\n button.addEventListener(\"click\", () => item.pick(button));\n return button;\n}\n\nfunction showActionMenu(anchor: HTMLElement, items: SurfaceItem[]): void {\n closeActionSurface();\n const menu = document.createElement(\"div\");\n menu.className = \"mach-context-menu mach-action-menu\";\n menu.setAttribute(\"role\", \"menu\");\n for (const item of items) {\n const button = makeSurfaceButton(item, \"mach-context-menu-item\");\n button.setAttribute(\"role\", \"menuitem\");\n menu.appendChild(button);\n }\n document.body.appendChild(menu);\n const rect = anchor.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n menu.style.left = `${Math.min(Math.max(8, rect.left), window.innerWidth - menuRect.width - 8)}px`;\n menu.style.top = `${Math.min(rect.bottom + 4, window.innerHeight - menuRect.height - 8)}px`;\n openActionSurface = menu;\n openActionAnchor = anchor;\n anchor.setAttribute(\"aria-expanded\", \"true\");\n document.addEventListener(\"mousedown\", onActionSurfaceOutside, true);\n document.addEventListener(\"keydown\", onActionSurfaceKeyDown, true);\n menu.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")?.focus({ preventScroll: true });\n}\n\nfunction showActionDrawer(anchor: HTMLElement, title: string, items: SurfaceItem[]): void {\n closeActionSurface();\n const backdrop = document.createElement(\"div\");\n backdrop.className = \"mach-action-drawer-backdrop\";\n const drawer = document.createElement(\"section\");\n drawer.className = \"mach-action-drawer\";\n drawer.setAttribute(\"role\", \"dialog\");\n drawer.setAttribute(\"aria-modal\", \"true\");\n drawer.setAttribute(\"aria-label\", title);\n const header = document.createElement(\"header\");\n header.className = \"mach-action-drawer__header\";\n const heading = document.createElement(\"strong\");\n heading.textContent = title;\n const close = document.createElement(\"button\");\n close.type = \"button\";\n close.className = \"mach-action-drawer__close\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.title = \"Close\";\n close.innerHTML = iconSvg(\"close\", 16);\n close.addEventListener(\"click\", () => closeActionSurface(true));\n header.append(heading, close);\n const body = document.createElement(\"div\");\n body.className = \"mach-action-drawer__body\";\n for (const item of items) body.appendChild(makeSurfaceButton(item, \"mach-action-drawer__item\"));\n drawer.append(header, body);\n backdrop.appendChild(drawer);\n backdrop.addEventListener(\"mousedown\", (event) => {\n if (event.target === backdrop) closeActionSurface(true);\n });\n document.body.appendChild(backdrop);\n openActionSurface = backdrop;\n openActionAnchor = anchor;\n anchor.setAttribute(\"aria-expanded\", \"true\");\n document.addEventListener(\"keydown\", onActionSurfaceKeyDown, true);\n drawer.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")?.focus({ preventScroll: true });\n}\n\nfunction resolveActionFlag<TData>(\n flag: boolean | ((params: CellRendererParams<TData>) => boolean) | undefined,\n params: CellRendererParams<TData>\n): boolean {\n if (typeof flag === \"function\") {\n try { return flag(params); } catch { return false; }\n }\n return flag === true;\n}\n\nfunction actionVariant(action: ActionItem): ActionVariant {\n return action.danger ? \"danger\" : (action.variant ?? \"default\");\n}\n\nfunction actionPermissions<TData>(action: ActionItem<TData>): readonly string[] {\n if (!action.permission) return [];\n return typeof action.permission === \"string\" ? [action.permission] : action.permission;\n}\n\nfunction actionContext<TData>(\n action: ActionItem<TData>,\n params: CellRendererParams<TData>,\n message?: string\n): ActionPolicyContext<TData> {\n return {\n ...(action.id ? { actionId: action.id } : {}),\n permissions: actionPermissions(action),\n ...(message ? { message } : {}),\n params\n };\n}\n\nfunction reportActionError<TData>(\n error: unknown,\n action: ActionItem<TData>,\n params: CellRendererParams<TData>\n): void {\n const policy = params.api.getGridOption(\"actionPolicy\");\n try {\n if (policy?.onError) policy.onError(error, actionContext(action, params));\n else console.error(\"[mach-table] action handler failed\", error);\n } catch (policyError) {\n console.error(\"[mach-table] action error policy failed\", policyError, error);\n }\n}\n\nfunction canAccessAction<TData>(action: ActionItem<TData>, params: CellRendererParams<TData>): boolean {\n const permissions = actionPermissions(action);\n if (permissions.length === 0) return true;\n const policy = params.api.getGridOption(\"actionPolicy\");\n if (!policy?.canAccess) return true;\n try {\n return policy.canAccess(actionContext(action, params));\n } catch (error) {\n reportActionError(error, action, params);\n return false;\n }\n}\n\nfunction visibleActions<TData>(actions: readonly ActionItem<TData>[], params: CellRendererParams<TData>): ActionItem<TData>[] {\n return actions.filter((action) => {\n if (!canAccessAction(action, params)) return false;\n if (!action.show) return true;\n try { return action.show(params); } catch { return false; }\n });\n}\n\nexport function createActionButtonsRenderer<TData = any>(config: ActionButtonsConfig<TData>): CellRendererFn {\n const max = Math.max(0, config.max ?? 3);\n const overflowMode = config.overflow ?? \"menu\";\n return (params: CellRendererParams<TData>) => {\n const visible = visibleActions(config.actions, params);\n if (visible.length === 0) return \"\";\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"mach-actions\";\n const shown = overflowMode === \"inline\" ? visible : visible.slice(0, max);\n const overflow = overflowMode === \"inline\" ? [] : visible.slice(max);\n\n const run = (action: ActionItem<TData>, button: HTMLButtonElement): void => {\n if (resolveActionFlag(action.disabled, params)) return;\n button.disabled = true;\n button.classList.add(\"mach-action-btn--loading\");\n const execute = async (): Promise<void> => {\n if (action.confirm != null && action.confirm !== false) {\n const request = typeof action.confirm === \"function\" ? await action.confirm(params) : action.confirm;\n if (request === false) return;\n const message = typeof request === \"string\" ? request : (action.label ?? action.title ?? \"Confirm action\");\n const policy = params.api.getGridOption(\"actionPolicy\");\n const approved = policy?.confirm\n ? await policy.confirm(actionContext(action, params, message))\n : typeof window !== \"undefined\" && typeof window.confirm === \"function\"\n ? window.confirm(message)\n : false;\n if (!approved) return;\n }\n await action.onClick(params);\n };\n void execute().catch((error) => reportActionError(error, action, params)).finally(() => {\n if (!button.isConnected) return;\n button.disabled = resolveActionFlag(action.disabled, params) || resolveActionFlag(action.loading, params);\n button.classList.toggle(\"mach-action-btn--loading\", resolveActionFlag(action.loading, params));\n });\n };\n\n for (const action of shown) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"mach-action-btn\";\n const variant = actionVariant(action);\n if (variant !== \"default\") button.classList.add(`mach-action-btn--${variant}`);\n const title = action.title ?? action.label ?? \"Action\";\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n button.disabled = resolveActionFlag(action.disabled, params);\n if (resolveActionFlag(action.loading, params)) {\n button.disabled = true;\n button.classList.add(\"mach-action-btn--loading\");\n }\n if (action.icon && ICON_PATHS[action.icon]) {\n button.innerHTML = iconSvg(action.icon);\n button.classList.add(\"mach-action-btn--icon\");\n } else {\n button.textContent = action.label ?? title;\n }\n button.addEventListener(\"mousedown\", (event) => event.stopPropagation());\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n run(action, button);\n });\n wrap.appendChild(button);\n }\n\n if (overflow.length > 0) {\n const more = document.createElement(\"button\");\n more.type = \"button\";\n more.className = \"mach-action-btn mach-action-btn--icon\";\n const locale = params.api.getGridOption(\"locale\") ?? {};\n const moreLabel = config.moreLabel ?? locale.actionMore ?? DEFAULT_LOCALE.actionMore;\n more.title = moreLabel;\n more.setAttribute(\"aria-label\", moreLabel);\n more.setAttribute(\"aria-haspopup\", overflowMode === \"drawer\" ? \"dialog\" : \"menu\");\n more.setAttribute(\"aria-expanded\", \"false\");\n more.innerHTML = `${iconSvg(\"more\", 16)}<span class=\"mach-sr-only\">⋯</span>`;\n more.addEventListener(\"mousedown\", (event) => event.stopPropagation());\n more.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n const items = overflow.map((action): SurfaceItem => ({\n label: action.label ?? action.title ?? \"Action\",\n icon: action.icon,\n variant: actionVariant(action),\n disabled: resolveActionFlag(action.disabled, params) || resolveActionFlag(action.loading, params),\n pick: (button) => {\n closeActionSurface();\n run(action, button);\n }\n }));\n if (overflowMode === \"drawer\") showActionDrawer(more, config.drawerTitle ?? moreLabel, items);\n else showActionMenu(more, items);\n });\n wrap.appendChild(more);\n }\n\n return {\n el: wrap,\n destroy: () => {\n if (openActionAnchor && wrap.contains(openActionAnchor)) closeActionSurface();\n }\n };\n };\n}\n\ninterface RowActionLabels {\n view: string;\n edit: string;\n delete: string;\n confirm: string;\n save: string;\n cancel: string;\n}\n\nfunction actionLabel(configured: string | undefined, localized: string | undefined, fallback: string): string {\n return configured ?? localized ?? fallback;\n}\n\nfunction resolveRowActionLabels<TData>(\n config: RowActionsConfig<TData>,\n params: CellRendererParams<TData>\n): RowActionLabels {\n const locale = params.api.getGridOption(\"locale\") ?? {};\n return {\n view: actionLabel(config.labels?.view, locale.actionView, DEFAULT_LOCALE.actionView),\n edit: actionLabel(config.labels?.edit, locale.actionEdit, DEFAULT_LOCALE.actionEdit),\n delete: actionLabel(config.labels?.delete, locale.actionDelete, DEFAULT_LOCALE.actionDelete),\n confirm: actionLabel(config.labels?.confirm, locale.actionConfirm, DEFAULT_LOCALE.actionConfirm),\n save: actionLabel(config.labels?.save, locale.actionSave, DEFAULT_LOCALE.actionSave),\n cancel: actionLabel(config.labels?.cancel, locale.actionCancel, DEFAULT_LOCALE.actionCancel)\n };\n}\n\nfunction renderRowEditingActions<TData>(\n config: RowActionsConfig<TData>,\n params: CellRendererParams<TData>,\n labels: RowActionLabels\n): ReturnType<CellRendererFn> {\n const confirm = async (): Promise<void> => {\n const committed = await params.api.stopEditingRow(false);\n if (!committed || !config.onSave) return;\n const changes = params.api.getChanges().filter((change) => change.rowId === params.node.id);\n try {\n await config.onSave(params, changes);\n params.api.markChangesSaved([params.node.id]);\n } catch (error) {\n params.api.startEditingRow(params.rowIndex);\n throw error;\n }\n };\n const confirmTitle = config.onSave\n ? labels.save\n : (config.labels?.confirm ?? config.labels?.save ?? labels.confirm);\n return createActionButtonsRenderer<TData>({\n actions: [\n { icon: \"check\", title: confirmTitle, variant: \"primary\", onClick: confirm },\n { icon: \"close\", title: labels.cancel, onClick: () => params.api.stopEditingRow(true).then(() => undefined) }\n ],\n overflow: \"inline\"\n })(params);\n}\n\nfunction buildRowActions<TData>(\n config: RowActionsConfig<TData>,\n params: CellRendererParams<TData>,\n labels: RowActionLabels\n): ActionItem<TData>[] {\n const actions: ActionItem<TData>[] = [];\n if (config.onView) actions.push({\n id: \"view\", icon: \"view\", title: labels.view, variant: \"primary\",\n ...(config.permissions?.view ? { permission: config.permissions.view } : {}),\n onClick: config.onView\n });\n if (config.edit !== false) actions.push({\n id: \"edit\", icon: \"edit\", title: labels.edit, variant: \"warning\",\n ...(config.permissions?.edit ? { permission: config.permissions.edit } : {}),\n onClick: () => { params.api.startEditingRow(params.rowIndex); }\n });\n if (config.onDelete) actions.push({\n id: \"delete\", icon: \"delete\", title: labels.delete, variant: \"danger\",\n ...(config.permissions?.delete ? { permission: config.permissions.delete } : {}),\n ...(config.confirmDelete ? { confirm: config.confirmDelete === true ? labels.delete : config.confirmDelete } : {}),\n onClick: config.onDelete\n });\n actions.push(...(config.extraActions ?? []));\n return actions;\n}\n\nexport function createRowActionsRenderer<TData = any>(config: RowActionsConfig<TData> = {}): CellRendererFn {\n return (params: CellRendererParams<TData>) => {\n const labels = resolveRowActionLabels(config, params);\n if (params.api.isRowEditing(params.rowIndex)) return renderRowEditingActions(config, params, labels);\n const actions = buildRowActions(config, params, labels);\n return createActionButtonsRenderer<TData>({\n actions,\n max: config.max,\n overflow: config.overflow ?? \"drawer\",\n moreLabel: config.moreLabel,\n drawerTitle: config.drawerTitle\n })(params);\n };\n}\n\nexport const presetStatusTagRenderer = createStatusTagRenderer();\nexport const presetProgressBarRenderer = createProgressBarRenderer();\n\nexport function registerBuiltinRenderers(register: (name: string, fn: CellRendererFn) => void): void {\n register(\"statusTag\", presetStatusTagRenderer);\n register(\"progressBar\", presetProgressBarRenderer);\n register(\"link\", linkRenderer);\n}\n","import type { CellRendererFn, CellEditorFactory } from \"../types/colDef\";\n\nconst cellRenderers = new Map<string, CellRendererFn>();\nconst cellEditors = new Map<string, CellEditorFactory>();\n\nexport function registerCellRenderer(name: string, renderer: CellRendererFn): () => void {\n const previous = cellRenderers.get(name);\n cellRenderers.set(name, renderer);\n return () => {\n if (cellRenderers.get(name) !== renderer) return;\n if (previous) cellRenderers.set(name, previous);\n else cellRenderers.delete(name);\n };\n}\n\nexport function getCellRenderer(name: string): CellRendererFn | undefined {\n return cellRenderers.get(name);\n}\n\nexport function registerCellEditor(name: string, editor: CellEditorFactory): () => void {\n const previous = cellEditors.get(name);\n cellEditors.set(name, editor);\n return () => {\n if (cellEditors.get(name) !== editor) return;\n if (previous) cellEditors.set(name, previous);\n else cellEditors.delete(name);\n };\n}\n\nexport function getCellEditor(name: string): CellEditorFactory | undefined {\n return cellEditors.get(name);\n}\n\n/** Register a built-in without replacing an application override. */\nexport function ensureCellRenderer(name: string, renderer: CellRendererFn): void {\n if (!cellRenderers.has(name)) cellRenderers.set(name, renderer);\n}\n\nexport function clearComponentRegistries(): void {\n cellRenderers.clear();\n cellEditors.clear();\n}\n","import type { ColDef, ColDefGroup, ColDefOrGroup } from \"../types/colDef\";\nimport { isColDefGroup } from \"../types/colDef\";\nimport { isSafePath } from \"./path\";\n\nexport function validateColumnDefs(defs: (ColDef<any> | ColDefGroup<any>)[] | null | undefined): string[] {\n if (!defs || defs.length === 0) return [];\n const issues: string[] = [];\n const seenIds = new Map<string, number>();\n let leafIndex = 0;\n\n const walk = (list: ColDefOrGroup<any>[], depth: number): void => {\n for (const def of list) {\n if (isColDefGroup(def)) {\n if (!Array.isArray(def.children) || def.children.length === 0) {\n issues.push(`列分组 \"${def.headerName ?? def.groupId ?? \"?\"}\" 的 children 为空`);\n continue;\n }\n walk(def.children, depth + 1);\n continue;\n }\n leafIndex++;\n const id = def.colId ?? def.field ?? `col_${leafIndex}`;\n seenIds.set(id, (seenIds.get(id) ?? 0) + 1);\n\n if (def.field && !isSafePath(def.field)) {\n issues.push(`列 \"${id}\" 的 field 路径不安全或无效,已禁止读取和写入`);\n }\n\n if (!def.field && !def.valueGetter && !def.checkboxSelection && !def.autoRowSpan && !def.rowSpan) {\n issues.push(`列 \"${id}\" 既无 field 也无 valueGetter,将始终显示空值(纯工具列请忽略此提示)`);\n }\n if (def.width != null && def.minWidth != null && def.width < def.minWidth) {\n issues.push(`列 \"${id}\" 的 width(${def.width}) 小于 minWidth(${def.minWidth}),将按 minWidth 渲染`);\n }\n if (def.width != null && def.maxWidth != null && def.width > def.maxWidth) {\n issues.push(`列 \"${id}\" 的 width(${def.width}) 大于 maxWidth(${def.maxWidth}),将按 maxWidth 渲染`);\n }\n }\n };\n\n walk(defs, 0);\n for (const [id, count] of seenIds) {\n if (count > 1) issues.push(`存在 ${count} 个重复的 colId/field \"${id}\",已自动加后缀区分,建议显式命名 colId`);\n }\n return issues;\n}\n","import { GRID_OPTION_KEYS, GRID_OPTION_META } from \"../core/gridOptionMetadata\";\nimport { matchesGridOptionKind } from \"../core/gridOptionRuntime\";\nimport { EVENT_TYPES } from \"../types/events\";\nimport type { GridOptions } from \"../types/options\";\n\nexport type GridValidationCode =\n | \"UNKNOWN_OPTION\"\n | \"INVALID_OPTION_VALUE\"\n | \"OPTION_CONFLICT\"\n | \"MISSING_STABLE_ROW_ID\";\n\nexport interface GridValidationIssue {\n code: GridValidationCode;\n message: string;\n option?: string;\n suggestion?: string;\n}\n\nconst EVENT_OPTION_KEYS = EVENT_TYPES.map((type) => `on${type.charAt(0).toUpperCase()}${type.slice(1)}`);\nconst KNOWN_OPTIONS = new Set<string>([...GRID_OPTION_KEYS, ...EVENT_OPTION_KEYS]);\n\nfunction editDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n let previous = Array.from({ length: b.length + 1 }, (_, index) => index);\n for (let row = 1; row <= a.length; row++) {\n const current = [row];\n for (let column = 1; column <= b.length; column++) {\n current[column] = Math.min(\n current[column - 1] + 1,\n previous[column] + 1,\n previous[column - 1] + (a[row - 1] === b[column - 1] ? 0 : 1)\n );\n }\n previous = current;\n }\n return previous[b.length];\n}\n\nfunction closestOption(input: string): string | undefined {\n let closest: string | undefined;\n let distance = Number.POSITIVE_INFINITY;\n for (const candidate of KNOWN_OPTIONS) {\n const next = editDistance(input.toLowerCase(), candidate.toLowerCase());\n if (next < distance) {\n distance = next;\n closest = candidate;\n }\n }\n const threshold = Math.max(2, Math.floor(input.length * 0.3));\n return distance <= threshold ? closest : undefined;\n}\n\nfunction validateIdentityAndLayout(source: Record<string, unknown>): GridValidationIssue[] {\n const issues: GridValidationIssue[] = [];\n if (source.rowKey != null && typeof source.rowKey !== \"string\" && typeof source.rowKey !== \"function\") {\n issues.push({\n code: \"INVALID_OPTION_VALUE\",\n option: \"rowKey\",\n message: \"rowKey 必须是字段路径或返回稳定业务主键的函数\"\n });\n }\n if (source.domLayout === \"autoHeight\" && source.datasource != null) {\n issues.push({\n code: \"OPTION_CONFLICT\",\n option: \"domLayout\",\n message: \"autoHeight 会渲染全部已加载行,不适用于 datasource 无限滚动模式\"\n });\n }\n if (source.enableColumnResize != null && typeof source.enableColumnResize !== \"boolean\") {\n issues.push({\n code: \"INVALID_OPTION_VALUE\",\n option: \"enableColumnResize\",\n message: \"enableColumnResize 必须是 boolean;未配置时默认关闭\"\n });\n }\n return issues;\n}\n\nfunction hasStableRowId(source: Record<string, unknown>): boolean {\n return typeof source.getRowId === \"function\" || source.rowKey != null;\n}\n\nfunction validateMetadataValues(source: Record<string, unknown>): GridValidationIssue[] {\n const specialised = new Set([\"enableColumnResize\", \"pagination\", \"rowKey\"]);\n const issues: GridValidationIssue[] = [];\n for (const key of GRID_OPTION_KEYS) {\n if (specialised.has(key) || !Object.prototype.hasOwnProperty.call(source, key)) continue;\n const value = source[key];\n const expected = GRID_OPTION_META[key].kind;\n if (matchesGridOptionKind(value, expected)) continue;\n issues.push({\n code: \"INVALID_OPTION_VALUE\",\n option: key,\n message: `${key} 值类型无效,期望 ${expected}`\n });\n }\n return issues;\n}\n\n/** Runtime validation for JavaScript, JSON/schema driven and dynamic options. */\nexport function validateGridOptions(options: Partial<GridOptions<any>> | Record<string, unknown>): GridValidationIssue[] {\n const source = options as Record<string, unknown>;\n const issues: GridValidationIssue[] = [];\n for (const option of Object.keys(source)) {\n if (KNOWN_OPTIONS.has(option)) continue;\n const suggestion = closestOption(option);\n issues.push({\n code: \"UNKNOWN_OPTION\",\n option,\n ...(suggestion ? { suggestion } : {}),\n message: suggestion\n ? `未知 GridOption \"${option}\",是否想使用 \"${suggestion}\"?`\n : `未知 GridOption \"${option}\",该值不会生效`\n });\n }\n\n const pagination = source.pagination;\n if (pagination != null && typeof pagination !== \"boolean\" && typeof pagination !== \"object\") {\n issues.push({ code: \"INVALID_OPTION_VALUE\", option: \"pagination\", message: \"pagination 必须是 boolean 或配置对象\" });\n }\n if (source.datasource != null && pagination !== undefined && pagination !== false) {\n issues.push({\n code: \"OPTION_CONFLICT\",\n option: \"pagination\",\n message: \"datasource 顺序无限模式与 pagination 不能同时启用;普通服务端分页请使用 pagination.mode='server'\"\n });\n }\n if (pagination && typeof pagination === \"object\") {\n const config = pagination as Record<string, unknown>;\n if (config.mode === \"server\" && !hasStableRowId(source)) {\n issues.push({\n code: \"MISSING_STABLE_ROW_ID\",\n option: \"getRowId\",\n message: \"服务端分页建议提供稳定 getRowId,否则跨页选择与增量更新无法可靠保持\"\n });\n }\n if (config.mode === \"server\" && config.total !== undefined && (\n typeof config.total !== \"number\" || !Number.isFinite(config.total) || config.total < 0\n )) {\n issues.push({\n code: \"INVALID_OPTION_VALUE\",\n option: \"pagination.total\",\n message: \"服务端分页 total 必须是非负有限数\"\n });\n }\n }\n if (source.treeData === true && source.masterDetail === true) {\n issues.push({\n code: \"OPTION_CONFLICT\",\n option: \"masterDetail\",\n message: \"treeData 与 masterDetail 不能同时启用,主从明细将被忽略\"\n });\n }\n issues.push(...validateMetadataValues(source));\n issues.push(...validateIdentityAndLayout(source));\n return issues;\n}\n","import type { GridFeature } from \"../types/options\";\n\nexport type GridFeatureIssueCode =\n | \"DUPLICATE_FEATURE\"\n | \"FEATURE_CONFLICT\"\n | \"FEATURE_CYCLE\"\n | \"FEATURE_DEPENDENCY_SETUP_FAILED\"\n | \"INVALID_FEATURE_KEY\"\n | \"MISSING_FEATURE_DEPENDENCY\";\n\nexport interface GridFeatureIssue {\n code: GridFeatureIssueCode;\n feature?: string;\n dependency?: string;\n message: string;\n}\n\nexport interface ResolvedGridFeatures<TData = any> {\n features: GridFeature<TData>[];\n issues: GridFeatureIssue[];\n}\n\nfunction normalizedKeys(values: readonly string[] | undefined): string[] {\n return [...new Set((values ?? []).map((value) => value.trim()).filter(Boolean))];\n}\n\n/**\n * Validates and dependency-orders per-grid features before any setup side effect runs.\n * Invalid features are isolated instead of leaving a partially initialised extension graph.\n */\nexport function resolveGridFeatures<TData>(input: readonly GridFeature<TData>[]): ResolvedGridFeatures<TData> {\n const issues: GridFeatureIssue[] = [];\n const byKey = new Map<string, GridFeature<TData>>();\n for (const feature of input) {\n const key = typeof feature?.key === \"string\" ? feature.key.trim() : \"\";\n if (!key) {\n issues.push({ code: \"INVALID_FEATURE_KEY\", message: \"GridFeature.key must be a non-empty string\" });\n continue;\n }\n if (byKey.has(key)) {\n issues.push({ code: \"DUPLICATE_FEATURE\", feature: key, message: `Duplicate GridFeature key: ${key}` });\n continue;\n }\n byKey.set(key, feature);\n }\n\n const invalid = new Set<string>();\n for (const [key, feature] of byKey) {\n for (const dependency of normalizedKeys(feature.requires)) {\n if (byKey.has(dependency)) continue;\n invalid.add(key);\n issues.push({\n code: \"MISSING_FEATURE_DEPENDENCY\",\n feature: key,\n dependency,\n message: `GridFeature \"${key}\" requires missing feature \"${dependency}\"`\n });\n }\n for (const conflict of normalizedKeys(feature.conflicts)) {\n if (!byKey.has(conflict)) continue;\n invalid.add(key);\n issues.push({\n code: \"FEATURE_CONFLICT\",\n feature: key,\n dependency: conflict,\n message: `GridFeature \"${key}\" conflicts with \"${conflict}\"`\n });\n break;\n }\n }\n\n const ordered: GridFeature<TData>[] = [];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const visit = (key: string): boolean => {\n if (visited.has(key)) return !invalid.has(key);\n if (visiting.has(key)) {\n invalid.add(key);\n issues.push({ code: \"FEATURE_CYCLE\", feature: key, message: `GridFeature dependency cycle includes \"${key}\"` });\n return false;\n }\n const feature = byKey.get(key);\n if (!feature || invalid.has(key)) return false;\n visiting.add(key);\n let valid = true;\n for (const dependency of normalizedKeys(feature.requires)) {\n if (!visit(dependency)) valid = false;\n }\n visiting.delete(key);\n visited.add(key);\n if (!valid) {\n invalid.add(key);\n return false;\n }\n ordered.push(feature);\n return true;\n };\n\n for (const key of byKey.keys()) visit(key);\n return { features: ordered.filter((feature) => !invalid.has(feature.key.trim())), issues };\n}\n","import { EventBus } from \"./eventBus\";\nimport { resolveOptions } from \"./resolveOptions\";\nimport { ColumnModel } from \"../services/columnModel\";\nimport { RowModel } from \"../services/rowModel\";\nimport { SelectionService } from \"../services/selectionService\";\nimport { ResizeService } from \"../services/resizeService\";\nimport { ColumnDragService } from \"../services/columnDragService\";\nimport { KeyboardService } from \"../services/keyboardService\";\nimport { EditingService } from \"../services/editingService\";\nimport { FilterPopupService } from \"../services/filterPopup\";\nimport { ColumnMenuService } from \"../services/columnMenuService\";\nimport { ContextMenuService } from \"../services/contextMenuService\";\nimport { TooltipService } from \"../services/tooltipService\";\nimport { WatermarkService } from \"../services/watermarkService\";\nimport { UndoRedoService } from \"../services/undoRedoService\";\nimport { ChangeTrackingService } from \"../services/changeTrackingService\";\nimport { PerformanceMonitor } from \"../services/performanceMonitor\";\nimport { GridApiImpl } from \"../services/gridApi\";\nimport { GridSkeleton } from \"../render/skeleton\";\nimport { HeaderRenderer } from \"../render/headerRenderer\";\nimport { BodyRenderer } from \"../render/bodyRenderer\";\nimport { SummaryRenderer } from \"../render/summaryRenderer\";\nimport { PaginationBar } from \"../render/paginationBar\";\nimport { PinnedRowsRenderer } from \"../render/pinnedRowsRenderer\";\nimport { StatusBarService } from \"../render/statusBarService\";\nimport { getByPath, setByPath } from \"../lib/path\";\nimport { loadColumnState, saveColumnState } from \"../lib/columnStateStore\";\nimport { loadGridState, saveGridState } from \"../lib/gridStateStore\";\nimport { registerBuiltinRenderers } from \"../lib/presetRenderers\";\nimport {\n ensureCellRenderer,\n getCellEditor,\n getCellRenderer\n} from \"../lib/componentRegistry\";\nimport { validateColumnDefs } from \"../lib/validateDefs\";\nimport { validateGridOptions } from \"../lib/validateOptions\";\nimport { resolveGridFeatures } from \"../lib/featureManifest\";\nimport { toTsv, parseTsv, writeClipboard } from \"../lib/clipboard\";\nimport { formatCellValueWith } from \"../render/cellContent\";\nimport { DEFAULT_LOCALE, type RgLocale, type RgLocaleKey } from \"../lib/locale\";\nimport packageJson from \"../../package.json\";\nimport type { ResolvedGridOptions } from \"../types/options\";\nimport type { GridApi, GridDiagnosticError, GridDiagnostics } from \"../types/api\";\nimport type { GridFeature, GridFeatureContext, GridOptions } from \"../types/options\";\nimport type { Column } from \"../services/column\";\nimport type { RowNode } from \"../types/row\";\nimport type { GridErrorCode, GridEventMap, GridEventType } from \"../types/events\";\nimport type {\n CellEditorFactory,\n CellRendererFn,\n ColumnFilter,\n ColumnState,\n ColDef,\n ColDefGroup\n} from \"../types/colDef\";\n\nconst DATA_SOURCE_ERROR_PREFIXES = [\"datasource\", \"treeData\"] as const;\nconst STATE_ERROR_PREFIXES = [\"columnState.\", \"gridState.\"] as const;\nconst GRID_STATE_CHANGE_EVENTS = new Set<GridEventType>([\n \"selectionChanged\",\n \"sortChanged\",\n \"filterChanged\",\n \"columnMoved\",\n \"columnVisibilityChanged\",\n \"displayedColumnsChanged\",\n \"paginationChanged\",\n \"detailToggled\"\n]);\n\ntype ColumnStateLike = ColumnState;\n\nlet gridUid = 0;\nfunction ensureBuiltinRenderers(): void {\n registerBuiltinRenderers(ensureCellRenderer);\n}\n\nexport class GridCore<TData = any> {\n readonly gridId: number;\n readonly options: ResolvedGridOptions<TData>;\n readonly eventBus: EventBus<GridEventMap<TData>>;\n readonly skeleton: GridSkeleton;\n readonly columnModel: ColumnModel;\n readonly rowModel: RowModel<TData>;\n readonly selectionService: SelectionService;\n readonly headerRenderer: HeaderRenderer;\n readonly bodyRenderer: BodyRenderer;\n readonly resizeService: ResizeService;\n readonly columnDragService: ColumnDragService;\n readonly keyboardService: KeyboardService;\n readonly editingService: EditingService;\n readonly undoService: UndoRedoService;\n readonly changeTracker: ChangeTrackingService<TData>;\n readonly performanceMonitor: PerformanceMonitor;\n readonly filterPopup: FilterPopupService;\n readonly columnMenu: ColumnMenuService;\n readonly contextMenuService: ContextMenuService;\n readonly tooltipService: TooltipService;\n readonly watermarkService: WatermarkService;\n readonly paginationBar: PaginationBar;\n readonly pinnedRowsRenderer: PinnedRowsRenderer;\n readonly summaryRenderer: SummaryRenderer;\n readonly statusBarService: StatusBarService;\n readonly api: GridApi<TData>;\n\n private destroyed = false;\n private autoIdCounter = 0;\n private readyRafId = 0;\n private readySettled = false;\n private readonly readyPromise: Promise<GridApi<TData>>;\n private readonly resolveReady: (api: GridApi<TData>) => void;\n private lastColumnLayoutSignature = \"\";\n private activeFeatures = new Map<string, { feature: GridFeature<TData>; cleanups: Array<() => void> }>();\n private recentErrors: GridDiagnosticError[] = [];\n private stateSaveTimer: ReturnType<typeof setTimeout> | null = null;\n private gridStateLoadToken = 0;\n\n constructor(container: HTMLElement, options: GridOptions<TData>) {\n let settleReady!: (api: GridApi<TData>) => void;\n this.readyPromise = new Promise((resolve) => {\n settleReady = resolve;\n });\n this.resolveReady = settleReady;\n this.gridId = ++gridUid;\n ensureBuiltinRenderers();\n this.options = resolveOptions(options);\n this.eventBus = new EventBus<GridEventMap<TData>>((error, eventType) => {\n if (eventType === \"gridError\") console.error(\"[mach-table] error in gridError listener\", error);\n else this.reportError(error, \"eventBus.listener\", { eventType });\n });\n\n this.columnModel = new ColumnModel(this);\n this.rowModel = new RowModel<TData>(this);\n this.selectionService = new SelectionService(this);\n this.skeleton = new GridSkeleton(this);\n this.headerRenderer = new HeaderRenderer(this);\n this.bodyRenderer = new BodyRenderer(this);\n this.resizeService = new ResizeService(this);\n this.columnDragService = new ColumnDragService(this);\n this.keyboardService = new KeyboardService(this);\n this.editingService = new EditingService(this);\n this.undoService = new UndoRedoService(this);\n this.performanceMonitor = new PerformanceMonitor();\n this.filterPopup = new FilterPopupService(this);\n this.columnMenu = new ColumnMenuService(this);\n this.contextMenuService = new ContextMenuService(this);\n this.tooltipService = new TooltipService(this);\n this.watermarkService = new WatermarkService(this);\n this.paginationBar = new PaginationBar(this);\n this.pinnedRowsRenderer = new PinnedRowsRenderer(this);\n this.summaryRenderer = new SummaryRenderer(this);\n this.statusBarService = new StatusBarService(this);\n this.api = new GridApiImpl<TData>(this);\n this.changeTracker = new ChangeTrackingService<TData>(this);\n\n try {\n this.changeTracker.init();\n this.skeleton.init(container, this.options);\n this.watermarkService.init();\n this.bodyRenderer.init();\n this.keyboardService.init();\n this.tooltipService.init();\n this.paginationBar.init();\n this.summaryRenderer.init();\n this.statusBarService.init();\n this.pinnedRowsRenderer.init();\n\n this.rowModel.restorePagination(this.options.paginationPage, this.options.paginationPageSize);\n this.columnModel.setColumnDefs(this.options.columnDefs);\n this.rowModel.setAdvancedFilterModel(this.options.advancedFilterModel);\n this.rowModel.setQuickFilter(this.options.quickFilterText);\n this.refreshAriaState();\n this.validateDefs(this.options.columnDefs);\n this.checkWarnings(options);\n this.loadPersistedColumnState();\n this.headerRenderer.build();\n if (this.options.datasource) {\n void this.rowModel.startInfinite();\n } else {\n this.rowModel.setRowData(this.options.rowData);\n }\n if (this.options.initialState) this.api.applyState(this.options.initialState, { emitEvents: false });\n this.loadPersistedGridState();\n this.relayout();\n this.pinnedRowsRenderer.setData(this.options.pinnedTopRowData, this.options.pinnedBottomRowData);\n this.setFeatures(this.options.features);\n\n this.readyRafId = requestAnimationFrame(() => {\n this.readyRafId = 0;\n if (!this.destroyed) this.emit(\"gridReady\", {});\n this.settleReady();\n });\n } catch (error) {\n this.reportError(error, \"grid.constructor\");\n this.destroy();\n throw error;\n }\n }\n\n getApi(): GridApi<TData> {\n return this.api;\n }\n\n whenReady(): Promise<GridApi<TData>> {\n return this.readyPromise;\n }\n\n private settleReady(): void {\n if (this.readySettled) return;\n this.readySettled = true;\n this.resolveReady(this.api);\n }\n\n resolveCellRenderer(name: string): CellRendererFn | undefined {\n const local = this.options.components?.cellRenderers?.[name];\n if (local) return local;\n let renderer = getCellRenderer(name);\n if (!renderer) {\n // `clearComponentRegistries` is public for test/HMR isolation; built-ins\n // must remain recoverable for already-created and future grids.\n ensureBuiltinRenderers();\n renderer = getCellRenderer(name);\n }\n return renderer;\n }\n\n resolveCellEditor(name: string): CellEditorFactory | undefined {\n return this.options.components?.cellEditors?.[name] ?? getCellEditor(name);\n }\n\n private inactiveFeatureDependency(feature: GridFeature<TData>): string | undefined {\n return feature.requires\n ?.map((dependency) => dependency.trim())\n .find((dependency) => dependency.length > 0 && !this.activeFeatures.has(dependency));\n }\n\n setFeatures(features: readonly GridFeature<TData>[] | null | undefined): void {\n this.destroyFeatures();\n if (this.destroyed) return;\n const resolved = resolveGridFeatures(features ?? []);\n for (const issue of resolved.issues) {\n this.reportError(new Error(issue.message), \"feature.manifest\", {\n code: issue.code,\n ...(issue.feature ? { key: issue.feature } : {}),\n ...(issue.dependency ? { dependency: issue.dependency } : {})\n });\n }\n\n for (const feature of resolved.features) {\n const key = feature.key.trim();\n const inactiveDependency = this.inactiveFeatureDependency(feature);\n if (inactiveDependency) {\n this.reportError(\n new Error(`GridFeature \"${key}\" dependency \"${inactiveDependency}\" did not initialise`),\n \"feature.manifest\",\n { code: \"FEATURE_DEPENDENCY_SETUP_FAILED\", key, dependency: inactiveDependency }\n );\n continue;\n }\n const cleanups: Array<() => void> = [];\n const manage = (cleanup: () => void): (() => void) => {\n let active = true;\n const once = () => {\n if (!active) return;\n active = false;\n cleanup();\n };\n cleanups.push(once);\n return once;\n };\n const context: GridFeatureContext<TData> = {\n api: this.api,\n root: this.skeleton.root,\n getOptions: () => this.options,\n addEventListener: (type, listener) => manage(this.eventBus.on(type, listener)),\n onCleanup: (cleanup) => { manage(cleanup); },\n addManagedDomListener: (target, type, listener, listenerOptions) => {\n target.addEventListener(type, listener, listenerOptions);\n return manage(() => target.removeEventListener(type, listener, listenerOptions));\n },\n setManagedTimeout: (handler, delayMs) => {\n const id = setTimeout(handler, Math.max(0, delayMs));\n manage(() => clearTimeout(id));\n return id;\n },\n createAbortController: () => {\n const controller = new AbortController();\n manage(() => controller.abort());\n return controller;\n },\n reportError: (error, source, details) => this.reportError(error, `feature.${source}`, details)\n };\n try {\n const cleanup = feature.setup(context);\n if (typeof cleanup === \"function\") manage(cleanup);\n this.activeFeatures.set(key, { feature, cleanups });\n } catch (error) {\n for (const cleanup of cleanups.reverse()) {\n try { cleanup(); } catch (cleanupError) {\n this.reportError(cleanupError, \"feature.cleanup\", { key });\n }\n }\n this.reportError(error, \"feature.setup\", { key });\n }\n }\n }\n\n private destroyFeatures(): void {\n const entries = [...this.activeFeatures.entries()].reverse();\n this.activeFeatures.clear();\n for (const [key, active] of entries) {\n for (const cleanup of active.cleanups.reverse()) {\n try {\n cleanup();\n } catch (error) {\n this.reportError(error, \"feature.cleanup\", { key });\n }\n }\n try {\n active.feature.destroy?.();\n } catch (error) {\n this.reportError(error, \"feature.destroy\", { key });\n }\n }\n }\n\n isDestroyed(): boolean {\n return this.destroyed;\n }\n\n nextId(): number {\n return ++this.autoIdCounter;\n }\n\n getCellValue(node: RowNode<any>, column: Column): any {\n const def = column.colDef;\n if (def.valueGetter) {\n try {\n return def.valueGetter({\n api: this.api,\n colDef: def,\n column,\n node,\n data: node.data\n });\n } catch (error) {\n this.reportError(error, \"valueGetter\", { colId: column.id, rowId: node.id });\n return undefined;\n }\n }\n if (def.field) return getByPath(node.data, def.field);\n return undefined;\n }\n\n getLocaleText(key: RgLocaleKey): string {\n const locale: RgLocale = this.options.locale;\n return locale[key] ?? DEFAULT_LOCALE[key];\n }\n\n writeValue(node: RowNode<any>, column: Column, newValue: any, oldValue?: any): boolean {\n const colDef = column.colDef;\n if (colDef.valueSetter) {\n try {\n return colDef.valueSetter({\n oldValue,\n newValue,\n data: node.data!,\n node,\n colDef,\n column,\n api: this.api\n });\n } catch (error) {\n this.reportError(error, \"valueSetter\", { colId: column.id, rowId: node.id });\n return false;\n }\n }\n if (colDef.field) return setByPath(node.data, colDef.field, newValue);\n return false;\n }\n\n setCellValue(node: RowNode<any>, column: Column, newValue: any, oldValue: any): boolean {\n if (newValue === undefined || newValue === oldValue) return false;\n const colDef = column.colDef;\n\n let changed: boolean;\n if (colDef.valueSetter) {\n try {\n changed = colDef.valueSetter({\n oldValue,\n newValue,\n data: node.data!,\n node,\n colDef,\n column,\n api: this.api\n });\n } catch (error) {\n this.reportError(error, \"valueSetter\", { colId: column.id, rowId: node.id });\n return false;\n }\n } else if (colDef.field) {\n changed = setByPath(node.data, colDef.field, newValue);\n } else {\n return false;\n }\n\n if (changed) this.notifyCellValueChanged(node, column, oldValue, newValue);\n return changed;\n }\n\n /** Emits the shared value-change side effects after a caller has written data transactionally. */\n notifyCellValueChanged(node: RowNode<any>, column: Column, oldValue: any, newValue: any): void {\n this.bodyRenderer.invalidateRowHeight(node);\n this.bodyRenderer.queueFlash([node.rowIndex], [column.id]);\n this.emit(\"cellValueChanged\", {\n oldValue,\n newValue,\n rowNode: node,\n rowIndex: node.rowIndex,\n column,\n colDef: column.colDef,\n data: node.data!\n });\n this.undoService.record({ nodeId: node.id, columnId: column.id, oldValue, newValue });\n }\n\n buildRangeTsv(range: { r1: number; c1: number; r2: number; c2: number }): string {\n const flat = this.columnModel.getOrderedVisible();\n const cols = flat.slice(range.c1, range.c2 + 1);\n const rows: string[][] = [];\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.rowModel.getDisplayedRow(r);\n rows.push(\n cols.map((col) => {\n if (!node || node.isDetail || node.isGroup) return \"\";\n return formatCellValueWith(this, node, col, this.getCellValue(node, col));\n })\n );\n }\n return toTsv(rows);\n }\n\n copyActiveRange(): Promise<boolean> {\n const range = this.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return Promise.resolve(false);\n return writeClipboard(this.buildRangeTsv(range));\n }\n\n clearRangeValues(range: { r1: number; c1: number; r2: number; c2: number }): void {\n if (this.destroyed) return;\n const flat = this.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.undoService.beginBatch();\n try {\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n for (let c = range.c1; c <= range.c2; c++) {\n const col = flat[c];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n if (!this.editingService.isEditable(node, col)) continue;\n const old = this.getCellValue(node, col);\n if (this.setCellValue(node, col, null, old)) changedRows.add(r);\n }\n }\n } finally {\n this.undoService.endBatch();\n }\n if (changedRows.size > 0) {\n this.bodyRenderer.refreshRows([...changedRows]);\n this.summaryRenderer.refresh();\n }\n }\n\n pasteText(text: string, startRow: number, startColIdx: number): void {\n if (this.destroyed) return;\n const grid = parseTsv(text);\n if (grid.length === 0) return;\n const flat = this.columnModel.getOrderedVisible();\n const rowCount = this.rowModel.getDisplayedRowCount();\n const changedRows = new Set<number>();\n let r = startRow;\n\n this.undoService.beginBatch();\n try {\n for (const line of grid) {\n while (r < rowCount) {\n const node = this.rowModel.getDisplayedRow(r);\n if (node && !node.isDetail && !node.isGroup) break;\n r++;\n }\n if (r >= rowCount) break;\n const node = this.rowModel.getDisplayedRow(r)!;\n let c = startColIdx;\n for (const token of line) {\n while (c < flat.length) {\n const skip = flat[c] && (flat[c].hasCheckbox || flat[c].isDetailToggle || flat[c].colDef.rowDrag);\n if (!skip) break;\n c++;\n }\n if (c >= flat.length) break;\n const col = flat[c];\n if (this.editingService.isEditable(node, col)) {\n const old = this.getCellValue(node, col);\n let value: any = token;\n if (token === \"\") {\n value = null;\n } else if (typeof old === \"number\" && !isNaN(Number(token))) {\n value = Number(token);\n }\n if (this.setCellValue(node, col, value, old)) changedRows.add(r);\n }\n c++;\n }\n r++;\n }\n } finally {\n this.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.bodyRenderer.refreshRows([...changedRows]);\n this.summaryRenderer.refresh();\n }\n }\n\n pasteFromSystemClipboard(): Promise<void> {\n const start = this.bodyRenderer.getPasteStart();\n if (!start) return Promise.resolve();\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.readText) {\n return navigator.clipboard\n .readText()\n .then((text) => {\n if (text) this.pasteText(text, start.row, start.colIdx);\n })\n .catch(() => undefined);\n }\n } catch {\n void 0;\n }\n return Promise.resolve();\n }\n\n refreshSummary(): void {\n this.summaryRenderer.refresh();\n }\n\n emit<K extends GridEventType>(type: K, extra?: Partial<GridEventMap<TData>[K]>): GridEventMap<TData>[K] {\n const event = { type, api: this.api, ...extra } as GridEventMap<TData>[K];\n this.eventBus.emit(type, event);\n const handlerKey = (\"on\" + type.charAt(0).toUpperCase() + type.slice(1)) as keyof ResolvedGridOptions<TData>;\n const handler = this.options[handlerKey] as\n | ((event: GridEventMap<TData>[K]) => void)\n | undefined;\n if (typeof handler === \"function\") {\n try {\n handler(event);\n } catch (error) {\n if (type === \"gridError\") console.error(\"[mach-table] error in onGridError\", error);\n else this.reportError(error, `eventHandler.${String(handlerKey)}`, { eventType: type });\n }\n }\n const finishedResize = type === \"columnResized\" && Boolean((event as { finished?: boolean }).finished);\n if (finishedResize || GRID_STATE_CHANGE_EVENTS.has(type)) this.scheduleGridStateSave();\n return event;\n }\n\n reportError(error: unknown, source: string, context?: Record<string, unknown>): void {\n const code = this.errorCodeFor(source, error);\n const message = error instanceof Error ? error.message : String(error);\n this.recentErrors.push({ code, source, message, timestamp: Date.now(), ...(context ? { context } : {}) });\n if (this.recentErrors.length > 50) this.recentErrors.splice(0, this.recentErrors.length - 50);\n console.error(`[mach-table] ${code} (${source})`, error);\n if (this.destroyed) return;\n this.emit(\"gridError\", { code, error, source, context });\n }\n\n private errorCodeFor(source: string, error: unknown): GridErrorCode {\n if (DATA_SOURCE_ERROR_PREFIXES.some((prefix) => source.startsWith(prefix))) return \"DATA_SOURCE_ERROR\";\n const message = error instanceof Error ? error.message : String(error);\n if (source === \"getRowId\" || message.includes(\"Duplicate row id\")) return \"DATA_INTEGRITY_ERROR\";\n if (source === \"validate\") return \"VALIDATION_ERROR\";\n if (\n source.toLowerCase().includes(\"renderer\") ||\n source === \"valueFormatter\" ||\n source === \"cellStyle\" ||\n source === \"cellClass\"\n ) return \"RENDERER_ERROR\";\n if (source.toLowerCase().includes(\"editor\") || source === \"editable\") return \"EDITOR_ERROR\";\n if (source.startsWith(\"feature.\")) return \"FEATURE_ERROR\";\n if (STATE_ERROR_PREFIXES.some((prefix) => source.startsWith(prefix))) return \"STATE_ERROR\";\n if (source.startsWith(\"eventBus.\") || source.startsWith(\"eventHandler.\")) return \"EVENT_HANDLER_ERROR\";\n return \"GRID_ERROR\";\n }\n\n getDiagnostics(): GridDiagnostics {\n return {\n gridId: this.gridId,\n version: packageJson.version,\n destroyed: this.destroyed,\n infinite: this.rowModel.isInfinite,\n loading: this.rowModel.isLoadingInfinite() || this.options.loading,\n rowCount: this.rowModel.getDisplayTotalCount(),\n renderedRowCount: this.skeleton.bodyEl.querySelectorAll(\".mach-row[data-index]\").length,\n columnCount: this.columnModel.getColumns().length,\n selectedRowCount: this.selectionService.getSelectedNodes().length,\n dirtyRowCount: this.changeTracker.getDirtyRowIds().length,\n activeFeatures: [...this.activeFeatures].map(([key, active]) => ({\n key,\n ...(active.feature.version ? { version: active.feature.version } : {})\n })),\n performance: this.performanceMonitor.snapshot(),\n recentErrors: this.recentErrors.map((entry) => ({\n ...entry,\n ...(entry.context ? { context: { ...entry.context } } : {})\n }))\n };\n }\n\n cycleSort(column: Column, additive: boolean): void {\n this.columnModel.cycleSort(column, additive);\n this.applySortModel();\n }\n\n applySortModel(): void {\n this.headerRenderer.refreshSortIndicators();\n this.emit(\"sortChanged\", { sortModel: this.columnModel.getSortModel() });\n this.persistColumnState();\n if (this.rowModel.isInfinite) {\n void this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n applyColumnFilter(column: Column, filter: ColumnFilter | null): void {\n const model = this.rowModel.getFilterModel();\n if (filter) model[column.id] = filter;\n else delete model[column.id];\n this.rowModel.setFilterModel(model);\n this.headerRenderer.refreshFilterIcons();\n this.emit(\"filterChanged\", {\n filterModel: this.rowModel.getFilterModel(),\n advancedFilterModel: this.rowModel.getAdvancedFilterModel()\n });\n if (this.rowModel.isInfinite) {\n void this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n applyQuickFilter(): void {\n this.emit(\"filterChanged\", {\n filterModel: this.rowModel.getFilterModel(),\n advancedFilterModel: this.rowModel.getAdvancedFilterModel()\n });\n if (this.rowModel.isInfinite) {\n void this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n moveColumn(colId: string, toIndex: number): void {\n if (!this.columnModel.moveColumn(colId, toIndex)) return;\n this.onColumnsStructureChanged();\n this.emit(\"columnMoved\", { colId, toIndex });\n this.persistColumnState();\n }\n\n toggleDetail(rowId: string): boolean {\n return this.rowModel.toggleDetail(rowId);\n }\n\n emitColumnResize(column: Column, finished: boolean): void {\n this.emit(\"columnResized\", {\n colId: column.id,\n width: column.currentWidth,\n finished\n });\n }\n\n /** Finalizes one logical resize operation and persists its state once. */\n commitColumnWidths(columns: readonly Column[]): void {\n if (this.destroyed || columns.length === 0) return;\n for (const column of columns) {\n if (this.destroyed) break;\n this.emitColumnResize(column, true);\n }\n this.persistColumnState();\n }\n\n private columnStateLoadToken = 0;\n\n loadPersistedColumnState(): void {\n const token = ++this.columnStateLoadToken;\n if (!this.options.columnStateKey) return;\n let saved: ColumnStateLike[] | null | Promise<ColumnStateLike[] | null>;\n try {\n saved = this.options.columnStateStore\n ? this.options.columnStateStore.load(this.options.columnStateKey)\n : loadColumnState(this.options.columnStateKey);\n } catch (error) {\n this.reportError(error, \"columnState.load\");\n return;\n }\n if (saved == null) return;\n if (!Array.isArray(saved)) {\n Promise.resolve(saved)\n .then((states) => {\n if (this.destroyed || token !== this.columnStateLoadToken || !states || states.length === 0) return;\n this.columnModel.applyColumnState(states);\n if (this.rowModel.isInfinite) void this.rowModel.onServerParamsChanged();\n else this.rowModel.refreshPipeline();\n this.onColumnsStructureChanged();\n })\n .catch((error) => this.reportError(error, \"columnState.load\"));\n return;\n }\n if (saved.length > 0) {\n this.columnModel.applyColumnState(saved);\n }\n }\n\n persistColumnState(): void {\n if (!this.options.columnStateKey || this.destroyed) return;\n const state = this.columnModel.getColumnState();\n try {\n const result = this.options.columnStateStore\n ? this.options.columnStateStore.save(this.options.columnStateKey, state)\n : saveColumnState(this.options.columnStateKey, state);\n if (result && typeof result.catch === \"function\") {\n void result.catch((error) => this.reportError(error, \"columnState.save\"));\n }\n } catch (error) {\n this.reportError(error, \"columnState.save\");\n }\n }\n\n loadPersistedGridState(): void {\n const token = ++this.gridStateLoadToken;\n const key = this.options.stateKey;\n if (!key) return;\n let saved: import(\"../types/state\").GridStateInput | null | Promise<import(\"../types/state\").GridStateInput | null>;\n try {\n saved = this.options.stateStore ? this.options.stateStore.load(key) : loadGridState(key);\n } catch (error) {\n this.reportError(error, \"gridState.load\");\n return;\n }\n const apply = (state: import(\"../types/state\").GridStateInput | null): void => {\n if (this.destroyed || token !== this.gridStateLoadToken || !state) return;\n this.api.applyState(state, { emitEvents: false });\n };\n if (saved && typeof (saved as Promise<unknown>).then === \"function\") {\n void Promise.resolve(saved).then(apply).catch((error) => this.reportError(error, \"gridState.load\"));\n } else {\n apply(saved as import(\"../types/state\").GridStateInput | null);\n }\n }\n\n scheduleGridStateSave(): void {\n if (!this.options.stateKey || this.destroyed) return;\n if (this.stateSaveTimer) clearTimeout(this.stateSaveTimer);\n this.stateSaveTimer = setTimeout(() => {\n this.stateSaveTimer = null;\n this.persistGridState();\n }, this.options.stateSaveDebounceMs);\n }\n\n persistGridState(): void {\n const key = this.options.stateKey;\n if (!key || this.destroyed) return;\n try {\n const result = this.options.stateStore\n ? this.options.stateStore.save(key, this.api.getState())\n : saveGridState(key, this.api.getState());\n if (result && typeof result.catch === \"function\") {\n void result.catch((error) => this.reportError(error, \"gridState.save\"));\n }\n } catch (error) {\n this.reportError(error, \"gridState.save\");\n }\n }\n\n buildDefaultErrorState(): HTMLElement {\n const error = document.createElement(\"div\");\n error.className = \"mach-empty mach-empty--error\";\n const title = document.createElement(\"div\");\n title.className = \"mach-empty__title\";\n title.textContent = this.getLocaleText(\"requestFailed\");\n const hint = document.createElement(\"div\");\n hint.className = \"mach-empty__hint\";\n hint.textContent = this.getLocaleText(\"requestFailedHint\");\n error.append(title, hint);\n return error;\n }\n\n buildDefaultEmptyState(): HTMLElement {\n const locale = this.options.locale ?? {};\n const title = locale.emptyRows ?? DEFAULT_LOCALE.emptyRows;\n const hint = locale.emptyRowsHint ?? DEFAULT_LOCALE.emptyRowsHint;\n const empty = document.createElement(\"div\");\n empty.className = \"mach-empty\";\n\n const icon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n icon.setAttribute(\"class\", \"mach-empty__icon\");\n icon.setAttribute(\"viewBox\", \"0 0 96 84\");\n icon.setAttribute(\"width\", \"96\");\n icon.setAttribute(\"height\", \"84\");\n icon.setAttribute(\"fill\", \"none\");\n icon.setAttribute(\"aria-hidden\", \"true\");\n // Static library-owned SVG only; user-controlled text is assigned via textContent below.\n icon.innerHTML =\n '<rect x=\"8\" y=\"10\" width=\"68\" height=\"56\" rx=\"6\" fill=\"#eaf3fe\"/>' +\n '<rect x=\"8\" y=\"10\" width=\"68\" height=\"12\" rx=\"6\" fill=\"#d5e8fd\"/>' +\n '<rect x=\"8\" y=\"19\" width=\"68\" height=\"3\" fill=\"#d5e8fd\"/>' +\n '<g stroke=\"#bcd7f8\" stroke-width=\"2.4\" stroke-linecap=\"round\">' +\n '<line x1=\"16\" y1=\"32\" x2=\"68\" y2=\"32\"/><line x1=\"16\" y1=\"42\" x2=\"60\" y2=\"42\"/>' +\n '<line x1=\"16\" y1=\"52\" x2=\"64\" y2=\"52\"/></g>' +\n '<circle cx=\"66\" cy=\"52\" r=\"15\" fill=\"#ffffff\" stroke=\"#8fbdf5\" stroke-width=\"3\"/>' +\n '<line x1=\"77\" y1=\"63\" x2=\"86\" y2=\"72\" stroke=\"#8fbdf5\" stroke-width=\"4\" stroke-linecap=\"round\"/>' +\n '<line x1=\"60\" y1=\"52\" x2=\"72\" y2=\"52\" stroke=\"#bcd7f8\" stroke-width=\"2.6\" stroke-linecap=\"round\"/>';\n\n const titleEl = document.createElement(\"div\");\n titleEl.className = \"mach-empty__title\";\n titleEl.textContent = title;\n const hintEl = document.createElement(\"div\");\n hintEl.className = \"mach-empty__hint\";\n hintEl.textContent = hint;\n empty.append(icon, titleEl, hintEl);\n return empty;\n }\n\n private lastValidatedDefs: unknown = null;\n private issuedWarningSignatures = new Set<string>();\n\n checkWarnings(inputOptions?: Partial<GridOptions<any>> | Record<string, unknown>): void {\n if (this.options.suppressWarnings || this.destroyed) return;\n if (inputOptions) {\n for (const issue of validateGridOptions(inputOptions)) {\n const signature = `${issue.code}:${issue.option ?? \"\"}:${issue.message}`;\n if (this.issuedWarningSignatures.has(signature)) continue;\n this.issuedWarningSignatures.add(signature);\n console.warn(`[mach-table:${issue.code}] ${issue.message}`);\n }\n }\n if (this.options.treeData) {\n if (this.columnModel.getRowGroupColumns().length > 0) {\n console.warn(\"[mach-table] treeData 与 rowGroup 不支持同时启用,行分组已被忽略\");\n }\n }\n }\n\n validateDefs(defs: (ColDef<any> | ColDefGroup<any>)[] | null | undefined): void {\n if (this.options.suppressWarnings || this.destroyed) return;\n if (this.lastValidatedDefs === defs) return;\n this.lastValidatedDefs = defs;\n for (const issue of validateColumnDefs(defs)) {\n if (this.issuedWarningSignatures.has(issue)) continue;\n this.issuedWarningSignatures.add(issue);\n console.warn(`[mach-table] ${issue}`);\n }\n }\n\n onColumnsStructureChanged(): void {\n this.checkWarnings();\n this.validateDefs(this.columnModel.getColumnDefs());\n this.bodyRenderer.invalidateAllRowHeights();\n this.headerRenderer.build();\n this.bodyRenderer.rebuildPool();\n this.relayout();\n this.pinnedRowsRenderer.rebuild();\n this.summaryRenderer.refresh();\n this.emit(\"displayedColumnsChanged\", {});\n }\n\n relayout(): void {\n if (this.destroyed) return;\n this.refreshAriaState();\n this.columnModel.computeLayout(this.skeleton.measureViewportWidth());\n const widthSignature = this.columnModel.getOrderedVisible()\n .map((column) => `${column.id}:${column.currentWidth}`)\n .join(\"|\");\n if (this.lastColumnLayoutSignature && widthSignature !== this.lastColumnLayoutSignature) {\n this.bodyRenderer.invalidateAllRowHeights();\n }\n this.lastColumnLayoutSignature = widthSignature;\n this.skeleton.root.setAttribute(\"aria-colcount\", String(this.columnModel.getOrderedVisible().length));\n this.headerRenderer.applyLayout();\n this.bodyRenderer.relayout();\n this.pinnedRowsRenderer.applyLayout();\n this.summaryRenderer.refresh();\n }\n\n refreshAriaState(): void {\n if (!this.skeleton.root) return;\n const treeGrid = this.options.treeData || this.columnModel.getRowGroupColumns().length > 0;\n this.skeleton.root.setAttribute(\"role\", treeGrid ? \"treegrid\" : \"grid\");\n if (this.options.rowSelection === \"multiple\") {\n this.skeleton.root.setAttribute(\"aria-multiselectable\", \"true\");\n } else {\n this.skeleton.root.removeAttribute(\"aria-multiselectable\");\n }\n const editable = this.columnModel.getOrderedVisible().some((column) => Boolean(column.colDef.editable));\n if (editable) this.skeleton.root.removeAttribute(\"aria-readonly\");\n else this.skeleton.root.setAttribute(\"aria-readonly\", \"true\");\n }\n\n relayoutColumns(invalidateRowHeights = true): void {\n if (this.destroyed) return;\n this.columnModel.computeLayout(this.skeleton.measureViewportWidth());\n if (invalidateRowHeights) this.bodyRenderer.invalidateAllRowHeights();\n this.headerRenderer.applyLayout();\n this.bodyRenderer.applyContainerSizes();\n this.bodyRenderer.applyCellLayout();\n this.bodyRenderer.updateRange(true);\n this.pinnedRowsRenderer.applyLayout();\n this.summaryRenderer.refresh();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n if (this.stateSaveTimer) {\n clearTimeout(this.stateSaveTimer);\n this.stateSaveTimer = null;\n this.persistGridState();\n }\n this.destroyed = true;\n if (this.readyRafId) cancelAnimationFrame(this.readyRafId);\n this.readyRafId = 0;\n this.settleReady();\n const safely = (source: string, fn: () => void): void => {\n try {\n fn();\n } catch (error) {\n console.error(`[mach-table] ${source} destroy error`, error);\n }\n };\n safely(\"grid event\", () => this.emit(\"gridDestroyed\", {}));\n safely(\"features\", () => this.destroyFeatures());\n safely(\"changeTracker\", () => this.changeTracker.destroy());\n safely(\"rowModel\", () => this.rowModel.destroy());\n safely(\"editingService\", () => this.editingService.destroy());\n safely(\"keyboardService\", () => this.keyboardService.destroy());\n safely(\"filterPopup\", () => this.filterPopup.destroy());\n safely(\"columnMenu\", () => this.columnMenu.destroy());\n safely(\"contextMenu\", () => this.contextMenuService.destroy());\n safely(\"tooltip\", () => this.tooltipService.destroy());\n safely(\"watermark\", () => this.watermarkService.destroy());\n safely(\"pagination\", () => this.paginationBar.destroy());\n safely(\"columnDrag\", () => this.columnDragService.destroy());\n safely(\"resize\", () => this.resizeService.destroy());\n safely(\"bodyRenderer\", () => this.bodyRenderer.destroy());\n safely(\"headerRenderer\", () => this.headerRenderer.destroy());\n safely(\"pinnedRowsRenderer\", () => this.pinnedRowsRenderer.destroy());\n safely(\"summaryRenderer\", () => this.summaryRenderer.destroy());\n safely(\"statusBar\", () => this.statusBarService.destroy());\n safely(\"skeleton\", () => this.skeleton.destroy());\n this.eventBus.clear();\n }\n}\n","import { GridCore } from \"./gridCore\";\nimport type { GridApi, GridOptions } from \"../types\";\n\nexport function createGrid<TData = any>(container: HTMLElement, options: GridOptions<TData> = {}): GridApi<TData> {\n if (!container) {\n throw new Error(\"[mach-table] createGrid requires a container element\");\n }\n if (typeof document === \"undefined\") {\n throw new Error(\"[mach-table] createGrid can only be used in a browser environment\");\n }\n const core = new GridCore<TData>(container, options);\n return core.getApi();\n}\n","import type { ColDef, ColDefGroup } from \"../types/colDef\";\n\nexport type GridSchemaFieldType = \"string\" | \"number\" | \"date\" | \"select\" | \"boolean\";\n\nexport interface SchemaSelectOption {\n label: string;\n value: string | number;\n}\n\nexport interface GridSchemaField {\n field: string;\n title?: string;\n type?: GridSchemaFieldType;\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n pinned?: \"left\" | \"right\";\n editable?: boolean;\n sortable?: boolean;\n filterable?: boolean;\n resizable?: boolean;\n hidden?: boolean;\n options?: SchemaSelectOption[];\n format?: \"date\" | \"datetime\";\n cellClass?: string | string[];\n}\n\nexport interface GridSchemaGroup {\n title: string;\n fields: string[];\n}\n\nexport interface GridSchema {\n fields: GridSchemaField[];\n groups?: GridSchemaGroup[];\n}\n\nfunction booleanFormatter(p: { value: any }): string {\n if (p.value === true) return \"是\";\n if (p.value === false) return \"否\";\n return \"\";\n}\n\nfunction dateFormatter(format: \"date\" | \"datetime\" | undefined): (p: { value: any }) => string {\n return (p) => {\n if (p.value == null || p.value === \"\") return \"\";\n const text = p.value instanceof Date ? p.value.toISOString() : String(p.value);\n return format === \"datetime\" ? text.slice(0, 16).replace(\"T\", \" \") : text.slice(0, 10);\n };\n}\n\nfunction selectFormatter(options: SchemaSelectOption[]): (p: { value: any }) => string {\n return (p) => {\n if (p.value == null) return \"\";\n const hit = options.find((o) => o.value === p.value);\n return hit ? hit.label : String(p.value);\n };\n}\n\nfunction fieldToColDef(field: GridSchemaField): ColDef<any> {\n const type = field.type ?? \"string\";\n const colDef: ColDef<any> = {\n colId: field.field,\n field: field.field,\n headerName: field.title ?? field.field,\n width: field.width,\n minWidth: field.minWidth,\n maxWidth: field.maxWidth,\n flex: field.flex,\n pinned: field.pinned ?? undefined,\n hide: field.hidden ?? false,\n editable: field.editable ?? false,\n sortable: field.sortable ?? true,\n resizable: field.resizable ?? true,\n filter: field.filterable === false ? false : type === \"number\" ? \"number\" : type === \"date\" ? \"date\" : type === \"select\" ? \"set\" : \"text\",\n cellClass: field.cellClass\n };\n\n if (type === \"number\") {\n colDef.type = \"rightAligned\";\n } else if (type === \"date\") {\n colDef.valueFormatter = dateFormatter(field.format);\n } else if (type === \"boolean\") {\n colDef.valueFormatter = booleanFormatter;\n colDef.filter = field.filterable === false ? false : \"set\";\n } else if (type === \"select\") {\n const options = field.options ?? [];\n colDef.valueFormatter = selectFormatter(options);\n if (field.editable) {\n colDef.cellEditor = \"select\";\n colDef.cellEditorParams = { values: options.map((o) => o.value) };\n }\n }\n\n return colDef;\n}\n\nexport function buildColDefsFromSchema<TData = any>(\n schema: GridSchema\n): (ColDef<TData> | ColDefGroup<TData>)[] {\n const byField = new Map(schema.fields.map((f) => [f.field, f]));\n const used = new Set<string>();\n const result: (ColDef<TData> | ColDefGroup<TData>)[] = [];\n\n for (const field of schema.fields) {\n if (used.has(field.field)) continue;\n const grouped = (schema.groups ?? []).some((g) => g.fields.includes(field.field));\n if (!grouped) {\n result.push(fieldToColDef(field));\n used.add(field.field);\n }\n }\n\n for (const group of schema.groups ?? []) {\n const children: ColDef<TData>[] = [];\n for (const fieldName of group.fields) {\n const field = byField.get(fieldName);\n if (!field || used.has(fieldName)) continue;\n children.push(fieldToColDef(field));\n used.add(fieldName);\n }\n if (children.length > 0) {\n result.push({ headerName: group.title, children });\n }\n }\n\n return result;\n}\n","import type { GridApi } from \"../types/api\";\nimport type { GridSize } from \"../types/options\";\nimport { downloadFile } from \"./download\";\n\nexport interface MachTableCommandOptions<TData = any> {\n getApi(): GridApi<TData> | null;\n /** Overrides refresh for remote-query workflows. */\n reload?: () => void | Promise<void>;\n /** Fullscreen target. Defaults to the grid root's parent when available. */\n getFullscreenElement?: () => HTMLElement | null;\n}\n\nexport interface MachTableCommands {\n search(text: string | null | undefined): void;\n refresh(): Promise<void>;\n openColumns(anchor?: HTMLElement): void;\n setDensity(size: GridSize): void;\n resetColumns(): void;\n undo(): boolean;\n redo(): boolean;\n canUndo(): boolean;\n canRedo(): boolean;\n exportCsv(filename?: string): boolean;\n toggleFullscreen(): Promise<boolean>;\n}\n\nfunction available<TData>(getApi: () => GridApi<TData> | null): GridApi<TData> | null {\n const api = getApi();\n return api && !api.isDestroyed() ? api : null;\n}\n\n/** Framework-neutral command surface used by Vue/React controllers and toolbars. */\nexport function createMachTableCommands<TData = any>(options: MachTableCommandOptions<TData>): MachTableCommands {\n const getApi = (): GridApi<TData> | null => options.getApi();\n return {\n search(text) {\n available(getApi)?.setQuickFilter(text);\n },\n async refresh() {\n if (options.reload) {\n await options.reload();\n return;\n }\n const api = available(getApi);\n if (!api) return;\n if (api.isInfinite()) await api.reload();\n else api.refreshCells();\n },\n openColumns(anchor) {\n available(getApi)?.openColumnWorkbench(anchor);\n },\n setDensity(size) {\n available(getApi)?.setGridOption(\"size\", size);\n },\n resetColumns() {\n available(getApi)?.resetColumnState();\n },\n undo() {\n return available(getApi)?.undo() ?? false;\n },\n redo() {\n return available(getApi)?.redo() ?? false;\n },\n canUndo() {\n return available(getApi)?.canUndo() ?? false;\n },\n canRedo() {\n return available(getApi)?.canRedo() ?? false;\n },\n exportCsv(filename = \"mach-table.csv\") {\n const api = available(getApi);\n return api ? downloadFile(filename, api.getDataAsCsv({ prependBOM: true }), \"text/csv;charset=utf-8\") : false;\n },\n async toggleFullscreen() {\n if (typeof document === \"undefined\") return false;\n if (document.fullscreenElement) {\n await document.exitFullscreen?.();\n return false;\n }\n const api = available(getApi);\n const root = api?.getRootElement();\n const target = options.getFullscreenElement?.() ?? root?.parentElement ?? root;\n if (!target?.requestFullscreen) return false;\n await target.requestFullscreen();\n return true;\n }\n };\n}\n","import type { ColDef } from \"../types/colDef\";\nimport type { ActionButtonsConfig, RowActionsConfig } from \"./presetRenderers\";\nimport { createActionButtonsRenderer, createRowActionsRenderer } from \"./presetRenderers\";\n\nconst NO_INTERACT = {\n sortable: false,\n resizable: false,\n movable: false,\n filter: false,\n suppressSizeToFit: true\n} as const;\n\nexport function selectionColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"sel\",\n headerName: \"\",\n width: 46,\n pinned: \"left\",\n checkboxSelection: true,\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function indexColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"idx\",\n headerName: \"#\",\n type: \"index\",\n width: 60,\n pinned: \"left\",\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function dragColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"drag\",\n headerName: \"\",\n rowDrag: true,\n width: 40,\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function actionsColumn<TData = any>(\n config: ActionButtonsConfig<TData> & { width?: number; pinned?: \"left\" | \"right\" } = { actions: [] }\n): ColDef<TData> {\n const { width, pinned, ...rendererConfig } = config;\n const count = rendererConfig.actions?.length ?? 0;\n const shown = rendererConfig.overflow === \"inline\" ? count : Math.min(count, rendererConfig.max ?? 3);\n const hasMore = rendererConfig.overflow !== \"inline\" && count > shown;\n const defaultWidth = Math.max(1, shown) * 26 + (hasMore ? 26 : 0) + 10;\n return {\n colId: \"op\",\n headerName: \"操作\",\n width: width ?? Math.max(64, defaultWidth),\n pinned: pinned ?? \"right\",\n cellRenderer: createActionButtonsRenderer(rendererConfig),\n ...NO_INTERACT,\n cellRendererParams: undefined\n };\n}\n\nexport function rowActionsColumn<TData = any>(\n config: RowActionsConfig<TData> & { width?: number; pinned?: \"left\" | \"right\" } = {}\n): ColDef<TData> {\n const { width, pinned, ...rendererConfig } = config;\n const count =\n (rendererConfig.onView ? 1 : 0) +\n (rendererConfig.edit === false ? 0 : 1) +\n (rendererConfig.onDelete ? 1 : 0) +\n (rendererConfig.extraActions?.length ?? 0);\n const shown = rendererConfig.overflow === \"inline\" ? count : Math.min(count, rendererConfig.max ?? 3);\n const hasMore = rendererConfig.overflow !== \"inline\" && count > shown;\n const defaultWidth = Math.max(2, shown) * 26 + (hasMore ? 26 : 0) + 10;\n return {\n colId: \"op\",\n headerName: \"操作\",\n width: width ?? Math.max(72, defaultWidth),\n pinned: pinned ?? \"right\",\n cellRenderer: createRowActionsRenderer(rendererConfig),\n ...NO_INTERACT,\n cellRendererParams: undefined\n };\n}\n","import type { ColDef, ColDefGroup } from \"../types/colDef\";\nimport type { FieldPath, FieldPathValue } from \"../types/path\";\n\nexport type { FieldPath, FieldPathValue } from \"../types/path\";\n\nexport interface ColumnHelper<TData> {\n accessor<TPath extends FieldPath<TData>>(\n field: TPath,\n definition?: Omit<ColDef<TData, FieldPathValue<TData, TPath>>, \"field\">\n ): ColDef<TData, FieldPathValue<TData, TPath>>;\n display<TValue = unknown>(\n definition: Omit<ColDef<TData, TValue>, \"field\"> & Required<Pick<ColDef<TData, TValue>, \"colId\">>\n ): ColDef<TData, TValue>;\n group(definition: ColDefGroup<TData>): ColDefGroup<TData>;\n}\n\n/** Creates strongly typed column definitions without repeating TData/TValue. */\nexport function createColumnHelper<TData>(): ColumnHelper<TData> {\n return {\n accessor: (field, definition = {}) => ({ ...definition, field }),\n display: (definition) => ({ ...definition }),\n group: (definition) => ({ ...definition, children: [...definition.children] })\n };\n}\n\n/** Identity helper that retains literal types while checking GridOptions elsewhere. */\nexport function defineColumns<TData>(columns: readonly (ColDef<TData> | ColDefGroup<TData>)[]): (ColDef<TData> | ColDefGroup<TData>)[] {\n return [...columns];\n}\n","import type { GridOptions } from \"../types/options\";\n\nfunction mergeSwitchableObject<T extends object>(\n base: boolean | T | undefined,\n next: boolean | T | undefined\n): boolean | T | undefined {\n if (next === undefined) return base;\n if (typeof next !== \"object\" || next === null || typeof base !== \"object\" || base === null) return next;\n return { ...base, ...next };\n}\n\nfunction composeHandlers(base: unknown, next: unknown): unknown {\n if (typeof base !== \"function\") return next;\n if (typeof next !== \"function\") return base;\n return (...args: unknown[]) => {\n let firstError: unknown;\n try {\n base(...args);\n } catch (error) {\n firstError = error;\n }\n try {\n next(...args);\n } catch (error) {\n firstError ??= error;\n }\n if (firstError !== undefined) throw firstError;\n };\n}\n\nfunction mergeOptions<TData>(base: GridOptions<TData>, next: Partial<GridOptions<TData>>): GridOptions<TData> {\n const merged: GridOptions<TData> = {\n ...base,\n ...next,\n features: next.features ?? base.features\n };\n if (base.defaultColDef || next.defaultColDef) {\n merged.defaultColDef = { ...base.defaultColDef, ...next.defaultColDef };\n }\n if (base.locale || next.locale) {\n merged.locale = { ...base.locale, ...next.locale };\n }\n if (base.components || next.components) {\n merged.components = {\n cellRenderers: { ...base.components?.cellRenderers, ...next.components?.cellRenderers },\n cellEditors: { ...base.components?.cellEditors, ...next.components?.cellEditors }\n };\n }\n if (base.columnTypes || next.columnTypes) {\n const columnTypes: Record<string, Record<string, unknown>> = {};\n for (const name of new Set([...Object.keys(base.columnTypes ?? {}), ...Object.keys(next.columnTypes ?? {})])) {\n columnTypes[name] = {\n ...(base.columnTypes?.[name] as Record<string, unknown> | undefined),\n ...(next.columnTypes?.[name] as Record<string, unknown> | undefined)\n };\n }\n merged.columnTypes = columnTypes;\n }\n if (base.aggFuncs || next.aggFuncs) {\n merged.aggFuncs = { ...base.aggFuncs, ...next.aggFuncs };\n }\n merged.pagination = mergeSwitchableObject(base.pagination, next.pagination);\n merged.statusBar = mergeSwitchableObject(base.statusBar, next.statusBar);\n merged.watermark = mergeSwitchableObject(base.watermark, next.watermark);\n\n for (const key of new Set([...Object.keys(base), ...Object.keys(next)])) {\n if (!/^on[A-Z]/.test(key)) continue;\n const previousHandler = (base as Record<string, unknown>)[key];\n const nextHandler = (next as Record<string, unknown>)[key];\n if (typeof previousHandler === \"function\" && typeof nextHandler === \"function\") {\n (merged as Record<string, unknown>)[key] = composeHandlers(previousHandler, nextHandler);\n }\n }\n return merged;\n}\n\n/** Merges reusable defaults left-to-right with nested defaults handled safely. */\nexport function createMachTablePreset<TData>(\n ...sources: readonly Partial<GridOptions<TData>>[]\n): GridOptions<TData> {\n return sources.reduce<GridOptions<TData>>(mergeOptions, {});\n}\n\n/** Recommended defaults for editable enterprise back-office screens. */\nexport function createEnterprisePreset<TData>(\n overrides: Partial<GridOptions<TData>> = {}\n): GridOptions<TData> {\n return createMachTablePreset<TData>({\n defaultColDef: { sortable: true, resizable: true, movable: true, filter: true },\n enableColumnResize: true,\n rowSelection: \"multiple\",\n columnMenu: true,\n contextMenu: true,\n enableRangeSelection: true,\n fillHandle: true,\n statusBar: true,\n stripedRows: true\n }, overrides);\n}\n\n/** Compile-time helper for a reusable partial preset. */\nexport function defineMachTablePreset<TData>(\n preset: Partial<GridOptions<TData>>\n): Partial<GridOptions<TData>> {\n return preset;\n}\n\n/** Compile-time helper for reusable, typed grid option objects. */\nexport function defineGridOptions<TData>(options: GridOptions<TData>): GridOptions<TData> {\n return options;\n}\n","import { createMachTablePreset } from \"./presets\";\nimport type { ColDef } from \"../types/colDef\";\nimport type { GridComponents, GridOptions } from \"../types/options\";\n\nexport type MachTablePresetSelection = string | readonly string[] | false | null;\n\nexport interface MachTableConfigWarning {\n code: \"UNKNOWN_PRESET\";\n message: string;\n preset?: string;\n}\n\nexport interface MachTableRuntimeConfig {\n /** Defaults inherited by every table in this application or subtree. */\n defaults?: Partial<GridOptions<any>>;\n /** Application-wide semantic column types. Kept separate for config readability. */\n columnTypes?: Readonly<Record<string, Partial<ColDef<any>>>>;\n /** Application-wide renderer/editor registry. Per-table components can override it. */\n components?: GridComponents;\n /** Named, reusable behavior profiles such as `list`, `crud` or `picker`. */\n presets?: Readonly<Record<string, Partial<GridOptions<any>>>>;\n /** Preset used when a table does not declare its own preset. Set false to disable. */\n defaultPreset?: MachTablePresetSelection;\n onConfigWarning?: (warning: MachTableConfigWarning) => void;\n}\n\nexport interface ResolvedMachTableConfig {\n readonly defaults: Partial<GridOptions<any>>;\n readonly presets: Readonly<Record<string, Partial<GridOptions<any>>>>;\n readonly defaultPreset: MachTablePresetSelection;\n readonly onConfigWarning?: (warning: MachTableConfigWarning) => void;\n}\n\nexport interface MachTableOptionExplanation {\n readonly key: keyof GridOptions<any> | string;\n readonly value: unknown;\n readonly source: string;\n readonly layers: readonly { name: string; value: unknown }[];\n}\n\nexport interface ResolvedMachTableGridOptions<TData = any> {\n readonly options: GridOptions<TData>;\n explain(key: keyof GridOptions<TData> | string): MachTableOptionExplanation;\n}\n\n/** Type-checks a dedicated `mach-table.config.ts` without runtime work. */\nexport function defineMachTableConfig<const TConfig extends MachTableRuntimeConfig>(config: TConfig): TConfig {\n return config;\n}\n\nfunction presetNames(selection: MachTablePresetSelection | undefined): readonly string[] {\n if (!selection) return [];\n return (Array.isArray(selection) ? selection : [selection])\n .filter((name): name is string => typeof name === \"string\" && name.trim().length > 0);\n}\n\nexport function normalizeMachTableConfig(config: MachTableRuntimeConfig = {}): ResolvedMachTableConfig {\n return {\n defaults: createMachTablePreset(\n { columnTypes: config.columnTypes, components: config.components },\n config.defaults ?? {}\n ),\n presets: Object.fromEntries(\n Object.entries(config.presets ?? {}).map(([name, preset]) => [name, createMachTablePreset(preset)])\n ),\n defaultPreset: config.defaultPreset ?? false,\n ...(config.onConfigWarning ? { onConfigWarning: config.onConfigWarning } : {})\n };\n}\n\n/** Merges app, route and layout configuration while preserving named presets. */\nexport function mergeMachTableConfig(\n parent: ResolvedMachTableConfig,\n child: MachTableRuntimeConfig\n): ResolvedMachTableConfig {\n const normalizedChild = normalizeMachTableConfig(child);\n const presets: Record<string, Partial<GridOptions<any>>> = { ...parent.presets };\n for (const [name, preset] of Object.entries(child.presets ?? {})) {\n presets[name] = createMachTablePreset(parent.presets[name] ?? {}, preset);\n }\n return {\n defaults: createMachTablePreset(parent.defaults, normalizedChild.defaults),\n presets,\n defaultPreset: child.defaultPreset === undefined ? parent.defaultPreset : child.defaultPreset,\n ...(child.onConfigWarning ?? parent.onConfigWarning\n ? { onConfigWarning: child.onConfigWarning ?? parent.onConfigWarning }\n : {})\n };\n}\n\nexport function resolveMachTableGridOptions<TData>(\n config: ResolvedMachTableConfig,\n requestedPreset: MachTablePresetSelection | undefined,\n explicit: Partial<GridOptions<TData>>,\n reportWarning?: (warning: MachTableConfigWarning) => void\n): ResolvedMachTableGridOptions<TData> {\n const selected = requestedPreset === undefined ? config.defaultPreset : requestedPreset;\n const layers: { name: string; options: Partial<GridOptions<TData>> }[] = [\n { name: \"application defaults\", options: config.defaults as Partial<GridOptions<TData>> }\n ];\n for (const name of presetNames(selected)) {\n const preset = config.presets[name];\n if (!preset) {\n const warning: MachTableConfigWarning = {\n code: \"UNKNOWN_PRESET\",\n preset: name,\n message: `[MachTable] Unknown preset \"${name}\". Register it in mach-table.config.ts or remove the preset.`\n };\n if (reportWarning) reportWarning(warning);\n else if (config.onConfigWarning) config.onConfigWarning(warning);\n else console.warn(warning.message);\n continue;\n }\n layers.push({ name: `preset:${name}`, options: preset as Partial<GridOptions<TData>> });\n }\n layers.push({ name: \"table props\", options: explicit });\n const options = createMachTablePreset(...layers.map((layer) => layer.options));\n\n return {\n options,\n explain(key) {\n const declared = layers\n .filter((layer) => Object.prototype.hasOwnProperty.call(layer.options, key))\n .map((layer) => ({ name: layer.name, value: (layer.options as Record<string, unknown>)[key] }));\n const last = declared[declared.length - 1];\n return {\n key,\n value: (options as Record<string, unknown>)[key],\n source: last?.name ?? \"MachTable built-in\",\n layers: declared\n };\n }\n };\n}\n","import type { ColDef, CellRendererFn } from \"../types/colDef\";\n\nexport type BusinessColumnType =\n | \"text\"\n | \"number\"\n | \"integer\"\n | \"money\"\n | \"percent\"\n | \"percentage\"\n | \"date\"\n | \"datetime\"\n | \"boolean\"\n | \"status\"\n | \"link\";\n\nexport interface BusinessColumnTypeOptions {\n locale?: string | readonly string[];\n currency?: string;\n currencyDisplay?: \"symbol\" | \"narrowSymbol\" | \"code\" | \"name\";\n timeZone?: string;\n emptyText?: string;\n invalidText?: string;\n trueText?: string;\n falseText?: string;\n maximumFractionDigits?: number;\n}\n\nfunction present(value: unknown): boolean {\n return value !== null && value !== undefined && value !== \"\";\n}\n\nfunction numeric(value: unknown): number | null {\n if (!present(value)) return null;\n const result = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(result) ? result : null;\n}\n\nfunction safeNumberFormat(\n locale: string | readonly string[] | undefined,\n options: Intl.NumberFormatOptions\n): Intl.NumberFormat {\n try {\n return new Intl.NumberFormat(locale as string | string[] | undefined, options);\n } catch {\n return new Intl.NumberFormat(undefined, options);\n }\n}\n\nfunction safeDateFormat(\n locale: string | readonly string[] | undefined,\n options: Intl.DateTimeFormatOptions\n): Intl.DateTimeFormat {\n try {\n return new Intl.DateTimeFormat(locale as string | string[] | undefined, options);\n } catch {\n const portable = { ...options };\n delete portable.timeZone;\n return new Intl.DateTimeFormat(undefined, portable);\n }\n}\n\nfunction parseDate(value: unknown): Date | null {\n if (!present(value)) return null;\n const date = value instanceof Date ? value : new Date(value as string | number);\n return Number.isFinite(date.getTime()) ? date : null;\n}\n\n/**\n * Production-oriented semantic column types. Register once in\n * `mach-table.config.ts`, then pages only declare `type: \"money\"` etc.\n */\nexport function createBusinessColumnTypes<TData = any>(\n options: BusinessColumnTypeOptions = {}\n): Readonly<Record<BusinessColumnType, Partial<ColDef<TData>>>> {\n const empty = options.emptyText ?? \"\";\n const invalid = options.invalidText ?? \"—\";\n const numberFormat = safeNumberFormat(options.locale, {\n maximumFractionDigits: options.maximumFractionDigits ?? 2\n });\n const integerFormat = safeNumberFormat(options.locale, { maximumFractionDigits: 0 });\n const moneyFormat = safeNumberFormat(options.locale, {\n style: \"currency\",\n currency: options.currency ?? \"CNY\",\n currencyDisplay: options.currencyDisplay ?? \"symbol\",\n maximumFractionDigits: options.maximumFractionDigits ?? 2\n });\n const fractionPercentFormat = safeNumberFormat(options.locale, {\n style: \"percent\",\n maximumFractionDigits: options.maximumFractionDigits ?? 2\n });\n const dateFormat = safeDateFormat(options.locale, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n ...(options.timeZone ? { timeZone: options.timeZone } : {})\n });\n const dateTimeFormat = safeDateFormat(options.locale, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n ...(options.timeZone ? { timeZone: options.timeZone } : {})\n });\n\n const formatNumber = (formatter: Intl.NumberFormat, scale = 1) => ({ value }: { value: unknown }): string => {\n if (!present(value)) return empty;\n const parsed = numeric(value);\n return parsed == null ? invalid : formatter.format(parsed * scale);\n };\n const formatDate = (formatter: Intl.DateTimeFormat) => ({ value }: { value: unknown }): string => {\n if (!present(value)) return empty;\n const parsed = parseDate(value);\n return parsed == null ? invalid : formatter.format(parsed);\n };\n\n return Object.freeze({\n text: { align: \"left\", filter: \"text\" },\n number: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(numberFormat)\n },\n integer: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(integerFormat)\n },\n money: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(moneyFormat)\n },\n /** Fraction input: 0.125 is displayed as 12.5%. */\n percent: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(fractionPercentFormat)\n },\n /** Whole-number input: 12.5 is displayed as 12.5%. */\n percentage: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(fractionPercentFormat, 0.01)\n },\n date: {\n align: \"center\",\n filter: \"date\",\n cellEditor: \"date\",\n valueFormatter: formatDate(dateFormat)\n },\n datetime: {\n align: \"center\",\n filter: \"date\",\n valueFormatter: formatDate(dateTimeFormat)\n },\n boolean: {\n align: \"center\",\n filter: \"set\",\n valueFormatter: ({ value }) => value === true\n ? (options.trueText ?? \"是\")\n : value === false\n ? (options.falseText ?? \"否\")\n : empty\n },\n status: { filter: \"set\", cellRenderer: \"statusTag\" },\n link: { filter: \"text\", cellRenderer: \"link\" }\n });\n}\n\nexport type DictionaryKey = string | number;\n\nexport interface DictionaryEntry<TKey extends DictionaryKey = DictionaryKey> {\n value: TKey;\n label: string;\n}\n\nexport interface CachedDictionaryOptions<TKey extends DictionaryKey = DictionaryKey> {\n load(keys: readonly TKey[], signal: AbortSignal): Promise<readonly DictionaryEntry<TKey>[]>;\n ttlMs?: number;\n maxSize?: number;\n batchDelayMs?: number;\n onError?(error: unknown, keys: readonly TKey[]): void;\n}\n\nexport interface CachedDictionary<TKey extends DictionaryKey = DictionaryKey> {\n get(key: TKey): string | undefined;\n resolve(key: TKey): Promise<string | undefined>;\n resolveMany(keys: readonly TKey[]): Promise<ReadonlyMap<TKey, string>>;\n prime(entries: readonly DictionaryEntry<TKey>[]): void;\n invalidate(keys?: readonly TKey[]): void;\n destroy(): void;\n readonly size: number;\n}\n\ninterface DictionaryCacheValue<TKey extends DictionaryKey> {\n key: TKey;\n label: string;\n expiresAt: number;\n}\n\nfunction dictionaryId(key: DictionaryKey): string {\n return `${typeof key}:${String(key)}`;\n}\n\n/** Batched, de-duplicated TTL/LRU dictionary resolver for code-to-label fields. */\nexport function createCachedDictionary<TKey extends DictionaryKey = DictionaryKey>(\n options: CachedDictionaryOptions<TKey>\n): CachedDictionary<TKey> {\n const ttlMs = Math.max(0, options.ttlMs ?? 5 * 60_000);\n const maxSize = Math.max(1, Math.floor(options.maxSize ?? 2_000));\n const delay = Math.max(0, options.batchDelayMs ?? 0);\n const cache = new Map<string, DictionaryCacheValue<TKey>>();\n const queued = new Map<string, TKey>();\n const waiting = new Map<string, Array<{ resolve(value: string | undefined): void; reject(error: unknown): void }>>();\n let timer: ReturnType<typeof setTimeout> | null = null;\n let controller: AbortController | null = null;\n let destroyed = false;\n\n const get = (key: TKey): string | undefined => {\n const id = dictionaryId(key);\n const hit = cache.get(id);\n if (!hit) return undefined;\n if (hit.expiresAt < Date.now()) {\n cache.delete(id);\n return undefined;\n }\n cache.delete(id);\n cache.set(id, hit);\n return hit.label;\n };\n\n const prime = (entries: readonly DictionaryEntry<TKey>[]): void => {\n const expiresAt = ttlMs === 0 ? Number.POSITIVE_INFINITY : Date.now() + ttlMs;\n for (const entry of entries) {\n const id = dictionaryId(entry.value);\n cache.delete(id);\n cache.set(id, { key: entry.value, label: String(entry.label), expiresAt });\n }\n while (cache.size > maxSize) cache.delete(cache.keys().next().value as string);\n };\n\n const flush = async (): Promise<void> => {\n timer = null;\n if (destroyed || queued.size === 0) return;\n const entries = [...queued.entries()];\n queued.clear();\n const keys = entries.map(([, key]) => key);\n const active = new AbortController();\n controller = active;\n try {\n const loaded = await options.load(keys, active.signal);\n if (destroyed || active.signal.aborted) return;\n prime(loaded);\n for (const [id, key] of entries) {\n const value = get(key);\n for (const waiter of waiting.get(id) ?? []) waiter.resolve(value);\n waiting.delete(id);\n }\n } catch (error) {\n if (!active.signal.aborted) options.onError?.(error, keys);\n for (const [id] of entries) {\n for (const waiter of waiting.get(id) ?? []) waiter.reject(error);\n waiting.delete(id);\n }\n } finally {\n if (controller === active) controller = null;\n if (!destroyed && queued.size > 0 && timer == null) timer = setTimeout(() => { void flush(); }, delay);\n }\n };\n\n const resolve = (key: TKey): Promise<string | undefined> => {\n const cached = get(key);\n if (cached !== undefined) return Promise.resolve(cached);\n if (destroyed) return Promise.reject(new Error(\"[MachTable] Dictionary resolver has been destroyed.\"));\n const id = dictionaryId(key);\n queued.set(id, key);\n const promise = new Promise<string | undefined>((resolveValue, reject) => {\n const list = waiting.get(id) ?? [];\n list.push({ resolve: resolveValue, reject });\n waiting.set(id, list);\n });\n if (timer == null && controller == null) timer = setTimeout(() => { void flush(); }, delay);\n return promise;\n };\n\n return {\n get,\n resolve,\n async resolveMany(keys) {\n const labels = await Promise.all(keys.map(async (key) => [key, await resolve(key)] as const));\n return new Map(labels.filter((entry): entry is readonly [TKey, string] => entry[1] !== undefined));\n },\n prime,\n invalidate(keys) {\n if (!keys) cache.clear();\n else for (const key of keys) cache.delete(dictionaryId(key));\n },\n destroy() {\n destroyed = true;\n if (timer != null) clearTimeout(timer);\n timer = null;\n controller?.abort();\n controller = null;\n const error = new Error(\"[MachTable] Dictionary resolver has been destroyed.\");\n for (const waiters of waiting.values()) for (const waiter of waiters) waiter.reject(error);\n waiting.clear();\n queued.clear();\n cache.clear();\n },\n get size() {\n return cache.size;\n }\n };\n}\n\nexport interface DictionaryRendererOptions {\n loadingText?: string;\n emptyText?: string;\n fallback?: (value: DictionaryKey) => string;\n}\n\n/** Async-safe renderer backed by createCachedDictionary; stale pooled cells are not mutated. */\nexport function createDictionaryRenderer<TKey extends DictionaryKey = DictionaryKey>(\n dictionary: CachedDictionary<TKey>,\n options: DictionaryRendererOptions = {}\n): CellRendererFn {\n return (params) => {\n if (!present(params.value)) return options.emptyText ?? \"\";\n const key = params.value as TKey;\n const fallback = options.fallback?.(key) ?? String(key);\n const cached = dictionary.get(key);\n if (cached !== undefined) return cached;\n const element = document.createElement(\"span\");\n element.className = \"mach-dictionary-value mach-dictionary-value--loading\";\n element.textContent = options.loadingText ?? fallback;\n let active = true;\n void dictionary.resolve(key).then((label) => {\n if (!active || !element.isConnected) return;\n element.textContent = label ?? fallback;\n element.classList.remove(\"mach-dictionary-value--loading\");\n }).catch(() => {\n if (!active || !element.isConnected) return;\n element.textContent = fallback;\n element.classList.remove(\"mach-dictionary-value--loading\");\n element.classList.add(\"mach-dictionary-value--error\");\n });\n return { el: element, destroy: () => { active = false; } };\n };\n}\n","import type { GridApi } from \"../types/api\";\nimport type { ColumnStateStorage } from \"./columnStateStore\";\nimport type {\n GridViewManager,\n GridViewState,\n GridViewStore,\n SavedGridView\n} from \"../types/views\";\nimport { migrateGridState } from \"./gridState\";\n\nexport interface LocalGridViewStoreOptions {\n namespace?: string;\n storage?: ColumnStateStorage;\n maxViews?: number;\n maxBytes?: number;\n onError?(error: unknown, operation: \"list\" | \"save\" | \"remove\", scope: string): void;\n}\n\ninterface StoredViews {\n schemaVersion: 1;\n savedAt: number;\n views: SavedGridView[];\n}\n\nfunction currentStorage(): ColumnStateStorage | null {\n try { return typeof localStorage === \"undefined\" ? null : localStorage; }\n catch { return null; }\n}\n\nfunction storageBytes(value: string): number {\n return typeof TextEncoder === \"undefined\" ? value.length * 2 : new TextEncoder().encode(value).byteLength;\n}\n\nfunction safeId(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const id = value.trim();\n return id && id.length <= 256 ? id : null;\n}\n\nexport function normalizeGridViewState(input: unknown): GridViewState | null {\n if (input == null || typeof input !== \"object\") return null;\n const source = input as Partial<GridViewState>;\n if (source.version !== 1) return null;\n const state = migrateGridState({\n version: 2,\n columns: source.columns,\n sortModel: source.sortModel,\n filterModel: source.filterModel,\n advancedFilterModel: source.advancedFilterModel,\n quickFilterText: source.quickFilterText,\n pagination: { enabled: true, page: 1, pageSize: source.pageSize },\n selectedRowIds: [], expandedRowIds: [], expandedGroupIds: []\n });\n if (!state) return null;\n return {\n version: 1,\n columns: state.columns,\n sortModel: state.sortModel,\n filterModel: state.filterModel,\n advancedFilterModel: state.advancedFilterModel,\n quickFilterText: state.quickFilterText,\n pageSize: state.pagination.pageSize\n };\n}\n\nexport function normalizeSavedGridView(input: unknown): SavedGridView | null {\n if (input == null || typeof input !== \"object\") return null;\n const source = input as Partial<SavedGridView>;\n const id = safeId(source.id);\n const name = typeof source.name === \"string\" ? source.name.trim().slice(0, 120) : \"\";\n const state = normalizeGridViewState(source.state);\n if (source.schemaVersion !== 1 || !id || !name || !state) return null;\n const createdAt = typeof source.createdAt === \"number\" && Number.isFinite(source.createdAt) ? source.createdAt : Date.now();\n const updatedAt = typeof source.updatedAt === \"number\" && Number.isFinite(source.updatedAt) ? source.updatedAt : createdAt;\n return { schemaVersion: 1, id, name, createdAt, updatedAt, state };\n}\n\nexport function captureGridViewState<TData>(api: GridApi<TData>): GridViewState {\n const state = api.getState();\n return {\n version: 1,\n columns: state.columns,\n sortModel: state.sortModel,\n filterModel: state.filterModel,\n advancedFilterModel: state.advancedFilterModel,\n quickFilterText: state.quickFilterText,\n pageSize: state.pagination.pageSize\n };\n}\n\nexport function applyGridViewState<TData>(\n api: GridApi<TData>,\n view: GridViewState,\n options: { emitEvents?: boolean } = {}\n): boolean {\n const normalized = normalizeGridViewState(view);\n if (!normalized || api.isDestroyed()) return false;\n const current = api.getState();\n api.applyState({\n ...current,\n columns: normalized.columns,\n sortModel: normalized.sortModel,\n filterModel: normalized.filterModel,\n advancedFilterModel: normalized.advancedFilterModel,\n quickFilterText: normalized.quickFilterText,\n pagination: { ...current.pagination, page: 1, pageSize: normalized.pageSize }\n }, {\n sections: [\"columns\", \"sort\", \"filter\", \"pagination\"],\n emitEvents: options.emitEvents\n });\n return true;\n}\n\nexport function createLocalGridViewStore(options: LocalGridViewStoreOptions = {}): GridViewStore {\n const namespace = (options.namespace ?? \"mach-table:views\").replace(/:+$/, \"\");\n const maxViews = Math.max(1, Math.floor(options.maxViews ?? 50));\n const maxBytes = Math.max(4_096, Math.floor(options.maxBytes ?? 512 * 1_024));\n const keyOf = (scope: string): string => `${namespace}:${encodeURIComponent(scope)}`;\n const report = (error: unknown, operation: \"list\" | \"save\" | \"remove\", scope: string): void => {\n try { options.onError?.(error, operation, scope); } catch { /* observers cannot break preferences */ }\n };\n const read = (scope: string): SavedGridView[] => {\n const raw = (options.storage ?? currentStorage())?.getItem(keyOf(scope));\n if (!raw || storageBytes(raw) > maxBytes) return [];\n const parsed = JSON.parse(raw) as Partial<StoredViews>;\n if (parsed.schemaVersion !== 1 || !Array.isArray(parsed.views)) return [];\n return parsed.views.flatMap((view) => {\n const normalized = normalizeSavedGridView(view);\n return normalized ? [normalized] : [];\n }).slice(0, maxViews);\n };\n const write = (scope: string, views: SavedGridView[]): void => {\n const payload = JSON.stringify({ schemaVersion: 1, savedAt: Date.now(), views } satisfies StoredViews);\n if (storageBytes(payload) > maxBytes) throw new RangeError(`[MachTable] Saved views for \"${scope}\" exceed ${maxBytes} bytes.`);\n const storage = options.storage ?? currentStorage();\n if (!storage) throw new Error(\"[MachTable] Saved view storage is unavailable.\");\n storage.setItem(keyOf(scope), payload);\n };\n return {\n list(scope) {\n try { return read(scope); }\n catch (error) { report(error, \"list\", scope); return []; }\n },\n save(scope, view) {\n try {\n const normalized = normalizeSavedGridView(view);\n if (!normalized) throw new TypeError(`[MachTable] Invalid saved view for \"${scope}\".`);\n const views = read(scope).filter((entry) => entry.id !== normalized.id);\n views.unshift(normalized);\n write(scope, views.slice(0, maxViews));\n } catch (error) { report(error, \"save\", scope); throw error; }\n },\n remove(scope, id) {\n try { write(scope, read(scope).filter((entry) => entry.id !== id)); }\n catch (error) { report(error, \"remove\", scope); throw error; }\n }\n };\n}\n\nfunction createViewId(): string {\n try { if (typeof crypto !== \"undefined\" && crypto.randomUUID) return crypto.randomUUID(); }\n catch { /* use deterministic-compatible fallback */ }\n return `view-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function createGridViewManager<TData>(\n api: GridApi<TData>,\n options: { scope: string; store?: GridViewStore }\n): GridViewManager {\n const scope = options.scope.trim();\n if (!scope || scope.length > 512) {\n throw new TypeError(\"[MachTable] Grid view scope must contain between 1 and 512 characters.\");\n }\n const store = options.store ?? createLocalGridViewStore();\n const list = async (): Promise<SavedGridView[]> => {\n const views = await store.list(scope);\n return views.flatMap((view) => {\n const normalized = normalizeSavedGridView(view);\n return normalized ? [normalized] : [];\n }).sort((left, right) => right.updatedAt - left.updatedAt);\n };\n return {\n list,\n async save(name, requestedId) {\n const cleanName = name.trim().slice(0, 120);\n if (!cleanName) throw new TypeError(\"[MachTable] Grid view name must be a non-empty string.\");\n const id = safeId(requestedId) ?? createViewId();\n const existing = (await list()).find((view) => view.id === id);\n const now = Date.now();\n const view: SavedGridView = {\n schemaVersion: 1,\n id,\n name: cleanName,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n state: captureGridViewState(api)\n };\n await store.save(scope, view);\n return view;\n },\n async apply(viewOrId, applyOptions) {\n const view = typeof viewOrId === \"string\"\n ? (await list()).find((entry) => entry.id === viewOrId)\n : normalizeSavedGridView(viewOrId);\n const requested = typeof viewOrId === \"string\" ? viewOrId : \"provided view\";\n if (!view) throw new Error(`[MachTable] Grid view \"${requested}\" was not found.`);\n if (!applyGridViewState(api, view.state, applyOptions)) {\n throw new Error(`[MachTable] Grid view \"${view.id}\" could not be applied.`);\n }\n return view;\n },\n async remove(id) { await store.remove(scope, id); }\n };\n}\n"],"mappings":"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","names":["index_exports","__export","BUILTIN_AGG_FUNCS","Column","DEFAULT_LOCALE","DIRECT_GRID_OPTION_KEYS","EVENT_TYPES","EventBus","GRID_OPTION_KEYS","GRID_OPTION_META","GRID_SIZE_PRESETS","GridCore","LOCALE_EN","actionsColumn","advancedFilterCondition","advancedFilterGroup","applyGridViewState","buildColDefsFromSchema","captureGridViewState","clearColumnState","clearComponentRegistries","clearGridState","computeColumnWidths","createActionButtonsRenderer","createAggResolver","createBusinessColumnTypes","createCachedDictionary","createColumnHelper","createColumnStateKey","createDictionaryRenderer","createEnterprisePreset","createGrid","createGridViewManager","createLocalColumnStateStore","createLocalGridStateStore","createLocalGridViewStore","createMachTableCommands","createMachTablePreset","createProgressBarRenderer","createRowActionsRenderer","createSaveSnapshot","createStatusTagRenderer","defaultComparator","defineColumns","defineGridOptions","defineMachTableConfig","defineMachTablePreset","describeFilter","downloadFile","dragColumn","escapeHtml","evaluateColumnFilter","fitColumnWidths","formatText","formatTwo","getByPath","getCellEditor","getCellRenderer","indexColumn","isColDefGroup","isSafePath","linkRenderer","loadColumnState","loadGridState","matchLocaleKey","matchesGridOptionKind","mergeMachTableConfig","migrateGridState","normalizeAdvancedFilterModel","normalizeBatchSaveResult","normalizeColumnFilter","normalizeFilterModel","normalizeGridViewState","normalizeMachTableConfig","normalizeSavedGridView","parseCsv","parseDelimited","parseTsv","registerBuiltinRenderers","registerCellEditor","registerCellRenderer","resolveGridFeatures","resolveMachTableGridOptions","resolveSaveConflict","resolveTagVariant","rowActionsColumn","sanitizeFormulaCell","sanitizeGridOptionPatch","saveColumnState","saveGridState","selectionColumn","setByPath","sortNodes","toTsv","validateGridOptions","version","__toCommonJS","package_default","EventBus","onListenerError","type","listener","set","off","event","payload","err","UNSAFE_PATH_SEGMENTS","isSafePath","path","part","getByPath","obj","cur","start","idx","setByPath","value","parts","TEXT_MATCHES","NUMBER_MATCHES","DATE_MATCHES","primitive","value","matchesFor","type","normalizedCondition","entry","matches","condition","conditionValues","finiteNumber","value2","normalizedConditions","input","output","normalizeColumnFilter","source","normalizeConditionNode","node","context","colId","filter","normalizeGroupNode","depth","children","child","normalized","normalizeAdvancedNode","canNormalizeNode","result","normalizeAdvancedFilterModel","validColumnIds","root","advancedFilterCondition","normalizeFilterModel","rawId","advancedFilterGroup","operator","options","DEFAULT_COL_DEF","GRID_SIZE_PRESETS","finiteAtLeast","value","fallback","min","integer","resolveSize","resolveTheme","options","resolvePageSizeOptions","pageSize","requested","values","left","right","rowIdFromKey","rowKey","data","getByPath","resolveRowIdentity","getRowId","resolveDataAndLayout","size","preset","resolveAppearance","resolveEditingAndHistory","resolveHierarchy","resolvePagination","config","resolveWatermark","resolveInteraction","normalizeAdvancedFilterModel","resolveStatePersistence","resolveDatasource","resolveAccessibility","OPTIONAL_OPTION_KEYS","copyOptionalOptions","source","target","key","copyEventHandlers","resolveOptions","userOptions","resolved","columnTypeNames","type","name","hasColumnType","colDef","mergeColDef","defaults","columnTypes","typedDefaults","definition","Column","id","colDef","p","f","ColumnGroup","_ColumnGroup","groupId","def","out","child","isColDefGroup","def","positiveFinite","value","fallback","widthBounds","input","min","clampWidth","w","max","width","computeColumnWidths","cols","availableWidth","widths","c","flexCols","flexTotal","i","f","total","extra","pass","remainingFlex","remainingTotal","consumed","k","share","before","used","stillFlexible","_index","fitColumnWidths","column","active","_column","index","remainingWidth","weightTotal","constrained","target","fitted","drift","sum","candidate","DETAIL_TOGGLE_COL_ID","isPositiveFiniteNumber","value","ColumnModel","core","colDefs","prev","c","defaults","usedIds","build","list","parent","level","def","i","isColDefGroup","groupId","group","ColumnGroup","colDef","id","uniqueId","suffix","column","Column","mergeColDef","p","toggleCol","max","initial","children","out","child","visible","colId","pane","ordered","viewportWidth","pinnedTotal","clampWidth","available","scalable","fixed","fixedTotal","scalableInputs","scalableWidth","widths","fitColumnWidths","computeColumnWidths","index","width","toIndex","inScope","container","siblings","from","target","leafSlots","idx","slotIdx","pinned","sortIndex","s","state","states","stateById","knownIds","seenIds","nextSort","a","b","direction","orderById","paneOfCol","current","sorted","slots","sortModel","additive","model","next","textOf","value","evaluateTextFilter","conditions","operator","v","results","c","fv","evaluateNumberFilter","isBlank","n","f","toTime","t","evaluateDateFilter","f2","evaluateSetFilter","filterValues","evaluateColumnFilter","filter","evaluateAdvancedNode","node","columns","row","getCellValue","column","passed","child","evaluateAdvancedFilter","model","doesNodePassFilters","filterModel","advancedFilterModel","quickFilter","colId","tokens","token","collator","defaultComparator","valueA","valueB","aEmpty","bEmpty","a","b","sortNodes","nodes","sortModel","columns","getCellValue","colById","c","comparators","directions","item","column","defaultComparator","decorated","node","s","a","b","i","r","d","numeric","values","v","BUILTIN_AGG_FUNCS","acc","nums","createAggResolver","custom","merged","name","readChildren","data","key","value","RowModel","core","normalizeAdvancedFilterModel","index","fallback","getRowId","id","error","detailRows","v","start","end","datasource","blockSize","stop","seq","controller","resolve","settled","attempt","done","reason","runAttempt","attemptSettled","failAttempt","delay","request","rows","lastRow","received","wasEmpty","node","lastVisibleIndex","loaded","buffer","childrenKey","next","roots","byId","childIds","autoSeq","buildNode","depth","parentId","children","list","child","force","loader","childId","pending","parent","removed","stack","replacedIds","reserved","seenObjects","nested","transaction","refresh","touched","externallyReplacedIds","removeIds","removeRefs","collect","cur","kids","kid","drop","remaining","n","startIndex","added","i","transactions","walk","root","filterModel","before","columns","column","normalizeFilterModel","model","text","getCellValue","doesNodePassFilters","sortModel","sortNodes","groupCols","withDetails","size","pageCount","slice","page","silent","firstVisible","pageSize","enabled","passCache","filterPresent","nodePasses","cached","pass","out","nodes","ordered","childNodes","spanColumns","c","masters","m","col","arr","span","defaultComparator","k","colId","aggResolve","createAggResolver","aggCols","computeAgg","leaves","values","fn","leaf","build","level","parentPath","groups","order","raw","bucket","a","b","display","groupId","groupNode","checkTree","check","rowIds","groupIds","expanded","changed","fromIndex","toIndex","fromNode","toNode","fromAllIdx","toAllIdx","idx","insertAt","callback","SelectionService","core","id","node","column","check","error","n","ids","requested","changes","preserveIds","existing","groupNode","leaves","selectableCount","count","leaf","selected","clearOthers","nodeId","event","fromCheckbox","mode","single","multi","anchor","start","end","i","row","filteredOnly","selectable","total","acc","clearAll","before","c","isTree","keep","targets","changedIds","prevSelected","prevIndeterminate","refreshIndexes","touched","isSel","out","walk","childId","evaluate","childIds","all","some","state","root","ResizeService","core","event","active","column","handle","startWidth","restore","clientX","pointerX","el","tag","className","attrs","e","key","clamp","v","min","max","FILTER_ICON","SORT_ASC_ICON","SORT_DESC_ICON","DRAG_THRESHOLD","ColumnDragService","core","pending","dragging","column","value","cellEl","indicator","el","pane","cssEscape","rowRect","cols","fromIndex","x","target","indicatorX","acc","i","mid","csvEscape","value","separator","s","sanitizeFormulaCell","buildCsv","accessor","params","includeHeader","protectFormulas","lines","l","row","v","body","escapeCell","value","protectFormulas","safe","sanitizeFormulaCell","s","toTsv","rows","row","parseTsv","text","parseDelimited","parseCsv","separator","cell","inQuotes","i","ch","fallbackCopyText","ta","writeClipboard","NAVIGATION_KEYS","MOVEMENT_KEYS","KeyboardService","core","range","text","dt","writeClipboard","start","rowIndex","colId","dir","cols","c","rowCount","i","row","guard","node","key","body","columns","focus","colIdx","column","position","moved","columnCount","current","candidate","viewport","pageRows","direction","target","down","next","baseInput","type","value","input","inferEditorType","selectValues","createEditor","column","keyPress","def","name","timeMatch","values","select","v","option","match","cellStates","detailDestroyers","headerDestroyers","getCellRuntimeState","element","state","peekCellRuntimeState","setDetailDestroyer","destroy","takeDetailDestroyer","setHeaderDestroyer","takeHeaderDestroyer","defaultFormat","value","cleanupCellContent","core","cell","state","peekCellRuntimeState","destroy","error","updateCellTooltip","node","column","formatted","tooltip","tooltipGetter","tryRefreshRenderer","renderer","params","formatCellValue","formatter","out","formatCellValueWith","applyCellStyle","rule","getCellRuntimeState","prevKeys","key","styles","keys","renderCellContent","rendererDef","result","next","applyCellClasses","classes","align","hasColumnType","hadFocus","hadEditing","className","CHECK_PATH","CLOSE_PATH","createEditButton","kind","label","button","event","EditingService","core","current","next","stopped","rowIndex","colId","node","column","editable","error","keyPress","cell","oldValue","editor","cleanupCellContent","shell","controls","confirmButton","cancelButton","keydown","preferredColId","drafts","row","first","target","draft","editing","cancel","newValue","validation","token","task","result","changed","results","invalid","rowErrors","cancelled","changes","applied","rollbackFailed","previous","input","value","def","params","createEditor","validate","validator","values","errors","message","firstMessage","editorEl","clear","busy","mounted","removeCellState","currentIndex","direction","offset","DEFAULT_LOCALE","LOCALE_EN","MATCH_LOCALE_KEYS","matchLocaleKey","match","formatText","template","n","formatTwo","a","b","TEXT_MATCHES","NUMBER_MATCHES","DATE_MATCHES","FilterPopupService","core","column","anchor","filter","type","panel","el","footer","resetBtn","applyBtn","next","rect","panelRect","left","clamp","top","matches","existing","currentMatch","isBlank","select","option","matchLocaleKey","valueInput","value2Input","blank","enterApply","e","body","params","values","seen","nodes","cap","i","v","key","selected","search","list","checkboxes","valueByKey","renderList","query","q","text","label","cb","span","entries","selectedKeys","emptyLabel","picked","inputs","match","raw","value","value2","ColumnMenuService","core","column","anchor","target","rect","fake","api","panel","el","title","sortRow","makeSortBtn","labelKey","dir","btn","pinRow","makePinBtn","pinned","toolRow","fitBtn","hideBtn","divider","listTitle","search","list","footer","resetBtn","allFitBtn","panelRect","left","clamp","top","workbench","columns","candidate","col","row","label","checkbox","text","pin","value","caption","option","siblings","position","move","next","disabled","button","ContextMenuService","core","x","y","anchor","node","anchorCol","range","flat","anchorIndex","panel","el","customGetter","items","error","hasEnabled","item","sep","btn","copyBtn","pasteBtn","clearBtn","active","rect","left","clamp","top","TooltipService","core","cell","colId","rowEl","index","node","column","value","params","formatCellValue","getter","fallback","error","body","component","panel","el","content","err","rect","panelRect","left","clamp","top","WatermarkService","core","config","url","canvas","ctx","fontSize","gap","angle","color","opacity","metrics","textW","tile","ctx2","UndoRedoService","core","batch","entry","maxSize","redo","refreshIndexes","node","column","value","replaced","ChangeTrackingService","core","event","key","originalValue","change","byRow","node","row","rowIds","ids","saved","cell","current","column","value","targets","refresh","completed","now","PerformanceMonitor","startedAt","rows","columns","durations","sample","last","sorted","left","right","percentileIndex","total","duration","EVENT_TYPES","escapeHtml","value","downloadFile","filename","content","mime","a","blob","url","revoke","GRID_OPTION_META","GRID_OPTION_KEYS","DIRECT_GRID_OPTION_KEYS","key","EVENT_OPTION_KEYS","EVENT_TYPES","type","matchesGridOptionKind","value","kind","sanitizeGridOptionPatch","input","output","key","metadata","GRID_OPTION_META","MAX_COLUMNS","MAX_ROW_IDS","MAX_ID_LENGTH","MAX_QUICK_FILTER_LENGTH","stringIds","value","entry","positiveInteger","fallback","positiveNumber","addColumnSizing","state","source","width","flex","addColumnLayout","addColumnSort","normalizeColumnEntry","input","seen","colId","normalizeColumns","output","normalizeSortModel","migrateGridState","pagination","normalizeFilterModel","normalizeAdvancedFilterModel","cloneSnapshotData","data","createSaveSnapshot","changes","rowIds","ids","change","cell","normalizeIssue","issue","submittedIds","rowId","id","uniqueIssues","input","byRow","normalized","normalizeBatchSaveResult","submitted","response","conflicts","conflictIds","conflict","failures","failure","blocked","explicitlySaved","saved","conflictUpdateData","api","node","getRowId","current","resolveSaveConflict","strategy","update","createOptionUpdateEffects","hasOwnOption","options","key","normalizeFinite","value","min","integer","changedFinite","current","normalized","GridApiImpl","core","rows","transaction","resolve","transactions","resolvers","colDefs","state","colId","visible","toIndex","pinned","width","column","cols","target","total","acc","c","changed","col","skipHeader","ctx","style","maxWidth","consider","text","w","nodes","cap","i","formatCellValue","extra","sortModel","filterModel","model","mode","nodeId","selected","clearOthers","filteredOnly","rowIndex","id","callback","position","rowId","groupId","fromIndex","getRowId","changes","row","node","n","selectedIds","rowIds","handler","snapshot","createSaveSnapshot","result","normalizeBatchSaveResult","anchor","enabled","page","size","grid","parseCsv","headerRow","body","r","toTsv","columns","fieldOrder","records","byHeader","field","matched","header","index","entry","record","raw","setByPath","columnIndex","error","isNumeric","hasLeadingZero","win","headerCells","escapeHtml","bodyRows","v","html","params","cancel","sanitizeGridOptionPatch","effects","previousColumnMenu","resolved","eventType","EVENT_TYPES","rowHeight","headerHeight","rowBuffer","detailHeight","undoStackSize","wait","tooltipDelay","config","GRID_SIZE_PRESETS","preset","DEFAULT_COL_DEF","rowKey","data","rowIdFromKey","reloadGridState","stateDebounce","blockSize","bufferRows","retryCount","retryDelay","buildCsv","a","b","input","migrateGridState","all","sections","type","content","listener","SIZE_CLASSES","GridSkeleton","core","container","options","classes","el","pane","paneEl","rowsContainer","viewport","depth","rows","row","i","left","right","width","hp","bp","hidden","rowHeight","headerHeight","size","s","theme","dark","mq","handler","on","layout","className","token","type","content","allowUnsafeHtml","resolved","error","spinner","active","text","cleanup","MATCH_LABELS","describeFilter","filter","parts","condition","label","value","value2","operator","HeaderRenderer","core","cell","destroy","takeHeaderDestroyer","error","depth","paneOf","col","buildTree","children","level","pane","out","child","ColumnGroup","subtree","roots","perRowHeight","rows","row","appendCell","tree","index","column","rowSpan","colDef","cellEl","el","headerAlign","e","selectAllEl","headerComponent","err","labelEl","wrapper","setHeaderDestroyer","sortEl","filterBtn","filterTagEl","FILTER_ICON","menuBtn","resizeEl","group","def","flatIndex","widths","x","leafLefts","left","gc","leaves","width","leaf","c","resize","delta","next","siblings","from","to","current","target","model","multi","hc","idx","s","dir","badge","SORT_ASC_ICON","SORT_DESC_ICON","fm","filter","active","summary","describeFilter","RangeSelectionModel","point","extend","rowCount","colCount","RowDragController","core","getPositions","event","drag","container","y","rowCount","positions","targetIndex","indicatorY","index","node","top","bottom","from","to","indicator","el","PANES","lowerBound","positions","y","count","lo","hi","mid","BodyRenderer","core","RangeSelectionModel","drag","me","dx","dy","target","end","old","targetCol","finish","targetRow","resolved","node","index","cellEl","labelCol","colId","column","value","event","colIdx","RowDragController","body","slot","pane","cell","cleanupCellContent","sk","viewport","widths","a","c","displayed","rowCount","positionedCount","rowHeight","detailHeight","getRowHeight","api","cap","autoHeightCols","minH","i","h","cached","requested","error","measured","totalHeight","centerAvailable","centerWidth","container","cols","ctx","style","fontSize","padding","lineHeight","maxLines","col","text","formatCellValue","availW","lines","w","ch","cw","rowIndexes","colIds","rowIndex","entries","runtime","getCellRuntimeState","timer","minRowHeight","visible","needed","row","el","detailRow","input","columns","existingCells","existingIds","id","byId","nextCells","nextIds","variableHeights","allPaneCols","x","lefts","first","cells","prevFirst","prevLast","last","width","total","scrollLeft","acc","force","startedAt","rows","buffer","colWindowChanged","lastExcl","firstVisible","viewBottom","lastVisible","clamp","columnsChanged","changed","isTreeRow","isGroupRow","hasTreeChildren","isExpandable","expanded","level","hasColSpan","coverage","span","remaining","fn","start","master","renderer","params","out","err","setDetailDestroyer","destroy","takeDetailDestroyer","kind","renderCellContent","applyCellClasses","applyCellStyle","hasColumnType","toggle","handle","button","expandable","depth","indent","wrap","stateClass","spacer","formatCellValueWith","spans","idx","height","base","state","groupCol","prefix","formatted","defaultFormat","indexes","seen","options","template","colCount","range","focus","ci","flat","anchor","b","collect","r","extend","next","inRange","e","cm","leftCount","centerCols","local","bottom","rect","r1","r2","c1","c2","targetEnd","changedRows","srcNode","sources","n","allNumeric","v","diff","intPattern","t","colOffset","steps","colIndex","left","position","viewportHeight","scrollTop","rowTop","rowBottom","maxScroll","prev","hover","rowEl","treeColumn","SummaryRenderer","core","el","pane","row","visible","show","method","masterRows","n","locale","DEFAULT_LOCALE","cols","cell","x","col","i","node","error","formatText","PaginationBar","core","el","mkBtn","cls","label","text","btn","size","options","current","a","b","option","formatText","key","DEFAULT_LOCALE","rm","active","total","visible","page","pageCount","formatTwo","off","PANES","PinnedRowsRenderer","core","root","state","el","pane","top","bottom","rows","side","sideName","row","cell","cleanupCellContent","wrapper","rowHeight","cm","data","i","node","cellsByPane","col","renderCellContent","applyCellClasses","applyCellStyle","err","widths","lefts","x","hidden","globalColOffset","cols","scrollLeft","StatusBarService","core","el","options","panel","item","locale","DEFAULT_LOCALE","text","key","value","template","formatText","rm","total","loaded","count","range","flat","sum","r","node","c","col","v","avg","sumText","off","currentStorage","safeSegment","value","copyColumnDimensions","source","state","copyColumnSort","createColumnStateKey","parts","entry","name","sanitizeColumnState","maxColumns","result","ids","item","createLocalColumnStateStore","options","namespace","version","storageKey","key","report","error","operation","raw","parsed","legacy","envelope","columns","defaultStore","saveColumnState","loadColumnState","clearColumnState","currentStorage","storageBytes","value","createLocalGridStateStore","options","namespace","maxBytes","storageKey","key","report","error","operation","raw","parsed","migrateGridState","state","normalized","payload","defaultStore","saveGridState","loadGridState","clearGridState","DEFAULT_STATUS_VARIANTS","resolveTagVariant","value","variantMap","key","exact","lower","pattern","variant","createStatusTagRenderer","config","params","label","tag","createProgressBarRenderer","raw","pct","wrap","track","bar","linkRenderer","link","ICON_PATHS","iconSvg","name","size","path","openActionSurface","openActionAnchor","closeActionSurface","restoreFocus","onActionSurfaceOutside","onActionSurfaceKeyDown","event","buttons","current","delta","makeSurfaceButton","item","className","button","showActionMenu","anchor","items","menu","rect","menuRect","showActionDrawer","title","backdrop","drawer","header","heading","close","body","resolveActionFlag","flag","actionVariant","action","actionPermissions","actionContext","message","reportActionError","error","policy","policyError","canAccessAction","visibleActions","actions","createActionButtonsRenderer","max","overflowMode","visible","shown","overflow","run","request","more","locale","moreLabel","DEFAULT_LOCALE","actionLabel","configured","localized","fallback","resolveRowActionLabels","renderRowEditingActions","labels","confirm","changes","change","confirmTitle","buildRowActions","createRowActionsRenderer","presetStatusTagRenderer","presetProgressBarRenderer","registerBuiltinRenderers","register","cellRenderers","cellEditors","registerCellRenderer","name","renderer","previous","getCellRenderer","registerCellEditor","editor","getCellEditor","ensureCellRenderer","clearComponentRegistries","validateColumnDefs","defs","issues","seenIds","leafIndex","walk","list","depth","def","isColDefGroup","id","isSafePath","count","EVENT_OPTION_KEYS","EVENT_TYPES","type","KNOWN_OPTIONS","GRID_OPTION_KEYS","editDistance","a","b","previous","_","index","row","current","column","closestOption","input","closest","distance","candidate","next","threshold","validateIdentityAndLayout","source","issues","hasStableRowId","validateMetadataValues","specialised","key","value","expected","GRID_OPTION_META","matchesGridOptionKind","validateGridOptions","options","option","suggestion","pagination","config","normalizedKeys","values","value","resolveGridFeatures","input","issues","byKey","feature","key","invalid","dependency","conflict","ordered","visiting","visited","visit","valid","DATA_SOURCE_ERROR_PREFIXES","STATE_ERROR_PREFIXES","GRID_STATE_CHANGE_EVENTS","gridUid","ensureBuiltinRenderers","registerBuiltinRenderers","ensureCellRenderer","GridCore","container","options","settleReady","resolve","resolveOptions","EventBus","error","eventType","ColumnModel","RowModel","SelectionService","GridSkeleton","HeaderRenderer","BodyRenderer","ResizeService","ColumnDragService","KeyboardService","EditingService","UndoRedoService","PerformanceMonitor","FilterPopupService","ColumnMenuService","ContextMenuService","TooltipService","WatermarkService","PaginationBar","PinnedRowsRenderer","SummaryRenderer","StatusBarService","GridApiImpl","ChangeTrackingService","name","local","renderer","getCellRenderer","getCellEditor","feature","dependency","features","resolved","resolveGridFeatures","issue","key","inactiveDependency","cleanups","manage","cleanup","active","once","context","type","listener","target","listenerOptions","handler","delayMs","id","controller","source","details","cleanupError","entries","node","column","def","getByPath","DEFAULT_LOCALE","newValue","oldValue","colDef","setByPath","changed","range","cols","rows","r","col","formatCellValueWith","toTsv","writeClipboard","flat","changedRows","c","old","text","startRow","startColIdx","grid","parseTsv","rowCount","line","token","value","start","extra","event","handlerKey","code","message","prefix","package_default","entry","additive","filter","model","colId","toIndex","rowId","finished","columns","saved","loadColumnState","states","state","result","saveColumnState","loadGridState","apply","saveGridState","title","hint","locale","empty","icon","titleEl","hintEl","inputOptions","validateGridOptions","signature","defs","validateColumnDefs","widthSignature","treeGrid","invalidateRowHeights","safely","fn","createGrid","container","options","GridCore","booleanFormatter","p","dateFormatter","format","text","selectFormatter","options","hit","o","fieldToColDef","field","type","colDef","buildColDefsFromSchema","schema","byField","f","used","result","g","group","children","fieldName","available","getApi","api","createMachTableCommands","options","text","anchor","size","filename","downloadFile","root","target","NO_INTERACT","selectionColumn","overrides","indexColumn","dragColumn","actionsColumn","config","width","pinned","rendererConfig","count","shown","hasMore","defaultWidth","createActionButtonsRenderer","rowActionsColumn","createRowActionsRenderer","createColumnHelper","field","definition","defineColumns","columns","mergeSwitchableObject","base","next","composeHandlers","args","firstError","error","mergeOptions","merged","columnTypes","name","key","previousHandler","nextHandler","createMachTablePreset","sources","createEnterprisePreset","overrides","defineMachTablePreset","preset","defineGridOptions","options","defineMachTableConfig","config","presetNames","selection","name","normalizeMachTableConfig","createMachTablePreset","preset","mergeMachTableConfig","parent","child","normalizedChild","presets","resolveMachTableGridOptions","requestedPreset","explicit","reportWarning","selected","layers","warning","options","layer","key","declared","last","present","value","numeric","result","safeNumberFormat","locale","options","safeDateFormat","portable","parseDate","date","createBusinessColumnTypes","empty","invalid","numberFormat","integerFormat","moneyFormat","fractionPercentFormat","dateFormat","dateTimeFormat","formatNumber","formatter","scale","parsed","formatDate","dictionaryId","key","createCachedDictionary","ttlMs","maxSize","delay","cache","queued","waiting","timer","controller","destroyed","get","id","hit","prime","entries","expiresAt","entry","flush","keys","active","loaded","waiter","error","resolve","cached","promise","resolveValue","reject","list","labels","waiters","createDictionaryRenderer","dictionary","params","fallback","element","label","currentStorage","storageBytes","value","safeId","id","normalizeGridViewState","input","source","state","migrateGridState","normalizeSavedGridView","name","createdAt","updatedAt","captureGridViewState","api","applyGridViewState","view","options","normalized","current","createLocalGridViewStore","namespace","maxViews","maxBytes","keyOf","scope","report","error","operation","read","raw","parsed","write","views","payload","storage","entry","createViewId","createGridViewManager","store","list","left","right","requestedId","cleanName","existing","now","viewOrId","applyOptions","requested","version","package_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json","../src/core/eventBus.ts","../src/lib/path.ts","../src/lib/advancedFilter.ts","../src/core/resolveOptions.ts","../src/services/column.ts","../src/services/columnGroup.ts","../src/types/colDef.ts","../src/lib/layout.ts","../src/services/columnModel.ts","../src/services/filterService.ts","../src/lib/compare.ts","../src/services/sortService.ts","../src/lib/aggregate.ts","../src/services/rowModel.ts","../src/services/selectionService.ts","../src/services/resizeService.ts","../src/lib/dom.ts","../src/services/columnDragService.ts","../src/lib/csv.ts","../src/lib/clipboard.ts","../src/services/keyboardService.ts","../src/services/editors.ts","../src/render/runtimeState.ts","../src/render/cellContent.ts","../src/services/editingService.ts","../src/lib/locale.ts","../src/services/filterPopup.ts","../src/services/columnMenuService.ts","../src/services/contextMenuService.ts","../src/services/tooltipService.ts","../src/services/watermarkService.ts","../src/services/undoRedoService.ts","../src/services/changeTrackingService.ts","../src/services/performanceMonitor.ts","../src/types/events.ts","../src/lib/download.ts","../src/core/gridOptionMetadata.ts","../src/core/gridOptionRuntime.ts","../src/lib/gridState.ts","../src/lib/batchSave.ts","../src/services/gridApi.ts","../src/render/skeleton.ts","../src/lib/filterSummary.ts","../src/render/headerRenderer.ts","../src/services/rangeSelectionModel.ts","../src/services/rowDragController.ts","../src/render/bodyRenderer.ts","../src/render/summaryRenderer.ts","../src/render/paginationBar.ts","../src/render/pinnedRowsRenderer.ts","../src/render/statusBarService.ts","../src/lib/columnStateStore.ts","../src/lib/gridStateStore.ts","../src/lib/presetRenderers.ts","../src/lib/componentRegistry.ts","../src/lib/validateDefs.ts","../src/lib/validateOptions.ts","../src/lib/featureManifest.ts","../src/core/gridCore.ts","../src/core/createGrid.ts","../src/lib/schema.ts","../src/lib/controller.ts","../src/lib/presetColumns.ts","../src/lib/columnHelper.ts","../src/lib/presets.ts","../src/lib/configuration.ts","../src/lib/businessColumns.ts","../src/lib/gridViewStore.ts"],"sourcesContent":["import packageJson from \"../package.json\";\n\nexport { createGrid } from \"./core/createGrid\";\nexport { GridCore } from \"./core/gridCore\";\nexport { EventBus } from \"./core/eventBus\";\nexport { defaultComparator } from \"./lib/compare\";\nexport { getByPath, setByPath, isSafePath } from \"./lib/path\";\nexport { computeColumnWidths, fitColumnWidths } from \"./lib/layout\";\nexport type { WidthInput } from \"./lib/layout\";\n\nexport type {\n ColDef,\n ColDefGroup,\n ColDefOrGroup,\n ColumnState,\n ColumnFilter,\n FilterModel,\n FilterType,\n SortModel,\n SortModelItem,\n SortDirection,\n PinnedDirection,\n TextFilterMatch,\n NumberFilterMatch,\n DateFilterMatch,\n TextFilterCondition,\n NumberFilterCondition,\n DateFilterCondition,\n SetFilterCondition,\n SelectEditorParams,\n SetFilterParams,\n CellRendererFn,\n CellClassRule,\n CellEditorFactory,\n CellStyleRule,\n CellAlign\n} from \"./types/colDef\";\nexport type {\n AdvancedFilterCondition,\n AdvancedFilterGroup,\n AdvancedFilterModel,\n AdvancedFilterNode\n} from \"./types/advancedFilter\";\nexport {\n advancedFilterCondition,\n advancedFilterGroup,\n normalizeAdvancedFilterModel,\n normalizeColumnFilter,\n normalizeFilterModel\n} from \"./lib/advancedFilter\";\nexport { isColDefGroup } from \"./types/colDef\";\nexport type {\n ValueGetterParams,\n ValueFormatterParams,\n ValueSetterParams,\n CellRendererParams,\n CellClassParams,\n EditableParams,\n CellEditorParams,\n GetRowIdParams,\n GetRowHeightParams,\n HeaderComponentParams,\n ICellEditor,\n ICellRendererResult,\n CellRendererOutput\n} from \"./types/params\";\nexport type {\n GridOptions,\n ResolvedGridOptions,\n EventHandlers,\n RowSelectionMode,\n GridSize,\n ColumnLayoutMode,\n DomLayoutMode,\n ThemeMode,\n GridEditType,\n EditableIndicator,\n RowEditValidationParams,\n RowEditValidationResult,\n DetailRowRendererParams,\n TreeDataLoadParams,\n GridComponents,\n GridFeature,\n GridFeatureContext,\n OverlayContent,\n OverlayTemplate,\n ColumnStateStore,\n GridStateStore,\n StatusBarPanel,\n StatusBarConfig,\n GridDatasource,\n InfiniteGetRowsParams,\n PaginationConfig,\n WatermarkConfig,\n ActionPolicy,\n ActionPolicyContext\n} from \"./types/options\";\nexport { GRID_SIZE_PRESETS } from \"./core/resolveOptions\";\nexport type { GridSizePreset } from \"./core/resolveOptions\";\nexport { GRID_OPTION_META, GRID_OPTION_KEYS, DIRECT_GRID_OPTION_KEYS } from \"./core/gridOptionMetadata\";\nexport { matchesGridOptionKind, sanitizeGridOptionPatch } from \"./core/gridOptionRuntime\";\nexport type {\n GridOptionKey,\n GridOptionMetadata,\n GridOptionUpdateMode,\n GridOptionValueKind\n} from \"./core/gridOptionMetadata\";\nexport { describeFilter } from \"./lib/filterSummary\";\nexport { validateGridOptions } from \"./lib/validateOptions\";\nexport type { GridValidationCode, GridValidationIssue } from \"./lib/validateOptions\";\nexport { resolveGridFeatures } from \"./lib/featureManifest\";\nexport type { GridFeatureIssue, GridFeatureIssueCode, ResolvedGridFeatures } from \"./lib/featureManifest\";\nexport { buildColDefsFromSchema } from \"./lib/schema\";\nexport type { GridSchema, GridSchemaField, GridSchemaGroup, GridSchemaFieldType, SchemaSelectOption } from \"./lib/schema\";\nexport {\n saveColumnState,\n loadColumnState,\n clearColumnState,\n createColumnStateKey,\n createLocalColumnStateStore\n} from \"./lib/columnStateStore\";\nexport { saveGridState, loadGridState, clearGridState, createLocalGridStateStore } from \"./lib/gridStateStore\";\nexport type { LocalGridStateStoreOptions, ManagedGridStateStore, StoredGridState } from \"./lib/gridStateStore\";\nexport type {\n ColumnStateKeyParts,\n ColumnStateStorage,\n LocalColumnStateStoreOptions,\n ManagedColumnStateStore,\n StoredColumnState\n} from \"./lib/columnStateStore\";\nexport { BUILTIN_AGG_FUNCS, createAggResolver } from \"./lib/aggregate\";\nexport type { AggFunction, AggValues } from \"./lib/aggregate\";\nexport { DEFAULT_LOCALE, LOCALE_EN, matchLocaleKey, formatText, formatTwo } from \"./lib/locale\";\nexport type { RgLocale, RgLocaleKey } from \"./lib/locale\";\nexport { toTsv, parseTsv, parseCsv, parseDelimited } from \"./lib/clipboard\";\nexport { escapeHtml, downloadFile } from \"./lib/download\";\nexport { createMachTableCommands } from \"./lib/controller\";\nexport type { MachTableCommandOptions, MachTableCommands } from \"./lib/controller\";\nexport { sanitizeFormulaCell } from \"./lib/csv\";\nexport {\n registerCellRenderer,\n registerCellEditor,\n getCellRenderer,\n getCellEditor,\n clearComponentRegistries\n} from \"./lib/componentRegistry\";\nexport {\n createStatusTagRenderer,\n createProgressBarRenderer,\n createActionButtonsRenderer,\n createRowActionsRenderer,\n linkRenderer,\n resolveTagVariant,\n registerBuiltinRenderers\n} from \"./lib/presetRenderers\";\nexport type {\n TagVariant,\n StatusTagConfig,\n ProgressConfig,\n ActionItem,\n ActionButtonsConfig,\n RowActionsConfig,\n ActionVariant,\n ActionOverflowMode,\n BuiltInActionIcon\n} from \"./lib/presetRenderers\";\nexport { selectionColumn, indexColumn, dragColumn, actionsColumn, rowActionsColumn } from \"./lib/presetColumns\";\nexport { createColumnHelper, defineColumns } from \"./lib/columnHelper\";\nexport type { ColumnHelper } from \"./lib/columnHelper\";\nexport type { FieldPath, FieldPathValue } from \"./types/path\";\nexport { createMachTablePreset, createEnterprisePreset, defineMachTablePreset, defineGridOptions } from \"./lib/presets\";\nexport {\n defineMachTableConfig,\n mergeMachTableConfig,\n normalizeMachTableConfig,\n resolveMachTableGridOptions\n} from \"./lib/configuration\";\nexport type {\n MachTableConfigWarning,\n MachTableOptionExplanation,\n MachTablePresetSelection,\n MachTableRuntimeConfig,\n ResolvedMachTableConfig,\n ResolvedMachTableGridOptions\n} from \"./lib/configuration\";\nexport {\n createBusinessColumnTypes,\n createCachedDictionary,\n createDictionaryRenderer\n} from \"./lib/businessColumns\";\nexport type {\n BusinessColumnType,\n BusinessColumnTypeOptions,\n CachedDictionary,\n CachedDictionaryOptions,\n DictionaryEntry,\n DictionaryKey,\n DictionaryRendererOptions\n} from \"./lib/businessColumns\";\nexport type { TooltipParams, ContextMenuParams, ContextMenuItem } from \"./types/params\";\nexport type {\n GridApi,\n CsvExportParams,\n RowTransaction,\n GridCellChange,\n GridChange,\n GridBatchSaveResult,\n SaveChangeConflict,\n SaveChangeIssue,\n GridDiagnosticError,\n GridDiagnostics,\n GridPerformanceSnapshot,\n ColumnWorkbenchItem,\n SaveChangesResult,\n SaveChangesHandler,\n ImportCsvOptions,\n PrintOptions\n} from \"./types/api\";\nexport { createSaveSnapshot, normalizeBatchSaveResult, resolveSaveConflict } from \"./lib/batchSave\";\nexport type { RowNode } from \"./types/row\";\nexport type {\n GridState,\n GridStateInput,\n LegacyGridStateV1,\n GridStateSection,\n ApplyGridStateOptions\n} from \"./types/state\";\nexport { migrateGridState } from \"./lib/gridState\";\nexport type {\n GridViewManager,\n GridViewState,\n GridViewStore,\n SavedGridView\n} from \"./types/views\";\nexport {\n applyGridViewState,\n captureGridViewState,\n createGridViewManager,\n createLocalGridViewStore,\n normalizeGridViewState,\n normalizeSavedGridView\n} from \"./lib/gridViewStore\";\nexport type { LocalGridViewStoreOptions } from \"./lib/gridViewStore\";\nexport type {\n GridEventMap,\n GridEventType,\n GridEventBase,\n GridReadyEvent,\n CellClickEvent,\n CellDoubleClickEvent,\n CellContextMenuEvent,\n RowClickEvent,\n SelectionChangedEvent,\n SortChangedEvent,\n FilterChangedEvent,\n ColumnResizedEvent,\n ColumnMovedEvent,\n ColumnVisibilityChangedEvent,\n CellValueChangedEvent,\n CellEditingStartedEvent,\n CellEditingStoppedEvent,\n RowEditingStartedEvent,\n RowEditingStoppedEvent,\n RowEditChange,\n ModelUpdatedEvent,\n DetailToggledEvent,\n TreeChildrenLoadedEvent,\n TreeChildrenLoadFailedEvent,\n RowDragEndEvent,\n RangeSelectionChangedEvent,\n GridCellRange,\n PaginationChangedEvent,\n GridErrorEvent,\n GridErrorCode,\n DirtyStateChangedEvent\n} from \"./types/events\";\nexport { EVENT_TYPES } from \"./types/events\";\nexport { Column } from \"./services/column\";\nexport { evaluateColumnFilter } from \"./services/filterService\";\nexport { sortNodes } from \"./services/sortService\";\n\nexport const version: string = packageJson.version;\n","{\n \"name\": \"@agile-team/mach-table\",\n \"version\": \"0.18.1\",\n \"description\": \"Enterprise-grade, framework-agnostic TypeScript data grid with virtualization, editing, grouping and extensibility\",\n \"keywords\": [\n \"data-grid\",\n \"table\",\n \"virtualization\",\n \"typescript\",\n \"enterprise\",\n \"vue\",\n \"react\"\n ],\n \"author\": \"ChenyCHENYU (Agile Team)\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"homepage\": \"https://github.com/ChenyCHENYU/MachTable#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/ChenyCHENYU/MachTable/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ChenyCHENYU/MachTable.git\",\n \"directory\": \"packages/core\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./styles/mach-table.css\": {\n \"types\": \"./styles/mach-table.css.d.ts\",\n \"default\": \"./styles/mach-table.css\"\n }\n },\n \"files\": [\n \"dist\",\n \"styles\"\n ],\n \"sideEffects\": [\n \"**/*.css\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:coverage\": \"vitest run --coverage\"\n }\n}\n","type EventKey<TEvents extends object> = Extract<keyof TEvents, string>;\ntype Listener<TEvent> = (event: TEvent) => void;\n\nexport class EventBus<TEvents extends object = Record<string, any>> {\n private listeners = new Map<EventKey<TEvents>, Set<Listener<any>>>();\n\n constructor(private onListenerError?: (error: unknown, eventType: EventKey<TEvents>) => void) {}\n\n on<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): () => void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener as Listener<any>);\n return () => {\n set.delete(listener);\n };\n }\n\n once<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): () => void {\n const off = this.on(type, (event) => {\n off();\n listener(event);\n });\n return off;\n }\n\n off<K extends EventKey<TEvents>>(type: K, listener: Listener<TEvents[K]>): void {\n const set = this.listeners.get(type);\n if (set) {\n set.delete(listener as Listener<any>);\n if (set.size === 0) this.listeners.delete(type);\n }\n }\n\n emit<K extends EventKey<TEvents>>(type: K, payload?: TEvents[K]): void {\n const set = this.listeners.get(type);\n if (!set) return;\n for (const listener of [...set]) {\n try {\n listener(payload);\n } catch (err) {\n console.error(`[mach-table] error in \"${type}\" listener`, err);\n this.onListenerError?.(err, type);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","const UNSAFE_PATH_SEGMENTS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\nexport function isSafePath(path: string): boolean {\n if (typeof path !== \"string\" || path.length === 0) return false;\n const parts = path.split(\".\");\n return parts.every((part) => part.length > 0 && !UNSAFE_PATH_SEGMENTS.has(part));\n}\n\nexport function getByPath(obj: any, path: string): any {\n if (obj == null) return undefined;\n if (!isSafePath(path)) return undefined;\n const dot = path.indexOf(\".\");\n if (dot < 0) return obj[path];\n let cur = obj;\n let start = 0;\n while (start < path.length) {\n if (cur == null) return undefined;\n const idx = path.indexOf(\".\", start);\n if (idx < 0) {\n cur = cur[path.slice(start)];\n break;\n }\n cur = cur[path.slice(start, idx)];\n start = idx + 1;\n }\n return cur;\n}\n\nexport function setByPath(obj: any, path: string, value: any): boolean {\n if (obj == null || !isSafePath(path)) return false;\n const parts = path.split(\".\");\n let cur = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n if ((typeof cur !== \"object\" && typeof cur !== \"function\") || cur === null) return false;\n if (cur[parts[i]] == null) cur[parts[i]] = {};\n cur = cur[parts[i]];\n }\n if ((typeof cur !== \"object\" && typeof cur !== \"function\") || cur === null) return false;\n cur[parts[parts.length - 1]] = value;\n return true;\n}\n","import type { ColumnFilter } from \"../types/colDef\";\nimport type {\n AdvancedFilterCondition,\n AdvancedFilterGroup,\n AdvancedFilterModel,\n AdvancedFilterNode\n} from \"../types/advancedFilter\";\n\nconst MAX_DEPTH = 16;\nconst MAX_NODES = 512;\nconst MAX_CONDITIONS = 20;\nconst MAX_SET_VALUES = 2_000;\nconst MAX_FILTER_COLUMNS = 2_000;\n\nconst TEXT_MATCHES = new Set([\n \"contains\", \"notContains\", \"equals\", \"notEquals\", \"startsWith\", \"endsWith\", \"blank\", \"notBlank\"\n]);\nconst NUMBER_MATCHES = new Set([\n \"equals\", \"notEquals\", \"lessThan\", \"lessThanOrEqual\", \"greaterThan\", \"greaterThanOrEqual\", \"inRange\", \"blank\", \"notBlank\"\n]);\nconst DATE_MATCHES = new Set([\"equals\", \"notEquals\", \"lessThan\", \"greaterThan\", \"inRange\", \"blank\", \"notBlank\"]);\n\nfunction primitive(value: unknown): value is string | number | null {\n return value == null || typeof value === \"string\" || (typeof value === \"number\" && Number.isFinite(value));\n}\n\nfunction matchesFor(type: \"text\" | \"number\" | \"date\"): ReadonlySet<string> {\n if (type === \"text\") return TEXT_MATCHES;\n return type === \"number\" ? NUMBER_MATCHES : DATE_MATCHES;\n}\n\nfunction normalizedCondition(\n entry: unknown,\n type: \"text\" | \"number\" | \"date\",\n matches: ReadonlySet<string>\n): Record<string, unknown> | null {\n if (entry == null || typeof entry !== \"object\") return null;\n const condition = entry as Record<string, unknown>;\n if (typeof condition.match !== \"string\" || !matches.has(condition.match)) return null;\n return { match: condition.match, ...conditionValues(condition, type) };\n}\n\nfunction conditionValues(\n condition: Record<string, unknown>,\n type: \"text\" | \"number\" | \"date\"\n): Record<string, unknown> {\n const value = type === \"number\"\n ? finiteNumber(condition.value)\n : typeof condition.value === \"string\" ? condition.value : undefined;\n const value2 = type === \"number\"\n ? finiteNumber(condition.value2)\n : typeof condition.value2 === \"string\" ? condition.value2 : undefined;\n return { ...(value !== undefined ? { value } : {}), ...(value2 !== undefined ? { value2 } : {}) };\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction normalizedConditions(\n input: unknown[],\n type: \"text\" | \"number\" | \"date\"\n): Array<Record<string, unknown>> {\n const output: Array<Record<string, unknown>> = [];\n const matches = matchesFor(type);\n for (const entry of input.slice(0, MAX_CONDITIONS)) {\n const condition = normalizedCondition(entry, type, matches);\n if (condition) output.push(condition);\n }\n return output;\n}\n\nexport function normalizeColumnFilter(input: unknown): ColumnFilter | null {\n if (input == null || typeof input !== \"object\") return null;\n const source = input as Record<string, unknown>;\n if (source.type === \"set\") {\n if (!Array.isArray(source.values)) return null;\n return { type: \"set\", values: source.values.filter(primitive).slice(0, MAX_SET_VALUES) };\n }\n if (source.type !== \"text\" && source.type !== \"number\" && source.type !== \"date\") return null;\n if (!Array.isArray(source.conditions)) return null;\n return {\n type: source.type,\n ...(source.operator === \"or\" || source.operator === \"and\" ? { operator: source.operator } : {}),\n conditions: normalizedConditions(source.conditions, source.type)\n } as unknown as ColumnFilter;\n}\n\ninterface AdvancedNormalizationContext {\n ancestors: WeakSet<object>;\n nodes: number;\n validColumnIds?: ReadonlySet<string>;\n}\n\nfunction normalizeConditionNode(\n node: Record<string, unknown>,\n context: AdvancedNormalizationContext\n): AdvancedFilterCondition | null {\n if (typeof node.colId !== \"string\" || !node.colId.trim()) return null;\n const colId = node.colId.trim();\n if (context.validColumnIds?.has(colId) === false) return null;\n const filter = normalizeColumnFilter(node.filter);\n return filter ? { kind: \"condition\", colId, filter } : null;\n}\n\nfunction normalizeGroupNode(\n node: Record<string, unknown>,\n depth: number,\n context: AdvancedNormalizationContext\n): AdvancedFilterGroup | null {\n if (!Array.isArray(node.children)) return null;\n const children: AdvancedFilterNode[] = [];\n for (const child of node.children) {\n const normalized = normalizeAdvancedNode(child, depth + 1, context);\n if (normalized) children.push(normalized);\n }\n if (children.length === 0) return null;\n return {\n kind: \"group\",\n operator: node.operator === \"or\" ? \"or\" : \"and\",\n children,\n ...(node.not === true ? { not: true } : {})\n };\n}\n\nfunction canNormalizeNode(value: unknown, depth: number, context: AdvancedNormalizationContext): value is object {\n return depth <= MAX_DEPTH && context.nodes < MAX_NODES && value != null && typeof value === \"object\";\n}\n\nfunction normalizeAdvancedNode(\n value: unknown,\n depth: number,\n context: AdvancedNormalizationContext\n): AdvancedFilterNode | null {\n if (!canNormalizeNode(value, depth, context)) return null;\n if (context.ancestors.has(value)) return null;\n context.ancestors.add(value);\n context.nodes++;\n const node = value as Record<string, unknown>;\n const result = node.kind === \"condition\"\n ? normalizeConditionNode(node, context)\n : node.kind === \"group\" ? normalizeGroupNode(node, depth, context) : null;\n context.ancestors.delete(value);\n return result;\n}\n\n/** Clones and bounds untrusted JSON before it reaches the row pipeline. */\nexport function normalizeAdvancedFilterModel(\n input: unknown,\n validColumnIds?: ReadonlySet<string>\n): AdvancedFilterModel | null {\n if (input == null || typeof input !== \"object\") return null;\n const source = input as Partial<AdvancedFilterModel>;\n if (source.version !== 1 || source.root == null) return null;\n const root = normalizeAdvancedNode(source.root, 0, {\n ancestors: new WeakSet<object>(), nodes: 0, validColumnIds\n });\n return root ? { version: 1, root } : null;\n}\n\nexport function advancedFilterCondition(colId: string, filter: ColumnFilter): AdvancedFilterCondition {\n return { kind: \"condition\", colId, filter };\n}\n\nexport function normalizeFilterModel(\n input: unknown,\n validColumnIds?: ReadonlySet<string>\n): import(\"../types/colDef\").FilterModel {\n if (input == null || typeof input !== \"object\" || Array.isArray(input)) return {};\n const output: import(\"../types/colDef\").FilterModel = {};\n for (const [rawId, value] of Object.entries(input).slice(0, MAX_FILTER_COLUMNS)) {\n const colId = rawId.trim();\n if (!colId || validColumnIds?.has(colId) === false) continue;\n const filter = normalizeColumnFilter(value);\n if (filter) output[colId] = filter;\n }\n return output;\n}\n\nexport function advancedFilterGroup(\n operator: \"and\" | \"or\",\n children: AdvancedFilterNode[],\n options: { not?: boolean } = {}\n): AdvancedFilterGroup {\n return { kind: \"group\", operator, children, ...(options.not ? { not: true } : {}) };\n}\n","import type { GridOptions, GridSize, ResolvedGridOptions } from \"../types/options\";\nimport type { ColDef } from \"../types/colDef\";\nimport { getByPath } from \"../lib/path\";\nimport { normalizeAdvancedFilterModel } from \"../lib/advancedFilter\";\n\nexport const DEFAULT_COL_DEF: Partial<ColDef> = {\n sortable: true,\n resizable: true,\n movable: true,\n filter: false,\n minWidth: 80\n};\n\nexport interface GridSizePreset {\n rowHeight: number;\n headerHeight: number;\n fontSize: number;\n cellPadding: number;\n}\n\nexport const GRID_SIZE_PRESETS: Record<GridSize, GridSizePreset> = {\n compact: { rowHeight: 30, headerHeight: 34, fontSize: 12, cellPadding: 6 },\n normal: { rowHeight: 36, headerHeight: 40, fontSize: 13, cellPadding: 9 },\n large: { rowHeight: 44, headerHeight: 48, fontSize: 14, cellPadding: 12 }\n};\n\nfunction finiteAtLeast(value: unknown, fallback: number, min: number, integer = false): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < min) return fallback;\n return integer ? Math.floor(value) : value;\n}\n\nfunction resolveSize(value: GridOptions[\"size\"]): GridSize {\n return value && Object.prototype.hasOwnProperty.call(GRID_SIZE_PRESETS, value) ? value : \"normal\";\n}\n\nfunction resolveTheme(options: GridOptions): ResolvedGridOptions[\"theme\"] {\n if (options.theme === \"light\" || options.theme === \"dark\" || options.theme === \"auto\") return options.theme;\n return options.className?.includes(\"mach-theme-dark\") ? \"dark\" : \"light\";\n}\n\nfunction resolvePageSizeOptions<TData>(options: GridOptions<TData>, pageSize: number): number[] {\n const requested =\n typeof options.pagination === \"object\" && Array.isArray(options.pagination.pageSizeOptions)\n ? options.pagination.pageSizeOptions\n : undefined;\n const values = requested\n ? [...new Set(requested.map((value) => finiteAtLeast(value, 0, 1, true)).filter(Boolean))]\n : [10, 20, 50, 100];\n if (!values.includes(pageSize)) values.push(pageSize);\n return values.sort((left, right) => left - right);\n}\n\nexport function rowIdFromKey<TData>(rowKey: NonNullable<GridOptions<TData>[\"rowKey\"]>, data: TData): string {\n const value = typeof rowKey === \"function\" ? rowKey(data) : getByPath(data, rowKey);\n return value == null ? \"\" : String(value);\n}\n\nfunction resolveRowIdentity<TData>(options: GridOptions<TData>): Pick<ResolvedGridOptions<TData>, \"getRowId\" | \"rowKey\"> {\n const rowKey = options.rowKey;\n const getRowId = options.getRowId ?? (rowKey\n ? ({ data }: { data: TData }) => rowIdFromKey(rowKey, data)\n : undefined);\n return {\n ...(getRowId ? { getRowId } : {}),\n ...(rowKey ? { rowKey } : {})\n };\n}\n\nfunction resolveDataAndLayout<TData>(options: GridOptions<TData>, size: GridSize) {\n const preset = GRID_SIZE_PRESETS[size];\n return {\n columnDefs: Array.isArray(options.columnDefs) ? options.columnDefs : [],\n rowData: Array.isArray(options.rowData) ? options.rowData : [],\n defaultColDef: { ...DEFAULT_COL_DEF, ...(options.defaultColDef ?? {}) },\n columnTypes: options.columnTypes ?? {},\n ...resolveRowIdentity(options),\n rowHeight: finiteAtLeast(options.rowHeight, preset.rowHeight, 1),\n headerHeight: finiteAtLeast(options.headerHeight, preset.headerHeight, 1),\n rowBuffer: finiteAtLeast(options.rowBuffer, 8, 0, true),\n columnLayout: options.columnLayout === \"fit\" ? \"fit\" as const : \"normal\" as const,\n enableColumnResize: options.enableColumnResize === true,\n domLayout: options.domLayout === \"autoHeight\" ? \"autoHeight\" as const : \"normal\" as const,\n rowSelection:\n options.rowSelection === \"single\" || options.rowSelection === \"multiple\"\n ? options.rowSelection\n : \"none\" as const,\n multiSort: options.multiSort ?? true,\n size,\n pinnedTopRowData: Array.isArray(options.pinnedTopRowData) ? options.pinnedTopRowData : [],\n pinnedBottomRowData: Array.isArray(options.pinnedBottomRowData) ? options.pinnedBottomRowData : []\n };\n}\n\nfunction resolveAppearance(options: GridOptions) {\n return {\n stripedRows: options.stripedRows ?? false,\n showCellBorders: options.showCellBorders ?? false,\n theme: resolveTheme(options),\n quickFilterText: options.quickFilterText ?? null,\n suppressCellFocus: options.suppressCellFocus ?? false,\n suppressRowHoverHighlight: options.suppressRowHoverHighlight ?? false,\n suppressNoRowsOverlay: options.suppressNoRowsOverlay ?? false,\n suppressHeaderFocus: options.suppressHeaderFocus ?? false,\n loading: options.loading ?? false,\n error: options.error ?? null,\n className: options.className ?? \"\"\n };\n}\n\nfunction resolveEditingAndHistory(options: GridOptions) {\n return {\n editType: options.editType === \"fullRow\" ? \"fullRow\" as const : \"cell\" as const,\n editableIndicator:\n options.editableIndicator === \"always\" || options.editableIndicator === \"none\"\n ? options.editableIndicator\n : \"hover\" as const,\n singleClickEdit: options.singleClickEdit ?? false,\n manualSorting: options.manualSorting ?? false,\n manualFiltering: options.manualFiltering ?? false,\n showSummary: options.showSummary ?? false,\n indexOffset: options.indexOffset ?? 0,\n applyRowDrag: options.applyRowDrag ?? true,\n undoStackSize: finiteAtLeast(options.undoStackSize, 100, 0, true),\n asyncTransactionWaitMillis: finiteAtLeast(options.asyncTransactionWaitMillis, 16, 0, true)\n };\n}\n\nfunction resolveHierarchy(options: GridOptions) {\n return {\n masterDetail: options.masterDetail ?? false,\n detailRowHeight: finiteAtLeast(options.detailRowHeight, 240, 1),\n detailToggleColumn: options.detailToggleColumn ?? true,\n treeData: options.treeData ?? false,\n childrenKey: options.childrenKey ?? \"children\",\n autoCheckedChildren: options.autoCheckedChildren ?? true,\n defaultExpandAll: options.defaultExpandAll ?? false\n };\n}\n\nfunction resolvePagination<TData>(options: GridOptions<TData>) {\n const config = typeof options.pagination === \"object\" ? options.pagination : undefined;\n const pageSize = finiteAtLeast(\n config?.pageSize,\n 20,\n 1,\n true\n );\n return {\n paginationEnabled: options.pagination !== false && options.datasource == null,\n paginationMode: config?.mode === \"server\" ? \"server\" as const : \"client\" as const,\n paginationPage: finiteAtLeast(config?.page, 1, 1, true),\n paginationTotal: finiteAtLeast(config?.total, 0, 0, true),\n paginationPageSize: pageSize,\n paginationPageSizeOptions: resolvePageSizeOptions(options, pageSize),\n paginationShowTotal: config ? config.showTotal !== false : true,\n paginationShowSizeSelector: config ? config.showPageSizeSelector !== false : true\n };\n}\n\nfunction resolveWatermark(options: GridOptions) {\n return {\n watermarkEnabled: options.watermark != null && options.watermark !== false,\n watermarkConfig:\n options.watermark == null || options.watermark === false\n ? null\n : options.watermark === true\n ? { text: \"MachTable\" }\n : options.watermark\n };\n}\n\nfunction resolveInteraction(options: GridOptions) {\n return {\n columnMenu: options.columnMenu ?? false,\n columnStateKey: options.columnStateKey ?? null,\n advancedFilterModel: normalizeAdvancedFilterModel(options.advancedFilterModel),\n ...resolveStatePersistence(options),\n locale: options.locale ?? {},\n suppressWarnings: options.suppressWarnings ?? false,\n enableRangeSelection: options.enableRangeSelection ?? false,\n suppressClipboard: options.suppressClipboard ?? false,\n contextMenu: options.contextMenu ?? false,\n tooltipShowDelay: finiteAtLeast(options.tooltipShowDelay, 600, 0),\n flashCells: options.flashCells ?? true,\n fillHandle: options.fillHandle ?? true,\n statusBarEnabled:\n options.statusBar === true || (typeof options.statusBar === \"object\" && options.statusBar != null),\n statusBarPanels:\n typeof options.statusBar === \"object\" && options.statusBar?.panels\n ? options.statusBar.panels\n : [\"rowCount\", \"selectedRowCount\", \"rangeAggregate\"] as const\n };\n}\n\nfunction resolveStatePersistence(options: GridOptions) {\n return {\n stateKey: options.stateKey ?? null,\n stateSaveDebounceMs: finiteAtLeast(options.stateSaveDebounceMs, 160, 0, true)\n };\n}\n\nfunction resolveDatasource(options: GridOptions) {\n return {\n blockSize: finiteAtLeast(options.blockSize, 100, 1, true),\n infiniteBufferRows: finiteAtLeast(options.infiniteBufferRows, 40, 0, true),\n datasourceRetryCount: finiteAtLeast(options.datasourceRetryCount, 2, 0, true),\n datasourceRetryDelay: finiteAtLeast(options.datasourceRetryDelay, 300, 0, true)\n };\n}\n\nfunction resolveAccessibility(options: GridOptions) {\n return {\n ariaLabel: options.ariaLabel ?? \"MachTable data grid\",\n ariaLabelledBy: options.ariaLabelledBy ?? \"\",\n ariaDescribedBy: options.ariaDescribedBy ?? \"\",\n overlayNoRowsTemplate: options.overlayNoRowsTemplate ?? \"\",\n overlayLoadingTemplate: options.overlayLoadingTemplate ?? \"\",\n overlayErrorTemplate: options.overlayErrorTemplate ?? \"\",\n allowUnsafeOverlayHtml: options.allowUnsafeOverlayHtml ?? false\n };\n}\n\nconst OPTIONAL_OPTION_KEYS = [\n \"stateStore\",\n \"detailRowRenderer\",\n \"isRowExpandable\",\n \"columnStateStore\",\n \"aggFuncs\",\n \"components\",\n \"actionPolicy\",\n \"summaryMethod\",\n \"datasource\",\n \"getRowHeight\",\n \"tooltipComponent\",\n \"getContextMenuItems\",\n \"initialState\",\n \"rowEditValidator\",\n \"isTreeRowExpandable\",\n \"loadTreeChildren\"\n] as const;\n\nfunction copyOptionalOptions<TData>(\n source: GridOptions<TData>,\n target: ResolvedGridOptions<TData>\n): void {\n for (const key of OPTIONAL_OPTION_KEYS) {\n if (source[key]) Object.assign(target, { [key]: source[key] });\n }\n}\n\nfunction copyEventHandlers<TData>(source: GridOptions<TData>, target: ResolvedGridOptions<TData>): void {\n for (const key of Object.keys(source) as (keyof GridOptions<TData>)[]) {\n if (key.startsWith(\"on\") && typeof source[key] === \"function\") {\n Object.assign(target, { [key]: source[key] });\n }\n }\n}\n\nexport function resolveOptions<TData>(userOptions: GridOptions<TData>): ResolvedGridOptions<TData> {\n const size = resolveSize(userOptions.size);\n const resolved = {\n ...resolveDataAndLayout(userOptions, size),\n ...resolveAppearance(userOptions),\n ...resolveEditingAndHistory(userOptions),\n ...resolveHierarchy(userOptions),\n ...resolvePagination(userOptions),\n ...resolveWatermark(userOptions),\n ...resolveInteraction(userOptions),\n ...resolveDatasource(userOptions),\n ...resolveAccessibility(userOptions),\n features: Array.isArray(userOptions.features) ? userOptions.features : []\n } as ResolvedGridOptions<TData>;\n\n copyOptionalOptions(userOptions, resolved);\n copyEventHandlers(userOptions, resolved);\n\n return resolved;\n}\n\nexport function columnTypeNames(type: ColDef[\"type\"]): readonly string[] {\n if (Array.isArray(type)) return type.filter((name): name is string => typeof name === \"string\" && name.length > 0);\n return typeof type === \"string\" && type.length > 0 ? [type] : [];\n}\n\nexport function hasColumnType(colDef: Pick<ColDef, \"type\">, name: string): boolean {\n return columnTypeNames(colDef.type).includes(name);\n}\n\nexport function mergeColDef<TData>(\n colDef: ColDef<TData>,\n defaults: Partial<ColDef<TData>>,\n columnTypes: Readonly<Record<string, Partial<ColDef<TData>>>> = {}\n): ColDef<TData> {\n const typedDefaults: Partial<ColDef<TData>> = {};\n for (const name of columnTypeNames(colDef.type)) {\n const definition = columnTypes[name];\n if (definition) Object.assign(typedDefaults, definition);\n }\n return { ...defaults, ...typedDefaults, ...colDef } as ColDef<TData>;\n}\n","import type { ColDef, FilterType, PinnedDirection } from \"../types/colDef\";\nimport type { ColumnGroup } from \"./columnGroup\";\n\nexport class Column<TData = any> {\n readonly id: string;\n readonly colDef: ColDef<TData>;\n hide: boolean;\n pinned: PinnedDirection | null;\n manualWidth: number | null = null;\n flex: number | null = null;\n currentWidth = 0;\n parentGroup: ColumnGroup<TData> | null = null;\n level = 0;\n isDetailToggle = false;\n\n constructor(id: string, colDef: ColDef<TData>) {\n this.id = id;\n this.colDef = colDef;\n this.hide = colDef.hide ?? false;\n const p = colDef.pinned;\n this.pinned = p === true ? \"left\" : p === false || p == null ? null : p;\n this.resetWidth();\n }\n\n get sortable(): boolean {\n return this.colDef.sortable !== false;\n }\n\n get resizable(): boolean {\n return this.colDef.resizable !== false;\n }\n\n get movable(): boolean {\n return this.colDef.movable !== false;\n }\n\n get filterable(): boolean {\n return this.colDef.filter != null && this.colDef.filter !== false;\n }\n\n get filterType(): FilterType {\n const f = this.colDef.filter;\n return f === true ? \"text\" : (f as FilterType) ?? \"text\";\n }\n\n get hasCheckbox(): boolean {\n return this.colDef.checkboxSelection === true;\n }\n\n resetWidth(): void {\n this.manualWidth = null;\n this.flex = typeof this.colDef.flex === \"number\" && Number.isFinite(this.colDef.flex) && this.colDef.flex > 0\n ? this.colDef.flex\n : null;\n }\n}\n","import type { ColDefGroup } from \"../types/colDef\";\nimport type { Column } from \"./column\";\n\nexport class ColumnGroup<TData = any> {\n readonly groupId: string;\n readonly def: ColDefGroup<TData>;\n parent: ColumnGroup<TData> | null = null;\n children: (ColumnGroup<TData> | Column<TData>)[] = [];\n\n constructor(groupId: string, def: ColDefGroup<TData>) {\n this.groupId = groupId;\n this.def = def;\n }\n\n get headerName(): string {\n return this.def.headerName ?? this.def.groupId ?? \"\";\n }\n\n getLeafColumns(out: Column<TData>[] = []): Column<TData>[] {\n for (const child of this.children) {\n if (child instanceof ColumnGroup) child.getLeafColumns(out);\n else out.push(child);\n }\n return out;\n }\n}\n","import type {\n CellClassParams,\n CellEditorParams,\n CellRendererParams,\n EditableParams,\n HeaderComponentParams,\n ICellEditor,\n ICellRendererResult,\n ValueFormatterParams,\n ValueGetterParams,\n ValueSetterParams\n} from \"./params\";\nimport type { CellClickEvent, CellDoubleClickEvent } from \"./events\";\nimport type { RowNode } from \"./row\";\n\nexport type SortDirection = \"asc\" | \"desc\";\nexport type PinnedDirection = \"left\" | \"right\";\nexport type FilterType = \"text\" | \"number\" | \"date\" | \"set\";\nexport type CellAlign = \"left\" | \"center\" | \"right\";\n\nexport type TextFilterMatch =\n | \"contains\"\n | \"notContains\"\n | \"equals\"\n | \"notEquals\"\n | \"startsWith\"\n | \"endsWith\"\n | \"blank\"\n | \"notBlank\";\n\nexport type NumberFilterMatch =\n | \"equals\"\n | \"notEquals\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"inRange\"\n | \"blank\"\n | \"notBlank\";\n\nexport type DateFilterMatch =\n | \"equals\"\n | \"notEquals\"\n | \"lessThan\"\n | \"greaterThan\"\n | \"inRange\"\n | \"blank\"\n | \"notBlank\";\n\nexport interface TextFilterCondition {\n match: TextFilterMatch;\n value?: string;\n}\n\nexport interface NumberFilterCondition {\n match: NumberFilterMatch;\n value?: number;\n value2?: number;\n}\n\nexport interface DateFilterCondition {\n match: DateFilterMatch;\n value?: string;\n value2?: string;\n}\n\nexport interface SetFilterCondition {\n values: (string | number | null)[];\n}\n\nexport interface TextColumnFilter {\n type: \"text\";\n operator?: \"and\" | \"or\";\n conditions: TextFilterCondition[];\n}\n\nexport interface NumberColumnFilter {\n type: \"number\";\n operator?: \"and\" | \"or\";\n conditions: NumberFilterCondition[];\n}\n\nexport interface DateColumnFilter {\n type: \"date\";\n operator?: \"and\" | \"or\";\n conditions: DateFilterCondition[];\n}\n\nexport interface SetColumnFilter {\n type: \"set\";\n values: (string | number | null)[];\n}\n\nexport type ColumnFilter = TextColumnFilter | NumberColumnFilter | DateColumnFilter | SetColumnFilter;\nexport type FilterModel = Record<string, ColumnFilter>;\n\nexport interface SortModelItem {\n colId: string;\n direction: SortDirection;\n}\nexport type SortModel = SortModelItem[];\n\nexport interface SelectEditorParams {\n values: (string | number)[];\n}\n\nexport interface SetFilterParams {\n values?: (string | number | null)[];\n maxValues?: number;\n}\n\nexport type CellEditorFactory = (params: CellEditorParams) => ICellEditor;\n\nexport type CellRendererFn = (params: CellRendererParams) => string | HTMLElement | ICellRendererResult | null | undefined;\n\nexport type CellClassRule = string | string[] | ((params: CellClassParams) => string | string[] | null | undefined);\n\nexport type CellStyleRule = Partial<CSSStyleDeclaration> | ((params: CellClassParams<any, any>) => Partial<CSSStyleDeclaration> | null | undefined);\n\nexport interface ColDef<TData = any, TValue = any> {\n colId?: string;\n field?: string;\n headerName?: string;\n align?: CellAlign;\n headerAlign?: CellAlign;\n headerClass?: string | string[];\n headerTooltip?: string;\n headerComponent?: (params: HeaderComponentParams<TData>) => string | HTMLElement | ICellRendererResult | null | undefined;\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n /** Excludes the column from `columnLayout: \"fit\"` scaling. */\n suppressSizeToFit?: boolean;\n hide?: boolean;\n pinned?: PinnedDirection | boolean;\n sortable?: boolean;\n resizable?: boolean;\n movable?: boolean;\n filter?: boolean | FilterType;\n filterParams?: SetFilterParams;\n editable?: boolean | ((params: EditableParams<TData, TValue>) => boolean);\n cellEditor?: \"text\" | \"number\" | \"date\" | \"select\" | CellEditorFactory | string;\n cellEditorParams?: SelectEditorParams;\n wrapText?: boolean;\n checkboxSelection?: boolean;\n rowGroup?: boolean;\n aggFunc?: string;\n cellStyle?: CellStyleRule;\n selectable?: (params: CellClassParams<TData, TValue>) => boolean;\n singleClickEdit?: boolean;\n tooltipValueGetter?: (params: ValueFormatterParams<TData, TValue>) => string | null | undefined;\n rowSpan?: (params: CellClassParams<TData, TValue>) => number;\n autoRowSpan?: boolean;\n colSpan?: (params: CellClassParams<TData, TValue>) => number;\n autoHeight?: boolean;\n validate?: (\n newValue: TValue,\n params: ValueSetterParams<TData, TValue>\n ) => string | true | null | undefined | Promise<string | true | null | undefined>;\n rowDrag?: boolean;\n valueGetter?: (params: ValueGetterParams<TData, TValue>) => TValue;\n valueSetter?: (params: ValueSetterParams<TData, TValue>) => boolean;\n valueFormatter?: (params: ValueFormatterParams<TData, TValue>) => any;\n cellRenderer?: CellRendererFn | string;\n cellRendererParams?: Record<string, any>;\n cellClass?: CellClassRule;\n comparator?: (valueA: any, valueB: any, nodeA: RowNode<TData>, nodeB: RowNode<TData>) => number;\n /** Named column type(s), resolved left-to-right before this column definition. */\n type?: string | readonly string[];\n initialSort?: SortDirection;\n onCellClick?: (event: CellClickEvent<TData, TValue>) => void;\n onCellDoubleClick?: (event: CellDoubleClickEvent<TData, TValue>) => void;\n}\n\nexport interface ColDefGroup<TData = any> {\n groupId?: string;\n headerName?: string;\n headerClass?: string | string[];\n children: (ColDefGroup<TData> | ColDef<TData>)[];\n}\n\nexport type ColDefOrGroup<TData = any> = ColDefGroup<TData> | ColDef<TData>;\n\nexport function isColDefGroup<TData = any>(def: ColDefOrGroup<TData>): def is ColDefGroup<TData> {\n return Array.isArray((def as ColDefGroup<TData>).children);\n}\n\nexport interface ColumnState {\n colId: string;\n hide?: boolean;\n width?: number;\n /** Active flex weight. A resize clears flex and turns width into a manual override. */\n flex?: number | null;\n /** Distinguishes responsive/definition width from an explicit user or API override. */\n widthMode?: \"auto\" | \"manual\";\n pinned?: \"left\" | \"right\" | null;\n sort?: SortDirection | null;\n sortIndex?: number | null;\n}\n","export interface WidthInput {\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n}\n\nexport const DEFAULT_COLUMN_WIDTH = 150;\nexport const DEFAULT_MIN_WIDTH = 80;\n\nfunction positiveFinite(value: unknown, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction widthBounds(input: WidthInput): { min: number; max: number } {\n const min = positiveFinite(input.minWidth, DEFAULT_MIN_WIDTH);\n return { min, max: Math.max(min, positiveFinite(input.maxWidth, Number.MAX_SAFE_INTEGER)) };\n}\n\nexport function clampWidth(w: number, input: WidthInput): number {\n const { min, max } = widthBounds(input);\n const width = positiveFinite(w, positiveFinite(input.width, DEFAULT_COLUMN_WIDTH));\n return Math.max(min, Math.min(max, width));\n}\n\nexport function computeColumnWidths(cols: WidthInput[], availableWidth: number): number[] {\n const widths = cols.map((c) => clampWidth(c.width ?? DEFAULT_COLUMN_WIDTH, c));\n\n const flexCols: number[] = [];\n let flexTotal = 0;\n cols.forEach((c, i) => {\n const f = c.flex ?? 0;\n if (f > 0) {\n flexCols.push(i);\n flexTotal += f;\n }\n });\n\n let total = 0;\n for (const w of widths) total += w;\n\n if (flexTotal > 0 && availableWidth > total) {\n let extra = availableWidth - total;\n for (let pass = 0; pass < 4 && extra > 0.5 && flexCols.length > 0; pass++) {\n const remainingFlex: number[] = [];\n let remainingTotal = 0;\n for (const i of flexCols) {\n const f = cols[i].flex ?? 0;\n remainingFlex.push(i);\n remainingTotal += f;\n }\n const consumed: number[] = [];\n for (let k = 0; k < remainingFlex.length; k++) {\n const i = remainingFlex[k];\n const f = cols[i].flex ?? 0;\n const share = (extra * f) / remainingTotal;\n const before = widths[i];\n widths[i] = clampWidth(before + share, cols[i]);\n consumed.push(widths[i] - before);\n }\n let used = 0;\n for (const c of consumed) used += c;\n extra -= used;\n const stillFlexible = remainingFlex.filter((_index, k) => consumed[k] > 0.001);\n if (stillFlexible.length === remainingFlex.length) break;\n flexCols.length = 0;\n for (const i of stillFlexible) flexCols.push(i);\n }\n }\n\n return widths;\n}\n\n/** Fits columns into a viewport while honoring every min/max bound. */\nexport function fitColumnWidths(cols: WidthInput[], availableWidth: number): number[] {\n const widths = cols.map((column) => clampWidth(column.width ?? DEFAULT_COLUMN_WIDTH, column));\n if (!Number.isFinite(availableWidth) || availableWidth <= 0 || cols.length === 0) return widths;\n\n const active = new Set(cols.map((_column, index) => index));\n let remainingWidth = availableWidth;\n for (let pass = 0; pass < cols.length + 1 && active.size > 0; pass++) {\n let weightTotal = 0;\n for (const index of active) weightTotal += Math.max(1, widths[index]);\n if (weightTotal <= 0) break;\n\n let constrained = false;\n for (const index of [...active]) {\n const target = remainingWidth * (Math.max(1, widths[index]) / weightTotal);\n const fitted = clampWidth(target, cols[index]);\n const { min, max } = widthBounds(cols[index]);\n if (target < min || target > max) {\n widths[index] = fitted;\n remainingWidth -= fitted;\n active.delete(index);\n constrained = true;\n }\n }\n if (!constrained) {\n for (const index of active) {\n widths[index] = clampWidth(\n remainingWidth * (Math.max(1, widths[index]) / weightTotal),\n cols[index]\n );\n }\n break;\n }\n remainingWidth = Math.max(0, remainingWidth);\n }\n\n const drift = availableWidth - widths.reduce((sum, width) => sum + width, 0);\n if (Math.abs(drift) > 0.01) {\n for (let index = widths.length - 1; index >= 0; index--) {\n const candidate = clampWidth(widths[index] + drift, cols[index]);\n if (Math.abs(candidate - widths[index]) > 0.01) {\n widths[index] = candidate;\n break;\n }\n }\n }\n return widths;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { Column } from \"./column\";\nimport { ColumnGroup } from \"./columnGroup\";\nimport type {\n ColDef,\n ColDefOrGroup,\n ColumnState,\n SortModel,\n SortModelItem,\n SortDirection,\n PinnedDirection\n} from \"../types/colDef\";\nimport { isColDefGroup } from \"../types/colDef\";\nimport { mergeColDef } from \"../core/resolveOptions\";\nimport { computeColumnWidths, fitColumnWidths, clampWidth, DEFAULT_COLUMN_WIDTH } from \"../lib/layout\";\n\nexport type PaneType = \"left\" | \"center\" | \"right\";\n\nexport const DETAIL_TOGGLE_COL_ID = \"__rg_detail_toggle__\";\ntype ColumnModelContext = Pick<GridCore<any>, \"options\">;\n\nfunction isPositiveFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0;\n}\n\nexport class ColumnModel {\n private columns: Column[] = [];\n private rootChildren: (ColumnGroup<any> | Column<any>)[] = [];\n private left: Column[] = [];\n private center: Column[] = [];\n private right: Column[] = [];\n private sortModel: SortModelItem[] = [];\n private defs: ColDefOrGroup<any>[] = [];\n private headerDepth = 1;\n private flatIndexById = new Map<string, number>();\n viewportWidth = 0;\n\n constructor(private core: ColumnModelContext) {}\n\n setColumnDefs(colDefs: ColDefOrGroup<any>[] | null | undefined): void {\n this.defs = colDefs ? [...colDefs] : [];\n const prev = new Map(this.columns.map((c) => [c.id, c]));\n const defaults = this.core.options.defaultColDef;\n const usedIds = new Set<string>(\n this.core.options.masterDetail && this.core.options.detailToggleColumn\n ? [DETAIL_TOGGLE_COL_ID]\n : []\n );\n\n const build = (list: ColDefOrGroup<any>[], parent: ColumnGroup<any> | null, level: number): (ColumnGroup<any> | Column<any>)[] =>\n list.map((def, i) => {\n if (isColDefGroup(def)) {\n const groupId = def.groupId ?? def.headerName ?? `group_${i}_${level}`;\n const group = new ColumnGroup(groupId, def);\n group.parent = parent;\n group.children = build(def.children, group, level + 1);\n return group;\n }\n const colDef = def as ColDef<any>;\n const id = colDef.colId ?? colDef.field ?? `col_${i}`;\n let uniqueId = id;\n let suffix = 2;\n while (usedIds.has(uniqueId)) uniqueId = `${id}_${suffix++}`;\n usedIds.add(uniqueId);\n const column = new Column(uniqueId, mergeColDef(colDef, defaults, this.core.options.columnTypes));\n column.parentGroup = parent;\n column.level = level;\n const p = prev.get(uniqueId);\n if (p) {\n column.manualWidth = p.manualWidth;\n column.flex = p.flex;\n column.hide = p.hide;\n column.pinned = p.pinned;\n }\n return column;\n });\n\n this.rootChildren = build(this.defs, null, 0);\n\n if (this.core.options.masterDetail && this.core.options.detailToggleColumn) {\n const toggleCol = new Column(DETAIL_TOGGLE_COL_ID, {\n colId: DETAIL_TOGGLE_COL_ID,\n headerName: \"\",\n width: 38,\n pinned: \"left\",\n sortable: false,\n resizable: false,\n movable: false,\n filter: false\n });\n toggleCol.isDetailToggle = true;\n this.rootChildren.unshift(toggleCol);\n }\n\n this.columns = this.collectLeaves(this.rootChildren);\n this.headerDepth = this.columns.reduce((max, c) => Math.max(max, c.level + 1), 1);\n\n this.sortModel = this.sortModel.filter((s) => this.columns.some((c) => c.id === s.colId));\n if (this.sortModel.length === 0) {\n const initial: SortModelItem[] = [];\n for (const c of this.columns) {\n if (c.colDef.initialSort) initial.push({ colId: c.id, direction: c.colDef.initialSort });\n }\n this.sortModel = initial;\n }\n\n this.regroup();\n }\n\n private collectLeaves(children: (ColumnGroup<any> | Column<any>)[], out: Column<any>[] = []): Column<any>[] {\n for (const child of children) {\n if (child instanceof ColumnGroup) this.collectLeaves(child.children, out);\n else out.push(child);\n }\n return out;\n }\n\n private regroup(): void {\n const visible = this.columns.filter((c) => !c.hide);\n this.left = visible.filter((c) => c.pinned === \"left\");\n this.right = visible.filter((c) => c.pinned === \"right\");\n this.center = visible.filter((c) => c.pinned === null);\n this.flatIndexById.clear();\n this.getOrderedVisible().forEach((c, i) => this.flatIndexById.set(c.id, i));\n }\n\n getFlatIndex(colId: string): number {\n return this.flatIndexById.get(colId) ?? -1;\n }\n\n getColumns(): Column[] {\n return this.columns;\n }\n\n getColumnDefs(): ColDefOrGroup<any>[] {\n return this.defs;\n }\n\n getRootChildren(): (ColumnGroup<any> | Column<any>)[] {\n return this.rootChildren;\n }\n\n getHeaderDepth(): number {\n return this.headerDepth;\n }\n\n getColumn(colId: string): Column | undefined {\n return this.columns.find((c) => c.id === colId);\n }\n\n getPaneColumns(pane: PaneType): Column[] {\n return pane === \"left\" ? this.left : pane === \"right\" ? this.right : this.center;\n }\n\n getOrderedVisible(): Column[] {\n return [...this.left, ...this.center, ...this.right];\n }\n\n getRowGroupColumns(): Column[] {\n return this.getOrderedVisible().filter((c) => c.colDef.rowGroup === true);\n }\n\n getAggColumns(): Column[] {\n return this.getOrderedVisible().filter((c) => c.colDef.aggFunc != null && c.colDef.rowGroup !== true);\n }\n\n hasColSpan(): boolean {\n return this.center.some((c) => c.colDef.colSpan != null);\n }\n\n getGroupLabelColumn(): Column | undefined {\n const ordered = this.getOrderedVisible();\n return (\n this.center.find((c) => !c.hasCheckbox && !c.isDetailToggle) ??\n ordered.find((c) => !c.hasCheckbox && !c.isDetailToggle) ??\n ordered[0]\n );\n }\n\n paneOf(column: Column): PaneType {\n return column.pinned === \"left\" ? \"left\" : column.pinned === \"right\" ? \"right\" : \"center\";\n }\n\n computeLayout(viewportWidth: number): void {\n this.viewportWidth = viewportWidth;\n\n let pinnedTotal = 0;\n for (const c of [...this.left, ...this.right]) {\n c.currentWidth = clampWidth(c.manualWidth ?? c.colDef.width ?? DEFAULT_COLUMN_WIDTH, this.widthInputOf(c));\n pinnedTotal += c.currentWidth;\n }\n\n const available = Math.max(0, viewportWidth - pinnedTotal);\n const scalable: Column[] = [];\n const fixed: Column[] = [];\n for (const column of this.center) {\n (column.colDef.suppressSizeToFit || column.manualWidth != null ? fixed : scalable).push(column);\n }\n let fixedTotal = 0;\n for (const column of fixed) {\n column.currentWidth = clampWidth(\n column.manualWidth ?? column.colDef.width ?? DEFAULT_COLUMN_WIDTH,\n this.widthInputOf(column)\n );\n fixedTotal += column.currentWidth;\n }\n const scalableInputs = scalable.map((column) => this.widthInputOf(column));\n const scalableWidth = Math.max(0, available - fixedTotal);\n const widths = this.core.options.columnLayout === \"fit\"\n ? fitColumnWidths(scalableInputs, scalableWidth)\n : computeColumnWidths(scalableInputs, scalableWidth);\n scalable.forEach((column, index) => {\n column.currentWidth = widths[index];\n });\n }\n\n private widthInputOf(c: Column): { width?: number; minWidth?: number; maxWidth?: number; flex?: number } {\n const def = c.colDef;\n if (c.manualWidth != null) {\n return { width: c.manualWidth, minWidth: def.minWidth, maxWidth: def.maxWidth };\n }\n return {\n width: def.width,\n minWidth: def.minWidth,\n maxWidth: def.maxWidth,\n ...(c.flex != null ? { flex: c.flex } : {})\n };\n }\n\n setColumnWidth(column: Column, width: number): boolean {\n if (!isPositiveFiniteNumber(width)) return false;\n column.manualWidth = clampWidth(width, this.widthInputOf(column));\n column.flex = null;\n return true;\n }\n\n setColumnVisibility(colId: string, visible: boolean): void {\n const column = this.getColumn(colId);\n if (!column || column.hide === !visible) return;\n column.hide = !visible;\n this.regroup();\n }\n\n moveColumn(colId: string, toIndex: number): boolean {\n const column = this.getColumn(colId);\n if (!column) return false;\n\n const pane = this.paneOf(column);\n const inScope = (child: Column<any>) =>\n column.parentGroup ? true : this.paneOf(child) === pane;\n\n const container: (ColumnGroup<any> | Column<any>)[] = column.parentGroup\n ? column.parentGroup.children\n : this.rootChildren;\n\n const siblings = container.filter(\n (child): child is Column<any> => child instanceof Column && !child.hide && inScope(child)\n );\n const from = siblings.indexOf(column);\n if (from < 0) return false;\n siblings.splice(from, 1);\n const target = Math.max(0, Math.min(toIndex, siblings.length));\n siblings.splice(target, 0, column);\n\n const leafSlots: number[] = [];\n container.forEach((child, idx) => {\n if (child instanceof Column && !child.hide && inScope(child)) leafSlots.push(idx);\n });\n if (leafSlots.length !== siblings.length) return false;\n leafSlots.forEach((slotIdx, i) => {\n container[slotIdx] = siblings[i];\n });\n\n this.columns = this.collectLeaves(this.rootChildren);\n this.regroup();\n return true;\n }\n\n setColumnPinned(colId: string, pinned: PinnedDirection | null): void {\n const column = this.getColumn(colId);\n if (!column) return;\n column.pinned = pinned;\n this.regroup();\n }\n\n getColumnState(): ColumnState[] {\n return this.columns.map((c) => {\n const sortIndex = this.sortModel.findIndex((s) => s.colId === c.id);\n const state: ColumnState = {\n colId: c.id,\n hide: c.hide,\n width: c.manualWidth ?? c.currentWidth,\n flex: c.flex,\n widthMode: c.manualWidth == null ? \"auto\" : \"manual\",\n pinned: c.pinned\n };\n if (sortIndex >= 0) {\n state.sort = this.sortModel[sortIndex].direction;\n state.sortIndex = sortIndex;\n } else {\n state.sort = null;\n state.sortIndex = null;\n }\n return state;\n });\n }\n\n applyColumnState(states: ColumnState[]): void {\n const stateById = new Map(states.map((s) => [s.colId, s]));\n for (const c of this.columns) {\n const s = stateById.get(c.id);\n if (s) this.applyColumnViewState(c, s);\n }\n this.sortModel = this.sortModelFromState(states);\n this.applyStateOrder(states);\n this.regroup();\n }\n\n private applyColumnViewState(column: Column, state: ColumnState): void {\n if (typeof state.hide === \"boolean\") column.hide = state.hide;\n if (state.widthMode === \"auto\") {\n column.resetWidth();\n if (isPositiveFiniteNumber(state.flex)) column.flex = state.flex;\n } else if (isPositiveFiniteNumber(state.flex)) {\n column.flex = state.flex;\n column.manualWidth = null;\n } else if (isPositiveFiniteNumber(state.width)) {\n column.manualWidth = clampWidth(state.width, this.widthInputOf(column));\n column.flex = null;\n }\n if (state.pinned === \"left\" || state.pinned === \"right\" || state.pinned === null) {\n column.pinned = state.pinned;\n }\n }\n\n private sortModelFromState(states: ColumnState[]): SortModelItem[] {\n const knownIds = new Set(this.columns.map((column) => column.id));\n const seenIds = new Set<string>();\n const nextSort: { colId: string; direction: SortDirection; sortIndex: number }[] = [];\n for (const s of states) {\n if ((s.sort !== \"asc\" && s.sort !== \"desc\") || !knownIds.has(s.colId) || seenIds.has(s.colId)) continue;\n seenIds.add(s.colId);\n const sortIndex = typeof s.sortIndex === \"number\" && Number.isInteger(s.sortIndex) && s.sortIndex >= 0\n ? s.sortIndex\n : nextSort.length;\n nextSort.push({ colId: s.colId, direction: s.sort, sortIndex });\n }\n nextSort.sort((a, b) => a.sortIndex - b.sortIndex);\n return nextSort.map(({ colId, direction }) => ({ colId, direction }));\n }\n\n private applyStateOrder(states: ColumnState[]): void {\n const orderById = new Map<string, number>();\n states.forEach((s, i) => orderById.set(s.colId, i));\n const paneOfCol = (c: Column) => (c.pinned === \"left\" ? \"left\" : c.pinned === \"right\" ? \"right\" : \"center\");\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const current = this.rootChildren.filter(\n (child): child is Column<any> =>\n child instanceof Column && !child.hide && child.parentGroup === null && paneOfCol(child) === pane\n );\n if (current.length < 2) continue;\n const sorted = current\n .slice()\n .sort((a, b) => (orderById.get(a.id) ?? Number.MAX_SAFE_INTEGER) - (orderById.get(b.id) ?? Number.MAX_SAFE_INTEGER));\n if (sorted.every((c, i) => c === current[i])) continue;\n\n const slots: number[] = [];\n this.rootChildren.forEach((child, idx) => {\n if (child instanceof Column && !child.hide && child.parentGroup === null && paneOfCol(child) === pane) {\n slots.push(idx);\n }\n });\n slots.forEach((slotIdx, i) => {\n this.rootChildren[slotIdx] = sorted[i];\n });\n }\n this.columns = this.collectLeaves(this.rootChildren);\n }\n\n resetColumnState(): void {\n for (const c of this.columns) {\n c.resetWidth();\n c.hide = c.colDef.hide ?? false;\n const p = c.colDef.pinned;\n c.pinned = p === true ? \"left\" : p === false || p == null ? null : p;\n }\n this.sortModel = [];\n this.regroup();\n }\n\n getSortModel(): SortModel {\n return this.sortModel.map((s) => ({ ...s }));\n }\n\n applySortModel(sortModel: SortModel | null): void {\n if (!sortModel || sortModel.length === 0) {\n this.sortModel = [];\n return;\n }\n this.sortModel = sortModel\n .filter((s) => this.columns.some((c) => c.id === s.colId) && (s.direction === \"asc\" || s.direction === \"desc\"))\n .map((s) => ({ colId: s.colId, direction: s.direction }));\n }\n\n cycleSort(column: Column, additive: boolean): void {\n const model = [...this.sortModel];\n const idx = model.findIndex((s) => s.colId === column.id);\n const current = idx >= 0 ? model[idx].direction : null;\n const next: SortDirection | null = current === null ? \"asc\" : current === \"asc\" ? \"desc\" : null;\n const multi = additive && this.core.options.multiSort;\n\n if (multi) {\n if (next === null) {\n if (idx >= 0) model.splice(idx, 1);\n } else if (idx >= 0) {\n model[idx] = { colId: column.id, direction: next };\n } else {\n model.push({ colId: column.id, direction: next });\n }\n } else {\n model.length = 0;\n if (next) model.push({ colId: column.id, direction: next });\n }\n this.sortModel = model;\n }\n}\n","import type { ColumnFilter, FilterModel, TextFilterCondition, NumberFilterCondition, DateFilterCondition } from \"../types/colDef\";\nimport type { AdvancedFilterModel, AdvancedFilterNode } from \"../types/advancedFilter\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"./column\";\n\nfunction textOf(value: any): string {\n return value == null ? \"\" : String(value).toLowerCase();\n}\n\nexport function evaluateTextFilter(value: any, conditions: TextFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const v = textOf(value);\n const results = conditions.map((c) => {\n const fv = (c.value ?? \"\").toLowerCase();\n switch (c.match) {\n case \"contains\":\n return v.includes(fv);\n case \"notContains\":\n return !v.includes(fv);\n case \"equals\":\n return v === fv;\n case \"notEquals\":\n return v !== fv;\n case \"startsWith\":\n return v.startsWith(fv);\n case \"endsWith\":\n return v.endsWith(fv);\n case \"blank\":\n return v === \"\";\n case \"notBlank\":\n return v !== \"\";\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nexport function evaluateNumberFilter(value: any, conditions: NumberFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const results = conditions.map((c) => {\n const isBlank = value == null || value === \"\";\n if (c.match === \"blank\") return isBlank;\n if (c.match === \"notBlank\") return !isBlank;\n if (isBlank) return false;\n const n = typeof value === \"number\" ? value : Number(value);\n if (isNaN(n)) return false;\n const f = c.value;\n if (f == null || isNaN(f)) return false;\n switch (c.match) {\n case \"equals\":\n return n === f;\n case \"notEquals\":\n return n !== f;\n case \"lessThan\":\n return n < f;\n case \"lessThanOrEqual\":\n return n <= f;\n case \"greaterThan\":\n return n > f;\n case \"greaterThanOrEqual\":\n return n >= f;\n case \"inRange\":\n return n >= f && n <= (c.value2 ?? f);\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nfunction toTime(value: any): number | null {\n if (value == null || value === \"\") return null;\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value.getTime();\n if (typeof value === \"number\") return value;\n const t = Date.parse(String(value));\n return isNaN(t) ? null : t;\n}\n\nexport function evaluateDateFilter(value: any, conditions: DateFilterCondition[], operator: \"and\" | \"or\"): boolean {\n const results = conditions.map((c) => {\n const isBlank = toTime(value) == null;\n if (c.match === \"blank\") return isBlank;\n if (c.match === \"notBlank\") return !isBlank;\n if (isBlank) return false;\n const t = toTime(value)!;\n const f = c.value != null ? toTime(c.value) : null;\n if (f == null) return false;\n switch (c.match) {\n case \"equals\":\n return t === f;\n case \"notEquals\":\n return t !== f;\n case \"lessThan\":\n return t < f;\n case \"greaterThan\":\n return t > f;\n case \"inRange\": {\n const f2 = c.value2 != null ? toTime(c.value2) : null;\n return f2 != null ? t >= f && t <= f2 : t >= f;\n }\n default:\n return true;\n }\n });\n if (results.length === 0) return true;\n return operator === \"or\" ? results.some(Boolean) : results.every(Boolean);\n}\n\nexport function evaluateSetFilter(value: any, filterValues: (string | number | null)[]): boolean {\n if (filterValues.length === 0) return true;\n return filterValues.some((v) => (v == null && value == null) || v === value);\n}\n\nexport function evaluateColumnFilter(value: any, filter: ColumnFilter): boolean {\n const operator = filter.type !== \"set\" && filter.operator === \"or\" ? \"or\" : \"and\";\n switch (filter.type) {\n case \"text\":\n return evaluateTextFilter(value, filter.conditions, operator);\n case \"number\":\n return evaluateNumberFilter(value, filter.conditions, operator);\n case \"date\":\n return evaluateDateFilter(value, filter.conditions, operator);\n case \"set\":\n return evaluateSetFilter(value, filter.values);\n default:\n return true;\n }\n}\n\nfunction evaluateAdvancedNode(\n node: AdvancedFilterNode,\n columns: ReadonlyMap<string, Column>,\n row: RowNode<any>,\n getCellValue: (row: RowNode<any>, column: Column) => any\n): boolean {\n if (node.kind === \"condition\") {\n const column = columns.get(node.colId);\n return !column || evaluateColumnFilter(getCellValue(row, column), node.filter);\n }\n const passed = node.operator === \"or\"\n ? node.children.some((child) => evaluateAdvancedNode(child, columns, row, getCellValue))\n : node.children.every((child) => evaluateAdvancedNode(child, columns, row, getCellValue));\n return node.not ? !passed : passed;\n}\n\nexport function evaluateAdvancedFilter(\n row: RowNode<any>,\n columns: Column[],\n model: AdvancedFilterModel | null,\n getCellValue: (row: RowNode<any>, column: Column) => any\n): boolean {\n if (!model) return true;\n return evaluateAdvancedNode(model.root, new Map(columns.map((column) => [column.id, column])), row, getCellValue);\n}\n\nexport function doesNodePassFilters(\n node: RowNode<any>,\n columns: Column[],\n filterModel: FilterModel,\n advancedFilterModel: AdvancedFilterModel | null,\n quickFilter: string | null,\n getCellValue: (node: RowNode<any>, column: Column) => any\n): boolean {\n for (const colId of Object.keys(filterModel)) {\n const filter = filterModel[colId];\n const column = columns.find((c) => c.id === colId);\n if (!column) continue;\n const value = getCellValue(node, column);\n if (!evaluateColumnFilter(value, filter)) return false;\n }\n\n if (!evaluateAdvancedFilter(node, columns, advancedFilterModel, getCellValue)) return false;\n\n if (quickFilter && quickFilter.trim() !== \"\") {\n const tokens = quickFilter.trim().toLowerCase().split(/\\s+/);\n for (const token of tokens) {\n const hit = columns.some((column) => textOf(getCellValue(node, column)).includes(token));\n if (!hit) return false;\n }\n }\n\n return true;\n}\n","const collator = typeof Intl !== \"undefined\"\n ? new Intl.Collator(undefined, { numeric: true, sensitivity: \"base\" })\n : null;\n\nexport function defaultComparator(valueA: any, valueB: any): number {\n const aEmpty = valueA == null || valueA === \"\";\n const bEmpty = valueB == null || valueB === \"\";\n if (aEmpty && bEmpty) return 0;\n if (aEmpty) return 1;\n if (bEmpty) return -1;\n\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n if (isNaN(valueA) && isNaN(valueB)) return 0;\n if (isNaN(valueA)) return 1;\n if (isNaN(valueB)) return -1;\n return valueA - valueB;\n }\n if (valueA instanceof Date && valueB instanceof Date) {\n return valueA.getTime() - valueB.getTime();\n }\n if (typeof valueA === \"boolean\" && typeof valueB === \"boolean\") {\n return valueA === valueB ? 0 : valueA ? 1 : -1;\n }\n const a = String(valueA);\n const b = String(valueB);\n return collator ? collator.compare(a, b) : a.localeCompare(b);\n}\n","import { defaultComparator } from \"../lib/compare\";\nimport type { SortModel } from \"../types/colDef\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"./column\";\n\nexport function sortNodes<TData>(\n nodes: RowNode<TData>[],\n sortModel: SortModel,\n columns: Column[],\n getCellValue: (node: RowNode<TData>, column: Column) => any\n): RowNode<TData>[] {\n const colById = new Map<string, Column>();\n for (const c of columns) colById.set(c.id, c);\n\n const comparators: ((a: any, b: any, na: RowNode<TData>, nb: RowNode<TData>) => number)[] = [];\n const directions: (\"asc\" | \"desc\")[] = [];\n for (const item of sortModel) {\n const column = colById.get(item.colId);\n if (!column) continue;\n comparators.push(column.colDef.comparator ?? defaultComparator);\n directions.push(item.direction);\n }\n\n const decorated = nodes.map((node) => ({\n node,\n values: sortModel.map((s) => getCellValue(node, colById.get(s.colId)!))\n }));\n\n decorated.sort((a, b) => {\n for (let i = 0; i < comparators.length; i++) {\n const r = comparators[i](a.values[i], b.values[i], a.node, b.node);\n if (r !== 0) return directions[i] === \"asc\" ? r : -r;\n }\n return 0;\n });\n\n return decorated.map((d) => d.node);\n}\n","export type AggValues = Record<string, any>;\n\nexport type AggFunction = (values: any[]) => any;\n\nfunction numeric(values: any[]): number[] {\n return values.filter((v): v is number => typeof v === \"number\" && !isNaN(v));\n}\n\nexport const BUILTIN_AGG_FUNCS: Record<string, AggFunction> = {\n sum: (values) => numeric(values).reduce((acc, v) => acc + v, 0),\n avg: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : nums.reduce((acc, v) => acc + v, 0) / nums.length;\n },\n count: (values) => values.length,\n min: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : Math.min(...nums);\n },\n max: (values) => {\n const nums = numeric(values);\n return nums.length === 0 ? null : Math.max(...nums);\n },\n first: (values) => (values.length > 0 ? values[0] : null),\n last: (values) => (values.length > 0 ? values[values.length - 1] : null)\n};\n\nexport function createAggResolver(custom?: Record<string, AggFunction>): (name: string) => AggFunction | undefined {\n const merged = { ...BUILTIN_AGG_FUNCS, ...(custom ?? {}) };\n return (name: string) => merged[name];\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\nimport type { FilterModel } from \"../types/colDef\";\nimport type { AdvancedFilterModel } from \"../types/advancedFilter\";\nimport type { RowTransaction } from \"../types/api\";\nimport { doesNodePassFilters } from \"./filterService\";\nimport { sortNodes } from \"./sortService\";\nimport { createAggResolver } from \"../lib/aggregate\";\nimport { defaultComparator } from \"../lib/compare\";\nimport { normalizeAdvancedFilterModel, normalizeFilterModel } from \"../lib/advancedFilter\";\n\ntype ColumnLike = import(\"./column\").Column;\ntype RowModelContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"changeTracker\"\n | \"columnModel\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"getLocaleText\"\n | \"headerRenderer\"\n | \"isDestroyed\"\n | \"nextId\"\n | \"options\"\n | \"relayout\"\n | \"reportError\"\n | \"selectionService\"\n | \"skeleton\"\n | \"undoService\"\n>;\n\nfunction readChildren(data: unknown, key: string): unknown[] | undefined {\n if (data == null || typeof data !== \"object\") return undefined;\n const value = (data as Record<string, unknown>)[key];\n return Array.isArray(value) ? value : undefined;\n}\n\nexport class RowModel<TData = any> {\n private all: RowNode<TData>[] = [];\n private roots: RowNode<TData>[] = [];\n private childIds = new Map<string, string[]>();\n private displayed: RowNode<TData>[] = [];\n private nodesById = new Map<string, RowNode<TData>>();\n private filterModel: FilterModel = {};\n private advancedFilterModel: AdvancedFilterModel | null = null;\n private quickFilter: string | null = null;\n private expandedIds = new Set<string>();\n private groupExpandedIds = new Set<string>();\n private knownGroupIds: string[] = [];\n private spanInfo = new Map<string, Int32Array>();\n private mastersBuf: RowNode<TData>[] = [];\n private infiniteLastRow: number | null = null;\n private infiniteRequested = false;\n private infiniteLoading = false;\n private infiniteSeq = 0;\n private infiniteAbort: AbortController | null = null;\n private infiniteRetryTimer: ReturnType<typeof setTimeout> | null = null;\n private infinitePendingResolve: (() => void) | null = null;\n private treeDepth = new WeakMap<RowNode<TData>, number>();\n private rowSequence = new WeakMap<RowNode<TData>, number>();\n private treeLoadControllers = new Map<string, AbortController>();\n private treeLoadPromises = new Map<string, Promise<readonly TData[]>>();\n\n constructor(private core: RowModelContext) {\n this.advancedFilterModel = normalizeAdvancedFilterModel(core.options.advancedFilterModel);\n }\n\n resolveRowId(data: TData, index: number, fallback: string): string {\n const getRowId = this.core.options.getRowId;\n if (!getRowId) return fallback;\n try {\n const id = getRowId({ data, index, api: this.core.getApi() });\n if (typeof id === \"string\" && id.length > 0) return id;\n this.core.reportError(new Error(\"getRowId must return a non-empty string\"), \"getRowId\", { index });\n } catch (error) {\n this.core.reportError(error, \"getRowId\", { index });\n }\n return fallback;\n }\n\n get isTree(): boolean {\n return this.core.options.treeData;\n }\n\n get isInfinite(): boolean {\n return this.core.options.datasource != null;\n }\n\n getDisplayTotalCount(): number {\n if (this.isInfinite) {\n const detailRows = Math.max(0, this.displayed.length - this.all.length);\n return (this.infiniteLastRow ?? this.all.length) + detailRows;\n }\n return this.displayed.length;\n }\n\n isLoadingInfinite(): boolean {\n return this.infiniteLoading;\n }\n\n startInfinite(): Promise<void> {\n if (!this.isInfinite) return Promise.resolve();\n this.cancelInfiniteRequest();\n this.infiniteLastRow = null;\n this.infiniteRequested = false;\n this.all = [];\n this.roots = [];\n this.nodesById.clear();\n this.expandedIds.clear();\n this.core.undoService.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return this.loadBlock(0);\n }\n\n reloadInfinite(): Promise<void> {\n if (!this.isInfinite) return Promise.resolve();\n return this.startInfinite();\n }\n\n private setInfiniteLoading(v: boolean): void {\n this.infiniteLoading = v;\n this.core.skeleton.setInfiniteLoading(v, this.core.getLocaleText(\"loading\"));\n }\n\n private loadBlock(start: number, end?: number): Promise<void> {\n if (!this.isInfinite || this.infiniteRequested) return Promise.resolve();\n if (this.infiniteLastRow != null && start >= this.infiniteLastRow) return Promise.resolve();\n const datasource = this.core.options.datasource!;\n const blockSize = this.core.options.blockSize;\n const stop = end ?? start + blockSize;\n if (stop <= start) return Promise.resolve();\n const seq = ++this.infiniteSeq;\n const controller = new AbortController();\n this.infiniteAbort = controller;\n this.infiniteRequested = true;\n this.setInfiniteLoading(true);\n\n return new Promise<void>((resolve) => {\n let settled = false;\n let attempt = 0;\n this.infinitePendingResolve = resolve;\n const done = (reason?: unknown) => {\n if (settled) return;\n settled = true;\n if (seq === this.infiniteSeq) {\n this.infiniteRequested = false;\n this.infiniteAbort = null;\n this.infinitePendingResolve = null;\n this.setInfiniteLoading(false);\n if (reason != null && (reason as { name?: string })?.name !== \"AbortError\") {\n this.core.reportError(reason, \"datasource.getRows\", { startRow: start, endRow: stop });\n }\n }\n resolve();\n };\n\n const runAttempt = () => {\n if (settled || seq !== this.infiniteSeq || controller.signal.aborted || this.core.isDestroyed()) {\n done();\n return;\n }\n attempt++;\n let attemptSettled = false;\n const failAttempt = (reason?: unknown) => {\n if (attemptSettled || settled) return;\n attemptSettled = true;\n if (seq !== this.infiniteSeq || controller.signal.aborted || this.core.isDestroyed()) {\n done();\n return;\n }\n if (attempt <= this.core.options.datasourceRetryCount) {\n const delay = Math.min(\n this.core.options.datasourceRetryDelay * 2 ** Math.max(0, attempt - 1),\n 30_000\n );\n this.infiniteRetryTimer = setTimeout(() => {\n this.infiniteRetryTimer = null;\n runAttempt();\n }, delay);\n return;\n }\n done(reason ?? new Error(\"Datasource request failed\"));\n };\n\n try {\n const request = datasource.getRows({\n startRow: start,\n endRow: stop,\n sortModel: this.core.columnModel.getSortModel(),\n filterModel: this.getFilterModel(),\n advancedFilterModel: this.getAdvancedFilterModel(),\n quickFilterText: this.quickFilter,\n signal: controller.signal,\n onSuccess: (rows, lastRow) => {\n if (attemptSettled || settled) return;\n attemptSettled = true;\n if (seq !== this.infiniteSeq || this.core.isDestroyed() || controller.signal.aborted) {\n done();\n return;\n }\n const received = rows ?? [];\n if (typeof lastRow === \"number\" && lastRow >= 0) {\n this.infiniteLastRow = lastRow;\n } else if (received.length < stop - start) {\n this.infiniteLastRow = start + received.length;\n }\n const wasEmpty = this.all.length === 0;\n this.appendInfiniteRows(received);\n done();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n if (wasEmpty) this.core.relayout();\n this.core.headerRenderer.refreshSelectAllCheckbox();\n },\n fail: failAttempt\n });\n if (request && typeof request.catch === \"function\") {\n void request.catch(failAttempt);\n }\n } catch (error) {\n failAttempt(error);\n }\n };\n\n runAttempt();\n });\n }\n\n private cancelInfiniteRequest(): void {\n this.infiniteSeq++;\n if (this.infiniteRetryTimer != null) clearTimeout(this.infiniteRetryTimer);\n this.infiniteRetryTimer = null;\n this.infiniteAbort?.abort();\n this.infiniteAbort = null;\n this.infiniteRequested = false;\n this.setInfiniteLoading(false);\n this.infinitePendingResolve?.();\n this.infinitePendingResolve = null;\n }\n\n private appendInfiniteRows(rows: TData[]): void {\n for (const data of rows) {\n if (data == null) continue;\n const index = this.all.length;\n const id = this.resolveRowId(data, index, `inf-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"datasource.getRows\", { rowId: id });\n continue;\n }\n const node: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: this.core.selectionService.isSelected(id)\n };\n this.all.push(node);\n this.nodesById.set(id, node);\n this.roots.push(node);\n }\n }\n\n checkInfiniteScroll(lastVisibleIndex: number): void {\n if (!this.isInfinite || this.infiniteRequested) return;\n const loaded = this.all.length;\n if (this.infiniteLastRow != null && loaded >= this.infiniteLastRow) return;\n const buffer = this.core.options.infiniteBufferRows;\n if (lastVisibleIndex + buffer < loaded && lastVisibleIndex < loaded) return;\n const blockSize = this.core.options.blockSize;\n const stop = this.infiniteLastRow == null\n ? loaded + blockSize\n : Math.min(this.infiniteLastRow, loaded + blockSize);\n void this.loadBlock(loaded, stop);\n }\n\n onServerParamsChanged(): Promise<void> {\n return this.reloadInfinite();\n }\n\n onDatasourceChanged(): Promise<void> {\n this.cancelInfiniteRequest();\n if (this.isInfinite) return this.startInfinite();\n this.infiniteLastRow = null;\n this.setRowData(this.core.options.rowData);\n this.core.bodyRenderer.onDataChanged();\n return Promise.resolve();\n }\n\n destroy(): void {\n this.cancelInfiniteRequest();\n this.cancelTreeLoads();\n }\n\n setRowData(rows: TData[] | null | undefined): void {\n this.cancelTreeLoads();\n this.core.changeTracker.clear();\n const getRowId = this.core.options.getRowId;\n const childrenKey = this.core.options.childrenKey;\n const next: RowNode<TData>[] = [];\n const roots: RowNode<TData>[] = [];\n const byId = new Map<string, RowNode<TData>>();\n const childIds = new Map<string, string[]>();\n let autoSeq = 0;\n\n const buildNode = (data: TData, depth: number, parentId: string | null): RowNode<TData> | null => {\n const index = autoSeq++;\n const id = this.resolveRowId(data, index, `auto-${index}`);\n if (byId.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"rowData\", { rowId: id, index });\n return null;\n }\n const children = this.isTree ? readChildren(data, childrenKey) : undefined;\n const node: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: false,\n treeChildrenLoaded: Array.isArray(children)\n };\n this.treeDepth.set(node, depth);\n next.push(node);\n byId.set(id, node);\n if (parentId != null) {\n const list = childIds.get(parentId) ?? [];\n list.push(id);\n childIds.set(parentId, list);\n } else {\n roots.push(node);\n }\n if (this.isTree && Array.isArray(children)) {\n for (const child of children) {\n if (child != null) buildNode(child as TData, depth + 1, id);\n }\n }\n return node;\n };\n\n (rows ?? []).forEach((data) => {\n if (data != null) buildNode(data, 0, null);\n });\n\n this.all = next;\n this.roots = roots;\n this.childIds = childIds;\n this.nodesById = byId;\n this.core.undoService.clear();\n for (const id of [...this.expandedIds]) {\n if (!byId.has(id)) this.expandedIds.delete(id);\n }\n if (this.core.options.defaultExpandAll) {\n for (const node of next) {\n if (this.getChildrenCount(node.id) > 0) this.expandedIds.add(node.id);\n }\n }\n\n this.core.selectionService.onRowsRebuilt(getRowId != null);\n this.refreshPipeline();\n }\n\n getChildrenIds(id: string): string[] {\n return this.childIds.get(id) ?? [];\n }\n\n getChildrenCount(id: string): number {\n return this.childIds.get(id)?.length ?? 0;\n }\n\n hasChildren(id: string): boolean {\n return this.getChildrenCount(id) > 0;\n }\n\n isTreeRowLoading(id: string): boolean {\n return this.nodesById.get(id)?.treeLoading === true;\n }\n\n private cancelTreeLoads(): void {\n for (const controller of this.treeLoadControllers.values()) controller.abort();\n this.treeLoadControllers.clear();\n this.treeLoadPromises.clear();\n }\n\n loadTreeChildren(id: string, force = false): Promise<readonly TData[]> {\n const node = this.nodesById.get(id);\n const loader = this.core.options.loadTreeChildren;\n if (!this.isTree || !node?.data || !loader) return Promise.resolve([]);\n if (!force && node.treeChildrenLoaded) {\n return Promise.resolve(this.getChildrenIds(id).flatMap((childId) => {\n const data = this.nodesById.get(childId)?.data;\n return data == null ? [] : [data];\n }));\n }\n const pending = this.treeLoadPromises.get(id);\n if (pending && !force) return pending;\n this.treeLoadControllers.get(id)?.abort();\n const controller = new AbortController();\n this.treeLoadControllers.set(id, controller);\n node.treeLoading = true;\n node.treeLoadError = undefined;\n this.core.bodyRenderer.onDataChanged();\n\n const request = Promise.resolve().then(() => loader({\n data: node.data!,\n node,\n api: this.core.getApi(),\n signal: controller.signal\n })).then((children) => {\n if (controller.signal.aborted || this.core.isDestroyed()) return [];\n if (!Array.isArray(children)) {\n throw new TypeError(\"[MachTable] loadTreeChildren must resolve to an array.\");\n }\n this.replaceTreeChildren(node, children as readonly TData[]);\n node.treeChildrenLoaded = true;\n node.treeLoadError = undefined;\n this.core.emit(\"treeChildrenLoaded\", { rowId: id, rowNode: node, children });\n return children;\n }).catch((error: unknown) => {\n if (controller.signal.aborted || (error as { name?: string })?.name === \"AbortError\") return [];\n node.treeLoadError = error;\n node.treeChildrenLoaded = false;\n this.core.reportError(error, \"treeData.loadChildren\", { rowId: id });\n this.core.emit(\"treeChildrenLoadFailed\", { rowId: id, rowNode: node, error });\n throw error;\n }).finally(() => {\n if (this.treeLoadControllers.get(id) === controller) {\n this.treeLoadControllers.delete(id);\n this.treeLoadPromises.delete(id);\n node.treeLoading = false;\n this.core.bodyRenderer.onDataChanged();\n }\n });\n this.treeLoadPromises.set(id, request);\n return request;\n }\n\n private replaceTreeChildren(parent: RowNode<TData>, children: readonly TData[]): void {\n const removed = new Set<string>();\n const stack = [...this.getChildrenIds(parent.id)];\n while (stack.length > 0) {\n const childId = stack.pop()!;\n if (removed.has(childId)) continue;\n removed.add(childId);\n stack.push(...this.getChildrenIds(childId));\n }\n this.validateTreeChildren(children, removed);\n for (const childId of removed) {\n this.treeLoadControllers.get(childId)?.abort();\n this.treeLoadControllers.delete(childId);\n this.treeLoadPromises.delete(childId);\n this.childIds.delete(childId);\n this.nodesById.delete(childId);\n this.expandedIds.delete(childId);\n }\n this.childIds.delete(parent.id);\n const depth = this.getTreeDepth(parent) + 1;\n for (const child of children) {\n if (child != null) this.buildChildNodes(parent, child, depth);\n }\n this.reindexAll();\n this.core.selectionService.onRowsRebuilt(this.core.options.getRowId != null);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n private validateTreeChildren(children: readonly TData[], replacedIds: ReadonlySet<string>): void {\n const getRowId = this.core.options.getRowId;\n const reserved = getRowId\n ? new Set([...this.nodesById.keys()].filter((id) => !replacedIds.has(id)))\n : null;\n const seenObjects = new WeakSet<object>();\n const stack = [...children];\n let index = 0;\n while (stack.length > 0) {\n const data = stack.pop()!;\n if (data == null) continue;\n if (typeof data === \"object\") {\n if (seenObjects.has(data)) throw new TypeError(\"[MachTable] Lazy tree children contain a cyclic object graph.\");\n seenObjects.add(data);\n }\n if (getRowId && reserved) {\n const id = getRowId({ data, index: index++, api: this.core.getApi() });\n if (typeof id !== \"string\" || id.length === 0) {\n throw new TypeError(\"[MachTable] getRowId must return a non-empty string for lazy tree children.\");\n }\n if (reserved.has(id)) throw new Error(`Duplicate row id: ${id}`);\n reserved.add(id);\n }\n const nested = readChildren(data, this.core.options.childrenKey);\n if (nested) stack.push(...nested as TData[]);\n }\n }\n\n applyTransaction(transaction: RowTransaction<TData>, refresh = true): void {\n const getRowId = this.core.options.getRowId;\n const touched: RowNode<TData>[] = [];\n const externallyReplacedIds: string[] = [];\n\n if (transaction.remove?.length) {\n const removeIds = new Set<string>();\n const removeRefs = new Set<TData>();\n const collect = (data: TData) => {\n if (getRowId) {\n const id = this.resolveRowId(data, -1, `__missing_remove_${this.core.nextId()}`);\n const stack = [id];\n while (stack.length > 0) {\n const cur = stack.pop()!;\n if (removeIds.has(cur)) continue;\n removeIds.add(cur);\n for (const childId of this.childIds.get(cur) ?? []) stack.push(childId);\n }\n } else {\n const stack: TData[] = [data];\n while (stack.length > 0) {\n const cur = stack.pop()!;\n removeRefs.add(cur);\n const kids = this.isTree ? readChildren(cur, this.core.options.childrenKey) : undefined;\n if (kids) {\n for (const kid of kids) stack.push(kid as TData);\n }\n }\n }\n };\n transaction.remove.forEach(collect);\n this.all = this.all.filter((node) => {\n const drop = removeIds.has(node.id) || (node.data != null && removeRefs.has(node.data));\n if (drop) {\n externallyReplacedIds.push(node.id);\n this.nodesById.delete(node.id);\n this.childIds.delete(node.id);\n }\n return !drop;\n });\n const remaining = new Set(this.all);\n this.roots = this.roots.filter((node) => remaining.has(node));\n }\n\n if (transaction.update?.length) {\n for (const data of transaction.update) {\n let node: RowNode<TData> | undefined;\n if (getRowId) {\n node = this.nodesById.get(this.resolveRowId(data, -1, `__missing_update_${this.core.nextId()}`));\n } else {\n node = this.all.find((n) => n.data === data);\n }\n if (node) {\n node.data = data;\n externallyReplacedIds.push(node.id);\n this.core.bodyRenderer.invalidateRowHeight(node);\n touched.push(node);\n }\n }\n }\n\n if (transaction.add?.length) {\n const startIndex = transaction.addIndex != null ? Math.max(0, Math.min(transaction.addIndex, this.roots.length)) : this.roots.length;\n const added: RowNode<TData>[] = [];\n transaction.add.forEach((data, i) => {\n const id = this.resolveRowId(data, startIndex + i, `add-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"transaction.add\", { rowId: id });\n return;\n }\n const node: RowNode<TData> = { id, data, rowIndex: -1, selected: false };\n this.nodesById.set(id, node);\n this.treeDepth.set(node, 0);\n const children = this.isTree ? readChildren(data, this.core.options.childrenKey) : undefined;\n if (children) {\n for (const child of children) {\n if (child != null) this.buildChildNodes(node, child as TData, 1);\n }\n }\n added.push(node);\n });\n this.roots.splice(startIndex, 0, ...added);\n this.reindexAll();\n }\n\n if (refresh) {\n this.refreshPipeline();\n for (const node of touched) {\n if (node.rowIndex >= 0) this.core.bodyRenderer.refreshRows([node.rowIndex]);\n }\n }\n this.core.changeTracker.clearRows(externallyReplacedIds);\n }\n\n applyTransactions(transactions: readonly RowTransaction<TData>[]): void {\n if (transactions.length === 0) return;\n for (const transaction of transactions) this.applyTransaction(transaction, false);\n this.refreshPipeline();\n }\n\n private buildChildNodes(parent: RowNode<TData>, data: TData, depth: number): void {\n const id = this.resolveRowId(data, -1, `add-${this.core.nextId()}`);\n if (this.nodesById.has(id)) {\n this.core.reportError(new Error(`Duplicate row id: ${id}`), \"transaction.add\", { rowId: id });\n return;\n }\n const children = readChildren(data, this.core.options.childrenKey);\n const child: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: false,\n treeChildrenLoaded: Array.isArray(children)\n };\n this.nodesById.set(id, child);\n this.treeDepth.set(child, depth);\n const list = this.childIds.get(parent.id) ?? [];\n list.push(child.id);\n this.childIds.set(parent.id, list);\n if (!children) return;\n for (const nested of children) {\n if (nested != null) this.buildChildNodes(child, nested as TData, depth + 1);\n }\n }\n\n private reindexAll(): void {\n this.all = [];\n const walk = (node: RowNode<TData>) => {\n this.all.push(node);\n if (!this.nodesById.has(node.id)) this.nodesById.set(node.id, node);\n for (const childId of this.childIds.get(node.id) ?? []) {\n const child = this.nodesById.get(childId);\n if (child) walk(child);\n }\n };\n for (const root of this.roots) walk(root);\n }\n\n setFilterModel(filterModel: FilterModel | null): boolean {\n const before = JSON.stringify(this.filterModel);\n const columns = new Set(this.core.columnModel.getColumns().map((column) => column.id));\n this.filterModel = normalizeFilterModel(filterModel, columns);\n return JSON.stringify(this.filterModel) !== before;\n }\n\n getFilterModel(): FilterModel {\n return { ...this.filterModel };\n }\n\n setAdvancedFilterModel(model: AdvancedFilterModel | null | undefined): boolean {\n const columns = new Set(this.core.columnModel.getColumns().map((column) => column.id));\n const next = normalizeAdvancedFilterModel(model, columns);\n const before = JSON.stringify(this.advancedFilterModel);\n this.advancedFilterModel = next;\n this.core.options.advancedFilterModel = next;\n return JSON.stringify(next) !== before;\n }\n\n getAdvancedFilterModel(): AdvancedFilterModel | null {\n return normalizeAdvancedFilterModel(this.advancedFilterModel);\n }\n\n setQuickFilter(text: string | null | undefined): boolean {\n const next = text != null && text.trim() !== \"\" ? text : null;\n if (next === this.quickFilter) return false;\n this.quickFilter = next;\n return true;\n }\n\n getQuickFilter(): string | null {\n return this.quickFilter;\n }\n\n isFilterPresent(): boolean {\n return Object.keys(this.filterModel).length > 0 || this.advancedFilterModel != null || this.quickFilter != null;\n }\n\n refreshPipeline(): void {\n const columns = this.core.columnModel.getOrderedVisible();\n const getCellValue = (node: RowNode<any>, column: ColumnLike) => this.core.getCellValue(node, column);\n\n if (this.isInfinite) {\n this.all.forEach((node, index) => {\n node.rowIndex = index;\n this.rowSequence.set(node, index + 1);\n });\n this.displayed = this.all;\n this.pipelineRows = this.all;\n this.spanInfo.clear();\n this.core.emit(\"modelUpdated\", { rowCount: this.all.length });\n return;\n }\n\n let rows: RowNode<TData>[];\n\n if (this.isTree) {\n rows = this.buildTreeDisplay(columns, getCellValue);\n } else {\n rows = this.all;\n const filteringLocally = this.isFilterPresent() && !this.core.options.manualFiltering;\n if (filteringLocally) {\n rows = rows.filter((node) => doesNodePassFilters(\n node, columns, this.filterModel, this.advancedFilterModel, this.quickFilter, getCellValue\n ));\n }\n const sortModel = this.core.columnModel.getSortModel();\n if (sortModel.length > 0 && !this.core.options.manualSorting) {\n try {\n rows = sortNodes(rows, sortModel, columns, getCellValue);\n } catch (error) {\n this.core.reportError(error, \"comparator\", { sortModel });\n }\n }\n\n const groupCols = this.core.columnModel.getRowGroupColumns();\n if (groupCols.length > 0) {\n rows = this.buildGrouped(rows, groupCols);\n } else if (this.core.options.masterDetail) {\n const withDetails: RowNode<TData>[] = [];\n for (const node of rows) {\n withDetails.push(node);\n if (this.expandedIds.has(node.id) && this.isRowExpandable(node)) {\n withDetails.push({\n id: `__detail__${node.id}`,\n data: node.data,\n rowIndex: -1,\n selected: false,\n isDetail: true,\n masterId: node.id\n });\n }\n }\n rows = withDetails;\n }\n }\n\n for (const node of this.all) node.rowIndex = -1;\n\n let seq = 0;\n rows.forEach((node, index) => {\n node.rowIndex = index;\n if (!node.isDetail && !node.isGroup) {\n seq++;\n this.rowSequence.set(node, seq);\n }\n });\n this.pipelineRows = rows;\n this.applyPagination();\n\n this.computeSpans(getCellValue);\n this.core.emit(\"modelUpdated\", { rowCount: rows.length });\n }\n\n private pipelineRows: RowNode<TData>[] = [];\n private page = 1;\n private pageSize = 20;\n\n get paginationActive(): boolean {\n return this.core.options.paginationEnabled && !this.isInfinite;\n }\n\n private applyPagination(): void {\n if (!this.paginationActive) {\n this.displayed = this.pipelineRows;\n return;\n }\n const size = this.effectivePageSize();\n const pageCount = this.getPageCount();\n if (this.page > pageCount) this.page = pageCount;\n if (this.page < 1) this.page = 1;\n this.core.options.paginationPage = this.page;\n if (this.core.options.paginationMode === \"server\") {\n this.pipelineRows.forEach((node, index) => {\n node.rowIndex = index;\n });\n this.displayed = this.pipelineRows;\n return;\n }\n const start = (this.page - 1) * size;\n const slice = this.pipelineRows.slice(start, start + size);\n slice.forEach((node, index) => {\n node.rowIndex = index;\n });\n this.displayed = slice;\n }\n\n private effectivePageSize(): number {\n this.pageSize = this.core.options.paginationPageSize;\n return Math.max(1, this.pageSize);\n }\n\n getCurrentPage(): number {\n return this.paginationActive ? this.page : 1;\n }\n\n getTotalRowCount(): number {\n if (this.isInfinite) return this.getDisplayTotalCount();\n if (this.paginationActive && this.core.options.paginationMode === \"server\") {\n return this.core.options.paginationTotal;\n }\n return this.pipelineRows.length;\n }\n\n getPageCount(): number {\n if (!this.paginationActive) return 1;\n return Math.max(1, Math.ceil(this.getTotalRowCount() / this.effectivePageSize()));\n }\n\n getPipelineRows(): RowNode<TData>[] {\n return this.pipelineRows;\n }\n\n setPage(page: number, silent = false): void {\n if (!this.paginationActive) return;\n const pageCount = this.getPageCount();\n const next = Math.max(1, Math.min(Math.round(page) || 1, pageCount));\n if (next === this.page) return;\n this.page = next;\n this.core.options.paginationPage = next;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.core.bodyRenderer.scrollToIndex(0, \"top\");\n if (!silent) this.emitPaginationChanged();\n }\n\n setPageSize(size: number): void {\n if (!this.paginationActive) return;\n const next = Math.max(1, Math.round(size) || this.effectivePageSize());\n const firstVisible = (this.page - 1) * this.effectivePageSize();\n this.core.options.paginationPageSize = next;\n this.pageSize = next;\n this.page = Math.floor(firstVisible / next) + 1;\n this.core.options.paginationPage = this.page;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n restorePagination(page: number, pageSize: number): void {\n this.pageSize = Math.max(1, Math.round(pageSize) || 1);\n this.core.options.paginationPageSize = this.pageSize;\n this.page = Math.max(1, Math.round(page) || 1);\n this.core.options.paginationPage = this.page;\n }\n\n setPaginationEnabled(enabled: boolean): void {\n if (this.core.options.paginationEnabled === enabled) return;\n this.core.options.paginationEnabled = enabled && !this.isInfinite;\n if (this.core.options.paginationEnabled) this.page = 1;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n onPaginationOptionsChanged(): void {\n if (!this.paginationActive) return;\n this.page = this.core.options.paginationMode === \"server\"\n ? this.core.options.paginationPage\n : 1;\n this.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\n }\n\n private emitPaginationChanged(): void {\n this.core.emit(\"paginationChanged\", {\n page: this.getCurrentPage(),\n pageSize: this.effectivePageSize(),\n pageCount: this.getPageCount(),\n total: this.getTotalRowCount()\n });\n }\n\n private buildTreeDisplay(\n columns: ColumnLike[],\n getCellValue: (node: RowNode<any>, column: ColumnLike) => any\n ): RowNode<TData>[] {\n const sortModel = this.core.options.manualSorting ? [] : this.core.columnModel.getSortModel();\n const passCache = new Map<string, boolean>();\n const filterPresent = this.isFilterPresent() && !this.core.options.manualFiltering;\n\n const nodePasses = (node: RowNode<TData>): boolean => {\n const cached = passCache.get(node.id);\n if (cached !== undefined) return cached;\n let pass = true;\n if (filterPresent) {\n pass = doesNodePassFilters(\n node, columns, this.filterModel, this.advancedFilterModel, this.quickFilter, getCellValue\n );\n for (const childId of this.childIds.get(node.id) ?? []) {\n const child = this.nodesById.get(childId);\n if (child && nodePasses(child)) pass = true;\n }\n }\n passCache.set(node.id, pass);\n return pass;\n };\n\n const out: RowNode<TData>[] = [];\n const walk = (nodes: RowNode<TData>[]) => {\n let ordered = nodes;\n if (sortModel.length > 0) {\n ordered = sortNodes(nodes, sortModel, columns, getCellValue);\n }\n for (const node of ordered) {\n if (!nodePasses(node)) continue;\n out.push(node);\n if (this.expandedIds.has(node.id)) {\n const childNodes = (this.childIds.get(node.id) ?? [])\n .map((id) => this.nodesById.get(id))\n .filter((n): n is RowNode<TData> => n != null);\n walk(childNodes);\n }\n }\n };\n walk(this.roots);\n return out;\n }\n\n private computeSpans(getCellValue: (node: RowNode<any>, column: ColumnLike) => any): void {\n this.spanInfo.clear();\n if (this.isTree) return;\n if (this.core.options.masterDetail) return;\n if (this.core.columnModel.getRowGroupColumns().length > 0) return;\n\n const spanColumns = this.core.columnModel.getOrderedVisible().filter(\n (c) => c.colDef.rowSpan != null || c.colDef.autoRowSpan === true\n );\n if (spanColumns.length === 0) return;\n\n const masters = this.mastersBuf;\n let m = 0;\n for (const node of this.displayed) {\n if (!node.isDetail && !node.isGroup) masters[m++] = node;\n }\n masters.length = m;\n const n = m;\n if (n === 0) return;\n\n for (const col of spanColumns) {\n const arr = new Int32Array(n);\n let i = 0;\n while (i < n) {\n const node = masters[i];\n const value = getCellValue(node, col);\n let span = 1;\n if (col.colDef.rowSpan) {\n try {\n const out = col.colDef.rowSpan({\n api: this.core.getApi(),\n colDef: col.colDef,\n column: col,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n });\n span = Math.max(1, Math.min(Math.round(out) || 1, n - i));\n } catch (error) {\n this.core.reportError(error, \"rowSpan\", { colId: col.id, rowId: node.id });\n }\n } else if (col.colDef.autoRowSpan) {\n while (\n i + span < n &&\n value != null &&\n value !== \"\" &&\n defaultComparator(value, getCellValue(masters[i + span], col)) === 0\n ) {\n span++;\n }\n }\n arr[i] = span;\n for (let k = 1; k < span; k++) arr[i + k] = -1;\n i += span;\n }\n this.spanInfo.set(col.id, arr);\n }\n }\n\n getSpanInfo(colId: string): Int32Array | undefined {\n return this.spanInfo.get(colId);\n }\n\n getRowSeq(node: RowNode<TData>): number {\n return this.rowSequence.get(node) ?? 0;\n }\n\n getTreeDepth(node: RowNode<TData>): number {\n return this.treeDepth.get(node) ?? 0;\n }\n\n private buildGrouped(rows: RowNode<TData>[], groupCols: ColumnLike[]): RowNode<TData>[] {\n const aggResolve = createAggResolver(this.core.options.aggFuncs);\n const aggCols = this.core.columnModel.getAggColumns();\n this.knownGroupIds = [];\n\n const computeAgg = (leaves: RowNode<TData>[]): Record<string, any> => {\n const values: Record<string, any> = {};\n for (const col of aggCols) {\n const fn = aggResolve(col.colDef.aggFunc!);\n if (!fn) continue;\n try {\n values[col.id] = fn(leaves.map((leaf) => this.core.getCellValue(leaf, col)));\n } catch (error) {\n this.core.reportError(error, \"aggFunc\", { colId: col.id, aggFunc: col.colDef.aggFunc });\n values[col.id] = null;\n }\n }\n return values;\n };\n\n const build = (\n nodes: RowNode<TData>[],\n level: number,\n parentPath: string\n ): { display: RowNode<TData>[]; leaves: RowNode<TData>[] } => {\n if (level >= groupCols.length) {\n return { display: nodes, leaves: nodes };\n }\n const col = groupCols[level];\n const groups = new Map<string, RowNode<TData>[]>();\n const order: string[] = [];\n for (const node of nodes) {\n const raw = this.core.getCellValue(node, col);\n const key = raw == null ? \"(空)\" : String(raw);\n let bucket = groups.get(key);\n if (!bucket) {\n bucket = [];\n groups.set(key, bucket);\n order.push(key);\n }\n bucket.push(node);\n }\n order.sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: \"base\" }));\n\n const display: RowNode<TData>[] = [];\n const leaves: RowNode<TData>[] = [];\n for (const key of order) {\n const children = groups.get(key)!;\n const groupId = `${parentPath}/g${level}:${key}`;\n this.knownGroupIds.push(groupId);\n const child = build(children, level + 1, groupId);\n const groupNode: RowNode<TData> = {\n id: groupId,\n data: null,\n rowIndex: -1,\n selected: false,\n isGroup: true,\n groupLevel: level,\n groupKey: key,\n leafNodes: child.leaves,\n aggValues: computeAgg(child.leaves)\n };\n display.push(groupNode);\n if (this.groupExpandedIds.has(groupId)) {\n display.push(...child.display);\n }\n leaves.push(...child.leaves);\n }\n return { display, leaves };\n };\n\n return build(rows, 0, \"\").display;\n }\n\n isRowExpandable(node: RowNode<TData>): boolean {\n if (this.isTree) {\n if (this.hasChildren(node.id)) return true;\n if (node.treeLoading) return true;\n if (node.treeChildrenLoaded || !node.data || !this.core.options.loadTreeChildren) return false;\n const checkTree = this.core.options.isTreeRowExpandable;\n if (!checkTree) return false;\n try {\n return checkTree({ data: node.data, node, api: this.core.getApi() });\n } catch (error) {\n this.core.reportError(error, \"isTreeRowExpandable\", { rowId: node.id });\n return false;\n }\n }\n if (!this.core.options.masterDetail) return false;\n const check = this.core.options.isRowExpandable;\n if (check) {\n try {\n return check({ data: node.data, node, api: this.core.getApi() });\n } catch (error) {\n this.core.reportError(error, \"isRowExpandable\", { rowId: node.id });\n return false;\n }\n }\n return true;\n }\n\n isRowExpanded(id: string): boolean {\n return this.expandedIds.has(id);\n }\n\n getExpandedRowIds(): string[] {\n return [...this.expandedIds];\n }\n\n getExpandedGroupIds(): string[] {\n return [...this.groupExpandedIds];\n }\n\n restoreExpansion(rowIds: readonly string[], groupIds: readonly string[]): void {\n this.expandedIds = new Set(rowIds.filter((id) => this.nodesById.has(id)));\n this.groupExpandedIds = new Set(groupIds);\n }\n\n expandRow(id: string): boolean {\n return this.setDetailExpanded(id, true);\n }\n\n collapseRow(id: string): boolean {\n return this.setDetailExpanded(id, false);\n }\n\n toggleDetail(id: string): boolean {\n return this.setDetailExpanded(id, !this.expandedIds.has(id));\n }\n\n private setDetailExpanded(id: string, expanded: boolean): boolean {\n const node = this.nodesById.get(id);\n if (!node || (expanded && !this.isRowExpandable(node))) return false;\n if (expanded === this.expandedIds.has(id)) return expanded;\n if (expanded) this.expandedIds.add(id);\n else this.expandedIds.delete(id);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n this.core.emit(\"detailToggled\", { rowId: id, rowNode: node, expanded });\n if (expanded && this.isTree && !this.hasChildren(id) && !node.treeLoading) {\n void this.loadTreeChildren(id).catch(() => undefined);\n }\n return expanded;\n }\n\n expandAllDetails(): void {\n let changed = false;\n for (const node of this.all) {\n if (!this.expandedIds.has(node.id) && this.isRowExpandable(node)) {\n this.expandedIds.add(node.id);\n changed = true;\n }\n }\n if (changed) {\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n collapseAllDetails(): void {\n if (this.expandedIds.size === 0) return;\n this.expandedIds.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n toggleGroup(groupId: string): boolean {\n return this.setGroupExpanded(groupId, !this.groupExpandedIds.has(groupId));\n }\n\n isGroupExpanded(groupId: string): boolean {\n return this.groupExpandedIds.has(groupId);\n }\n\n getGroupNode(groupId: string): RowNode<TData> | undefined {\n return this.displayed.find((n) => n.isGroup && n.id === groupId);\n }\n\n expandAllGroups(): void {\n if (this.knownGroupIds.length === 0) return;\n let changed = false;\n for (const id of this.knownGroupIds) {\n if (!this.groupExpandedIds.has(id)) {\n this.groupExpandedIds.add(id);\n changed = true;\n }\n }\n if (changed) {\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n collapseAllGroups(): void {\n if (this.groupExpandedIds.size === 0) return;\n this.groupExpandedIds.clear();\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n private setGroupExpanded(groupId: string, expanded: boolean): boolean {\n if (!this.knownGroupIds.includes(groupId)) return expanded;\n if (expanded === this.groupExpandedIds.has(groupId)) return expanded;\n if (expanded) this.groupExpandedIds.add(groupId);\n else this.groupExpandedIds.delete(groupId);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return expanded;\n }\n\n reorderRowsByDisplayed(fromIndex: number, toIndex: number): boolean {\n if (this.isTree) return false;\n const fromNode = this.getDisplayedRow(fromIndex);\n const toNode = this.getDisplayedRow(toIndex);\n if (!fromNode || !toNode || fromNode.isDetail || toNode.isDetail || fromNode.isGroup || toNode.isGroup) return false;\n\n const fromAllIdx = this.all.indexOf(fromNode);\n let toAllIdx = this.all.indexOf(toNode);\n if (fromAllIdx < 0 || toAllIdx < 0) return false;\n if (toAllIdx > fromAllIdx) {\n let idx = toAllIdx;\n while (idx + 1 < this.all.length && this.all[idx + 1].isDetail) idx++;\n toAllIdx = idx;\n }\n if (fromAllIdx === toAllIdx) return false;\n\n this.all.splice(fromAllIdx, 1);\n const insertAt = this.all.indexOf(toNode);\n this.all.splice(toAllIdx > fromAllIdx ? insertAt + 1 : insertAt, 0, fromNode);\n this.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n return true;\n }\n\n getAllNodes(): RowNode<TData>[] {\n return this.all;\n }\n\n getRootNodes(): RowNode<TData>[] {\n return this.roots;\n }\n\n getDisplayedRows(): RowNode<TData>[] {\n return this.displayed;\n }\n\n getDisplayedRowCount(): number {\n return this.displayed.length;\n }\n\n getDisplayedRow(index: number): RowNode<TData> | undefined {\n return this.displayed[index];\n }\n\n getNodeById(id: string): RowNode<TData> | undefined {\n return this.nodesById.get(id);\n }\n\n forEachNode(callback: (node: RowNode<TData>, index: number) => void): void {\n this.all.forEach(callback);\n }\n\n forEachNodeAfterFilterAndSort(callback: (node: RowNode<TData>, index: number) => void): void {\n let index = 0;\n for (const node of this.pipelineRows) {\n if (node.isDetail || node.isGroup) continue;\n callback(node, index++);\n }\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\n\ntype SelectionContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"headerRenderer\"\n | \"options\"\n | \"reportError\"\n | \"rowModel\"\n>;\n\nexport class SelectionService {\n private selectedIds = new Set<string>();\n private anchorId: string | null = null;\n private indeterminateIds = new Set<string>();\n\n constructor(private core: SelectionContext) {}\n\n isSelected(id: string): boolean {\n return this.selectedIds.has(id);\n }\n\n isIndeterminate(id: string): boolean {\n return this.indeterminateIds.has(id);\n }\n\n isSelectable(node: RowNode<any>): boolean {\n const column = this.findSelectableColumn(node);\n const check = column?.colDef.selectable;\n if (!column || !check) return true;\n try {\n return check({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex: node.rowIndex\n });\n } catch (error) {\n this.core.reportError(error, \"selectable\", { rowId: node.id, colId: column?.id });\n return false;\n }\n }\n\n private findSelectableColumn(node: RowNode<any>) {\n if (node.isGroup || node.isDetail) return undefined;\n return this.core.columnModel\n .getOrderedVisible()\n .find((column) => column.hasCheckbox && column.colDef.selectable != null);\n }\n\n getSelectedNodes(): RowNode<any>[] {\n return this.core.rowModel.getAllNodes().filter((n) => this.selectedIds.has(n.id));\n }\n\n getSelectedRows(): any[] {\n return this.getSelectedNodes().filter((n) => n.data != null).map((n) => n.data);\n }\n\n getSelectedIds(): string[] {\n return [...this.selectedIds];\n }\n\n restoreSelection(ids: readonly string[]): void {\n const requested = new Set(ids);\n const changes = this.core.rowModel\n .getAllNodes()\n .filter((node) => requested.has(node.id) && !node.isDetail && !node.isGroup)\n .map((node) => ({ node, selected: true }));\n this.applySelection(changes, true);\n }\n\n onRowsRebuilt(preserveIds: boolean): void {\n if (!preserveIds) {\n this.selectedIds.clear();\n this.anchorId = null;\n } else {\n const existing = new Set(this.core.rowModel.getAllNodes().map((n) => n.id));\n for (const id of [...this.selectedIds]) {\n if (!existing.has(id)) this.selectedIds.delete(id);\n }\n if (this.anchorId != null && !existing.has(this.anchorId)) this.anchorId = null;\n }\n for (const node of this.core.rowModel.getAllNodes()) {\n node.selected = this.selectedIds.has(node.id);\n }\n this.recomputeTriState();\n }\n\n getGroupSelectionState(groupNode: RowNode<any>): { all: boolean; some: boolean } {\n const leaves = groupNode.leafNodes ?? [];\n if (leaves.length === 0) return { all: false, some: false };\n let selectableCount = 0;\n let count = 0;\n for (const leaf of leaves) {\n if (!this.isSelectable(leaf)) continue;\n selectableCount++;\n if (this.selectedIds.has(leaf.id)) count++;\n }\n if (selectableCount === 0) return { all: false, some: false };\n return { all: count === selectableCount, some: count > 0 };\n }\n\n setGroupSelected(groupNode: RowNode<any>, selected: boolean): void {\n const leaves = (groupNode.leafNodes ?? []).filter((n) => this.isSelectable(n));\n if (leaves.length === 0) return;\n this.applySelection(leaves.map((node) => ({ node, selected })));\n }\n\n setNodeSelected(node: RowNode<any>, selected: boolean, clearOthers = false): void {\n this.applySelection([{ node, selected, clearOthers }]);\n }\n\n selectNodeById(nodeId: string, selected = true, clearOthers = true): void {\n const node = this.core.rowModel.getNodeById(nodeId);\n if (node) this.setNodeSelected(node, selected, clearOthers);\n }\n\n onRowClick(node: RowNode<any>, event: MouseEvent, fromCheckbox: boolean): void {\n const mode = this.core.options.rowSelection;\n if (mode === \"none\") return;\n if (!this.isSelectable(node)) return;\n\n if (fromCheckbox) {\n const single = mode === \"single\";\n this.applySelection([{ node, selected: single ? true : !node.selected, clearOthers: single }]);\n this.anchorId = node.id;\n return;\n }\n\n const multi = mode === \"multiple\";\n if (multi && (event.ctrlKey || event.metaKey)) {\n this.applySelection([{ node, selected: !node.selected }]);\n this.anchorId = node.id;\n return;\n }\n\n if (multi && event.shiftKey && this.anchorId != null) {\n const anchor = this.core.rowModel.getNodeById(this.anchorId);\n if (anchor && anchor.rowIndex >= 0 && node.rowIndex >= 0) {\n const start = Math.min(anchor.rowIndex, node.rowIndex);\n const end = Math.max(anchor.rowIndex, node.rowIndex);\n const changes = [];\n for (let i = start; i <= end; i++) {\n const row = this.core.rowModel.getDisplayedRow(i);\n if (row && !row.isDetail && !row.isGroup && this.isSelectable(row)) {\n changes.push({ node: row, selected: true });\n }\n }\n this.applySelection(changes);\n return;\n }\n }\n\n this.applySelection([{ node, selected: true, clearOthers: true }]);\n this.anchorId = node.id;\n }\n\n selectAll(filteredOnly = true): void {\n const mode = this.core.options.rowSelection;\n if (mode === \"none\") return;\n const candidates = filteredOnly ? this.core.rowModel.getDisplayedRows() : this.core.rowModel.getAllNodes();\n const selectable = candidates.filter((n) => !n.isDetail && !n.isGroup && this.isSelectable(n));\n if (selectable.length === 0) return;\n if (mode === \"single\") {\n this.applySelection([{ node: selectable[0], selected: true, clearOthers: true }]);\n return;\n }\n this.applySelection(selectable.map((node) => ({ node, selected: true })));\n }\n\n deselectAll(): void {\n this.applySelection([], true);\n }\n\n isSelectAllActive(): boolean {\n const rows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const selectable = rows.filter((n) => this.isSelectable(n));\n if (selectable.length === 0) return false;\n if (this.core.rowModel.isInfinite) {\n const total = this.core.rowModel.getDisplayTotalCount();\n if (selectable.length < total) return false;\n }\n return selectable.every((n) => this.selectedIds.has(n.id));\n }\n\n isSelectAllIndeterminate(): boolean {\n const rows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const selectable = rows.filter((n) => this.isSelectable(n));\n const count = selectable.reduce((acc, n) => acc + (this.selectedIds.has(n.id) ? 1 : 0), 0);\n if (count === 0) return false;\n if (this.core.rowModel.isInfinite) {\n const total = this.core.rowModel.getDisplayTotalCount();\n if (selectable.length < total) return true;\n }\n return count > 0 && count < selectable.length;\n }\n\n applySelectionPublic(\n changes: { node: RowNode<any>; selected: boolean; clearOthers?: boolean }[],\n clearOthers = false\n ): void {\n this.applySelection(changes, clearOthers);\n }\n\n private applySelection(\n changes: { node: RowNode<any>; selected: boolean; clearOthers?: boolean }[],\n clearAll = false\n ): void {\n const before = new Set(this.selectedIds);\n const clearOthers = clearAll || changes.some((c) => c.clearOthers);\n const isTree = this.core.rowModel.isTree && this.core.options.autoCheckedChildren;\n\n if (clearOthers) {\n const keep = clearAll\n ? new Set<string>()\n : new Set(changes.filter((c) => c.selected).flatMap((c) => (isTree ? this.subtreeIds(c.node) : [c.node.id])));\n this.selectedIds = keep;\n }\n\n for (const c of changes) {\n if (!this.isSelectable(c.node)) continue;\n const targets = isTree ? this.subtreeIds(c.node) : [c.node.id];\n for (const id of targets) {\n if (c.selected) this.selectedIds.add(id);\n else this.selectedIds.delete(id);\n }\n }\n\n const changedIds = new Set<string>();\n for (const id of new Set([...before, ...this.selectedIds])) {\n if (before.has(id) !== this.selectedIds.has(id)) changedIds.add(id);\n }\n\n const prevSelected = new Map<string, boolean>();\n for (const node of this.core.rowModel.getAllNodes()) {\n prevSelected.set(node.id, node.selected);\n }\n const prevIndeterminate = new Set(this.indeterminateIds);\n\n this.recomputeTriState();\n\n const refreshIndexes: number[] = [];\n const touched = new Set<string>([...changedIds, ...prevIndeterminate, ...this.indeterminateIds]);\n for (const node of this.core.rowModel.getAllNodes()) {\n const isSel = this.selectedIds.has(node.id);\n node.selected = isSel;\n if (touched.has(node.id) || prevSelected.get(node.id) !== isSel) {\n if (node.rowIndex >= 0) refreshIndexes.push(node.rowIndex);\n }\n }\n\n if (changedIds.size > 0) {\n this.core.bodyRenderer.refreshRows(refreshIndexes);\n this.core.headerRenderer.refreshSelectAllCheckbox();\n this.core.emit(\"selectionChanged\", {\n selectedNodes: this.getSelectedNodes(),\n selectedRows: this.getSelectedRows()\n });\n }\n }\n\n private subtreeIds(node: RowNode<any>): string[] {\n const out: string[] = [node.id];\n const walk = (id: string) => {\n for (const childId of this.core.rowModel.getChildrenIds(id)) {\n out.push(childId);\n walk(childId);\n }\n };\n walk(node.id);\n return out;\n }\n\n private recomputeTriState(): void {\n this.indeterminateIds.clear();\n if (!this.core.rowModel.isTree) return;\n\n const evaluate = (id: string): { all: boolean; some: boolean } => {\n const childIds = this.core.rowModel.getChildrenIds(id);\n if (childIds.length === 0) {\n return { all: this.selectedIds.has(id), some: this.selectedIds.has(id) };\n }\n let all = true;\n let some = false;\n for (const childId of childIds) {\n const state = evaluate(childId);\n if (state.all) some = true;\n else if (state.some) {\n some = true;\n all = false;\n } else {\n all = false;\n }\n }\n if (some && !all) this.indeterminateIds.add(id);\n if (all) this.selectedIds.add(id);\n else this.selectedIds.delete(id);\n return { all, some };\n };\n\n for (const root of this.core.rowModel.getRootNodes()) {\n evaluate(root.id);\n }\n for (const node of this.core.rowModel.getAllNodes()) {\n node.selected = this.selectedIds.has(node.id);\n }\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\n\ntype ResizeContext = Pick<\n GridCore<any>,\n | \"columnModel\"\n | \"commitColumnWidths\"\n | \"emitColumnResize\"\n | \"options\"\n | \"relayoutColumns\"\n | \"skeleton\"\n>;\n\ninterface ActiveResize {\n column: Column;\n didResize: boolean;\n handle: HTMLElement;\n pointerId: number;\n startFlex: number | null;\n startManualWidth: number | null;\n startWidth: number;\n startX: number;\n}\n\nexport class ResizeService {\n private active: ActiveResize | null = null;\n private rafId = 0;\n private pendingWidth = 0;\n\n constructor(private core: ResizeContext) {}\n\n startResize(event: PointerEvent, column: Column): void {\n if (!this.core.options.enableColumnResize || !column.resizable || event.isPrimary === false) return;\n this.cancelResize();\n\n const handle = event.currentTarget as HTMLElement;\n const startWidth = column.currentWidth;\n this.pendingWidth = startWidth;\n this.active = {\n column,\n didResize: false,\n handle,\n pointerId: event.pointerId,\n startFlex: column.flex,\n startManualWidth: column.manualWidth,\n startWidth,\n startX: event.clientX\n };\n\n window.addEventListener(\"pointermove\", this.onMove);\n // Capture phase finalizes before the browser's normal lostpointercapture event.\n window.addEventListener(\"pointerup\", this.onUp, true);\n window.addEventListener(\"pointercancel\", this.onCancel, true);\n handle.addEventListener(\"lostpointercapture\", this.onLostPointerCapture);\n try {\n handle.setPointerCapture?.(event.pointerId);\n } catch {\n // Window listeners keep resizing functional when pointer capture is unavailable.\n }\n this.core.skeleton.root.classList.add(\"mach-root--resizing\");\n }\n\n cancelResize(restore = true): void {\n const active = this.active;\n if (!active) return;\n this.active = null;\n this.clearFrame();\n this.removeListeners(active);\n if (restore) {\n active.column.manualWidth = active.startManualWidth;\n active.column.flex = active.startFlex;\n this.core.relayoutColumns();\n }\n this.core.skeleton.root.classList.remove(\"mach-root--resizing\");\n }\n\n private onMove = (event: PointerEvent): void => {\n const active = this.matchActivePointer(event);\n if (!active) return;\n this.pendingWidth = this.widthFromPointer(active, event.clientX);\n active.didResize ||= Math.abs(this.pendingWidth - active.startWidth) >= 0.5;\n if (this.rafId) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = 0;\n this.applyPendingWidth();\n });\n };\n\n private onUp = (event: PointerEvent): void => {\n const active = this.matchActivePointer(event);\n if (!active) return;\n this.pendingWidth = this.widthFromPointer(active, event.clientX);\n active.didResize ||= Math.abs(this.pendingWidth - active.startWidth) >= 0.5;\n this.finishResize(active);\n };\n\n private onCancel = (event: PointerEvent): void => {\n if (!this.matchActivePointer(event)) return;\n this.cancelResize();\n };\n\n private onLostPointerCapture = (): void => {\n this.cancelResize();\n };\n\n private finishResize(active: ActiveResize): void {\n this.active = null;\n this.clearFrame();\n if (active.didResize) {\n if (Math.abs(this.pendingWidth - active.startWidth) < 0.5) {\n active.column.manualWidth = active.startManualWidth;\n active.column.flex = active.startFlex;\n } else {\n this.core.columnModel.setColumnWidth(active.column, this.pendingWidth);\n }\n this.core.relayoutColumns();\n }\n this.removeListeners(active);\n try {\n active.handle.releasePointerCapture?.(active.pointerId);\n } catch {\n // The capture can already be released by the browser.\n }\n this.core.skeleton.root.classList.remove(\"mach-root--resizing\");\n if (active.didResize) this.core.commitColumnWidths([active.column]);\n }\n\n private applyPendingWidth(): void {\n const active = this.active;\n if (!active || !this.core.columnModel.setColumnWidth(active.column, this.pendingWidth)) return;\n this.core.relayoutColumns();\n this.core.emitColumnResize(active.column, false);\n }\n\n private widthFromPointer(active: ActiveResize, clientX: number): number {\n const pointerX = Number.isFinite(clientX) ? clientX : active.startX;\n return active.startWidth + pointerX - active.startX;\n }\n\n private matchActivePointer(event: PointerEvent): ActiveResize | null {\n const active = this.active;\n return active && event.pointerId === active.pointerId ? active : null;\n }\n\n private clearFrame(): void {\n if (this.rafId) cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n }\n\n private removeListeners(active: ActiveResize): void {\n window.removeEventListener(\"pointermove\", this.onMove);\n window.removeEventListener(\"pointerup\", this.onUp, true);\n window.removeEventListener(\"pointercancel\", this.onCancel, true);\n active.handle.removeEventListener(\"lostpointercapture\", this.onLostPointerCapture);\n }\n\n destroy(): void {\n this.cancelResize(false);\n this.clearFrame();\n this.core.skeleton.root?.classList.remove(\"mach-root--resizing\");\n }\n}\n","export function el(tag: string, className?: string, attrs?: Record<string, string>): HTMLElement {\n const e = document.createElement(tag);\n if (className) e.className = className;\n if (attrs) {\n for (const key of Object.keys(attrs)) {\n e.setAttribute(key, attrs[key]);\n }\n }\n return e;\n}\n\nexport function setStyles(e: HTMLElement, styles: Partial<CSSStyleDeclaration>): void {\n Object.assign(e.style, styles);\n}\n\nexport function clamp(v: number, min: number, max: number): number {\n return v < min ? min : v > max ? max : v;\n}\n\nlet uidCounter = 0;\n\nexport function nextUid(prefix = \"rg\"): string {\n uidCounter++;\n return `${prefix}-${uidCounter}`;\n}\n\nexport function toPx(n: number): string {\n return `${n}px`;\n}\n\nexport const FILTER_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 3.5h12L9.5 8v4.5L6.5 14V8L2 3.5z\"/></svg>';\n\nexport const SORT_ASC_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" fill=\"currentColor\"><path d=\"M8 3l4 5H4l4-5z\"/></svg>';\n\nexport const SORT_DESC_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" fill=\"currentColor\"><path d=\"M8 13l4-5H4l4 5z\"/></svg>';\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el } from \"../lib/dom\";\n\nconst DRAG_THRESHOLD = 6;\ntype ColumnDragContext = Pick<\n GridCore<any>,\n \"bodyRenderer\" | \"columnModel\" | \"moveColumn\" | \"skeleton\"\n>;\n\nexport class ColumnDragService {\n private pending: { column: Column; startX: number; startY: number } | null = null;\n private dragging: { column: Column; cellEl: HTMLElement; indicator: HTMLElement; targetIndex: number } | null = null;\n private suppressClick = false;\n\n constructor(private core: ColumnDragContext) {}\n\n onPointerDown(e: PointerEvent, column: Column): void {\n if (e.button !== 0) return;\n if (!column.movable) return;\n this.pending = { column, startX: e.clientX, startY: e.clientY };\n window.addEventListener(\"pointermove\", this.onMove);\n window.addEventListener(\"pointerup\", this.onUp);\n window.addEventListener(\"pointercancel\", this.onUp);\n }\n\n didDrag(): boolean {\n const value = this.suppressClick;\n this.suppressClick = false;\n return value;\n }\n\n private onMove = (e: PointerEvent): void => {\n if (this.dragging) {\n this.updateIndicator(e);\n return;\n }\n const pending = this.pending;\n if (!pending) return;\n if (Math.abs(e.clientX - pending.startX) < DRAG_THRESHOLD && Math.abs(e.clientY - pending.startY) < DRAG_THRESHOLD) {\n return;\n }\n this.startDrag(e);\n };\n\n private startDrag(e: PointerEvent): void {\n const pending = this.pending;\n if (!pending) return;\n const cellEl = this.findHeaderCell(pending.column);\n if (!cellEl || !cellEl.parentElement) {\n this.cleanup();\n return;\n }\n this.suppressClick = true;\n const indicator = el(\"div\", \"mach-drop-indicator\");\n cellEl.parentElement.appendChild(indicator);\n cellEl.classList.add(\"mach-header-cell--dragging\");\n this.core.skeleton.root.classList.add(\"mach-root--dragging\");\n this.dragging = { column: pending.column, cellEl, indicator, targetIndex: -1 };\n this.updateIndicator(e);\n }\n\n private findHeaderCell(column: Column): HTMLElement | null {\n const pane = this.core.bodyRenderer.paneForColumn(column);\n const container = this.core.skeleton.headerRowContainers[pane];\n return container.querySelector<HTMLElement>(`.mach-header-cell[data-col-id=\"${cssEscape(column.id)}\"]`);\n }\n\n private updateIndicator(e: PointerEvent): void {\n const dragging = this.dragging;\n if (!dragging) return;\n const pane = this.core.bodyRenderer.paneForColumn(dragging.column);\n const container = this.core.skeleton.headerRowContainers[pane];\n const rowRect = container.getBoundingClientRect();\n const cols = this.core.columnModel.getPaneColumns(pane);\n const fromIndex = cols.indexOf(dragging.column);\n\n const x = e.clientX - rowRect.left;\n let target = -1;\n let indicatorX = 0;\n let acc = 0;\n for (let i = 0; i < cols.length; i++) {\n const mid = acc + cols[i].currentWidth / 2;\n if (x < mid) {\n target = i;\n indicatorX = acc;\n break;\n }\n acc += cols[i].currentWidth;\n }\n if (target < 0) {\n target = cols.length;\n indicatorX = acc;\n }\n\n dragging.targetIndex = target > fromIndex ? target - 1 : target;\n dragging.indicator.style.left = `${indicatorX}px`;\n }\n\n private onUp = (): void => {\n const dragging = this.dragging;\n this.pending = null;\n this.cleanup();\n if (!dragging) return;\n this.dragging = null;\n dragging.cellEl.classList.remove(\"mach-header-cell--dragging\");\n dragging.indicator.remove();\n this.core.skeleton.root.classList.remove(\"mach-root--dragging\");\n if (dragging.targetIndex >= 0) {\n this.core.moveColumn(dragging.column.id, dragging.targetIndex);\n }\n };\n\n private cleanup(): void {\n window.removeEventListener(\"pointermove\", this.onMove);\n window.removeEventListener(\"pointerup\", this.onUp);\n window.removeEventListener(\"pointercancel\", this.onUp);\n };\n\n destroy(): void {\n this.cleanup();\n if (this.dragging) {\n this.dragging.cellEl.classList.remove(\"mach-header-cell--dragging\");\n this.dragging.indicator.remove();\n this.core.skeleton.root.classList.remove(\"mach-root--dragging\");\n this.dragging = null;\n }\n this.pending = null;\n }\n}\n\nfunction cssEscape(value: string): string {\n return typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\"\n ? CSS.escape(value)\n : value.replace(/[^a-zA-Z0-9_-]/g, \"\\\\$&\");\n}\n","import type { CsvExportParams } from \"../types/api\";\n\nexport function csvEscape(value: any, separator: string): string {\n const s = value == null ? \"\" : String(value);\n if (s.includes(separator) || s.includes('\"') || s.includes(\"\\n\") || s.includes(\"\\r\")) {\n return '\"' + s.replace(/\"/g, '\"\"') + '\"';\n }\n return s;\n}\n\nexport function sanitizeFormulaCell(value: any): any {\n if (typeof value !== \"string\" || value === \"\") return value;\n if (/^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(value)) return value;\n if (/^[\\s\\u0000-\\u001f]*[=+\\-@]/.test(value)) return \"'\" + value;\n return value;\n}\n\nexport interface CsvRowAccessor<T> {\n getHeaderLabels(): string[];\n getRowValues(): T[][];\n}\n\nexport function buildCsv<T>(accessor: CsvRowAccessor<T>, params: CsvExportParams = {}): string {\n const separator = params.columnSeparator ?? \",\";\n const includeHeader = params.includeHeader ?? true;\n const protectFormulas = params.protectFormulas ?? true;\n const lines: string[] = [];\n\n if (includeHeader) {\n lines.push(accessor.getHeaderLabels().map((l) => csvEscape(l, separator)).join(separator));\n }\n for (const row of accessor.getRowValues()) {\n lines.push(\n row.map((v) => csvEscape(protectFormulas ? sanitizeFormulaCell(v) : v, separator)).join(separator)\n );\n }\n\n const body = lines.join(\"\\r\\n\");\n return params.prependBOM ? \"\\uFEFF\" + body : body;\n}\n","import { sanitizeFormulaCell } from \"./csv\";\n\nfunction escapeCell(value: any, protectFormulas: boolean): string {\n const safe = protectFormulas ? sanitizeFormulaCell(value) : value;\n const s = safe == null ? \"\" : String(safe);\n if (/[\"\\t\\n\\r]/.test(s)) {\n return '\"' + s.replace(/\"/g, '\"\"') + '\"';\n }\n return s;\n}\n\nexport function toTsv(rows: any[][], protectFormulas = true): string {\n return rows.map((row) => row.map((value) => escapeCell(value, protectFormulas)).join(\"\\t\")).join(\"\\n\");\n}\n\nexport function parseTsv(text: string): string[][] {\n return parseDelimited(text, \"\\t\");\n}\n\nexport function parseCsv(text: string, separator = \",\"): string[][] {\n return parseDelimited(text, separator);\n}\n\nexport function parseDelimited(text: string, separator: string): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = \"\";\n let inQuotes = false;\n let i = 0;\n\n while (i < text.length) {\n const ch = text[i];\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n cell += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i++;\n continue;\n }\n cell += ch;\n i++;\n continue;\n }\n if (ch === '\"' && cell === \"\") {\n inQuotes = true;\n i++;\n continue;\n }\n if (ch === separator) {\n row.push(cell);\n cell = \"\";\n i++;\n continue;\n }\n if (ch === \"\\n\" || ch === \"\\r\") {\n row.push(cell);\n rows.push(row);\n row = [];\n cell = \"\";\n if (ch === \"\\r\" && text[i + 1] === \"\\n\") i += 2;\n else i++;\n continue;\n }\n cell += ch;\n i++;\n }\n\n if (cell !== \"\" || row.length > 0) {\n row.push(cell);\n rows.push(row);\n }\n return rows;\n}\n\nexport function fallbackCopyText(text: string): boolean {\n let ta: HTMLTextAreaElement | null = null;\n try {\n ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.focus();\n ta.select();\n const ok = document.execCommand(\"copy\");\n return ok;\n } catch {\n return false;\n } finally {\n ta?.remove();\n }\n}\n\nexport async function writeClipboard(text: string): Promise<boolean> {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n void 0;\n }\n return fallbackCopyText(text);\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { writeClipboard } from \"../lib/clipboard\";\n\ntype KeyboardContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"buildRangeTsv\"\n | \"clearRangeValues\"\n | \"columnModel\"\n | \"editingService\"\n | \"isDestroyed\"\n | \"options\"\n | \"pasteText\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n | \"undoService\"\n>;\n\nconst NAVIGATION_KEYS = new Set([\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Enter\",\n \"F2\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"Tab\",\n \" \",\n \"Escape\",\n \"Delete\",\n \"Backspace\"\n]);\n\nconst MOVEMENT_KEYS = new Set([\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\"\n]);\n\ninterface KeyboardPosition {\n colIdx: number;\n row: number;\n}\n\nexport class KeyboardService {\n constructor(private core: KeyboardContext) {}\n\n init(): void {\n this.core.skeleton.root.addEventListener(\"keydown\", this.onKeyDown);\n this.core.skeleton.root.addEventListener(\"copy\", this.onCopy as EventListener);\n this.core.skeleton.root.addEventListener(\"cut\", this.onCut as EventListener);\n this.core.skeleton.root.addEventListener(\"paste\", this.onPaste as EventListener);\n }\n\n destroy(): void {\n this.core.skeleton.root.removeEventListener(\"keydown\", this.onKeyDown);\n this.core.skeleton.root.removeEventListener(\"copy\", this.onCopy as EventListener);\n this.core.skeleton.root.removeEventListener(\"cut\", this.onCut as EventListener);\n this.core.skeleton.root.removeEventListener(\"paste\", this.onPaste as EventListener);\n }\n\n nextEditable(rowIndex: number, colId: string, dir: 1 | -1): { rowIndex: number; column: Column } | null {\n const cols = this.core.columnModel.getOrderedVisible();\n const start = cols.findIndex((c) => c.id === colId);\n if (start < 0) return null;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n let i = start;\n let row = rowIndex;\n\n for (let guard = 0; guard < (cols.length + 1) * (rowCount + 1); guard++) {\n i += dir;\n if (i >= cols.length) {\n if (row >= rowCount - 1) return null;\n i = 0;\n row = this.skipDetailRows(row + 1, 1);\n } else if (i < 0) {\n if (row <= 0) return null;\n i = cols.length - 1;\n row = this.skipDetailRows(row - 1, -1);\n }\n if (row < 0 || row >= rowCount) return null;\n const node = this.core.rowModel.getDisplayedRow(row);\n if (node && !node.isDetail && this.core.editingService.isEditable(node, cols[i])) {\n return { rowIndex: row, column: cols[i] };\n }\n }\n return null;\n }\n\n private skipDetailRows(row: number, dir: 1 | -1): number {\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n let guard = 0;\n while (row >= 0 && row < rowCount) {\n const node = this.core.rowModel.getDisplayedRow(row);\n if (!node || !node.isDetail) return row;\n row += dir;\n guard++;\n if (guard > rowCount + 2) break;\n }\n return -1;\n }\n\n private onCopy = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const range = this.core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const text = this.core.buildRangeTsv(range);\n const dt = e.clipboardData;\n if (dt && typeof dt.setData === \"function\") {\n dt.setData(\"text/plain\", text);\n } else {\n void writeClipboard(text);\n }\n e.preventDefault();\n };\n\n private onCut = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const range = this.core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const text = this.core.buildRangeTsv(range);\n const dt = e.clipboardData;\n if (dt && typeof dt.setData === \"function\") {\n dt.setData(\"text/plain\", text);\n } else {\n void writeClipboard(text);\n }\n this.core.clearRangeValues(range);\n e.preventDefault();\n };\n\n private onPaste = (e: ClipboardEvent): void => {\n if (this.core.options.suppressClipboard || this.core.editingService.isEditing()) return;\n const start = this.core.bodyRenderer.getPasteStart();\n if (!start) return;\n const dt = e.clipboardData;\n const text = dt && typeof dt.getData === \"function\" ? dt.getData(\"text/plain\") : null;\n if (typeof text !== \"string\" || text === \"\") return;\n e.preventDefault();\n this.core.pasteText(text, start.row, start.colIdx);\n };\n\n private onKeyDown = (e: KeyboardEvent): void => {\n if (this.core.isDestroyed() || this.core.editingService.isEditing()) return;\n if (this.handleSelectAll(e) || this.handleHistoryShortcut(e)) return;\n if (!NAVIGATION_KEYS.has(e.key)) return;\n if (this.handleRangeCommand(e)) return;\n if (this.focusFirstCell(e)) return;\n this.handleFocusedKey(e);\n };\n\n private handleSelectAll(e: KeyboardEvent): boolean {\n const modifier = e.ctrlKey || e.metaKey;\n if (!modifier || e.key.toLowerCase() !== \"a\") return false;\n if (this.core.options.rowSelection === \"multiple\") {\n e.preventDefault();\n this.core.selectionService.selectAll(true);\n }\n return true;\n }\n\n private handleHistoryShortcut(e: KeyboardEvent): boolean {\n if ((!e.ctrlKey && !e.metaKey) || e.altKey) return false;\n const key = e.key.toLowerCase();\n if (key === \"z\") {\n e.preventDefault();\n if (e.shiftKey) this.core.undoService.redo();\n else this.core.undoService.undo();\n return true;\n }\n if (key !== \"y\") return false;\n e.preventDefault();\n this.core.undoService.redo();\n return true;\n }\n\n private handleRangeCommand(e: KeyboardEvent): boolean {\n const body = this.core.bodyRenderer;\n if (e.key === \"Escape\") {\n if (this.core.options.enableRangeSelection && body.normalizedRange()) {\n e.preventDefault();\n body.clearRangeSelection();\n }\n return true;\n }\n if (e.key !== \"Delete\" && e.key !== \"Backspace\") return false;\n if (!this.core.options.enableRangeSelection) return true;\n const range = body.normalizedRange();\n if (range && !(range.r1 === range.r2 && range.c1 === range.c2)) {\n e.preventDefault();\n this.core.clearRangeValues(range);\n }\n return true;\n }\n\n private focusFirstCell(e: KeyboardEvent): boolean {\n if (this.core.bodyRenderer.focusedCell) return false;\n const columns = this.core.columnModel.getOrderedVisible();\n if (this.core.rowModel.getDisplayedRowCount() > 0 && columns.length > 0) {\n e.preventDefault();\n this.core.bodyRenderer.setFocusedCell(0, columns[0].id);\n }\n return true;\n }\n\n private handleFocusedKey(e: KeyboardEvent): void {\n const body = this.core.bodyRenderer;\n const focus = body.focusedCell;\n if (!focus) return;\n const columns = this.core.columnModel.getOrderedVisible();\n const colIdx = columns.findIndex((column) => column.id === focus.colId);\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n if (colIdx < 0 || rowCount === 0) return;\n\n const start = { row: focus.rowIndex, colIdx };\n const position = this.resolveKeyPosition(e, start, columns, rowCount);\n if (!position) return;\n e.preventDefault();\n\n const moved = position.row !== start.row || position.colIdx !== start.colIdx;\n if (e.shiftKey && this.core.options.enableRangeSelection && moved) {\n body.moveRangeEnd(position.row, position.colIdx);\n return;\n }\n if (moved) body.setFocusedCell(position.row, columns[position.colIdx].id);\n }\n\n private resolveKeyPosition(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columns: readonly Column[],\n rowCount: number\n ): KeyboardPosition | null {\n if (MOVEMENT_KEYS.has(e.key)) return this.movePosition(e, position, columns.length, rowCount);\n if (e.key === \"Enter\" || e.key === \"F2\") {\n return this.activateEditor(e, position, columns, rowCount);\n }\n if (e.key === \" \") {\n this.toggleFocusedRow(position.row);\n return position;\n }\n if (e.key === \"Tab\") return this.moveToEditable(e, position, columns);\n return null;\n }\n\n private movePosition(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columnCount: number,\n rowCount: number\n ): KeyboardPosition {\n let { row, colIdx } = position;\n switch (e.key) {\n case \"ArrowUp\":\n row = this.validSkippedRow(row, this.skipDetailRows(row - 1, -1), rowCount);\n break;\n case \"ArrowDown\":\n row = this.validSkippedRow(row, this.skipDetailRows(row + 1, 1), rowCount);\n break;\n case \"ArrowLeft\":\n colIdx = Math.max(0, colIdx - 1);\n break;\n case \"ArrowRight\":\n colIdx = Math.min(columnCount - 1, colIdx + 1);\n break;\n case \"Home\":\n colIdx = 0;\n if (e.ctrlKey) row = 0;\n break;\n case \"End\":\n colIdx = columnCount - 1;\n if (e.ctrlKey) row = Math.max(0, this.skipDetailRows(rowCount - 1, -1));\n break;\n case \"PageUp\":\n case \"PageDown\":\n row = this.movePage(e.key, row, rowCount);\n break;\n }\n return { row, colIdx };\n }\n\n private validSkippedRow(current: number, candidate: number, rowCount: number): number {\n return candidate >= 0 && candidate < rowCount ? candidate : current;\n }\n\n private movePage(key: string, row: number, rowCount: number): number {\n const viewport = this.core.skeleton.bodyViewports.center;\n const pageRows = Math.max(1, Math.floor(viewport.clientHeight / this.core.options.rowHeight));\n const direction: 1 | -1 = key === \"PageUp\" ? -1 : 1;\n const target = Math.max(0, Math.min(rowCount - 1, row + pageRows * direction));\n return this.validSkippedRow(row, this.skipDetailRows(target, direction), rowCount);\n }\n\n private activateEditor(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columns: readonly Column[],\n rowCount: number\n ): KeyboardPosition {\n const node = this.core.rowModel.getDisplayedRow(position.row);\n const column = columns[position.colIdx];\n if (node && !node.isDetail && column && this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(position.row, column, e.key === \"F2\" ? e.key : null);\n return position;\n }\n const down = this.skipDetailRows(position.row + 1, 1);\n return { ...position, row: this.validSkippedRow(position.row, down, rowCount) };\n }\n\n private toggleFocusedRow(row: number): void {\n const node = this.core.rowModel.getDisplayedRow(row);\n if (!node || node.isDetail) return;\n if (node.isGroup) {\n this.core.rowModel.toggleGroup(node.id);\n return;\n }\n if (this.core.options.rowSelection === \"none\") return;\n this.core.selectionService.setNodeSelected(\n node,\n !node.selected,\n this.core.options.rowSelection === \"single\"\n );\n }\n\n private moveToEditable(\n e: KeyboardEvent,\n position: KeyboardPosition,\n columns: readonly Column[]\n ): KeyboardPosition | null {\n const next = this.nextEditable(position.row, columns[position.colIdx].id, e.shiftKey ? -1 : 1);\n if (!next) return null;\n this.core.bodyRenderer.setFocusedCell(next.rowIndex, next.column.id);\n this.core.editingService.start(next.rowIndex, next.column);\n return position;\n }\n}\n","import type { ICellEditor } from \"../types/params\";\nimport type { Column } from \"./column\";\n\nfunction baseInput(type: string, value: any): HTMLInputElement {\n const input = document.createElement(\"input\");\n input.type = type;\n input.className = \"mach-editor-input\";\n if (value != null && value !== \"\") {\n input.value = type === \"date\" ? String(value).slice(0, 10) : String(value);\n }\n return input;\n}\n\nfunction inferEditorType(value: any, selectValues?: (string | number)[]): string {\n if (selectValues && selectValues.length > 0) return \"select\";\n if (typeof value === \"number\") return \"number\";\n if (value instanceof Date) return \"date\";\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) return \"date\";\n return \"text\";\n}\n\nexport function createEditor(column: Column, value: any, keyPress?: string | null): ICellEditor {\n const def = column.colDef;\n const name = typeof def.cellEditor === \"string\" ? def.cellEditor : inferEditorType(value, def.cellEditorParams?.values);\n\n if (name === \"number\") {\n const input = baseInput(\"number\", value);\n return {\n el: input,\n getValue: () => (input.value === \"\" ? null : Number(input.value)),\n focus: () => {\n input.focus();\n input.select();\n }\n };\n }\n\n if (name === \"date\") {\n const input = baseInput(\"date\", value);\n const raw = value == null ? \"\" : String(value);\n const timeMatch = raw.match(/T(\\d{2}:\\d{2})/);\n return {\n el: input,\n getValue: () => {\n if (input.value === \"\") return null;\n if (timeMatch) return `${input.value}T${timeMatch[1]}`;\n return input.value;\n },\n focus: () => input.focus()\n };\n }\n\n if (name === \"select\") {\n const values = def.cellEditorParams?.values ?? [];\n const select = document.createElement(\"select\");\n select.className = \"mach-editor-select\";\n for (const v of values) {\n const option = document.createElement(\"option\");\n option.value = String(v);\n option.textContent = String(v);\n if (String(value) === String(v)) option.selected = true;\n select.appendChild(option);\n }\n return {\n el: select,\n getValue: () => {\n const match = values.find((v) => String(v) === select.value);\n return match !== undefined ? match : select.value;\n },\n focus: () => select.focus()\n };\n }\n\n const input = baseInput(\"text\", value);\n if (keyPress && keyPress.length === 1) input.value = keyPress;\n return {\n el: input,\n getValue: () => input.value,\n focus: () => {\n input.focus();\n input.select();\n }\n };\n}\n","/** Runtime-only DOM state kept out of public elements and their string keys. */\nexport interface CellRuntimeState {\n destroy?: () => void;\n refresh?: (params: import(\"../types/params\").CellRendererParams) => boolean | void;\n rendererDefinition?: unknown;\n rendererRowId?: string;\n rendererColumnId?: string;\n flashTimer?: number;\n styleKeys?: string[];\n}\n\nconst cellStates = new WeakMap<HTMLElement, CellRuntimeState>();\nconst detailDestroyers = new WeakMap<HTMLElement, () => void>();\nconst headerDestroyers = new WeakMap<HTMLElement, () => void>();\n\nexport function getCellRuntimeState(element: HTMLElement): CellRuntimeState {\n let state = cellStates.get(element);\n if (!state) {\n state = {};\n cellStates.set(element, state);\n }\n return state;\n}\n\nexport function peekCellRuntimeState(element: HTMLElement): CellRuntimeState | undefined {\n return cellStates.get(element);\n}\n\nexport function setDetailDestroyer(element: HTMLElement, destroy: (() => void) | undefined): void {\n if (destroy) detailDestroyers.set(element, destroy);\n else detailDestroyers.delete(element);\n}\n\nexport function takeDetailDestroyer(element: HTMLElement): (() => void) | undefined {\n const destroy = detailDestroyers.get(element);\n detailDestroyers.delete(element);\n return destroy;\n}\n\nexport function setHeaderDestroyer(element: HTMLElement, destroy: (() => void) | undefined): void {\n if (destroy) headerDestroyers.set(element, destroy);\n else headerDestroyers.delete(element);\n}\n\nexport function takeHeaderDestroyer(element: HTMLElement): (() => void) | undefined {\n const destroy = headerDestroyers.get(element);\n headerDestroyers.delete(element);\n return destroy;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { RowNode } from \"../types/row\";\nimport type { Column } from \"../services/column\";\nimport { hasColumnType } from \"../core/resolveOptions\";\nimport type { CellClassParams, CellRendererParams } from \"../types/params\";\nimport { getCellRuntimeState, peekCellRuntimeState } from \"./runtimeState\";\n\ntype ErrorContext = Pick<GridCore<any>, \"reportError\">;\ntype CellValueContext = Pick<GridCore<any>, \"getApi\" | \"getCellValue\" | \"reportError\">;\ntype CellRenderContext = CellValueContext & Pick<GridCore<any>, \"options\" | \"resolveCellRenderer\">;\n\nexport function defaultFormat(value: any): string {\n if (value == null) return \"\";\n if (value instanceof Date) return value.toLocaleDateString();\n if (typeof value === \"object\") {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n return String(value);\n}\n\nexport function cleanupCellContent(core: ErrorContext, cell: HTMLElement): void {\n const state = peekCellRuntimeState(cell);\n if (!state) return;\n if (state.flashTimer) clearTimeout(state.flashTimer);\n state.flashTimer = undefined;\n const destroy = state.destroy;\n state.destroy = undefined;\n state.refresh = undefined;\n state.rendererDefinition = undefined;\n state.rendererRowId = undefined;\n state.rendererColumnId = undefined;\n if (!destroy) return;\n try {\n destroy();\n } catch (error) {\n core.reportError(error, \"cellRenderer.destroy\", { colId: cell.dataset.colId });\n }\n}\n\nfunction updateCellTooltip(\n core: CellRenderContext,\n cell: HTMLElement,\n node: RowNode<any>,\n column: Column,\n value: any,\n formatted: string\n): void {\n let tooltip = core.options.tooltipComponent ? \"\" : formatted;\n const tooltipGetter = column.colDef.tooltipValueGetter;\n if (tooltipGetter) {\n try {\n tooltip = tooltipGetter({\n api: core.getApi(), colDef: column.colDef, column, node, data: node.data, value\n }) ?? formatted;\n } catch (error) {\n core.reportError(error, \"tooltipValueGetter\", { colId: column.id, rowId: node.id });\n }\n }\n if (tooltip) cell.setAttribute(\"title\", tooltip);\n else cell.removeAttribute(\"title\");\n}\n\nfunction tryRefreshRenderer(\n core: CellRenderContext,\n cell: HTMLElement,\n node: RowNode<any>,\n column: Column,\n renderer: unknown,\n params: CellRendererParams\n): boolean {\n const state = peekCellRuntimeState(cell);\n if (\n !state?.refresh ||\n state.rendererDefinition !== renderer ||\n state.rendererRowId !== node.id ||\n state.rendererColumnId !== column.id\n ) return false;\n try {\n cell.querySelector(\":scope > .mach-cell-edit-trigger\")?.remove();\n return state.refresh(params) !== false;\n } catch (error) {\n core.reportError(error, \"cellRenderer.refresh\", { colId: column.id, rowId: node.id });\n return false;\n }\n}\n\nexport function formatCellValue(core: CellValueContext, node: RowNode<any>, column: Column): string {\n const value = core.getCellValue(node, column);\n const formatter = column.colDef.valueFormatter;\n if (formatter) {\n try {\n const out = formatter({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value\n });\n return out == null ? \"\" : String(out);\n } catch (error) {\n core.reportError(error, \"valueFormatter\", { colId: column.id, rowId: node.id });\n }\n }\n return defaultFormat(value);\n}\n\nexport function formatCellValueWith(core: CellValueContext, node: RowNode<any>, column: Column, value: any): string {\n const formatter = column.colDef.valueFormatter;\n if (formatter) {\n try {\n const out = formatter({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value\n });\n return out == null ? \"\" : String(out);\n } catch (error) {\n core.reportError(error, \"valueFormatter\", { colId: column.id, rowId: node.id });\n }\n }\n return defaultFormat(value);\n}\n\nexport function applyCellStyle(core: CellValueContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const rule = column.colDef.cellStyle;\n const state = getCellRuntimeState(cell);\n const prevKeys = state.styleKeys;\n if (prevKeys) {\n for (const key of prevKeys) {\n Reflect.set(cell.style, key, \"\");\n }\n }\n if (!rule) {\n state.styleKeys = undefined;\n return;\n }\n let styles: Partial<CSSStyleDeclaration> | null | undefined;\n if (typeof rule === \"function\") {\n const value = core.getCellValue(node, column);\n try {\n styles = rule({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n });\n } catch (error) {\n core.reportError(error, \"cellStyle\", { colId: column.id, rowId: node.id });\n styles = null;\n }\n } else {\n styles = rule;\n }\n if (!styles) {\n state.styleKeys = undefined;\n return;\n }\n const keys = Object.keys(styles);\n for (const key of keys) {\n Reflect.set(cell.style, key, Reflect.get(styles, key));\n }\n state.styleKeys = keys;\n}\n\nexport function renderCellContent(core: CellRenderContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const value = core.getCellValue(node, column);\n const formatted = formatCellValue(core, node, column);\n const rendererDef = column.colDef.cellRenderer;\n const renderer =\n typeof rendererDef === \"string\" ? core.resolveCellRenderer(rendererDef) : rendererDef;\n\n if (renderer) {\n const params: CellRendererParams = {\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n formatted,\n rowIndex: node.rowIndex,\n rendererParams: column.colDef.cellRendererParams\n };\n if (tryRefreshRenderer(core, cell, node, column, renderer, params)) {\n updateCellTooltip(core, cell, node, column, value, formatted);\n return;\n }\n cleanupCellContent(core, cell);\n let out: ReturnType<typeof renderer>;\n try {\n out = renderer(params);\n } catch (error) {\n core.reportError(error, \"cellRenderer\", { colId: column.id, rowId: node.id });\n cell.textContent = formatted;\n return;\n }\n if (typeof out === \"string\") {\n cell.textContent = out;\n } else if (out instanceof HTMLElement) {\n cell.replaceChildren(out);\n } else if (out && typeof out === \"object\" && out.el instanceof HTMLElement) {\n const result = out;\n cell.replaceChildren(result.el);\n const state = getCellRuntimeState(cell);\n state.destroy = result.destroy;\n if (result.refresh) {\n state.refresh = (next) => result.refresh!(next);\n state.rendererDefinition = renderer;\n state.rendererRowId = node.id;\n state.rendererColumnId = column.id;\n }\n } else {\n cell.textContent = \"\";\n }\n } else {\n cleanupCellContent(core, cell);\n cell.textContent = formatted;\n }\n updateCellTooltip(core, cell, node, column, value, formatted);\n}\n\nexport function applyCellClasses(core: CellValueContext, cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const value = core.getCellValue(node, column);\n const classes = [\"mach-cell\"];\n const align = column.colDef.align;\n if (align === \"center\") {\n classes.push(\"mach-cell--center\");\n } else if (align === \"right\") {\n classes.push(\"mach-cell--right\");\n } else if (hasColumnType(column.colDef, \"rightAligned\") || hasColumnType(column.colDef, \"numericColumn\") || (typeof value === \"number\" && value != null)) {\n classes.push(\"mach-cell--num\");\n }\n\n const rule = column.colDef.cellClass;\n if (rule) {\n if (typeof rule === \"function\") {\n const params: CellClassParams = {\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value,\n rowIndex: node.rowIndex\n };\n try {\n const result = rule(params);\n if (typeof result === \"string\") classes.push(result);\n else if (Array.isArray(result)) classes.push(...result);\n } catch (error) {\n core.reportError(error, \"cellClass\", { colId: column.id, rowId: node.id });\n }\n } else if (typeof rule === \"string\") {\n classes.push(rule);\n } else if (Array.isArray(rule)) {\n classes.push(...rule);\n }\n }\n\n const hadFocus = cell.classList.contains(\"mach-cell--focus\");\n const hadEditing = cell.classList.contains(\"mach-cell--editing\");\n if (hadFocus) classes.push(\"mach-cell--focus\");\n if (hadEditing) classes.push(\"mach-cell--editing\");\n if (column.colDef.wrapText) classes.push(\"mach-cell--wrap\");\n\n const className = classes.join(\" \");\n if (cell.className !== className) cell.className = className;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type { RowNode } from \"../types/row\";\nimport type { ICellEditor } from \"../types/params\";\nimport { createEditor } from \"./editors\";\nimport { cleanupCellContent } from \"../render/cellContent\";\n\ntype EditingContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"keyboardService\"\n | \"notifyCellValueChanged\"\n | \"options\"\n | \"reportError\"\n | \"resolveCellEditor\"\n | \"rowModel\"\n | \"setCellValue\"\n | \"statusBarService\"\n | \"summaryRenderer\"\n | \"undoService\"\n | \"writeValue\"\n>;\n\ninterface MountedEditor {\n editor: ICellEditor;\n cell: HTMLElement;\n shell: HTMLElement;\n keydown: (event: KeyboardEvent) => void;\n input?: (event: Event) => void;\n}\n\ninterface CellEditingState extends MountedEditor {\n node: RowNode<any>;\n column: Column;\n rowIndex: number;\n oldValue: any;\n confirmButton: HTMLButtonElement;\n cancelButton: HTMLButtonElement;\n}\n\ninterface RowDraft {\n column: Column;\n oldValue: any;\n value: any;\n mounted: MountedEditor | null;\n error?: string;\n}\n\ninterface RowEditingState {\n node: RowNode<any>;\n rowIndex: number;\n drafts: Map<string, RowDraft>;\n validating: boolean;\n}\n\nconst CHECK_PATH = '<path d=\"M3 8.5 6.4 12 13.5 4\"/>';\nconst CLOSE_PATH = '<path d=\"m4 4 8 8m0-8-8 8\"/>';\n\nfunction createEditButton(kind: \"confirm\" | \"cancel\", label: string): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = `mach-edit-control mach-edit-control--${kind}`;\n button.setAttribute(\"aria-label\", label);\n button.title = label;\n button.innerHTML = `<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${kind === \"confirm\" ? CHECK_PATH : CLOSE_PATH}</svg>`;\n button.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n });\n return button;\n}\n\nexport class EditingService {\n private cellEditing: CellEditingState | null = null;\n private rowEditing: RowEditingState | null = null;\n private stopPromise: Promise<boolean> | null = null;\n private stopToken = 0;\n\n constructor(private core: EditingContext) {}\n\n isEditing(rowIndex?: number, colId?: string): boolean {\n if (this.cellEditing) {\n if (rowIndex == null && colId == null) return true;\n return this.cellEditing.rowIndex === rowIndex && this.cellEditing.column.id === colId;\n }\n if (!this.rowEditing) return false;\n if (rowIndex == null && colId == null) return true;\n if (this.currentRowIndex(this.rowEditing) !== rowIndex) return false;\n return colId == null || this.rowEditing.drafts.has(colId);\n }\n\n isCellEditing(): boolean {\n return this.cellEditing != null;\n }\n\n isRowEditing(rowIndex?: number): boolean {\n if (!this.rowEditing) return false;\n return rowIndex == null || this.currentRowIndex(this.rowEditing) === rowIndex;\n }\n\n isEditable(node: RowNode<any>, column: Column): boolean {\n if (node.isDetail || node.isGroup || node.data == null) return false;\n const editable = column.colDef.editable;\n if (!editable) return false;\n if (typeof editable === \"function\") {\n try {\n return editable({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex: node.rowIndex\n });\n } catch (error) {\n this.core.reportError(error, \"editable\", { colId: column.id, rowId: node.id });\n return false;\n }\n }\n return true;\n }\n\n start(rowIndex: number, column: Column, keyPress?: string | null): boolean {\n if (this.core.options.editType === \"fullRow\") return this.startRow(rowIndex, column.id);\n if (this.cellEditing || this.rowEditing) return false;\n const node = this.core.rowModel.getDisplayedRow(rowIndex);\n if (!node || node.data == null || !this.isEditable(node, column)) return false;\n const cell = this.core.bodyRenderer.getCellElement(rowIndex, column.id);\n if (!cell) return false;\n\n const oldValue = this.core.getCellValue(node, column);\n const editor = this.createCellEditor(node, column, rowIndex, oldValue, keyPress);\n if (!editor) return false;\n\n cleanupCellContent(this.core, cell);\n const shell = document.createElement(\"div\");\n shell.className = \"mach-cell-editor-shell\";\n const controls = document.createElement(\"div\");\n controls.className = \"mach-cell-editor-controls\";\n const confirmButton = createEditButton(\"confirm\", \"Confirm edit\");\n const cancelButton = createEditButton(\"cancel\", \"Cancel edit\");\n controls.append(confirmButton, cancelButton);\n shell.append(editor.el, controls);\n cell.replaceChildren(shell);\n cell.classList.add(\"mach-cell--editing\");\n cell.removeAttribute(\"title\");\n\n const keydown = this.onCellEditorKeyDown;\n editor.el.addEventListener(\"keydown\", keydown);\n editor.el.addEventListener(\"focusout\", this.onCellEditorBlur);\n confirmButton.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n void this.stopAsync(false);\n });\n cancelButton.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n void this.stopAsync(true);\n });\n\n this.cellEditing = {\n node,\n column,\n editor,\n rowIndex,\n oldValue,\n cell,\n shell,\n keydown,\n confirmButton,\n cancelButton\n };\n this.focusEditor(editor, column, node);\n this.core.emit(\"cellEditingStarted\", { rowIndex, colId: column.id, rowNode: node });\n return true;\n }\n\n startRow(rowIndex: number, preferredColId?: string): boolean {\n if (this.cellEditing || this.rowEditing) return false;\n const node = this.core.rowModel.getDisplayedRow(rowIndex);\n if (!node || node.data == null || node.isDetail || node.isGroup) return false;\n\n const drafts = new Map<string, RowDraft>();\n for (const column of this.core.columnModel.getOrderedVisible()) {\n if (!this.isEditable(node, column)) continue;\n const oldValue = this.core.getCellValue(node, column);\n drafts.set(column.id, { column, oldValue, value: oldValue, mounted: null });\n }\n if (drafts.size === 0) return false;\n\n const row: RowEditingState = { node, rowIndex, drafts, validating: false };\n this.rowEditing = row;\n this.core.bodyRenderer.refreshRows([rowIndex]);\n if (drafts.size === 0) {\n this.rowEditing = null;\n this.core.bodyRenderer.refreshRows([rowIndex]);\n return false;\n }\n const first = drafts.values().next().value;\n const target = (preferredColId ? drafts.get(preferredColId) : undefined) ?? first;\n if (target?.mounted) this.focusEditor(target.mounted.editor, target.column, node);\n this.core.emit(\"rowEditingStarted\", { rowIndex, rowNode: node, data: node.data });\n return true;\n }\n\n /** Called by BodyRenderer so row editors survive horizontal/vertical virtualization. */\n renderEditor(rowIndex: number, node: RowNode<any>, column: Column, cell: HTMLElement): boolean {\n if (this.cellEditing) return this.cellEditing.node === node && this.cellEditing.column.id === column.id;\n const row = this.rowEditing;\n if (!row || row.node !== node) return false;\n const draft = row.drafts.get(column.id);\n if (!draft) return false;\n if (draft.mounted?.cell !== cell) {\n if (draft.mounted) this.unmountRowDraft(draft);\n if (!this.mountRowDraft(rowIndex, row, draft, cell)) {\n row.drafts.delete(column.id);\n return false;\n }\n }\n return true;\n }\n\n /** Captures a staged value before a pooled/virtual cell is reused. */\n releaseCell(rowIndex: number, colId: string, cell: HTMLElement): void {\n const row = this.rowEditing;\n if (row && this.currentRowIndex(row) === rowIndex) {\n const draft = row.drafts.get(colId);\n if (draft?.mounted?.cell === cell) this.unmountRowDraft(draft);\n return;\n }\n if (this.cellEditing?.cell === cell) {\n const editing = this.cellEditing;\n void this.stopAsync(false);\n // A pooled cell cannot safely retain an editor while async validation is pending.\n // Synchronous commits have already completed; pending editors are cancelled cleanly.\n if (this.cellEditing === editing) void this.stopAsync(true);\n }\n }\n\n stop(cancel = false): void {\n void this.stopAsync(cancel);\n }\n\n stopAsync(cancel = false): Promise<boolean> {\n if (this.rowEditing) return this.stopRowAsync(cancel);\n const editing = this.cellEditing;\n if (!editing) return Promise.resolve(false);\n if (cancel) {\n this.stopToken++;\n this.stopPromise = null;\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n if (this.stopPromise) return this.stopPromise;\n\n let newValue: any;\n try {\n newValue = editing.editor.getValue();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.getValue\", { colId: editing.column.id, rowId: editing.node.id });\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n try {\n if (editing.editor.isCancelAfterEnd?.(newValue)) {\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n } catch (error) {\n this.core.reportError(error, \"cellEditor.isCancelAfterEnd\", { colId: editing.column.id, rowId: editing.node.id });\n return Promise.resolve(this.finishCellStop(editing, true, editing.oldValue));\n }\n\n const validation = this.validateValue(editing.node, editing.column, editing.oldValue, newValue);\n if (validation && typeof (validation as Promise<unknown>).then === \"function\") {\n const token = ++this.stopToken;\n this.setCellBusy(editing, true);\n const task = Promise.resolve(validation)\n .then((result) => {\n if (token !== this.stopToken || this.cellEditing !== editing) return false;\n if (typeof result === \"string\") {\n this.showError(editing.editor, result);\n return false;\n }\n return this.finishCellStop(editing, false, newValue);\n })\n .catch((error) => {\n if (token !== this.stopToken || this.cellEditing !== editing) return false;\n this.core.reportError(error, \"validate\", { colId: editing.column.id, rowId: editing.node.id });\n this.showError(editing.editor, \"Validation failed\");\n return false;\n })\n .finally(() => {\n if (this.stopPromise === task) this.stopPromise = null;\n });\n this.stopPromise = task;\n return task;\n }\n if (typeof validation === \"string\") {\n this.showError(editing.editor, validation);\n return Promise.resolve(false);\n }\n return Promise.resolve(this.finishCellStop(editing, false, newValue));\n }\n\n stopRowAsync(cancel = false): Promise<boolean> {\n const row = this.rowEditing;\n if (!row) return Promise.resolve(false);\n if (cancel) {\n this.stopToken++;\n this.stopPromise = null;\n return Promise.resolve(this.finishRowStop(row, true));\n }\n if (this.stopPromise) return this.stopPromise;\n\n for (const draft of row.drafts.values()) this.captureRowDraft(draft);\n const changed = [...row.drafts.values()].filter((draft) => !Object.is(draft.oldValue, draft.value));\n if (changed.length === 0) return Promise.resolve(this.finishRowStop(row, false));\n\n const token = ++this.stopToken;\n for (const draft of changed) draft.error = undefined;\n row.validating = true;\n this.setRowBusy(row, true);\n const task = Promise.all(\n changed.map(async (draft) => {\n try {\n const result = await this.validateValue(row.node, draft.column, draft.oldValue, draft.value);\n return { draft, message: typeof result === \"string\" ? result : null };\n } catch (error) {\n this.core.reportError(error, \"validate\", { colId: draft.column.id, rowId: row.node.id });\n return { draft, message: \"Validation failed\" };\n }\n })\n )\n .then(async (results) => {\n if (token !== this.stopToken || this.rowEditing !== row) return false;\n const invalid = results.filter((result) => result.message != null);\n if (invalid.length > 0) {\n this.showRowErrors(row, invalid.map((result) => ({ draft: result.draft, message: result.message! })));\n return false;\n }\n const rowErrors = await this.validateRowDraft(row, changed);\n if (token !== this.stopToken || this.rowEditing !== row) return false;\n if (rowErrors.length > 0) {\n this.showRowErrors(row, rowErrors);\n return false;\n }\n return this.finishRowStop(row, false);\n })\n .finally(() => {\n if (this.stopPromise === task) this.stopPromise = null;\n });\n this.stopPromise = task;\n return task;\n }\n\n private finishCellStop(editing: CellEditingState, cancel: boolean, newValue: any): boolean {\n if (this.cellEditing !== editing) return false;\n this.cellEditing = null;\n const changed = !cancel && this.applyValue(editing.node, editing.column, editing.oldValue, newValue);\n this.destroyMountedEditor(editing, true);\n\n this.core.emit(\"cellEditingStopped\", {\n rowIndex: editing.rowIndex,\n colId: editing.column.id,\n rowNode: editing.node,\n oldValue: editing.oldValue,\n newValue: changed ? newValue : editing.oldValue\n });\n if (editing.node.rowIndex >= 0) this.core.bodyRenderer.refreshRows([editing.node.rowIndex]);\n this.core.summaryRenderer.refresh();\n this.core.statusBarService.refresh();\n return true;\n }\n\n private finishRowStop(row: RowEditingState, cancelled: boolean): boolean {\n if (this.rowEditing !== row) return false;\n const changes = cancelled ? [] : this.commitRowDrafts(row);\n if (changes == null) return false;\n for (const draft of row.drafts.values()) {\n if (!cancelled) this.captureRowDraft(draft);\n if (draft.mounted) this.destroyMountedEditor(draft.mounted, true);\n draft.mounted = null;\n }\n this.rowEditing = null;\n\n const rowIndex = this.currentRowIndex(row);\n this.core.emit(\"rowEditingStopped\", {\n rowIndex,\n rowNode: row.node,\n data: row.node.data!,\n cancelled,\n changes\n });\n if (rowIndex >= 0) this.core.bodyRenderer.refreshRows([rowIndex]);\n this.core.summaryRenderer.refresh();\n this.core.statusBarService.refresh();\n return true;\n }\n\n private commitRowDrafts(\n row: RowEditingState\n ): Array<{ colId: string; oldValue: unknown; newValue: unknown }> | null {\n const changed = [...row.drafts.values()].filter((draft) => !Object.is(draft.oldValue, draft.value));\n if (changed.length === 0) return [];\n const applied: RowDraft[] = [];\n this.core.undoService.beginBatch();\n for (const draft of changed) {\n if (!this.core.writeValue(row.node, draft.column, draft.value, draft.oldValue)) {\n let rollbackFailed = false;\n for (const previous of [...applied].reverse()) {\n if (!this.core.writeValue(row.node, previous.column, previous.oldValue, previous.value)) rollbackFailed = true;\n }\n this.core.undoService.cancelBatch();\n if (rollbackFailed) {\n this.core.reportError(new Error(\"A valueSetter rejected full-row rollback\"), \"rowEditRollback\", {\n rowId: row.node.id,\n colId: draft.column.id\n });\n }\n this.showRowErrors(row, [{ draft, message: \"Value was rejected by the column setter\" }]);\n return null;\n }\n applied.push(draft);\n }\n for (const draft of applied) {\n this.core.notifyCellValueChanged(row.node, draft.column, draft.oldValue, draft.value);\n }\n this.core.undoService.endBatch();\n return applied.map((draft) => ({\n colId: draft.column.id,\n oldValue: draft.oldValue,\n newValue: draft.value\n }));\n }\n\n private mountRowDraft(rowIndex: number, row: RowEditingState, draft: RowDraft, cell: HTMLElement): boolean {\n const editor = this.createCellEditor(row.node, draft.column, rowIndex, draft.value, null);\n if (!editor) return false;\n cleanupCellContent(this.core, cell);\n const shell = document.createElement(\"div\");\n shell.className = \"mach-row-editor-shell\";\n shell.appendChild(editor.el);\n cell.replaceChildren(shell);\n cell.classList.add(\"mach-cell--editing\", \"mach-cell--row-editing\");\n cell.removeAttribute(\"title\");\n\n const keydown = (event: KeyboardEvent) => this.onRowEditorKeyDown(event, row, draft);\n const input = () => {\n try {\n draft.value = editor.getValue();\n draft.error = undefined;\n } catch {\n // getValue is retried at commit and reported with column context there.\n }\n };\n editor.el.addEventListener(\"keydown\", keydown);\n editor.el.addEventListener(\"input\", input);\n draft.mounted = { editor, cell, shell, keydown, input };\n if (draft.error) this.showError(editor, draft.error);\n if (row.validating) {\n editor.el.classList.add(\"mach-editor-validating\");\n editor.el.setAttribute(\"aria-busy\", \"true\");\n editor.el.inert = true;\n }\n return true;\n }\n\n private unmountRowDraft(draft: RowDraft): void {\n if (!draft.mounted) return;\n this.captureRowDraft(draft);\n this.destroyMountedEditor(draft.mounted, true);\n draft.mounted = null;\n }\n\n private captureRowDraft(draft: RowDraft): void {\n if (!draft.mounted) return;\n try {\n const next = draft.mounted.editor.getValue();\n if (next !== undefined) draft.value = next;\n } catch (error) {\n this.core.reportError(error, \"cellEditor.getValue\", {\n colId: draft.column.id,\n rowId: this.rowEditing?.node.id\n });\n }\n }\n\n private createCellEditor(\n node: RowNode<any>,\n column: Column,\n rowIndex: number,\n value: any,\n keyPress?: string | null\n ): ICellEditor | null {\n const def = column.colDef;\n let editor: ICellEditor;\n try {\n const params = {\n api: this.core.getApi(),\n colDef: def,\n column,\n node,\n data: node.data,\n value,\n rowIndex,\n keyPress\n };\n if (typeof def.cellEditor === \"function\") {\n editor = def.cellEditor(params);\n } else if (typeof def.cellEditor === \"string\" && ![\"text\", \"number\", \"date\", \"select\"].includes(def.cellEditor)) {\n editor = this.core.resolveCellEditor(def.cellEditor)?.(params) ?? createEditor(column, value, keyPress);\n } else {\n editor = createEditor(column, value, keyPress);\n }\n } catch (error) {\n this.core.reportError(error, \"cellEditor\", { colId: column.id, rowId: node.id });\n return null;\n }\n if (!editor || !(editor.el instanceof HTMLElement)) {\n this.core.reportError(new Error(\"cellEditor must return an editor with an HTMLElement el\"), \"cellEditor\", {\n colId: column.id,\n rowId: node.id\n });\n return null;\n }\n try {\n if (editor.isCancelBeforeStart?.()) {\n editor.destroy?.();\n return null;\n }\n } catch (error) {\n this.core.reportError(error, \"cellEditor.isCancelBeforeStart\", { colId: column.id, rowId: node.id });\n try { editor.destroy?.(); } catch { void 0; }\n return null;\n }\n return editor;\n }\n\n private validateValue(\n node: RowNode<any>,\n column: Column,\n oldValue: any,\n newValue: any\n ): string | true | null | undefined | Promise<string | true | null | undefined> {\n const validate = column.colDef.validate;\n if (!validate) return true;\n try {\n return validate(newValue, {\n oldValue,\n newValue,\n data: node.data!,\n node,\n colDef: column.colDef,\n column,\n api: this.core.getApi()\n });\n } catch (error) {\n this.core.reportError(error, \"validate\", { colId: column.id, rowId: node.id });\n return \"Validation failed\";\n }\n }\n\n private async validateRowDraft(\n row: RowEditingState,\n changed: RowDraft[]\n ): Promise<Array<{ draft: RowDraft; message: string }>> {\n const validator = this.core.options.rowEditValidator;\n if (!validator) return [];\n const values: Record<string, unknown> = Object.create(null);\n for (const [colId, draft] of row.drafts) values[colId] = draft.value;\n const changes = changed.map((draft) => ({\n colId: draft.column.id,\n oldValue: draft.oldValue,\n newValue: draft.value\n }));\n let result: import(\"../types/options\").RowEditValidationResult;\n try {\n result = await validator({ data: row.node.data!, node: row.node, values, changes, api: this.core.getApi() });\n } catch (error) {\n this.core.reportError(error, \"rowEditValidator\", { rowId: row.node.id });\n return [{ draft: changed[0], message: \"Row validation failed\" }];\n }\n if (typeof result === \"string\") return [{ draft: changed[0], message: result }];\n if (!result || result === true || typeof result !== \"object\") return [];\n const errors: Array<{ draft: RowDraft; message: string }> = [];\n for (const [colId, message] of Object.entries(result)) {\n const draft = row.drafts.get(colId);\n if (draft && typeof message === \"string\" && message) errors.push({ draft, message });\n }\n if (errors.length === 0) {\n const firstMessage = Object.values(result).find((message) => typeof message === \"string\" && message);\n if (typeof firstMessage === \"string\") errors.push({ draft: changed[0], message: firstMessage });\n }\n return errors;\n }\n\n private showRowErrors(row: RowEditingState, errors: Array<{ draft: RowDraft; message: string }>): void {\n row.validating = false;\n this.setRowBusy(row, false);\n for (const { draft, message } of errors) {\n draft.error = message;\n if (draft.mounted) this.showError(draft.mounted.editor, message);\n }\n errors[0].draft.mounted?.editor.focus?.();\n }\n\n private showError(editor: ICellEditor, message: string): void {\n const editorEl = editor.el;\n editorEl.classList.add(\"mach-editor-invalid\");\n editorEl.setAttribute(\"title\", message);\n editorEl.setAttribute(\"aria-invalid\", \"true\");\n editorEl.classList.remove(\"mach-editor-validating\");\n editorEl.removeAttribute(\"aria-busy\");\n editorEl.inert = false;\n const input = editorEl.querySelector(\"input, select, textarea\") ?? editorEl;\n (input as HTMLElement).focus?.();\n const clear = () => {\n editorEl.classList.remove(\"mach-editor-invalid\");\n editorEl.removeAttribute(\"title\");\n editorEl.removeAttribute(\"aria-invalid\");\n };\n editorEl.addEventListener(\"input\", clear, { once: true });\n }\n\n private setCellBusy(editing: CellEditingState, busy: boolean): void {\n editing.editor.el.classList.toggle(\"mach-editor-validating\", busy);\n if (busy) editing.editor.el.setAttribute(\"aria-busy\", \"true\");\n else editing.editor.el.removeAttribute(\"aria-busy\");\n editing.editor.el.inert = busy;\n editing.confirmButton.disabled = busy;\n editing.cancelButton.disabled = false;\n editing.shell.classList.toggle(\"mach-editor-shell--busy\", busy);\n }\n\n private setRowBusy(row: RowEditingState, busy: boolean): void {\n for (const draft of row.drafts.values()) {\n const editorEl = draft.mounted?.editor.el;\n if (!editorEl) continue;\n editorEl.classList.toggle(\"mach-editor-validating\", busy);\n if (busy) editorEl.setAttribute(\"aria-busy\", \"true\");\n else editorEl.removeAttribute(\"aria-busy\");\n editorEl.inert = busy;\n }\n }\n\n private applyValue(node: RowNode<any>, column: Column, oldValue: any, newValue: any): boolean {\n if (newValue === undefined) return false;\n return this.core.setCellValue(node, column, newValue, oldValue);\n }\n\n private focusEditor(editor: ICellEditor, column: Column, node: RowNode<any>): void {\n try {\n editor.focus?.();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.focus\", { colId: column.id, rowId: node.id });\n }\n }\n\n private destroyMountedEditor(mounted: MountedEditor, removeCellState: boolean): void {\n mounted.editor.el.removeEventListener(\"keydown\", mounted.keydown);\n if (mounted.input) mounted.editor.el.removeEventListener(\"input\", mounted.input);\n mounted.editor.el.removeEventListener(\"focusout\", this.onCellEditorBlur);\n mounted.editor.el.classList.remove(\"mach-editor-validating\");\n mounted.editor.el.removeAttribute(\"aria-busy\");\n mounted.editor.el.inert = false;\n try {\n mounted.editor.destroy?.();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.destroy\", { colId: mounted.cell.dataset.colId });\n }\n if (removeCellState) mounted.cell.classList.remove(\"mach-cell--editing\", \"mach-cell--row-editing\", \"mach-cell--error\");\n }\n\n private currentRowIndex(row: RowEditingState): number {\n return row.node.rowIndex >= 0 ? row.node.rowIndex : row.rowIndex;\n }\n\n private onCellEditorKeyDown = (event: KeyboardEvent): void => {\n if (!this.cellEditing) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n void this.stopAsync(false);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n void this.stopAsync(true);\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n event.stopPropagation();\n const current = this.cellEditing;\n const next = this.core.keyboardService.nextEditable(current.rowIndex, current.column.id, event.shiftKey ? -1 : 1);\n void this.stopAsync(false).then((stopped) => {\n if (stopped && next) {\n this.core.bodyRenderer.scrollToIndex(next.rowIndex, \"nearest\");\n this.core.bodyRenderer.setFocusedCell(next.rowIndex, next.column.id);\n this.start(next.rowIndex, next.column);\n }\n });\n }\n };\n\n private onRowEditorKeyDown(event: KeyboardEvent, row: RowEditingState, draft: RowDraft): void {\n if (this.rowEditing !== row) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n void this.stopRowAsync(true);\n return;\n }\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n event.stopPropagation();\n void this.stopRowAsync(false);\n return;\n }\n if (event.key !== \"Tab\") return;\n event.preventDefault();\n event.stopPropagation();\n this.captureRowDraft(draft);\n const drafts = [...row.drafts.values()];\n const currentIndex = drafts.indexOf(draft);\n const direction = event.shiftKey ? -1 : 1;\n for (let offset = 1; offset <= drafts.length; offset++) {\n const next = drafts[(currentIndex + direction * offset + drafts.length) % drafts.length];\n if (!next.mounted) continue;\n this.focusEditor(next.mounted.editor, next.column, row.node);\n break;\n }\n }\n\n private onCellEditorBlur = (): void => {\n window.setTimeout(() => {\n if (this.cellEditing) void this.stopAsync(false);\n }, 0);\n };\n\n destroy(): void {\n if (this.cellEditing || this.rowEditing) void this.stopAsync(true);\n }\n}\n","export const DEFAULT_LOCALE = {\n matchContains: \"包含\",\n matchNotContains: \"不包含\",\n matchEquals: \"等于\",\n matchNotEquals: \"不等于\",\n matchStartsWith: \"开头是\",\n matchEndsWith: \"结尾是\",\n matchBlank: \"为空\",\n matchNotBlank: \"不为空\",\n matchLessThan: \"小于\",\n matchLessThanOrEqual: \"小于等于\",\n matchGreaterThan: \"大于\",\n matchGreaterThanOrEqual: \"大于等于\",\n matchInRange: \"在范围内\",\n apply: \"应用\",\n reset: \"重置\",\n search: \"搜索...\",\n emptySetLabel: \"(空)\",\n selectedCount: \"已选 {n} 项\",\n sortAsc: \"升序\",\n sortDesc: \"降序\",\n clearSort: \"取消排序\",\n pinLeft: \"固定左侧\",\n pinRight: \"固定右侧\",\n clearPin: \"取消固定\",\n autoSize: \"自适应列宽\",\n hideColumn: \"隐藏此列\",\n columnVisibility: \"列显示\",\n resetAll: \"重置全部\",\n autoSizeAll: \"全部自适应\",\n columnSettings: \"列设置\",\n totalLabel: \"合计\",\n totalRowsLabel: \"共 {n} 行\",\n menuCopy: \"复制\",\n menuPaste: \"粘贴\",\n menuClearContents: \"清除内容\",\n loading: \"加载中...\",\n statusSelected: \"已选 {n} 行\",\n statusSum: \"和 {n}\",\n statusAvg: \"均 {n}\",\n statusCount: \"计 {n}\",\n emptyRows: \"暂无数据\",\n emptyRowsHint: \"没有可显示的行\",\n paginationTotal: \"共 {n} 条\",\n paginationPage: \"第 {a} / {b} 页\",\n perPage: \"{n} 条/页\",\n pageFirst: \"首页\",\n pagePrev: \"上一页\",\n pageNext: \"下一页\",\n pageLast: \"末页\",\n requestFailed: \"数据加载失败\",\n requestFailedHint: \"请检查网络后重试\",\n actionView: \"查看\",\n actionEdit: \"编辑\",\n actionDelete: \"删除\",\n actionConfirm: \"确认\",\n actionSave: \"保存\",\n actionCancel: \"取消\",\n actionMore: \"更多操作\"\n} as const;\n\nexport type RgLocaleKey = keyof typeof DEFAULT_LOCALE;\nexport type RgLocale = Partial<Record<RgLocaleKey, string>>;\n\nexport const LOCALE_EN: RgLocale = {\n matchContains: \"Contains\",\n matchNotContains: \"Not Contains\",\n matchEquals: \"Equals\",\n matchNotEquals: \"Not Equals\",\n matchStartsWith: \"Starts With\",\n matchEndsWith: \"Ends With\",\n matchBlank: \"Blank\",\n matchNotBlank: \"Not Blank\",\n matchLessThan: \"Less Than\",\n matchLessThanOrEqual: \"≤\",\n matchGreaterThan: \"Greater Than\",\n matchGreaterThanOrEqual: \"≥\",\n matchInRange: \"In Range\",\n apply: \"Apply\",\n reset: \"Reset\",\n search: \"Search...\",\n emptySetLabel: \"(blank)\",\n selectedCount: \"{n} selected\",\n sortAsc: \"Ascending\",\n sortDesc: \"Descending\",\n clearSort: \"Clear Sort\",\n pinLeft: \"Pin Left\",\n pinRight: \"Pin Right\",\n clearPin: \"Unpin\",\n autoSize: \"Auto Fit\",\n hideColumn: \"Hide Column\",\n columnVisibility: \"Columns\",\n resetAll: \"Reset All\",\n autoSizeAll: \"Fit All\",\n columnSettings: \"Column Settings\",\n totalLabel: \"Total\",\n totalRowsLabel: \"{n} rows\",\n menuCopy: \"Copy\",\n menuPaste: \"Paste\",\n menuClearContents: \"Clear Contents\",\n loading: \"Loading...\",\n statusSelected: \"{n} selected\",\n statusSum: \"Sum {n}\",\n statusAvg: \"Avg {n}\",\n statusCount: \"Cnt {n}\",\n emptyRows: \"No Data\",\n emptyRowsHint: \"No rows to display\",\n paginationTotal: \"{n} items\",\n paginationPage: \"Page {a} / {b}\",\n perPage: \"{n} / page\",\n pageFirst: \"First\",\n pagePrev: \"Previous\",\n pageNext: \"Next\",\n pageLast: \"Last\",\n requestFailed: \"Unable to load data\",\n requestFailedHint: \"Check your connection and try again\",\n actionView: \"View\",\n actionEdit: \"Edit\",\n actionDelete: \"Delete\",\n actionConfirm: \"Confirm\",\n actionSave: \"Save\",\n actionCancel: \"Cancel\",\n actionMore: \"More actions\"\n};\n\nconst MATCH_LOCALE_KEYS: Record<string, RgLocaleKey> = {\n contains: \"matchContains\",\n notContains: \"matchNotContains\",\n equals: \"matchEquals\",\n notEquals: \"matchNotEquals\",\n startsWith: \"matchStartsWith\",\n endsWith: \"matchEndsWith\",\n blank: \"matchBlank\",\n notBlank: \"matchNotBlank\",\n lessThan: \"matchLessThan\",\n lessThanOrEqual: \"matchLessThanOrEqual\",\n greaterThan: \"matchGreaterThan\",\n greaterThanOrEqual: \"matchGreaterThanOrEqual\",\n inRange: \"matchInRange\"\n};\n\nexport function matchLocaleKey(match: string): RgLocaleKey {\n return MATCH_LOCALE_KEYS[match] ?? (\"matchEquals\");\n}\n\nexport function formatText(template: string, n: number | string): string {\n return template.replace(\"{n}\", String(n));\n}\n\nexport function formatTwo(template: string, a: number | string, b: number | string): string {\n return template.replace(\"{a}\", String(a)).replace(\"{b}\", String(b));\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type {\n ColumnFilter,\n DateFilterMatch,\n NumberFilterMatch,\n TextFilterMatch\n} from \"../types/colDef\";\nimport { el, clamp } from \"../lib/dom\";\nimport { matchLocaleKey } from \"../lib/locale\";\n\ntype FilterPopupContext = Pick<\n GridCore<any>,\n \"applyColumnFilter\" | \"getCellValue\" | \"getLocaleText\" | \"rowModel\"\n>;\n\nconst TEXT_MATCHES: TextFilterMatch[] = [\n \"contains\",\n \"notContains\",\n \"equals\",\n \"notEquals\",\n \"startsWith\",\n \"endsWith\",\n \"blank\",\n \"notBlank\"\n];\nconst NUMBER_MATCHES: NumberFilterMatch[] = [\n \"equals\",\n \"notEquals\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"inRange\",\n \"blank\",\n \"notBlank\"\n];\nconst DATE_MATCHES: DateFilterMatch[] = [\"equals\", \"notEquals\", \"lessThan\", \"greaterThan\", \"inRange\", \"blank\", \"notBlank\"];\n\nexport class FilterPopupService {\n private panel: HTMLElement | null = null;\n private openColId: string | null = null;\n\n constructor(private core: FilterPopupContext) {}\n\n toggle(column: Column, anchor: HTMLElement): void {\n if (this.openColId === column.id) {\n this.close();\n return;\n }\n this.close();\n this.open(column, anchor);\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n\n private open(column: Column, anchor: HTMLElement): void {\n const filter = this.core.rowModel.getFilterModel()[column.id] ?? null;\n const type = filter?.type ?? column.filterType;\n const panel = el(\"div\", \"mach-filter-panel\");\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", `${column.id} filter`);\n\n if (type === \"set\") this.buildSetBody(panel, column, filter);\n else this.buildConditionBody(panel, column, type, filter);\n\n const footer = el(\"div\", \"mach-filter-footer\");\n const resetBtn = el(\"button\", \"mach-filter-btn-reset\") as HTMLButtonElement;\n resetBtn.type = \"button\";\n resetBtn.textContent = this.core.getLocaleText(\"reset\");\n resetBtn.addEventListener(\"click\", () => {\n this.core.applyColumnFilter(column, null);\n this.close();\n });\n const applyBtn = el(\"button\", \"mach-filter-btn-apply\") as HTMLButtonElement;\n applyBtn.type = \"button\";\n applyBtn.textContent = this.core.getLocaleText(\"apply\");\n applyBtn.addEventListener(\"click\", () => {\n const next = this.readFilter(panel);\n this.core.applyColumnFilter(column, next);\n this.close();\n });\n footer.append(resetBtn, applyBtn);\n panel.appendChild(footer);\n\n document.body.appendChild(panel);\n this.panel = panel;\n this.openColId = column.id;\n\n const rect = anchor.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, window.innerWidth - panelRect.width - 8);\n let top = rect.bottom + 4;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 4);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n const firstInput = panel.querySelector<HTMLInputElement>(\"input, select\");\n firstInput?.focus();\n }\n\n close(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n this.openColId = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private buildConditionBody(\n panel: HTMLElement,\n column: Column,\n type: \"text\" | \"number\" | \"date\",\n filter: ColumnFilter | null\n ): void {\n const matches = type === \"text\" ? TEXT_MATCHES : type === \"number\" ? NUMBER_MATCHES : DATE_MATCHES;\n const existing =\n filter && filter.type !== \"set\" && filter.conditions.length > 0 ? filter.conditions[0] : null;\n const currentMatch: TextFilterMatch | NumberFilterMatch | DateFilterMatch =\n existing?.match ?? (type === \"text\" ? \"contains\" : \"equals\");\n const isBlank = currentMatch === \"blank\" || currentMatch === \"notBlank\";\n\n const select = el(\"select\", \"mach-filter-select\") as HTMLSelectElement;\n for (const m of matches) {\n const option = document.createElement(\"option\");\n option.value = m;\n option.textContent = this.core.getLocaleText(matchLocaleKey(m));\n select.appendChild(option);\n }\n select.value = currentMatch;\n\n const valueInput = el(\"input\", \"mach-filter-input\") as HTMLInputElement;\n if (type === \"number\") valueInput.type = \"number\";\n if (type === \"date\") valueInput.type = \"date\";\n if (existing && existing.value != null && !isBlank) {\n valueInput.value = type === \"date\" ? String(existing.value).slice(0, 10) : String(existing.value);\n }\n\n const value2Input = el(\"input\", \"mach-filter-input mach-filter-input--second\") as HTMLInputElement;\n if (type === \"number\") value2Input.type = \"number\";\n if (type === \"date\") value2Input.type = \"date\";\n if (existing && \"value2\" in existing && existing.value2 != null) {\n value2Input.value = String(existing.value2).slice(0, 10);\n }\n value2Input.style.display = currentMatch === \"inRange\" ? \"\" : \"none\";\n\n select.addEventListener(\"change\", () => {\n const blank = select.value === \"blank\" || select.value === \"notBlank\";\n valueInput.style.display = blank ? \"none\" : \"\";\n value2Input.style.display = select.value === \"inRange\" ? \"\" : \"none\";\n });\n\n const enterApply = (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n const next = this.readFilter(panel);\n this.core.applyColumnFilter(column, next);\n this.close();\n }\n };\n valueInput.addEventListener(\"keydown\", enterApply);\n value2Input.addEventListener(\"keydown\", enterApply);\n\n const body = el(\"div\", \"mach-filter-body\");\n body.append(select, valueInput, value2Input);\n panel.appendChild(body);\n panel.dataset.filterType = type;\n }\n\n private buildSetBody(panel: HTMLElement, column: Column, filter: ColumnFilter | null): void {\n const def = column.colDef;\n const params = def.filterParams;\n let values: (string | number | null)[];\n\n if (params?.values) {\n values = params.values;\n } else {\n const seen = new Set<string>();\n values = [];\n const nodes = this.core.rowModel.getAllNodes();\n const cap = Math.min(nodes.length, params?.maxValues ?? 500);\n for (let i = 0; i < cap; i++) {\n const v = this.core.getCellValue(nodes[i], column);\n const key = v == null ? \"__null__\" : String(v);\n if (seen.has(key)) continue;\n seen.add(key);\n values.push(v);\n }\n }\n\n const selected = new Set<string>(\n filter?.type === \"set\" ? filter.values.map((v) => (v == null ? \"__null__\" : String(v))) : values.map((v) => (v == null ? \"__null__\" : String(v)))\n );\n\n const search = el(\"input\", \"mach-filter-input mach-filter-input--search\") as HTMLInputElement;\n search.type = \"text\";\n search.placeholder = this.core.getLocaleText(\"search\");\n\n const list = el(\"div\", \"mach-filter-set-list\");\n const checkboxes: HTMLInputElement[] = [];\n const valueByKey = new Map<string, string | number | null>();\n\n const renderList = (query: string) => {\n list.textContent = \"\";\n checkboxes.length = 0;\n const q = query.trim().toLowerCase();\n for (const v of values) {\n const text = v == null ? this.core.getLocaleText(\"emptySetLabel\") : String(v);\n if (q && !text.toLowerCase().includes(q)) continue;\n const key = v == null ? \"__null__\" : String(v);\n valueByKey.set(key, v);\n const label = el(\"label\", \"mach-filter-set-item\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.checked = selected.has(key);\n cb.addEventListener(\"change\", () => {\n if (cb.checked) selected.add(key);\n else selected.delete(key);\n });\n const span = el(\"span\");\n span.textContent = text;\n label.append(cb, span);\n list.appendChild(label);\n checkboxes.push(cb);\n }\n };\n\n search.addEventListener(\"input\", () => renderList(search.value));\n renderList(\"\");\n panel.dataset.filterType = \"set\";\n panel.dataset.setValues = JSON.stringify([...valueByKey.entries()]);\n\n const updateSetValues = () => {\n const entries = [...valueByKey.entries()];\n panel.dataset.setValues = JSON.stringify(entries);\n };\n updateSetValues();\n\n const body = el(\"div\", \"mach-filter-body mach-filter-body--set\");\n body.append(search, list);\n panel.appendChild(body);\n }\n\n private readFilter(panel: HTMLElement): ColumnFilter | null {\n const type = panel.dataset.filterType;\n\n if (type === \"set\") {\n let entries: [string, string | number | null][] = [];\n try {\n entries = JSON.parse(panel.dataset.setValues ?? \"[]\");\n } catch {\n entries = [];\n }\n const selectedKeys = new Set<string>();\n panel.querySelectorAll<HTMLInputElement>(\".mach-filter-set-item input:checked\").forEach((cb) => {\n const item = cb.closest(\".mach-filter-set-item\")!;\n const span = item.querySelector(\"span\")!;\n const emptyLabel = this.core.getLocaleText(\"emptySetLabel\");\n const text = span.textContent === emptyLabel ? \"__null__\" : span.textContent ?? \"\";\n selectedKeys.add(text);\n });\n const picked = entries.filter(([key]) => selectedKeys.has(key)).map(([, v]) => v);\n if (picked.length === entries.length || picked.length === 0) return null;\n return { type: \"set\", values: picked };\n }\n\n const select = panel.querySelector<HTMLSelectElement>(\".mach-filter-select\");\n const inputs = panel.querySelectorAll<HTMLInputElement>(\".mach-filter-input\");\n const valueInput = inputs[0];\n const value2Input = inputs[1];\n if (!select || !valueInput) return null;\n\n const match = select.value;\n if (match === \"blank\" || match === \"notBlank\") {\n return { type, conditions: [{ match: match }] } as ColumnFilter;\n }\n const raw = valueInput.value;\n if (raw === \"\" && !(match === \"inRange\")) return null;\n\n if (type === \"number\") {\n const value = Number(raw);\n if (isNaN(value)) return null;\n if (match === \"inRange\") {\n const value2 = value2Input && value2Input.value !== \"\" ? Number(value2Input.value) : value;\n if (isNaN(value2)) return null;\n return { type: \"number\", conditions: [{ match: \"inRange\", value, value2 }] };\n }\n return { type: \"number\", conditions: [{ match: match as NumberFilterMatch, value }] };\n }\n\n if (type === \"date\") {\n const value = raw;\n if (match === \"inRange\") {\n const value2 = value2Input && value2Input.value !== \"\" ? value2Input.value : value;\n return { type: \"date\", conditions: [{ match: \"inRange\", value, value2 }] };\n }\n return { type: \"date\", conditions: [{ match: match as DateFilterMatch, value }] };\n }\n\n return { type: \"text\", conditions: [{ match: match as TextFilterMatch, value: raw }] };\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el, clamp } from \"../lib/dom\";\n\ntype ColumnMenuContext = Pick<\n GridCore<any>,\n \"columnModel\" | \"getApi\" | \"getLocaleText\" | \"options\" | \"skeleton\"\n>;\n\nexport class ColumnMenuService {\n private panel: HTMLElement | null = null;\n private openColId: string | null = null;\n private standaloneAnchor: HTMLElement | null = null;\n private searchText = \"\";\n\n constructor(private core: ColumnMenuContext) {}\n\n toggle(column: Column, anchor: HTMLElement): void {\n if (this.openColId === column.id) {\n this.close();\n return;\n }\n this.close();\n this.open(column, anchor);\n }\n\n openStandalone(anchor?: HTMLElement): void {\n this.close();\n const target =\n anchor ??\n (() => {\n const root = this.core.skeleton.root;\n const rect = root.getBoundingClientRect();\n const fake = document.createElement(\"div\");\n fake.style.position = \"fixed\";\n fake.style.left = `${rect.right - 16}px`;\n fake.style.top = `${rect.top + this.core.options.headerHeight}px`;\n fake.style.width = \"1px\";\n fake.style.height = \"1px\";\n document.body.appendChild(fake);\n this.standaloneAnchor = fake;\n return fake;\n })();\n this.open(null, target);\n }\n\n close(): void {\n if (this.standaloneAnchor) {\n this.standaloneAnchor.remove();\n this.standaloneAnchor = null;\n }\n this.panel?.remove();\n this.panel = null;\n this.openColId = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n\n private open(column: Column | null, anchor: HTMLElement): void {\n const api = this.core.getApi();\n const panel = el(\"div\", \"mach-filter-panel mach-column-panel\");\n panel.setAttribute(\"role\", column ? \"menu\" : \"dialog\");\n if (!column) {\n panel.setAttribute(\"aria-modal\", \"false\");\n panel.setAttribute(\"aria-label\", this.core.getLocaleText(\"columnSettings\"));\n }\n\n const title = el(\"div\", \"mach-column-panel-title\");\n title.textContent = column\n ? column.colDef.headerName ?? column.colDef.field ?? column.id\n : this.core.getLocaleText(\"columnSettings\");\n panel.appendChild(title);\n\n if (column && column.sortable) {\n const sortRow = el(\"div\", \"mach-column-panel-actions\");\n const makeSortBtn = (labelKey: \"sortAsc\" | \"sortDesc\" | \"clearSort\", dir: \"asc\" | \"desc\" | null) => {\n const btn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = this.core.getLocaleText(labelKey);\n btn.addEventListener(\"click\", () => {\n api.setSortModel(dir ? [{ colId: column.id, direction: dir }] : []);\n this.close();\n });\n return btn;\n };\n sortRow.append(makeSortBtn(\"sortAsc\", \"asc\"), makeSortBtn(\"sortDesc\", \"desc\"), makeSortBtn(\"clearSort\", null));\n panel.appendChild(sortRow);\n }\n\n const pinRow = el(\"div\", \"mach-column-panel-actions\");\n const makePinBtn = (labelKey: \"pinLeft\" | \"pinRight\" | \"clearPin\", pinned: \"left\" | \"right\" | null) => {\n const btn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = this.core.getLocaleText(labelKey);\n btn.addEventListener(\"click\", () => {\n if (column) api.setColumnPinned(column.id, pinned);\n this.close();\n });\n return btn;\n };\n if (column) {\n pinRow.append(makePinBtn(\"pinLeft\", \"left\"), makePinBtn(\"pinRight\", \"right\"), makePinBtn(\"clearPin\", null));\n panel.appendChild(pinRow);\n }\n\n const toolRow = el(\"div\", \"mach-column-panel-actions\");\n const fitBtn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n fitBtn.type = \"button\";\n fitBtn.textContent = this.core.getLocaleText(\"autoSize\");\n fitBtn.addEventListener(\"click\", () => {\n if (column) api.autoSizeColumn(column.id);\n else api.autoSizeAllColumns();\n this.close();\n });\n const hideBtn = el(\"button\", \"mach-column-panel-btn\") as HTMLButtonElement;\n hideBtn.type = \"button\";\n hideBtn.textContent = this.core.getLocaleText(\"hideColumn\");\n hideBtn.addEventListener(\"click\", () => {\n if (column) api.setColumnVisibility(column.id, false);\n this.close();\n });\n if (column) {\n toolRow.append(fitBtn, hideBtn);\n panel.appendChild(toolRow);\n }\n\n const divider = el(\"div\", \"mach-column-panel-divider\");\n panel.appendChild(divider);\n\n const listTitle = el(\"div\", \"mach-column-panel-subtitle\");\n listTitle.textContent = this.core.getLocaleText(\"columnVisibility\");\n panel.appendChild(listTitle);\n\n if (!column) {\n const search = document.createElement(\"input\");\n search.type = \"search\";\n search.className = \"mach-column-workbench-search\";\n search.placeholder = this.core.getLocaleText(\"search\");\n search.setAttribute(\"aria-label\", this.core.getLocaleText(\"search\"));\n search.value = this.searchText;\n search.addEventListener(\"input\", () => {\n this.searchText = search.value.trim().toLocaleLowerCase();\n this.renderColumnList(list, true);\n });\n panel.appendChild(search);\n }\n\n const list = el(\"div\", \"mach-column-panel-list\");\n this.renderColumnList(list, !column);\n panel.appendChild(list);\n\n const footer = el(\"div\", \"mach-filter-footer\");\n const resetBtn = el(\"button\", \"mach-filter-btn-reset\") as HTMLButtonElement;\n resetBtn.type = \"button\";\n resetBtn.textContent = this.core.getLocaleText(\"resetAll\");\n resetBtn.addEventListener(\"click\", () => {\n api.resetColumnState();\n this.close();\n });\n const allFitBtn = el(\"button\", \"mach-filter-btn-apply\") as HTMLButtonElement;\n allFitBtn.type = \"button\";\n allFitBtn.textContent = this.core.getLocaleText(\"autoSizeAll\");\n allFitBtn.addEventListener(\"click\", () => {\n api.autoSizeAllColumns();\n this.close();\n });\n footer.append(resetBtn, allFitBtn);\n panel.appendChild(footer);\n\n document.body.appendChild(panel);\n this.panel = panel;\n this.openColId = column ? column.id : \"__standalone__\";\n\n const rect = anchor.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, window.innerWidth - panelRect.width - 8);\n let top = rect.bottom + 4;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 4);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n private rebuildListStates(): void {\n if (!this.panel) return;\n const list = this.panel.querySelector<HTMLElement>(\".mach-column-panel-list\");\n if (list) this.renderColumnList(list, this.openColId === \"__standalone__\");\n }\n\n private renderColumnList(list: HTMLElement, workbench: boolean): void {\n const api = this.core.getApi();\n list.replaceChildren();\n const columns = this.core.columnModel.getColumns().filter((candidate) => {\n if (candidate.isDetailToggle) return false;\n if (!workbench || !this.searchText) return true;\n const label = candidate.colDef.headerName ?? candidate.colDef.field ?? candidate.id;\n return `${label} ${candidate.id}`.toLocaleLowerCase().includes(this.searchText);\n });\n for (const col of columns) {\n const row = el(\"div\", workbench ? \"mach-column-workbench-item\" : \"mach-filter-set-item\");\n const label = el(\"label\", \"mach-column-workbench-label\");\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.checked = !col.hide;\n checkbox.disabled = col.hasCheckbox;\n checkbox.addEventListener(\"change\", () => {\n api.setColumnVisibility(col.id, checkbox.checked);\n this.rebuildListStates();\n });\n const text = el(\"span\", \"mach-column-workbench-name\");\n text.textContent = col.colDef.headerName ?? col.colDef.field ?? col.id;\n text.title = `${text.textContent} (${col.id})`;\n label.append(checkbox, text);\n row.appendChild(label);\n\n if (workbench) {\n const pin = document.createElement(\"select\");\n pin.className = \"mach-column-workbench-pin\";\n pin.setAttribute(\"aria-label\", `${text.textContent} ${this.core.getLocaleText(\"clearPin\")}`);\n for (const [value, caption] of [\n [\"\", this.core.getLocaleText(\"clearPin\")],\n [\"left\", this.core.getLocaleText(\"pinLeft\")],\n [\"right\", this.core.getLocaleText(\"pinRight\")]\n ] as const) {\n const option = document.createElement(\"option\");\n option.value = value;\n option.textContent = caption;\n pin.appendChild(option);\n }\n pin.value = col.pinned ?? \"\";\n pin.addEventListener(\"change\", () => {\n api.setColumnPinned(col.id, pin.value === \"left\" || pin.value === \"right\" ? pin.value : null);\n this.rebuildListStates();\n });\n row.appendChild(pin);\n\n const siblings = this.core.columnModel.getColumns().filter((candidate) =>\n !candidate.hide &&\n candidate.parentGroup === col.parentGroup &&\n (col.parentGroup != null || candidate.pinned === col.pinned)\n );\n const position = siblings.indexOf(col);\n const move = (caption: string, next: number, disabled: boolean) => {\n const button = el(\"button\", \"mach-column-workbench-move\") as HTMLButtonElement;\n button.type = \"button\";\n button.textContent = caption;\n button.disabled = disabled || col.hide || !col.movable;\n button.addEventListener(\"click\", () => {\n api.moveColumn(col.id, next);\n this.rebuildListStates();\n });\n return button;\n };\n row.append(move(\"↑\", position - 1, position <= 0), move(\"↓\", position + 1, position < 0 || position >= siblings.length - 1));\n }\n list.appendChild(row);\n }\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport { el, clamp } from \"../lib/dom\";\n\ntype ContextMenuContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"clearRangeValues\"\n | \"columnModel\"\n | \"copyActiveRange\"\n | \"getApi\"\n | \"getCellValue\"\n | \"getLocaleText\"\n | \"options\"\n | \"pasteFromSystemClipboard\"\n | \"reportError\"\n | \"rowModel\"\n>;\n\nexport class ContextMenuService {\n private panel: HTMLElement | null = null;\n\n constructor(private core: ContextMenuContext) {}\n\n open(x: number, y: number, anchor?: { rowIndex: number; colId: string }): void {\n this.close();\n const core = this.core;\n let node: import(\"../types/row\").RowNode<any> | undefined;\n let anchorCol: Column | undefined;\n\n if (anchor) {\n node = core.rowModel.getDisplayedRow(anchor.rowIndex);\n anchorCol = core.columnModel.getColumn(anchor.colId);\n } else {\n const range = core.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return;\n const flat = core.columnModel.getOrderedVisible();\n node = core.rowModel.getDisplayedRow(range.r1);\n anchorCol = flat[range.c1];\n }\n if (!node || !anchorCol) return;\n const anchorIndex = node.rowIndex;\n\n const panel = el(\"div\", \"mach-context-menu\");\n panel.setAttribute(\"role\", \"menu\");\n\n const customGetter = core.options.getContextMenuItems;\n if (customGetter) {\n let items;\n try {\n items = customGetter({\n data: node.data,\n node,\n api: core.getApi(),\n colId: anchorCol.id,\n value: core.getCellValue(node, anchorCol),\n rowIndex: anchorIndex\n });\n } catch (error) {\n core.reportError(error, \"getContextMenuItems\", { colId: anchorCol.id, rowId: node.id });\n return;\n }\n if (items === null || items === undefined) return;\n let hasEnabled = false;\n for (const item of items) {\n if (item.separator) {\n const sep = el(\"div\", \"mach-context-menu-separator\");\n panel.appendChild(sep);\n continue;\n }\n const btn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n btn.type = \"button\";\n btn.textContent = item.label ?? \"\";\n if (item.danger) btn.classList.add(\"mach-context-menu-item--danger\");\n if (item.disabled) {\n btn.disabled = true;\n } else {\n hasEnabled = true;\n btn.addEventListener(\"click\", () => {\n this.close();\n try {\n item.action?.();\n } catch (error) {\n core.reportError(error, \"contextMenu.action\", { colId: anchorCol.id, rowId: node.id });\n }\n });\n }\n panel.appendChild(btn);\n }\n if (!hasEnabled) {\n panel.remove();\n return;\n }\n this.attach(panel, x, y);\n return;\n }\n\n const copyBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n copyBtn.type = \"button\";\n copyBtn.textContent = core.getLocaleText(\"menuCopy\");\n copyBtn.addEventListener(\"click\", () => {\n void core.copyActiveRange();\n this.close();\n });\n panel.appendChild(copyBtn);\n\n if (!core.options.suppressClipboard) {\n const pasteBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n pasteBtn.type = \"button\";\n pasteBtn.textContent = core.getLocaleText(\"menuPaste\");\n pasteBtn.addEventListener(\"click\", () => {\n void core.pasteFromSystemClipboard();\n this.close();\n });\n panel.appendChild(pasteBtn);\n\n const clearBtn = el(\"button\", \"mach-context-menu-item\") as HTMLButtonElement;\n clearBtn.type = \"button\";\n clearBtn.textContent = core.getLocaleText(\"menuClearContents\");\n clearBtn.addEventListener(\"click\", () => {\n const active = core.bodyRenderer.getNormalizedRangeOrFocus();\n if (active) core.clearRangeValues(active);\n this.close();\n });\n panel.appendChild(clearBtn);\n }\n\n this.attach(panel, x, y);\n }\n\n private attach(panel: HTMLElement, x: number, y: number): void {\n document.body.appendChild(panel);\n this.panel = panel;\n const rect = panel.getBoundingClientRect();\n const left = clamp(x, 8, Math.max(8, window.innerWidth - rect.width - 8));\n const top = clamp(y, 8, Math.max(8, window.innerHeight - rect.height - 8));\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n document.addEventListener(\"mousedown\", this.docMouseDown, true);\n document.addEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n close(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n document.removeEventListener(\"mousedown\", this.docMouseDown, true);\n document.removeEventListener(\"keydown\", this.docKeyDown, true);\n }\n\n destroy(): void {\n this.close();\n }\n\n private docMouseDown = (e: MouseEvent): void => {\n if (this.panel && !this.panel.contains(e.target as Node)) this.close();\n };\n\n private docKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") this.close();\n };\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"./column\";\nimport type { TooltipParams } from \"../types/params\";\nimport { el, clamp } from \"../lib/dom\";\nimport { formatCellValue } from \"../render/cellContent\";\n\ntype TooltipContext = Pick<\n GridCore<any>,\n | \"columnModel\"\n | \"getApi\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"reportError\"\n | \"rowModel\"\n | \"skeleton\"\n>;\n\nexport class TooltipService {\n private panel: HTMLElement | null = null;\n private showTimer = 0;\n private hideTimer = 0;\n private currentCell: HTMLElement | null = null;\n\n constructor(private core: TooltipContext) {}\n\n init(): void {\n const body = this.core.skeleton.bodyEl;\n body.addEventListener(\"mouseover\", this.onMouseOver);\n body.addEventListener(\"mouseleave\", this.onBodyLeave);\n }\n\n destroy(): void {\n this.clearTimers();\n this.removePanel();\n const body = this.core.skeleton.bodyEl;\n body.removeEventListener(\"mouseover\", this.onMouseOver);\n body.removeEventListener(\"mouseleave\", this.onBodyLeave);\n this.currentCell = null;\n }\n\n hide(): void {\n this.clearTimers();\n this.removePanel();\n this.currentCell = null;\n }\n\n private clearTimers(): void {\n if (this.showTimer) {\n clearTimeout(this.showTimer);\n this.showTimer = 0;\n }\n if (this.hideTimer) {\n clearTimeout(this.hideTimer);\n this.hideTimer = 0;\n }\n }\n\n private removePanel(): void {\n if (!this.panel) return;\n this.panel.remove();\n this.panel = null;\n }\n\n private onMouseOver = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n if (!this.core.options.tooltipComponent) return;\n const target = e.target as HTMLElement;\n const cell = target.closest<HTMLElement>(\".mach-cell\");\n if (!cell || cell === this.currentCell) return;\n\n this.clearTimers();\n this.removePanel();\n this.currentCell = cell;\n\n const colId = cell.dataset.colId ?? \"\";\n const rowEl = cell.closest<HTMLElement>(\".mach-row\");\n const index = Number(rowEl?.dataset.index);\n const node = Number.isNaN(index) ? undefined : this.core.rowModel.getDisplayedRow(index);\n const column: Column | undefined = colId ? this.core.columnModel.getColumn(colId) : undefined;\n if (!node || !column || node.isDetail || node.isGroup) return;\n if (cell.classList.contains(\"mach-cell--editing\")) return;\n\n const value = this.core.getCellValue(node, column);\n const params: TooltipParams<any> = {\n data: node.data,\n node,\n api: this.core.getApi(),\n colId: column.id,\n value,\n formatted: formatCellValue(this.core, node, column),\n rowIndex: index\n };\n\n const getter = column.colDef.tooltipValueGetter;\n let fallback = params.formatted;\n if (getter) {\n try {\n fallback = getter({ ...params, colDef: column.colDef, column }) ?? params.formatted;\n } catch (error) {\n this.core.reportError(error, \"tooltipValueGetter\", { colId: column.id, rowId: node.id });\n }\n }\n if (!fallback && !column.colDef.tooltipValueGetter) return;\n\n this.showTimer = setTimeout(() => {\n if (this.core.isDestroyed() || this.currentCell !== cell) return;\n this.showPanel(cell, params);\n }, Math.max(0, this.core.options.tooltipShowDelay));\n };\n\n private onBodyLeave = (): void => {\n this.hide();\n };\n\n private showPanel(cell: HTMLElement, params: TooltipParams<any>): void {\n this.removePanel();\n const component = this.core.options.tooltipComponent;\n if (!component) return;\n\n const panel = el(\"div\", \"mach-tooltip\");\n panel.setAttribute(\"role\", \"tooltip\");\n let content: string | HTMLElement;\n try {\n content = component(params);\n } catch (err) {\n this.core.reportError(err, \"tooltipComponent\", { colId: params.colId, rowIndex: params.rowIndex });\n return;\n }\n if (typeof content === \"string\") {\n panel.textContent = content;\n } else {\n panel.appendChild(content);\n }\n\n document.body.appendChild(panel);\n this.panel = panel;\n const rect = cell.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const left = clamp(rect.left, 8, Math.max(8, window.innerWidth - panelRect.width - 8));\n let top = rect.bottom + 6;\n if (top + panelRect.height > window.innerHeight - 8) {\n top = Math.max(8, rect.top - panelRect.height - 6);\n }\n panel.style.left = `${left}px`;\n panel.style.top = `${top}px`;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { WatermarkConfig } from \"../types/options\";\n\ntype WatermarkContext = Pick<GridCore<any>, \"isDestroyed\" | \"options\" | \"skeleton\">;\n\nexport class WatermarkService {\n private overlay: HTMLElement | null = null;\n\n constructor(private core: WatermarkContext) {}\n\n init(): void {\n this.overlay = document.createElement(\"div\");\n this.overlay.className = \"mach-watermark\";\n this.overlay.setAttribute(\"aria-hidden\", \"true\");\n this.overlay.style.pointerEvents = \"none\";\n this.core.skeleton.root.appendChild(this.overlay);\n this.apply();\n }\n\n apply(): void {\n if (!this.overlay || this.core.isDestroyed()) return;\n const config = this.core.options.watermarkEnabled ? this.core.options.watermarkConfig : null;\n if (!config || !config.text) {\n this.overlay.style.display = \"none\";\n this.overlay.style.backgroundImage = \"\";\n return;\n }\n const url = this.buildTile(config);\n this.overlay.style.display = \"\";\n if (url) {\n this.overlay.style.backgroundImage = `url(${url})`;\n this.overlay.style.backgroundColor = \"\";\n } else {\n this.overlay.style.backgroundImage = \"\";\n }\n }\n\n private buildTile(config: WatermarkConfig): string | null {\n try {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n const fontSize = config.fontSize ?? 14;\n const gap = config.gap ?? 160;\n const angle = config.angle ?? -22;\n const color = config.color ?? (this.isDark() ? \"rgba(255,255,255,0.9)\" : \"rgba(31,55,88,0.9)\");\n const opacity = config.opacity ?? 0.06;\n\n ctx.font = `500 ${fontSize}px sans-serif`;\n const metrics = ctx.measureText(config.text);\n const textW = Math.ceil(metrics.width);\n\n const tile = Math.max(gap, textW + 40);\n canvas.width = tile;\n canvas.height = tile;\n\n const ctx2 = canvas.getContext(\"2d\")!;\n ctx2.clearRect(0, 0, tile, tile);\n ctx2.globalAlpha = opacity;\n ctx2.fillStyle = color;\n ctx2.font = `500 ${fontSize}px sans-serif`;\n ctx2.translate(tile / 2, tile / 2);\n ctx2.rotate((angle * Math.PI) / 180);\n ctx2.textAlign = \"center\";\n ctx2.textBaseline = \"middle\";\n ctx2.fillText(config.text, 0, 0);\n\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n }\n }\n\n private isDark(): boolean {\n return this.core.skeleton.root.classList.contains(\"mach-theme-dark\");\n }\n\n refresh(): void {\n this.apply();\n }\n\n destroy(): void {\n this.overlay?.remove();\n this.overlay = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\n\ntype UndoContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"options\"\n | \"rowModel\"\n | \"statusBarService\"\n | \"summaryRenderer\"\n | \"writeValue\"\n>;\n\nexport interface UndoEntry {\n nodeId: string;\n columnId: string;\n oldValue: any;\n newValue: any;\n}\n\nexport class UndoRedoService {\n private stack: UndoEntry[][] = [];\n private pointer = -1;\n private pending: UndoEntry[] | null = null;\n\n constructor(private core: UndoContext) {}\n\n beginBatch(): void {\n if (this.pending) return;\n this.pending = [];\n }\n\n endBatch(): void {\n if (!this.pending) return;\n const batch = this.pending;\n this.pending = null;\n if (batch.length > 0) this.push(batch);\n }\n\n cancelBatch(): void {\n this.pending = null;\n }\n\n record(entry: UndoEntry): void {\n if (this.pending) {\n this.pending.push(entry);\n return;\n }\n this.push([entry]);\n }\n\n private push(batch: UndoEntry[]): void {\n const maxSize = Math.max(0, this.core.options.undoStackSize);\n if (maxSize === 0) return;\n this.stack.length = this.pointer + 1;\n this.stack.push(batch);\n while (this.stack.length > maxSize) this.stack.shift();\n this.pointer = this.stack.length - 1;\n }\n\n trimToSize(): void {\n const maxSize = Math.max(0, this.core.options.undoStackSize);\n if (maxSize === 0) {\n this.clear();\n return;\n }\n while (this.stack.length > maxSize) {\n this.stack.shift();\n this.pointer--;\n }\n if (this.pointer < -1) this.pointer = -1;\n }\n\n canUndo(): boolean {\n return this.pointer >= 0;\n }\n\n canRedo(): boolean {\n return this.pointer < this.stack.length - 1;\n }\n\n undo(): boolean {\n if (!this.canUndo()) return false;\n this.apply(this.stack[this.pointer], false);\n this.pointer--;\n return true;\n }\n\n redo(): boolean {\n if (!this.canRedo()) return false;\n this.pointer++;\n this.apply(this.stack[this.pointer], true);\n return true;\n }\n\n private apply(batch: UndoEntry[], redo: boolean): void {\n const core = this.core;\n const refreshIndexes: number[] = [];\n for (const entry of batch) {\n const node = core.rowModel.getNodeById(entry.nodeId);\n const column = core.columnModel.getColumn(entry.columnId);\n if (!node || !column || node.data == null) continue;\n const value = redo ? entry.newValue : entry.oldValue;\n const replaced = redo ? entry.oldValue : entry.newValue;\n if (core.writeValue(node, column, value, replaced)) {\n core.bodyRenderer.invalidateRowHeight(node);\n core.bodyRenderer.queueFlash([node.rowIndex], [column.id]);\n if (node.rowIndex >= 0) refreshIndexes.push(node.rowIndex);\n core.emit(\"cellValueChanged\", {\n oldValue: replaced,\n newValue: value,\n rowNode: node,\n rowIndex: node.rowIndex,\n column,\n colDef: column.colDef,\n data: node.data\n });\n }\n }\n if (refreshIndexes.length > 0) core.bodyRenderer.refreshRows(refreshIndexes);\n core.summaryRenderer.refresh();\n core.statusBarService.refresh();\n }\n\n clear(): void {\n this.stack = [];\n this.pointer = -1;\n this.pending = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { GridChange } from \"../types/api\";\nimport type { CellValueChangedEvent } from \"../types/events\";\n\ntype ChangeTrackingContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"emit\"\n | \"eventBus\"\n | \"getCellValue\"\n | \"rowModel\"\n | \"statusBarService\"\n | \"summaryRenderer\"\n | \"writeValue\"\n>;\n\ninterface CellChange {\n rowId: string;\n colId: string;\n originalValue: unknown;\n value: unknown;\n}\n\nexport class ChangeTrackingService<TData = any> {\n private changes = new Map<string, CellChange>();\n private rollingBack = false;\n private unsubscribe: (() => void) | null = null;\n\n constructor(private core: ChangeTrackingContext) {}\n\n init(): void {\n this.unsubscribe = this.core.eventBus.on(\"cellValueChanged\", (event) => {\n if (!this.rollingBack) this.record(event as CellValueChangedEvent<TData>);\n });\n }\n\n private record(event: CellValueChangedEvent<TData>): void {\n const key = `${event.rowNode.id}\\u0000${event.column.id}`;\n const existing = this.changes.get(key);\n const originalValue = existing?.originalValue ?? event.oldValue;\n if (Object.is(event.newValue, originalValue)) this.changes.delete(key);\n else {\n this.changes.set(key, {\n rowId: event.rowNode.id,\n colId: event.column.id,\n originalValue,\n value: event.newValue\n });\n }\n this.emitChanged();\n }\n\n getDirtyRowIds(): string[] {\n return [...new Set([...this.changes.values()].map((change) => change.rowId))];\n }\n\n getChanges(): GridChange<TData>[] {\n const byRow = new Map<string, GridChange<TData>>();\n for (const change of this.changes.values()) {\n const node = this.core.rowModel.getNodeById(change.rowId);\n if (!node?.data) continue;\n let row = byRow.get(change.rowId);\n if (!row) {\n row = { rowId: change.rowId, data: node.data, cells: [] };\n byRow.set(change.rowId, row);\n }\n row.cells.push({\n colId: change.colId,\n originalValue: change.originalValue,\n value: change.value\n });\n }\n return [...byRow.values()];\n }\n\n markSaved(rowIds?: readonly string[]): void {\n if (!rowIds) this.changes.clear();\n else {\n const ids = new Set(rowIds);\n for (const [key, change] of this.changes) {\n if (ids.has(change.rowId)) this.changes.delete(key);\n }\n }\n this.emitChanged();\n }\n\n acknowledge(saved: readonly GridChange<TData>[]): void {\n for (const row of saved) {\n for (const cell of row.cells) {\n const key = `${row.rowId}\\u0000${cell.colId}`;\n const current = this.changes.get(key);\n if (current) {\n if (Object.is(current.value, cell.value)) this.changes.delete(key);\n else current.originalValue = cell.value;\n continue;\n }\n const node = this.core.rowModel.getNodeById(row.rowId);\n const column = this.core.columnModel.getColumn(cell.colId);\n if (!node || !column || node.data == null) continue;\n const value = this.core.getCellValue(node, column);\n if (!Object.is(value, cell.value)) {\n this.changes.set(key, {\n rowId: row.rowId,\n colId: cell.colId,\n originalValue: cell.value,\n value\n });\n }\n }\n }\n this.emitChanged();\n }\n\n rollback(rowIds?: readonly string[]): boolean {\n const ids = rowIds ? new Set(rowIds) : null;\n const targets = [...this.changes.entries()].filter(([, change]) => !ids || ids.has(change.rowId));\n if (targets.length === 0) return false;\n const refresh = new Set<number>();\n const completed = new Set<string>();\n this.rollingBack = true;\n try {\n for (const [key, change] of targets) {\n const node = this.core.rowModel.getNodeById(change.rowId);\n const column = this.core.columnModel.getColumn(change.colId);\n if (!node || !column || node.data == null) continue;\n const current = this.core.getCellValue(node, column);\n if (Object.is(current, change.originalValue)) {\n completed.add(key);\n continue;\n }\n if (!this.core.writeValue(node, column, change.originalValue, current)) continue;\n completed.add(key);\n this.core.bodyRenderer.invalidateRowHeight(node);\n if (node.rowIndex >= 0) refresh.add(node.rowIndex);\n this.core.emit(\"cellValueChanged\", {\n oldValue: current,\n newValue: change.originalValue,\n rowNode: node,\n rowIndex: node.rowIndex,\n column,\n colDef: column.colDef,\n data: node.data\n });\n }\n } finally {\n this.rollingBack = false;\n }\n for (const key of completed) this.changes.delete(key);\n if (refresh.size > 0) this.core.bodyRenderer.refreshRows([...refresh]);\n this.core.summaryRenderer.refresh();\n this.core.statusBarService.refresh();\n this.emitChanged();\n return completed.size > 0;\n }\n\n clearRows(rowIds: readonly string[]): void {\n if (rowIds.length === 0) return;\n const ids = new Set(rowIds);\n for (const [key, change] of this.changes) {\n if (ids.has(change.rowId)) this.changes.delete(key);\n }\n this.emitChanged();\n }\n\n clear(): void {\n if (this.changes.size === 0) return;\n this.changes.clear();\n this.emitChanged();\n }\n\n destroy(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.changes.clear();\n }\n\n private emitChanged(): void {\n this.core.emit(\"dirtyStateChanged\", { dirtyRowIds: this.getDirtyRowIds() });\n }\n}\n","import type { GridPerformanceSnapshot } from \"../types/api\";\n\ninterface RenderSample {\n duration: number;\n rows: number;\n columns: number;\n}\n\nconst MAX_SAMPLES = 120;\nconst LONG_FRAME_MS = 16.7;\n\nfunction now(): number {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nexport class PerformanceMonitor {\n private samples: RenderSample[] = [];\n\n start(): number { return now(); }\n\n recordRender(startedAt: number, rows: number, columns: number): void {\n this.samples.push({ duration: Math.max(0, now() - startedAt), rows, columns });\n if (this.samples.length > MAX_SAMPLES) this.samples.shift();\n }\n\n snapshot(): GridPerformanceSnapshot {\n const durations = this.samples.map((sample) => sample.duration);\n const last = this.samples[this.samples.length - 1];\n const sorted = [...durations].sort((left, right) => left - right);\n const percentileIndex = Math.max(0, Math.ceil(sorted.length * 0.95) - 1);\n return {\n sampleCount: durations.length,\n lastRenderMs: last?.duration ?? 0,\n averageRenderMs: durations.length > 0\n ? durations.reduce((total, duration) => total + duration, 0) / durations.length\n : 0,\n maxRenderMs: sorted[sorted.length - 1] ?? 0,\n p95RenderMs: sorted[percentileIndex] ?? 0,\n longRenderCount: durations.filter((duration) => duration > LONG_FRAME_MS).length,\n renderedRows: last?.rows ?? 0,\n renderedColumns: last?.columns ?? 0,\n renderedCells: (last?.rows ?? 0) * (last?.columns ?? 0)\n };\n }\n\n reset(): void { this.samples = []; }\n}\n","import type { ColDef } from \"./colDef\";\nimport type { FilterModel, SortModel } from \"./colDef\";\nimport type { AdvancedFilterModel } from \"./advancedFilter\";\nimport type { RowNode } from \"./row\";\nimport type { GridApi } from \"./api\";\nimport type { Column } from \"../services/column\";\n\nexport const EVENT_TYPES = [\n \"gridReady\",\n \"gridDestroyed\",\n \"modelUpdated\",\n \"cellClicked\",\n \"cellDoubleClicked\",\n \"cellContextMenu\",\n \"rowClicked\",\n \"rowDoubleClicked\",\n \"selectionChanged\",\n \"sortChanged\",\n \"filterChanged\",\n \"columnResized\",\n \"columnMoved\",\n \"columnVisibilityChanged\",\n \"cellValueChanged\",\n \"cellEditingStarted\",\n \"cellEditingStopped\",\n \"rowEditingStarted\",\n \"rowEditingStopped\",\n \"detailToggled\",\n \"treeChildrenLoaded\",\n \"treeChildrenLoadFailed\",\n \"rowDragEnd\",\n \"rangeSelectionChanged\",\n \"paginationChanged\",\n \"displayedColumnsChanged\",\n \"gridError\",\n \"dirtyStateChanged\"\n] as const;\n\nexport type GridEventType = (typeof EVENT_TYPES)[number];\n\nexport type GridErrorCode =\n | \"DATA_SOURCE_ERROR\"\n | \"DATA_INTEGRITY_ERROR\"\n | \"VALIDATION_ERROR\"\n | \"RENDERER_ERROR\"\n | \"EDITOR_ERROR\"\n | \"FEATURE_ERROR\"\n | \"STATE_ERROR\"\n | \"EVENT_HANDLER_ERROR\"\n | \"GRID_ERROR\";\n\nexport interface GridEventBase<TData = any> {\n type: GridEventType;\n api: GridApi<TData>;\n}\n\nexport interface GridReadyEvent<TData = any> extends GridEventBase<TData> {\n type: \"gridReady\";\n}\n\nexport interface GridDestroyedEvent<TData = any> extends GridEventBase<TData> {\n type: \"gridDestroyed\";\n}\n\nexport interface ModelUpdatedEvent<TData = any> extends GridEventBase<TData> {\n type: \"modelUpdated\";\n rowCount: number;\n}\n\nexport interface CellClickEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface CellDoubleClickEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellDoubleClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface CellContextMenuEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellContextMenu\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n value: TValue;\n}\n\nexport interface RowClickEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowClicked\" | \"rowDoubleClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n}\n\nexport interface SelectionChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"selectionChanged\";\n selectedNodes: RowNode<TData>[];\n selectedRows: TData[];\n}\n\nexport interface SortChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"sortChanged\";\n sortModel: SortModel;\n}\n\nexport interface FilterChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"filterChanged\";\n filterModel: FilterModel;\n advancedFilterModel: AdvancedFilterModel | null;\n}\n\nexport interface ColumnResizedEvent<TData = any> extends GridEventBase<TData> {\n type: \"columnResized\";\n colId: string;\n width: number;\n finished: boolean;\n}\n\nexport interface ColumnMovedEvent<TData = any> extends GridEventBase<TData> {\n type: \"columnMoved\";\n colId: string;\n toIndex: number;\n}\n\nexport interface ColumnVisibilityChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"columnVisibilityChanged\";\n colId: string;\n visible: boolean;\n}\n\nexport interface CellValueChangedEvent<TData = any, TValue = any> extends GridEventBase<TData> {\n type: \"cellValueChanged\";\n oldValue: TValue;\n newValue: TValue;\n rowNode: RowNode<TData>;\n rowIndex: number;\n column: Column<TData>;\n colDef: ColDef<TData, TValue>;\n data: TData;\n}\n\nexport interface CellEditingStartedEvent<TData = any> extends GridEventBase<TData> {\n type: \"cellEditingStarted\";\n rowIndex: number;\n colId: string;\n rowNode: RowNode<TData>;\n}\n\nexport interface CellEditingStoppedEvent<TData = any> extends GridEventBase<TData> {\n type: \"cellEditingStopped\";\n rowIndex: number;\n colId: string;\n rowNode: RowNode<TData>;\n oldValue: any;\n newValue: any;\n}\n\nexport interface RowEditChange {\n colId: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport interface RowEditingStartedEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowEditingStarted\";\n rowIndex: number;\n rowNode: RowNode<TData>;\n data: TData;\n}\n\nexport interface RowEditingStoppedEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowEditingStopped\";\n rowIndex: number;\n rowNode: RowNode<TData>;\n data: TData;\n cancelled: boolean;\n changes: RowEditChange[];\n}\n\nexport interface DetailToggledEvent<TData = any> extends GridEventBase<TData> {\n type: \"detailToggled\";\n rowId: string;\n rowNode: RowNode<TData>;\n expanded: boolean;\n}\n\nexport interface TreeChildrenLoadedEvent<TData = any> extends GridEventBase<TData> {\n type: \"treeChildrenLoaded\";\n rowId: string;\n rowNode: RowNode<TData>;\n children: readonly TData[];\n}\n\nexport interface TreeChildrenLoadFailedEvent<TData = any> extends GridEventBase<TData> {\n type: \"treeChildrenLoadFailed\";\n rowId: string;\n rowNode: RowNode<TData>;\n error: unknown;\n}\n\nexport interface GridCellRange {\n row1: number;\n row2: number;\n colId1: string;\n colId2: string;\n}\n\nexport interface RangeSelectionChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"rangeSelectionChanged\";\n range: GridCellRange | null;\n}\n\nexport interface RowDragEndEvent<TData = any> extends GridEventBase<TData> {\n type: \"rowDragEnd\";\n rowNode: RowNode<TData>;\n fromIndex: number;\n toIndex: number;\n}\n\nexport interface PaginationChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"paginationChanged\";\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface DisplayedColumnsChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"displayedColumnsChanged\";\n}\n\nexport interface GridErrorEvent<TData = any> extends GridEventBase<TData> {\n type: \"gridError\";\n code: GridErrorCode;\n error: unknown;\n source: string;\n context?: Record<string, unknown>;\n}\n\nexport interface DirtyStateChangedEvent<TData = any> extends GridEventBase<TData> {\n type: \"dirtyStateChanged\";\n dirtyRowIds: string[];\n}\n\nexport interface GridEventMap<TData = any> {\n gridReady: GridReadyEvent<TData>;\n gridDestroyed: GridDestroyedEvent<TData>;\n modelUpdated: ModelUpdatedEvent<TData>;\n cellClicked: CellClickEvent<TData>;\n cellDoubleClicked: CellDoubleClickEvent<TData>;\n cellContextMenu: CellContextMenuEvent<TData>;\n rowClicked: RowClickEvent<TData>;\n rowDoubleClicked: RowClickEvent<TData>;\n selectionChanged: SelectionChangedEvent<TData>;\n sortChanged: SortChangedEvent<TData>;\n filterChanged: FilterChangedEvent<TData>;\n columnResized: ColumnResizedEvent<TData>;\n columnMoved: ColumnMovedEvent<TData>;\n columnVisibilityChanged: ColumnVisibilityChangedEvent<TData>;\n cellValueChanged: CellValueChangedEvent<TData>;\n cellEditingStarted: CellEditingStartedEvent<TData>;\n cellEditingStopped: CellEditingStoppedEvent<TData>;\n rowEditingStarted: RowEditingStartedEvent<TData>;\n rowEditingStopped: RowEditingStoppedEvent<TData>;\n detailToggled: DetailToggledEvent<TData>;\n treeChildrenLoaded: TreeChildrenLoadedEvent<TData>;\n treeChildrenLoadFailed: TreeChildrenLoadFailedEvent<TData>;\n rowDragEnd: RowDragEndEvent<TData>;\n rangeSelectionChanged: RangeSelectionChangedEvent<TData>;\n paginationChanged: PaginationChangedEvent<TData>;\n displayedColumnsChanged: DisplayedColumnsChangedEvent<TData>;\n gridError: GridErrorEvent<TData>;\n dirtyStateChanged: DirtyStateChangedEvent<TData>;\n}\n\nexport type GridEventHandler<K extends GridEventType, TData = any> = (event: GridEventMap<TData>[K]) => void;\n\nexport type EventHandlerName<K extends GridEventType> = `on${Capitalize<K>}`;\n","export function escapeHtml(value: any): string {\n const s = value == null ? \"\" : String(value);\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nexport function downloadFile(filename: string, content: string, mime = \"text/plain;charset=utf-8\"): boolean {\n try {\n if (typeof document === \"undefined\" || typeof Blob === \"undefined\") return false;\n const a = document.createElement(\"a\");\n if (typeof URL !== \"undefined\" && typeof URL.createObjectURL === \"function\") {\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n a.href = url;\n a.download = filename;\n a.click();\n const revoke = typeof URL.revokeObjectURL === \"function\" ? URL.revokeObjectURL.bind(URL) : null;\n if (revoke) setTimeout(() => {\n try {\n revoke(url);\n } catch {\n void 0;\n }\n }, 0);\n } else {\n a.href = `data:${mime},${encodeURIComponent(content)}`;\n a.download = filename;\n a.click();\n }\n return true;\n } catch {\n return false;\n }\n}\n","import type { GridOptions } from \"../types/options\";\nimport type { GridEventType } from \"../types/events\";\n\nexport type GridOptionValueKind =\n | \"array\"\n | \"boolean\"\n | \"boolean-object\"\n | \"function\"\n | \"number\"\n | \"object\"\n | \"string\"\n | \"unknown\";\n\nexport type GridOptionUpdateMode = \"columnDefs\" | \"options\" | \"quickFilter\" | \"rowData\";\n\nexport interface GridOptionMetadata {\n /** Runtime value category used by framework adapters. */\n kind: GridOptionValueKind;\n /** How a changed framework prop is forwarded to GridApi. */\n update: GridOptionUpdateMode;\n}\n\ntype EventOptionKey = `on${Capitalize<GridEventType>}`;\nexport type GridOptionKey = Exclude<keyof GridOptions<any>, EventOptionKey>;\n\n/**\n * Runtime single source of truth for every non-event GridOptions property.\n *\n * The mapped `satisfies` type intentionally makes adding a GridOptions field a\n * compile error until its adapter/update behavior is declared here.\n */\nexport const GRID_OPTION_META = {\n columnDefs: { kind: \"array\", update: \"columnDefs\" },\n rowData: { kind: \"array\", update: \"rowData\" },\n defaultColDef: { kind: \"object\", update: \"options\" },\n columnTypes: { kind: \"object\", update: \"options\" },\n getRowId: { kind: \"function\", update: \"options\" },\n rowKey: { kind: \"unknown\", update: \"options\" },\n rowHeight: { kind: \"number\", update: \"options\" },\n headerHeight: { kind: \"number\", update: \"options\" },\n rowBuffer: { kind: \"number\", update: \"options\" },\n columnLayout: { kind: \"string\", update: \"options\" },\n enableColumnResize: { kind: \"boolean\", update: \"options\" },\n domLayout: { kind: \"string\", update: \"options\" },\n rowSelection: { kind: \"string\", update: \"options\" },\n multiSort: { kind: \"boolean\", update: \"options\" },\n size: { kind: \"string\", update: \"options\" },\n stripedRows: { kind: \"boolean\", update: \"options\" },\n showCellBorders: { kind: \"boolean\", update: \"options\" },\n theme: { kind: \"string\", update: \"options\" },\n quickFilterText: { kind: \"string\", update: \"quickFilter\" },\n advancedFilterModel: { kind: \"object\", update: \"options\" },\n masterDetail: { kind: \"boolean\", update: \"options\" },\n detailRowHeight: { kind: \"number\", update: \"options\" },\n detailRowRenderer: { kind: \"function\", update: \"options\" },\n isRowExpandable: { kind: \"function\", update: \"options\" },\n detailToggleColumn: { kind: \"boolean\", update: \"options\" },\n columnMenu: { kind: \"boolean\", update: \"options\" },\n columnStateKey: { kind: \"string\", update: \"options\" },\n columnStateStore: { kind: \"object\", update: \"options\" },\n aggFuncs: { kind: \"object\", update: \"options\" },\n components: { kind: \"object\", update: \"options\" },\n actionPolicy: { kind: \"object\", update: \"options\" },\n features: { kind: \"array\", update: \"options\" },\n initialState: { kind: \"object\", update: \"options\" },\n stateKey: { kind: \"string\", update: \"options\" },\n stateStore: { kind: \"object\", update: \"options\" },\n stateSaveDebounceMs: { kind: \"number\", update: \"options\" },\n locale: { kind: \"object\", update: \"options\" },\n editType: { kind: \"string\", update: \"options\" },\n editableIndicator: { kind: \"string\", update: \"options\" },\n rowEditValidator: { kind: \"function\", update: \"options\" },\n singleClickEdit: { kind: \"boolean\", update: \"options\" },\n manualSorting: { kind: \"boolean\", update: \"options\" },\n manualFiltering: { kind: \"boolean\", update: \"options\" },\n showSummary: { kind: \"boolean\", update: \"options\" },\n summaryMethod: { kind: \"function\", update: \"options\" },\n treeData: { kind: \"boolean\", update: \"options\" },\n childrenKey: { kind: \"string\", update: \"options\" },\n isTreeRowExpandable: { kind: \"function\", update: \"options\" },\n loadTreeChildren: { kind: \"function\", update: \"options\" },\n autoCheckedChildren: { kind: \"boolean\", update: \"options\" },\n defaultExpandAll: { kind: \"boolean\", update: \"options\" },\n indexOffset: { kind: \"number\", update: \"options\" },\n applyRowDrag: { kind: \"boolean\", update: \"options\" },\n undoStackSize: { kind: \"number\", update: \"options\" },\n asyncTransactionWaitMillis: { kind: \"number\", update: \"options\" },\n getRowHeight: { kind: \"function\", update: \"options\" },\n pinnedTopRowData: { kind: \"array\", update: \"options\" },\n pinnedBottomRowData: { kind: \"array\", update: \"options\" },\n pagination: { kind: \"boolean-object\", update: \"options\" },\n watermark: { kind: \"boolean-object\", update: \"options\" },\n suppressWarnings: { kind: \"boolean\", update: \"options\" },\n enableRangeSelection: { kind: \"boolean\", update: \"options\" },\n suppressClipboard: { kind: \"boolean\", update: \"options\" },\n contextMenu: { kind: \"boolean\", update: \"options\" },\n getContextMenuItems: { kind: \"function\", update: \"options\" },\n tooltipComponent: { kind: \"function\", update: \"options\" },\n tooltipShowDelay: { kind: \"number\", update: \"options\" },\n flashCells: { kind: \"boolean\", update: \"options\" },\n fillHandle: { kind: \"boolean\", update: \"options\" },\n statusBar: { kind: \"boolean-object\", update: \"options\" },\n datasource: { kind: \"object\", update: \"options\" },\n blockSize: { kind: \"number\", update: \"options\" },\n infiniteBufferRows: { kind: \"number\", update: \"options\" },\n datasourceRetryCount: { kind: \"number\", update: \"options\" },\n datasourceRetryDelay: { kind: \"number\", update: \"options\" },\n suppressCellFocus: { kind: \"boolean\", update: \"options\" },\n suppressRowHoverHighlight: { kind: \"boolean\", update: \"options\" },\n suppressNoRowsOverlay: { kind: \"boolean\", update: \"options\" },\n suppressHeaderFocus: { kind: \"boolean\", update: \"options\" },\n ariaLabel: { kind: \"string\", update: \"options\" },\n ariaLabelledBy: { kind: \"string\", update: \"options\" },\n ariaDescribedBy: { kind: \"string\", update: \"options\" },\n loading: { kind: \"boolean\", update: \"options\" },\n error: { kind: \"unknown\", update: \"options\" },\n overlayNoRowsTemplate: { kind: \"unknown\", update: \"options\" },\n overlayLoadingTemplate: { kind: \"unknown\", update: \"options\" },\n overlayErrorTemplate: { kind: \"unknown\", update: \"options\" },\n allowUnsafeOverlayHtml: { kind: \"boolean\", update: \"options\" },\n className: { kind: \"string\", update: \"options\" }\n} as const satisfies { [K in GridOptionKey]: GridOptionMetadata };\n\nexport const GRID_OPTION_KEYS = Object.freeze(Object.keys(GRID_OPTION_META) as GridOptionKey[]);\n\nexport const DIRECT_GRID_OPTION_KEYS = Object.freeze(\n GRID_OPTION_KEYS.filter((key) => GRID_OPTION_META[key].update === \"options\")\n);\n","import { EVENT_TYPES } from \"../types/events\";\nimport type { GridOptions } from \"../types/options\";\nimport {\n GRID_OPTION_META,\n type GridOptionKey,\n type GridOptionValueKind\n} from \"./gridOptionMetadata\";\n\nconst EVENT_OPTION_KEYS = new Set(\n EVENT_TYPES.map((type) => `on${type.charAt(0).toUpperCase()}${type.slice(1)}`)\n);\n\nexport function matchesGridOptionKind(value: unknown, kind: GridOptionValueKind): boolean {\n if (value == null || kind === \"unknown\") return true;\n if (kind === \"array\") return Array.isArray(value);\n if (kind === \"boolean-object\") {\n return typeof value === \"boolean\" || (typeof value === \"object\" && !Array.isArray(value));\n }\n if (kind === \"object\") return typeof value === \"object\" && !Array.isArray(value);\n if (kind === \"number\") return typeof value === \"number\" && Number.isFinite(value);\n return typeof value === kind;\n}\n\n/**\n * Drops unknown and runtime-invalid options before they can partially mutate a grid.\n * Validation still reports the original patch, while this function guarantees that\n * JavaScript/JSON callers receive the same safety boundary as TypeScript callers.\n */\nexport function sanitizeGridOptionPatch<TData>(\n input: Partial<GridOptions<TData>> | Record<string, unknown>\n): Partial<GridOptions<TData>> {\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input)) {\n if (EVENT_OPTION_KEYS.has(key)) {\n if (value == null || typeof value === \"function\") output[key] = value;\n continue;\n }\n const metadata = GRID_OPTION_META[key as GridOptionKey];\n if (!metadata || !matchesGridOptionKind(value, metadata.kind)) continue;\n output[key] = value;\n }\n return output;\n}\n","import type { ColumnState, SortModel } from \"../types/colDef\";\nimport type { GridState, GridStateInput } from \"../types/state\";\nimport { normalizeAdvancedFilterModel, normalizeFilterModel } from \"./advancedFilter\";\n\nconst MAX_COLUMNS = 2_000;\nconst MAX_ROW_IDS = 100_000;\nconst MAX_ID_LENGTH = 512;\nconst MAX_QUICK_FILTER_LENGTH = 10_000;\n\nfunction stringIds(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return [...new Set(value.slice(0, MAX_ROW_IDS).filter((entry): entry is string =>\n typeof entry === \"string\" && entry.length > 0 && entry.length <= MAX_ID_LENGTH\n ))];\n}\n\nfunction positiveInteger(value: unknown, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 1\n ? Math.floor(value)\n : fallback;\n}\n\nfunction positiveNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : undefined;\n}\n\nfunction addColumnSizing(state: ColumnState, source: Record<string, unknown>): void {\n const width = positiveNumber(source.width);\n const flex = positiveNumber(source.flex);\n if (width !== undefined) state.width = width;\n if (source.flex === null) state.flex = null;\n else if (flex !== undefined) state.flex = flex;\n if (source.widthMode === \"auto\" || source.widthMode === \"manual\") state.widthMode = source.widthMode;\n}\n\nfunction addColumnLayout(state: ColumnState, source: Record<string, unknown>): void {\n if (typeof source.hide === \"boolean\") state.hide = source.hide;\n if (source.pinned === null || source.pinned === \"left\" || source.pinned === \"right\") state.pinned = source.pinned;\n}\n\nfunction addColumnSort(state: ColumnState, source: Record<string, unknown>): void {\n if (source.sort === null || source.sort === \"asc\" || source.sort === \"desc\") state.sort = source.sort;\n if (source.sortIndex === null) state.sortIndex = null;\n else if (typeof source.sortIndex === \"number\" && Number.isInteger(source.sortIndex) && source.sortIndex >= 0) {\n state.sortIndex = source.sortIndex;\n }\n}\n\nfunction normalizeColumnEntry(input: unknown, seen: Set<string>): ColumnState | null {\n if (input == null || typeof input !== \"object\") return null;\n const source = input as Record<string, unknown>;\n const colId = typeof source.colId === \"string\" ? source.colId.trim() : \"\";\n if (!colId || colId.length > MAX_ID_LENGTH || seen.has(colId)) return null;\n seen.add(colId);\n const state: ColumnState = { colId };\n addColumnLayout(state, source);\n addColumnSizing(state, source);\n addColumnSort(state, source);\n return state;\n}\n\nfunction normalizeColumns(value: unknown): ColumnState[] {\n if (!Array.isArray(value)) return [];\n const output: ColumnState[] = [];\n const seen = new Set<string>();\n for (const input of value.slice(0, MAX_COLUMNS)) {\n const state = normalizeColumnEntry(input, seen);\n if (state) output.push(state);\n }\n return output;\n}\n\nfunction normalizeSortModel(value: unknown): SortModel {\n if (!Array.isArray(value)) return [];\n const output: SortModel = [];\n const seen = new Set<string>();\n for (const input of value.slice(0, MAX_COLUMNS)) {\n if (input == null || typeof input !== \"object\") continue;\n const source = input as Record<string, unknown>;\n const colId = typeof source.colId === \"string\" ? source.colId.trim() : \"\";\n if (!colId || colId.length > MAX_ID_LENGTH || seen.has(colId)) continue;\n if (source.direction !== \"asc\" && source.direction !== \"desc\") continue;\n seen.add(colId);\n output.push({ colId, direction: source.direction });\n }\n return output;\n}\n\n/** Migrates and bounds persisted state before it mutates a live grid. */\nexport function migrateGridState(input: unknown): GridState | null {\n if (input == null || typeof input !== \"object\") return null;\n const state = input as Partial<GridStateInput> & Record<string, unknown>;\n if (state.version !== 1 && state.version !== 2) return null;\n if (!Array.isArray(state.columns) || !Array.isArray(state.sortModel)) return null;\n const pagination = state.pagination != null && typeof state.pagination === \"object\"\n ? state.pagination as Record<string, unknown>\n : {};\n return {\n version: 2,\n columns: normalizeColumns(state.columns),\n sortModel: normalizeSortModel(state.sortModel),\n filterModel: normalizeFilterModel(state.filterModel),\n advancedFilterModel: state.version === 2\n ? normalizeAdvancedFilterModel(state.advancedFilterModel)\n : null,\n quickFilterText: typeof state.quickFilterText === \"string\" && state.quickFilterText.trim()\n ? state.quickFilterText.slice(0, MAX_QUICK_FILTER_LENGTH)\n : null,\n pagination: {\n enabled: pagination.enabled === true,\n page: positiveInteger(pagination.page, 1),\n pageSize: positiveInteger(pagination.pageSize, 20)\n },\n selectedRowIds: stringIds(state.selectedRowIds),\n expandedRowIds: stringIds(state.expandedRowIds),\n expandedGroupIds: stringIds(state.expandedGroupIds)\n };\n}\n","import type {\n GridBatchSaveResult,\n GridChange,\n SaveChangeConflict,\n SaveChangeIssue,\n SaveChangesResult\n} from \"../types/api\";\nimport type { GridApi } from \"../types/api\";\n\nfunction cloneSnapshotData<T>(data: T): T {\n try { if (typeof structuredClone === \"function\") return structuredClone(data); }\n catch { /* rows with platform values use a shallow snapshot */ }\n if (Array.isArray(data)) return [...data] as T;\n if (data != null && typeof data === \"object\") return { ...data };\n return data;\n}\n\nexport function createSaveSnapshot<TData>(\n changes: readonly GridChange<TData>[],\n rowIds?: readonly string[]\n): GridChange<TData>[] {\n const ids = rowIds ? new Set(rowIds.map(String)) : null;\n return changes.filter((change) => !ids || ids.has(change.rowId)).map((change) => ({\n ...change,\n data: cloneSnapshotData(change.data),\n cells: change.cells.map((cell) => ({ ...cell }))\n }));\n}\n\nfunction normalizeIssue<T extends SaveChangeIssue>(issue: T, submittedIds: ReadonlySet<string>): T | null {\n const rowId = typeof issue?.rowId === \"string\" ? issue.rowId : \"\";\n if (!submittedIds.has(rowId) || typeof issue.message !== \"string\" || !issue.message.trim()) return null;\n return {\n ...issue,\n rowId,\n message: issue.message.trim(),\n ...(typeof issue.code === \"string\" && issue.code.trim() ? { code: issue.code.trim() } : {}),\n ...(Array.isArray(issue.colIds)\n ? { colIds: [...new Set(issue.colIds.filter((id): id is string => typeof id === \"string\" && id.length > 0))] }\n : {})\n };\n}\n\nfunction uniqueIssues<T extends SaveChangeIssue>(\n input: readonly T[] | undefined,\n submittedIds: ReadonlySet<string>\n): T[] {\n const byRow = new Map<string, T>();\n for (const issue of input ?? []) {\n const normalized = normalizeIssue(issue, submittedIds);\n if (normalized && !byRow.has(normalized.rowId)) byRow.set(normalized.rowId, normalized);\n }\n return [...byRow.values()];\n}\n\nexport function normalizeBatchSaveResult<TData>(\n submitted: GridChange<TData>[],\n response: void | SaveChangesResult<TData>\n): GridBatchSaveResult<TData> {\n const submittedIds = new Set(submitted.map((change) => change.rowId));\n const conflicts = uniqueIssues<SaveChangeConflict<TData>>(response?.conflicts, submittedIds);\n const conflictIds = new Set(conflicts.map((conflict) => conflict.rowId));\n const failures = uniqueIssues(response?.failures, submittedIds)\n .filter((failure) => !conflictIds.has(failure.rowId));\n const blocked = new Set([...failures, ...conflicts].map((issue) => issue.rowId));\n const explicitlySaved = response?.savedRowIds == null\n ? null\n : new Set(response.savedRowIds.map(String).filter((id) => submittedIds.has(id)));\n const saved = submitted.filter((change) =>\n !blocked.has(change.rowId) && (explicitlySaved == null || explicitlySaved.has(change.rowId))\n );\n return { submitted, saved, failures, conflicts };\n}\n\nfunction conflictUpdateData<TData>(\n api: GridApi<TData>,\n conflict: SaveChangeConflict<TData>\n): { data: TData; mergeIntoCurrent: boolean } | null {\n if (conflict.serverData === undefined) return null;\n const node = api.getNodeById(conflict.rowId);\n if (!node || node.data == null) return null;\n const getRowId = api.getGridOption(\"getRowId\");\n if (getRowId) {\n try {\n const id = getRowId({ data: conflict.serverData, index: node.rowIndex, api });\n return id === conflict.rowId ? { data: conflict.serverData, mergeIntoCurrent: false } : null;\n } catch {\n return null;\n }\n }\n const current = node.data;\n const mergeable = current != null && conflict.serverData != null &&\n typeof current === \"object\" && typeof conflict.serverData === \"object\";\n return mergeable ? { data: current, mergeIntoCurrent: true } : null;\n}\n\nexport function resolveSaveConflict<TData>(\n api: GridApi<TData>,\n conflict: SaveChangeConflict<TData>,\n strategy: \"acceptServer\" | \"keepLocal\"\n): boolean {\n if (api.isDestroyed()) return false;\n if (strategy === \"keepLocal\") return true;\n const update = conflictUpdateData(api, conflict);\n if (!update) return false;\n api.rollbackChanges([conflict.rowId]);\n if (update.mergeIntoCurrent) Object.assign(update.data as object, conflict.serverData as object);\n api.applyTransaction({ update: [update.data] });\n api.markChangesSaved([conflict.rowId]);\n return true;\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { CsvExportParams, ImportCsvOptions, RowTransaction } from \"../types/api\";\nimport type { GridApi } from \"../types/api\";\nimport type { GridOptions } from \"../types/options\";\nimport type { ApplyGridStateOptions, GridState, GridStateInput, GridStateSection } from \"../types/state\";\nimport type { AdvancedFilterModel } from \"../types/advancedFilter\";\nimport type { Column } from \"./column\";\nimport { EVENT_TYPES } from \"../types/events\";\nimport type { ColDefOrGroup, ColumnState, FilterModel, SortModel } from \"../types/colDef\";\nimport { DEFAULT_COL_DEF, GRID_SIZE_PRESETS, rowIdFromKey } from \"../core/resolveOptions\";\nimport { buildCsv } from \"../lib/csv\";\nimport { parseCsv, toTsv } from \"../lib/clipboard\";\nimport { escapeHtml } from \"../lib/download\";\nimport { setByPath } from \"../lib/path\";\nimport { formatCellValue } from \"../render/cellContent\";\nimport { sanitizeGridOptionPatch } from \"../core/gridOptionRuntime\";\nimport { migrateGridState } from \"../lib/gridState\";\nimport { createSaveSnapshot, normalizeBatchSaveResult } from \"../lib/batchSave\";\n\ninterface OptionUpdateEffects {\n datasourceChanged: boolean;\n filterChanged: boolean;\n needsCellRefresh: boolean;\n needsColumnRebuild: boolean;\n needsHeaderRebuild: boolean;\n needsPoolRebuild: boolean;\n needsRelayout: boolean;\n needsRowRebuild: boolean;\n needsStateLoad: boolean;\n needsSummaryRefresh: boolean;\n stateToApply?: GridStateInput;\n}\n\ninterface CsvFieldBinding {\n field: string;\n index: number;\n}\n\nfunction createOptionUpdateEffects(): OptionUpdateEffects {\n return {\n datasourceChanged: false,\n filterChanged: false,\n needsCellRefresh: false,\n needsColumnRebuild: false,\n needsHeaderRebuild: false,\n needsPoolRebuild: false,\n needsRelayout: false,\n needsRowRebuild: false,\n needsStateLoad: false,\n needsSummaryRefresh: false\n };\n}\n\nfunction hasOwnOption<T extends object>(options: T, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(options, key);\n}\n\nfunction normalizeFinite(value: unknown, min: number, integer = false): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < min) return undefined;\n return integer ? Math.floor(value) : value;\n}\n\nfunction changedFinite(\n value: unknown,\n current: number,\n min: number,\n integer = false\n): number | undefined {\n const normalized = normalizeFinite(value, min, integer);\n return normalized === undefined || normalized === current ? undefined : normalized;\n}\n\nexport class GridApiImpl<TData = any> implements GridApi<TData> {\n private measureCanvas: HTMLCanvasElement | null = null;\n private asyncTransactions: RowTransaction<TData>[] = [];\n private asyncTransactionTimer: ReturnType<typeof setTimeout> | null = null;\n private asyncTransactionResolvers: Array<() => void> = [];\n\n constructor(private core: GridCore<TData>) {}\n\n whenReady(): Promise<import(\"../types/api\").GridApi<TData>> {\n return this.core.whenReady();\n }\n\n getRootElement(): HTMLElement | null {\n return this.core.isDestroyed() ? null : this.core.skeleton.root;\n }\n\n setRowData(rows: TData[] | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.rowData = rows ?? [];\n if (this.core.rowModel.isInfinite) return;\n this.core.rowModel.setRowData(rows);\n this.core.bodyRenderer.onDataChanged();\n }\n\n applyTransaction(transaction: RowTransaction<TData>): void {\n if (this.core.isDestroyed() || this.core.rowModel.isInfinite) return;\n this.core.rowModel.applyTransaction(transaction);\n this.core.bodyRenderer.onDataChanged();\n }\n\n applyTransactionAsync(transaction: RowTransaction<TData>): Promise<void> {\n if (this.core.isDestroyed() || this.core.rowModel.isInfinite) return Promise.resolve();\n this.asyncTransactions.push(transaction);\n if (this.asyncTransactionTimer == null) {\n this.asyncTransactionTimer = setTimeout(\n () => this.flushAsyncTransactions(),\n this.core.options.asyncTransactionWaitMillis\n );\n }\n return new Promise((resolve) => this.asyncTransactionResolvers.push(resolve));\n }\n\n flushAsyncTransactions(): void {\n if (this.asyncTransactionTimer != null) clearTimeout(this.asyncTransactionTimer);\n this.asyncTransactionTimer = null;\n const transactions = this.asyncTransactions;\n const resolvers = this.asyncTransactionResolvers;\n this.asyncTransactions = [];\n this.asyncTransactionResolvers = [];\n if (transactions.length > 0 && !this.core.isDestroyed() && !this.core.rowModel.isInfinite) {\n this.core.rowModel.applyTransactions(transactions);\n this.core.bodyRenderer.onDataChanged();\n }\n for (const resolve of resolvers) resolve();\n }\n\n getColumnDefs(): ColDefOrGroup<TData>[] | null {\n return this.core.columnModel.getColumnDefs() as ColDefOrGroup<TData>[];\n }\n\n setColumnDefs(colDefs: ColDefOrGroup<TData>[] | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.columnDefs = colDefs ?? [];\n this.core.columnModel.setColumnDefs(colDefs);\n this.core.loadPersistedColumnState();\n this.core.onColumnsStructureChanged();\n if (this.core.rowModel.isInfinite) void this.core.rowModel.onServerParamsChanged();\n else {\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n getColumnState(): ColumnState[] {\n return this.core.columnModel.getColumnState();\n }\n\n setColumnState(state: ColumnState[]): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.applyColumnState(state);\n this.core.onColumnsStructureChanged();\n this.core.applySortModel();\n this.core.persistColumnState();\n }\n\n resetColumnState(): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.resetColumnState();\n this.core.onColumnsStructureChanged();\n this.core.applySortModel();\n this.core.persistColumnState();\n }\n\n setColumnVisibility(colId: string, visible: boolean): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.setColumnVisibility(colId, visible);\n this.core.onColumnsStructureChanged();\n this.core.emit(\"columnVisibilityChanged\", { colId, visible });\n this.core.persistColumnState();\n }\n\n moveColumn(colId: string, toIndex: number): void {\n if (this.core.isDestroyed()) return;\n this.core.moveColumn(colId, toIndex);\n }\n\n setColumnPinned(colId: string, pinned: \"left\" | \"right\" | null): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.setColumnPinned(colId, pinned);\n this.core.onColumnsStructureChanged();\n this.core.persistColumnState();\n }\n\n setColumnWidth(colId: string, width: number): boolean {\n if (this.core.isDestroyed()) return false;\n const column = this.core.columnModel.getColumn(colId);\n if (!column || !this.core.columnModel.setColumnWidth(column, width)) return false;\n this.core.relayoutColumns();\n this.core.commitColumnWidths([column]);\n return true;\n }\n\n sizeColumnsToFit(width?: number): void {\n if (this.core.isDestroyed()) return;\n const cols = this.core.columnModel.getOrderedVisible();\n if (cols.length === 0) return;\n const target = width ?? this.core.skeleton.measureViewportWidth();\n if (target <= 0) return;\n const total = cols.reduce((acc, c) => acc + c.currentWidth, 0);\n if (total <= 0) return;\n const changed = cols.filter((col) =>\n this.core.columnModel.setColumnWidth(col, Math.max(30, Math.floor((col.currentWidth * target) / total)))\n );\n this.core.relayoutColumns();\n this.core.commitColumnWidths(changed);\n }\n\n autoSizeColumn(colId: string, skipHeader = false): void {\n if (this.core.isDestroyed()) return;\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n\n if (this.autoSizeColumnInternal(column, skipHeader)) {\n this.core.relayoutColumns();\n this.core.commitColumnWidths([column]);\n }\n }\n\n private autoSizeColumnInternal(\n column: Column<TData>,\n skipHeader: boolean\n ): boolean {\n\n if (column.hasCheckbox || column.isDetailToggle) {\n return this.core.columnModel.setColumnWidth(column, column.isDetailToggle ? 38 : 46);\n }\n\n this.measureCanvas ??= document.createElement(\"canvas\");\n const ctx = this.measureCanvas.getContext(\"2d\");\n if (!ctx) return false;\n const style = window.getComputedStyle(this.core.skeleton.root);\n ctx.font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n\n let maxWidth = 0;\n const consider = (text: string) => {\n if (!text) return;\n const w = ctx.measureText(text).width;\n if (w > maxWidth) maxWidth = w;\n };\n\n if (!skipHeader) {\n consider(column.colDef.headerName ?? column.colDef.field ?? column.id);\n }\n const nodes = this.core.rowModel.getAllNodes();\n const cap = Math.min(nodes.length, 2000);\n for (let i = 0; i < cap; i++) {\n consider(formatCellValue(this.core, nodes[i], column));\n }\n\n const extra = (column.sortable ? 20 : 0) + (column.filterable ? 28 : 0) + (this.core.options.columnMenu ? 22 : 0) + 28;\n return this.core.columnModel.setColumnWidth(column, Math.ceil(maxWidth) + extra);\n }\n\n autoSizeAllColumns(skipHeader?: boolean): void {\n if (this.core.isDestroyed()) return;\n const changed: Column<TData>[] = [];\n for (const col of this.core.columnModel.getOrderedVisible()) {\n if (this.autoSizeColumnInternal(col, skipHeader ?? false)) changed.push(col);\n }\n if (changed.length > 0) {\n this.core.relayoutColumns();\n this.core.commitColumnWidths(changed);\n }\n }\n\n getSortModel(): SortModel {\n return this.core.columnModel.getSortModel();\n }\n\n setSortModel(sortModel: SortModel | null): void {\n if (this.core.isDestroyed()) return;\n this.core.columnModel.applySortModel(sortModel);\n this.core.applySortModel();\n }\n\n getFilterModel(): FilterModel {\n return this.core.rowModel.getFilterModel();\n }\n\n setFilterModel(filterModel: FilterModel | null): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setFilterModel(filterModel);\n this.core.headerRenderer.refreshFilterIcons();\n this.emitFilterChanged();\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n return;\n }\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n getAdvancedFilterModel(): AdvancedFilterModel | null {\n return this.core.rowModel.getAdvancedFilterModel();\n }\n\n setAdvancedFilterModel(model: AdvancedFilterModel | null): void {\n if (this.core.isDestroyed() || !this.core.rowModel.setAdvancedFilterModel(model)) return;\n this.emitFilterChanged();\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n return;\n }\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n\n private emitFilterChanged(): void {\n this.core.emit(\"filterChanged\", {\n filterModel: this.core.rowModel.getFilterModel(),\n advancedFilterModel: this.core.rowModel.getAdvancedFilterModel()\n });\n }\n\n isColumnFilterPresent(colId: string): boolean {\n return Object.prototype.hasOwnProperty.call(this.core.rowModel.getFilterModel(), colId);\n }\n\n setQuickFilter(text: string | null | undefined): void {\n if (this.core.isDestroyed()) return;\n this.core.options.quickFilterText = text != null && text.trim() !== \"\" ? text : null;\n if (this.core.rowModel.setQuickFilter(text)) {\n this.core.applyQuickFilter();\n }\n }\n\n getQuickFilter(): string | null {\n return this.core.rowModel.getQuickFilter();\n }\n\n getRowSelection(): \"none\" | \"single\" | \"multiple\" {\n return this.core.options.rowSelection;\n }\n\n setRowSelection(mode: \"none\" | \"single\" | \"multiple\"): void {\n if (this.core.isDestroyed()) return;\n if (this.core.options.rowSelection === mode) return;\n this.core.options.rowSelection = mode;\n if (mode === \"none\") this.deselectAll();\n this.core.headerRenderer.build();\n this.core.bodyRenderer.rebuildPool();\n }\n\n getSelectedNodes() {\n return this.core.selectionService.getSelectedNodes();\n }\n\n getSelectedRows(): TData[] {\n return this.core.selectionService.getSelectedRows();\n }\n\n selectNodeById(nodeId: string, selected = true, clearOthers = true): void {\n this.core.selectionService.selectNodeById(nodeId, selected, clearOthers);\n }\n\n selectAll(filteredOnly = true): void {\n this.core.selectionService.selectAll(filteredOnly);\n }\n\n deselectAll(): void {\n this.core.selectionService.deselectAll();\n }\n\n getDisplayedRowCount(): number {\n return this.core.rowModel.getDisplayedRowCount();\n }\n\n getRowNode(rowIndex: number) {\n return this.core.rowModel.getDisplayedRow(rowIndex);\n }\n\n getNodeById(id: string) {\n return this.core.rowModel.getNodeById(id);\n }\n\n forEachNode(callback: (node: any, index: number) => void): void {\n this.core.rowModel.forEachNode(callback);\n }\n\n forEachNodeAfterFilterAndSort(callback: (node: any, index: number) => void): void {\n this.core.rowModel.forEachNodeAfterFilterAndSort(callback);\n }\n\n scrollToIndex(rowIndex: number, position: \"top\" | \"bottom\" | \"middle\" | \"nearest\" = \"top\"): void {\n this.core.bodyRenderer.scrollToIndex(rowIndex, position);\n }\n\n expandRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.expandRow(rowId);\n }\n\n collapseRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.collapseRow(rowId);\n }\n\n toggleDetailRow(rowId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.toggleDetail(rowId);\n }\n\n isRowExpanded(rowId: string): boolean {\n return this.core.rowModel.isRowExpanded(rowId);\n }\n\n expandAllDetails(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.expandAllDetails();\n }\n\n collapseAllDetails(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.collapseAllDetails();\n }\n\n loadTreeChildren(rowId: string, options: { force?: boolean } = {}): Promise<readonly TData[]> {\n if (this.core.isDestroyed()) return Promise.resolve([]);\n return this.core.rowModel.loadTreeChildren(rowId, options.force === true);\n }\n\n retryTreeChildren(rowId: string): Promise<readonly TData[]> {\n return this.loadTreeChildren(rowId, { force: true });\n }\n\n isTreeRowLoading(rowId: string): boolean {\n return !this.core.isDestroyed() && this.core.rowModel.isTreeRowLoading(rowId);\n }\n\n toggleRowGroup(groupId: string): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.toggleGroup(groupId);\n }\n\n reorderRows(fromIndex: number, toIndex: number): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.rowModel.reorderRowsByDisplayed(fromIndex, toIndex);\n }\n\n isGroupExpanded(groupId: string): boolean {\n return this.core.rowModel.isGroupExpanded(groupId);\n }\n\n expandAllGroups(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.expandAllGroups();\n }\n\n collapseAllGroups(): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.collapseAllGroups();\n }\n\n setSelection(rows: TData[], clearOthers = true): void {\n if (this.core.isDestroyed()) return;\n const getRowId = this.core.options.getRowId;\n const changes: { node: any; selected: boolean }[] = [];\n for (const row of rows) {\n const node = getRowId\n ? this.core.rowModel.getNodeById(\n this.core.rowModel.resolveRowId(row, -1, `__missing_selection_${this.core.nextId()}`)\n )\n : this.core.rowModel.getAllNodes().find((n) => n.data === row);\n if (node) changes.push({ node, selected: true });\n }\n if (changes.length > 0) {\n this.core.selectionService.applySelectionPublic(changes, clearOthers);\n } else if (clearOthers) {\n this.deselectAll();\n }\n }\n\n getVisibleSelection(): TData[] {\n const selectedIds = new Set(this.core.selectionService.getSelectedNodes().map((n) => n.id));\n return this.core.rowModel\n .getDisplayedRows()\n .filter((n) => !n.isDetail && !n.isGroup && selectedIds.has(n.id))\n .map((n) => n.data!)\n .filter(Boolean);\n }\n\n getSelectedIds(): string[] {\n return this.core.selectionService.getSelectedIds();\n }\n\n undo(): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.undoService.undo();\n }\n\n redo(): boolean {\n if (this.core.isDestroyed()) return false;\n return this.core.undoService.redo();\n }\n\n canUndo(): boolean {\n return this.core.undoService.canUndo();\n }\n\n canRedo(): boolean {\n return this.core.undoService.canRedo();\n }\n\n getDirtyRowIds(): string[] {\n return this.core.changeTracker.getDirtyRowIds();\n }\n\n getChanges(): import(\"../types/api\").GridChange<TData>[] {\n return this.core.changeTracker.getChanges();\n }\n\n markChangesSaved(rowIds?: readonly string[]): void {\n this.core.changeTracker.markSaved(rowIds);\n }\n\n async saveChanges(\n handler: import(\"../types/api\").SaveChangesHandler<TData>,\n rowIds?: readonly string[]\n ): Promise<import(\"../types/api\").GridChange<TData>[]> {\n return (await this.saveChangesDetailed(handler, rowIds)).saved;\n }\n\n async saveChangesDetailed(\n handler: import(\"../types/api\").SaveChangesHandler<TData>,\n rowIds?: readonly string[]\n ): Promise<import(\"../types/api\").GridBatchSaveResult<TData>> {\n const snapshot = createSaveSnapshot(this.core.changeTracker.getChanges(), rowIds);\n if (snapshot.length === 0) return { submitted: [], saved: [], failures: [], conflicts: [] };\n const result = normalizeBatchSaveResult(snapshot, await handler(snapshot));\n if (!this.core.isDestroyed()) this.core.changeTracker.acknowledge(result.saved);\n return result;\n }\n\n rollbackChanges(rowIds?: readonly string[]): boolean {\n return this.core.changeTracker.rollback(rowIds);\n }\n\n setPinnedTopRowData(rows: TData[] | null): void {\n if (this.core.isDestroyed()) return;\n this.core.options.pinnedTopRowData = rows ?? [];\n this.core.pinnedRowsRenderer.setTopData(this.core.options.pinnedTopRowData);\n }\n\n getPinnedTopRowData(): TData[] {\n return this.core.pinnedRowsRenderer.getTopData();\n }\n\n setPinnedBottomRowData(rows: TData[] | null): void {\n if (this.core.isDestroyed()) return;\n this.core.options.pinnedBottomRowData = rows ?? [];\n this.core.pinnedRowsRenderer.setBottomData(this.core.options.pinnedBottomRowData);\n }\n\n getPinnedBottomRowData(): TData[] {\n return this.core.pinnedRowsRenderer.getBottomData();\n }\n\n getRangeSelection(): import(\"../types/events\").GridCellRange | null {\n return this.core.bodyRenderer.getRangeSelection();\n }\n\n clearRangeSelection(): void {\n if (this.core.isDestroyed()) return;\n this.core.bodyRenderer.clearRangeSelection();\n }\n\n copyRangeToClipboard(): Promise<boolean> {\n if (this.core.isDestroyed()) return Promise.resolve(false);\n return this.core.copyActiveRange();\n }\n\n openColumnPanel(anchor?: HTMLElement): void {\n this.openColumnWorkbench(anchor);\n }\n\n openColumnWorkbench(anchor?: HTMLElement): void {\n if (this.core.isDestroyed()) return;\n this.core.columnMenu.openStandalone(anchor);\n }\n\n closeColumnWorkbench(): void {\n this.core.columnMenu.close();\n }\n\n getColumnWorkbenchItems(): import(\"../types/api\").ColumnWorkbenchItem[] {\n return this.core.columnModel.getColumns()\n .filter((column) => !column.isDetailToggle)\n .map((column) => ({\n colId: column.id,\n label: column.colDef.headerName ?? column.colDef.field ?? column.id,\n visible: !column.hide,\n pinned: column.pinned,\n width: column.currentWidth || column.manualWidth || column.colDef.width || 0,\n movable: column.movable,\n hideable: !column.hasCheckbox\n }));\n }\n\n refreshLayout(): void {\n if (this.core.isDestroyed()) return;\n this.core.relayout();\n this.core.bodyRenderer.syncScroll();\n }\n\n isInfinite(): boolean {\n return this.core.rowModel.isInfinite;\n }\n\n reload(): Promise<void> {\n if (this.core.isDestroyed()) return Promise.resolve();\n if (this.core.rowModel.isInfinite) {\n return this.core.rowModel.reloadInfinite();\n } else {\n this.core.rowModel.setRowData(this.core.options.rowData);\n this.core.bodyRenderer.onDataChanged();\n return Promise.resolve();\n }\n }\n\n paginationEnabled(): boolean {\n return this.core.rowModel.paginationActive;\n }\n\n setPaginationEnabled(enabled: boolean): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPaginationEnabled(enabled);\n }\n\n getPage(): number {\n return this.core.rowModel.getCurrentPage();\n }\n\n setPage(page: number): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPage(page);\n }\n\n getPageSize(): number {\n return this.core.options.paginationPageSize;\n }\n\n setPageSize(size: number): void {\n if (this.core.isDestroyed()) return;\n this.core.rowModel.setPageSize(size);\n }\n\n getPageCount(): number {\n return this.core.rowModel.getPageCount();\n }\n\n getTotalRowCount(): number {\n return this.core.rowModel.getTotalRowCount();\n }\n\n importCsv(text: string, options: ImportCsvOptions = {}): boolean {\n if (this.core.isDestroyed() || !text) return false;\n const grid = parseCsv(text, options.separator ?? \",\");\n if (grid.length === 0) return false;\n const headerRow = grid[options.headerRowIndex ?? 0] ?? [];\n const body = grid.slice((options.headerRowIndex ?? 0) + 1).filter((r) => r.some((c) => c !== \"\"));\n const mode = options.mode ?? \"replace\";\n\n if (mode === \"paste\") {\n this.core.pasteText(toTsv(body, false), 0, 0);\n return true;\n }\n\n const columns = this.core.columnModel.getOrderedVisible().filter((column) => column.colDef.field);\n const fieldOrder = this.resolveCsvFieldOrder(headerRow, columns);\n const records = this.buildCsvRecords(body, fieldOrder, options);\n\n if (mode === \"append\") {\n this.core.rowModel.applyTransaction({ add: records as unknown as TData[] });\n } else {\n this.core.rowModel.setRowData(records as unknown as TData[]);\n }\n this.core.bodyRenderer.onDataChanged();\n return true;\n }\n\n private resolveCsvFieldOrder(headerRow: string[], columns: readonly Column[]): CsvFieldBinding[] {\n const byHeader = new Map<string, string>();\n for (const column of columns) {\n const field = column.colDef.field;\n if (!field) continue;\n byHeader.set(String(column.colDef.headerName ?? field), field);\n byHeader.set(field, field);\n }\n if (headerRow.length > 0) headerRow[0] = headerRow[0].replace(/^\\uFEFF/, \"\");\n const matched = headerRow\n .map((header, index) => ({ field: byHeader.get(String(header).trim()) ?? null, index }))\n .filter((entry): entry is { field: string; index: number } => entry.field != null);\n if (matched.length > 0) return matched;\n return columns.map((column, index) => ({ field: column.colDef.field!, index }));\n }\n\n private buildCsvRecords(\n rows: string[][],\n fieldOrder: CsvFieldBinding[],\n options: ImportCsvOptions\n ): Array<Record<string, any>> {\n return rows.map((row, rowIndex) => {\n const record: Record<string, any> = {};\n fieldOrder.forEach(({ field, index }) => {\n const raw = row[index];\n if (raw === undefined) return;\n const value = this.parseCsvValue(raw, field, rowIndex, index, options);\n if (!setByPath(record, field, value)) {\n this.core.reportError(new Error(`Unsafe CSV field: ${field}`), \"csv.import\", { field });\n }\n });\n return record;\n });\n }\n\n private parseCsvValue(\n raw: string,\n field: string,\n rowIndex: number,\n columnIndex: number,\n options: ImportCsvOptions\n ): any {\n if (options.parseValue) {\n try {\n return options.parseValue({ value: raw, field, rowIndex, columnIndex });\n } catch (error) {\n this.core.reportError(error, \"csv.parseValue\", { field, rowIndex, columnIndex });\n return raw;\n }\n }\n if (raw === \"\") return null;\n const isNumeric = /^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(raw);\n const hasLeadingZero = /^[+-]?0\\d/.test(raw);\n return options.coerceNumbers !== false && isNumeric && !hasLeadingZero ? Number(raw) : raw;\n }\n\n print(options: import(\"../types/api\").PrintOptions = {}): boolean {\n if (this.core.isDestroyed()) return false;\n try {\n const win = window.open(\"\", \"_blank\", \"width=980,height=720\");\n if (!win) return false;\n const cols = this.core.columnModel\n .getOrderedVisible()\n .filter((c) => !c.hasCheckbox && !c.isDetailToggle && !c.colDef.rowDrag);\n const nodes = this.core.rowModel.getPipelineRows().filter((n) => !n.isDetail && !n.isGroup);\n const includeHeader = options.includeHeader !== false;\n const headerCells = includeHeader\n ? `<tr>${cols.map((c) => `<th>${escapeHtml(c.colDef.headerName ?? c.colDef.field ?? c.id)}</th>`).join(\"\")}</tr>`\n : \"\";\n const bodyRows = nodes\n .map(\n (node) =>\n `<tr>${cols\n .map((c) => {\n const v = formatCellValue(this.core, node, c);\n return `<td>${escapeHtml(v)}</td>`;\n })\n .join(\"\")}</tr>`\n )\n .join(\"\");\n const html =\n `<!doctype html><html><head><meta charset=\"utf-8\"><title>${escapeHtml(options.title ?? \"MachTable\")}</title>` +\n `<style>body{font-family:system-ui,\"PingFang SC\",\"Microsoft YaHei\",sans-serif;padding:20px}` +\n `h3{margin:0 0 12px;font-size:16px}` +\n `table{border-collapse:collapse;width:100%;font-size:12px}` +\n `th,td{border:1px solid #bbb;padding:5px 8px;text-align:left;word-break:break-all}` +\n `th{background:#f2f5f9;font-weight:600}` +\n `@page{margin:12mm}</style></head><body>` +\n `<h3>${escapeHtml(options.title ?? \"\")}</h3><table>${headerCells}${bodyRows}</table>` +\n `</body></html>`;\n win.document.write(html);\n win.document.close();\n win.focus();\n win.print();\n return true;\n } catch {\n return false;\n }\n }\n\n startEditingCell(params: { rowIndex: number; colId: string; keyPress?: string }): boolean {\n const column = this.core.columnModel.getColumn(params.colId);\n if (!column) return false;\n return this.core.editingService.start(params.rowIndex, column, params.keyPress ?? null);\n }\n\n startEditingRow(rowIndex: number): boolean {\n return this.core.editingService.startRow(rowIndex);\n }\n\n isRowEditing(rowIndex?: number): boolean {\n return this.core.editingService.isRowEditing(rowIndex);\n }\n\n stopEditing(cancel?: boolean): void {\n this.core.editingService.stop(cancel ?? false);\n }\n\n stopEditingAsync(cancel?: boolean): Promise<boolean> {\n return this.core.editingService.stopAsync(cancel ?? false);\n }\n\n stopEditingRow(cancel?: boolean): Promise<boolean> {\n return this.core.editingService.stopRowAsync(cancel ?? false);\n }\n\n refreshCells(): void {\n this.core.bodyRenderer.refreshAllCells();\n this.core.pinnedRowsRenderer.refresh();\n this.core.summaryRenderer.refresh();\n }\n\n getGridOption<K extends keyof GridOptions<TData>>(key: K): GridOptions<TData>[K] {\n return (this.core.options as unknown as GridOptions<TData>)[key];\n }\n\n setGridOption<K extends keyof GridOptions<TData>>(key: K, value: GridOptions<TData>[K]): void {\n this.updateOptions({ [key]: value });\n }\n\n updateOptions(options: Partial<GridOptions<TData>>): void {\n if (this.core.isDestroyed()) return;\n this.core.checkWarnings(options);\n options = sanitizeGridOptionPatch(options);\n const effects = createOptionUpdateEffects();\n const previousColumnMenu = this.core.options.columnMenu;\n\n this.updateSourceOptions(options, effects);\n this.updateDimensionOptions(options, effects);\n this.updateEditingOptions(options, effects);\n this.updateInteractionOptions(options, effects);\n this.updatePaginationOptions(options);\n this.updatePresentationOptions(options, effects);\n this.updateAccessibilityOptions(options, effects);\n this.updateRowModelOptions(options, effects);\n this.updateExtensionOptions(options, effects);\n this.updateDatasourceOptions(options, effects);\n this.applyOptionUpdateEffects(options, effects, previousColumnMenu);\n }\n\n private updateSourceOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (hasOwnOption(options, \"columnDefs\") && options.columnDefs !== resolved.columnDefs) {\n resolved.columnDefs = Array.isArray(options.columnDefs) ? options.columnDefs : [];\n effects.needsColumnRebuild = true;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"rowData\")) {\n resolved.rowData = Array.isArray(options.rowData) ? options.rowData : [];\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"initialState\") && options.initialState) {\n resolved.initialState = options.initialState;\n effects.stateToApply = options.initialState;\n }\n this.updateEventHandlers(options);\n }\n\n private updateEventHandlers(options: Partial<GridOptions<TData>>): void {\n for (const eventType of EVENT_TYPES) {\n const key = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}` as keyof GridOptions<TData>;\n if (hasOwnOption(options, key)) Object.assign(this.core.options, { [key]: options[key] });\n }\n }\n\n private updateDimensionOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n const rowHeight = changedFinite(options.rowHeight, resolved.rowHeight, 1);\n const headerHeight = changedFinite(options.headerHeight, resolved.headerHeight, 1);\n const rowBuffer = changedFinite(options.rowBuffer, resolved.rowBuffer, 0, true);\n const detailHeight = changedFinite(options.detailRowHeight, resolved.detailRowHeight, 1);\n\n if (rowHeight !== undefined) {\n resolved.rowHeight = rowHeight;\n effects.needsRelayout = true;\n }\n if (headerHeight !== undefined) {\n resolved.headerHeight = headerHeight;\n effects.needsRelayout = true;\n effects.needsHeaderRebuild = true;\n }\n if (rowBuffer !== undefined) {\n resolved.rowBuffer = rowBuffer;\n effects.needsRelayout = true;\n }\n if (options.columnLayout != null && options.columnLayout !== resolved.columnLayout) {\n resolved.columnLayout = options.columnLayout === \"fit\" ? \"fit\" : \"normal\";\n effects.needsRelayout = true;\n }\n if (options.domLayout != null && options.domLayout !== resolved.domLayout) {\n resolved.domLayout = options.domLayout === \"autoHeight\" ? \"autoHeight\" : \"normal\";\n this.core.skeleton.applyDomLayout(resolved.domLayout);\n effects.needsPoolRebuild = true;\n }\n if (options.multiSort != null) resolved.multiSort = options.multiSort;\n if (detailHeight !== undefined) {\n resolved.detailRowHeight = detailHeight;\n this.core.bodyRenderer.applyContainerSizes();\n this.core.bodyRenderer.updateRange(true);\n }\n }\n\n private updateEditingOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.editType != null && options.editType !== resolved.editType) {\n this.core.editingService.stop(true);\n resolved.editType = options.editType === \"fullRow\" ? \"fullRow\" : \"cell\";\n effects.needsCellRefresh = true;\n }\n if (options.editableIndicator != null && options.editableIndicator !== resolved.editableIndicator) {\n resolved.editableIndicator =\n options.editableIndicator === \"always\" || options.editableIndicator === \"none\"\n ? options.editableIndicator\n : \"hover\";\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"rowEditValidator\")) resolved.rowEditValidator = options.rowEditValidator;\n if (options.singleClickEdit != null) resolved.singleClickEdit = options.singleClickEdit;\n if (options.manualSorting != null) resolved.manualSorting = options.manualSorting;\n if (options.manualFiltering != null) resolved.manualFiltering = options.manualFiltering;\n }\n\n private updateInteractionOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (\n typeof options.enableColumnResize === \"boolean\" &&\n options.enableColumnResize !== resolved.enableColumnResize\n ) {\n this.core.resizeService.cancelResize();\n resolved.enableColumnResize = options.enableColumnResize;\n effects.needsHeaderRebuild = true;\n }\n if (options.locale != null && options.locale !== resolved.locale) {\n resolved.locale = options.locale;\n effects.needsHeaderRebuild = true;\n effects.needsCellRefresh = true;\n this.core.paginationBar.rebuild();\n this.core.statusBarService.rebuild();\n }\n if (options.indexOffset != null && options.indexOffset !== resolved.indexOffset) {\n resolved.indexOffset = options.indexOffset;\n effects.needsCellRefresh = true;\n }\n if (options.showSummary != null && options.showSummary !== resolved.showSummary) {\n resolved.showSummary = options.showSummary;\n effects.needsSummaryRefresh = true;\n effects.needsRelayout = true;\n }\n const undoStackSize = changedFinite(options.undoStackSize, resolved.undoStackSize, 0, true);\n if (undoStackSize !== undefined) {\n resolved.undoStackSize = undoStackSize;\n this.core.undoService.trimToSize();\n }\n const wait = normalizeFinite(options.asyncTransactionWaitMillis, 0, true);\n if (wait !== undefined) resolved.asyncTransactionWaitMillis = wait;\n this.updateDynamicRowHeight(options, effects);\n this.updateRangeAndFeedbackOptions(options);\n }\n\n private updateDynamicRowHeight(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n if (!hasOwnOption(options, \"getRowHeight\")) return;\n const changed = this.core.options.getRowHeight !== options.getRowHeight;\n this.core.options.getRowHeight = options.getRowHeight;\n if (changed) this.core.bodyRenderer.invalidateAllRowHeights();\n effects.needsRelayout = true;\n }\n\n private updateRangeAndFeedbackOptions(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (options.enableRangeSelection != null) {\n resolved.enableRangeSelection = options.enableRangeSelection;\n if (!options.enableRangeSelection) this.clearRangeSelection();\n }\n if (hasOwnOption(options, \"tooltipComponent\")) resolved.tooltipComponent = options.tooltipComponent;\n const tooltipDelay = normalizeFinite(options.tooltipShowDelay, 0);\n if (tooltipDelay !== undefined) resolved.tooltipShowDelay = tooltipDelay;\n if (options.flashCells != null) resolved.flashCells = options.flashCells;\n if (hasOwnOption(options, \"getContextMenuItems\")) {\n resolved.getContextMenuItems = options.getContextMenuItems;\n }\n if (options.theme != null && options.theme !== resolved.theme) {\n resolved.theme = options.theme;\n this.core.skeleton.applyTheme(options.theme);\n this.core.watermarkService.refresh();\n }\n }\n\n private updatePaginationOptions(options: Partial<GridOptions<TData>>): void {\n if (options.pagination === undefined) return;\n const resolved = this.core.options;\n const config = options.pagination;\n const enabled = config !== false && resolved.datasource == null;\n if (enabled !== resolved.paginationEnabled) this.core.rowModel.setPaginationEnabled(enabled);\n if (typeof config === \"object\" && config) this.updatePaginationConfig(config);\n if (resolved.paginationEnabled) this.core.rowModel.onPaginationOptionsChanged();\n this.core.paginationBar.rebuild();\n }\n\n private updatePaginationConfig(config: Exclude<GridOptions<TData>[\"pagination\"], boolean | undefined>): void {\n const resolved = this.core.options;\n resolved.paginationMode = config.mode === \"server\" ? \"server\" : \"client\";\n const page = normalizeFinite(config.page, 1, true);\n const total = normalizeFinite(config.total, 0, true);\n if (page !== undefined) resolved.paginationPage = page;\n if (total !== undefined) resolved.paginationTotal = total;\n if (config.pageSize != null) resolved.paginationPageSize = config.pageSize;\n if (config.pageSizeOptions != null) resolved.paginationPageSizeOptions = config.pageSizeOptions;\n if (config.showTotal != null) resolved.paginationShowTotal = config.showTotal;\n if (config.showPageSizeSelector != null) {\n resolved.paginationShowSizeSelector = config.showPageSizeSelector;\n }\n }\n\n private updatePresentationOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n this.updateWatermarkAndStatus(options, effects);\n this.updateSizePreset(options, effects);\n const resolved = this.core.options;\n if (options.stripedRows != null && options.stripedRows !== resolved.stripedRows) {\n resolved.stripedRows = options.stripedRows;\n this.core.skeleton.setStriped(options.stripedRows);\n }\n if (options.showCellBorders != null && options.showCellBorders !== resolved.showCellBorders) {\n resolved.showCellBorders = options.showCellBorders;\n this.core.skeleton.setCellBorders(options.showCellBorders);\n }\n }\n\n private updateWatermarkAndStatus(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.watermark !== undefined) {\n resolved.watermarkEnabled = options.watermark != null && options.watermark !== false;\n resolved.watermarkConfig =\n options.watermark == null || options.watermark === false\n ? null\n : options.watermark === true\n ? { text: \"MachTable\" }\n : options.watermark;\n this.core.watermarkService.refresh();\n }\n this.updateStatusOptions(options);\n if (hasOwnOption(options, \"summaryMethod\")) {\n resolved.summaryMethod = options.summaryMethod;\n effects.needsSummaryRefresh = true;\n }\n }\n\n private updateStatusOptions(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (options.suppressClipboard != null) resolved.suppressClipboard = options.suppressClipboard;\n if (options.contextMenu != null) resolved.contextMenu = options.contextMenu;\n if (options.columnMenu != null) resolved.columnMenu = options.columnMenu;\n if (options.fillHandle != null) resolved.fillHandle = options.fillHandle;\n if (options.statusBar !== undefined) {\n resolved.statusBarEnabled =\n options.statusBar === true || (typeof options.statusBar === \"object\" && options.statusBar != null);\n if (typeof options.statusBar === \"object\" && options.statusBar?.panels) {\n resolved.statusBarPanels = options.statusBar.panels;\n }\n this.core.statusBarService.rebuild();\n }\n }\n\n private updateSizePreset(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const { size } = options;\n if (size == null || !hasOwnOption(GRID_SIZE_PRESETS, size) || size === this.core.options.size) return;\n const preset = GRID_SIZE_PRESETS[size];\n this.core.options.size = size;\n this.core.options.rowHeight = options.rowHeight ?? preset.rowHeight;\n this.core.options.headerHeight = options.headerHeight ?? preset.headerHeight;\n this.core.skeleton.applySize(size);\n effects.needsRelayout = true;\n effects.needsHeaderRebuild = true;\n }\n\n private updateAccessibilityOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.suppressCellFocus != null) resolved.suppressCellFocus = options.suppressCellFocus;\n if (options.suppressRowHoverHighlight != null) {\n resolved.suppressRowHoverHighlight = options.suppressRowHoverHighlight;\n }\n if (options.suppressNoRowsOverlay != null) resolved.suppressNoRowsOverlay = options.suppressNoRowsOverlay;\n if (options.suppressHeaderFocus != null && options.suppressHeaderFocus !== resolved.suppressHeaderFocus) {\n resolved.suppressHeaderFocus = options.suppressHeaderFocus;\n effects.needsHeaderRebuild = true;\n }\n this.updateAriaLabels(options);\n this.updateOverlayOptions(options);\n }\n\n private updateAriaLabels(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n let changed = false;\n if (hasOwnOption(options, \"ariaLabel\")) {\n resolved.ariaLabel = options.ariaLabel ?? \"MachTable data grid\";\n changed = true;\n }\n if (hasOwnOption(options, \"ariaLabelledBy\")) {\n resolved.ariaLabelledBy = options.ariaLabelledBy ?? \"\";\n changed = true;\n }\n if (hasOwnOption(options, \"ariaDescribedBy\")) {\n resolved.ariaDescribedBy = options.ariaDescribedBy ?? \"\";\n changed = true;\n }\n if (changed) this.core.skeleton.applyAriaLabels(resolved);\n }\n\n private updateOverlayOptions(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (hasOwnOption(options, \"overlayNoRowsTemplate\")) {\n resolved.overlayNoRowsTemplate = options.overlayNoRowsTemplate ?? \"\";\n }\n if (hasOwnOption(options, \"overlayLoadingTemplate\")) {\n resolved.overlayLoadingTemplate = options.overlayLoadingTemplate ?? \"\";\n }\n if (hasOwnOption(options, \"overlayErrorTemplate\")) {\n resolved.overlayErrorTemplate = options.overlayErrorTemplate ?? \"\";\n }\n if (options.allowUnsafeOverlayHtml != null) resolved.allowUnsafeOverlayHtml = options.allowUnsafeOverlayHtml;\n if (hasOwnOption(options, \"className\")) {\n resolved.className = options.className ?? \"\";\n this.core.skeleton.setCustomClass(resolved.className);\n }\n if (options.loading != null) resolved.loading = options.loading;\n if (hasOwnOption(options, \"error\")) resolved.error = options.error ?? null;\n }\n\n private updateRowModelOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n this.updateSelectionAndColumns(options, effects);\n this.updateHierarchyOptions(options, effects);\n const resolved = this.core.options;\n if (options.autoCheckedChildren != null) resolved.autoCheckedChildren = options.autoCheckedChildren;\n if (options.defaultExpandAll != null && options.defaultExpandAll !== resolved.defaultExpandAll) {\n resolved.defaultExpandAll = options.defaultExpandAll;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"advancedFilterModel\")) {\n effects.filterChanged = this.core.rowModel.setAdvancedFilterModel(options.advancedFilterModel) || effects.filterChanged;\n }\n if (options.applyRowDrag != null) resolved.applyRowDrag = options.applyRowDrag;\n if (options.suppressWarnings != null) resolved.suppressWarnings = options.suppressWarnings;\n }\n\n private updateSelectionAndColumns(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.rowSelection != null && options.rowSelection !== resolved.rowSelection) {\n resolved.rowSelection = options.rowSelection;\n if (options.rowSelection === \"none\") this.deselectAll();\n effects.needsHeaderRebuild = true;\n effects.needsPoolRebuild = true;\n this.core.refreshAriaState();\n }\n if (options.quickFilterText !== undefined) this.setQuickFilter(options.quickFilterText);\n if (options.defaultColDef !== undefined && options.defaultColDef !== resolved.defaultColDef) {\n resolved.defaultColDef = { ...DEFAULT_COL_DEF, ...options.defaultColDef };\n effects.needsColumnRebuild = true;\n }\n if (hasOwnOption(options, \"columnTypes\") && options.columnTypes !== resolved.columnTypes) {\n resolved.columnTypes = options.columnTypes ?? {};\n effects.needsColumnRebuild = true;\n }\n if (hasOwnOption(options, \"getRowId\") && options.getRowId !== resolved.getRowId) {\n resolved.getRowId = options.getRowId;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"rowKey\")) {\n resolved.rowKey = options.rowKey;\n if (!hasOwnOption(options, \"getRowId\")) {\n const rowKey = options.rowKey;\n resolved.getRowId = rowKey\n ? ({ data }) => rowIdFromKey(rowKey, data)\n : undefined;\n }\n effects.needsRowRebuild = true;\n }\n }\n\n private updateHierarchyOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (options.masterDetail != null && options.masterDetail !== resolved.masterDetail) {\n resolved.masterDetail = options.masterDetail;\n effects.needsColumnRebuild = true;\n effects.needsRowRebuild = true;\n }\n if (options.detailToggleColumn != null && options.detailToggleColumn !== resolved.detailToggleColumn) {\n resolved.detailToggleColumn = options.detailToggleColumn;\n effects.needsColumnRebuild = true;\n }\n if (options.treeData != null && options.treeData !== resolved.treeData) {\n resolved.treeData = options.treeData;\n effects.needsRowRebuild = true;\n effects.needsColumnRebuild = true;\n this.core.refreshAriaState();\n }\n if (options.childrenKey != null && options.childrenKey !== resolved.childrenKey) {\n resolved.childrenKey = options.childrenKey;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"isTreeRowExpandable\")) {\n resolved.isTreeRowExpandable = options.isTreeRowExpandable;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"loadTreeChildren\")) {\n resolved.loadTreeChildren = options.loadTreeChildren;\n effects.needsCellRefresh = true;\n }\n }\n\n private updateExtensionOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n let reloadGridState = false;\n if (hasOwnOption(options, \"aggFuncs\")) {\n resolved.aggFuncs = options.aggFuncs;\n effects.needsRowRebuild = true;\n }\n if (hasOwnOption(options, \"components\")) {\n resolved.components = options.components;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"actionPolicy\")) {\n resolved.actionPolicy = options.actionPolicy;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"features\")) {\n resolved.features = Array.isArray(options.features) ? options.features : [];\n this.core.setFeatures(resolved.features);\n }\n if (hasOwnOption(options, \"columnStateStore\")) {\n resolved.columnStateStore = options.columnStateStore;\n effects.needsStateLoad = true;\n }\n if (hasOwnOption(options, \"columnStateKey\")) {\n resolved.columnStateKey = options.columnStateKey ?? null;\n effects.needsStateLoad = true;\n }\n if (hasOwnOption(options, \"stateStore\")) {\n resolved.stateStore = options.stateStore;\n reloadGridState = true;\n }\n if (hasOwnOption(options, \"stateKey\")) {\n resolved.stateKey = options.stateKey ?? null;\n reloadGridState = true;\n }\n const stateDebounce = normalizeFinite(options.stateSaveDebounceMs, 0, true);\n if (stateDebounce !== undefined) resolved.stateSaveDebounceMs = stateDebounce;\n if (reloadGridState) this.core.loadPersistedGridState();\n }\n\n private updateDatasourceOptions(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n const blockSize = normalizeFinite(options.blockSize, 1, true);\n const bufferRows = normalizeFinite(options.infiniteBufferRows, 0, true);\n const retryCount = normalizeFinite(options.datasourceRetryCount, 0, true);\n const retryDelay = normalizeFinite(options.datasourceRetryDelay, 0, true);\n if (blockSize !== undefined) resolved.blockSize = blockSize;\n if (bufferRows !== undefined) resolved.infiniteBufferRows = bufferRows;\n if (retryCount !== undefined) resolved.datasourceRetryCount = retryCount;\n if (retryDelay !== undefined) resolved.datasourceRetryDelay = retryDelay;\n this.updateDatasourceReference(options, effects);\n this.updatePinnedRows(options);\n }\n\n private updateDatasourceReference(options: Partial<GridOptions<TData>>, effects: OptionUpdateEffects): void {\n const resolved = this.core.options;\n if (hasOwnOption(options, \"datasource\") && options.datasource !== resolved.datasource) {\n resolved.datasource = options.datasource;\n resolved.paginationEnabled = options.datasource == null && resolved.paginationEnabled;\n effects.datasourceChanged = true;\n this.core.paginationBar.rebuild();\n }\n if (hasOwnOption(options, \"detailRowRenderer\")) {\n resolved.detailRowRenderer = options.detailRowRenderer;\n effects.needsCellRefresh = true;\n }\n if (hasOwnOption(options, \"isRowExpandable\")) {\n resolved.isRowExpandable = options.isRowExpandable;\n effects.needsCellRefresh = true;\n }\n }\n\n private updatePinnedRows(options: Partial<GridOptions<TData>>): void {\n const resolved = this.core.options;\n if (options.pinnedTopRowData !== undefined) {\n resolved.pinnedTopRowData = options.pinnedTopRowData ?? [];\n this.core.pinnedRowsRenderer.setTopData(resolved.pinnedTopRowData);\n }\n if (options.pinnedBottomRowData !== undefined) {\n resolved.pinnedBottomRowData = options.pinnedBottomRowData ?? [];\n this.core.pinnedRowsRenderer.setBottomData(resolved.pinnedBottomRowData);\n }\n }\n\n private applyOptionUpdateEffects(\n options: Partial<GridOptions<TData>>,\n effects: OptionUpdateEffects,\n previousColumnMenu: boolean\n ): void {\n const resolved = this.core.options;\n if (effects.needsColumnRebuild) {\n this.core.columnModel.setColumnDefs(resolved.columnDefs);\n this.core.onColumnsStructureChanged();\n effects.needsHeaderRebuild = false;\n effects.needsPoolRebuild = false;\n }\n if (effects.needsStateLoad) {\n this.core.loadPersistedColumnState();\n this.core.onColumnsStructureChanged();\n }\n this.applyRowUpdateEffect(effects);\n if (effects.filterChanged) {\n this.emitFilterChanged();\n if (!effects.datasourceChanged && !effects.needsRowRebuild) {\n if (this.core.rowModel.isInfinite) void this.core.rowModel.onServerParamsChanged();\n else {\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n }\n }\n if (effects.needsRelayout) {\n this.core.skeleton.updateHeights(resolved.rowHeight, resolved.headerHeight);\n this.core.relayout();\n this.core.relayoutColumns(false);\n }\n if (options.columnMenu != null && options.columnMenu !== previousColumnMenu) {\n effects.needsHeaderRebuild = true;\n }\n if (effects.needsHeaderRebuild) this.core.headerRenderer.build();\n if (effects.needsPoolRebuild) this.core.bodyRenderer.rebuildPool();\n else if (effects.needsCellRefresh) this.refreshCells();\n if (effects.needsSummaryRefresh) this.core.summaryRenderer.refresh();\n if (effects.stateToApply) this.applyState(effects.stateToApply);\n this.core.bodyRenderer.refreshOverlays();\n }\n\n private applyRowUpdateEffect(effects: OptionUpdateEffects): void {\n if (effects.datasourceChanged) {\n void this.core.rowModel.onDatasourceChanged();\n return;\n }\n if (!effects.needsRowRebuild) return;\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n return;\n }\n this.core.rowModel.setRowData(this.core.options.rowData);\n this.core.bodyRenderer.onDataChanged();\n }\n\n getDataAsCsv(params: CsvExportParams = {}): string {\n const cols = this.core.columnModel.getOrderedVisible().filter((c) => !c.hasCheckbox && !c.isDetailToggle);\n if (params.headersOnly) {\n return buildCsv(\n {\n getHeaderLabels: () => cols.map((c) => c.colDef.headerName ?? c.colDef.field ?? c.id),\n getRowValues: () => []\n },\n params\n );\n }\n const nodes = params.onlySelected\n ? this.core.selectionService.getSelectedNodes().slice().sort((a, b) => a.rowIndex - b.rowIndex)\n : params.onlyAllDisplayed\n ? this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup)\n : this.core.rowModel.getPipelineRows().filter((n) => !n.isDetail && !n.isGroup);\n\n return buildCsv({\n getHeaderLabels: () => cols.map((c) => c.colDef.headerName ?? c.colDef.field ?? c.id),\n getRowValues: () =>\n nodes.map((node) =>\n cols.map((c) => {\n const v = this.core.getCellValue(node, c);\n if (typeof v === \"number\") return v;\n return formatCellValue(this.core, node, c);\n })\n )\n }, params);\n }\n\n getState(): GridState {\n return {\n version: 2,\n columns: this.getColumnState(),\n sortModel: this.getSortModel(),\n filterModel: this.getFilterModel(),\n advancedFilterModel: this.getAdvancedFilterModel(),\n quickFilterText: this.getQuickFilter(),\n pagination: {\n enabled: this.paginationEnabled(),\n page: this.getPage(),\n pageSize: this.getPageSize()\n },\n selectedRowIds: this.getSelectedIds(),\n expandedRowIds: this.core.rowModel.getExpandedRowIds(),\n expandedGroupIds: this.core.rowModel.getExpandedGroupIds()\n };\n }\n\n applyState(input: GridStateInput, options: ApplyGridStateOptions = {}): void {\n if (this.core.isDestroyed()) return;\n const state = migrateGridState(input);\n if (!state) return;\n const all: readonly GridStateSection[] = [\"columns\", \"sort\", \"filter\", \"pagination\", \"selection\", \"expansion\"];\n const sections = new Set(options.sections ?? all);\n this.core.editingService.stop(true);\n\n this.restoreStateSections(state, sections);\n this.refreshAfterStateRestore(state, sections);\n if (options.emitEvents !== false) this.emitStateEvents(sections);\n }\n\n private restoreStateSections(state: GridState, sections: ReadonlySet<GridStateSection>): void {\n if (sections.has(\"columns\")) this.core.columnModel.applyColumnState(state.columns ?? []);\n if (sections.has(\"sort\")) this.core.columnModel.applySortModel(state.sortModel ?? []);\n if (sections.has(\"filter\")) {\n this.core.rowModel.setFilterModel(state.filterModel ?? {});\n this.core.rowModel.setAdvancedFilterModel(state.advancedFilterModel);\n this.core.rowModel.setQuickFilter(state.quickFilterText);\n }\n if (sections.has(\"expansion\")) {\n this.core.rowModel.restoreExpansion(state.expandedRowIds ?? [], state.expandedGroupIds ?? []);\n }\n if (sections.has(\"pagination\") && state.pagination) {\n this.core.options.paginationEnabled = state.pagination.enabled && !this.core.rowModel.isInfinite;\n this.core.rowModel.restorePagination(state.pagination.page, state.pagination.pageSize);\n this.core.paginationBar.rebuild();\n }\n }\n\n private refreshAfterStateRestore(state: GridState, sections: ReadonlySet<GridStateSection>): void {\n if (sections.has(\"columns\")) this.core.onColumnsStructureChanged();\n if (this.core.rowModel.isInfinite) {\n void this.core.rowModel.onServerParamsChanged();\n } else {\n this.core.rowModel.refreshPipeline();\n this.core.bodyRenderer.onDataChanged();\n }\n this.core.headerRenderer.refreshSortIndicators();\n this.core.headerRenderer.refreshFilterIcons();\n if (sections.has(\"selection\")) this.core.selectionService.restoreSelection(state.selectedRowIds ?? []);\n this.core.persistColumnState();\n }\n\n private emitStateEvents(sections: ReadonlySet<GridStateSection>): void {\n if (sections.has(\"sort\")) this.core.emit(\"sortChanged\", { sortModel: this.getSortModel() });\n if (sections.has(\"filter\")) this.emitFilterChanged();\n if (sections.has(\"pagination\")) {\n this.core.emit(\"paginationChanged\", {\n page: this.getPage(),\n pageSize: this.getPageSize(),\n pageCount: this.getPageCount(),\n total: this.getTotalRowCount()\n });\n }\n }\n\n getDiagnostics(): import(\"../types/api\").GridDiagnostics {\n return this.core.getDiagnostics();\n }\n\n getPerformanceSnapshot(): import(\"../types/api\").GridPerformanceSnapshot {\n return this.core.performanceMonitor.snapshot();\n }\n\n resetPerformanceMetrics(): void {\n this.core.performanceMonitor.reset();\n }\n\n setOverlay(type: \"loading\" | \"noRows\" | \"error\" | null): void {\n if (type === \"loading\") {\n this.core.skeleton.showOverlay(\n \"loading\",\n this.core.options.overlayLoadingTemplate,\n this.core.options.allowUnsafeOverlayHtml\n );\n } else if (type === \"noRows\") {\n const content = this.core.options.overlayNoRowsTemplate || this.core.buildDefaultEmptyState();\n this.core.skeleton.showOverlay(\"noRows\", content, this.core.options.allowUnsafeOverlayHtml);\n } else if (type === \"error\") {\n const content = this.core.options.overlayErrorTemplate || this.core.buildDefaultErrorState();\n this.core.skeleton.showOverlay(\"error\", content, this.core.options.allowUnsafeOverlayHtml);\n } else {\n this.core.skeleton.hideOverlay();\n }\n }\n\n hideOverlays(): void {\n this.core.skeleton.hideOverlay();\n }\n\n addEventListener<K extends import(\"../types/events\").GridEventType>(\n eventType: K,\n listener: (event: any) => void\n ): () => void {\n return this.core.eventBus.on(eventType, listener);\n }\n\n removeEventListener<K extends import(\"../types/events\").GridEventType>(\n eventType: K,\n listener: (event: any) => void\n ): void {\n this.core.eventBus.off(eventType, listener);\n }\n\n destroy(): void {\n if (this.asyncTransactionTimer != null) clearTimeout(this.asyncTransactionTimer);\n this.asyncTransactionTimer = null;\n this.asyncTransactions = [];\n const resolvers = this.asyncTransactionResolvers;\n this.asyncTransactionResolvers = [];\n for (const resolve of resolvers) resolve();\n this.core.destroy();\n }\n\n isDestroyed(): boolean {\n return this.core.isDestroyed();\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { GridSize, OverlayTemplate, ResolvedGridOptions, ThemeMode } from \"../types/options\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el } from \"../lib/dom\";\n\nconst SIZE_CLASSES: GridSize[] = [\"compact\", \"normal\", \"large\"];\ntype SkeletonContext = Pick<GridCore<any>, \"options\" | \"relayout\" | \"reportError\">;\n\nexport class GridSkeleton {\n root!: HTMLElement;\n headerEl!: HTMLElement;\n bodyEl!: HTMLElement;\n pinnedTopEl!: HTMLElement;\n pinnedBottomEl!: HTMLElement;\n headerRows: Record<PaneType, HTMLElement[]> = { left: [], center: [], right: [] };\n headerRowContainers: Record<PaneType, HTMLElement> = {} as Record<PaneType, HTMLElement>;\n bodyViewports!: Record<PaneType, HTMLElement>;\n rowContainers!: Record<PaneType, HTMLElement>;\n\n private headerPanes!: Record<PaneType, HTMLElement>;\n private bodyPanes!: Record<PaneType, HTMLElement>;\n private overlayWrapper!: HTMLElement;\n private overlayContent!: HTMLElement;\n private infiniteLoadingEl!: HTMLElement;\n private infiniteLoadingText!: HTMLElement;\n private currentOverlay: \"loading\" | \"noRows\" | \"error\" | null = null;\n private currentOverlayContent: OverlayTemplate | null = null;\n private currentOverlayAllowsHtml = false;\n private overlayCleanup: (() => void) | null = null;\n private customClassTokens: string[] = [];\n private resizeObserver: ResizeObserver | null = null;\n private headerDepth = 1;\n\n constructor(private core: SkeletonContext) {}\n\n init(container: HTMLElement, options: ResolvedGridOptions): void {\n const classes = [\"mach-root\", `mach-size--${options.size}`];\n if (options.stripedRows) classes.push(\"mach-striped\");\n if (options.showCellBorders) classes.push(\"mach-cell-borders\");\n if (options.domLayout === \"autoHeight\") classes.push(\"mach-dom-layout--auto-height\");\n this.root = el(\"div\", classes.join(\" \"));\n this.setCustomClass(options.className);\n this.root.style.setProperty(\"--mach-row-h\", `${options.rowHeight}px`);\n this.root.style.setProperty(\"--mach-header-h\", `${options.headerHeight}px`);\n this.root.setAttribute(\"role\", \"grid\");\n this.root.tabIndex = 0;\n this.applyAriaLabels(options);\n\n this.headerEl = el(\"div\", \"mach-header\");\n this.headerEl.setAttribute(\"role\", \"rowgroup\");\n this.headerRows = { left: [], center: [], right: [] };\n this.headerPanes = {} as Record<PaneType, HTMLElement>;\n this.headerRowContainers = {} as Record<PaneType, HTMLElement>;\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const paneEl = el(\"div\", `mach-pane mach-pane--${pane} mach-header-pane`);\n const rowsContainer = el(\"div\", \"mach-header-rows\");\n if (pane === \"center\") {\n const viewport = el(\"div\", \"mach-header-viewport\");\n viewport.appendChild(rowsContainer);\n paneEl.appendChild(viewport);\n } else {\n paneEl.appendChild(rowsContainer);\n }\n this.headerEl.appendChild(paneEl);\n this.headerPanes[pane] = paneEl;\n this.headerRowContainers[pane] = rowsContainer;\n }\n\n this.setHeaderRowCount(1);\n\n this.bodyEl = el(\"div\", \"mach-body\");\n this.pinnedTopEl = el(\"div\", \"mach-pinned-rows mach-pinned-rows--top\");\n this.pinnedTopEl.style.display = \"none\";\n this.pinnedBottomEl = el(\"div\", \"mach-pinned-rows mach-pinned-rows--bottom\");\n this.pinnedBottomEl.style.display = \"none\";\n this.bodyViewports = {} as Record<PaneType, HTMLElement>;\n this.rowContainers = {} as Record<PaneType, HTMLElement>;\n this.bodyPanes = {} as Record<PaneType, HTMLElement>;\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const paneEl = el(\"div\", `mach-pane mach-pane--${pane} mach-body-pane`);\n const viewport = el(\"div\", `mach-body-viewport${pane === \"center\" ? \" mach-body-viewport--scroll\" : \"\"}`);\n const container = el(\"div\", \"mach-row-container\");\n viewport.appendChild(container);\n paneEl.appendChild(viewport);\n this.bodyEl.appendChild(paneEl);\n this.bodyPanes[pane] = paneEl;\n this.bodyViewports[pane] = viewport;\n this.rowContainers[pane] = container;\n }\n\n this.overlayWrapper = el(\"div\", \"mach-overlay\");\n this.overlayWrapper.style.display = \"none\";\n this.overlayWrapper.setAttribute(\"role\", \"status\");\n this.overlayWrapper.setAttribute(\"aria-live\", \"polite\");\n this.overlayContent = el(\"div\", \"mach-overlay-content\");\n this.overlayWrapper.appendChild(this.overlayContent);\n\n this.infiniteLoadingEl = el(\"div\", \"mach-infinite-loading\");\n this.infiniteLoadingEl.style.display = \"none\";\n this.infiniteLoadingEl.appendChild(el(\"div\", \"mach-spinner\"));\n this.infiniteLoadingText = el(\"span\");\n this.infiniteLoadingEl.appendChild(this.infiniteLoadingText);\n\n this.root.append(\n this.headerEl,\n this.pinnedTopEl,\n this.bodyEl,\n this.pinnedBottomEl,\n this.overlayWrapper,\n this.infiniteLoadingEl\n );\n container.appendChild(this.root);\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.core.relayout());\n this.resizeObserver.observe(this.root);\n }\n\n this.applyTheme(options.theme);\n }\n\n applyAriaLabels(options: Pick<ResolvedGridOptions, \"ariaLabel\" | \"ariaLabelledBy\" | \"ariaDescribedBy\">): void {\n if (options.ariaLabelledBy) {\n this.root.setAttribute(\"aria-labelledby\", options.ariaLabelledBy);\n this.root.removeAttribute(\"aria-label\");\n } else {\n this.root.removeAttribute(\"aria-labelledby\");\n this.root.setAttribute(\"aria-label\", options.ariaLabel);\n }\n if (options.ariaDescribedBy) this.root.setAttribute(\"aria-describedby\", options.ariaDescribedBy);\n else this.root.removeAttribute(\"aria-describedby\");\n }\n\n setHeaderRowCount(depth: number): void {\n this.headerDepth = depth;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const container = this.headerRowContainers[pane];\n const rows = this.headerRows[pane];\n while (rows.length < depth) {\n const row = el(\"div\", \"mach-header-row\");\n row.setAttribute(\"role\", \"row\");\n row.setAttribute(\"aria-rowindex\", String(rows.length + 1));\n row.style.top = `${rows.length * this.core.options.headerHeight}px`;\n row.style.height = `${this.core.options.headerHeight}px`;\n container.appendChild(row);\n rows.push(row);\n }\n while (rows.length > depth) {\n rows.pop()!.remove();\n }\n }\n this.applyHeaderHeight();\n }\n\n getHeaderRowCount(): number {\n return this.headerDepth;\n }\n\n private applyHeaderHeight(): void {\n this.headerEl.style.height = `${this.headerDepth * this.core.options.headerHeight}px`;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.headerRows[pane];\n rows.forEach((row, i) => {\n row.style.top = `${i * this.core.options.headerHeight}px`;\n row.style.height = `${this.core.options.headerHeight}px`;\n });\n }\n }\n\n setPaneWidths(left: number, right: number): void {\n this.applyPaneWidth(\"left\", left);\n this.applyPaneWidth(\"right\", right);\n }\n\n private applyPaneWidth(pane: PaneType, width: number): void {\n const hp = this.headerPanes[pane];\n const bp = this.bodyPanes[pane];\n hp.style.width = `${width}px`;\n bp.style.width = `${width}px`;\n const hidden = width <= 0;\n hp.classList.toggle(\"mach-pane--hidden\", hidden);\n bp.classList.toggle(\"mach-pane--hidden\", hidden);\n }\n\n measureViewportWidth(): number {\n return this.bodyViewports.center.clientWidth;\n }\n\n updateHeights(rowHeight: number, headerHeight: number): void {\n this.root.style.setProperty(\"--mach-row-h\", `${rowHeight}px`);\n this.root.style.setProperty(\"--mach-header-h\", `${headerHeight}px`);\n this.applyHeaderHeight();\n }\n\n applySize(size: GridSize): void {\n for (const s of SIZE_CLASSES) {\n this.root.classList.toggle(`mach-size--${s}`, s === size);\n }\n }\n\n private themeUnsub: (() => void) | null = null;\n\n applyTheme(theme: ThemeMode): void {\n if (!this.root) return;\n this.themeUnsub?.();\n this.themeUnsub = null;\n const dark = theme === \"dark\" || (theme === \"auto\" && this.systemPrefersDark());\n this.root.classList.toggle(\"mach-theme-dark\", dark);\n\n if (theme === \"auto\" && typeof window !== \"undefined\" && typeof window.matchMedia === \"function\") {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handler = () => this.root.classList.toggle(\"mach-theme-dark\", mq.matches);\n if (typeof mq.addEventListener === \"function\") {\n mq.addEventListener(\"change\", handler);\n this.themeUnsub = () => mq.removeEventListener(\"change\", handler);\n } else if (typeof mq.addListener === \"function\") {\n mq.addListener(handler);\n this.themeUnsub = () => mq.removeListener(handler);\n }\n }\n }\n\n private systemPrefersDark(): boolean {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return false;\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n }\n\n setStriped(on: boolean): void {\n this.root.classList.toggle(\"mach-striped\", on);\n }\n\n setCellBorders(on: boolean): void {\n this.root.classList.toggle(\"mach-cell-borders\", on);\n }\n\n applyDomLayout(layout: import(\"../types/options\").DomLayoutMode): void {\n this.root.classList.toggle(\"mach-dom-layout--auto-height\", layout === \"autoHeight\");\n }\n\n setCustomClass(className: string | null | undefined): void {\n for (const token of this.customClassTokens) this.root.classList.remove(token);\n this.customClassTokens = [];\n for (const token of String(className ?? \"\").split(/\\s+/).filter(Boolean)) {\n if (this.root.classList.contains(token)) continue;\n this.root.classList.add(token);\n this.customClassTokens.push(token);\n }\n }\n\n showOverlay(type: \"loading\" | \"noRows\" | \"error\", content: OverlayTemplate, allowUnsafeHtml = false): void {\n if (\n this.currentOverlay === type &&\n this.currentOverlayContent === content &&\n this.currentOverlayAllowsHtml === allowUnsafeHtml\n ) return;\n this.currentOverlay = type;\n this.currentOverlayContent = content;\n this.currentOverlayAllowsHtml = allowUnsafeHtml;\n this.cleanupOverlayContent();\n this.overlayContent.replaceChildren();\n\n let resolved: import(\"../types/options\").OverlayContent;\n try {\n resolved = typeof content === \"function\" ? content() : content;\n } catch (error) {\n this.core.reportError(error, \"overlayTemplate\");\n resolved = \"\";\n }\n\n if (typeof resolved === \"object\" && resolved != null && \"el\" in resolved) {\n this.overlayContent.appendChild(resolved.el);\n this.overlayCleanup = resolved.destroy ?? null;\n } else if (resolved instanceof HTMLElement) {\n this.overlayContent.appendChild(resolved);\n } else if (resolved && allowUnsafeHtml) {\n this.overlayContent.innerHTML = resolved;\n } else if (resolved) {\n this.overlayContent.textContent = resolved;\n } else if (type === \"loading\") {\n const spinner = el(\"div\", \"mach-spinner\");\n spinner.setAttribute(\"aria-label\", \"loading\");\n this.overlayContent.appendChild(spinner);\n }\n this.overlayWrapper.style.display = \"\";\n this.applyOverlayRole(type);\n this.root.setAttribute(\"aria-busy\", type === \"loading\" ? \"true\" : \"false\");\n }\n\n hideOverlay(): void {\n if (!this.currentOverlay) return;\n this.currentOverlay = null;\n this.currentOverlayContent = null;\n this.currentOverlayAllowsHtml = false;\n this.overlayWrapper.style.display = \"none\";\n this.cleanupOverlayContent();\n this.overlayContent.replaceChildren();\n this.root.setAttribute(\"aria-busy\", \"false\");\n }\n\n private applyOverlayRole(type: \"loading\" | \"noRows\" | \"error\"): void {\n this.overlayWrapper.setAttribute(\"role\", type === \"error\" ? \"alert\" : \"status\");\n }\n\n setInfiniteLoading(active: boolean, text: string): void {\n if (!this.infiniteLoadingEl) return;\n if (active) {\n if (this.infiniteLoadingText.textContent !== text) this.infiniteLoadingText.textContent = text;\n this.infiniteLoadingEl.style.display = \"\";\n this.root.setAttribute(\"aria-busy\", \"true\");\n } else {\n this.infiniteLoadingEl.style.display = \"none\";\n if (this.currentOverlay !== \"loading\") this.root.setAttribute(\"aria-busy\", \"false\");\n }\n }\n\n destroy(): void {\n this.themeUnsub?.();\n this.themeUnsub = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.cleanupOverlayContent();\n this.root.remove();\n }\n\n private cleanupOverlayContent(): void {\n if (!this.overlayCleanup) return;\n const cleanup = this.overlayCleanup;\n this.overlayCleanup = null;\n try {\n cleanup();\n } catch (error) {\n this.core.reportError(error, \"overlayTemplate.destroy\");\n }\n }\n\n}\n","import type { ColumnFilter } from \"../types/colDef\";\n\nconst MATCH_LABELS: Record<string, string> = {\n contains: \"包含\",\n notContains: \"不包含\",\n equals: \"=\",\n notEquals: \"≠\",\n startsWith: \"开头\",\n endsWith: \"结尾\",\n blank: \"为空\",\n notBlank: \"非空\",\n lessThan: \"<\",\n lessThanOrEqual: \"≤\",\n greaterThan: \">\",\n greaterThanOrEqual: \"≥\",\n inRange: \"范围\"\n};\n\nexport function describeFilter(filter: ColumnFilter): string {\n if (!filter) return \"\";\n if (filter.type === \"set\") {\n const count = filter.values.length;\n return `已选 ${count} 项`;\n }\n const parts: string[] = [];\n for (const condition of filter.conditions) {\n const label = MATCH_LABELS[condition.match] ?? condition.match;\n const value = condition.value;\n const value2 = \"value2\" in condition ? condition.value2 : undefined;\n if (condition.match === \"blank\" || condition.match === \"notBlank\") {\n parts.push(label);\n } else if (condition.match === \"inRange\" && value != null) {\n parts.push(`${label} ${value}~${value2 ?? value}`);\n } else if (value != null && String(value) !== \"\") {\n parts.push(`${label} ${value}`);\n } else {\n parts.push(label);\n }\n }\n const operator = filter.operator === \"or\" ? \" 或 \" : \" 且 \";\n return parts.join(operator);\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { Column } from \"../services/column\";\nimport { ColumnGroup } from \"../services/columnGroup\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el, FILTER_ICON, SORT_ASC_ICON, SORT_DESC_ICON } from \"../lib/dom\";\nimport { describeFilter } from \"../lib/filterSummary\";\nimport { setHeaderDestroyer, takeHeaderDestroyer } from \"./runtimeState\";\n\ntype HeaderContext = Pick<\n GridCore<any>,\n | \"columnDragService\"\n | \"columnMenu\"\n | \"columnModel\"\n | \"commitColumnWidths\"\n | \"cycleSort\"\n | \"emit\"\n | \"filterPopup\"\n | \"getApi\"\n | \"isDestroyed\"\n | \"moveColumn\"\n | \"options\"\n | \"relayoutColumns\"\n | \"reportError\"\n | \"resizeService\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n>;\n\ninterface HeaderCell {\n column: Column;\n el: HTMLElement;\n sortEl: HTMLElement;\n filterBtn?: HTMLButtonElement;\n filterTagEl?: HTMLElement;\n selectAllEl?: HTMLInputElement;\n}\n\ninterface GroupCell {\n group: ColumnGroup<any>;\n el: HTMLElement;\n}\n\ninterface PaneTree {\n column?: Column;\n group?: ColumnGroup<any>;\n level: number;\n children: PaneTree[];\n}\n\nexport class HeaderRenderer {\n private leafCells: HeaderCell[] = [];\n private groupCells: GroupCell[] = [];\n private paneTrees: Record<PaneType, PaneTree[]> = { left: [], center: [], right: [] };\n\n constructor(private core: HeaderContext) {}\n\n build(): void {\n this.core.resizeService.cancelResize();\n for (const cell of this.leafCells) {\n const destroy = takeHeaderDestroyer(cell.el);\n if (destroy) {\n try {\n destroy();\n } catch (error) {\n this.core.reportError(error, \"headerComponent.destroy\", { colId: cell.column.id });\n }\n }\n }\n this.leafCells = [];\n this.groupCells = [];\n const depth = this.core.columnModel.getHeaderDepth();\n this.core.skeleton.setHeaderRowCount(depth);\n\n const paneOf = (col: Column): PaneType =>\n col.pinned === \"left\" ? \"left\" : col.pinned === \"right\" ? \"right\" : \"center\";\n\n const buildTree = (\n children: (ColumnGroup<any> | Column<any>)[],\n level: number,\n pane: PaneType\n ): PaneTree[] => {\n const out: PaneTree[] = [];\n for (const child of children) {\n if (child instanceof ColumnGroup) {\n const subtree = buildTree(child.children, level + 1, pane);\n if (subtree.length > 0) out.push({ group: child, level, children: subtree });\n } else {\n if (!child.hide && paneOf(child) === pane) {\n out.push({ column: child, level, children: [] });\n }\n }\n }\n return out;\n };\n\n const roots = this.core.columnModel.getRootChildren();\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n this.paneTrees[pane] = buildTree(roots, 0, pane);\n }\n\n const perRowHeight = this.core.options.headerHeight;\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.core.skeleton.headerRows[pane];\n for (const row of rows) row.textContent = \"\";\n const appendCell = (tree: PaneTree) => {\n const row = rows[Math.min(tree.level, rows.length - 1)];\n if (tree.column) {\n const cell = this.createLeafCell(tree.column, depth - tree.level, perRowHeight);\n row.appendChild(cell.el);\n this.leafCells.push(cell);\n } else if (tree.group) {\n const cell = this.createGroupCell(tree.group);\n row.appendChild(cell);\n this.groupCells.push({ group: tree.group, el: cell });\n }\n for (const child of tree.children) appendCell(child);\n };\n for (const tree of this.paneTrees[pane]) appendCell(tree);\n }\n\n if (!this.core.options.suppressHeaderFocus) {\n this.leafCells.forEach((cell, index) => {\n cell.el.tabIndex = index === 0 ? 0 : -1;\n });\n }\n\n this.applyLayout();\n this.refreshSortIndicators();\n this.refreshFilterIcons();\n this.refreshSelectAllCheckbox();\n }\n\n private createLeafCell(column: Column, rowSpan: number, perRowHeight: number): HeaderCell {\n const colDef = column.colDef;\n const cellEl = el(\"div\", \"mach-header-cell mach-header-cell--leaf\");\n cellEl.dataset.colId = column.id;\n cellEl.setAttribute(\"role\", \"columnheader\");\n cellEl.style.height = `${rowSpan * perRowHeight}px`;\n\n if (typeof colDef.headerClass === \"string\") cellEl.classList.add(colDef.headerClass);\n else if (Array.isArray(colDef.headerClass)) cellEl.classList.add(...colDef.headerClass);\n if (colDef.headerTooltip) cellEl.setAttribute(\"title\", colDef.headerTooltip);\n\n const headerAlign = colDef.headerAlign ?? colDef.align;\n if (headerAlign === \"center\") cellEl.classList.add(\"mach-header-cell--center\");\n else if (headerAlign === \"right\") cellEl.classList.add(\"mach-header-cell--right\");\n\n if (!this.core.options.suppressHeaderFocus) {\n cellEl.tabIndex = -1;\n cellEl.addEventListener(\"mousedown\", () => this.focusHeaderCell(column));\n cellEl.addEventListener(\"keydown\", (e: KeyboardEvent) => this.onHeaderKeyDown(e, column));\n }\n\n let selectAllEl: HTMLInputElement | undefined;\n if (column.hasCheckbox && this.core.options.rowSelection === \"multiple\") {\n selectAllEl = document.createElement(\"input\");\n selectAllEl.type = \"checkbox\";\n selectAllEl.className = \"mach-select-all\";\n selectAllEl.setAttribute(\"aria-label\", \"select all rows\");\n selectAllEl.addEventListener(\"click\", (e) => e.stopPropagation());\n selectAllEl.addEventListener(\"change\", () => {\n if (selectAllEl!.checked) this.core.selectionService.selectAll(true);\n else this.core.selectionService.deselectAll();\n });\n cellEl.appendChild(selectAllEl);\n }\n\n const headerComponent = colDef.headerComponent;\n if (headerComponent) {\n let out: string | HTMLElement | { el: HTMLElement; destroy?: () => void } | null | undefined;\n try {\n out = headerComponent({ colDef, column, api: this.core.getApi() });\n } catch (err) {\n this.core.reportError(err, \"headerComponent\", { colId: column.id });\n out = null;\n }\n if (typeof out === \"string\") {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = out;\n cellEl.appendChild(labelEl);\n } else if (out instanceof HTMLElement) {\n const wrapper = el(\"span\", \"mach-header-label mach-header-label--custom\");\n wrapper.appendChild(out);\n cellEl.appendChild(wrapper);\n } else if (out && typeof out === \"object\" && out.el instanceof HTMLElement) {\n const wrapper = el(\"span\", \"mach-header-label mach-header-label--custom\");\n wrapper.appendChild(out.el);\n cellEl.appendChild(wrapper);\n setHeaderDestroyer(cellEl, out.destroy);\n } else {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = colDef.headerName ?? colDef.field ?? column.id;\n cellEl.appendChild(labelEl);\n }\n } else {\n const labelEl = el(\"span\", \"mach-header-label\");\n labelEl.textContent = colDef.headerName ?? colDef.field ?? column.id;\n cellEl.appendChild(labelEl);\n }\n\n const sortEl = el(\"span\", \"mach-sort-indicator\");\n cellEl.appendChild(sortEl);\n\n let filterBtn: HTMLButtonElement | undefined;\n let filterTagEl: HTMLElement | undefined;\n if (column.filterable) {\n filterBtn = document.createElement(\"button\");\n filterBtn.type = \"button\";\n filterBtn.className = \"mach-filter-btn\";\n filterBtn.setAttribute(\"aria-label\", `filter ${column.id}`);\n filterBtn.innerHTML = FILTER_ICON;\n filterBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.core.filterPopup.toggle(column, filterBtn!);\n });\n cellEl.appendChild(filterBtn);\n filterTagEl = el(\"span\", \"mach-filter-tag\");\n cellEl.appendChild(filterTagEl);\n }\n\n if (this.core.options.columnMenu) {\n const menuBtn = document.createElement(\"button\");\n menuBtn.type = \"button\";\n menuBtn.className = \"mach-menu-btn\";\n menuBtn.setAttribute(\"aria-label\", \"column menu\");\n menuBtn.textContent = \"⋯\";\n menuBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.core.columnMenu.toggle(column, menuBtn);\n });\n cellEl.appendChild(menuBtn);\n }\n\n if (this.canResizeColumn(column)) {\n const resizeEl = el(\"div\", \"mach-header-resize\");\n resizeEl.setAttribute(\"aria-hidden\", \"true\");\n resizeEl.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n this.core.resizeService.startResize(e, column);\n });\n resizeEl.addEventListener(\"dblclick\", (e) => {\n e.stopPropagation();\n this.core.getApi().autoSizeColumn(column.id);\n });\n resizeEl.addEventListener(\"click\", (e) => e.stopPropagation());\n cellEl.appendChild(resizeEl);\n }\n\n cellEl.addEventListener(\"click\", (e) => {\n if (this.core.columnDragService.didDrag()) return;\n const target = e.target as HTMLElement;\n if (target.closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n if (column.sortable) this.core.cycleSort(column, e.shiftKey);\n });\n\n cellEl.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (target.closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n this.core.columnDragService.onPointerDown(e, column);\n });\n\n return { column, el: cellEl, sortEl, filterBtn, filterTagEl, selectAllEl };\n }\n\n private createGroupCell(group: ColumnGroup<any>): HTMLElement {\n const cellEl = el(\"div\", \"mach-header-cell mach-header-cell--group\");\n if (group.groupId) cellEl.dataset.groupId = group.groupId;\n cellEl.setAttribute(\"role\", \"columnheader\");\n const def = group.def;\n if (typeof def.headerClass === \"string\") cellEl.classList.add(def.headerClass);\n else if (Array.isArray(def.headerClass)) cellEl.classList.add(...def.headerClass);\n const labelEl = el(\"span\", \"mach-header-label mach-header-label--group\");\n labelEl.textContent = group.headerName;\n cellEl.appendChild(labelEl);\n return cellEl;\n }\n\n applyLayout(): void {\n let flatIndex = 1;\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const rows = this.core.skeleton.headerRows[pane];\n let x = 0;\n const leafLefts = new Map<string, number>();\n for (const cell of this.leafCells) {\n if (this.core.columnModel.paneOf(cell.column) !== pane) continue;\n leafLefts.set(cell.column.id, x);\n x += cell.column.currentWidth;\n }\n const perRowHeight = this.core.options.headerHeight;\n for (const cell of this.leafCells) {\n if (this.core.columnModel.paneOf(cell.column) !== pane) continue;\n const left = leafLefts.get(cell.column.id) ?? 0;\n cell.el.style.width = `${cell.column.currentWidth}px`;\n cell.el.style.left = `${left}px`;\n cell.el.setAttribute(\"aria-colindex\", String(flatIndex++));\n }\n\n for (const gc of this.groupCells) {\n const leaves = this.visiblePaneLeaves(gc.group, pane);\n if (leaves.length === 0) continue;\n const left = leafLefts.get(leaves[0].id) ?? 0;\n let width = 0;\n for (const leaf of leaves) width += leaf.currentWidth;\n gc.el.style.left = `${left}px`;\n gc.el.style.width = `${width}px`;\n gc.el.style.height = `${perRowHeight}px`;\n gc.el.setAttribute(\"aria-colspan\", String(leaves.length));\n }\n\n for (const row of rows) row.style.width = `${x}px`;\n widths[pane] = x;\n }\n this.core.skeleton.setPaneWidths(widths.left, widths.right);\n }\n\n private visiblePaneLeaves(group: ColumnGroup<any>, pane: PaneType): Column[] {\n return group\n .getLeafColumns()\n .filter((c) => !c.hide && this.core.columnModel.paneOf(c) === pane);\n }\n\n private onHeaderKeyDown(e: KeyboardEvent, column: Column): void {\n if (this.core.isDestroyed()) return;\n const resize = (delta: number): void => {\n const next = Math.max(\n column.colDef.minWidth ?? 40,\n column.currentWidth + delta\n );\n this.core.columnModel.setColumnWidth(column, next);\n this.core.relayoutColumns();\n this.core.commitColumnWidths([column]);\n e.preventDefault();\n };\n\n switch (true) {\n case e.key === \"Enter\" || e.key === \" \":\n if ((e.target as HTMLElement).closest(\".mach-header-resize, .mach-filter-btn, .mach-select-all\")) return;\n e.preventDefault();\n if (column.sortable) this.core.cycleSort(column, e.shiftKey);\n return;\n case e.altKey && (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\"):\n if (!this.canResizeColumn(column)) return;\n resize(e.key === \"ArrowRight\" ? 24 : -24);\n return;\n case e.ctrlKey && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\"):\n if (!column.movable) return;\n e.preventDefault(); {\n const pane = this.core.columnModel.paneOf(column);\n const siblings = this.core.columnModel.getPaneColumns(pane);\n const from = siblings.indexOf(column);\n const to = e.key === \"ArrowRight\" ? Math.min(siblings.length - 1, from + 1) : Math.max(0, from - 1);\n if (to !== from) this.core.moveColumn(column.id, to);\n }\n return;\n case !e.altKey && !e.ctrlKey && !e.metaKey && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\"):\n e.preventDefault(); {\n const current = this.leafCells.findIndex((cell) => cell.column.id === column.id);\n const next = e.key === \"ArrowRight\"\n ? Math.min(this.leafCells.length - 1, current + 1)\n : Math.max(0, current - 1);\n if (current >= 0) this.focusHeaderCell(this.leafCells[next].column);\n }\n return;\n case e.key === \"Home\" || e.key === \"End\":\n e.preventDefault();\n if (this.leafCells.length > 0) {\n this.focusHeaderCell(e.key === \"Home\" ? this.leafCells[0].column : this.leafCells[this.leafCells.length - 1].column);\n }\n return;\n }\n }\n\n private focusHeaderCell(column: Column): void {\n const target = this.leafCells.find((cell) => cell.column.id === column.id);\n if (!target) return;\n for (const cell of this.leafCells) cell.el.tabIndex = cell === target ? 0 : -1;\n target.el.focus({ preventScroll: true });\n }\n\n private canResizeColumn(column: Column): boolean {\n return this.core.options.enableColumnResize && column.resizable;\n }\n\n refreshSortIndicators(): void {\n const model = this.core.columnModel.getSortModel();\n const multi = model.length > 1;\n for (const hc of this.leafCells) {\n const idx = model.findIndex((s) => s.colId === hc.column.id);\n if (idx >= 0) {\n const dir = model[idx].direction;\n const badge = multi ? `<span class=\"mach-sort-badge\">${idx + 1}</span>` : \"\";\n hc.sortEl.innerHTML = (dir === \"asc\" ? SORT_ASC_ICON : SORT_DESC_ICON) + badge;\n hc.el.setAttribute(\"aria-sort\", dir === \"asc\" ? \"ascending\" : \"descending\");\n hc.el.classList.add(\"mach-header-cell--sorted\");\n } else {\n hc.sortEl.innerHTML = \"\";\n hc.el.removeAttribute(\"aria-sort\");\n hc.el.classList.remove(\"mach-header-cell--sorted\");\n }\n }\n }\n\n refreshFilterIcons(): void {\n const fm = this.core.rowModel.getFilterModel();\n for (const hc of this.leafCells) {\n if (!hc.filterBtn) continue;\n const filter = fm[hc.column.id];\n const active = filter != null;\n hc.filterBtn.classList.toggle(\"mach-filter-btn--active\", active);\n if (hc.filterTagEl) {\n const summary = active ? describeFilter(filter) : \"\";\n hc.filterTagEl.style.display = summary ? \"\" : \"none\";\n if (summary) hc.filterTagEl.textContent = summary;\n }\n }\n }\n\n refreshSelectAllCheckbox(): void {\n for (const hc of this.leafCells) {\n if (!hc.selectAllEl) continue;\n hc.selectAllEl.checked = this.core.selectionService.isSelectAllActive();\n hc.selectAllEl.indeterminate = this.core.selectionService.isSelectAllIndeterminate();\n }\n }\n\n destroy(): void {\n for (const cell of this.leafCells) {\n const destroy = takeHeaderDestroyer(cell.el);\n if (!destroy) continue;\n try {\n destroy();\n } catch (error) {\n console.error(\"[mach-table] headerComponent destroy error\", error);\n }\n }\n this.leafCells = [];\n this.groupCells = [];\n }\n}\n","export interface GridPoint {\n row: number;\n colIdx: number;\n}\n\nexport interface NormalizedRange {\n r1: number;\n c1: number;\n r2: number;\n c2: number;\n}\n\n/** Pure state model for range selection; DOM painting stays in BodyRenderer. */\nexport class RangeSelectionModel {\n private anchor: GridPoint | null = null;\n private end: GridPoint | null = null;\n private cache: NormalizedRange | null | false = false;\n private cacheRowCount = -1;\n private cacheColCount = -1;\n\n getAnchor(): GridPoint | null {\n return this.anchor;\n }\n\n getEnd(): GridPoint | null {\n return this.end;\n }\n\n hasAnchor(): boolean {\n return this.anchor != null;\n }\n\n start(point: GridPoint, extend: boolean): void {\n if (!extend || !this.anchor) this.anchor = { ...point };\n this.end = { ...point };\n this.invalidate();\n }\n\n ensureAnchor(point: GridPoint): boolean {\n if (this.anchor) return true;\n if (point.colIdx < 0) return false;\n this.anchor = { ...point };\n this.invalidate();\n return true;\n }\n\n setEnd(point: GridPoint): void {\n this.end = { ...point };\n this.invalidate();\n }\n\n clear(): void {\n this.anchor = null;\n this.end = null;\n this.invalidate();\n }\n\n invalidate(): void {\n this.cache = false;\n this.cacheRowCount = -1;\n this.cacheColCount = -1;\n }\n\n normalize(rowCount: number, colCount: number): NormalizedRange | null {\n if (\n this.cache !== false &&\n this.cacheRowCount === rowCount &&\n this.cacheColCount === colCount\n ) return this.cache;\n this.cacheRowCount = rowCount;\n this.cacheColCount = colCount;\n if (!this.anchor || !this.end || rowCount <= 0 || colCount <= 0) {\n this.cache = null;\n return null;\n }\n this.cache = {\n r1: Math.max(0, Math.min(this.anchor.row, this.end.row, rowCount - 1)),\n r2: Math.max(0, Math.min(Math.max(this.anchor.row, this.end.row), rowCount - 1)),\n c1: Math.max(0, Math.min(this.anchor.colIdx, this.end.colIdx, colCount - 1)),\n c2: Math.max(0, Math.min(Math.max(this.anchor.colIdx, this.end.colIdx), colCount - 1))\n };\n return this.cache;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport type { RowNode } from \"../types/row\";\n\ntype RowDragContext = Pick<GridCore<any>, \"emit\" | \"options\" | \"rowModel\" | \"skeleton\">;\n\ninterface RowDragState {\n node: RowNode<any>;\n startY: number;\n indicator: HTMLElement;\n targetIndex: number;\n active: boolean;\n}\n\n/** Owns row-drag global listeners, indicator DOM and completion semantics. */\nexport class RowDragController {\n private state: RowDragState | null = null;\n\n constructor(\n private core: RowDragContext,\n private getPositions: () => Float64Array\n ) {}\n\n start(event: PointerEvent, node: RowNode<any>): void {\n this.destroy();\n const indicator = el(\"div\", \"mach-row-drop-indicator\");\n this.core.skeleton.rowContainers.center.appendChild(indicator);\n this.state = {\n node,\n startY: event.clientY,\n indicator,\n targetIndex: -1,\n active: false\n };\n window.addEventListener(\"pointermove\", this.onMove);\n window.addEventListener(\"pointerup\", this.onUp);\n window.addEventListener(\"pointercancel\", this.onUp);\n }\n\n private onMove = (event: PointerEvent): void => {\n const drag = this.state;\n if (!drag) return;\n if (!drag.active) {\n if (Math.abs(event.clientY - drag.startY) < 5) return;\n drag.active = true;\n this.core.skeleton.root.classList.add(\"mach-root--row-dragging\");\n }\n\n const container = this.core.skeleton.rowContainers.center;\n const y = event.clientY - container.getBoundingClientRect().top;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const positions = this.getPositions();\n let targetIndex = rowCount;\n let indicatorY = positions[rowCount] ?? 0;\n for (let index = 0; index < rowCount; index++) {\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node || node.isDetail || node.isGroup) continue;\n const top = positions[index];\n const bottom = positions[index + 1];\n if (y < top + (bottom - top) / 2) {\n targetIndex = index;\n indicatorY = top;\n break;\n }\n }\n drag.targetIndex = targetIndex;\n drag.indicator.style.top = `${indicatorY}px`;\n };\n\n private onUp = (): void => {\n const drag = this.takeState();\n if (!drag || !drag.active || drag.targetIndex < 0) return;\n const from = drag.node.rowIndex;\n const to = Math.max(0, Math.min(drag.targetIndex, this.core.rowModel.getDisplayedRowCount()));\n if (from === to || from === to - 1) return;\n this.core.emit(\"rowDragEnd\", { rowNode: drag.node, fromIndex: from, toIndex: to });\n if (this.core.options.applyRowDrag && !this.core.rowModel.isTree) {\n this.core.rowModel.reorderRowsByDisplayed(from, to > from ? to - 1 : to);\n }\n };\n\n private takeState(): RowDragState | null {\n const drag = this.state;\n this.state = null;\n this.detachListeners();\n drag?.indicator.remove();\n return drag;\n }\n\n private detachListeners(): void {\n window.removeEventListener(\"pointermove\", this.onMove);\n window.removeEventListener(\"pointerup\", this.onUp);\n window.removeEventListener(\"pointercancel\", this.onUp);\n this.core.skeleton.root.classList.remove(\"mach-root--row-dragging\");\n }\n\n destroy(): void {\n this.takeState();\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport type { Column } from \"../services/column\";\nimport { hasColumnType } from \"../core/resolveOptions\";\nimport type { RowNode } from \"../types/row\";\nimport { RangeSelectionModel, type NormalizedRange } from \"../services/rangeSelectionModel\";\nimport { RowDragController } from \"../services/rowDragController\";\nimport { el, clamp } from \"../lib/dom\";\nimport { renderCellContent, cleanupCellContent, applyCellClasses, applyCellStyle, formatCellValue, formatCellValueWith, defaultFormat } from \"./cellContent\";\nimport {\n getCellRuntimeState,\n setDetailDestroyer,\n takeDetailDestroyer\n} from \"./runtimeState\";\n\nconst PANES: PaneType[] = [\"left\", \"center\", \"right\"];\ntype BodyContext = Pick<\n GridCore<any>,\n | \"buildDefaultEmptyState\"\n | \"buildDefaultErrorState\"\n | \"columnModel\"\n | \"contextMenuService\"\n | \"editingService\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"gridId\"\n | \"isDestroyed\"\n | \"options\"\n | \"performanceMonitor\"\n | \"pinnedRowsRenderer\"\n | \"reportError\"\n | \"resolveCellRenderer\"\n | \"rowModel\"\n | \"selectionService\"\n | \"setCellValue\"\n | \"skeleton\"\n | \"summaryRenderer\"\n | \"toggleDetail\"\n | \"tooltipService\"\n | \"undoService\"\n>;\n\ninterface RowSlot {\n index: number;\n nodeId: string;\n kind: \"master\" | \"detail\";\n rows: Partial<Record<PaneType, HTMLElement>>;\n cells: Partial<Record<PaneType, HTMLElement[]>>;\n cellColIds: Partial<Record<PaneType, string[]>>;\n detailRow?: HTMLElement;\n}\n\ntype CellRenderKind = \"standard\" | \"group\" | \"detail\" | \"checkbox\" | \"drag\" | \"index\" | \"tree\";\n\nexport interface FocusedCell {\n rowIndex: number;\n colId: string;\n}\n\nfunction lowerBound(positions: Float64Array, y: number, count: number): number {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (positions[mid + 1] <= y) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nexport class BodyRenderer {\n private pool: RowSlot[] = [];\n private poolSize = 0;\n private first = 0;\n private lastExcl = -1;\n private rafId = 0;\n private hoverIndex = -1;\n private positions = new Float64Array(1);\n private rangeSelection = new RangeSelectionModel();\n private rangeDragging = false;\n private colFirst = 0;\n private colLastExcl = Number.MAX_SAFE_INTEGER;\n focusedCell: FocusedCell | null = null;\n private rowDragController: RowDragController;\n\n constructor(private core: BodyContext) {\n this.rowDragController = new RowDragController(core, () => this.positions);\n }\n\n init(): void {\n const viewport = this.core.skeleton.bodyViewports.center;\n viewport.addEventListener(\"scroll\", this.onScroll, { passive: true });\n const body = this.core.skeleton.bodyEl;\n body.addEventListener(\"click\", this.onBodyClick);\n body.addEventListener(\"dblclick\", this.onBodyDblClick);\n body.addEventListener(\"contextmenu\", this.onContextMenu);\n body.addEventListener(\"mousedown\", this.onMouseDown);\n body.addEventListener(\"mouseover\", this.onMouseOver);\n body.addEventListener(\"mouseleave\", this.onMouseLeave);\n body.addEventListener(\"pointerdown\", this.onDragHandlePointerDown);\n window.addEventListener(\"mouseup\", this.onWindowMouseUp);\n }\n\n destroy(): void {\n cancelAnimationFrame(this.rafId);\n const viewport = this.core.skeleton.bodyViewports.center;\n viewport.removeEventListener(\"scroll\", this.onScroll);\n const body = this.core.skeleton.bodyEl;\n body.removeEventListener(\"click\", this.onBodyClick);\n body.removeEventListener(\"dblclick\", this.onBodyDblClick);\n body.removeEventListener(\"contextmenu\", this.onContextMenu);\n body.removeEventListener(\"mousedown\", this.onMouseDown);\n body.removeEventListener(\"mouseover\", this.onMouseOver);\n body.removeEventListener(\"mouseleave\", this.onMouseLeave);\n body.removeEventListener(\"pointerdown\", this.onDragHandlePointerDown);\n window.removeEventListener(\"mouseup\", this.onWindowMouseUp);\n this.cancelFillDrag();\n this.rowDragController.destroy();\n for (const slot of this.pool) {\n if (slot.detailRow) this.cleanupDetail(slot.detailRow);\n for (const pane of PANES) {\n for (const cell of slot.cells[pane] ?? []) {\n if (slot.index >= 0) this.core.editingService.releaseCell(slot.index, cell.dataset.colId ?? \"\", cell);\n cleanupCellContent(this.core, cell);\n }\n }\n }\n this.fillHandleEl?.remove();\n this.fillDragIndicator?.remove();\n }\n\n paneForColumn(column: Column): PaneType {\n return column.pinned === \"left\" ? \"left\" : column.pinned === \"right\" ? \"right\" : \"center\";\n }\n\n private onScroll = (): void => {\n if (this.rafId) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = 0;\n this.syncScroll();\n });\n };\n\n syncScroll(): void {\n if (this.core.isDestroyed()) return;\n const sk = this.core.skeleton;\n const viewport = sk.bodyViewports.center;\n sk.headerRowContainers.center.style.transform = `translateX(${-viewport.scrollLeft}px)`;\n sk.rowContainers.left.style.transform = `translateY(${-viewport.scrollTop}px)`;\n sk.rowContainers.right.style.transform = `translateY(${-viewport.scrollTop}px)`;\n this.core.pinnedRowsRenderer.onScrollLeft(viewport.scrollLeft);\n this.core.tooltipService.hide();\n this.updateRange();\n this.core.rowModel.checkInfiniteScroll(this.lastExcl - 1);\n }\n\n private paneWidths(): Record<PaneType, number> {\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n for (const pane of PANES) {\n widths[pane] = this.core.columnModel.getPaneColumns(pane).reduce((a, c) => a + c.currentWidth, 0);\n }\n return widths;\n }\n\n private positionsBuf = new Float64Array(new ArrayBuffer(64 * 8));\n private lastMinRowHeight = 0;\n private rowHeightCache = new WeakMap<RowNode<any>, number>();\n private pendingFlash: Array<[number, string]> = [];\n private measureCanvas: HTMLCanvasElement | null = null;\n\n applyContainerSizes(): void {\n const sk = this.core.skeleton;\n const widths = this.paneWidths();\n const viewport = sk.bodyViewports.center;\n const displayed = this.core.rowModel.getDisplayedRows();\n const rowCount = this.core.rowModel.getDisplayTotalCount();\n const positionedCount = Math.min(rowCount, displayed.length);\n const rowHeight = this.core.options.rowHeight;\n const detailHeight = this.core.options.detailRowHeight;\n const getRowHeight = this.core.options.getRowHeight;\n const api = this.core.getApi();\n\n if (this.positionsBuf.length < positionedCount + 1) {\n let cap = this.positionsBuf.length;\n while (cap < positionedCount + 1) cap *= 2;\n this.positionsBuf = new Float64Array(new ArrayBuffer(cap * 8));\n }\n const positions = this.positionsBuf;\n const autoHeightCols = this.core.options.masterDetail ? [] : this.collectAutoHeightColumns();\n let y = 0;\n let minH = rowHeight;\n for (let i = 0; i < positionedCount; i++) {\n positions[i] = y;\n const node = i < displayed.length ? displayed[i] : undefined;\n let h: number;\n if (node?.isDetail) {\n h = detailHeight;\n } else if (node && (getRowHeight || autoHeightCols.length > 0)) {\n const cached = this.rowHeightCache.get(node);\n if (cached !== undefined) {\n h = cached;\n } else {\n h = rowHeight;\n if (getRowHeight) {\n try {\n const requested = getRowHeight({ data: node.data, node, api });\n h = Number.isFinite(requested) ? Math.max(1, requested || rowHeight) : rowHeight;\n } catch (error) {\n this.core.reportError(error, \"getRowHeight\", { rowId: node.id });\n }\n }\n if (autoHeightCols.length > 0) {\n const measured = this.measureAutoHeight(node, autoHeightCols);\n if (measured > h) h = measured;\n }\n this.rowHeightCache.set(node, h);\n }\n if (h < minH) minH = h;\n } else {\n h = rowHeight;\n }\n y += h;\n }\n positions[positionedCount] = y;\n const totalHeight = y + Math.max(0, rowCount - positionedCount) * rowHeight;\n this.lastMinRowHeight = minH;\n this.positions = positions.subarray(0, positionedCount + 1);\n\n const centerAvailable = Math.max(0, viewport.clientWidth - widths.left - widths.right);\n const centerWidth = Math.max(widths.center, centerAvailable);\n\n for (const pane of PANES) {\n const container = sk.rowContainers[pane];\n container.style.height = `${totalHeight}px`;\n if (pane === \"center\") container.style.width = `${centerWidth}px`;\n }\n this.applyDomLayoutHeight(totalHeight);\n\n sk.root.setAttribute(\"aria-rowcount\", String(rowCount + sk.getHeaderRowCount()));\n }\n\n invalidateRowHeight(node: RowNode<any>): void {\n this.rowHeightCache.delete(node);\n }\n\n private applyDomLayoutHeight(totalHeight: number): void {\n this.core.skeleton.bodyEl.style.height = this.core.options.domLayout === \"autoHeight\" ? `${totalHeight}px` : \"\";\n }\n\n invalidateAllRowHeights(): void {\n this.rowHeightCache = new WeakMap();\n }\n\n private collectAutoHeightColumns(): Column[] {\n return this.core.columnModel.getOrderedVisible().filter((c) => c.colDef.autoHeight === true);\n }\n\n private get hasAnyAutoHeight(): boolean {\n return this.core.columnModel.getOrderedVisible().some((c) => c.colDef.autoHeight === true);\n }\n\n private measureAutoHeight(node: RowNode<any>, cols: Column[]): number {\n this.measureCanvas ??= document.createElement(\"canvas\");\n const ctx = this.measureCanvas.getContext(\"2d\");\n if (!ctx) return 0;\n const style = window.getComputedStyle(this.core.skeleton.root);\n const fontSize = parseFloat(style.fontSize) || 13;\n ctx.font = `${style.fontStyle} ${style.fontWeight} ${fontSize}px ${style.fontFamily}`;\n const padding = parseFloat(style.getPropertyValue(\"--mach-cell-padding\")) || 9;\n const lineHeight = Math.round(fontSize * 1.45);\n let maxLines = 1;\n\n for (const col of cols) {\n const text = formatCellValue(this.core, node, col);\n if (!text) continue;\n const availW = Math.max(10, col.currentWidth - padding * 2 - 2);\n let lines = 1;\n let w = 0;\n for (const ch of text) {\n const cw = ctx.measureText(ch).width;\n if (w > 0 && w + cw > availW) {\n lines++;\n w = cw;\n } else {\n w += cw;\n }\n if (lines >= 12) break;\n }\n if (lines > maxLines) maxLines = lines;\n }\n return maxLines * lineHeight + Math.round(padding * 0.9);\n }\n\n queueFlash(rowIndexes: number[], colIds: string[]): void {\n if (!this.core.options.flashCells) return;\n for (const rowIndex of rowIndexes) {\n for (const colId of colIds) this.pendingFlash.push([rowIndex, colId]);\n }\n }\n\n flushFlash(): void {\n if (this.pendingFlash.length === 0) return;\n const entries = this.pendingFlash;\n this.pendingFlash = [];\n for (const [rowIndex, colId] of entries) {\n const cell = this.getCellElement(rowIndex, colId);\n if (!cell) continue;\n cell.classList.remove(\"mach-cell--flash\");\n void cell.offsetWidth;\n cell.classList.add(\"mach-cell--flash\");\n const runtime = getCellRuntimeState(cell);\n const timer = runtime.flashTimer;\n if (timer) clearTimeout(timer);\n runtime.flashTimer = setTimeout(() => {\n cell.classList.remove(\"mach-cell--flash\");\n runtime.flashTimer = undefined;\n }, 800);\n }\n }\n\n relayout(): void {\n this.applyContainerSizes();\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowHeight = this.core.options.rowHeight;\n let minRowHeight = rowHeight;\n if (this.core.options.masterDetail) {\n minRowHeight = Math.min(minRowHeight, this.core.options.detailRowHeight);\n }\n if (this.lastMinRowHeight > 0) {\n minRowHeight = Math.min(minRowHeight, this.lastMinRowHeight);\n }\n const visible = Math.ceil(viewport.clientHeight / Math.max(1, minRowHeight));\n const needed = this.core.options.domLayout === \"autoHeight\"\n ? this.core.rowModel.getDisplayedRowCount()\n : visible + this.core.options.rowBuffer * 2 + 1;\n const colWindowChanged = this.computeColWindow();\n if (colWindowChanged) {\n for (const slot of this.pool) this.reconcilePaneCells(slot, \"center\");\n }\n if (needed > this.poolSize) this.growPool(needed);\n this.applyCellLayout();\n this.updateRange(true);\n this.refreshOverlays();\n }\n\n private growPool(needed: number): void {\n while (this.poolSize < needed) {\n const slot: RowSlot = { index: -1, nodeId: \"\", kind: \"master\", rows: {}, cells: {}, cellColIds: {} };\n const sk = this.core.skeleton;\n for (const pane of PANES) {\n const cols = this.core.columnModel.getPaneColumns(pane);\n if (cols.length === 0) continue;\n const row = el(\"div\", \"mach-row\");\n row.style.height = `${this.core.options.rowHeight}px`;\n row.setAttribute(\"role\", \"row\");\n row.style.display = \"none\";\n sk.rowContainers[pane].appendChild(row);\n slot.rows[pane] = row;\n slot.cells[pane] = [];\n slot.cellColIds[pane] = [];\n this.reconcilePaneCells(slot, pane);\n }\n if (this.core.options.masterDetail) {\n const detailRow = el(\"div\", \"mach-row mach-detail-row\");\n detailRow.style.height = `${this.core.options.detailRowHeight}px`;\n detailRow.setAttribute(\"role\", \"row\");\n detailRow.style.display = \"none\";\n sk.rowContainers.center.appendChild(detailRow);\n slot.detailRow = detailRow;\n }\n this.pool.push(slot);\n this.poolSize++;\n }\n }\n\n private activePaneColumns(pane: PaneType): Column[] {\n const cols = this.core.columnModel.getPaneColumns(pane);\n if (pane !== \"center\" || cols.length <= 20 || this.core.columnModel.hasColSpan()) return cols;\n return cols.slice(this.colFirst, this.colLastExcl);\n }\n\n private createCell(column: Column): HTMLElement {\n const cell = el(\"div\", \"mach-cell\");\n cell.dataset.colId = column.id;\n cell.setAttribute(\"role\", \"gridcell\");\n if (column.hasCheckbox) {\n const input = document.createElement(\"input\");\n input.type = this.core.options.rowSelection === \"single\" ? \"radio\" : \"checkbox\";\n input.className = \"mach-row-checkbox\";\n if (input.type === \"radio\") input.name = `mach-radio-${this.core.gridId}`;\n input.setAttribute(\"aria-label\", \"select row\");\n cell.appendChild(input);\n cell.classList.add(\"mach-cell--selection\");\n }\n return cell;\n }\n\n private reconcilePaneCells(slot: RowSlot, pane: PaneType): void {\n const row = slot.rows[pane];\n if (!row) return;\n const columns = this.activePaneColumns(pane);\n const existingCells = slot.cells[pane] ?? [];\n const existingIds = slot.cellColIds[pane] ?? [];\n if (existingIds.length === columns.length && existingIds.every((id, index) => id === columns[index].id)) return;\n\n const byId = new Map<string, HTMLElement>();\n existingIds.forEach((id, index) => byId.set(id, existingCells[index]));\n const nextCells: HTMLElement[] = [];\n const nextIds: string[] = [];\n for (const column of columns) {\n const cell = byId.get(column.id) ?? this.createCell(column);\n byId.delete(column.id);\n row.appendChild(cell);\n nextCells.push(cell);\n nextIds.push(column.id);\n }\n for (const cell of byId.values()) {\n if (slot.index >= 0) this.core.editingService.releaseCell(slot.index, cell.dataset.colId ?? \"\", cell);\n cleanupCellContent(this.core, cell);\n cell.remove();\n }\n slot.cells[pane] = nextCells;\n slot.cellColIds[pane] = nextIds;\n }\n\n rebuildPool(): void {\n this.treeColumnCache = undefined;\n this.invalidateRangeCache();\n for (const slot of this.pool) {\n if (slot.detailRow) this.cleanupDetail(slot.detailRow);\n for (const pane of PANES) {\n for (const cell of slot.cells[pane] ?? []) cleanupCellContent(this.core, cell);\n slot.rows[pane]?.remove();\n }\n slot.detailRow?.remove();\n }\n this.pool = [];\n this.poolSize = 0;\n this.first = 0;\n this.lastExcl = -1;\n this.relayout();\n }\n\n applyCellLayout(): void {\n const variableHeights =\n this.core.options.masterDetail ||\n this.core.options.getRowHeight != null ||\n this.hasAnyAutoHeight;\n for (const pane of PANES) {\n const allPaneCols = this.core.columnModel.getPaneColumns(pane);\n const cols = this.activePaneColumns(pane);\n let x = 0;\n const lefts: number[] = [];\n if (pane === \"center\" && cols.length > 0) {\n const first = allPaneCols.indexOf(cols[0]);\n for (let i = 0; i < first; i++) x += allPaneCols[i].currentWidth;\n }\n for (const col of cols) {\n lefts.push(x);\n x += col.currentWidth;\n }\n for (const slot of this.pool) {\n const cells = slot.cells[pane];\n const row = slot.rows[pane];\n if (!cells || !row) continue;\n if (!variableHeights) {\n row.style.height = `${this.core.options.rowHeight}px`;\n }\n for (let i = 0; i < cols.length && i < cells.length; i++) {\n cells[i].style.width = `${cols[i].currentWidth}px`;\n cells[i].style.left = `${lefts[i]}px`;\n cells[i].setAttribute(\"aria-colindex\", String(this.core.columnModel.getFlatIndex(cols[i].id) + 1));\n }\n }\n if (this.core.options.masterDetail) {\n for (const slot of this.pool) {\n slot.detailRow?.style.setProperty(\"--mach-detail-h\", `${this.core.options.detailRowHeight}px`);\n }\n }\n }\n }\n\n private computeColWindow(): boolean {\n const viewport = this.core.skeleton.bodyViewports.center;\n const cols = this.core.columnModel.getPaneColumns(\"center\");\n const prevFirst = this.colFirst;\n const prevLast = this.colLastExcl;\n let first = 0;\n let last = cols.length;\n\n if (cols.length > 20) {\n const width = viewport.clientWidth;\n let total = 0;\n for (const col of cols) total += col.currentWidth;\n if (width > 0 && total > width) {\n const scrollLeft = viewport.scrollLeft;\n let x = 0;\n for (let i = 0; i < cols.length; i++) {\n if (x + cols[i].currentWidth <= scrollLeft) first = i + 1;\n else break;\n x += cols[i].currentWidth;\n }\n let acc = x;\n for (let i = first; i < cols.length; i++) {\n acc += cols[i].currentWidth;\n if (acc >= scrollLeft + width) {\n last = i + 1;\n break;\n }\n }\n if (last > cols.length) last = cols.length;\n first = Math.max(0, first - 2);\n last = Math.min(cols.length, last + 2);\n }\n }\n\n this.colFirst = first;\n this.colLastExcl = last;\n return first !== prevFirst || last !== prevLast;\n }\n\n updateRange(force = false): void {\n const startedAt = this.core.performanceMonitor.start();\n if (!this.updateRangeInner(force)) return;\n const rows = Math.max(0, this.lastExcl - this.first);\n const columns = this.core.columnModel.getPaneColumns(\"left\").length +\n this.activePaneColumns(\"center\").length +\n this.core.columnModel.getPaneColumns(\"right\").length;\n this.core.performanceMonitor.recordRender(startedAt, rows, columns);\n }\n\n private updateRangeInner(force: boolean): boolean {\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const buffer = this.core.options.rowBuffer;\n const colWindowChanged = this.computeColWindow();\n this.reconcileColumnWindow(colWindowChanged);\n\n if (rowCount === 0) {\n for (const slot of this.pool) this.hideSlot(slot);\n this.first = 0;\n this.lastExcl = 0;\n return true;\n }\n\n if (this.renderAutoHeightRange(rowCount, force)) return true;\n\n const { first, lastExcl } = this.calculateVisibleRange(viewport, rowCount, buffer);\n\n if (!force && first === this.first && lastExcl === this.lastExcl) return colWindowChanged;\n this.first = first;\n this.lastExcl = lastExcl;\n this.hideOutsideRange(first, lastExcl);\n this.renderVirtualRange(first, lastExcl, force, colWindowChanged);\n return true;\n }\n\n private calculateVisibleRange(\n viewport: HTMLElement,\n rowCount: number,\n buffer: number\n ): { first: number; lastExcl: number } {\n const firstVisible = lowerBound(this.positions, viewport.scrollTop, rowCount);\n const viewBottom = viewport.scrollTop + viewport.clientHeight;\n const lastVisible = Math.min(rowCount, lowerBound(this.positions, viewBottom, rowCount) + 1);\n return {\n first: clamp(firstVisible - buffer, 0, rowCount - 1),\n lastExcl: clamp(lastVisible + buffer, 1, rowCount)\n };\n }\n\n private hideOutsideRange(first: number, lastExcl: number): void {\n for (const slot of this.pool) {\n if (slot.index !== -1 && (slot.index < first || slot.index >= lastExcl)) this.hideSlot(slot);\n }\n }\n\n private renderVirtualRange(first: number, lastExcl: number, force: boolean, columnsChanged: boolean): void {\n for (let i = first; i < lastExcl; i++) {\n const node = this.core.rowModel.getDisplayedRow(i);\n const slot = this.pool[i % this.poolSize];\n if (!slot || !node) continue;\n if (!force && slot.index === i && slot.nodeId === node.id) {\n if (columnsChanged && slot.kind === \"master\") this.renderPaneCells(slot, node, \"center\");\n continue;\n }\n this.assignSlot(slot, i);\n }\n }\n\n private reconcileColumnWindow(changed: boolean): void {\n if (!changed) return;\n for (const slot of this.pool) this.reconcilePaneCells(slot, \"center\");\n this.applyCellLayout();\n }\n\n private renderAutoHeightRange(rowCount: number, force: boolean): boolean {\n if (this.core.options.domLayout !== \"autoHeight\") return false;\n if (!force && this.first === 0 && this.lastExcl === rowCount) return true;\n this.first = 0;\n this.lastExcl = rowCount;\n for (let index = 0; index < rowCount; index++) {\n const node = this.core.rowModel.getDisplayedRow(index);\n const slot = this.pool[index];\n if (!slot || !node) continue;\n if (force || slot.index !== index || slot.nodeId !== node.id) this.assignSlot(slot, index);\n }\n return true;\n }\n\n private hideSlot(slot: RowSlot): void {\n this.releaseSlotEditors(slot);\n if (this.focusedCell?.rowIndex === slot.index) {\n this.core.skeleton.root.removeAttribute(\"aria-activedescendant\");\n }\n slot.index = -1;\n slot.nodeId = \"\";\n slot.kind = \"master\";\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (row) row.style.display = \"none\";\n }\n if (slot.detailRow) {\n this.cleanupDetail(slot.detailRow);\n slot.detailRow.style.display = \"none\";\n }\n }\n\n private assignSlot(slot: RowSlot, index: number): void {\n if (slot.index >= 0 && slot.index !== index) this.releaseSlotEditors(slot);\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) {\n this.hideSlot(slot);\n return;\n }\n slot.index = index;\n slot.nodeId = node.id;\n const y = this.positions[index];\n const h = this.positions[index + 1] - this.positions[index];\n\n if (node.isDetail) {\n slot.kind = \"detail\";\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (row) row.style.display = \"none\";\n }\n const detailRow = slot.detailRow;\n if (detailRow) {\n detailRow.style.display = \"\";\n detailRow.style.transform = `translateY(${y}px)`;\n detailRow.style.height = `${h}px`;\n detailRow.dataset.index = String(index);\n detailRow.setAttribute(\"aria-rowindex\", String(index + this.core.skeleton.getHeaderRowCount() + 1));\n this.renderDetailContent(detailRow, node);\n }\n return;\n }\n\n slot.kind = \"master\";\n if (slot.detailRow) slot.detailRow.style.display = \"none\";\n\n const isTreeRow = this.core.rowModel.isTree;\n const isGroupRow = node.isGroup === true;\n const hasTreeChildren = isTreeRow && this.core.rowModel.hasChildren(node.id);\n const isExpandable = isGroupRow || hasTreeChildren ||\n (this.core.options.masterDetail && this.core.rowModel.isRowExpandable(node));\n const expanded = isGroupRow\n ? this.core.rowModel.isGroupExpanded(node.id)\n : this.core.rowModel.isRowExpanded(node.id);\n const level = isGroupRow\n ? (node.groupLevel ?? 0) + 1\n : isTreeRow\n ? this.core.rowModel.getTreeDepth(node) + 1\n : null;\n\n for (const pane of PANES) {\n const row = slot.rows[pane];\n if (!row) continue;\n row.style.display = \"\";\n row.style.transform = `translateY(${y}px)`;\n row.style.height = `${h}px`;\n row.dataset.index = String(index);\n row.dataset.id = node.id;\n row.setAttribute(\"aria-rowindex\", String(index + this.core.skeleton.getHeaderRowCount() + 1));\n row.classList.toggle(\"mach-row--selected\", node.selected);\n row.classList.toggle(\"mach-row--hover\", this.hoverIndex === index && !this.core.options.suppressRowHoverHighlight);\n row.classList.toggle(\"mach-row--odd\", index % 2 === 1);\n row.setAttribute(\"aria-selected\", node.selected ? \"true\" : \"false\");\n if (isExpandable) row.setAttribute(\"aria-expanded\", expanded ? \"true\" : \"false\");\n else row.removeAttribute(\"aria-expanded\");\n if (level != null) row.setAttribute(\"aria-level\", String(level));\n else row.removeAttribute(\"aria-level\");\n\n this.renderPaneCells(slot, node, pane);\n }\n\n if (this.focusedCell && this.focusedCell.rowIndex === index) {\n this.applyFocusClass();\n }\n }\n\n private renderPaneCells(slot: RowSlot, node: RowNode<any>, pane: PaneType): void {\n const cols = this.activePaneColumns(pane);\n const cells = slot.cells[pane];\n if (!cells) return;\n const index = slot.index;\n const hasColSpan = pane === \"center\" && this.core.columnModel.hasColSpan();\n let coverage = 0;\n slot.rows[pane]?.classList.toggle(\"mach-row--editing\", this.core.editingService.isRowEditing(index));\n\n for (let i = 0; i < cols.length; i++) {\n const col = cols[i];\n const cell = cells[i];\n\n if (hasColSpan && coverage > 0) {\n coverage--;\n cleanupCellContent(this.core, cell);\n cell.setAttribute(\"aria-hidden\", \"true\");\n if (cell.style.display !== \"none\") cell.style.display = \"none\";\n continue;\n }\n\n if (cell.style.display === \"none\") cell.style.display = \"\";\n cell.removeAttribute(\"aria-hidden\");\n\n if (hasColSpan) {\n const span = this.resolveColSpan(node, col, index, cols.length - i);\n if (span > 1) {\n coverage = span - 1;\n this.applySpanWidth(cell, cols, i, span);\n } else {\n cell.removeAttribute(\"aria-colspan\");\n if (cell.style.width !== `${col.currentWidth}px`) cell.style.width = `${col.currentWidth}px`;\n }\n } else {\n cell.removeAttribute(\"aria-colspan\");\n }\n\n if (this.core.editingService.renderEditor(index, node, col, cell)) continue;\n this.renderCell(cell, node, col);\n this.applyRangeClass(cell, index, col);\n }\n }\n\n private resolveColSpan(node: RowNode<any>, column: Column, rowIndex: number, remaining: number): number {\n const fn = column.colDef.colSpan;\n if (!fn) return 1;\n try {\n const span = fn({\n api: this.core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value: this.core.getCellValue(node, column),\n rowIndex\n });\n return Math.max(1, Math.min(Math.round(span) || 1, remaining));\n } catch (error) {\n this.core.reportError(error, \"colSpan\", { colId: column.id, rowId: node.id });\n return 1;\n }\n }\n\n private applySpanWidth(cell: HTMLElement, cols: Column[], start: number, span: number): void {\n let w = 0;\n for (let i = start; i < start + span && i < cols.length; i++) w += cols[i].currentWidth;\n cell.style.width = `${w}px`;\n cell.setAttribute(\"aria-colspan\", String(span));\n }\n\n private renderDetailContent(row: HTMLElement, node: RowNode<any>): void {\n this.cleanupDetail(row);\n const master = node.masterId != null ? this.core.rowModel.getNodeById(node.masterId) : node;\n const container = el(\"div\", \"mach-detail\");\n row.appendChild(container);\n const renderer = this.core.options.detailRowRenderer;\n if (renderer) {\n const params = { data: node.data, node: master ?? node, api: this.core.getApi() };\n let out: string | HTMLElement | { el: HTMLElement; destroy?: () => void } | null | undefined;\n try {\n out = renderer(params);\n } catch (err) {\n this.core.reportError(err, \"detailRowRenderer\", { rowId: node.id });\n out = null;\n }\n if (typeof out === \"string\") {\n container.textContent = out;\n } else if (out instanceof HTMLElement) {\n container.appendChild(out);\n } else if (out && typeof out === \"object\" && out.el instanceof HTMLElement) {\n container.appendChild(out.el);\n setDetailDestroyer(row, out.destroy);\n }\n }\n }\n\n private cleanupDetail(row: HTMLElement): void {\n const destroy = takeDetailDestroyer(row);\n if (destroy) {\n try {\n destroy();\n } catch (err) {\n this.core.reportError(err, \"detailRowRenderer.destroy\");\n }\n }\n row.textContent = \"\";\n }\n\n private renderCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n cell.setAttribute(\"aria-readonly\", this.core.editingService.isEditable(node, column) ? \"false\" : \"true\");\n cell.removeAttribute(\"aria-expanded\");\n cell.removeAttribute(\"aria-level\");\n const kind = this.cellRenderKind(node, column);\n if (kind !== \"standard\") {\n cleanupCellContent(this.core, cell);\n this.renderStructuralCell(kind, cell, node, column);\n return;\n }\n renderCellContent(this.core, cell, node, column);\n applyCellClasses(this.core, cell, node, column);\n applyCellStyle(this.core, cell, node, column);\n this.applyCellSpanStyle(cell, node, column);\n this.appendEditableIndicator(cell, node, column);\n }\n\n private cellRenderKind(node: RowNode<any>, column: Column): CellRenderKind {\n if (node.isGroup) return \"group\";\n if (column.isDetailToggle) return \"detail\";\n if (column.hasCheckbox) return \"checkbox\";\n if (column.colDef.rowDrag) return \"drag\";\n if (hasColumnType(column.colDef, \"index\")) return \"index\";\n if (this.core.rowModel.isTree && this.getTreeColumn()?.id === column.id) return \"tree\";\n return \"standard\";\n }\n\n private renderStructuralCell(\n kind: Exclude<CellRenderKind, \"standard\">,\n cell: HTMLElement,\n node: RowNode<any>,\n column: Column\n ): void {\n if (kind === \"group\") {\n this.renderGroupCell(cell, node, column);\n } else if (kind === \"detail\") {\n const expanded = this.core.rowModel.isRowExpanded(node.id);\n const toggle = el(\"span\", `mach-detail-toggle${expanded ? \" mach-detail-toggle--open\" : \"\"}`);\n toggle.textContent = \"▶\";\n cell.replaceChildren(toggle);\n cell.classList.add(\"mach-cell--detail-toggle\");\n this.resetSpanStyle(cell);\n } else if (kind === \"checkbox\") {\n const input = cell.querySelector<HTMLInputElement>(\".mach-row-checkbox\");\n if (input) {\n input.checked = node.selected;\n input.indeterminate = this.core.selectionService.isIndeterminate(node.id);\n input.disabled = !this.core.selectionService.isSelectable(node);\n }\n if (cell.className !== \"mach-cell mach-cell--selection\") cell.className = \"mach-cell mach-cell--selection\";\n this.resetSpanStyle(cell);\n } else if (kind === \"drag\") {\n const handle = el(\"span\", \"mach-row-drag-handle\");\n handle.textContent = \"⠿\";\n cell.replaceChildren(handle);\n if (cell.className !== \"mach-cell mach-cell--drag\") cell.className = \"mach-cell mach-cell--drag\";\n this.resetSpanStyle(cell);\n } else if (kind === \"index\") {\n cell.textContent = String(this.core.rowModel.getRowSeq(node) + this.core.options.indexOffset);\n if (cell.className !== \"mach-cell mach-cell--index\") cell.className = \"mach-cell mach-cell--index\";\n this.applyCellSpanStyle(cell, node, column);\n } else {\n this.renderTreeCell(cell, node, column);\n }\n }\n\n private appendEditableIndicator(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n if (\n this.core.options.editType !== \"cell\" ||\n this.core.options.editableIndicator === \"none\" ||\n !this.core.editingService.isEditable(node, column)\n ) return;\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = `mach-cell-edit-trigger mach-cell-edit-trigger--${this.core.options.editableIndicator}`;\n button.tabIndex = -1;\n button.title = \"Edit cell\";\n button.setAttribute(\"aria-label\", \"Edit cell\");\n button.innerHTML = '<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m10.8 2.7 2.5 2.5L5.5 13H3v-2.5z\"/><path d=\"m9.5 4 2.5 2.5\"/></svg>';\n button.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n });\n button.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.setFocusedCell(node.rowIndex, column.id);\n this.core.editingService.start(node.rowIndex, column);\n });\n cell.appendChild(button);\n }\n\n private releaseSlotEditors(slot: RowSlot): void {\n if (slot.index < 0) return;\n for (const pane of PANES) {\n for (const cell of slot.cells[pane] ?? []) {\n this.core.editingService.releaseCell(slot.index, cell.dataset.colId ?? \"\", cell);\n }\n }\n }\n\n private treeColumnCache: Column | null | undefined;\n\n private getTreeColumn(): Column | null {\n if (this.treeColumnCache !== undefined) return this.treeColumnCache;\n this.treeColumnCache =\n this.core.columnModel.getOrderedVisible().find(\n (c) => !c.hasCheckbox && !c.isDetailToggle && !c.colDef.rowDrag && !hasColumnType(c.colDef, \"index\")\n ) ?? null;\n return this.treeColumnCache;\n }\n\n private renderTreeCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const expandable = this.core.rowModel.isRowExpandable(node);\n const depth = this.getNodeDepth(node);\n const indent = el(\"span\", \"mach-tree-indent\");\n indent.style.width = `${depth * 16}px`;\n const wrap = el(\"span\", \"mach-tree-cell\");\n wrap.appendChild(indent);\n if (expandable) {\n const expanded = this.core.rowModel.isRowExpanded(node.id);\n cell.setAttribute(\"aria-expanded\", expanded ? \"true\" : \"false\");\n cell.setAttribute(\"aria-level\", String(depth + 1));\n const stateClass = node.treeLoading\n ? \" mach-detail-toggle--loading\"\n : node.treeLoadError\n ? \" mach-detail-toggle--error\"\n : \"\";\n const toggle = el(\"span\", `mach-detail-toggle${expanded ? \" mach-detail-toggle--open\" : \"\"}${stateClass}`);\n if (node.treeLoadError) toggle.title = \"Retry loading children\";\n toggle.textContent = \"▶\";\n wrap.appendChild(toggle);\n } else {\n const spacer = el(\"span\", \"mach-tree-toggle-spacer\");\n wrap.appendChild(spacer);\n }\n const text = el(\"span\", \"mach-tree-text\");\n text.textContent = formatCellValueWith(this.core, node, column, this.core.getCellValue(node, column));\n wrap.appendChild(text);\n cell.replaceChildren(wrap);\n applyCellClasses(this.core, cell, node, column);\n }\n\n private getNodeDepth(node: RowNode<any>): number {\n return this.core.rowModel.getTreeDepth(node);\n }\n\n private resetSpanStyle(cell: HTMLElement): void {\n if (cell.style.height !== \"\") cell.style.height = \"\";\n if (cell.style.zIndex !== \"\") cell.style.zIndex = \"\";\n if (cell.style.display === \"none\") cell.style.display = \"\";\n cell.removeAttribute(\"aria-rowspan\");\n }\n\n private applyCellSpanStyle(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const spans = this.core.rowModel.getSpanInfo(column.id);\n if (!spans || node.isDetail) {\n this.resetSpanStyle(cell);\n return;\n }\n const idx = this.core.rowModel.getRowSeq(node) - 1;\n if (idx < 0 || idx >= spans.length) {\n this.resetSpanStyle(cell);\n return;\n }\n const value = spans[idx];\n if (value === -1) {\n cell.style.display = \"none\";\n cell.setAttribute(\"aria-hidden\", \"true\");\n return;\n }\n if (cell.style.display === \"none\") cell.style.display = \"\";\n cell.removeAttribute(\"aria-hidden\");\n if (value > 1) {\n const end = Math.min(idx + value, this.positions.length - 1);\n const height = this.positions[end] - this.positions[idx];\n cell.style.height = `${height > 0 ? height : value * this.core.options.rowHeight}px`;\n cell.style.zIndex = \"1\";\n cell.setAttribute(\"aria-rowspan\", String(value));\n } else {\n this.resetSpanStyle(cell);\n }\n }\n\n private renderGroupCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const base = \"mach-cell\";\n if (column.hasCheckbox) {\n const input = cell.querySelector<HTMLInputElement>(\".mach-row-checkbox\");\n if (input) {\n const state = this.core.selectionService.getGroupSelectionState(node);\n input.checked = state.all;\n input.indeterminate = state.some && !state.all;\n }\n if (cell.className !== `${base} mach-cell--selection`) cell.className = `${base} mach-cell--selection`;\n return;\n }\n if (column.isDetailToggle) {\n cell.textContent = \"\";\n if (cell.className !== base) cell.className = base;\n return;\n }\n const labelCol = this.core.columnModel.getGroupLabelColumn();\n if (labelCol && column.id === labelCol.id) {\n cell.setAttribute(\"aria-expanded\", this.core.rowModel.isGroupExpanded(node.id) ? \"true\" : \"false\");\n cell.setAttribute(\"aria-level\", String((node.groupLevel ?? 0) + 1));\n const wrap = el(\"span\", \"mach-group-label\");\n wrap.style.paddingLeft = `${(node.groupLevel ?? 0) * 16}px`;\n const toggle = el(\"span\", `mach-detail-toggle${this.core.rowModel.isGroupExpanded(node.id) ? \" mach-detail-toggle--open\" : \"\"}`);\n toggle.textContent = \"▶\";\n const text = el(\"span\", \"mach-group-text\");\n const groupCol = this.core.columnModel.getRowGroupColumns()[node.groupLevel ?? 0];\n const prefix = groupCol?.colDef.headerName ? `${groupCol.colDef.headerName}: ` : \"\";\n text.textContent = `${prefix}${node.groupKey ?? \"\"}`;\n const count = el(\"span\", \"mach-group-count\");\n count.textContent = `(${node.leafNodes?.length ?? 0})`;\n wrap.append(toggle, text, count);\n cell.replaceChildren(wrap);\n if (cell.className !== `${base} mach-cell--group`) cell.className = `${base} mach-cell--group`;\n return;\n }\n if (column.colDef.aggFunc && node.aggValues && Object.prototype.hasOwnProperty.call(node.aggValues, column.id)) {\n const value = node.aggValues[column.id];\n const formatted =\n column.colDef.valueFormatter != null\n ? formatCellValueWith(this.core, node, column, value)\n : defaultFormat(value);\n cell.textContent = formatted;\n if (cell.className !== `${base} mach-cell--num`) cell.className = `${base} mach-cell--num`;\n return;\n }\n cell.textContent = \"\";\n if (cell.className !== base) cell.className = base;\n }\n\n refreshRows(indexes: number[]): void {\n if (this.core.isDestroyed()) return;\n const seen = new Set<number>();\n for (const index of indexes) {\n if (index < 0 || seen.has(index)) continue;\n seen.add(index);\n const slot = this.pool[index % this.poolSize];\n if (!slot || slot.index !== index) continue;\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) continue;\n if (slot.kind === \"detail\") {\n if (slot.detailRow) this.renderDetailContent(slot.detailRow, node);\n continue;\n }\n for (const pane of PANES) {\n const cells = slot.cells[pane];\n if (!cells) continue;\n this.renderPaneCells(slot, node, pane);\n }\n }\n this.applyFocusClass();\n this.flushFlash();\n }\n\n refreshAllCells(): void {\n if (this.core.isDestroyed()) return;\n for (const slot of this.pool) {\n if (slot.index < 0) continue;\n const node = this.core.rowModel.getDisplayedRow(slot.index);\n if (!node) continue;\n if (slot.kind === \"detail\") {\n if (slot.detailRow) this.renderDetailContent(slot.detailRow, node);\n continue;\n }\n for (const pane of PANES) {\n const cells = slot.cells[pane];\n if (!cells) continue;\n this.renderPaneCells(slot, node, pane);\n }\n }\n this.applyFocusClass();\n this.flushFlash();\n }\n\n onDataChanged(): void {\n if (this.core.isDestroyed()) return;\n if (this.focusedCell && this.focusedCell.rowIndex >= this.core.rowModel.getDisplayedRowCount()) {\n this.setFocusedCell(null, null);\n }\n this.invalidateRangeCache();\n this.applyContainerSizes();\n this.updateRange(true);\n this.updateFillHandle();\n this.refreshOverlays();\n this.core.summaryRenderer.refresh();\n }\n\n refreshOverlays(): void {\n const options = this.core.options;\n if (options.loading) {\n this.core.skeleton.showOverlay(\"loading\", options.overlayLoadingTemplate, options.allowUnsafeOverlayHtml);\n return;\n }\n if (options.error != null) {\n const template = options.overlayErrorTemplate || this.core.buildDefaultErrorState();\n this.core.skeleton.showOverlay(\"error\", template, options.allowUnsafeOverlayHtml);\n return;\n }\n if (this.core.rowModel.getDisplayedRowCount() === 0 && !options.suppressNoRowsOverlay) {\n const template = options.overlayNoRowsTemplate || this.core.buildDefaultEmptyState();\n this.core.skeleton.showOverlay(\"noRows\", template, options.allowUnsafeOverlayHtml);\n return;\n }\n this.core.skeleton.hideOverlay();\n }\n\n getCellElement(rowIndex: number, colId: string): HTMLElement | null {\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return null;\n const pane = this.paneForColumn(column);\n const colIdx = this.pool[rowIndex % Math.max(1, this.poolSize)]?.cellColIds[pane]?.indexOf(column.id) ?? -1;\n if (colIdx < 0) return null;\n const slot = this.pool[rowIndex % this.poolSize];\n if (!slot || slot.index !== rowIndex || slot.kind !== \"master\") return null;\n return slot.cells[pane]?.[colIdx] ?? null;\n }\n\n private invalidateRangeCache(): void {\n this.rangeSelection.invalidate();\n }\n\n normalizedRange(): NormalizedRange | null {\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const colCount = this.core.columnModel.getOrderedVisible().length;\n return this.rangeSelection.normalize(rowCount, colCount);\n }\n\n getNormalizedRangeOrFocus(): NormalizedRange | null {\n const range = this.normalizedRange();\n if (range) return range;\n const focus = this.focusedCell;\n if (focus) {\n const ci = this.core.columnModel.getFlatIndex(focus.colId);\n if (ci >= 0) return { r1: focus.rowIndex, c1: ci, r2: focus.rowIndex, c2: ci };\n }\n return null;\n }\n\n getRangeSelection(): { row1: number; row2: number; colId1: string; colId2: string } | null {\n const range = this.normalizedRange();\n if (!range) return null;\n const flat = this.core.columnModel.getOrderedVisible();\n return {\n row1: range.r1,\n row2: range.r2,\n colId1: flat[range.c1]?.id ?? \"\",\n colId2: flat[range.c2]?.id ?? \"\"\n };\n }\n\n getPasteStart(): { row: number; colIdx: number } | null {\n const anchor = this.rangeSelection.getAnchor();\n if (anchor) {\n return { row: anchor.row, colIdx: anchor.colIdx };\n }\n const focus = this.getNormalizedRangeOrFocus();\n return focus ? { row: focus.r1, colIdx: focus.c1 } : null;\n }\n\n clearRangeSelection(): void {\n const old = this.normalizedRange();\n this.rangeSelection.clear();\n if (old) {\n this.refreshRowRange(old, null);\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: null });\n }\n }\n\n private refreshRowRange(\n a: { r1: number; r2: number } | null,\n b: { r1: number; r2: number } | null\n ): void {\n const indexes: number[] = [];\n const collect = (r: { r1: number; r2: number } | null) => {\n if (!r) return;\n for (let i = r.r1; i <= r.r2; i++) indexes.push(i);\n };\n collect(a);\n collect(b);\n if (indexes.length > 0) this.refreshRows(indexes);\n }\n\n startRange(row: number, colIdx: number, extend: boolean): void {\n const old = this.normalizedRange();\n this.rangeSelection.start({ row, colIdx }, extend);\n const next = this.normalizedRange();\n this.refreshRowRange(old, next);\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n\n moveRangeEnd(row: number, colIdx: number): void {\n if (!this.rangeSelection.hasAnchor()) {\n const focus = this.focusedCell;\n if (!focus) return;\n const col = this.core.columnModel.getFlatIndex(focus.colId);\n if (!this.rangeSelection.ensureAnchor({ row: focus.rowIndex, colIdx: col })) return;\n }\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const colCount = this.core.columnModel.getOrderedVisible().length;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({\n row: Math.max(0, Math.min(row, rowCount - 1)),\n colIdx: Math.max(0, Math.min(colIdx, colCount - 1))\n });\n const next = this.normalizedRange();\n this.refreshRowRange(old, next);\n this.updateFillHandle();\n const flat = this.core.columnModel.getOrderedVisible();\n const end = this.rangeSelection.getEnd();\n if (end && end.colIdx < flat.length) {\n this.setFocusedCell(end.row, flat[end.colIdx].id);\n }\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n\n private applyRangeClass(cell: HTMLElement, rowIndex: number, column: Column): void {\n const range = this.normalizedRange();\n if (!range) {\n if (cell.classList.contains(\"mach-cell--range\")) {\n cell.classList.remove(\"mach-cell--range\", \"mach-cell--range-top\", \"mach-cell--range-bottom\", \"mach-cell--range-left\", \"mach-cell--range-right\");\n }\n return;\n }\n const ci = this.core.columnModel.getFlatIndex(column.id);\n if (ci < 0) return;\n const inRange = rowIndex >= range.r1 && rowIndex <= range.r2 && ci >= range.c1 && ci <= range.c2;\n cell.classList.toggle(\"mach-cell--range\", inRange);\n if (inRange) {\n cell.classList.toggle(\"mach-cell--range-top\", rowIndex === range.r1);\n cell.classList.toggle(\"mach-cell--range-bottom\", rowIndex === range.r2);\n cell.classList.toggle(\"mach-cell--range-left\", ci === range.c1);\n cell.classList.toggle(\"mach-cell--range-right\", ci === range.c2);\n } else {\n cell.classList.remove(\"mach-cell--range-top\", \"mach-cell--range-bottom\", \"mach-cell--range-left\", \"mach-cell--range-right\");\n }\n }\n\n private fillHandleEl: HTMLElement | null = null;\n private fillDrag: {\n r1: number;\n r2: number;\n c1: number;\n c2: number;\n startX: number;\n startY: number;\n axis: \"h\" | \"v\" | null;\n active: boolean;\n } | null = null;\n private fillFromPointer = false;\n\n private ensureFillHandle(): HTMLElement {\n if (this.fillHandleEl) return this.fillHandleEl;\n const handle = el(\"div\", \"mach-fill-handle\");\n handle.style.display = \"none\";\n handle.addEventListener(\"pointerdown\", (e) => {\n this.fillFromPointer = true;\n this.onFillHandleDown(e);\n });\n handle.addEventListener(\"mousedown\", (e) => {\n if (this.fillFromPointer) return;\n this.onFillHandleDown(e);\n });\n this.core.skeleton.rowContainers.center.appendChild(handle);\n this.fillHandleEl = handle;\n return handle;\n }\n\n private updateFillHandle(): void {\n const handle = this.ensureFillHandle();\n const range = this.normalizedRange();\n if (\n !this.core.options.enableRangeSelection ||\n !this.core.options.fillHandle ||\n !range\n ) {\n handle.style.display = \"none\";\n return;\n }\n const cm = this.core.columnModel;\n const leftCount = cm.getPaneColumns(\"left\").length;\n const centerCols = cm.getPaneColumns(\"center\");\n if (range.c2 < leftCount || range.c2 >= leftCount + centerCols.length) {\n handle.style.display = \"none\";\n return;\n }\n const local = range.c2 - leftCount;\n let x = 0;\n for (let i = 0; i <= local && i < centerCols.length; i++) x += centerCols[i].currentWidth;\n const bottom = this.positions[Math.min(range.r2 + 1, this.positions.length - 1)] ?? (range.r2 + 1) * this.core.options.rowHeight;\n handle.style.display = \"\";\n handle.style.left = `${x - 4}px`;\n handle.style.top = `${bottom - 4}px`;\n }\n\n private onFillHandleDown(e: MouseEvent): void {\n if (this.core.isDestroyed() || e.button !== 0) return;\n const range = this.normalizedRange();\n if (!range) return;\n e.preventDefault();\n e.stopPropagation();\n this.fillDrag = {\n r1: range.r1,\n r2: range.r2,\n c1: range.c1,\n c2: range.c2,\n startX: e.clientX,\n startY: e.clientY,\n axis: null,\n active: false\n };\n window.addEventListener(\"pointermove\", this.onFillMove);\n window.addEventListener(\"mousemove\", this.onFillMove);\n window.addEventListener(\"pointerup\", this.onFillUp);\n window.addEventListener(\"mouseup\", this.onFillUp);\n window.addEventListener(\"pointercancel\", this.onFillUp);\n }\n\n private fillTargetRow(e: MouseEvent): number {\n const container = this.core.skeleton.rowContainers.center;\n const rect = container.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n const row = lowerBound(this.positions, y, rowCount);\n return Math.max(this.fillDrag!.r2, Math.min(row, rowCount - 1));\n }\n\n private fillTargetCol(e: MouseEvent): number {\n const container = this.core.skeleton.rowContainers.center;\n const rect = container.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const cm = this.core.columnModel;\n const leftCount = cm.getPaneColumns(\"left\").length;\n const centerCols = cm.getPaneColumns(\"center\");\n let acc = 0;\n for (let i = 0; i < centerCols.length; i++) {\n if (x < acc + centerCols[i].currentWidth / 2) return leftCount + i;\n acc += centerCols[i].currentWidth;\n }\n return leftCount + centerCols.length - 1;\n }\n\n private fillDragIndicator: HTMLElement | null = null;\n\n private cancelFillDrag(): void {\n this.fillDrag = null;\n this.fillFromPointer = false;\n window.removeEventListener(\"pointermove\", this.onFillMove);\n window.removeEventListener(\"mousemove\", this.onFillMove);\n window.removeEventListener(\"pointerup\", this.onFillUp);\n window.removeEventListener(\"mouseup\", this.onFillUp);\n window.removeEventListener(\"pointercancel\", this.onFillUp);\n this.core.skeleton.root.classList.remove(\"mach-root--filling\");\n }\n\n private onFillMove = (e: Event): void => {\n const drag = this.fillDrag;\n if (!drag) return;\n const me = e as MouseEvent;\n if (typeof me.clientX !== \"number\") return;\n\n if (!drag.active) {\n const dx = Math.abs(me.clientX - drag.startX);\n const dy = Math.abs(me.clientY - drag.startY);\n if (dx < 4 && dy < 4) return;\n drag.active = true;\n drag.axis = dx >= dy ? \"h\" : \"v\";\n this.core.skeleton.root.classList.add(\"mach-root--filling\");\n }\n\n if (drag.axis === \"v\") {\n const target = this.fillTargetRow(me);\n const end = this.rangeSelection.getEnd();\n if (end && end.row !== target) {\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: target, colIdx: end.colIdx });\n this.refreshRowRange(old, this.normalizedRange());\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n return;\n }\n\n const targetCol = Math.max(drag.c2 + 1, this.fillTargetCol(me));\n const end = this.rangeSelection.getEnd();\n if (end && end.colIdx !== targetCol) {\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: end.row, colIdx: targetCol });\n this.refreshRowRange(old, this.normalizedRange());\n this.updateFillHandle();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n };\n\n private fillHorizontal(\n r1: number,\n r2: number,\n c1: number,\n c2: number,\n targetEnd: number\n ): void {\n const flat = this.core.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.core.undoService.beginBatch();\n try {\n for (let r = r1; r <= r2; r++) {\n const srcNode = this.core.rowModel.getDisplayedRow(r);\n if (!srcNode || srcNode.isDetail || srcNode.isGroup) continue;\n const sources: any[] = [];\n for (let c = c1; c <= c2; c++) {\n const col = flat[c];\n sources.push(col ? this.core.getCellValue(srcNode, col) : undefined);\n }\n const n = c2 - c1 + 1;\n const allNumeric =\n n > 1 && sources.every((v) => typeof v === \"number\" && !isNaN(v));\n const diff = allNumeric ? (sources[n - 1] - sources[0]) / (n - 1) : 0;\n const intPattern =\n !allNumeric || sources.every((v) => Number.isInteger(v));\n\n for (let t = c2 + 1; t <= targetEnd; t++) {\n const col = flat[t];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n if (!this.core.editingService.isEditable(srcNode, col)) continue;\n const colOffset = t - c1;\n let value: any;\n if (n === 1) {\n value = sources[0];\n } else if (allNumeric) {\n const steps = colOffset - (n - 1);\n value = sources[n - 1] + diff * steps;\n value = intPattern ? Math.round(value) : Math.round(value * 1e6) / 1e6;\n } else {\n value = sources[colOffset % n];\n }\n const old = this.core.getCellValue(srcNode, col);\n if (this.core.setCellValue(srcNode, col, value, old)) changedRows.add(r);\n }\n }\n } finally {\n this.core.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.refreshRows([...changedRows]);\n this.core.summaryRenderer.refresh();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n }\n\n private onFillUp = (e: Event): void => {\n const drag = this.fillDrag;\n if (!drag) return;\n const me = e as MouseEvent;\n\n const finish = (): void => {\n this.cancelFillDrag();\n };\n\n if (!drag.active) {\n finish();\n return;\n }\n\n if (drag.axis === \"h\") {\n const targetCol =\n typeof me.clientX === \"number\" ? Math.max(drag.c2 + 1, this.fillTargetCol(me)) : drag.c2 + 1;\n finish();\n if (targetCol > drag.c2) {\n this.fillHorizontal(drag.r1, drag.r2, drag.c1, drag.c2, targetCol);\n this.updateFillHandle();\n } else {\n const end = this.rangeSelection.getEnd();\n if (!end || end.colIdx === drag.c2) return;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: end.row, colIdx: drag.c2 });\n this.refreshRowRange(old, this.normalizedRange());\n }\n return;\n }\n\n const targetRow = typeof me.clientY === \"number\" ? this.fillTargetRow(me) : drag.r2;\n finish();\n if (targetRow > drag.r2) {\n this.fillValues(drag.r1, drag.r2, drag.c1, drag.c2, targetRow);\n this.updateFillHandle();\n } else {\n const end = this.rangeSelection.getEnd();\n if (!end || end.row === drag.r2) return;\n const old = this.normalizedRange();\n this.rangeSelection.setEnd({ row: drag.r2, colIdx: end.colIdx });\n this.refreshRowRange(old, this.normalizedRange());\n }\n };\n\n private fillValues(r1: number, r2: number, c1: number, c2: number, targetEnd: number): void {\n const flat = this.core.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.core.undoService.beginBatch();\n try {\n this.fillValuesInner(r1, r2, c1, c2, targetEnd, flat, changedRows);\n } finally {\n this.core.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.refreshRows([...changedRows]);\n this.core.summaryRenderer.refresh();\n this.core.emit(\"rangeSelectionChanged\", { range: this.getRangeSelection() });\n }\n }\n\n private fillValuesInner(\n r1: number,\n r2: number,\n c1: number,\n c2: number,\n targetEnd: number,\n flat: Column[],\n changedRows: Set<number>\n ): void {\n for (let c = c1; c <= c2; c++) {\n const col = flat[c];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n\n const sources: any[] = [];\n let allNumeric = r1 < r2;\n for (let r = r1; r <= r2; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node) {\n allNumeric = false;\n sources.push(undefined);\n continue;\n }\n const v = this.core.getCellValue(node, col);\n sources.push(v);\n if (typeof v !== \"number\" || isNaN(v)) allNumeric = false;\n }\n if (sources[0] === undefined && sources.length === 1) continue;\n\n const n = r2 - r1 + 1;\n let diff = 0;\n let intPattern = true;\n if (allNumeric) {\n diff = (sources[n - 1] - sources[0]) / (n - 1);\n for (const v of sources) if (!Number.isInteger(v)) intPattern = false;\n }\n\n for (let r = r2 + 1; r <= targetEnd; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n if (!this.core.editingService.isEditable(node, col)) continue;\n let value: any;\n if (n === 1) {\n value = sources[0];\n } else if (allNumeric) {\n const steps = r - r2;\n value = sources[n - 1] + diff * steps;\n value = intPattern ? Math.round(value) : Math.round(value * 1e6) / 1e6;\n } else {\n value = sources[(r - r1) % n];\n }\n const old = this.core.getCellValue(node, col);\n if (this.core.setCellValue(node, col, value, old)) changedRows.add(r);\n }\n }\n }\n\n setFocusedCell(rowIndex: number | null, colId: string | null): void {\n this.clearFocusClass();\n if (rowIndex == null || colId == null) {\n this.focusedCell = null;\n return;\n }\n this.focusedCell = { rowIndex, colId };\n this.applyFocusClass();\n this.ensureFocusedCellVisible();\n }\n\n private applyFocusClass(): void {\n if (!this.focusedCell) return;\n const cell = this.getCellElement(this.focusedCell.rowIndex, this.focusedCell.colId);\n if (cell) {\n const colIndex = Math.max(0, this.core.columnModel.getFlatIndex(this.focusedCell.colId));\n cell.id = `mach-grid-${this.core.gridId}-r${this.focusedCell.rowIndex}-c${colIndex}`;\n cell.classList.add(\"mach-cell--focus\");\n this.core.skeleton.root.setAttribute(\"aria-activedescendant\", cell.id);\n }\n }\n\n private clearFocusClass(): void {\n if (this.focusedCell) {\n const cell = this.getCellElement(this.focusedCell.rowIndex, this.focusedCell.colId);\n if (cell) {\n cell.classList.remove(\"mach-cell--focus\");\n cell.removeAttribute(\"id\");\n }\n }\n this.core.skeleton.root.removeAttribute(\"aria-activedescendant\");\n }\n\n private ensureFocusedCellVisible(): void {\n if (!this.focusedCell) return;\n this.scrollToIndex(this.focusedCell.rowIndex, \"nearest\");\n\n const column = this.core.columnModel.getColumn(this.focusedCell.colId);\n if (!column || column.pinned) return;\n const viewport = this.core.skeleton.bodyViewports.center;\n let x = 0;\n for (const col of this.core.columnModel.getPaneColumns(\"center\")) {\n if (col.id === column.id) break;\n x += col.currentWidth;\n }\n const left = viewport.scrollLeft;\n const width = viewport.clientWidth;\n if (x < left) viewport.scrollLeft = x;\n else if (x + column.currentWidth > left + width) {\n viewport.scrollLeft = x + column.currentWidth - width;\n }\n }\n\n scrollToIndex(rowIndex: number, position: \"top\" | \"bottom\" | \"middle\" | \"nearest\" = \"top\"): void {\n const viewport = this.core.skeleton.bodyViewports.center;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n if (rowCount === 0) return;\n const index = clamp(rowIndex, 0, rowCount - 1);\n const viewportHeight = viewport.clientHeight;\n const scrollTop = viewport.scrollTop;\n const rowTop = this.positions[index];\n const rowBottom = this.positions[index + 1];\n\n let target = scrollTop;\n if (position === \"top\") {\n target = rowTop;\n } else if (position === \"bottom\") {\n target = rowBottom - viewportHeight;\n } else if (position === \"middle\") {\n target = rowTop - (viewportHeight - (rowBottom - rowTop)) / 2;\n } else {\n if (rowTop < scrollTop) target = rowTop;\n else if (rowBottom > scrollTop + viewportHeight) target = rowBottom - viewportHeight;\n }\n\n const maxScroll = Math.max(0, this.positions[rowCount] - viewportHeight);\n viewport.scrollTop = clamp(target, 0, maxScroll);\n }\n\n private setHoverIndex(index: number): void {\n if (this.hoverIndex === index) return;\n const prev = this.hoverIndex;\n this.hoverIndex = index;\n this.toggleHover(prev, false);\n this.toggleHover(index, true);\n }\n\n private toggleHover(index: number, hover: boolean): void {\n if (index < 0) return;\n const slot = this.pool[index % this.poolSize];\n if (!slot || slot.index !== index || slot.kind !== \"master\") return;\n for (const pane of PANES) {\n slot.rows[pane]?.classList.toggle(\"mach-row--hover\", hover);\n }\n }\n\n focusGridRoot(): void {\n this.core.skeleton.root.focus({ preventScroll: true });\n }\n\n private resolveEventTarget(e: MouseEvent): { node: RowNode<any>; index: number; cellEl: HTMLElement | null } | null {\n const target = e.target as HTMLElement;\n const rowEl = target.closest<HTMLElement>(\".mach-row\");\n if (!rowEl) return null;\n const index = Number(rowEl.dataset.index);\n if (Number.isNaN(index)) return null;\n const node = this.core.rowModel.getDisplayedRow(index);\n if (!node) return null;\n const cellEl = target.closest<HTMLElement>(\".mach-cell\");\n return { node, index, cellEl };\n }\n\n private onBodyClick = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved) return;\n const { node, index, cellEl } = resolved;\n\n if (node.isGroup) {\n this.focusGridRoot();\n const checkbox = (e.target as HTMLElement).closest?.(\".mach-row-checkbox\");\n if (checkbox) {\n this.core.selectionService.setGroupSelected(node, !this.core.selectionService.getGroupSelectionState(node).all);\n return;\n }\n const labelCol = this.core.columnModel.getGroupLabelColumn();\n if (!labelCol || !cellEl || cellEl.dataset.colId === labelCol.id) {\n this.core.rowModel.toggleGroup(node.id);\n }\n return;\n }\n\n const target = e.target as HTMLElement;\n\n if (this.handleTreeToggleClick(target, node, cellEl)) return;\n\n const colId = cellEl?.dataset.colId ?? \"\";\n const column = colId ? this.core.columnModel.getColumn(colId) : undefined;\n\n if (column?.isDetailToggle && !node.isDetail) {\n this.focusGridRoot();\n this.core.toggleDetail(node.id);\n return;\n }\n\n if (node.isDetail) return;\n\n if (target.closest?.(\".mach-row-checkbox\")) {\n this.focusGridRoot();\n if (!this.core.options.suppressCellFocus) this.setFocusedCell(index, this.firstCheckboxColId());\n this.core.selectionService.onRowClick(node, e, true);\n return;\n }\n\n if (!cellEl || !column) return;\n\n this.focusGridRoot();\n if (!this.core.options.suppressCellFocus) this.setFocusedCell(index, colId);\n this.core.selectionService.onRowClick(node, e, false);\n\n const value = this.core.getCellValue(node, column);\n const event = this.core.emit(\"cellClicked\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value\n });\n column.colDef.onCellClick?.(event);\n this.core.emit(\"rowClicked\", { event: e, rowNode: node, rowIndex: index });\n\n const singleClick = this.core.options.singleClickEdit || column.colDef.singleClickEdit === true;\n if (singleClick && !node.isGroup && this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(index, column);\n }\n };\n\n private handleTreeToggleClick(target: HTMLElement, node: RowNode<any>, cell: HTMLElement | null): boolean {\n if (!this.core.rowModel.isTree || !target.closest(\".mach-detail-toggle\")) return false;\n const treeColumn = this.getTreeColumn();\n if (!treeColumn || cell?.dataset.colId !== treeColumn.id || !this.core.rowModel.isRowExpandable(node)) return false;\n this.focusGridRoot();\n if (node.treeLoadError) void this.core.rowModel.loadTreeChildren(node.id, true).catch(() => undefined);\n else this.core.rowModel.toggleDetail(node.id);\n return true;\n }\n\n private firstCheckboxColId(): string {\n for (const col of this.core.columnModel.getOrderedVisible()) {\n if (col.hasCheckbox) return col.id;\n }\n return this.core.columnModel.getOrderedVisible()[0]?.id ?? \"\";\n }\n\n private onBodyDblClick = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved) return;\n const { node, index, cellEl } = resolved;\n if (node.isDetail || node.isGroup || !cellEl) return;\n const colId = cellEl.dataset.colId ?? \"\";\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n\n const value = this.core.getCellValue(node, column);\n const event = this.core.emit(\"cellDoubleClicked\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value\n });\n column.colDef.onCellDoubleClick?.(event);\n this.core.emit(\"rowDoubleClicked\", { event: e, rowNode: node, rowIndex: index });\n\n if (this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(index, column);\n }\n };\n\n private onContextMenu = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved || resolved.node.isDetail || resolved.node.isGroup || !resolved.cellEl) return;\n const { node, index, cellEl } = resolved;\n const colId = cellEl.dataset.colId ?? \"\";\n const column = this.core.columnModel.getColumn(colId);\n if (!column) return;\n this.core.emit(\"cellContextMenu\", {\n event: e,\n rowNode: node,\n rowIndex: index,\n column,\n colDef: column.colDef,\n value: this.core.getCellValue(node, column)\n });\n if (this.core.options.contextMenu) {\n e.preventDefault();\n if (this.core.options.enableRangeSelection && !this.normalizedRange()) {\n const colIdx = this.core.columnModel.getFlatIndex(colId);\n if (colIdx >= 0) this.startRange(index, colIdx, false);\n }\n this.core.contextMenuService.open(e.clientX, e.clientY, { rowIndex: index, colId });\n }\n };\n\n private onMouseDown = (e: MouseEvent): void => {\n if (this.core.editingService.isCellEditing()) {\n this.core.editingService.stop(false);\n }\n if (this.core.options.enableRangeSelection && e.button === 0) {\n const resolved = this.resolveEventTarget(e);\n if (\n resolved &&\n !resolved.node.isDetail &&\n !resolved.node.isGroup &&\n resolved.cellEl &&\n !(e.target as HTMLElement).closest?.(\".mach-row-checkbox\")\n ) {\n const colIdx = this.core.columnModel.getFlatIndex(resolved.cellEl.dataset.colId ?? \"\");\n if (colIdx >= 0) {\n this.startRange(resolved.index, colIdx, e.shiftKey);\n this.rangeDragging = true;\n if (!e.shiftKey && !this.core.options.suppressCellFocus) {\n this.setFocusedCell(resolved.index, resolved.cellEl.dataset.colId ?? \"\");\n }\n }\n }\n }\n };\n\n private onWindowMouseUp = (): void => {\n this.rangeDragging = false;\n };\n\n private onMouseOver = (e: MouseEvent): void => {\n if (this.core.isDestroyed()) return;\n const resolved = this.resolveEventTarget(e);\n if (this.rangeDragging) {\n if (resolved && !resolved.node.isDetail && !resolved.node.isGroup && resolved.cellEl) {\n const colIdx = this.core.columnModel.getFlatIndex(resolved.cellEl.dataset.colId ?? \"\");\n const end = this.rangeSelection.getEnd();\n if (colIdx >= 0 && end && (end.row !== resolved.index || end.colIdx !== colIdx)) {\n this.startRange(resolved.index, colIdx, true);\n }\n }\n }\n if (this.core.options.suppressRowHoverHighlight) return;\n if (!resolved || resolved.node.isDetail) return;\n this.setHoverIndex(resolved.index);\n };\n\n private onMouseLeave = (): void => {\n this.setHoverIndex(-1);\n };\n\n private onDragHandlePointerDown = (e: PointerEvent): void => {\n if (this.core.isDestroyed() || e.button !== 0) return;\n const target = e.target as HTMLElement;\n if (!target.closest(\".mach-row-drag-handle\")) return;\n const resolved = this.resolveEventTarget(e);\n if (!resolved || resolved.node.isDetail || resolved.node.isGroup) return;\n\n this.rowDragController.start(e, resolved.node);\n e.preventDefault();\n };\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText } from \"../lib/locale\";\n\ntype SummaryContext = Pick<\n GridCore<any>,\n \"columnModel\" | \"getCellValue\" | \"isDestroyed\" | \"options\" | \"reportError\" | \"rowModel\" | \"skeleton\"\n>;\n\nexport class SummaryRenderer {\n private footerEl: HTMLElement | null = null;\n private rows: Record<PaneType, HTMLElement> = { left: undefined!, center: undefined!, right: undefined! };\n private cellsByPane: Record<PaneType, HTMLElement[]> = { left: [], center: [], right: [] };\n\n constructor(private core: SummaryContext) {}\n\n init(): void {\n this.footerEl = el(\"div\", \"mach-footer\");\n this.footerEl.style.display = \"none\";\n this.footerEl.setAttribute(\"role\", \"row\");\n this.core.skeleton.root.appendChild(this.footerEl);\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const row = el(\"div\", `mach-footer-row mach-footer-row--${pane}`);\n row.style.height = `${this.core.options.rowHeight}px`;\n this.footerEl.appendChild(row);\n this.rows[pane] = row;\n }\n }\n\n setVisible(visible: boolean): void {\n if (!this.footerEl) return;\n this.footerEl.style.display = visible ? \"\" : \"none\";\n }\n\n refresh(): void {\n if (!this.footerEl || this.core.isDestroyed()) return;\n const show = this.core.options.showSummary;\n this.setVisible(show);\n if (!show) return;\n\n const method = this.core.options.summaryMethod;\n const masterRows = this.core.rowModel.getDisplayedRows().filter((n) => !n.isDetail && !n.isGroup);\n const locale = { ...DEFAULT_LOCALE, ...this.core.options.locale };\n\n for (const pane of [\"left\", \"center\", \"right\"] as PaneType[]) {\n const cols = this.core.columnModel.getPaneColumns(pane);\n const row = this.rows[pane];\n if (this.cellsByPane[pane].length !== cols.length) {\n row.textContent = \"\";\n this.cellsByPane[pane] = cols.map(() => {\n const cell = el(\"div\", \"mach-footer-cell\");\n cell.setAttribute(\"role\", \"cell\");\n row.appendChild(cell);\n return cell;\n });\n }\n let x = 0;\n cols.forEach((col, i) => {\n const cell = this.cellsByPane[pane][i];\n cell.style.left = `${x}px`;\n cell.style.width = `${col.currentWidth}px`;\n x += col.currentWidth;\n\n if (col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) {\n cell.textContent = \"\";\n return;\n }\n if (method) {\n try {\n cell.textContent = method({\n colId: col.id,\n column: col,\n values: masterRows.map((node) => this.core.getCellValue(node, col))\n });\n } catch (error) {\n this.core.reportError(error, \"summaryMethod\", { colId: col.id });\n cell.textContent = \"\";\n }\n } else if (i === 0 && pane === \"left\") {\n cell.textContent = formatText(locale.totalRowsLabel, masterRows.length);\n } else {\n cell.textContent = \"\";\n }\n });\n }\n }\n\n destroy(): void {\n this.footerEl?.remove();\n this.footerEl = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText, formatTwo } from \"../lib/locale\";\n\ntype PaginationContext = Pick<\n GridCore<any>,\n \"eventBus\" | \"isDestroyed\" | \"options\" | \"rowModel\" | \"skeleton\"\n>;\n\nexport class PaginationBar {\n private barEl: HTMLElement | null = null;\n private totalEl: HTMLElement | null = null;\n private pageEl: HTMLElement | null = null;\n private sizeSelect: HTMLSelectElement | null = null;\n private firstBtn: HTMLButtonElement | null = null;\n private prevBtn: HTMLButtonElement | null = null;\n private nextBtn: HTMLButtonElement | null = null;\n private lastBtn: HTMLButtonElement | null = null;\n private offs: (() => void)[] = [];\n\n constructor(private core: PaginationContext) {}\n\n init(): void {\n this.barEl = el(\"div\", \"mach-pagination\");\n this.barEl.style.display = \"none\";\n this.barEl.setAttribute(\"role\", \"navigation\");\n\n const mkBtn = (cls: string, label: string, text: string): HTMLButtonElement => {\n const btn = el(\"button\", `mach-pagination-btn ${cls}`) as HTMLButtonElement;\n btn.type = \"button\";\n btn.title = label;\n btn.setAttribute(\"aria-label\", label);\n btn.textContent = text;\n return btn;\n };\n\n this.totalEl = el(\"span\", \"mach-pagination-total\");\n this.firstBtn = mkBtn(\"mach-pagination-first\", this.t(\"pageFirst\"), \"«\");\n this.prevBtn = mkBtn(\"mach-pagination-prev\", this.t(\"pagePrev\"), \"‹\");\n this.pageEl = el(\"span\", \"mach-pagination-page\");\n this.nextBtn = mkBtn(\"mach-pagination-next\", this.t(\"pageNext\"), \"›\");\n this.lastBtn = mkBtn(\"mach-pagination-last\", this.t(\"pageLast\"), \"»\");\n\n this.firstBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(1));\n this.prevBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getCurrentPage() - 1));\n this.nextBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getCurrentPage() + 1));\n this.lastBtn.addEventListener(\"click\", () => this.core.rowModel.setPage(this.core.rowModel.getPageCount()));\n\n this.barEl.append(this.totalEl, this.firstBtn, this.prevBtn, this.pageEl, this.nextBtn, this.lastBtn);\n\n if (this.core.options.paginationShowSizeSelector) {\n this.sizeSelect = document.createElement(\"select\");\n this.sizeSelect.className = \"mach-pagination-size\";\n this.sizeSelect.setAttribute(\"aria-label\", \"page size\");\n this.buildSizeOptions();\n this.sizeSelect.addEventListener(\"change\", () => {\n const size = Number(this.sizeSelect!.value);\n if (!Number.isNaN(size)) this.core.rowModel.setPageSize(size);\n });\n this.barEl.appendChild(this.sizeSelect);\n }\n\n this.core.skeleton.root.appendChild(this.barEl);\n\n this.offs.push(\n this.core.eventBus.on(\"modelUpdated\", () => this.refresh()),\n this.core.eventBus.on(\"paginationChanged\", () => this.refresh())\n );\n this.refresh();\n }\n\n private buildSizeOptions(): void {\n if (!this.sizeSelect) return;\n const options = this.core.options.paginationPageSizeOptions;\n const current = this.core.options.paginationPageSize;\n if (!options.includes(current)) {\n options.push(current);\n options.sort((a, b) => a - b);\n }\n this.sizeSelect.textContent = \"\";\n for (const size of options) {\n const option = document.createElement(\"option\");\n option.value = String(size);\n option.textContent = formatText(this.t(\"perPage\"), size);\n if (size === current) option.selected = true;\n this.sizeSelect.appendChild(option);\n }\n }\n\n private t(key: Parameters<GridCore<any>[\"getLocaleText\"]>[0]): string {\n return this.core.options.locale?.[key] ?? DEFAULT_LOCALE[key];\n }\n\n rebuild(): void {\n if (!this.barEl) return;\n if (this.sizeSelect && this.core.options.paginationShowSizeSelector) {\n this.buildSizeOptions();\n }\n this.refresh();\n }\n\n refresh(): void {\n if (!this.barEl || this.core.isDestroyed()) return;\n const rm = this.core.rowModel;\n const active = rm.paginationActive;\n const total = rm.getTotalRowCount();\n const visible = active && total > 0;\n this.barEl.style.display = visible ? \"\" : \"none\";\n if (!visible) return;\n\n const page = rm.getCurrentPage();\n const pageCount = rm.getPageCount();\n\n if (this.totalEl && this.core.options.paginationShowTotal) {\n const text = formatText(this.t(\"paginationTotal\"), total);\n if (this.totalEl.textContent !== text) this.totalEl.textContent = text;\n }\n if (this.pageEl) {\n const text = formatTwo(this.t(\"paginationPage\"), page, pageCount);\n if (this.pageEl.textContent !== text) this.pageEl.textContent = text;\n }\n if (this.firstBtn) this.firstBtn.disabled = page <= 1;\n if (this.prevBtn) this.prevBtn.disabled = page <= 1;\n if (this.nextBtn) this.nextBtn.disabled = page >= pageCount;\n if (this.lastBtn) this.lastBtn.disabled = page >= pageCount;\n if (this.sizeSelect && Number(this.sizeSelect.value) !== this.core.options.paginationPageSize) {\n this.sizeSelect.value = String(this.core.options.paginationPageSize);\n }\n }\n\n destroy(): void {\n for (const off of this.offs) off();\n this.offs = [];\n this.barEl?.remove();\n this.barEl = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport type { PaneType } from \"../services/columnModel\";\nimport type { RowNode } from \"../types/row\";\nimport { el } from \"../lib/dom\";\nimport { renderCellContent, cleanupCellContent, applyCellClasses, applyCellStyle } from \"./cellContent\";\n\ntype PinnedRowsContext = Pick<\n GridCore<any>,\n | \"columnModel\"\n | \"getApi\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"relayout\"\n | \"reportError\"\n | \"resolveCellRenderer\"\n | \"skeleton\"\n>;\n\nconst PANES: PaneType[] = [\"left\", \"center\", \"right\"];\n\ninterface SideState {\n root: HTMLElement;\n segments: Record<PaneType, HTMLElement>;\n centerViewport: HTMLElement;\n rowWrappers: Record<PaneType, HTMLElement[]>;\n cells: Record<PaneType, HTMLElement[]>[];\n data: any[];\n}\n\nexport class PinnedRowsRenderer {\n private top: SideState | null = null;\n private bottom: SideState | null = null;\n\n constructor(private core: PinnedRowsContext) {}\n\n init(): void {\n this.top = this.createSide(this.core.skeleton.pinnedTopEl);\n this.bottom = this.createSide(this.core.skeleton.pinnedBottomEl);\n }\n\n private createSide(root: HTMLElement): SideState {\n const state: SideState = {\n root,\n segments: { left: el(\"div\"), center: el(\"div\"), right: el(\"div\") },\n centerViewport: el(\"div\", \"mach-pinned-viewport\"),\n rowWrappers: { left: [], center: [], right: [] },\n cells: [],\n data: []\n };\n for (const pane of PANES) {\n state.segments[pane].className = `mach-pinned-seg mach-pinned-seg--${pane}`;\n if (pane !== \"center\") state.segments[pane].classList.add(\"mach-pane--hidden\");\n if (pane === \"center\") {\n state.centerViewport.appendChild(state.segments[pane]);\n }\n }\n root.append(state.segments.left, state.centerViewport, state.segments.right);\n return state;\n }\n\n setData(top: any[] | null, bottom: any[] | null): void {\n if (this.core.isDestroyed() || !this.top || !this.bottom) return;\n this.top.data = top ?? [];\n this.bottom.data = bottom ?? [];\n this.rebuild();\n this.applyLayout();\n this.core.relayout();\n }\n\n setTopData(rows: any[] | null): void {\n if (this.core.isDestroyed() || !this.top) return;\n this.top.data = rows ?? [];\n this.rebuildSide(this.top, \"top\");\n this.applyLayout();\n this.core.relayout();\n }\n\n setBottomData(rows: any[] | null): void {\n if (this.core.isDestroyed() || !this.bottom) return;\n this.bottom.data = rows ?? [];\n this.rebuildSide(this.bottom, \"bottom\");\n this.applyLayout();\n this.core.relayout();\n }\n\n getTopData(): any[] {\n return this.top ? this.top.data.slice() : [];\n }\n\n getBottomData(): any[] {\n return this.bottom ? this.bottom.data.slice() : [];\n }\n\n rebuild(): void {\n if (!this.top || !this.bottom) return;\n this.rebuildSide(this.top, \"top\");\n this.rebuildSide(this.bottom, \"bottom\");\n }\n\n private rebuildSide(side: SideState, sideName: \"top\" | \"bottom\"): void {\n for (const row of side.cells) {\n for (const pane of PANES) {\n for (const cell of row[pane]) cleanupCellContent(this.core, cell);\n }\n }\n for (const pane of PANES) {\n for (const wrapper of side.rowWrappers[pane]) wrapper.remove();\n side.rowWrappers[pane] = [];\n }\n side.cells = [];\n side.root.style.display = side.data.length > 0 ? \"\" : \"none\";\n if (side.data.length === 0) return;\n\n const rowHeight = this.core.options.rowHeight;\n const cm = this.core.columnModel;\n\n side.data.forEach((data, i) => {\n const node: RowNode<any> = {\n id: `__pinned_${sideName}_${i}`,\n data,\n rowIndex: -1,\n selected: false\n };\n const cellsByPane = {} as Record<PaneType, HTMLElement[]>;\n for (const pane of PANES) {\n const wrapper = el(\"div\", \"mach-pinned-row\");\n wrapper.style.height = `${rowHeight}px`;\n wrapper.setAttribute(\"role\", \"row\");\n cellsByPane[pane] = [];\n for (const col of cm.getPaneColumns(pane)) {\n const cell = el(\"div\", \"mach-cell\");\n cell.dataset.colId = col.id;\n cell.setAttribute(\"role\", \"gridcell\");\n if (col.hasCheckbox) cell.classList.add(\"mach-cell--selection\");\n if (!col.hasCheckbox && !col.isDetailToggle && !col.colDef.rowDrag && col.colDef.type !== \"index\") {\n try {\n renderCellContent(this.core, cell, node, col);\n applyCellClasses(this.core, cell, node, col);\n applyCellStyle(this.core, cell, node, col);\n } catch (err) {\n this.core.reportError(err, \"pinnedRow.render\", { colId: col.id, side: sideName, rowIndex: i });\n }\n }\n wrapper.appendChild(cell);\n cellsByPane[pane].push(cell);\n }\n side.segments[pane].appendChild(wrapper);\n side.rowWrappers[pane].push(wrapper);\n }\n side.cells.push(cellsByPane);\n });\n }\n\n applyLayout(): void {\n if (!this.top || !this.bottom) return;\n const cm = this.core.columnModel;\n const widths: Record<PaneType, number> = { left: 0, center: 0, right: 0 };\n const lefts: Record<PaneType, number[]> = { left: [], center: [], right: [] };\n for (const pane of PANES) {\n let x = 0;\n for (const col of cm.getPaneColumns(pane)) {\n lefts[pane].push(x);\n x += col.currentWidth;\n }\n widths[pane] = x;\n }\n\n for (const side of [this.top, this.bottom]) {\n const hidden = side.data.length === 0;\n side.segments.left.classList.toggle(\"mach-pane--hidden\", hidden || widths.left <= 0);\n side.segments.right.classList.toggle(\"mach-pane--hidden\", hidden || widths.right <= 0);\n side.segments.left.style.width = `${widths.left}px`;\n side.segments.right.style.width = `${widths.right}px`;\n side.segments.center.style.width = `${widths.center}px`;\n side.cells.forEach((cellsByPane) => {\n let globalColOffset = 0;\n for (const pane of PANES) {\n const cols = cm.getPaneColumns(pane);\n cellsByPane[pane].forEach((cell, i) => {\n cell.style.width = `${cols[i].currentWidth}px`;\n cell.style.left = `${lefts[pane][i]}px`;\n cell.setAttribute(\"aria-colindex\", String(globalColOffset + i + 1));\n });\n globalColOffset += cols.length;\n }\n });\n }\n }\n\n onScrollLeft(scrollLeft: number): void {\n if (this.top) this.top.segments.center.style.transform = `translateX(${-scrollLeft}px)`;\n if (this.bottom) this.bottom.segments.center.style.transform = `translateX(${-scrollLeft}px)`;\n }\n\n refresh(): void {\n this.rebuild();\n this.applyLayout();\n }\n\n destroy(): void {\n for (const side of [this.top, this.bottom]) {\n if (!side) continue;\n for (const row of side.cells) {\n for (const pane of PANES) {\n for (const cell of row[pane]) cleanupCellContent(this.core, cell);\n }\n }\n }\n this.top = null;\n this.bottom = null;\n }\n}\n","import type { GridCore } from \"../core/gridCore\";\nimport { el } from \"../lib/dom\";\nimport { DEFAULT_LOCALE, formatText, type RgLocaleKey } from \"../lib/locale\";\nimport type { StatusBarPanel } from \"../types/options\";\n\ntype AnyLocale = Record<string, string | undefined>;\ntype StatusBarContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\n | \"columnModel\"\n | \"eventBus\"\n | \"getCellValue\"\n | \"isDestroyed\"\n | \"options\"\n | \"rowModel\"\n | \"selectionService\"\n | \"skeleton\"\n>;\n\nexport class StatusBarService {\n private barEl: HTMLElement | null = null;\n private items: Partial<Record<StatusBarPanel, HTMLElement>> = {};\n private offs: (() => void)[] = [];\n\n constructor(private core: StatusBarContext) {}\n\n init(): void {\n this.barEl = el(\"div\", \"mach-statusbar\");\n this.barEl.style.display = \"none\";\n this.barEl.setAttribute(\"role\", \"status\");\n this.core.skeleton.root.appendChild(this.barEl);\n this.rebuild();\n\n this.offs.push(\n this.core.eventBus.on(\"modelUpdated\", () => this.refresh()),\n this.core.eventBus.on(\"selectionChanged\", () => this.refresh()),\n this.core.eventBus.on(\"rangeSelectionChanged\", () => this.refresh()),\n this.core.eventBus.on(\"cellValueChanged\", () => this.refresh())\n );\n }\n\n rebuild(): void {\n if (!this.barEl) return;\n this.barEl.textContent = \"\";\n this.items = {};\n const options = this.core.options;\n if (!options.statusBarEnabled) {\n this.barEl.style.display = \"none\";\n return;\n }\n for (const panel of options.statusBarPanels) {\n const item = el(\"span\", `mach-statusbar-item mach-statusbar-item--${panel}`);\n this.barEl.appendChild(item);\n this.items[panel] = item;\n }\n this.refresh();\n }\n\n refresh(): void {\n if (!this.barEl || this.core.isDestroyed()) return;\n const options = this.core.options;\n this.barEl.style.display = options.statusBarEnabled ? \"\" : \"none\";\n if (!options.statusBarEnabled) return;\n\n const locale: AnyLocale = { ...DEFAULT_LOCALE, ...options.locale };\n const text = (key: RgLocaleKey, value?: number | string): string => {\n const template = locale[key] ?? DEFAULT_LOCALE[key];\n return value === undefined ? template : formatText(template, typeof value === \"number\" ? value : parseFloat(String(value)) || 0);\n };\n\n if (this.items.rowCount) {\n const rm = this.core.rowModel;\n const total = rm.getDisplayTotalCount();\n const loaded = rm.paginationActive ? rm.getTotalRowCount() : rm.getDisplayedRowCount();\n const value =\n rm.isInfinite && total > loaded\n ? `${formatText(text(\"totalRowsLabel\"), loaded)} / ${total}`\n : formatText(text(\"totalRowsLabel\"), loaded);\n if (this.items.rowCount.textContent !== value) this.items.rowCount.textContent = value;\n }\n\n if (this.items.selectedRowCount) {\n const count = this.core.selectionService.getSelectedNodes().length;\n const value = formatText(text(\"statusSelected\"), count);\n if (this.items.selectedRowCount.textContent !== value) {\n this.items.selectedRowCount.textContent = value;\n }\n }\n\n if (this.items.rangeAggregate) {\n const range = this.core.bodyRenderer.normalizedRange();\n let value = \"\";\n if (range) {\n const flat = this.core.columnModel.getOrderedVisible();\n let sum = 0;\n let count = 0;\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.core.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n for (let c = range.c1; c <= range.c2; c++) {\n const col = flat[c];\n if (!col) continue;\n const v = this.core.getCellValue(node, col);\n if (typeof v === \"number\" && !isNaN(v)) {\n sum += v;\n count++;\n }\n }\n }\n if (count > 0) {\n const avg = Math.round((sum / count) * 100) / 100;\n const sumText = Number.isInteger(sum) ? String(sum) : String(Math.round(sum * 100) / 100);\n value = `${text(\"statusSum\", sumText)} · ${text(\"statusAvg\", String(avg))} · ${text(\"statusCount\", String(count))}`;\n }\n }\n if (this.items.rangeAggregate.textContent !== value) this.items.rangeAggregate.textContent = value;\n }\n }\n\n destroy(): void {\n for (const off of this.offs) off();\n this.offs = [];\n this.barEl?.remove();\n this.barEl = null;\n }\n}\n","import type { ColumnState } from \"../types/colDef\";\nimport type { ColumnStateStore } from \"../types/options\";\n\nexport interface ColumnStateStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport interface StoredColumnState {\n version: number;\n savedAt: number;\n columns: ColumnState[];\n}\n\nexport interface LocalColumnStateStoreOptions {\n /** Storage prefix. Separate applications or environments with different values. */\n namespace?: string;\n /** Schema version for migrations when column identifiers or meanings change. */\n version?: number;\n storage?: ColumnStateStorage;\n maxColumns?: number;\n migrate?(\n columns: readonly ColumnState[],\n fromVersion: number,\n toVersion: number\n ): ColumnState[] | null;\n onError?(error: unknown, operation: \"load\" | \"save\" | \"clear\", key: string): void;\n}\n\nexport interface ManagedColumnStateStore extends ColumnStateStore {\n clear(key: string): void;\n storageKey(key: string): string;\n}\n\nexport interface ColumnStateKeyParts {\n app?: string;\n tenant?: string | number;\n user?: string | number;\n route?: string;\n table: string;\n schema?: string | number;\n}\n\nfunction currentStorage(): ColumnStateStorage | null {\n try {\n return typeof localStorage === \"undefined\" ? null : localStorage;\n } catch {\n return null;\n }\n}\n\nfunction safeSegment(value: string | number): string {\n return encodeURIComponent(String(value).trim()).replace(/%/g, \"~\");\n}\n\nfunction copyColumnDimensions(source: Record<string, unknown>, state: ColumnState): void {\n if (typeof source.width === \"number\" && Number.isFinite(source.width) && source.width > 0) {\n state.width = source.width;\n }\n if (source.flex === null) state.flex = null;\n else if (typeof source.flex === \"number\" && Number.isFinite(source.flex) && source.flex > 0) {\n state.flex = source.flex;\n }\n if (source.widthMode === \"auto\" || source.widthMode === \"manual\") state.widthMode = source.widthMode;\n}\n\nfunction copyColumnSort(source: Record<string, unknown>, state: ColumnState): void {\n if (source.sort === \"asc\" || source.sort === \"desc\" || source.sort === null) state.sort = source.sort;\n if (source.sortIndex === null) state.sortIndex = null;\n else if (typeof source.sortIndex === \"number\" && Number.isInteger(source.sortIndex) && source.sortIndex >= 0) {\n state.sortIndex = source.sortIndex;\n }\n}\n\n/** Builds a collision-resistant key for per-user/per-route table preferences. */\nexport function createColumnStateKey(parts: ColumnStateKeyParts): string {\n const segments: Array<[string, string | number | undefined]> = [\n [\"app\", parts.app],\n [\"tenant\", parts.tenant],\n [\"user\", parts.user],\n [\"route\", parts.route],\n [\"table\", parts.table],\n [\"schema\", parts.schema]\n ];\n return segments\n .filter((entry): entry is [string, string | number] => entry[1] !== undefined && String(entry[1]).trim() !== \"\")\n .map(([name, value]) => `${name}=${safeSegment(value)}`)\n .join(\";\");\n}\n\nfunction sanitizeColumnState(value: unknown, maxColumns: number): ColumnState[] | null {\n if (!Array.isArray(value) || value.length > maxColumns) return null;\n const result: ColumnState[] = [];\n const ids = new Set<string>();\n for (const item of value) {\n if (item == null || typeof item !== \"object\") continue;\n const source = item as Record<string, unknown>;\n if (typeof source.colId !== \"string\" || source.colId.length === 0 || source.colId.length > 256 || ids.has(source.colId)) continue;\n ids.add(source.colId);\n const state: ColumnState = { colId: source.colId };\n if (typeof source.hide === \"boolean\") state.hide = source.hide;\n copyColumnDimensions(source, state);\n if (source.pinned === \"left\" || source.pinned === \"right\" || source.pinned === null) state.pinned = source.pinned;\n copyColumnSort(source, state);\n result.push(state);\n }\n return result;\n}\n\n/**\n * Creates a versioned local state adapter. Legacy array payloads are read as\n * version 0, so existing users can migrate without losing preferences.\n */\nexport function createLocalColumnStateStore(options: LocalColumnStateStoreOptions = {}): ManagedColumnStateStore {\n const namespace = (options.namespace ?? \"mach-table:col-state\").replace(/:+$/, \"\");\n const version = Math.max(1, Math.floor(options.version ?? 1));\n const maxColumns = Math.max(1, Math.floor(options.maxColumns ?? 1_000));\n const storageKey = (key: string): string => `${namespace}:${key}`;\n const report = (error: unknown, operation: \"load\" | \"save\" | \"clear\", key: string): void => {\n try { options.onError?.(error, operation, key); } catch { /* error observers must not break the grid */ }\n };\n\n return {\n storageKey,\n load(key) {\n try {\n const raw = (options.storage ?? currentStorage())?.getItem(storageKey(key));\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n const legacy = sanitizeColumnState(parsed, maxColumns);\n if (!legacy || !options.migrate) return legacy;\n return sanitizeColumnState(options.migrate(legacy, 0, version), maxColumns);\n }\n if (parsed == null || typeof parsed !== \"object\") return null;\n const envelope = parsed as Partial<StoredColumnState>;\n if (!Number.isInteger(envelope.version) || typeof envelope.version !== \"number\") return null;\n const columns = sanitizeColumnState(envelope.columns, maxColumns);\n if (!columns) return null;\n if (envelope.version === version) return columns;\n return options.migrate\n ? sanitizeColumnState(options.migrate(columns, envelope.version, version), maxColumns)\n : null;\n } catch (error) {\n report(error, \"load\", key);\n return null;\n }\n },\n save(key, state) {\n try {\n const columns = sanitizeColumnState(state, maxColumns);\n if (!columns) throw new TypeError(`[MachTable] Invalid column state for \"${key}\".`);\n const envelope: StoredColumnState = { version, savedAt: Date.now(), columns };\n (options.storage ?? currentStorage())?.setItem(storageKey(key), JSON.stringify(envelope));\n } catch (error) {\n report(error, \"save\", key);\n }\n },\n clear(key) {\n try {\n (options.storage ?? currentStorage())?.removeItem(storageKey(key));\n } catch (error) {\n report(error, \"clear\", key);\n }\n }\n };\n}\n\nconst defaultStore = createLocalColumnStateStore();\n\nexport function saveColumnState(key: string, state: ColumnState[]): void {\n void defaultStore.save(key, state);\n}\n\nexport function loadColumnState(key: string): ColumnState[] | null {\n return defaultStore.load(key) as ColumnState[] | null;\n}\n\nexport function clearColumnState(key: string): void {\n void defaultStore.clear(key);\n}\n","import type { GridState } from \"../types/state\";\nimport type { GridStateStore } from \"../types/options\";\nimport type { ColumnStateStorage } from \"./columnStateStore\";\nimport { migrateGridState } from \"./gridState\";\n\nexport interface StoredGridState {\n schemaVersion: 2;\n savedAt: number;\n state: GridState;\n}\n\nexport interface LocalGridStateStoreOptions {\n namespace?: string;\n storage?: ColumnStateStorage;\n /** Reject unexpectedly large or corrupted payloads. Defaults to 512 KiB. */\n maxBytes?: number;\n onError?(error: unknown, operation: \"load\" | \"save\" | \"clear\", key: string): void;\n}\n\nexport interface ManagedGridStateStore extends GridStateStore {\n clear(key: string): void;\n storageKey(key: string): string;\n}\n\nfunction currentStorage(): ColumnStateStorage | null {\n try {\n return typeof localStorage === \"undefined\" ? null : localStorage;\n } catch {\n return null;\n }\n}\n\nfunction storageBytes(value: string): number {\n return typeof TextEncoder === \"undefined\" ? value.length * 2 : new TextEncoder().encode(value).byteLength;\n}\n\n/** Safe, versioned localStorage adapter for full grid state. */\nexport function createLocalGridStateStore(options: LocalGridStateStoreOptions = {}): ManagedGridStateStore {\n const namespace = (options.namespace ?? \"mach-table:grid-state\").replace(/:+$/, \"\");\n const maxBytes = Math.max(1_024, Math.floor(options.maxBytes ?? 512 * 1_024));\n const storageKey = (key: string): string => `${namespace}:${key}`;\n const report = (error: unknown, operation: \"load\" | \"save\" | \"clear\", key: string): void => {\n try { options.onError?.(error, operation, key); } catch { /* observers cannot break the grid */ }\n };\n\n return {\n storageKey,\n load(key) {\n try {\n const raw = (options.storage ?? currentStorage())?.getItem(storageKey(key));\n if (!raw || storageBytes(raw) > maxBytes) return null;\n const parsed = JSON.parse(raw) as { schemaVersion?: unknown; state?: unknown };\n if (parsed?.schemaVersion !== 1 && parsed?.schemaVersion !== 2) return null;\n return migrateGridState(parsed.state);\n } catch (error) {\n report(error, \"load\", key);\n return null;\n }\n },\n save(key, state) {\n try {\n const normalized = migrateGridState(state);\n if (!normalized) throw new TypeError(`[MachTable] Invalid grid state for \"${key}\".`);\n const payload = JSON.stringify({ schemaVersion: 2, savedAt: Date.now(), state: normalized } satisfies StoredGridState);\n if (storageBytes(payload) > maxBytes) throw new RangeError(`[MachTable] Grid state for \"${key}\" exceeds ${maxBytes} bytes.`);\n (options.storage ?? currentStorage())?.setItem(storageKey(key), payload);\n } catch (error) {\n report(error, \"save\", key);\n }\n },\n clear(key) {\n try {\n (options.storage ?? currentStorage())?.removeItem(storageKey(key));\n } catch (error) {\n report(error, \"clear\", key);\n }\n }\n };\n}\n\nconst defaultStore = createLocalGridStateStore();\n\nexport function saveGridState(key: string, state: import(\"../types/state\").GridStateInput): void {\n void defaultStore.save(key, state);\n}\n\nexport function loadGridState(key: string): GridState | null {\n return defaultStore.load(key) as GridState | null;\n}\n\nexport function clearGridState(key: string): void {\n defaultStore.clear(key);\n}\n","import type { CellRendererParams } from \"../types/params\";\nimport type { CellRendererFn } from \"../types/colDef\";\nimport type { ActionPolicyContext } from \"../types/options\";\nimport type { GridChange } from \"../types/api\";\nimport { DEFAULT_LOCALE } from \"./locale\";\n\nexport type TagVariant = \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n\nexport interface StatusTagConfig {\n variantMap?: Record<string, TagVariant>;\n labelMap?: Record<string, string>;\n}\n\nconst DEFAULT_STATUS_VARIANTS: Array<[RegExp, TagVariant]> = [\n [/^(success|ok|done|complete|completed|normal|active|enabled|启用|正常|完成|已完成|运行|运行中|在线|生效)$/i, \"success\"],\n [/^(warning|warn|hold|pending|standby|待机|待审核|暂停|预警|部分完成)$/i, \"warning\"],\n [/^(error|fail|failed|danger|fault|offline|disabled|故障|失败|错误|异常|停用|离线|断开)$/i, \"danger\"],\n [/^(info|processing|new|draft|进行中|新建|草稿|审批中|同步中)$/i, \"info\"]\n];\n\nexport function resolveTagVariant(value: any, variantMap?: Record<string, TagVariant>): TagVariant {\n const key = String(value ?? \"\");\n if (variantMap) {\n const exact = variantMap[key];\n if (exact) return exact;\n const lower = variantMap[key.toLowerCase()];\n if (lower) return lower;\n }\n for (const [pattern, variant] of DEFAULT_STATUS_VARIANTS) {\n if (pattern.test(key)) return variant;\n }\n return \"neutral\";\n}\n\nexport function createStatusTagRenderer(config: StatusTagConfig = {}): CellRendererFn {\n return (params: CellRendererParams) => {\n if (params.value == null || params.value === \"\") return \"\";\n const variant = resolveTagVariant(params.value, config.variantMap);\n const label = config.labelMap?.[String(params.value)] ?? (params.formatted || String(params.value));\n const tag = document.createElement(\"span\");\n tag.className = `mach-tag mach-tag--${variant}`;\n tag.textContent = label;\n return tag;\n };\n}\n\nexport interface ProgressConfig {\n showValue?: boolean;\n unit?: string;\n color?: string;\n}\n\nexport function createProgressBarRenderer(config: ProgressConfig = {}): CellRendererFn {\n return (params: CellRendererParams) => {\n const raw = Number(params.value);\n if (isNaN(raw)) return params.formatted;\n const pct = Math.max(0, Math.min(100, raw));\n const wrap = document.createElement(\"div\");\n wrap.className = \"mach-progress\";\n const track = document.createElement(\"div\");\n track.className = \"mach-progress__track\";\n const bar = document.createElement(\"div\");\n bar.className = \"mach-progress__bar\";\n bar.style.width = `${pct}%`;\n if (config.color) bar.style.background = config.color;\n track.appendChild(bar);\n wrap.appendChild(track);\n if (config.showValue !== false) {\n const label = document.createElement(\"span\");\n label.className = \"mach-progress__label\";\n label.textContent = `${Math.round(pct)}${config.unit ?? \"%\"}`;\n wrap.appendChild(label);\n }\n return wrap;\n };\n}\n\nexport function linkRenderer(params: CellRendererParams): string | HTMLElement {\n if (params.value == null || params.value === \"\") return \"\";\n const link = document.createElement(\"span\");\n link.className = \"mach-link\";\n link.textContent = params.formatted || String(params.value);\n return link;\n}\n\nconst ICON_PATHS = {\n edit: '<path d=\"M11.5 2.5l2 2L5 13H3v-2l8.5-8.5z\"/>',\n delete: '<path d=\"M3 5h10M6 5V3h4v2M5 5l.7 8h4.6L11 5\"/>',\n view: '<path d=\"M1.5 8s2.4-4.2 6.5-4.2S14.5 8 14.5 8s-2.4 4.2-6.5 4.2S1.5 8 1.5 8z\"/><circle cx=\"8\" cy=\"8\" r=\"1.8\"/>',\n copy: '<rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1\"/><path d=\"M3 11V3h8\"/>',\n download: '<path d=\"M8 2v8m0 0l-3-3m3 3l3-3M2.5 13.5h11\"/>',\n refresh: '<path d=\"M13 3v4h-4M3 13V9h4\"/><path d=\"M13 7a5.5 5.5 0 00-9.7-2.6M3 9a5.5 5.5 0 009.7 2.6\"/>',\n close: '<path d=\"M3.5 3.5l9 9m0-9l-9 9\"/>',\n check: '<path d=\"M2.5 8.5l3.5 3.5 7.5-8\"/>',\n plus: '<path d=\"M8 2.5v11M2.5 8h11\"/>',\n search: '<circle cx=\"7\" cy=\"7\" r=\"4.5\"/><path d=\"M10.5 10.5L14 14\"/>',\n more: '<circle cx=\"3\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"13\" cy=\"8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/>'\n} as const;\n\nexport type BuiltInActionIcon = keyof typeof ICON_PATHS;\n\nfunction iconSvg(name: BuiltInActionIcon, size = 14): string {\n const path = ICON_PATHS[name] ?? \"\";\n return `<svg viewBox=\"0 0 16 16\" width=\"${size}\" height=\"${size}\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${path}</svg>`;\n}\n\nexport type ActionVariant = \"default\" | \"primary\" | \"warning\" | \"success\" | \"danger\";\nexport type ActionOverflowMode = \"menu\" | \"drawer\" | \"inline\";\n\nexport interface ActionItem<TData = any> {\n /** Stable identifier used by permission, telemetry and error policies. */\n id?: string;\n icon?: BuiltInActionIcon;\n label?: string;\n title?: string;\n /** Backwards-compatible shorthand for variant=\"danger\". */\n danger?: boolean;\n variant?: ActionVariant;\n show?: (params: CellRendererParams<TData>) => boolean;\n disabled?: boolean | ((params: CellRendererParams<TData>) => boolean);\n loading?: boolean | ((params: CellRendererParams<TData>) => boolean);\n /** One or more UI permissions. Access is resolved by GridOptions.actionPolicy. */\n permission?: string | readonly string[];\n /** Ask for confirmation before running. A string becomes the confirmation message. */\n confirm?: boolean | string | ((params: CellRendererParams<TData>) => boolean | string | Promise<boolean | string>);\n onClick: (params: CellRendererParams<TData>) => unknown | Promise<unknown>;\n}\n\nexport interface ActionButtonsConfig<TData = any> {\n actions: ActionItem<TData>[];\n max?: number;\n /** menu is compact, drawer suits touch/complex actions, inline never renders an ellipsis. */\n overflow?: ActionOverflowMode;\n moreLabel?: string;\n drawerTitle?: string;\n}\n\nexport interface RowActionsConfig<TData = any> extends Omit<ActionButtonsConfig<TData>, \"actions\"> {\n onView?: (params: CellRendererParams<TData>) => unknown | Promise<unknown>;\n onDelete?: (params: CellRendererParams<TData>) => unknown | Promise<unknown>;\n /** Persists the just-validated row. Failures reopen row editing and keep the change dirty. */\n onSave?: (\n params: CellRendererParams<TData>,\n changes: readonly GridChange<TData>[]\n ) => unknown | Promise<unknown>;\n /** Set false when this table has no full-row edit workflow. */\n edit?: boolean;\n extraActions?: ActionItem<TData>[];\n labels?: Partial<Record<\"view\" | \"edit\" | \"delete\" | \"confirm\" | \"save\" | \"cancel\", string>>;\n permissions?: Partial<Record<\"view\" | \"edit\" | \"delete\", string | readonly string[]>>;\n /** Defaults to the translated delete label when true. */\n confirmDelete?: boolean | string | ((params: CellRendererParams<TData>) => boolean | string | Promise<boolean | string>);\n}\n\nlet openActionSurface: HTMLElement | null = null;\nlet openActionAnchor: HTMLElement | null = null;\n\nfunction closeActionSurface(restoreFocus = false): void {\n openActionSurface?.remove();\n openActionSurface = null;\n if (openActionAnchor) {\n openActionAnchor.setAttribute(\"aria-expanded\", \"false\");\n if (restoreFocus && openActionAnchor.isConnected) openActionAnchor.focus({ preventScroll: true });\n }\n openActionAnchor = null;\n document.removeEventListener(\"mousedown\", onActionSurfaceOutside, true);\n document.removeEventListener(\"keydown\", onActionSurfaceKeyDown, true);\n}\n\nfunction onActionSurfaceOutside(event: MouseEvent): void {\n if (\n openActionSurface &&\n !openActionSurface.contains(event.target as Node) &&\n !openActionAnchor?.contains(event.target as Node)\n ) closeActionSurface();\n}\n\nfunction onActionSurfaceKeyDown(event: KeyboardEvent): void {\n if (!openActionSurface) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n closeActionSurface(true);\n return;\n }\n const buttons = [...openActionSurface.querySelectorAll<HTMLButtonElement>(\"button:not(:disabled)\")];\n if (buttons.length === 0) return;\n if (event.key === \"Tab\") {\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if ((!event.shiftKey && current === buttons.length - 1) || (event.shiftKey && current <= 0)) {\n event.preventDefault();\n buttons[event.shiftKey ? buttons.length - 1 : 0].focus();\n }\n return;\n }\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n event.preventDefault();\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n const delta = event.key === \"ArrowDown\" ? 1 : -1;\n buttons[(current + delta + buttons.length) % buttons.length].focus();\n}\n\ninterface SurfaceItem {\n label: string;\n icon?: BuiltInActionIcon;\n variant?: ActionVariant;\n disabled?: boolean;\n pick: (button: HTMLButtonElement) => void;\n}\n\nfunction makeSurfaceButton(item: SurfaceItem, className: string): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = className;\n if (item.variant && item.variant !== \"default\") button.classList.add(`${className}--${item.variant}`);\n button.disabled = item.disabled === true;\n if (item.icon && ICON_PATHS[item.icon]) button.innerHTML = `${iconSvg(item.icon, 16)}<span>${item.label}</span>`;\n else button.textContent = item.label;\n button.addEventListener(\"click\", () => item.pick(button));\n return button;\n}\n\nfunction showActionMenu(anchor: HTMLElement, items: SurfaceItem[]): void {\n closeActionSurface();\n const menu = document.createElement(\"div\");\n menu.className = \"mach-context-menu mach-action-menu\";\n menu.setAttribute(\"role\", \"menu\");\n for (const item of items) {\n const button = makeSurfaceButton(item, \"mach-context-menu-item\");\n button.setAttribute(\"role\", \"menuitem\");\n menu.appendChild(button);\n }\n document.body.appendChild(menu);\n const rect = anchor.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n menu.style.left = `${Math.min(Math.max(8, rect.left), window.innerWidth - menuRect.width - 8)}px`;\n menu.style.top = `${Math.min(rect.bottom + 4, window.innerHeight - menuRect.height - 8)}px`;\n openActionSurface = menu;\n openActionAnchor = anchor;\n anchor.setAttribute(\"aria-expanded\", \"true\");\n document.addEventListener(\"mousedown\", onActionSurfaceOutside, true);\n document.addEventListener(\"keydown\", onActionSurfaceKeyDown, true);\n menu.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")?.focus({ preventScroll: true });\n}\n\nfunction showActionDrawer(anchor: HTMLElement, title: string, items: SurfaceItem[]): void {\n closeActionSurface();\n const backdrop = document.createElement(\"div\");\n backdrop.className = \"mach-action-drawer-backdrop\";\n const drawer = document.createElement(\"section\");\n drawer.className = \"mach-action-drawer\";\n drawer.setAttribute(\"role\", \"dialog\");\n drawer.setAttribute(\"aria-modal\", \"true\");\n drawer.setAttribute(\"aria-label\", title);\n const header = document.createElement(\"header\");\n header.className = \"mach-action-drawer__header\";\n const heading = document.createElement(\"strong\");\n heading.textContent = title;\n const close = document.createElement(\"button\");\n close.type = \"button\";\n close.className = \"mach-action-drawer__close\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.title = \"Close\";\n close.innerHTML = iconSvg(\"close\", 16);\n close.addEventListener(\"click\", () => closeActionSurface(true));\n header.append(heading, close);\n const body = document.createElement(\"div\");\n body.className = \"mach-action-drawer__body\";\n for (const item of items) body.appendChild(makeSurfaceButton(item, \"mach-action-drawer__item\"));\n drawer.append(header, body);\n backdrop.appendChild(drawer);\n backdrop.addEventListener(\"mousedown\", (event) => {\n if (event.target === backdrop) closeActionSurface(true);\n });\n document.body.appendChild(backdrop);\n openActionSurface = backdrop;\n openActionAnchor = anchor;\n anchor.setAttribute(\"aria-expanded\", \"true\");\n document.addEventListener(\"keydown\", onActionSurfaceKeyDown, true);\n drawer.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")?.focus({ preventScroll: true });\n}\n\nfunction resolveActionFlag<TData>(\n flag: boolean | ((params: CellRendererParams<TData>) => boolean) | undefined,\n params: CellRendererParams<TData>\n): boolean {\n if (typeof flag === \"function\") {\n try { return flag(params); } catch { return false; }\n }\n return flag === true;\n}\n\nfunction actionVariant(action: ActionItem): ActionVariant {\n return action.danger ? \"danger\" : (action.variant ?? \"default\");\n}\n\nfunction actionPermissions<TData>(action: ActionItem<TData>): readonly string[] {\n if (!action.permission) return [];\n return typeof action.permission === \"string\" ? [action.permission] : action.permission;\n}\n\nfunction actionContext<TData>(\n action: ActionItem<TData>,\n params: CellRendererParams<TData>,\n message?: string\n): ActionPolicyContext<TData> {\n return {\n ...(action.id ? { actionId: action.id } : {}),\n permissions: actionPermissions(action),\n ...(message ? { message } : {}),\n params\n };\n}\n\nfunction reportActionError<TData>(\n error: unknown,\n action: ActionItem<TData>,\n params: CellRendererParams<TData>\n): void {\n const policy = params.api.getGridOption(\"actionPolicy\");\n try {\n if (policy?.onError) policy.onError(error, actionContext(action, params));\n else console.error(\"[mach-table] action handler failed\", error);\n } catch (policyError) {\n console.error(\"[mach-table] action error policy failed\", policyError, error);\n }\n}\n\nfunction canAccessAction<TData>(action: ActionItem<TData>, params: CellRendererParams<TData>): boolean {\n const permissions = actionPermissions(action);\n if (permissions.length === 0) return true;\n const policy = params.api.getGridOption(\"actionPolicy\");\n if (!policy?.canAccess) return true;\n try {\n return policy.canAccess(actionContext(action, params));\n } catch (error) {\n reportActionError(error, action, params);\n return false;\n }\n}\n\nfunction visibleActions<TData>(actions: readonly ActionItem<TData>[], params: CellRendererParams<TData>): ActionItem<TData>[] {\n return actions.filter((action) => {\n if (!canAccessAction(action, params)) return false;\n if (!action.show) return true;\n try { return action.show(params); } catch { return false; }\n });\n}\n\nexport function createActionButtonsRenderer<TData = any>(config: ActionButtonsConfig<TData>): CellRendererFn {\n const max = Math.max(0, config.max ?? 3);\n const overflowMode = config.overflow ?? \"menu\";\n return (params: CellRendererParams<TData>) => {\n const visible = visibleActions(config.actions, params);\n if (visible.length === 0) return \"\";\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"mach-actions\";\n const shown = overflowMode === \"inline\" ? visible : visible.slice(0, max);\n const overflow = overflowMode === \"inline\" ? [] : visible.slice(max);\n\n const run = (action: ActionItem<TData>, button: HTMLButtonElement): void => {\n if (resolveActionFlag(action.disabled, params)) return;\n button.disabled = true;\n button.classList.add(\"mach-action-btn--loading\");\n const execute = async (): Promise<void> => {\n if (action.confirm != null && action.confirm !== false) {\n const request = typeof action.confirm === \"function\" ? await action.confirm(params) : action.confirm;\n if (request === false) return;\n const message = typeof request === \"string\" ? request : (action.label ?? action.title ?? \"Confirm action\");\n const policy = params.api.getGridOption(\"actionPolicy\");\n const approved = policy?.confirm\n ? await policy.confirm(actionContext(action, params, message))\n : typeof window !== \"undefined\" && typeof window.confirm === \"function\"\n ? window.confirm(message)\n : false;\n if (!approved) return;\n }\n await action.onClick(params);\n };\n void execute().catch((error) => reportActionError(error, action, params)).finally(() => {\n if (!button.isConnected) return;\n button.disabled = resolveActionFlag(action.disabled, params) || resolveActionFlag(action.loading, params);\n button.classList.toggle(\"mach-action-btn--loading\", resolveActionFlag(action.loading, params));\n });\n };\n\n for (const action of shown) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"mach-action-btn\";\n const variant = actionVariant(action);\n if (variant !== \"default\") button.classList.add(`mach-action-btn--${variant}`);\n const title = action.title ?? action.label ?? \"Action\";\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n button.disabled = resolveActionFlag(action.disabled, params);\n if (resolveActionFlag(action.loading, params)) {\n button.disabled = true;\n button.classList.add(\"mach-action-btn--loading\");\n }\n if (action.icon && ICON_PATHS[action.icon]) {\n button.innerHTML = iconSvg(action.icon);\n button.classList.add(\"mach-action-btn--icon\");\n } else {\n button.textContent = action.label ?? title;\n }\n button.addEventListener(\"mousedown\", (event) => event.stopPropagation());\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n run(action, button);\n });\n wrap.appendChild(button);\n }\n\n if (overflow.length > 0) {\n const more = document.createElement(\"button\");\n more.type = \"button\";\n more.className = \"mach-action-btn mach-action-btn--icon\";\n const locale = params.api.getGridOption(\"locale\") ?? {};\n const moreLabel = config.moreLabel ?? locale.actionMore ?? DEFAULT_LOCALE.actionMore;\n more.title = moreLabel;\n more.setAttribute(\"aria-label\", moreLabel);\n more.setAttribute(\"aria-haspopup\", overflowMode === \"drawer\" ? \"dialog\" : \"menu\");\n more.setAttribute(\"aria-expanded\", \"false\");\n more.innerHTML = `${iconSvg(\"more\", 16)}<span class=\"mach-sr-only\">⋯</span>`;\n more.addEventListener(\"mousedown\", (event) => event.stopPropagation());\n more.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n const items = overflow.map((action): SurfaceItem => ({\n label: action.label ?? action.title ?? \"Action\",\n icon: action.icon,\n variant: actionVariant(action),\n disabled: resolveActionFlag(action.disabled, params) || resolveActionFlag(action.loading, params),\n pick: (button) => {\n closeActionSurface();\n run(action, button);\n }\n }));\n if (overflowMode === \"drawer\") showActionDrawer(more, config.drawerTitle ?? moreLabel, items);\n else showActionMenu(more, items);\n });\n wrap.appendChild(more);\n }\n\n return {\n el: wrap,\n destroy: () => {\n if (openActionAnchor && wrap.contains(openActionAnchor)) closeActionSurface();\n }\n };\n };\n}\n\ninterface RowActionLabels {\n view: string;\n edit: string;\n delete: string;\n confirm: string;\n save: string;\n cancel: string;\n}\n\nfunction actionLabel(configured: string | undefined, localized: string | undefined, fallback: string): string {\n return configured ?? localized ?? fallback;\n}\n\nfunction resolveRowActionLabels<TData>(\n config: RowActionsConfig<TData>,\n params: CellRendererParams<TData>\n): RowActionLabels {\n const locale = params.api.getGridOption(\"locale\") ?? {};\n return {\n view: actionLabel(config.labels?.view, locale.actionView, DEFAULT_LOCALE.actionView),\n edit: actionLabel(config.labels?.edit, locale.actionEdit, DEFAULT_LOCALE.actionEdit),\n delete: actionLabel(config.labels?.delete, locale.actionDelete, DEFAULT_LOCALE.actionDelete),\n confirm: actionLabel(config.labels?.confirm, locale.actionConfirm, DEFAULT_LOCALE.actionConfirm),\n save: actionLabel(config.labels?.save, locale.actionSave, DEFAULT_LOCALE.actionSave),\n cancel: actionLabel(config.labels?.cancel, locale.actionCancel, DEFAULT_LOCALE.actionCancel)\n };\n}\n\nfunction renderRowEditingActions<TData>(\n config: RowActionsConfig<TData>,\n params: CellRendererParams<TData>,\n labels: RowActionLabels\n): ReturnType<CellRendererFn> {\n const confirm = async (): Promise<void> => {\n const committed = await params.api.stopEditingRow(false);\n if (!committed || !config.onSave) return;\n const changes = params.api.getChanges().filter((change) => change.rowId === params.node.id);\n try {\n await config.onSave(params, changes);\n params.api.markChangesSaved([params.node.id]);\n } catch (error) {\n params.api.startEditingRow(params.rowIndex);\n throw error;\n }\n };\n const confirmTitle = config.onSave\n ? labels.save\n : (config.labels?.confirm ?? config.labels?.save ?? labels.confirm);\n return createActionButtonsRenderer<TData>({\n actions: [\n { icon: \"check\", title: confirmTitle, variant: \"primary\", onClick: confirm },\n { icon: \"close\", title: labels.cancel, onClick: () => params.api.stopEditingRow(true).then(() => undefined) }\n ],\n overflow: \"inline\"\n })(params);\n}\n\nfunction buildRowActions<TData>(\n config: RowActionsConfig<TData>,\n params: CellRendererParams<TData>,\n labels: RowActionLabels\n): ActionItem<TData>[] {\n const actions: ActionItem<TData>[] = [];\n if (config.onView) actions.push({\n id: \"view\", icon: \"view\", title: labels.view, variant: \"primary\",\n ...(config.permissions?.view ? { permission: config.permissions.view } : {}),\n onClick: config.onView\n });\n if (config.edit !== false) actions.push({\n id: \"edit\", icon: \"edit\", title: labels.edit, variant: \"warning\",\n ...(config.permissions?.edit ? { permission: config.permissions.edit } : {}),\n onClick: () => { params.api.startEditingRow(params.rowIndex); }\n });\n if (config.onDelete) actions.push({\n id: \"delete\", icon: \"delete\", title: labels.delete, variant: \"danger\",\n ...(config.permissions?.delete ? { permission: config.permissions.delete } : {}),\n ...(config.confirmDelete ? { confirm: config.confirmDelete === true ? labels.delete : config.confirmDelete } : {}),\n onClick: config.onDelete\n });\n actions.push(...(config.extraActions ?? []));\n return actions;\n}\n\nexport function createRowActionsRenderer<TData = any>(config: RowActionsConfig<TData> = {}): CellRendererFn {\n return (params: CellRendererParams<TData>) => {\n const labels = resolveRowActionLabels(config, params);\n if (params.api.isRowEditing(params.rowIndex)) return renderRowEditingActions(config, params, labels);\n const actions = buildRowActions(config, params, labels);\n return createActionButtonsRenderer<TData>({\n actions,\n max: config.max,\n overflow: config.overflow ?? \"drawer\",\n moreLabel: config.moreLabel,\n drawerTitle: config.drawerTitle\n })(params);\n };\n}\n\nexport const presetStatusTagRenderer = createStatusTagRenderer();\nexport const presetProgressBarRenderer = createProgressBarRenderer();\n\nexport function registerBuiltinRenderers(register: (name: string, fn: CellRendererFn) => void): void {\n register(\"statusTag\", presetStatusTagRenderer);\n register(\"progressBar\", presetProgressBarRenderer);\n register(\"link\", linkRenderer);\n}\n","import type { CellRendererFn, CellEditorFactory } from \"../types/colDef\";\n\nconst cellRenderers = new Map<string, CellRendererFn>();\nconst cellEditors = new Map<string, CellEditorFactory>();\n\nexport function registerCellRenderer(name: string, renderer: CellRendererFn): () => void {\n const previous = cellRenderers.get(name);\n cellRenderers.set(name, renderer);\n return () => {\n if (cellRenderers.get(name) !== renderer) return;\n if (previous) cellRenderers.set(name, previous);\n else cellRenderers.delete(name);\n };\n}\n\nexport function getCellRenderer(name: string): CellRendererFn | undefined {\n return cellRenderers.get(name);\n}\n\nexport function registerCellEditor(name: string, editor: CellEditorFactory): () => void {\n const previous = cellEditors.get(name);\n cellEditors.set(name, editor);\n return () => {\n if (cellEditors.get(name) !== editor) return;\n if (previous) cellEditors.set(name, previous);\n else cellEditors.delete(name);\n };\n}\n\nexport function getCellEditor(name: string): CellEditorFactory | undefined {\n return cellEditors.get(name);\n}\n\n/** Register a built-in without replacing an application override. */\nexport function ensureCellRenderer(name: string, renderer: CellRendererFn): void {\n if (!cellRenderers.has(name)) cellRenderers.set(name, renderer);\n}\n\nexport function clearComponentRegistries(): void {\n cellRenderers.clear();\n cellEditors.clear();\n}\n","import type { ColDef, ColDefGroup, ColDefOrGroup } from \"../types/colDef\";\nimport { isColDefGroup } from \"../types/colDef\";\nimport { isSafePath } from \"./path\";\n\nexport function validateColumnDefs(defs: (ColDef<any> | ColDefGroup<any>)[] | null | undefined): string[] {\n if (!defs || defs.length === 0) return [];\n const issues: string[] = [];\n const seenIds = new Map<string, number>();\n let leafIndex = 0;\n\n const walk = (list: ColDefOrGroup<any>[], depth: number): void => {\n for (const def of list) {\n if (isColDefGroup(def)) {\n if (!Array.isArray(def.children) || def.children.length === 0) {\n issues.push(`列分组 \"${def.headerName ?? def.groupId ?? \"?\"}\" 的 children 为空`);\n continue;\n }\n walk(def.children, depth + 1);\n continue;\n }\n leafIndex++;\n const id = def.colId ?? def.field ?? `col_${leafIndex}`;\n seenIds.set(id, (seenIds.get(id) ?? 0) + 1);\n\n if (def.field && !isSafePath(def.field)) {\n issues.push(`列 \"${id}\" 的 field 路径不安全或无效,已禁止读取和写入`);\n }\n\n if (!def.field && !def.valueGetter && !def.checkboxSelection && !def.autoRowSpan && !def.rowSpan) {\n issues.push(`列 \"${id}\" 既无 field 也无 valueGetter,将始终显示空值(纯工具列请忽略此提示)`);\n }\n if (def.width != null && def.minWidth != null && def.width < def.minWidth) {\n issues.push(`列 \"${id}\" 的 width(${def.width}) 小于 minWidth(${def.minWidth}),将按 minWidth 渲染`);\n }\n if (def.width != null && def.maxWidth != null && def.width > def.maxWidth) {\n issues.push(`列 \"${id}\" 的 width(${def.width}) 大于 maxWidth(${def.maxWidth}),将按 maxWidth 渲染`);\n }\n }\n };\n\n walk(defs, 0);\n for (const [id, count] of seenIds) {\n if (count > 1) issues.push(`存在 ${count} 个重复的 colId/field \"${id}\",已自动加后缀区分,建议显式命名 colId`);\n }\n return issues;\n}\n","import { GRID_OPTION_KEYS, GRID_OPTION_META } from \"../core/gridOptionMetadata\";\nimport { matchesGridOptionKind } from \"../core/gridOptionRuntime\";\nimport { EVENT_TYPES } from \"../types/events\";\nimport type { GridOptions } from \"../types/options\";\n\nexport type GridValidationCode =\n | \"UNKNOWN_OPTION\"\n | \"INVALID_OPTION_VALUE\"\n | \"OPTION_CONFLICT\"\n | \"MISSING_STABLE_ROW_ID\";\n\nexport interface GridValidationIssue {\n code: GridValidationCode;\n message: string;\n option?: string;\n suggestion?: string;\n}\n\nconst EVENT_OPTION_KEYS = EVENT_TYPES.map((type) => `on${type.charAt(0).toUpperCase()}${type.slice(1)}`);\nconst KNOWN_OPTIONS = new Set<string>([...GRID_OPTION_KEYS, ...EVENT_OPTION_KEYS]);\n\nfunction editDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n let previous = Array.from({ length: b.length + 1 }, (_, index) => index);\n for (let row = 1; row <= a.length; row++) {\n const current = [row];\n for (let column = 1; column <= b.length; column++) {\n current[column] = Math.min(\n current[column - 1] + 1,\n previous[column] + 1,\n previous[column - 1] + (a[row - 1] === b[column - 1] ? 0 : 1)\n );\n }\n previous = current;\n }\n return previous[b.length];\n}\n\nfunction closestOption(input: string): string | undefined {\n let closest: string | undefined;\n let distance = Number.POSITIVE_INFINITY;\n for (const candidate of KNOWN_OPTIONS) {\n const next = editDistance(input.toLowerCase(), candidate.toLowerCase());\n if (next < distance) {\n distance = next;\n closest = candidate;\n }\n }\n const threshold = Math.max(2, Math.floor(input.length * 0.3));\n return distance <= threshold ? closest : undefined;\n}\n\nfunction validateIdentityAndLayout(source: Record<string, unknown>): GridValidationIssue[] {\n const issues: GridValidationIssue[] = [];\n if (source.rowKey != null && typeof source.rowKey !== \"string\" && typeof source.rowKey !== \"function\") {\n issues.push({\n code: \"INVALID_OPTION_VALUE\",\n option: \"rowKey\",\n message: \"rowKey 必须是字段路径或返回稳定业务主键的函数\"\n });\n }\n if (source.domLayout === \"autoHeight\" && source.datasource != null) {\n issues.push({\n code: \"OPTION_CONFLICT\",\n option: \"domLayout\",\n message: \"autoHeight 会渲染全部已加载行,不适用于 datasource 无限滚动模式\"\n });\n }\n if (source.enableColumnResize != null && typeof source.enableColumnResize !== \"boolean\") {\n issues.push({\n code: \"INVALID_OPTION_VALUE\",\n option: \"enableColumnResize\",\n message: \"enableColumnResize 必须是 boolean;未配置时默认关闭\"\n });\n }\n return issues;\n}\n\nfunction hasStableRowId(source: Record<string, unknown>): boolean {\n return typeof source.getRowId === \"function\" || source.rowKey != null;\n}\n\nfunction validateMetadataValues(source: Record<string, unknown>): GridValidationIssue[] {\n const specialised = new Set([\"enableColumnResize\", \"pagination\", \"rowKey\"]);\n const issues: GridValidationIssue[] = [];\n for (const key of GRID_OPTION_KEYS) {\n if (specialised.has(key) || !Object.prototype.hasOwnProperty.call(source, key)) continue;\n const value = source[key];\n const expected = GRID_OPTION_META[key].kind;\n if (matchesGridOptionKind(value, expected)) continue;\n issues.push({\n code: \"INVALID_OPTION_VALUE\",\n option: key,\n message: `${key} 值类型无效,期望 ${expected}`\n });\n }\n return issues;\n}\n\n/** Runtime validation for JavaScript, JSON/schema driven and dynamic options. */\nexport function validateGridOptions(options: Partial<GridOptions<any>> | Record<string, unknown>): GridValidationIssue[] {\n const source = options as Record<string, unknown>;\n const issues: GridValidationIssue[] = [];\n for (const option of Object.keys(source)) {\n if (KNOWN_OPTIONS.has(option)) continue;\n const suggestion = closestOption(option);\n issues.push({\n code: \"UNKNOWN_OPTION\",\n option,\n ...(suggestion ? { suggestion } : {}),\n message: suggestion\n ? `未知 GridOption \"${option}\",是否想使用 \"${suggestion}\"?`\n : `未知 GridOption \"${option}\",该值不会生效`\n });\n }\n\n const pagination = source.pagination;\n if (pagination != null && typeof pagination !== \"boolean\" && typeof pagination !== \"object\") {\n issues.push({ code: \"INVALID_OPTION_VALUE\", option: \"pagination\", message: \"pagination 必须是 boolean 或配置对象\" });\n }\n if (source.datasource != null && pagination !== undefined && pagination !== false) {\n issues.push({\n code: \"OPTION_CONFLICT\",\n option: \"pagination\",\n message: \"datasource 顺序无限模式与 pagination 不能同时启用;普通服务端分页请使用 pagination.mode='server'\"\n });\n }\n if (pagination && typeof pagination === \"object\") {\n const config = pagination as Record<string, unknown>;\n if (config.mode === \"server\" && !hasStableRowId(source)) {\n issues.push({\n code: \"MISSING_STABLE_ROW_ID\",\n option: \"getRowId\",\n message: \"服务端分页建议提供稳定 getRowId,否则跨页选择与增量更新无法可靠保持\"\n });\n }\n if (config.mode === \"server\" && config.total !== undefined && (\n typeof config.total !== \"number\" || !Number.isFinite(config.total) || config.total < 0\n )) {\n issues.push({\n code: \"INVALID_OPTION_VALUE\",\n option: \"pagination.total\",\n message: \"服务端分页 total 必须是非负有限数\"\n });\n }\n }\n if (source.treeData === true && source.masterDetail === true) {\n issues.push({\n code: \"OPTION_CONFLICT\",\n option: \"masterDetail\",\n message: \"treeData 与 masterDetail 不能同时启用,主从明细将被忽略\"\n });\n }\n issues.push(...validateMetadataValues(source));\n issues.push(...validateIdentityAndLayout(source));\n return issues;\n}\n","import type { GridFeature } from \"../types/options\";\n\nexport type GridFeatureIssueCode =\n | \"DUPLICATE_FEATURE\"\n | \"FEATURE_CONFLICT\"\n | \"FEATURE_CYCLE\"\n | \"FEATURE_DEPENDENCY_SETUP_FAILED\"\n | \"INVALID_FEATURE_KEY\"\n | \"MISSING_FEATURE_DEPENDENCY\";\n\nexport interface GridFeatureIssue {\n code: GridFeatureIssueCode;\n feature?: string;\n dependency?: string;\n message: string;\n}\n\nexport interface ResolvedGridFeatures<TData = any> {\n features: GridFeature<TData>[];\n issues: GridFeatureIssue[];\n}\n\nfunction normalizedKeys(values: readonly string[] | undefined): string[] {\n return [...new Set((values ?? []).map((value) => value.trim()).filter(Boolean))];\n}\n\n/**\n * Validates and dependency-orders per-grid features before any setup side effect runs.\n * Invalid features are isolated instead of leaving a partially initialised extension graph.\n */\nexport function resolveGridFeatures<TData>(input: readonly GridFeature<TData>[]): ResolvedGridFeatures<TData> {\n const issues: GridFeatureIssue[] = [];\n const byKey = new Map<string, GridFeature<TData>>();\n for (const feature of input) {\n const key = typeof feature?.key === \"string\" ? feature.key.trim() : \"\";\n if (!key) {\n issues.push({ code: \"INVALID_FEATURE_KEY\", message: \"GridFeature.key must be a non-empty string\" });\n continue;\n }\n if (byKey.has(key)) {\n issues.push({ code: \"DUPLICATE_FEATURE\", feature: key, message: `Duplicate GridFeature key: ${key}` });\n continue;\n }\n byKey.set(key, feature);\n }\n\n const invalid = new Set<string>();\n for (const [key, feature] of byKey) {\n for (const dependency of normalizedKeys(feature.requires)) {\n if (byKey.has(dependency)) continue;\n invalid.add(key);\n issues.push({\n code: \"MISSING_FEATURE_DEPENDENCY\",\n feature: key,\n dependency,\n message: `GridFeature \"${key}\" requires missing feature \"${dependency}\"`\n });\n }\n for (const conflict of normalizedKeys(feature.conflicts)) {\n if (!byKey.has(conflict)) continue;\n invalid.add(key);\n issues.push({\n code: \"FEATURE_CONFLICT\",\n feature: key,\n dependency: conflict,\n message: `GridFeature \"${key}\" conflicts with \"${conflict}\"`\n });\n break;\n }\n }\n\n const ordered: GridFeature<TData>[] = [];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const visit = (key: string): boolean => {\n if (visited.has(key)) return !invalid.has(key);\n if (visiting.has(key)) {\n invalid.add(key);\n issues.push({ code: \"FEATURE_CYCLE\", feature: key, message: `GridFeature dependency cycle includes \"${key}\"` });\n return false;\n }\n const feature = byKey.get(key);\n if (!feature || invalid.has(key)) return false;\n visiting.add(key);\n let valid = true;\n for (const dependency of normalizedKeys(feature.requires)) {\n if (!visit(dependency)) valid = false;\n }\n visiting.delete(key);\n visited.add(key);\n if (!valid) {\n invalid.add(key);\n return false;\n }\n ordered.push(feature);\n return true;\n };\n\n for (const key of byKey.keys()) visit(key);\n return { features: ordered.filter((feature) => !invalid.has(feature.key.trim())), issues };\n}\n","import { EventBus } from \"./eventBus\";\nimport { resolveOptions } from \"./resolveOptions\";\nimport { ColumnModel } from \"../services/columnModel\";\nimport { RowModel } from \"../services/rowModel\";\nimport { SelectionService } from \"../services/selectionService\";\nimport { ResizeService } from \"../services/resizeService\";\nimport { ColumnDragService } from \"../services/columnDragService\";\nimport { KeyboardService } from \"../services/keyboardService\";\nimport { EditingService } from \"../services/editingService\";\nimport { FilterPopupService } from \"../services/filterPopup\";\nimport { ColumnMenuService } from \"../services/columnMenuService\";\nimport { ContextMenuService } from \"../services/contextMenuService\";\nimport { TooltipService } from \"../services/tooltipService\";\nimport { WatermarkService } from \"../services/watermarkService\";\nimport { UndoRedoService } from \"../services/undoRedoService\";\nimport { ChangeTrackingService } from \"../services/changeTrackingService\";\nimport { PerformanceMonitor } from \"../services/performanceMonitor\";\nimport { GridApiImpl } from \"../services/gridApi\";\nimport { GridSkeleton } from \"../render/skeleton\";\nimport { HeaderRenderer } from \"../render/headerRenderer\";\nimport { BodyRenderer } from \"../render/bodyRenderer\";\nimport { SummaryRenderer } from \"../render/summaryRenderer\";\nimport { PaginationBar } from \"../render/paginationBar\";\nimport { PinnedRowsRenderer } from \"../render/pinnedRowsRenderer\";\nimport { StatusBarService } from \"../render/statusBarService\";\nimport { getByPath, setByPath } from \"../lib/path\";\nimport { loadColumnState, saveColumnState } from \"../lib/columnStateStore\";\nimport { loadGridState, saveGridState } from \"../lib/gridStateStore\";\nimport { registerBuiltinRenderers } from \"../lib/presetRenderers\";\nimport {\n ensureCellRenderer,\n getCellEditor,\n getCellRenderer\n} from \"../lib/componentRegistry\";\nimport { validateColumnDefs } from \"../lib/validateDefs\";\nimport { validateGridOptions } from \"../lib/validateOptions\";\nimport { resolveGridFeatures } from \"../lib/featureManifest\";\nimport { toTsv, parseTsv, writeClipboard } from \"../lib/clipboard\";\nimport { formatCellValueWith } from \"../render/cellContent\";\nimport { DEFAULT_LOCALE, type RgLocale, type RgLocaleKey } from \"../lib/locale\";\nimport packageJson from \"../../package.json\";\nimport type { ResolvedGridOptions } from \"../types/options\";\nimport type { GridApi, GridDiagnosticError, GridDiagnostics } from \"../types/api\";\nimport type { GridFeature, GridFeatureContext, GridOptions } from \"../types/options\";\nimport type { Column } from \"../services/column\";\nimport type { RowNode } from \"../types/row\";\nimport type { GridErrorCode, GridEventMap, GridEventType } from \"../types/events\";\nimport type {\n CellEditorFactory,\n CellRendererFn,\n ColumnFilter,\n ColumnState,\n ColDef,\n ColDefGroup\n} from \"../types/colDef\";\n\nconst DATA_SOURCE_ERROR_PREFIXES = [\"datasource\", \"treeData\"] as const;\nconst STATE_ERROR_PREFIXES = [\"columnState.\", \"gridState.\"] as const;\nconst GRID_STATE_CHANGE_EVENTS = new Set<GridEventType>([\n \"selectionChanged\",\n \"sortChanged\",\n \"filterChanged\",\n \"columnMoved\",\n \"columnVisibilityChanged\",\n \"displayedColumnsChanged\",\n \"paginationChanged\",\n \"detailToggled\"\n]);\n\ntype ColumnStateLike = ColumnState;\n\nlet gridUid = 0;\nfunction ensureBuiltinRenderers(): void {\n registerBuiltinRenderers(ensureCellRenderer);\n}\n\nexport class GridCore<TData = any> {\n readonly gridId: number;\n readonly options: ResolvedGridOptions<TData>;\n readonly eventBus: EventBus<GridEventMap<TData>>;\n readonly skeleton: GridSkeleton;\n readonly columnModel: ColumnModel;\n readonly rowModel: RowModel<TData>;\n readonly selectionService: SelectionService;\n readonly headerRenderer: HeaderRenderer;\n readonly bodyRenderer: BodyRenderer;\n readonly resizeService: ResizeService;\n readonly columnDragService: ColumnDragService;\n readonly keyboardService: KeyboardService;\n readonly editingService: EditingService;\n readonly undoService: UndoRedoService;\n readonly changeTracker: ChangeTrackingService<TData>;\n readonly performanceMonitor: PerformanceMonitor;\n readonly filterPopup: FilterPopupService;\n readonly columnMenu: ColumnMenuService;\n readonly contextMenuService: ContextMenuService;\n readonly tooltipService: TooltipService;\n readonly watermarkService: WatermarkService;\n readonly paginationBar: PaginationBar;\n readonly pinnedRowsRenderer: PinnedRowsRenderer;\n readonly summaryRenderer: SummaryRenderer;\n readonly statusBarService: StatusBarService;\n readonly api: GridApi<TData>;\n\n private destroyed = false;\n private autoIdCounter = 0;\n private readyRafId = 0;\n private readySettled = false;\n private readonly readyPromise: Promise<GridApi<TData>>;\n private readonly resolveReady: (api: GridApi<TData>) => void;\n private lastColumnLayoutSignature = \"\";\n private activeFeatures = new Map<string, { feature: GridFeature<TData>; cleanups: Array<() => void> }>();\n private recentErrors: GridDiagnosticError[] = [];\n private stateSaveTimer: ReturnType<typeof setTimeout> | null = null;\n private gridStateLoadToken = 0;\n\n constructor(container: HTMLElement, options: GridOptions<TData>) {\n let settleReady!: (api: GridApi<TData>) => void;\n this.readyPromise = new Promise((resolve) => {\n settleReady = resolve;\n });\n this.resolveReady = settleReady;\n this.gridId = ++gridUid;\n ensureBuiltinRenderers();\n this.options = resolveOptions(options);\n this.eventBus = new EventBus<GridEventMap<TData>>((error, eventType) => {\n if (eventType === \"gridError\") console.error(\"[mach-table] error in gridError listener\", error);\n else this.reportError(error, \"eventBus.listener\", { eventType });\n });\n\n this.columnModel = new ColumnModel(this);\n this.rowModel = new RowModel<TData>(this);\n this.selectionService = new SelectionService(this);\n this.skeleton = new GridSkeleton(this);\n this.headerRenderer = new HeaderRenderer(this);\n this.bodyRenderer = new BodyRenderer(this);\n this.resizeService = new ResizeService(this);\n this.columnDragService = new ColumnDragService(this);\n this.keyboardService = new KeyboardService(this);\n this.editingService = new EditingService(this);\n this.undoService = new UndoRedoService(this);\n this.performanceMonitor = new PerformanceMonitor();\n this.filterPopup = new FilterPopupService(this);\n this.columnMenu = new ColumnMenuService(this);\n this.contextMenuService = new ContextMenuService(this);\n this.tooltipService = new TooltipService(this);\n this.watermarkService = new WatermarkService(this);\n this.paginationBar = new PaginationBar(this);\n this.pinnedRowsRenderer = new PinnedRowsRenderer(this);\n this.summaryRenderer = new SummaryRenderer(this);\n this.statusBarService = new StatusBarService(this);\n this.api = new GridApiImpl<TData>(this);\n this.changeTracker = new ChangeTrackingService<TData>(this);\n\n try {\n this.changeTracker.init();\n this.skeleton.init(container, this.options);\n this.watermarkService.init();\n this.bodyRenderer.init();\n this.keyboardService.init();\n this.tooltipService.init();\n this.paginationBar.init();\n this.summaryRenderer.init();\n this.statusBarService.init();\n this.pinnedRowsRenderer.init();\n\n this.rowModel.restorePagination(this.options.paginationPage, this.options.paginationPageSize);\n this.columnModel.setColumnDefs(this.options.columnDefs);\n this.rowModel.setAdvancedFilterModel(this.options.advancedFilterModel);\n this.rowModel.setQuickFilter(this.options.quickFilterText);\n this.refreshAriaState();\n this.validateDefs(this.options.columnDefs);\n this.checkWarnings(options);\n this.loadPersistedColumnState();\n this.headerRenderer.build();\n if (this.options.datasource) {\n void this.rowModel.startInfinite();\n } else {\n this.rowModel.setRowData(this.options.rowData);\n }\n if (this.options.initialState) this.api.applyState(this.options.initialState, { emitEvents: false });\n this.loadPersistedGridState();\n this.relayout();\n this.pinnedRowsRenderer.setData(this.options.pinnedTopRowData, this.options.pinnedBottomRowData);\n this.setFeatures(this.options.features);\n\n this.readyRafId = requestAnimationFrame(() => {\n this.readyRafId = 0;\n if (!this.destroyed) this.emit(\"gridReady\", {});\n this.settleReady();\n });\n } catch (error) {\n this.reportError(error, \"grid.constructor\");\n this.destroy();\n throw error;\n }\n }\n\n getApi(): GridApi<TData> {\n return this.api;\n }\n\n whenReady(): Promise<GridApi<TData>> {\n return this.readyPromise;\n }\n\n private settleReady(): void {\n if (this.readySettled) return;\n this.readySettled = true;\n this.resolveReady(this.api);\n }\n\n resolveCellRenderer(name: string): CellRendererFn | undefined {\n const local = this.options.components?.cellRenderers?.[name];\n if (local) return local;\n let renderer = getCellRenderer(name);\n if (!renderer) {\n // `clearComponentRegistries` is public for test/HMR isolation; built-ins\n // must remain recoverable for already-created and future grids.\n ensureBuiltinRenderers();\n renderer = getCellRenderer(name);\n }\n return renderer;\n }\n\n resolveCellEditor(name: string): CellEditorFactory | undefined {\n return this.options.components?.cellEditors?.[name] ?? getCellEditor(name);\n }\n\n private inactiveFeatureDependency(feature: GridFeature<TData>): string | undefined {\n return feature.requires\n ?.map((dependency) => dependency.trim())\n .find((dependency) => dependency.length > 0 && !this.activeFeatures.has(dependency));\n }\n\n setFeatures(features: readonly GridFeature<TData>[] | null | undefined): void {\n this.destroyFeatures();\n if (this.destroyed) return;\n const resolved = resolveGridFeatures(features ?? []);\n for (const issue of resolved.issues) {\n this.reportError(new Error(issue.message), \"feature.manifest\", {\n code: issue.code,\n ...(issue.feature ? { key: issue.feature } : {}),\n ...(issue.dependency ? { dependency: issue.dependency } : {})\n });\n }\n\n for (const feature of resolved.features) {\n const key = feature.key.trim();\n const inactiveDependency = this.inactiveFeatureDependency(feature);\n if (inactiveDependency) {\n this.reportError(\n new Error(`GridFeature \"${key}\" dependency \"${inactiveDependency}\" did not initialise`),\n \"feature.manifest\",\n { code: \"FEATURE_DEPENDENCY_SETUP_FAILED\", key, dependency: inactiveDependency }\n );\n continue;\n }\n const cleanups: Array<() => void> = [];\n const manage = (cleanup: () => void): (() => void) => {\n let active = true;\n const once = () => {\n if (!active) return;\n active = false;\n cleanup();\n };\n cleanups.push(once);\n return once;\n };\n const context: GridFeatureContext<TData> = {\n api: this.api,\n root: this.skeleton.root,\n getOptions: () => this.options,\n addEventListener: (type, listener) => manage(this.eventBus.on(type, listener)),\n onCleanup: (cleanup) => { manage(cleanup); },\n addManagedDomListener: (target, type, listener, listenerOptions) => {\n target.addEventListener(type, listener, listenerOptions);\n return manage(() => target.removeEventListener(type, listener, listenerOptions));\n },\n setManagedTimeout: (handler, delayMs) => {\n const id = setTimeout(handler, Math.max(0, delayMs));\n manage(() => clearTimeout(id));\n return id;\n },\n createAbortController: () => {\n const controller = new AbortController();\n manage(() => controller.abort());\n return controller;\n },\n reportError: (error, source, details) => this.reportError(error, `feature.${source}`, details)\n };\n try {\n const cleanup = feature.setup(context);\n if (typeof cleanup === \"function\") manage(cleanup);\n this.activeFeatures.set(key, { feature, cleanups });\n } catch (error) {\n for (const cleanup of cleanups.reverse()) {\n try { cleanup(); } catch (cleanupError) {\n this.reportError(cleanupError, \"feature.cleanup\", { key });\n }\n }\n this.reportError(error, \"feature.setup\", { key });\n }\n }\n }\n\n private destroyFeatures(): void {\n const entries = [...this.activeFeatures.entries()].reverse();\n this.activeFeatures.clear();\n for (const [key, active] of entries) {\n for (const cleanup of active.cleanups.reverse()) {\n try {\n cleanup();\n } catch (error) {\n this.reportError(error, \"feature.cleanup\", { key });\n }\n }\n try {\n active.feature.destroy?.();\n } catch (error) {\n this.reportError(error, \"feature.destroy\", { key });\n }\n }\n }\n\n isDestroyed(): boolean {\n return this.destroyed;\n }\n\n nextId(): number {\n return ++this.autoIdCounter;\n }\n\n getCellValue(node: RowNode<any>, column: Column): any {\n const def = column.colDef;\n if (def.valueGetter) {\n try {\n return def.valueGetter({\n api: this.api,\n colDef: def,\n column,\n node,\n data: node.data\n });\n } catch (error) {\n this.reportError(error, \"valueGetter\", { colId: column.id, rowId: node.id });\n return undefined;\n }\n }\n if (def.field) return getByPath(node.data, def.field);\n return undefined;\n }\n\n getLocaleText(key: RgLocaleKey): string {\n const locale: RgLocale = this.options.locale;\n return locale[key] ?? DEFAULT_LOCALE[key];\n }\n\n writeValue(node: RowNode<any>, column: Column, newValue: any, oldValue?: any): boolean {\n const colDef = column.colDef;\n if (colDef.valueSetter) {\n try {\n return colDef.valueSetter({\n oldValue,\n newValue,\n data: node.data!,\n node,\n colDef,\n column,\n api: this.api\n });\n } catch (error) {\n this.reportError(error, \"valueSetter\", { colId: column.id, rowId: node.id });\n return false;\n }\n }\n if (colDef.field) return setByPath(node.data, colDef.field, newValue);\n return false;\n }\n\n setCellValue(node: RowNode<any>, column: Column, newValue: any, oldValue: any): boolean {\n if (newValue === undefined || newValue === oldValue) return false;\n const colDef = column.colDef;\n\n let changed: boolean;\n if (colDef.valueSetter) {\n try {\n changed = colDef.valueSetter({\n oldValue,\n newValue,\n data: node.data!,\n node,\n colDef,\n column,\n api: this.api\n });\n } catch (error) {\n this.reportError(error, \"valueSetter\", { colId: column.id, rowId: node.id });\n return false;\n }\n } else if (colDef.field) {\n changed = setByPath(node.data, colDef.field, newValue);\n } else {\n return false;\n }\n\n if (changed) this.notifyCellValueChanged(node, column, oldValue, newValue);\n return changed;\n }\n\n /** Emits the shared value-change side effects after a caller has written data transactionally. */\n notifyCellValueChanged(node: RowNode<any>, column: Column, oldValue: any, newValue: any): void {\n this.bodyRenderer.invalidateRowHeight(node);\n this.bodyRenderer.queueFlash([node.rowIndex], [column.id]);\n this.emit(\"cellValueChanged\", {\n oldValue,\n newValue,\n rowNode: node,\n rowIndex: node.rowIndex,\n column,\n colDef: column.colDef,\n data: node.data!\n });\n this.undoService.record({ nodeId: node.id, columnId: column.id, oldValue, newValue });\n }\n\n buildRangeTsv(range: { r1: number; c1: number; r2: number; c2: number }): string {\n const flat = this.columnModel.getOrderedVisible();\n const cols = flat.slice(range.c1, range.c2 + 1);\n const rows: string[][] = [];\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.rowModel.getDisplayedRow(r);\n rows.push(\n cols.map((col) => {\n if (!node || node.isDetail || node.isGroup) return \"\";\n return formatCellValueWith(this, node, col, this.getCellValue(node, col));\n })\n );\n }\n return toTsv(rows);\n }\n\n copyActiveRange(): Promise<boolean> {\n const range = this.bodyRenderer.getNormalizedRangeOrFocus();\n if (!range) return Promise.resolve(false);\n return writeClipboard(this.buildRangeTsv(range));\n }\n\n clearRangeValues(range: { r1: number; c1: number; r2: number; c2: number }): void {\n if (this.destroyed) return;\n const flat = this.columnModel.getOrderedVisible();\n const changedRows = new Set<number>();\n this.undoService.beginBatch();\n try {\n for (let r = range.r1; r <= range.r2; r++) {\n const node = this.rowModel.getDisplayedRow(r);\n if (!node || node.isDetail || node.isGroup) continue;\n for (let c = range.c1; c <= range.c2; c++) {\n const col = flat[c];\n if (!col || col.hasCheckbox || col.isDetailToggle || col.colDef.rowDrag) continue;\n if (!this.editingService.isEditable(node, col)) continue;\n const old = this.getCellValue(node, col);\n if (this.setCellValue(node, col, null, old)) changedRows.add(r);\n }\n }\n } finally {\n this.undoService.endBatch();\n }\n if (changedRows.size > 0) {\n this.bodyRenderer.refreshRows([...changedRows]);\n this.summaryRenderer.refresh();\n }\n }\n\n pasteText(text: string, startRow: number, startColIdx: number): void {\n if (this.destroyed) return;\n const grid = parseTsv(text);\n if (grid.length === 0) return;\n const flat = this.columnModel.getOrderedVisible();\n const rowCount = this.rowModel.getDisplayedRowCount();\n const changedRows = new Set<number>();\n let r = startRow;\n\n this.undoService.beginBatch();\n try {\n for (const line of grid) {\n while (r < rowCount) {\n const node = this.rowModel.getDisplayedRow(r);\n if (node && !node.isDetail && !node.isGroup) break;\n r++;\n }\n if (r >= rowCount) break;\n const node = this.rowModel.getDisplayedRow(r)!;\n let c = startColIdx;\n for (const token of line) {\n while (c < flat.length) {\n const skip = flat[c] && (flat[c].hasCheckbox || flat[c].isDetailToggle || flat[c].colDef.rowDrag);\n if (!skip) break;\n c++;\n }\n if (c >= flat.length) break;\n const col = flat[c];\n if (this.editingService.isEditable(node, col)) {\n const old = this.getCellValue(node, col);\n let value: any = token;\n if (token === \"\") {\n value = null;\n } else if (typeof old === \"number\" && !isNaN(Number(token))) {\n value = Number(token);\n }\n if (this.setCellValue(node, col, value, old)) changedRows.add(r);\n }\n c++;\n }\n r++;\n }\n } finally {\n this.undoService.endBatch();\n }\n\n if (changedRows.size > 0) {\n this.bodyRenderer.refreshRows([...changedRows]);\n this.summaryRenderer.refresh();\n }\n }\n\n pasteFromSystemClipboard(): Promise<void> {\n const start = this.bodyRenderer.getPasteStart();\n if (!start) return Promise.resolve();\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.readText) {\n return navigator.clipboard\n .readText()\n .then((text) => {\n if (text) this.pasteText(text, start.row, start.colIdx);\n })\n .catch(() => undefined);\n }\n } catch {\n void 0;\n }\n return Promise.resolve();\n }\n\n refreshSummary(): void {\n this.summaryRenderer.refresh();\n }\n\n emit<K extends GridEventType>(type: K, extra?: Partial<GridEventMap<TData>[K]>): GridEventMap<TData>[K] {\n const event = { type, api: this.api, ...extra } as GridEventMap<TData>[K];\n this.eventBus.emit(type, event);\n const handlerKey = (\"on\" + type.charAt(0).toUpperCase() + type.slice(1)) as keyof ResolvedGridOptions<TData>;\n const handler = this.options[handlerKey] as\n | ((event: GridEventMap<TData>[K]) => void)\n | undefined;\n if (typeof handler === \"function\") {\n try {\n handler(event);\n } catch (error) {\n if (type === \"gridError\") console.error(\"[mach-table] error in onGridError\", error);\n else this.reportError(error, `eventHandler.${String(handlerKey)}`, { eventType: type });\n }\n }\n const finishedResize = type === \"columnResized\" && Boolean((event as { finished?: boolean }).finished);\n if (finishedResize || GRID_STATE_CHANGE_EVENTS.has(type)) this.scheduleGridStateSave();\n return event;\n }\n\n reportError(error: unknown, source: string, context?: Record<string, unknown>): void {\n const code = this.errorCodeFor(source, error);\n const message = error instanceof Error ? error.message : String(error);\n this.recentErrors.push({ code, source, message, timestamp: Date.now(), ...(context ? { context } : {}) });\n if (this.recentErrors.length > 50) this.recentErrors.splice(0, this.recentErrors.length - 50);\n console.error(`[mach-table] ${code} (${source})`, error);\n if (this.destroyed) return;\n this.emit(\"gridError\", { code, error, source, context });\n }\n\n private errorCodeFor(source: string, error: unknown): GridErrorCode {\n if (DATA_SOURCE_ERROR_PREFIXES.some((prefix) => source.startsWith(prefix))) return \"DATA_SOURCE_ERROR\";\n const message = error instanceof Error ? error.message : String(error);\n if (source === \"getRowId\" || message.includes(\"Duplicate row id\")) return \"DATA_INTEGRITY_ERROR\";\n if (source === \"validate\") return \"VALIDATION_ERROR\";\n if (\n source.toLowerCase().includes(\"renderer\") ||\n source === \"valueFormatter\" ||\n source === \"cellStyle\" ||\n source === \"cellClass\"\n ) return \"RENDERER_ERROR\";\n if (source.toLowerCase().includes(\"editor\") || source === \"editable\") return \"EDITOR_ERROR\";\n if (source.startsWith(\"feature.\")) return \"FEATURE_ERROR\";\n if (STATE_ERROR_PREFIXES.some((prefix) => source.startsWith(prefix))) return \"STATE_ERROR\";\n if (source.startsWith(\"eventBus.\") || source.startsWith(\"eventHandler.\")) return \"EVENT_HANDLER_ERROR\";\n return \"GRID_ERROR\";\n }\n\n getDiagnostics(): GridDiagnostics {\n return {\n gridId: this.gridId,\n version: packageJson.version,\n destroyed: this.destroyed,\n infinite: this.rowModel.isInfinite,\n loading: this.rowModel.isLoadingInfinite() || this.options.loading,\n rowCount: this.rowModel.getDisplayTotalCount(),\n renderedRowCount: this.skeleton.bodyEl.querySelectorAll(\".mach-row[data-index]\").length,\n columnCount: this.columnModel.getColumns().length,\n selectedRowCount: this.selectionService.getSelectedNodes().length,\n dirtyRowCount: this.changeTracker.getDirtyRowIds().length,\n activeFeatures: [...this.activeFeatures].map(([key, active]) => ({\n key,\n ...(active.feature.version ? { version: active.feature.version } : {})\n })),\n performance: this.performanceMonitor.snapshot(),\n recentErrors: this.recentErrors.map((entry) => ({\n ...entry,\n ...(entry.context ? { context: { ...entry.context } } : {})\n }))\n };\n }\n\n cycleSort(column: Column, additive: boolean): void {\n this.columnModel.cycleSort(column, additive);\n this.applySortModel();\n }\n\n applySortModel(): void {\n this.headerRenderer.refreshSortIndicators();\n this.emit(\"sortChanged\", { sortModel: this.columnModel.getSortModel() });\n this.persistColumnState();\n if (this.rowModel.isInfinite) {\n void this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n applyColumnFilter(column: Column, filter: ColumnFilter | null): void {\n const model = this.rowModel.getFilterModel();\n if (filter) model[column.id] = filter;\n else delete model[column.id];\n this.rowModel.setFilterModel(model);\n this.headerRenderer.refreshFilterIcons();\n this.emit(\"filterChanged\", {\n filterModel: this.rowModel.getFilterModel(),\n advancedFilterModel: this.rowModel.getAdvancedFilterModel()\n });\n if (this.rowModel.isInfinite) {\n void this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n applyQuickFilter(): void {\n this.emit(\"filterChanged\", {\n filterModel: this.rowModel.getFilterModel(),\n advancedFilterModel: this.rowModel.getAdvancedFilterModel()\n });\n if (this.rowModel.isInfinite) {\n void this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n moveColumn(colId: string, toIndex: number): void {\n if (!this.columnModel.moveColumn(colId, toIndex)) return;\n this.onColumnsStructureChanged();\n this.emit(\"columnMoved\", { colId, toIndex });\n this.persistColumnState();\n }\n\n toggleDetail(rowId: string): boolean {\n return this.rowModel.toggleDetail(rowId);\n }\n\n emitColumnResize(column: Column, finished: boolean): void {\n this.emit(\"columnResized\", {\n colId: column.id,\n width: column.currentWidth,\n finished\n });\n }\n\n /** Finalizes one logical resize operation and persists its state once. */\n commitColumnWidths(columns: readonly Column[]): void {\n if (this.destroyed || columns.length === 0) return;\n for (const column of columns) {\n if (this.destroyed) break;\n this.emitColumnResize(column, true);\n }\n this.persistColumnState();\n }\n\n private columnStateLoadToken = 0;\n\n loadPersistedColumnState(): void {\n const token = ++this.columnStateLoadToken;\n if (!this.options.columnStateKey) return;\n let saved: ColumnStateLike[] | null | Promise<ColumnStateLike[] | null>;\n try {\n saved = this.options.columnStateStore\n ? this.options.columnStateStore.load(this.options.columnStateKey)\n : loadColumnState(this.options.columnStateKey);\n } catch (error) {\n this.reportError(error, \"columnState.load\");\n return;\n }\n if (saved == null) return;\n if (!Array.isArray(saved)) {\n Promise.resolve(saved)\n .then((states) => {\n if (this.destroyed || token !== this.columnStateLoadToken || !states || states.length === 0) return;\n this.columnModel.applyColumnState(states);\n if (this.rowModel.isInfinite) void this.rowModel.onServerParamsChanged();\n else this.rowModel.refreshPipeline();\n this.onColumnsStructureChanged();\n })\n .catch((error) => this.reportError(error, \"columnState.load\"));\n return;\n }\n if (saved.length > 0) {\n this.columnModel.applyColumnState(saved);\n }\n }\n\n persistColumnState(): void {\n if (!this.options.columnStateKey || this.destroyed) return;\n const state = this.columnModel.getColumnState();\n try {\n const result = this.options.columnStateStore\n ? this.options.columnStateStore.save(this.options.columnStateKey, state)\n : saveColumnState(this.options.columnStateKey, state);\n if (result && typeof result.catch === \"function\") {\n void result.catch((error) => this.reportError(error, \"columnState.save\"));\n }\n } catch (error) {\n this.reportError(error, \"columnState.save\");\n }\n }\n\n loadPersistedGridState(): void {\n const token = ++this.gridStateLoadToken;\n const key = this.options.stateKey;\n if (!key) return;\n let saved: import(\"../types/state\").GridStateInput | null | Promise<import(\"../types/state\").GridStateInput | null>;\n try {\n saved = this.options.stateStore ? this.options.stateStore.load(key) : loadGridState(key);\n } catch (error) {\n this.reportError(error, \"gridState.load\");\n return;\n }\n const apply = (state: import(\"../types/state\").GridStateInput | null): void => {\n if (this.destroyed || token !== this.gridStateLoadToken || !state) return;\n this.api.applyState(state, { emitEvents: false });\n };\n if (saved && typeof (saved as Promise<unknown>).then === \"function\") {\n void Promise.resolve(saved).then(apply).catch((error) => this.reportError(error, \"gridState.load\"));\n } else {\n apply(saved as import(\"../types/state\").GridStateInput | null);\n }\n }\n\n scheduleGridStateSave(): void {\n if (!this.options.stateKey || this.destroyed) return;\n if (this.stateSaveTimer) clearTimeout(this.stateSaveTimer);\n this.stateSaveTimer = setTimeout(() => {\n this.stateSaveTimer = null;\n this.persistGridState();\n }, this.options.stateSaveDebounceMs);\n }\n\n persistGridState(): void {\n const key = this.options.stateKey;\n if (!key || this.destroyed) return;\n try {\n const result = this.options.stateStore\n ? this.options.stateStore.save(key, this.api.getState())\n : saveGridState(key, this.api.getState());\n if (result && typeof result.catch === \"function\") {\n void result.catch((error) => this.reportError(error, \"gridState.save\"));\n }\n } catch (error) {\n this.reportError(error, \"gridState.save\");\n }\n }\n\n buildDefaultErrorState(): HTMLElement {\n const error = document.createElement(\"div\");\n error.className = \"mach-empty mach-empty--error\";\n const title = document.createElement(\"div\");\n title.className = \"mach-empty__title\";\n title.textContent = this.getLocaleText(\"requestFailed\");\n const hint = document.createElement(\"div\");\n hint.className = \"mach-empty__hint\";\n hint.textContent = this.getLocaleText(\"requestFailedHint\");\n error.append(title, hint);\n return error;\n }\n\n buildDefaultEmptyState(): HTMLElement {\n const locale = this.options.locale ?? {};\n const title = locale.emptyRows ?? DEFAULT_LOCALE.emptyRows;\n const hint = locale.emptyRowsHint ?? DEFAULT_LOCALE.emptyRowsHint;\n const empty = document.createElement(\"div\");\n empty.className = \"mach-empty\";\n\n const icon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n icon.setAttribute(\"class\", \"mach-empty__icon\");\n icon.setAttribute(\"viewBox\", \"0 0 96 84\");\n icon.setAttribute(\"width\", \"96\");\n icon.setAttribute(\"height\", \"84\");\n icon.setAttribute(\"fill\", \"none\");\n icon.setAttribute(\"aria-hidden\", \"true\");\n // Static library-owned SVG only; user-controlled text is assigned via textContent below.\n icon.innerHTML =\n '<rect x=\"8\" y=\"10\" width=\"68\" height=\"56\" rx=\"6\" fill=\"#eaf3fe\"/>' +\n '<rect x=\"8\" y=\"10\" width=\"68\" height=\"12\" rx=\"6\" fill=\"#d5e8fd\"/>' +\n '<rect x=\"8\" y=\"19\" width=\"68\" height=\"3\" fill=\"#d5e8fd\"/>' +\n '<g stroke=\"#bcd7f8\" stroke-width=\"2.4\" stroke-linecap=\"round\">' +\n '<line x1=\"16\" y1=\"32\" x2=\"68\" y2=\"32\"/><line x1=\"16\" y1=\"42\" x2=\"60\" y2=\"42\"/>' +\n '<line x1=\"16\" y1=\"52\" x2=\"64\" y2=\"52\"/></g>' +\n '<circle cx=\"66\" cy=\"52\" r=\"15\" fill=\"#ffffff\" stroke=\"#8fbdf5\" stroke-width=\"3\"/>' +\n '<line x1=\"77\" y1=\"63\" x2=\"86\" y2=\"72\" stroke=\"#8fbdf5\" stroke-width=\"4\" stroke-linecap=\"round\"/>' +\n '<line x1=\"60\" y1=\"52\" x2=\"72\" y2=\"52\" stroke=\"#bcd7f8\" stroke-width=\"2.6\" stroke-linecap=\"round\"/>';\n\n const titleEl = document.createElement(\"div\");\n titleEl.className = \"mach-empty__title\";\n titleEl.textContent = title;\n const hintEl = document.createElement(\"div\");\n hintEl.className = \"mach-empty__hint\";\n hintEl.textContent = hint;\n empty.append(icon, titleEl, hintEl);\n return empty;\n }\n\n private lastValidatedDefs: unknown = null;\n private issuedWarningSignatures = new Set<string>();\n\n checkWarnings(inputOptions?: Partial<GridOptions<any>> | Record<string, unknown>): void {\n if (this.options.suppressWarnings || this.destroyed) return;\n if (inputOptions) {\n for (const issue of validateGridOptions(inputOptions)) {\n const signature = `${issue.code}:${issue.option ?? \"\"}:${issue.message}`;\n if (this.issuedWarningSignatures.has(signature)) continue;\n this.issuedWarningSignatures.add(signature);\n console.warn(`[mach-table:${issue.code}] ${issue.message}`);\n }\n }\n if (this.options.treeData) {\n if (this.columnModel.getRowGroupColumns().length > 0) {\n console.warn(\"[mach-table] treeData 与 rowGroup 不支持同时启用,行分组已被忽略\");\n }\n }\n }\n\n validateDefs(defs: (ColDef<any> | ColDefGroup<any>)[] | null | undefined): void {\n if (this.options.suppressWarnings || this.destroyed) return;\n if (this.lastValidatedDefs === defs) return;\n this.lastValidatedDefs = defs;\n for (const issue of validateColumnDefs(defs)) {\n if (this.issuedWarningSignatures.has(issue)) continue;\n this.issuedWarningSignatures.add(issue);\n console.warn(`[mach-table] ${issue}`);\n }\n }\n\n onColumnsStructureChanged(): void {\n this.checkWarnings();\n this.validateDefs(this.columnModel.getColumnDefs());\n this.bodyRenderer.invalidateAllRowHeights();\n this.headerRenderer.build();\n this.bodyRenderer.rebuildPool();\n this.relayout();\n this.pinnedRowsRenderer.rebuild();\n this.summaryRenderer.refresh();\n this.emit(\"displayedColumnsChanged\", {});\n }\n\n relayout(): void {\n if (this.destroyed) return;\n this.refreshAriaState();\n this.columnModel.computeLayout(this.skeleton.measureViewportWidth());\n const widthSignature = this.columnModel.getOrderedVisible()\n .map((column) => `${column.id}:${column.currentWidth}`)\n .join(\"|\");\n if (this.lastColumnLayoutSignature && widthSignature !== this.lastColumnLayoutSignature) {\n this.bodyRenderer.invalidateAllRowHeights();\n }\n this.lastColumnLayoutSignature = widthSignature;\n this.skeleton.root.setAttribute(\"aria-colcount\", String(this.columnModel.getOrderedVisible().length));\n this.headerRenderer.applyLayout();\n this.bodyRenderer.relayout();\n this.pinnedRowsRenderer.applyLayout();\n this.summaryRenderer.refresh();\n }\n\n refreshAriaState(): void {\n if (!this.skeleton.root) return;\n const treeGrid = this.options.treeData || this.columnModel.getRowGroupColumns().length > 0;\n this.skeleton.root.setAttribute(\"role\", treeGrid ? \"treegrid\" : \"grid\");\n if (this.options.rowSelection === \"multiple\") {\n this.skeleton.root.setAttribute(\"aria-multiselectable\", \"true\");\n } else {\n this.skeleton.root.removeAttribute(\"aria-multiselectable\");\n }\n const editable = this.columnModel.getOrderedVisible().some((column) => Boolean(column.colDef.editable));\n if (editable) this.skeleton.root.removeAttribute(\"aria-readonly\");\n else this.skeleton.root.setAttribute(\"aria-readonly\", \"true\");\n }\n\n relayoutColumns(invalidateRowHeights = true): void {\n if (this.destroyed) return;\n this.columnModel.computeLayout(this.skeleton.measureViewportWidth());\n if (invalidateRowHeights) this.bodyRenderer.invalidateAllRowHeights();\n this.headerRenderer.applyLayout();\n this.bodyRenderer.applyContainerSizes();\n this.bodyRenderer.applyCellLayout();\n this.bodyRenderer.updateRange(true);\n this.pinnedRowsRenderer.applyLayout();\n this.summaryRenderer.refresh();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n if (this.stateSaveTimer) {\n clearTimeout(this.stateSaveTimer);\n this.stateSaveTimer = null;\n this.persistGridState();\n }\n this.destroyed = true;\n if (this.readyRafId) cancelAnimationFrame(this.readyRafId);\n this.readyRafId = 0;\n this.settleReady();\n const safely = (source: string, fn: () => void): void => {\n try {\n fn();\n } catch (error) {\n console.error(`[mach-table] ${source} destroy error`, error);\n }\n };\n safely(\"grid event\", () => this.emit(\"gridDestroyed\", {}));\n safely(\"features\", () => this.destroyFeatures());\n safely(\"changeTracker\", () => this.changeTracker.destroy());\n safely(\"rowModel\", () => this.rowModel.destroy());\n safely(\"editingService\", () => this.editingService.destroy());\n safely(\"keyboardService\", () => this.keyboardService.destroy());\n safely(\"filterPopup\", () => this.filterPopup.destroy());\n safely(\"columnMenu\", () => this.columnMenu.destroy());\n safely(\"contextMenu\", () => this.contextMenuService.destroy());\n safely(\"tooltip\", () => this.tooltipService.destroy());\n safely(\"watermark\", () => this.watermarkService.destroy());\n safely(\"pagination\", () => this.paginationBar.destroy());\n safely(\"columnDrag\", () => this.columnDragService.destroy());\n safely(\"resize\", () => this.resizeService.destroy());\n safely(\"bodyRenderer\", () => this.bodyRenderer.destroy());\n safely(\"headerRenderer\", () => this.headerRenderer.destroy());\n safely(\"pinnedRowsRenderer\", () => this.pinnedRowsRenderer.destroy());\n safely(\"summaryRenderer\", () => this.summaryRenderer.destroy());\n safely(\"statusBar\", () => this.statusBarService.destroy());\n safely(\"skeleton\", () => this.skeleton.destroy());\n this.eventBus.clear();\n }\n}\n","import { GridCore } from \"./gridCore\";\nimport type { GridApi, GridOptions } from \"../types\";\n\nexport function createGrid<TData = any>(container: HTMLElement, options: GridOptions<TData> = {}): GridApi<TData> {\n if (!container) {\n throw new Error(\"[mach-table] createGrid requires a container element\");\n }\n if (typeof document === \"undefined\") {\n throw new Error(\"[mach-table] createGrid can only be used in a browser environment\");\n }\n const core = new GridCore<TData>(container, options);\n return core.getApi();\n}\n","import type { ColDef, ColDefGroup } from \"../types/colDef\";\n\nexport type GridSchemaFieldType = \"string\" | \"number\" | \"date\" | \"select\" | \"boolean\";\n\nexport interface SchemaSelectOption {\n label: string;\n value: string | number;\n}\n\nexport interface GridSchemaField {\n field: string;\n title?: string;\n type?: GridSchemaFieldType;\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n flex?: number;\n pinned?: \"left\" | \"right\";\n editable?: boolean;\n sortable?: boolean;\n filterable?: boolean;\n resizable?: boolean;\n hidden?: boolean;\n options?: SchemaSelectOption[];\n format?: \"date\" | \"datetime\";\n cellClass?: string | string[];\n}\n\nexport interface GridSchemaGroup {\n title: string;\n fields: string[];\n}\n\nexport interface GridSchema {\n fields: GridSchemaField[];\n groups?: GridSchemaGroup[];\n}\n\nfunction booleanFormatter(p: { value: any }): string {\n if (p.value === true) return \"是\";\n if (p.value === false) return \"否\";\n return \"\";\n}\n\nfunction dateFormatter(format: \"date\" | \"datetime\" | undefined): (p: { value: any }) => string {\n return (p) => {\n if (p.value == null || p.value === \"\") return \"\";\n const text = p.value instanceof Date ? p.value.toISOString() : String(p.value);\n return format === \"datetime\" ? text.slice(0, 16).replace(\"T\", \" \") : text.slice(0, 10);\n };\n}\n\nfunction selectFormatter(options: SchemaSelectOption[]): (p: { value: any }) => string {\n return (p) => {\n if (p.value == null) return \"\";\n const hit = options.find((o) => o.value === p.value);\n return hit ? hit.label : String(p.value);\n };\n}\n\nfunction fieldToColDef(field: GridSchemaField): ColDef<any> {\n const type = field.type ?? \"string\";\n const colDef: ColDef<any> = {\n colId: field.field,\n field: field.field,\n headerName: field.title ?? field.field,\n width: field.width,\n minWidth: field.minWidth,\n maxWidth: field.maxWidth,\n flex: field.flex,\n pinned: field.pinned ?? undefined,\n hide: field.hidden ?? false,\n editable: field.editable ?? false,\n sortable: field.sortable ?? true,\n resizable: field.resizable ?? true,\n filter: field.filterable === false ? false : type === \"number\" ? \"number\" : type === \"date\" ? \"date\" : type === \"select\" ? \"set\" : \"text\",\n cellClass: field.cellClass\n };\n\n if (type === \"number\") {\n colDef.type = \"rightAligned\";\n } else if (type === \"date\") {\n colDef.valueFormatter = dateFormatter(field.format);\n } else if (type === \"boolean\") {\n colDef.valueFormatter = booleanFormatter;\n colDef.filter = field.filterable === false ? false : \"set\";\n } else if (type === \"select\") {\n const options = field.options ?? [];\n colDef.valueFormatter = selectFormatter(options);\n if (field.editable) {\n colDef.cellEditor = \"select\";\n colDef.cellEditorParams = { values: options.map((o) => o.value) };\n }\n }\n\n return colDef;\n}\n\nexport function buildColDefsFromSchema<TData = any>(\n schema: GridSchema\n): (ColDef<TData> | ColDefGroup<TData>)[] {\n const byField = new Map(schema.fields.map((f) => [f.field, f]));\n const used = new Set<string>();\n const result: (ColDef<TData> | ColDefGroup<TData>)[] = [];\n\n for (const field of schema.fields) {\n if (used.has(field.field)) continue;\n const grouped = (schema.groups ?? []).some((g) => g.fields.includes(field.field));\n if (!grouped) {\n result.push(fieldToColDef(field));\n used.add(field.field);\n }\n }\n\n for (const group of schema.groups ?? []) {\n const children: ColDef<TData>[] = [];\n for (const fieldName of group.fields) {\n const field = byField.get(fieldName);\n if (!field || used.has(fieldName)) continue;\n children.push(fieldToColDef(field));\n used.add(fieldName);\n }\n if (children.length > 0) {\n result.push({ headerName: group.title, children });\n }\n }\n\n return result;\n}\n","import type { GridApi } from \"../types/api\";\nimport type { GridSize } from \"../types/options\";\nimport { downloadFile } from \"./download\";\n\nexport interface MachTableCommandOptions<TData = any> {\n getApi(): GridApi<TData> | null;\n /** Overrides refresh for remote-query workflows. */\n reload?: () => void | Promise<void>;\n /** Fullscreen target. Defaults to the grid root's parent when available. */\n getFullscreenElement?: () => HTMLElement | null;\n}\n\nexport interface MachTableCommands {\n search(text: string | null | undefined): void;\n refresh(): Promise<void>;\n openColumns(anchor?: HTMLElement): void;\n setDensity(size: GridSize): void;\n resetColumns(): void;\n undo(): boolean;\n redo(): boolean;\n canUndo(): boolean;\n canRedo(): boolean;\n exportCsv(filename?: string): boolean;\n toggleFullscreen(): Promise<boolean>;\n}\n\nfunction available<TData>(getApi: () => GridApi<TData> | null): GridApi<TData> | null {\n const api = getApi();\n return api && !api.isDestroyed() ? api : null;\n}\n\n/** Framework-neutral command surface used by Vue/React controllers and toolbars. */\nexport function createMachTableCommands<TData = any>(options: MachTableCommandOptions<TData>): MachTableCommands {\n const getApi = (): GridApi<TData> | null => options.getApi();\n return {\n search(text) {\n available(getApi)?.setQuickFilter(text);\n },\n async refresh() {\n if (options.reload) {\n await options.reload();\n return;\n }\n const api = available(getApi);\n if (!api) return;\n if (api.isInfinite()) await api.reload();\n else api.refreshCells();\n },\n openColumns(anchor) {\n available(getApi)?.openColumnWorkbench(anchor);\n },\n setDensity(size) {\n available(getApi)?.setGridOption(\"size\", size);\n },\n resetColumns() {\n available(getApi)?.resetColumnState();\n },\n undo() {\n return available(getApi)?.undo() ?? false;\n },\n redo() {\n return available(getApi)?.redo() ?? false;\n },\n canUndo() {\n return available(getApi)?.canUndo() ?? false;\n },\n canRedo() {\n return available(getApi)?.canRedo() ?? false;\n },\n exportCsv(filename = \"mach-table.csv\") {\n const api = available(getApi);\n return api ? downloadFile(filename, api.getDataAsCsv({ prependBOM: true }), \"text/csv;charset=utf-8\") : false;\n },\n async toggleFullscreen() {\n if (typeof document === \"undefined\") return false;\n if (document.fullscreenElement) {\n await document.exitFullscreen?.();\n return false;\n }\n const api = available(getApi);\n const root = api?.getRootElement();\n const target = options.getFullscreenElement?.() ?? root?.parentElement ?? root;\n if (!target?.requestFullscreen) return false;\n await target.requestFullscreen();\n return true;\n }\n };\n}\n","import type { ColDef } from \"../types/colDef\";\nimport type { ActionButtonsConfig, RowActionsConfig } from \"./presetRenderers\";\nimport { createActionButtonsRenderer, createRowActionsRenderer } from \"./presetRenderers\";\n\nconst NO_INTERACT = {\n sortable: false,\n resizable: false,\n movable: false,\n filter: false,\n suppressSizeToFit: true\n} as const;\n\nexport function selectionColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"sel\",\n headerName: \"\",\n width: 46,\n pinned: \"left\",\n checkboxSelection: true,\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function indexColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"idx\",\n headerName: \"#\",\n type: \"index\",\n width: 60,\n pinned: \"left\",\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function dragColumn<TData = any>(overrides: Partial<ColDef<TData>> = {}): ColDef<TData> {\n return {\n colId: \"drag\",\n headerName: \"\",\n rowDrag: true,\n width: 40,\n ...NO_INTERACT,\n ...overrides\n };\n}\n\nexport function actionsColumn<TData = any>(\n config: ActionButtonsConfig<TData> & { width?: number; pinned?: \"left\" | \"right\" } = { actions: [] }\n): ColDef<TData> {\n const { width, pinned, ...rendererConfig } = config;\n const count = rendererConfig.actions?.length ?? 0;\n const shown = rendererConfig.overflow === \"inline\" ? count : Math.min(count, rendererConfig.max ?? 3);\n const hasMore = rendererConfig.overflow !== \"inline\" && count > shown;\n const defaultWidth = Math.max(1, shown) * 26 + (hasMore ? 26 : 0) + 10;\n return {\n colId: \"op\",\n headerName: \"操作\",\n width: width ?? Math.max(64, defaultWidth),\n pinned: pinned ?? \"right\",\n cellRenderer: createActionButtonsRenderer(rendererConfig),\n ...NO_INTERACT,\n cellRendererParams: undefined\n };\n}\n\nexport function rowActionsColumn<TData = any>(\n config: RowActionsConfig<TData> & { width?: number; pinned?: \"left\" | \"right\" } = {}\n): ColDef<TData> {\n const { width, pinned, ...rendererConfig } = config;\n const count =\n (rendererConfig.onView ? 1 : 0) +\n (rendererConfig.edit === false ? 0 : 1) +\n (rendererConfig.onDelete ? 1 : 0) +\n (rendererConfig.extraActions?.length ?? 0);\n const shown = rendererConfig.overflow === \"inline\" ? count : Math.min(count, rendererConfig.max ?? 3);\n const hasMore = rendererConfig.overflow !== \"inline\" && count > shown;\n const defaultWidth = Math.max(2, shown) * 26 + (hasMore ? 26 : 0) + 10;\n return {\n colId: \"op\",\n headerName: \"操作\",\n width: width ?? Math.max(72, defaultWidth),\n pinned: pinned ?? \"right\",\n cellRenderer: createRowActionsRenderer(rendererConfig),\n ...NO_INTERACT,\n cellRendererParams: undefined\n };\n}\n","import type { ColDef, ColDefGroup } from \"../types/colDef\";\nimport type { FieldPath, FieldPathValue } from \"../types/path\";\n\nexport type { FieldPath, FieldPathValue } from \"../types/path\";\n\nexport interface ColumnHelper<TData> {\n accessor<TPath extends FieldPath<TData>>(\n field: TPath,\n definition?: Omit<ColDef<TData, FieldPathValue<TData, TPath>>, \"field\">\n ): ColDef<TData, FieldPathValue<TData, TPath>>;\n display<TValue = unknown>(\n definition: Omit<ColDef<TData, TValue>, \"field\"> & Required<Pick<ColDef<TData, TValue>, \"colId\">>\n ): ColDef<TData, TValue>;\n group(definition: ColDefGroup<TData>): ColDefGroup<TData>;\n}\n\n/** Creates strongly typed column definitions without repeating TData/TValue. */\nexport function createColumnHelper<TData>(): ColumnHelper<TData> {\n return {\n accessor: (field, definition = {}) => ({ ...definition, field }),\n display: (definition) => ({ ...definition }),\n group: (definition) => ({ ...definition, children: [...definition.children] })\n };\n}\n\n/** Identity helper that retains literal types while checking GridOptions elsewhere. */\nexport function defineColumns<TData>(columns: readonly (ColDef<TData> | ColDefGroup<TData>)[]): (ColDef<TData> | ColDefGroup<TData>)[] {\n return [...columns];\n}\n","import type { GridOptions } from \"../types/options\";\n\nfunction mergeSwitchableObject<T extends object>(\n base: boolean | T | undefined,\n next: boolean | T | undefined\n): boolean | T | undefined {\n if (next === undefined) return base;\n if (typeof next !== \"object\" || next === null || typeof base !== \"object\" || base === null) return next;\n return { ...base, ...next };\n}\n\nfunction composeHandlers(base: unknown, next: unknown): unknown {\n if (typeof base !== \"function\") return next;\n if (typeof next !== \"function\") return base;\n return (...args: unknown[]) => {\n let firstError: unknown;\n try {\n base(...args);\n } catch (error) {\n firstError = error;\n }\n try {\n next(...args);\n } catch (error) {\n firstError ??= error;\n }\n if (firstError !== undefined) throw firstError;\n };\n}\n\nfunction mergeOptions<TData>(base: GridOptions<TData>, next: Partial<GridOptions<TData>>): GridOptions<TData> {\n const merged: GridOptions<TData> = {\n ...base,\n ...next,\n features: next.features ?? base.features\n };\n if (base.defaultColDef || next.defaultColDef) {\n merged.defaultColDef = { ...base.defaultColDef, ...next.defaultColDef };\n }\n if (base.locale || next.locale) {\n merged.locale = { ...base.locale, ...next.locale };\n }\n if (base.components || next.components) {\n merged.components = {\n cellRenderers: { ...base.components?.cellRenderers, ...next.components?.cellRenderers },\n cellEditors: { ...base.components?.cellEditors, ...next.components?.cellEditors }\n };\n }\n if (base.columnTypes || next.columnTypes) {\n const columnTypes: Record<string, Record<string, unknown>> = {};\n for (const name of new Set([...Object.keys(base.columnTypes ?? {}), ...Object.keys(next.columnTypes ?? {})])) {\n columnTypes[name] = {\n ...(base.columnTypes?.[name] as Record<string, unknown> | undefined),\n ...(next.columnTypes?.[name] as Record<string, unknown> | undefined)\n };\n }\n merged.columnTypes = columnTypes;\n }\n if (base.aggFuncs || next.aggFuncs) {\n merged.aggFuncs = { ...base.aggFuncs, ...next.aggFuncs };\n }\n merged.pagination = mergeSwitchableObject(base.pagination, next.pagination);\n merged.statusBar = mergeSwitchableObject(base.statusBar, next.statusBar);\n merged.watermark = mergeSwitchableObject(base.watermark, next.watermark);\n\n for (const key of new Set([...Object.keys(base), ...Object.keys(next)])) {\n if (!/^on[A-Z]/.test(key)) continue;\n const previousHandler = (base as Record<string, unknown>)[key];\n const nextHandler = (next as Record<string, unknown>)[key];\n if (typeof previousHandler === \"function\" && typeof nextHandler === \"function\") {\n (merged as Record<string, unknown>)[key] = composeHandlers(previousHandler, nextHandler);\n }\n }\n return merged;\n}\n\n/** Merges reusable defaults left-to-right with nested defaults handled safely. */\nexport function createMachTablePreset<TData>(\n ...sources: readonly Partial<GridOptions<TData>>[]\n): GridOptions<TData> {\n return sources.reduce<GridOptions<TData>>(mergeOptions, {});\n}\n\n/** Recommended defaults for editable enterprise back-office screens. */\nexport function createEnterprisePreset<TData>(\n overrides: Partial<GridOptions<TData>> = {}\n): GridOptions<TData> {\n return createMachTablePreset<TData>({\n defaultColDef: { sortable: true, resizable: true, movable: true, filter: true },\n enableColumnResize: true,\n rowSelection: \"multiple\",\n columnMenu: true,\n contextMenu: true,\n enableRangeSelection: true,\n fillHandle: true,\n statusBar: true,\n stripedRows: true\n }, overrides);\n}\n\n/** Compile-time helper for a reusable partial preset. */\nexport function defineMachTablePreset<TData>(\n preset: Partial<GridOptions<TData>>\n): Partial<GridOptions<TData>> {\n return preset;\n}\n\n/** Compile-time helper for reusable, typed grid option objects. */\nexport function defineGridOptions<TData>(options: GridOptions<TData>): GridOptions<TData> {\n return options;\n}\n","import { createMachTablePreset } from \"./presets\";\nimport type { ColDef } from \"../types/colDef\";\nimport type { GridComponents, GridOptions } from \"../types/options\";\n\nexport type MachTablePresetSelection = string | readonly string[] | false | null;\n\nexport interface MachTableConfigWarning {\n code: \"UNKNOWN_PRESET\";\n message: string;\n preset?: string;\n}\n\nexport interface MachTableRuntimeConfig {\n /** Defaults inherited by every table in this application or subtree. */\n defaults?: Partial<GridOptions<any>>;\n /** Application-wide semantic column types. Kept separate for config readability. */\n columnTypes?: Readonly<Record<string, Partial<ColDef<any>>>>;\n /** Application-wide renderer/editor registry. Per-table components can override it. */\n components?: GridComponents;\n /** Named, reusable behavior profiles such as `list`, `crud` or `picker`. */\n presets?: Readonly<Record<string, Partial<GridOptions<any>>>>;\n /** Preset used when a table does not declare its own preset. Set false to disable. */\n defaultPreset?: MachTablePresetSelection;\n onConfigWarning?: (warning: MachTableConfigWarning) => void;\n}\n\nexport interface ResolvedMachTableConfig {\n readonly defaults: Partial<GridOptions<any>>;\n readonly presets: Readonly<Record<string, Partial<GridOptions<any>>>>;\n readonly defaultPreset: MachTablePresetSelection;\n readonly onConfigWarning?: (warning: MachTableConfigWarning) => void;\n}\n\nexport interface MachTableOptionExplanation {\n readonly key: keyof GridOptions<any> | string;\n readonly value: unknown;\n readonly source: string;\n readonly layers: readonly { name: string; value: unknown }[];\n}\n\nexport interface ResolvedMachTableGridOptions<TData = any> {\n readonly options: GridOptions<TData>;\n explain(key: keyof GridOptions<TData> | string): MachTableOptionExplanation;\n}\n\n/** Type-checks a dedicated `mach-table.config.ts` without runtime work. */\nexport function defineMachTableConfig<const TConfig extends MachTableRuntimeConfig>(config: TConfig): TConfig {\n return config;\n}\n\nfunction presetNames(selection: MachTablePresetSelection | undefined): readonly string[] {\n if (!selection) return [];\n return (Array.isArray(selection) ? selection : [selection])\n .filter((name): name is string => typeof name === \"string\" && name.trim().length > 0);\n}\n\nexport function normalizeMachTableConfig(config: MachTableRuntimeConfig = {}): ResolvedMachTableConfig {\n return {\n defaults: createMachTablePreset(\n { columnTypes: config.columnTypes, components: config.components },\n config.defaults ?? {}\n ),\n presets: Object.fromEntries(\n Object.entries(config.presets ?? {}).map(([name, preset]) => [name, createMachTablePreset(preset)])\n ),\n defaultPreset: config.defaultPreset ?? false,\n ...(config.onConfigWarning ? { onConfigWarning: config.onConfigWarning } : {})\n };\n}\n\n/** Merges app, route and layout configuration while preserving named presets. */\nexport function mergeMachTableConfig(\n parent: ResolvedMachTableConfig,\n child: MachTableRuntimeConfig\n): ResolvedMachTableConfig {\n const normalizedChild = normalizeMachTableConfig(child);\n const presets: Record<string, Partial<GridOptions<any>>> = { ...parent.presets };\n for (const [name, preset] of Object.entries(child.presets ?? {})) {\n presets[name] = createMachTablePreset(parent.presets[name] ?? {}, preset);\n }\n return {\n defaults: createMachTablePreset(parent.defaults, normalizedChild.defaults),\n presets,\n defaultPreset: child.defaultPreset === undefined ? parent.defaultPreset : child.defaultPreset,\n ...(child.onConfigWarning ?? parent.onConfigWarning\n ? { onConfigWarning: child.onConfigWarning ?? parent.onConfigWarning }\n : {})\n };\n}\n\nexport function resolveMachTableGridOptions<TData>(\n config: ResolvedMachTableConfig,\n requestedPreset: MachTablePresetSelection | undefined,\n explicit: Partial<GridOptions<TData>>,\n reportWarning?: (warning: MachTableConfigWarning) => void\n): ResolvedMachTableGridOptions<TData> {\n const selected = requestedPreset === undefined ? config.defaultPreset : requestedPreset;\n const layers: { name: string; options: Partial<GridOptions<TData>> }[] = [\n { name: \"application defaults\", options: config.defaults as Partial<GridOptions<TData>> }\n ];\n for (const name of presetNames(selected)) {\n const preset = config.presets[name];\n if (!preset) {\n const warning: MachTableConfigWarning = {\n code: \"UNKNOWN_PRESET\",\n preset: name,\n message: `[MachTable] Unknown preset \"${name}\". Register it in mach-table.config.ts or remove the preset.`\n };\n if (reportWarning) reportWarning(warning);\n else if (config.onConfigWarning) config.onConfigWarning(warning);\n else console.warn(warning.message);\n continue;\n }\n layers.push({ name: `preset:${name}`, options: preset as Partial<GridOptions<TData>> });\n }\n layers.push({ name: \"table props\", options: explicit });\n const options = createMachTablePreset(...layers.map((layer) => layer.options));\n\n return {\n options,\n explain(key) {\n const declared = layers\n .filter((layer) => Object.prototype.hasOwnProperty.call(layer.options, key))\n .map((layer) => ({ name: layer.name, value: (layer.options as Record<string, unknown>)[key] }));\n const last = declared[declared.length - 1];\n return {\n key,\n value: (options as Record<string, unknown>)[key],\n source: last?.name ?? \"MachTable built-in\",\n layers: declared\n };\n }\n };\n}\n","import type { ColDef, CellRendererFn } from \"../types/colDef\";\n\nexport type BusinessColumnType =\n | \"text\"\n | \"number\"\n | \"integer\"\n | \"money\"\n | \"percent\"\n | \"percentage\"\n | \"date\"\n | \"datetime\"\n | \"boolean\"\n | \"status\"\n | \"link\";\n\nexport interface BusinessColumnTypeOptions {\n locale?: string | readonly string[];\n currency?: string;\n currencyDisplay?: \"symbol\" | \"narrowSymbol\" | \"code\" | \"name\";\n timeZone?: string;\n emptyText?: string;\n invalidText?: string;\n trueText?: string;\n falseText?: string;\n maximumFractionDigits?: number;\n}\n\nfunction present(value: unknown): boolean {\n return value !== null && value !== undefined && value !== \"\";\n}\n\nfunction numeric(value: unknown): number | null {\n if (!present(value)) return null;\n const result = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(result) ? result : null;\n}\n\nfunction safeNumberFormat(\n locale: string | readonly string[] | undefined,\n options: Intl.NumberFormatOptions\n): Intl.NumberFormat {\n try {\n return new Intl.NumberFormat(locale as string | string[] | undefined, options);\n } catch {\n return new Intl.NumberFormat(undefined, options);\n }\n}\n\nfunction safeDateFormat(\n locale: string | readonly string[] | undefined,\n options: Intl.DateTimeFormatOptions\n): Intl.DateTimeFormat {\n try {\n return new Intl.DateTimeFormat(locale as string | string[] | undefined, options);\n } catch {\n const portable = { ...options };\n delete portable.timeZone;\n return new Intl.DateTimeFormat(undefined, portable);\n }\n}\n\nfunction parseDate(value: unknown): Date | null {\n if (!present(value)) return null;\n const date = value instanceof Date ? value : new Date(value as string | number);\n return Number.isFinite(date.getTime()) ? date : null;\n}\n\n/**\n * Production-oriented semantic column types. Register once in\n * `mach-table.config.ts`, then pages only declare `type: \"money\"` etc.\n */\nexport function createBusinessColumnTypes<TData = any>(\n options: BusinessColumnTypeOptions = {}\n): Readonly<Record<BusinessColumnType, Partial<ColDef<TData>>>> {\n const empty = options.emptyText ?? \"\";\n const invalid = options.invalidText ?? \"—\";\n const numberFormat = safeNumberFormat(options.locale, {\n maximumFractionDigits: options.maximumFractionDigits ?? 2\n });\n const integerFormat = safeNumberFormat(options.locale, { maximumFractionDigits: 0 });\n const moneyFormat = safeNumberFormat(options.locale, {\n style: \"currency\",\n currency: options.currency ?? \"CNY\",\n currencyDisplay: options.currencyDisplay ?? \"symbol\",\n maximumFractionDigits: options.maximumFractionDigits ?? 2\n });\n const fractionPercentFormat = safeNumberFormat(options.locale, {\n style: \"percent\",\n maximumFractionDigits: options.maximumFractionDigits ?? 2\n });\n const dateFormat = safeDateFormat(options.locale, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n ...(options.timeZone ? { timeZone: options.timeZone } : {})\n });\n const dateTimeFormat = safeDateFormat(options.locale, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n ...(options.timeZone ? { timeZone: options.timeZone } : {})\n });\n\n const formatNumber = (formatter: Intl.NumberFormat, scale = 1) => ({ value }: { value: unknown }): string => {\n if (!present(value)) return empty;\n const parsed = numeric(value);\n return parsed == null ? invalid : formatter.format(parsed * scale);\n };\n const formatDate = (formatter: Intl.DateTimeFormat) => ({ value }: { value: unknown }): string => {\n if (!present(value)) return empty;\n const parsed = parseDate(value);\n return parsed == null ? invalid : formatter.format(parsed);\n };\n\n return Object.freeze({\n text: { align: \"left\", filter: \"text\" },\n number: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(numberFormat)\n },\n integer: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(integerFormat)\n },\n money: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(moneyFormat)\n },\n /** Fraction input: 0.125 is displayed as 12.5%. */\n percent: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(fractionPercentFormat)\n },\n /** Whole-number input: 12.5 is displayed as 12.5%. */\n percentage: {\n align: \"right\",\n filter: \"number\",\n cellEditor: \"number\",\n valueFormatter: formatNumber(fractionPercentFormat, 0.01)\n },\n date: {\n align: \"center\",\n filter: \"date\",\n cellEditor: \"date\",\n valueFormatter: formatDate(dateFormat)\n },\n datetime: {\n align: \"center\",\n filter: \"date\",\n valueFormatter: formatDate(dateTimeFormat)\n },\n boolean: {\n align: \"center\",\n filter: \"set\",\n valueFormatter: ({ value }) => value === true\n ? (options.trueText ?? \"是\")\n : value === false\n ? (options.falseText ?? \"否\")\n : empty\n },\n status: { filter: \"set\", cellRenderer: \"statusTag\" },\n link: { filter: \"text\", cellRenderer: \"link\" }\n });\n}\n\nexport type DictionaryKey = string | number;\n\nexport interface DictionaryEntry<TKey extends DictionaryKey = DictionaryKey> {\n value: TKey;\n label: string;\n}\n\nexport interface CachedDictionaryOptions<TKey extends DictionaryKey = DictionaryKey> {\n load(keys: readonly TKey[], signal: AbortSignal): Promise<readonly DictionaryEntry<TKey>[]>;\n ttlMs?: number;\n maxSize?: number;\n batchDelayMs?: number;\n onError?(error: unknown, keys: readonly TKey[]): void;\n}\n\nexport interface CachedDictionary<TKey extends DictionaryKey = DictionaryKey> {\n get(key: TKey): string | undefined;\n resolve(key: TKey): Promise<string | undefined>;\n resolveMany(keys: readonly TKey[]): Promise<ReadonlyMap<TKey, string>>;\n prime(entries: readonly DictionaryEntry<TKey>[]): void;\n invalidate(keys?: readonly TKey[]): void;\n destroy(): void;\n readonly size: number;\n}\n\ninterface DictionaryCacheValue<TKey extends DictionaryKey> {\n key: TKey;\n label: string;\n expiresAt: number;\n}\n\nfunction dictionaryId(key: DictionaryKey): string {\n return `${typeof key}:${String(key)}`;\n}\n\n/** Batched, de-duplicated TTL/LRU dictionary resolver for code-to-label fields. */\nexport function createCachedDictionary<TKey extends DictionaryKey = DictionaryKey>(\n options: CachedDictionaryOptions<TKey>\n): CachedDictionary<TKey> {\n const ttlMs = Math.max(0, options.ttlMs ?? 5 * 60_000);\n const maxSize = Math.max(1, Math.floor(options.maxSize ?? 2_000));\n const delay = Math.max(0, options.batchDelayMs ?? 0);\n const cache = new Map<string, DictionaryCacheValue<TKey>>();\n const queued = new Map<string, TKey>();\n const waiting = new Map<string, Array<{ resolve(value: string | undefined): void; reject(error: unknown): void }>>();\n let timer: ReturnType<typeof setTimeout> | null = null;\n let controller: AbortController | null = null;\n let destroyed = false;\n\n const get = (key: TKey): string | undefined => {\n const id = dictionaryId(key);\n const hit = cache.get(id);\n if (!hit) return undefined;\n if (hit.expiresAt < Date.now()) {\n cache.delete(id);\n return undefined;\n }\n cache.delete(id);\n cache.set(id, hit);\n return hit.label;\n };\n\n const prime = (entries: readonly DictionaryEntry<TKey>[]): void => {\n const expiresAt = ttlMs === 0 ? Number.POSITIVE_INFINITY : Date.now() + ttlMs;\n for (const entry of entries) {\n const id = dictionaryId(entry.value);\n cache.delete(id);\n cache.set(id, { key: entry.value, label: String(entry.label), expiresAt });\n }\n while (cache.size > maxSize) cache.delete(cache.keys().next().value as string);\n };\n\n const flush = async (): Promise<void> => {\n timer = null;\n if (destroyed || queued.size === 0) return;\n const entries = [...queued.entries()];\n queued.clear();\n const keys = entries.map(([, key]) => key);\n const active = new AbortController();\n controller = active;\n try {\n const loaded = await options.load(keys, active.signal);\n if (destroyed || active.signal.aborted) return;\n prime(loaded);\n for (const [id, key] of entries) {\n const value = get(key);\n for (const waiter of waiting.get(id) ?? []) waiter.resolve(value);\n waiting.delete(id);\n }\n } catch (error) {\n if (!active.signal.aborted) options.onError?.(error, keys);\n for (const [id] of entries) {\n for (const waiter of waiting.get(id) ?? []) waiter.reject(error);\n waiting.delete(id);\n }\n } finally {\n if (controller === active) controller = null;\n if (!destroyed && queued.size > 0 && timer == null) timer = setTimeout(() => { void flush(); }, delay);\n }\n };\n\n const resolve = (key: TKey): Promise<string | undefined> => {\n const cached = get(key);\n if (cached !== undefined) return Promise.resolve(cached);\n if (destroyed) return Promise.reject(new Error(\"[MachTable] Dictionary resolver has been destroyed.\"));\n const id = dictionaryId(key);\n queued.set(id, key);\n const promise = new Promise<string | undefined>((resolveValue, reject) => {\n const list = waiting.get(id) ?? [];\n list.push({ resolve: resolveValue, reject });\n waiting.set(id, list);\n });\n if (timer == null && controller == null) timer = setTimeout(() => { void flush(); }, delay);\n return promise;\n };\n\n return {\n get,\n resolve,\n async resolveMany(keys) {\n const labels = await Promise.all(keys.map(async (key) => [key, await resolve(key)] as const));\n return new Map(labels.filter((entry): entry is readonly [TKey, string] => entry[1] !== undefined));\n },\n prime,\n invalidate(keys) {\n if (!keys) cache.clear();\n else for (const key of keys) cache.delete(dictionaryId(key));\n },\n destroy() {\n destroyed = true;\n if (timer != null) clearTimeout(timer);\n timer = null;\n controller?.abort();\n controller = null;\n const error = new Error(\"[MachTable] Dictionary resolver has been destroyed.\");\n for (const waiters of waiting.values()) for (const waiter of waiters) waiter.reject(error);\n waiting.clear();\n queued.clear();\n cache.clear();\n },\n get size() {\n return cache.size;\n }\n };\n}\n\nexport interface DictionaryRendererOptions {\n loadingText?: string;\n emptyText?: string;\n fallback?: (value: DictionaryKey) => string;\n}\n\n/** Async-safe renderer backed by createCachedDictionary; stale pooled cells are not mutated. */\nexport function createDictionaryRenderer<TKey extends DictionaryKey = DictionaryKey>(\n dictionary: CachedDictionary<TKey>,\n options: DictionaryRendererOptions = {}\n): CellRendererFn {\n return (params) => {\n if (!present(params.value)) return options.emptyText ?? \"\";\n const key = params.value as TKey;\n const fallback = options.fallback?.(key) ?? String(key);\n const cached = dictionary.get(key);\n if (cached !== undefined) return cached;\n const element = document.createElement(\"span\");\n element.className = \"mach-dictionary-value mach-dictionary-value--loading\";\n element.textContent = options.loadingText ?? fallback;\n let active = true;\n void dictionary.resolve(key).then((label) => {\n if (!active || !element.isConnected) return;\n element.textContent = label ?? fallback;\n element.classList.remove(\"mach-dictionary-value--loading\");\n }).catch(() => {\n if (!active || !element.isConnected) return;\n element.textContent = fallback;\n element.classList.remove(\"mach-dictionary-value--loading\");\n element.classList.add(\"mach-dictionary-value--error\");\n });\n return { el: element, destroy: () => { active = false; } };\n };\n}\n","import type { GridApi } from \"../types/api\";\nimport type { ColumnStateStorage } from \"./columnStateStore\";\nimport type {\n GridViewManager,\n GridViewState,\n GridViewStore,\n SavedGridView\n} from \"../types/views\";\nimport { migrateGridState } from \"./gridState\";\n\nexport interface LocalGridViewStoreOptions {\n namespace?: string;\n storage?: ColumnStateStorage;\n maxViews?: number;\n maxBytes?: number;\n onError?(error: unknown, operation: \"list\" | \"save\" | \"remove\", scope: string): void;\n}\n\ninterface StoredViews {\n schemaVersion: 1;\n savedAt: number;\n views: SavedGridView[];\n}\n\nfunction currentStorage(): ColumnStateStorage | null {\n try { return typeof localStorage === \"undefined\" ? null : localStorage; }\n catch { return null; }\n}\n\nfunction storageBytes(value: string): number {\n return typeof TextEncoder === \"undefined\" ? value.length * 2 : new TextEncoder().encode(value).byteLength;\n}\n\nfunction safeId(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const id = value.trim();\n return id && id.length <= 256 ? id : null;\n}\n\nexport function normalizeGridViewState(input: unknown): GridViewState | null {\n if (input == null || typeof input !== \"object\") return null;\n const source = input as Partial<GridViewState>;\n if (source.version !== 1) return null;\n const state = migrateGridState({\n version: 2,\n columns: source.columns,\n sortModel: source.sortModel,\n filterModel: source.filterModel,\n advancedFilterModel: source.advancedFilterModel,\n quickFilterText: source.quickFilterText,\n pagination: { enabled: true, page: 1, pageSize: source.pageSize },\n selectedRowIds: [], expandedRowIds: [], expandedGroupIds: []\n });\n if (!state) return null;\n return {\n version: 1,\n columns: state.columns,\n sortModel: state.sortModel,\n filterModel: state.filterModel,\n advancedFilterModel: state.advancedFilterModel,\n quickFilterText: state.quickFilterText,\n pageSize: state.pagination.pageSize\n };\n}\n\nexport function normalizeSavedGridView(input: unknown): SavedGridView | null {\n if (input == null || typeof input !== \"object\") return null;\n const source = input as Partial<SavedGridView>;\n const id = safeId(source.id);\n const name = typeof source.name === \"string\" ? source.name.trim().slice(0, 120) : \"\";\n const state = normalizeGridViewState(source.state);\n if (source.schemaVersion !== 1 || !id || !name || !state) return null;\n const createdAt = typeof source.createdAt === \"number\" && Number.isFinite(source.createdAt) ? source.createdAt : Date.now();\n const updatedAt = typeof source.updatedAt === \"number\" && Number.isFinite(source.updatedAt) ? source.updatedAt : createdAt;\n return { schemaVersion: 1, id, name, createdAt, updatedAt, state };\n}\n\nexport function captureGridViewState<TData>(api: GridApi<TData>): GridViewState {\n const state = api.getState();\n return {\n version: 1,\n columns: state.columns,\n sortModel: state.sortModel,\n filterModel: state.filterModel,\n advancedFilterModel: state.advancedFilterModel,\n quickFilterText: state.quickFilterText,\n pageSize: state.pagination.pageSize\n };\n}\n\nexport function applyGridViewState<TData>(\n api: GridApi<TData>,\n view: GridViewState,\n options: { emitEvents?: boolean } = {}\n): boolean {\n const normalized = normalizeGridViewState(view);\n if (!normalized || api.isDestroyed()) return false;\n const current = api.getState();\n api.applyState({\n ...current,\n columns: normalized.columns,\n sortModel: normalized.sortModel,\n filterModel: normalized.filterModel,\n advancedFilterModel: normalized.advancedFilterModel,\n quickFilterText: normalized.quickFilterText,\n pagination: { ...current.pagination, page: 1, pageSize: normalized.pageSize }\n }, {\n sections: [\"columns\", \"sort\", \"filter\", \"pagination\"],\n emitEvents: options.emitEvents\n });\n return true;\n}\n\nexport function createLocalGridViewStore(options: LocalGridViewStoreOptions = {}): GridViewStore {\n const namespace = (options.namespace ?? \"mach-table:views\").replace(/:+$/, \"\");\n const maxViews = Math.max(1, Math.floor(options.maxViews ?? 50));\n const maxBytes = Math.max(4_096, Math.floor(options.maxBytes ?? 512 * 1_024));\n const keyOf = (scope: string): string => `${namespace}:${encodeURIComponent(scope)}`;\n const report = (error: unknown, operation: \"list\" | \"save\" | \"remove\", scope: string): void => {\n try { options.onError?.(error, operation, scope); } catch { /* observers cannot break preferences */ }\n };\n const read = (scope: string): SavedGridView[] => {\n const raw = (options.storage ?? currentStorage())?.getItem(keyOf(scope));\n if (!raw || storageBytes(raw) > maxBytes) return [];\n const parsed = JSON.parse(raw) as Partial<StoredViews>;\n if (parsed.schemaVersion !== 1 || !Array.isArray(parsed.views)) return [];\n return parsed.views.flatMap((view) => {\n const normalized = normalizeSavedGridView(view);\n return normalized ? [normalized] : [];\n }).slice(0, maxViews);\n };\n const write = (scope: string, views: SavedGridView[]): void => {\n const payload = JSON.stringify({ schemaVersion: 1, savedAt: Date.now(), views } satisfies StoredViews);\n if (storageBytes(payload) > maxBytes) throw new RangeError(`[MachTable] Saved views for \"${scope}\" exceed ${maxBytes} bytes.`);\n const storage = options.storage ?? currentStorage();\n if (!storage) throw new Error(\"[MachTable] Saved view storage is unavailable.\");\n storage.setItem(keyOf(scope), payload);\n };\n return {\n list(scope) {\n try { return read(scope); }\n catch (error) { report(error, \"list\", scope); return []; }\n },\n save(scope, view) {\n try {\n const normalized = normalizeSavedGridView(view);\n if (!normalized) throw new TypeError(`[MachTable] Invalid saved view for \"${scope}\".`);\n const views = read(scope).filter((entry) => entry.id !== normalized.id);\n views.unshift(normalized);\n write(scope, views.slice(0, maxViews));\n } catch (error) { report(error, \"save\", scope); throw error; }\n },\n remove(scope, id) {\n try { write(scope, read(scope).filter((entry) => entry.id !== id)); }\n catch (error) { report(error, \"remove\", scope); throw error; }\n }\n };\n}\n\nfunction createViewId(): string {\n try { if (typeof crypto !== \"undefined\" && crypto.randomUUID) return crypto.randomUUID(); }\n catch { /* use deterministic-compatible fallback */ }\n return `view-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function createGridViewManager<TData>(\n api: GridApi<TData>,\n options: { scope: string; store?: GridViewStore }\n): GridViewManager {\n const scope = options.scope.trim();\n if (!scope || scope.length > 512) {\n throw new TypeError(\"[MachTable] Grid view scope must contain between 1 and 512 characters.\");\n }\n const store = options.store ?? createLocalGridViewStore();\n const list = async (): Promise<SavedGridView[]> => {\n const views = await store.list(scope);\n return views.flatMap((view) => {\n const normalized = normalizeSavedGridView(view);\n return normalized ? [normalized] : [];\n }).sort((left, right) => right.updatedAt - left.updatedAt);\n };\n return {\n list,\n async save(name, requestedId) {\n const cleanName = name.trim().slice(0, 120);\n if (!cleanName) throw new TypeError(\"[MachTable] Grid view name must be a non-empty string.\");\n const id = safeId(requestedId) ?? createViewId();\n const existing = (await list()).find((view) => view.id === id);\n const now = Date.now();\n const view: SavedGridView = {\n schemaVersion: 1,\n id,\n name: cleanName,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n state: captureGridViewState(api)\n };\n await store.save(scope, view);\n return view;\n },\n async apply(viewOrId, applyOptions) {\n const view = typeof viewOrId === \"string\"\n ? (await list()).find((entry) => entry.id === viewOrId)\n : normalizeSavedGridView(viewOrId);\n const requested = typeof viewOrId === \"string\" ? viewOrId : \"provided view\";\n if (!view) throw new Error(`[MachTable] Grid view \"${requested}\" was not found.`);\n if (!applyGridViewState(api, view.state, applyOptions)) {\n throw new Error(`[MachTable] Grid view \"${view.id}\" could not be applied.`);\n }\n return view;\n },\n async remove(id) { await store.remove(scope, id); }\n };\n}\n"],"mappings":"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","names":["index_exports","__export","BUILTIN_AGG_FUNCS","Column","DEFAULT_LOCALE","DIRECT_GRID_OPTION_KEYS","EVENT_TYPES","EventBus","GRID_OPTION_KEYS","GRID_OPTION_META","GRID_SIZE_PRESETS","GridCore","LOCALE_EN","actionsColumn","advancedFilterCondition","advancedFilterGroup","applyGridViewState","buildColDefsFromSchema","captureGridViewState","clearColumnState","clearComponentRegistries","clearGridState","computeColumnWidths","createActionButtonsRenderer","createAggResolver","createBusinessColumnTypes","createCachedDictionary","createColumnHelper","createColumnStateKey","createDictionaryRenderer","createEnterprisePreset","createGrid","createGridViewManager","createLocalColumnStateStore","createLocalGridStateStore","createLocalGridViewStore","createMachTableCommands","createMachTablePreset","createProgressBarRenderer","createRowActionsRenderer","createSaveSnapshot","createStatusTagRenderer","defaultComparator","defineColumns","defineGridOptions","defineMachTableConfig","defineMachTablePreset","describeFilter","downloadFile","dragColumn","escapeHtml","evaluateColumnFilter","fitColumnWidths","formatText","formatTwo","getByPath","getCellEditor","getCellRenderer","indexColumn","isColDefGroup","isSafePath","linkRenderer","loadColumnState","loadGridState","matchLocaleKey","matchesGridOptionKind","mergeMachTableConfig","migrateGridState","normalizeAdvancedFilterModel","normalizeBatchSaveResult","normalizeColumnFilter","normalizeFilterModel","normalizeGridViewState","normalizeMachTableConfig","normalizeSavedGridView","parseCsv","parseDelimited","parseTsv","registerBuiltinRenderers","registerCellEditor","registerCellRenderer","resolveGridFeatures","resolveMachTableGridOptions","resolveSaveConflict","resolveTagVariant","rowActionsColumn","sanitizeFormulaCell","sanitizeGridOptionPatch","saveColumnState","saveGridState","selectionColumn","setByPath","sortNodes","toTsv","validateGridOptions","version","__toCommonJS","package_default","EventBus","onListenerError","type","listener","set","off","event","payload","err","UNSAFE_PATH_SEGMENTS","isSafePath","path","part","getByPath","obj","cur","start","idx","setByPath","value","parts","TEXT_MATCHES","NUMBER_MATCHES","DATE_MATCHES","primitive","value","matchesFor","type","normalizedCondition","entry","matches","condition","conditionValues","finiteNumber","value2","normalizedConditions","input","output","normalizeColumnFilter","source","normalizeConditionNode","node","context","colId","filter","normalizeGroupNode","depth","children","child","normalized","normalizeAdvancedNode","canNormalizeNode","result","normalizeAdvancedFilterModel","validColumnIds","root","advancedFilterCondition","normalizeFilterModel","rawId","advancedFilterGroup","operator","options","DEFAULT_COL_DEF","GRID_SIZE_PRESETS","finiteAtLeast","value","fallback","min","integer","resolveSize","resolveTheme","options","resolvePageSizeOptions","pageSize","requested","values","left","right","rowIdFromKey","rowKey","data","getByPath","resolveRowIdentity","getRowId","resolveDataAndLayout","size","preset","resolveAppearance","resolveEditingAndHistory","resolveHierarchy","resolvePagination","config","resolveWatermark","resolveInteraction","normalizeAdvancedFilterModel","resolveStatePersistence","resolveDatasource","resolveAccessibility","OPTIONAL_OPTION_KEYS","copyOptionalOptions","source","target","key","copyEventHandlers","resolveOptions","userOptions","resolved","columnTypeNames","type","name","hasColumnType","colDef","mergeColDef","defaults","columnTypes","typedDefaults","definition","Column","id","colDef","p","f","ColumnGroup","_ColumnGroup","groupId","def","out","child","isColDefGroup","def","positiveFinite","value","fallback","widthBounds","input","min","clampWidth","w","max","width","computeColumnWidths","cols","availableWidth","widths","c","flexCols","flexTotal","i","f","total","extra","pass","remainingFlex","remainingTotal","consumed","k","share","before","used","stillFlexible","_index","fitColumnWidths","column","active","_column","index","remainingWidth","weightTotal","constrained","target","fitted","drift","sum","candidate","DETAIL_TOGGLE_COL_ID","isPositiveFiniteNumber","value","ColumnModel","core","colDefs","prev","c","defaults","usedIds","build","list","parent","level","def","i","isColDefGroup","groupId","group","ColumnGroup","colDef","id","uniqueId","suffix","column","Column","mergeColDef","p","toggleCol","max","initial","children","out","child","visible","colId","pane","ordered","viewportWidth","pinnedTotal","clampWidth","available","scalable","fixed","fixedTotal","scalableInputs","scalableWidth","widths","fitColumnWidths","computeColumnWidths","index","width","toIndex","inScope","container","siblings","from","target","leafSlots","idx","slotIdx","pinned","sortIndex","s","state","states","stateById","knownIds","seenIds","nextSort","a","b","direction","orderById","paneOfCol","current","sorted","slots","sortModel","additive","model","next","textOf","value","evaluateTextFilter","conditions","operator","v","results","c","fv","evaluateNumberFilter","isBlank","n","f","toTime","t","evaluateDateFilter","f2","evaluateSetFilter","filterValues","evaluateColumnFilter","filter","evaluateAdvancedNode","node","columns","row","getCellValue","column","passed","child","evaluateAdvancedFilter","model","doesNodePassFilters","filterModel","advancedFilterModel","quickFilter","colId","tokens","token","collator","defaultComparator","valueA","valueB","aEmpty","bEmpty","a","b","sortNodes","nodes","sortModel","columns","getCellValue","colById","c","comparators","directions","item","column","defaultComparator","decorated","node","s","a","b","i","r","d","numeric","values","v","BUILTIN_AGG_FUNCS","acc","nums","createAggResolver","custom","merged","name","readChildren","data","key","value","RowModel","core","normalizeAdvancedFilterModel","index","fallback","getRowId","id","error","detailRows","v","start","end","datasource","blockSize","stop","seq","controller","resolve","settled","attempt","done","reason","runAttempt","attemptSettled","failAttempt","delay","request","rows","lastRow","received","wasEmpty","node","lastVisibleIndex","loaded","buffer","childrenKey","next","roots","byId","childIds","autoSeq","buildNode","depth","parentId","children","list","child","force","loader","childId","pending","parent","removed","stack","replacedIds","reserved","seenObjects","nested","transaction","refresh","touched","externallyReplacedIds","removeIds","removeRefs","collect","cur","kids","kid","drop","remaining","n","startIndex","added","i","transactions","walk","root","filterModel","before","columns","column","normalizeFilterModel","model","text","getCellValue","doesNodePassFilters","sortModel","sortNodes","groupCols","withDetails","size","pageCount","slice","page","silent","firstVisible","pageSize","enabled","passCache","filterPresent","nodePasses","cached","pass","out","nodes","ordered","childNodes","spanColumns","c","masters","m","col","arr","span","defaultComparator","k","colId","aggResolve","createAggResolver","aggCols","computeAgg","leaves","values","fn","leaf","build","level","parentPath","groups","order","raw","bucket","a","b","display","groupId","groupNode","checkTree","check","rowIds","groupIds","expanded","changed","fromIndex","toIndex","fromNode","toNode","fromAllIdx","toAllIdx","idx","insertAt","callback","SelectionService","core","id","node","column","check","error","n","ids","requested","changes","preserveIds","existing","groupNode","leaves","selectableCount","count","leaf","selected","clearOthers","nodeId","event","fromCheckbox","mode","single","multi","anchor","start","end","i","row","filteredOnly","selectable","total","acc","clearAll","before","c","isTree","keep","targets","changedIds","prevSelected","prevIndeterminate","refreshIndexes","touched","isSel","out","walk","childId","evaluate","childIds","all","some","state","root","ResizeService","core","event","active","column","handle","startWidth","restore","clientX","pointerX","el","tag","className","attrs","e","key","clamp","v","min","max","FILTER_ICON","SORT_ASC_ICON","SORT_DESC_ICON","DRAG_THRESHOLD","ColumnDragService","core","pending","dragging","column","value","cellEl","indicator","el","pane","cssEscape","rowRect","cols","fromIndex","x","target","indicatorX","acc","i","mid","csvEscape","value","separator","s","sanitizeFormulaCell","buildCsv","accessor","params","includeHeader","protectFormulas","lines","l","row","v","body","escapeCell","value","protectFormulas","safe","sanitizeFormulaCell","s","toTsv","rows","row","parseTsv","text","parseDelimited","parseCsv","separator","cell","inQuotes","i","ch","fallbackCopyText","ta","writeClipboard","NAVIGATION_KEYS","MOVEMENT_KEYS","KeyboardService","core","range","text","dt","writeClipboard","start","rowIndex","colId","dir","cols","c","rowCount","i","row","guard","node","key","body","columns","focus","colIdx","column","position","moved","columnCount","current","candidate","viewport","pageRows","direction","target","down","next","baseInput","type","value","input","inferEditorType","selectValues","createEditor","column","keyPress","def","name","timeMatch","values","select","v","option","match","cellStates","detailDestroyers","headerDestroyers","getCellRuntimeState","element","state","peekCellRuntimeState","setDetailDestroyer","destroy","takeDetailDestroyer","setHeaderDestroyer","takeHeaderDestroyer","defaultFormat","value","cleanupCellContent","core","cell","state","peekCellRuntimeState","destroy","error","updateCellTooltip","node","column","formatted","tooltip","tooltipGetter","tryRefreshRenderer","renderer","params","formatCellValue","formatter","out","formatCellValueWith","applyCellStyle","rule","getCellRuntimeState","prevKeys","key","styles","keys","renderCellContent","rendererDef","result","next","applyCellClasses","classes","align","hasColumnType","hadFocus","hadEditing","className","CHECK_PATH","CLOSE_PATH","createEditButton","kind","label","button","event","EditingService","core","current","next","stopped","rowIndex","colId","node","column","editable","error","keyPress","cell","oldValue","editor","cleanupCellContent","shell","controls","confirmButton","cancelButton","keydown","preferredColId","drafts","row","first","target","draft","editing","cancel","newValue","validation","token","task","result","changed","results","invalid","rowErrors","cancelled","changes","applied","rollbackFailed","previous","input","value","def","params","createEditor","validate","validator","values","errors","message","firstMessage","editorEl","clear","busy","mounted","removeCellState","currentIndex","direction","offset","DEFAULT_LOCALE","LOCALE_EN","MATCH_LOCALE_KEYS","matchLocaleKey","match","formatText","template","n","formatTwo","a","b","TEXT_MATCHES","NUMBER_MATCHES","DATE_MATCHES","FilterPopupService","core","column","anchor","filter","type","panel","el","footer","resetBtn","applyBtn","next","rect","panelRect","left","clamp","top","matches","existing","currentMatch","isBlank","select","option","matchLocaleKey","valueInput","value2Input","blank","enterApply","e","body","params","values","seen","nodes","cap","i","v","key","selected","search","list","checkboxes","valueByKey","renderList","query","q","text","label","cb","span","entries","selectedKeys","emptyLabel","picked","inputs","match","raw","value","value2","ColumnMenuService","core","column","anchor","target","rect","fake","api","panel","el","title","sortRow","makeSortBtn","labelKey","dir","btn","pinRow","makePinBtn","pinned","toolRow","fitBtn","hideBtn","divider","listTitle","search","list","footer","resetBtn","allFitBtn","panelRect","left","clamp","top","workbench","columns","candidate","col","row","label","checkbox","text","pin","value","caption","option","siblings","position","move","next","disabled","button","ContextMenuService","core","x","y","anchor","node","anchorCol","range","flat","anchorIndex","panel","el","customGetter","items","error","hasEnabled","item","sep","btn","copyBtn","pasteBtn","clearBtn","active","rect","left","clamp","top","TooltipService","core","cell","colId","rowEl","index","node","column","value","params","formatCellValue","getter","fallback","error","body","component","panel","el","content","err","rect","panelRect","left","clamp","top","WatermarkService","core","config","url","canvas","ctx","fontSize","gap","angle","color","opacity","metrics","textW","tile","ctx2","UndoRedoService","core","batch","entry","maxSize","redo","refreshIndexes","node","column","value","replaced","ChangeTrackingService","core","event","key","originalValue","change","byRow","node","row","rowIds","ids","saved","cell","current","column","value","targets","refresh","completed","now","PerformanceMonitor","startedAt","rows","columns","durations","sample","last","sorted","left","right","percentileIndex","total","duration","EVENT_TYPES","escapeHtml","value","downloadFile","filename","content","mime","a","blob","url","revoke","GRID_OPTION_META","GRID_OPTION_KEYS","DIRECT_GRID_OPTION_KEYS","key","EVENT_OPTION_KEYS","EVENT_TYPES","type","matchesGridOptionKind","value","kind","sanitizeGridOptionPatch","input","output","key","metadata","GRID_OPTION_META","MAX_COLUMNS","MAX_ROW_IDS","MAX_ID_LENGTH","MAX_QUICK_FILTER_LENGTH","stringIds","value","entry","positiveInteger","fallback","positiveNumber","addColumnSizing","state","source","width","flex","addColumnLayout","addColumnSort","normalizeColumnEntry","input","seen","colId","normalizeColumns","output","normalizeSortModel","migrateGridState","pagination","normalizeFilterModel","normalizeAdvancedFilterModel","cloneSnapshotData","data","createSaveSnapshot","changes","rowIds","ids","change","cell","normalizeIssue","issue","submittedIds","rowId","id","uniqueIssues","input","byRow","normalized","normalizeBatchSaveResult","submitted","response","conflicts","conflictIds","conflict","failures","failure","blocked","explicitlySaved","saved","conflictUpdateData","api","node","getRowId","current","resolveSaveConflict","strategy","update","createOptionUpdateEffects","hasOwnOption","options","key","normalizeFinite","value","min","integer","changedFinite","current","normalized","GridApiImpl","core","rows","transaction","resolve","transactions","resolvers","colDefs","state","colId","visible","toIndex","pinned","width","column","cols","target","total","acc","c","changed","col","skipHeader","ctx","style","maxWidth","consider","text","w","nodes","cap","i","formatCellValue","extra","sortModel","filterModel","model","mode","nodeId","selected","clearOthers","filteredOnly","rowIndex","id","callback","position","rowId","groupId","fromIndex","getRowId","changes","row","node","n","selectedIds","rowIds","handler","snapshot","createSaveSnapshot","result","normalizeBatchSaveResult","anchor","enabled","page","size","grid","parseCsv","headerRow","body","r","toTsv","columns","fieldOrder","records","byHeader","field","matched","header","index","entry","record","raw","setByPath","columnIndex","error","isNumeric","hasLeadingZero","win","headerCells","escapeHtml","bodyRows","v","html","params","cancel","sanitizeGridOptionPatch","effects","previousColumnMenu","resolved","eventType","EVENT_TYPES","rowHeight","headerHeight","rowBuffer","detailHeight","undoStackSize","wait","tooltipDelay","config","GRID_SIZE_PRESETS","preset","DEFAULT_COL_DEF","rowKey","data","rowIdFromKey","reloadGridState","stateDebounce","blockSize","bufferRows","retryCount","retryDelay","buildCsv","a","b","input","migrateGridState","all","sections","type","content","listener","SIZE_CLASSES","GridSkeleton","core","container","options","classes","el","pane","paneEl","rowsContainer","viewport","depth","rows","row","i","left","right","width","hp","bp","hidden","rowHeight","headerHeight","size","s","theme","dark","mq","handler","on","layout","className","token","type","content","allowUnsafeHtml","resolved","error","spinner","active","text","cleanup","MATCH_LABELS","describeFilter","filter","parts","condition","label","value","value2","operator","HeaderRenderer","core","cell","destroy","takeHeaderDestroyer","error","depth","paneOf","col","buildTree","children","level","pane","out","child","ColumnGroup","subtree","roots","perRowHeight","rows","row","appendCell","tree","index","column","rowSpan","colDef","cellEl","el","headerAlign","e","selectAllEl","headerComponent","err","labelEl","wrapper","setHeaderDestroyer","sortEl","filterBtn","filterTagEl","FILTER_ICON","menuBtn","resizeEl","group","def","flatIndex","widths","x","leafLefts","left","gc","leaves","width","leaf","c","resize","delta","next","siblings","from","to","current","target","model","multi","hc","idx","s","dir","badge","SORT_ASC_ICON","SORT_DESC_ICON","fm","filter","active","summary","describeFilter","RangeSelectionModel","point","extend","rowCount","colCount","RowDragController","core","getPositions","event","drag","container","y","rowCount","positions","targetIndex","indicatorY","index","node","top","bottom","from","to","indicator","el","PANES","lowerBound","positions","y","count","lo","hi","mid","BodyRenderer","core","RangeSelectionModel","drag","me","dx","dy","target","end","old","targetCol","finish","targetRow","resolved","node","index","cellEl","labelCol","colId","column","value","event","colIdx","RowDragController","body","slot","pane","cell","cleanupCellContent","sk","viewport","widths","a","c","displayed","rowCount","positionedCount","rowHeight","detailHeight","getRowHeight","api","cap","autoHeightCols","minH","i","h","cached","requested","error","measured","totalHeight","centerAvailable","centerWidth","container","cols","ctx","style","fontSize","padding","lineHeight","maxLines","col","text","formatCellValue","availW","lines","w","ch","cw","rowIndexes","colIds","rowIndex","entries","runtime","getCellRuntimeState","timer","minRowHeight","visible","needed","row","el","detailRow","input","columns","existingCells","existingIds","id","byId","nextCells","nextIds","variableHeights","allPaneCols","x","lefts","first","cells","prevFirst","prevLast","last","width","total","scrollLeft","acc","force","startedAt","rows","buffer","colWindowChanged","lastExcl","firstVisible","viewBottom","lastVisible","clamp","columnsChanged","changed","isTreeRow","isGroupRow","hasTreeChildren","isExpandable","expanded","level","hasColSpan","coverage","span","remaining","fn","start","master","renderer","params","out","err","setDetailDestroyer","destroy","takeDetailDestroyer","kind","renderCellContent","applyCellClasses","applyCellStyle","hasColumnType","toggle","handle","button","expandable","depth","indent","wrap","stateClass","spacer","formatCellValueWith","spans","idx","height","base","state","groupCol","prefix","formatted","defaultFormat","indexes","seen","options","template","colCount","range","focus","ci","flat","anchor","b","collect","r","extend","next","inRange","e","cm","leftCount","centerCols","local","bottom","rect","r1","r2","c1","c2","targetEnd","changedRows","srcNode","sources","n","allNumeric","v","diff","intPattern","t","colOffset","steps","colIndex","left","position","viewportHeight","scrollTop","rowTop","rowBottom","maxScroll","prev","hover","rowEl","treeColumn","SummaryRenderer","core","el","pane","row","visible","show","method","masterRows","n","locale","DEFAULT_LOCALE","cols","cell","x","col","i","node","error","formatText","PaginationBar","core","el","mkBtn","cls","label","text","btn","size","options","current","a","b","option","formatText","key","DEFAULT_LOCALE","rm","active","total","visible","page","pageCount","formatTwo","off","PANES","PinnedRowsRenderer","core","root","state","el","pane","top","bottom","rows","side","sideName","row","cell","cleanupCellContent","wrapper","rowHeight","cm","data","i","node","cellsByPane","col","renderCellContent","applyCellClasses","applyCellStyle","err","widths","lefts","x","hidden","globalColOffset","cols","scrollLeft","StatusBarService","core","el","options","panel","item","locale","DEFAULT_LOCALE","text","key","value","template","formatText","rm","total","loaded","count","range","flat","sum","r","node","c","col","v","avg","sumText","off","currentStorage","safeSegment","value","copyColumnDimensions","source","state","copyColumnSort","createColumnStateKey","parts","entry","name","sanitizeColumnState","maxColumns","result","ids","item","createLocalColumnStateStore","options","namespace","version","storageKey","key","report","error","operation","raw","parsed","legacy","envelope","columns","defaultStore","saveColumnState","loadColumnState","clearColumnState","currentStorage","storageBytes","value","createLocalGridStateStore","options","namespace","maxBytes","storageKey","key","report","error","operation","raw","parsed","migrateGridState","state","normalized","payload","defaultStore","saveGridState","loadGridState","clearGridState","DEFAULT_STATUS_VARIANTS","resolveTagVariant","value","variantMap","key","exact","lower","pattern","variant","createStatusTagRenderer","config","params","label","tag","createProgressBarRenderer","raw","pct","wrap","track","bar","linkRenderer","link","ICON_PATHS","iconSvg","name","size","path","openActionSurface","openActionAnchor","closeActionSurface","restoreFocus","onActionSurfaceOutside","onActionSurfaceKeyDown","event","buttons","current","delta","makeSurfaceButton","item","className","button","showActionMenu","anchor","items","menu","rect","menuRect","showActionDrawer","title","backdrop","drawer","header","heading","close","body","resolveActionFlag","flag","actionVariant","action","actionPermissions","actionContext","message","reportActionError","error","policy","policyError","canAccessAction","visibleActions","actions","createActionButtonsRenderer","max","overflowMode","visible","shown","overflow","run","request","more","locale","moreLabel","DEFAULT_LOCALE","actionLabel","configured","localized","fallback","resolveRowActionLabels","renderRowEditingActions","labels","confirm","changes","change","confirmTitle","buildRowActions","createRowActionsRenderer","presetStatusTagRenderer","presetProgressBarRenderer","registerBuiltinRenderers","register","cellRenderers","cellEditors","registerCellRenderer","name","renderer","previous","getCellRenderer","registerCellEditor","editor","getCellEditor","ensureCellRenderer","clearComponentRegistries","validateColumnDefs","defs","issues","seenIds","leafIndex","walk","list","depth","def","isColDefGroup","id","isSafePath","count","EVENT_OPTION_KEYS","EVENT_TYPES","type","KNOWN_OPTIONS","GRID_OPTION_KEYS","editDistance","a","b","previous","_","index","row","current","column","closestOption","input","closest","distance","candidate","next","threshold","validateIdentityAndLayout","source","issues","hasStableRowId","validateMetadataValues","specialised","key","value","expected","GRID_OPTION_META","matchesGridOptionKind","validateGridOptions","options","option","suggestion","pagination","config","normalizedKeys","values","value","resolveGridFeatures","input","issues","byKey","feature","key","invalid","dependency","conflict","ordered","visiting","visited","visit","valid","DATA_SOURCE_ERROR_PREFIXES","STATE_ERROR_PREFIXES","GRID_STATE_CHANGE_EVENTS","gridUid","ensureBuiltinRenderers","registerBuiltinRenderers","ensureCellRenderer","GridCore","container","options","settleReady","resolve","resolveOptions","EventBus","error","eventType","ColumnModel","RowModel","SelectionService","GridSkeleton","HeaderRenderer","BodyRenderer","ResizeService","ColumnDragService","KeyboardService","EditingService","UndoRedoService","PerformanceMonitor","FilterPopupService","ColumnMenuService","ContextMenuService","TooltipService","WatermarkService","PaginationBar","PinnedRowsRenderer","SummaryRenderer","StatusBarService","GridApiImpl","ChangeTrackingService","name","local","renderer","getCellRenderer","getCellEditor","feature","dependency","features","resolved","resolveGridFeatures","issue","key","inactiveDependency","cleanups","manage","cleanup","active","once","context","type","listener","target","listenerOptions","handler","delayMs","id","controller","source","details","cleanupError","entries","node","column","def","getByPath","DEFAULT_LOCALE","newValue","oldValue","colDef","setByPath","changed","range","cols","rows","r","col","formatCellValueWith","toTsv","writeClipboard","flat","changedRows","c","old","text","startRow","startColIdx","grid","parseTsv","rowCount","line","token","value","start","extra","event","handlerKey","code","message","prefix","package_default","entry","additive","filter","model","colId","toIndex","rowId","finished","columns","saved","loadColumnState","states","state","result","saveColumnState","loadGridState","apply","saveGridState","title","hint","locale","empty","icon","titleEl","hintEl","inputOptions","validateGridOptions","signature","defs","validateColumnDefs","widthSignature","treeGrid","invalidateRowHeights","safely","fn","createGrid","container","options","GridCore","booleanFormatter","p","dateFormatter","format","text","selectFormatter","options","hit","o","fieldToColDef","field","type","colDef","buildColDefsFromSchema","schema","byField","f","used","result","g","group","children","fieldName","available","getApi","api","createMachTableCommands","options","text","anchor","size","filename","downloadFile","root","target","NO_INTERACT","selectionColumn","overrides","indexColumn","dragColumn","actionsColumn","config","width","pinned","rendererConfig","count","shown","hasMore","defaultWidth","createActionButtonsRenderer","rowActionsColumn","createRowActionsRenderer","createColumnHelper","field","definition","defineColumns","columns","mergeSwitchableObject","base","next","composeHandlers","args","firstError","error","mergeOptions","merged","columnTypes","name","key","previousHandler","nextHandler","createMachTablePreset","sources","createEnterprisePreset","overrides","defineMachTablePreset","preset","defineGridOptions","options","defineMachTableConfig","config","presetNames","selection","name","normalizeMachTableConfig","createMachTablePreset","preset","mergeMachTableConfig","parent","child","normalizedChild","presets","resolveMachTableGridOptions","requestedPreset","explicit","reportWarning","selected","layers","warning","options","layer","key","declared","last","present","value","numeric","result","safeNumberFormat","locale","options","safeDateFormat","portable","parseDate","date","createBusinessColumnTypes","empty","invalid","numberFormat","integerFormat","moneyFormat","fractionPercentFormat","dateFormat","dateTimeFormat","formatNumber","formatter","scale","parsed","formatDate","dictionaryId","key","createCachedDictionary","ttlMs","maxSize","delay","cache","queued","waiting","timer","controller","destroyed","get","id","hit","prime","entries","expiresAt","entry","flush","keys","active","loaded","waiter","error","resolve","cached","promise","resolveValue","reject","list","labels","waiters","createDictionaryRenderer","dictionary","params","fallback","element","label","currentStorage","storageBytes","value","safeId","id","normalizeGridViewState","input","source","state","migrateGridState","normalizeSavedGridView","name","createdAt","updatedAt","captureGridViewState","api","applyGridViewState","view","options","normalized","current","createLocalGridViewStore","namespace","maxViews","maxBytes","keyOf","scope","report","error","operation","read","raw","parsed","write","views","payload","storage","entry","createViewId","createGridViewManager","store","list","left","right","requestedId","cleanName","existing","now","viewOrId","applyOptions","requested","version","package_default"]}
|