@agile-team/mach-table 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../package.json","../src/core/eventBus.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/lib/dom.ts","../src/services/resizeService.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/types/events.ts","../src/lib/download.ts","../src/lib/path.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/presetRenderers.ts","../src/lib/componentRegistry.ts","../src/lib/validateDefs.ts","../src/core/gridCore.ts","../src/core/createGrid.ts","../src/core/gridOptionMetadata.ts","../src/lib/schema.ts","../src/lib/presetColumns.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 } 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 { 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 ThemeMode,\n DetailRowRendererParams,\n GridComponents,\n GridFeature,\n GridFeatureContext,\n OverlayTemplate,\n ColumnStateStore,\n StatusBarPanel,\n StatusBarConfig,\n GridDatasource,\n InfiniteGetRowsParams,\n PaginationConfig,\n WatermarkConfig\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 type {\n GridOptionKey,\n GridOptionMetadata,\n GridOptionUpdateMode,\n GridOptionValueKind\n} from \"./core/gridOptionMetadata\";\nexport { describeFilter } from \"./lib/filterSummary\";\nexport { buildColDefsFromSchema } from \"./lib/schema\";\nexport type { GridSchema, GridSchemaField, GridSchemaGroup, GridSchemaFieldType, SchemaSelectOption } from \"./lib/schema\";\nexport { saveColumnState, loadColumnState, clearColumnState } 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 { 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 linkRenderer,\n resolveTagVariant,\n registerBuiltinRenderers\n} from \"./lib/presetRenderers\";\nexport type {\n TagVariant,\n StatusTagConfig,\n ProgressConfig,\n ActionItem,\n ActionButtonsConfig\n} from \"./lib/presetRenderers\";\nexport { selectionColumn, indexColumn, dragColumn, actionsColumn } from \"./lib/presetColumns\";\nexport type { TooltipParams, ContextMenuParams, ContextMenuItem } from \"./types/params\";\nexport type {\n GridApi,\n CsvExportParams,\n RowTransaction,\n ImportCsvOptions,\n PrintOptions\n} from \"./types/api\";\nexport type { RowNode } from \"./types/row\";\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 ModelUpdatedEvent,\n DetailToggledEvent,\n RowDragEndEvent,\n RangeSelectionChangedEvent,\n GridCellRange,\n PaginationChangedEvent,\n GridErrorEvent\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.4.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\": \"Agile Team\",\n \"license\": \"MIT\",\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","import type { GridOptions, GridSize, ResolvedGridOptions } from \"../types/options\";\nimport type { ColDef } from \"../types/colDef\";\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\nexport function resolveOptions<TData>(userOptions: GridOptions<TData>): ResolvedGridOptions<TData> {\n const size: GridSize = userOptions.size && Object.prototype.hasOwnProperty.call(GRID_SIZE_PRESETS, userOptions.size)\n ? userOptions.size\n : \"normal\";\n const preset = GRID_SIZE_PRESETS[size];\n const pageSize = finiteAtLeast(\n typeof userOptions.pagination === \"object\" ? userOptions.pagination.pageSize : undefined,\n 20,\n 1,\n true\n );\n const requestedPageSizes = typeof userOptions.pagination === \"object\" && Array.isArray(userOptions.pagination.pageSizeOptions)\n ? userOptions.pagination.pageSizeOptions\n : undefined;\n const pageSizeOptions = requestedPageSizes\n ? [...new Set(requestedPageSizes.map((value) => finiteAtLeast(value, 0, 1, true)).filter(Boolean))]\n : [10, 20, 50, 100];\n if (!pageSizeOptions.includes(pageSize)) pageSizeOptions.push(pageSize);\n pageSizeOptions.sort((a, b) => a - b);\n\n const resolved: ResolvedGridOptions<TData> = {\n columnDefs: Array.isArray(userOptions.columnDefs) ? userOptions.columnDefs : [],\n rowData: Array.isArray(userOptions.rowData) ? userOptions.rowData : [],\n defaultColDef: { ...DEFAULT_COL_DEF, ...(userOptions.defaultColDef ?? {}) },\n rowHeight: finiteAtLeast(userOptions.rowHeight, preset.rowHeight, 1),\n headerHeight: finiteAtLeast(userOptions.headerHeight, preset.headerHeight, 1),\n rowBuffer: finiteAtLeast(userOptions.rowBuffer, 8, 0, true),\n rowSelection: userOptions.rowSelection === \"single\" || userOptions.rowSelection === \"multiple\"\n ? userOptions.rowSelection\n : \"none\",\n multiSort: userOptions.multiSort ?? true,\n size,\n stripedRows: userOptions.stripedRows ?? false,\n showCellBorders: userOptions.showCellBorders ?? false,\n theme: userOptions.theme === \"light\" || userOptions.theme === \"dark\" || userOptions.theme === \"auto\"\n ? userOptions.theme\n : (userOptions.className?.includes(\"mach-theme-dark\") ? \"dark\" : \"light\"),\n quickFilterText: userOptions.quickFilterText ?? null,\n masterDetail: userOptions.masterDetail ?? false,\n detailRowHeight: finiteAtLeast(userOptions.detailRowHeight, 240, 1),\n detailToggleColumn: userOptions.detailToggleColumn ?? true,\n columnMenu: userOptions.columnMenu ?? false,\n columnStateKey: userOptions.columnStateKey ?? null,\n locale: userOptions.locale ?? {},\n singleClickEdit: userOptions.singleClickEdit ?? false,\n manualSorting: userOptions.manualSorting ?? false,\n manualFiltering: userOptions.manualFiltering ?? false,\n showSummary: userOptions.showSummary ?? false,\n treeData: userOptions.treeData ?? false,\n childrenKey: userOptions.childrenKey ?? \"children\",\n autoCheckedChildren: userOptions.autoCheckedChildren ?? true,\n defaultExpandAll: userOptions.defaultExpandAll ?? false,\n indexOffset: userOptions.indexOffset ?? 0,\n applyRowDrag: userOptions.applyRowDrag ?? true,\n undoStackSize: finiteAtLeast(userOptions.undoStackSize, 100, 0, true),\n pinnedTopRowData: Array.isArray(userOptions.pinnedTopRowData) ? userOptions.pinnedTopRowData : [],\n pinnedBottomRowData: Array.isArray(userOptions.pinnedBottomRowData) ? userOptions.pinnedBottomRowData : [],\n paginationEnabled:\n userOptions.pagination !== false && userOptions.datasource == null ? true : false,\n paginationPageSize: pageSize,\n paginationPageSizeOptions: pageSizeOptions,\n paginationShowTotal:\n typeof userOptions.pagination === \"object\"\n ? userOptions.pagination.showTotal !== false\n : true,\n paginationShowSizeSelector:\n typeof userOptions.pagination === \"object\"\n ? userOptions.pagination.showPageSizeSelector !== false\n : true,\n watermarkEnabled: userOptions.watermark != null && userOptions.watermark !== false,\n watermarkConfig:\n userOptions.watermark == null || userOptions.watermark === false\n ? null\n : userOptions.watermark === true\n ? { text: \"MachTable\" }\n : userOptions.watermark,\n suppressWarnings: userOptions.suppressWarnings ?? false,\n enableRangeSelection: userOptions.enableRangeSelection ?? false,\n suppressClipboard: userOptions.suppressClipboard ?? false,\n contextMenu: userOptions.contextMenu ?? false,\n tooltipShowDelay: finiteAtLeast(userOptions.tooltipShowDelay, 600, 0),\n flashCells: userOptions.flashCells ?? true,\n fillHandle: userOptions.fillHandle ?? true,\n statusBarEnabled: userOptions.statusBar === true || (typeof userOptions.statusBar === \"object\" && userOptions.statusBar != null),\n statusBarPanels:\n typeof userOptions.statusBar === \"object\" && userOptions.statusBar?.panels\n ? userOptions.statusBar.panels\n : [\"rowCount\", \"selectedRowCount\", \"rangeAggregate\"],\n blockSize: finiteAtLeast(userOptions.blockSize, 100, 1, true),\n infiniteBufferRows: finiteAtLeast(userOptions.infiniteBufferRows, 40, 0, true),\n suppressCellFocus: userOptions.suppressCellFocus ?? false,\n suppressRowHoverHighlight: userOptions.suppressRowHoverHighlight ?? false,\n suppressNoRowsOverlay: userOptions.suppressNoRowsOverlay ?? false,\n suppressHeaderFocus: userOptions.suppressHeaderFocus ?? false,\n loading: userOptions.loading ?? false,\n overlayNoRowsTemplate: userOptions.overlayNoRowsTemplate ?? \"\",\n overlayLoadingTemplate: userOptions.overlayLoadingTemplate ?? \"\",\n allowUnsafeOverlayHtml: userOptions.allowUnsafeOverlayHtml ?? false,\n className: userOptions.className ?? \"\",\n features: Array.isArray(userOptions.features) ? userOptions.features : []\n };\n\n if (userOptions.getRowId) resolved.getRowId = userOptions.getRowId;\n if (userOptions.detailRowRenderer) resolved.detailRowRenderer = userOptions.detailRowRenderer;\n if (userOptions.isRowExpandable) resolved.isRowExpandable = userOptions.isRowExpandable;\n if (userOptions.columnStateStore) resolved.columnStateStore = userOptions.columnStateStore;\n if (userOptions.aggFuncs) resolved.aggFuncs = userOptions.aggFuncs;\n if (userOptions.components) resolved.components = userOptions.components;\n if (userOptions.summaryMethod) resolved.summaryMethod = userOptions.summaryMethod;\n if (userOptions.datasource) resolved.datasource = userOptions.datasource;\n if (userOptions.getRowHeight) resolved.getRowHeight = userOptions.getRowHeight;\n if (userOptions.tooltipComponent) resolved.tooltipComponent = userOptions.tooltipComponent;\n if (userOptions.getContextMenuItems) resolved.getContextMenuItems = userOptions.getContextMenuItems;\n\n for (const key of Object.keys(userOptions) as (keyof GridOptions<TData>)[]) {\n if (key.startsWith(\"on\") && typeof userOptions[key] === \"function\") {\n Object.assign(resolved, { [key]: userOptions[key] });\n }\n }\n\n return resolved;\n}\n\nexport function mergeColDef<TData>(colDef: ColDef<TData>, defaults: Partial<ColDef<TData>>): ColDef<TData> {\n return { ...defaults, ...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 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 }\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","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 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?: (newValue: TValue, params: ValueSetterParams<TData, TValue>) => 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 type?: 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 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\nexport function clampWidth(w: number, input: WidthInput): number {\n const min = input.minWidth ?? DEFAULT_MIN_WIDTH;\n const max = input.maxWidth ?? Number.MAX_SAFE_INTEGER;\n return Math.max(min, Math.min(max, w));\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","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, 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\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));\n column.parentGroup = parent;\n column.level = level;\n const p = prev.get(uniqueId);\n if (p) {\n column.manualWidth = p.manualWidth;\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 centerInputs = this.center.map((c) => this.widthInputOf(c));\n const available = Math.max(0, viewportWidth - pinnedTotal);\n const widths = computeColumnWidths(centerInputs, available);\n this.center.forEach((c, i) => {\n c.currentWidth = widths[i];\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 { width: def.width, minWidth: def.minWidth, maxWidth: def.maxWidth, flex: def.flex };\n }\n\n setColumnWidth(column: Column, width: number): void {\n column.manualWidth = clampWidth(width, this.widthInputOf(column));\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 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) continue;\n if (s.hide != null) c.hide = s.hide;\n if (s.width != null) c.manualWidth = s.width;\n if (s.pinned !== undefined) c.pinned = s.pinned;\n }\n const nextSort: { colId: string; direction: SortDirection; sortIndex: number }[] = [];\n for (const s of states) {\n if (s.sort && this.columns.some((c) => c.id === s.colId)) {\n nextSort.push({ colId: s.colId, direction: s.sort, sortIndex: s.sortIndex ?? 0 });\n }\n }\n nextSort.sort((a, b) => a.sortIndex - b.sortIndex);\n this.sortModel = nextSort.map(({ colId, direction }) => ({ colId, direction }));\n this.applyStateOrder(states);\n this.regroup();\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.manualWidth = null;\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 { 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 as number)) 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\nexport function doesNodePassFilters(\n node: RowNode<any>,\n columns: Column[],\n filterModel: FilterModel,\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 (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 { RowTransaction } from \"../types/api\";\nimport { doesNodePassFilters } from \"./filterService\";\nimport { sortNodes } from \"./sortService\";\nimport { createAggResolver } from \"../lib/aggregate\";\nimport { defaultComparator } from \"../lib/compare\";\n\ntype ColumnLike = import(\"./column\").Column;\ntype RowModelContext = Pick<\n GridCore<any>,\n | \"bodyRenderer\"\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 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 infinitePendingResolve: (() => void) | null = null;\n private treeDepth = new WeakMap<RowNode<TData>, number>();\n private rowSequence = new WeakMap<RowNode<TData>, number>();\n\n constructor(private core: RowModelContext) {}\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 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 try {\n const request = datasource.getRows({\n startRow: start,\n endRow: stop,\n sortModel: this.core.columnModel.getSortModel(),\n filterModel: this.getFilterModel(),\n quickFilterText: this.quickFilter,\n signal: controller.signal,\n onSuccess: (rows, lastRow) => {\n if (settled) return;\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: (reason) => done(reason ?? new Error(\"Datasource request failed\"))\n });\n if (request && typeof (request as Promise<void>).catch === \"function\") {\n void (request as Promise<void>).catch(done);\n }\n } catch (error) {\n done(error);\n }\n });\n }\n\n private cancelInfiniteRequest(): void {\n this.infiniteSeq++;\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 }\n\n setRowData(rows: TData[] | null | undefined): void {\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 node: RowNode<TData> = { id, data, rowIndex: -1, selected: false };\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 const children = this.isTree ? readChildren(data, childrenKey) : undefined;\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 applyTransaction(transaction: RowTransaction<TData>): void {\n const getRowId = this.core.options.getRowId;\n const touched: RowNode<TData>[] = [];\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 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 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 this.refreshPipeline();\n for (const node of touched) {\n if (node.rowIndex >= 0) this.core.bodyRenderer.refreshRows([node.rowIndex]);\n }\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 child: RowNode<TData> = {\n id,\n data,\n rowIndex: -1,\n selected: false\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 const children = readChildren(data, this.core.options.childrenKey);\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 this.filterModel = filterModel ? { ...filterModel } : {};\n return JSON.stringify(this.filterModel) !== before;\n }\n\n getFilterModel(): FilterModel {\n return { ...this.filterModel };\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.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(node, columns, this.filterModel, this.quickFilter, getCellValue));\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 = Math.max(1, Math.ceil(this.pipelineRows.length / size));\n if (this.page > pageCount) this.page = pageCount;\n if (this.page < 1) this.page = 1;\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 return this.isInfinite ? this.getDisplayTotalCount() : this.pipelineRows.length;\n }\n\n getPageCount(): number {\n if (!this.paginationActive) return 1;\n return Math.max(1, Math.ceil(this.pipelineRows.length / 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.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.applyPagination();\n this.core.bodyRenderer.onDataChanged();\n this.emitPaginationChanged();\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 = 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(node, columns, this.filterModel, this.quickFilter, getCellValue);\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) return this.hasChildren(node.id);\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 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 || !this.isRowExpandable(node)) return expanded;\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 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 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","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 { clamp } from \"../lib/dom\";\n\ntype ResizeContext = Pick<\n GridCore<any>,\n \"columnModel\" | \"emit\" | \"persistColumnState\" | \"relayoutColumns\" | \"skeleton\"\n>;\n\nexport class ResizeService {\n private active: {\n column: Column;\n startX: number;\n startWidth: number;\n pointerId: number;\n handle: HTMLElement;\n } | null = null;\n private rafId = 0;\n private pendingWidth = 0;\n\n constructor(private core: ResizeContext) {}\n\n startResize(e: PointerEvent, column: Column): void {\n const handle = e.currentTarget as HTMLElement;\n const def = column.colDef;\n const startWidth = column.manualWidth ?? column.currentWidth;\n const minWidth = def.minWidth ?? 80;\n if (startWidth < minWidth && def.width == null) {\n column.manualWidth = startWidth;\n }\n this.active = { column, startX: e.clientX, startWidth: column.manualWidth ?? startWidth, pointerId: e.pointerId, handle };\n handle.setPointerCapture(e.pointerId);\n handle.addEventListener(\"pointermove\", this.onMove);\n handle.addEventListener(\"pointerup\", this.onUp);\n handle.addEventListener(\"pointercancel\", this.onUp);\n this.core.skeleton.root.classList.add(\"mach-root--resizing\");\n }\n\n private onMove = (e: PointerEvent): void => {\n const active = this.active;\n if (!active) return;\n const def = active.column.colDef;\n const min = def.minWidth ?? 80;\n const max = def.maxWidth ?? Number.MAX_SAFE_INTEGER;\n this.pendingWidth = clamp(active.startWidth + (e.clientX - active.startX), min, max);\n if (this.rafId) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = 0;\n const current = this.active;\n if (!current) return;\n this.core.columnModel.setColumnWidth(current.column, this.pendingWidth);\n this.core.relayoutColumns();\n this.core.emit(\"columnResized\", {\n colId: current.column.id,\n width: this.pendingWidth,\n finished: false\n });\n });\n };\n\n private onUp = (e: PointerEvent): void => {\n const active = this.active;\n if (!active) return;\n this.active = null;\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.core.columnModel.setColumnWidth(active.column, this.pendingWidth);\n this.core.relayoutColumns();\n }\n this.rafId = 0;\n active.handle.removeEventListener(\"pointermove\", this.onMove);\n active.handle.removeEventListener(\"pointerup\", this.onUp);\n active.handle.removeEventListener(\"pointercancel\", this.onUp);\n try {\n active.handle.releasePointerCapture(e.pointerId);\n } catch {\n void 0;\n }\n this.core.skeleton.root.classList.remove(\"mach-root--resizing\");\n this.core.emit(\"columnResized\", {\n colId: active.column.id,\n width: active.column.manualWidth ?? active.column.currentWidth,\n finished: true\n });\n this.core.persistColumnState();\n };\n\n destroy(): void {\n cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n if (this.active) {\n const active = this.active;\n this.active = null;\n active.handle.removeEventListener(\"pointermove\", this.onMove);\n active.handle.removeEventListener(\"pointerup\", this.onUp);\n active.handle.removeEventListener(\"pointercancel\", this.onUp);\n }\n this.core.skeleton.root?.classList.remove(\"mach-root--resizing\");\n }\n}\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\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()) return;\n if (this.core.editingService.isEditing()) return;\n\n if ((e.ctrlKey || e.metaKey) && (e.key === \"a\" || e.key === \"A\")) {\n if (this.core.options.rowSelection === \"multiple\") {\n e.preventDefault();\n this.core.selectionService.selectAll(true);\n }\n return;\n }\n\n if ((e.ctrlKey || e.metaKey) && !e.altKey) {\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;\n }\n if (key === \"y\") {\n e.preventDefault();\n this.core.undoService.redo();\n return;\n }\n }\n\n const navigationKeys = [\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 if (!navigationKeys.includes(e.key)) return;\n\n const body = this.core.bodyRenderer;\n const focus = body.focusedCell;\n\n if (e.key === \"Escape\") {\n if (this.core.options.enableRangeSelection && body.normalizedRange()) {\n e.preventDefault();\n body.clearRangeSelection();\n }\n return;\n }\n\n if (e.key === \"Delete\" || e.key === \"Backspace\") {\n if (this.core.options.enableRangeSelection) {\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 return;\n }\n }\n return;\n }\n\n if (!focus) {\n if (this.core.rowModel.getDisplayedRowCount() > 0) {\n const cols = this.core.columnModel.getOrderedVisible();\n if (cols.length > 0) {\n e.preventDefault();\n body.setFocusedCell(0, cols[0].id);\n }\n }\n return;\n }\n\n const cols = this.core.columnModel.getOrderedVisible();\n const colIdx = cols.findIndex((c) => c.id === focus.colId);\n if (colIdx < 0) return;\n const rowCount = this.core.rowModel.getDisplayedRowCount();\n if (rowCount === 0) return;\n\n const rangeMode = e.shiftKey && this.core.options.enableRangeSelection;\n\n let row = focus.rowIndex;\n let handled = true;\n let nextRow = row;\n let nextColIdx = colIdx;\n\n switch (e.key) {\n case \"ArrowUp\":\n nextRow = this.skipDetailRows(row - 1, -1);\n if (nextRow >= 0) row = nextRow;\n break;\n case \"ArrowDown\":\n nextRow = this.skipDetailRows(row + 1, 1);\n if (nextRow >= 0 && nextRow < rowCount) row = nextRow;\n break;\n case \"ArrowLeft\":\n nextColIdx = Math.max(0, colIdx - 1);\n break;\n case \"ArrowRight\":\n nextColIdx = Math.min(cols.length - 1, colIdx + 1);\n break;\n case \"Home\":\n nextColIdx = 0;\n if (e.ctrlKey) row = 0;\n break;\n case \"End\":\n nextColIdx = cols.length - 1;\n if (e.ctrlKey) row = Math.max(0, this.skipDetailRows(rowCount - 1, -1));\n break;\n case \"PageUp\":\n case \"PageDown\": {\n const viewport = this.core.skeleton.bodyViewports.center;\n const pageRows = Math.max(1, Math.floor(viewport.clientHeight / this.core.options.rowHeight));\n const target = e.key === \"PageUp\" ? row - pageRows : row + pageRows;\n const skipped = this.skipDetailRows(Math.max(0, Math.min(rowCount - 1, target)), e.key === \"PageUp\" ? -1 : 1);\n if (skipped >= 0) row = skipped;\n break;\n }\n case \"Enter\":\n case \"F2\": {\n const node = this.core.rowModel.getDisplayedRow(row);\n const column = cols[colIdx];\n if (node && !node.isDetail && column && this.core.editingService.isEditable(node, column)) {\n this.core.editingService.start(row, column, e.key === \"F2\" ? e.key : null);\n } else {\n const down = this.skipDetailRows(row + 1, 1);\n if (down >= 0 && down < rowCount) row = down;\n }\n break;\n }\n case \" \": {\n const node = this.core.rowModel.getDisplayedRow(row);\n if (node && !node.isDetail) {\n if (node.isGroup) {\n this.core.rowModel.toggleGroup(node.id);\n } else if (this.core.options.rowSelection !== \"none\") {\n this.core.selectionService.setNodeSelected(\n node,\n !node.selected,\n this.core.options.rowSelection === \"single\"\n );\n }\n }\n break;\n }\n case \"Tab\": {\n const next = this.nextEditable(row, focus.colId, e.shiftKey ? -1 : 1);\n if (next) {\n body.setFocusedCell(next.rowIndex, next.column.id);\n this.core.editingService.start(next.rowIndex, next.column);\n }\n break;\n }\n default:\n handled = false;\n }\n\n if (handled) e.preventDefault();\n\n if (rangeMode && (row !== focus.rowIndex || nextColIdx !== colIdx)) {\n body.moveRangeEnd(row, nextColIdx);\n return;\n }\n\n if (row !== focus.rowIndex || cols[colIdx].id !== focus.colId) {\n body.setFocusedCell(row, cols[colIdx].id);\n }\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 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 type { CellClassParams, CellRendererParams, ICellRendererResult } 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 if (!destroy) return;\n try {\n destroy();\n } catch (error) {\n core.reportError(error, \"cellRenderer.destroy\", { colId: cell.dataset.colId });\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 cleanupCellContent(core, cell);\n\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 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 as ICellRendererResult).el instanceof HTMLElement) {\n const result = out as ICellRendererResult;\n cell.replaceChildren(result.el);\n if (result.destroy) getCellRuntimeState(cell).destroy = result.destroy;\n } else {\n cell.textContent = \"\";\n }\n } else {\n cell.textContent = formatted;\n }\n\n let tooltip = formatted;\n if (core.options.tooltipComponent) tooltip = \"\";\n const tooltipGetter = column.colDef.tooltipValueGetter;\n if (tooltipGetter) {\n try {\n const out = tooltipGetter({\n api: core.getApi(),\n colDef: column.colDef,\n column,\n node,\n data: node.data,\n value\n });\n tooltip = out ?? formatted;\n } catch (error) {\n core.reportError(error, \"tooltipValueGetter\", { colId: column.id, rowId: node.id });\n }\n }\n if (tooltip) {\n if (cell.getAttribute(\"title\") !== tooltip) cell.setAttribute(\"title\", tooltip);\n } else if (cell.hasAttribute(\"title\")) {\n cell.removeAttribute(\"title\");\n }\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 defType = column.colDef.type;\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 (defType === \"rightAligned\" || defType === \"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 | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"keyboardService\"\n | \"reportError\"\n | \"resolveCellEditor\"\n | \"rowModel\"\n | \"setCellValue\"\n>;\n\ninterface EditingState {\n node: RowNode<any>;\n column: Column;\n editor: ICellEditor;\n rowIndex: number;\n oldValue: any;\n}\n\nexport class EditingService {\n private editing: EditingState | null = null;\n\n constructor(private core: EditingContext) {}\n\n isEditing(rowIndex?: number, colId?: string): boolean {\n if (!this.editing) return false;\n if (rowIndex == null && colId == null) return true;\n return this.editing.rowIndex === rowIndex && this.editing.column.id === colId;\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.editing) this.stop(false);\n const node = this.core.rowModel.getDisplayedRow(rowIndex);\n if (!node || node.data == null) return false;\n if (!this.isEditable(node, column)) return false;\n const cell = this.core.bodyRenderer.getCellElement(rowIndex, column.id);\n if (!cell) return false;\n\n const value = this.core.getCellValue(node, column);\n const def = column.colDef;\n let editor: ICellEditor;\n const ce = def.cellEditor;\n try {\n if (typeof ce === \"function\") {\n editor = ce({\n api: this.core.getApi(),\n colDef: def,\n column,\n node,\n data: node.data,\n value,\n rowIndex,\n keyPress\n });\n } else if (typeof ce === \"string\" && ![\"text\", \"number\", \"date\", \"select\"].includes(ce)) {\n const factory = this.core.resolveCellEditor(ce);\n if (factory) {\n editor = factory({\n api: this.core.getApi(),\n colDef: def,\n column,\n node,\n data: node.data,\n value,\n rowIndex,\n keyPress\n });\n } else {\n editor = createEditor(column, value, keyPress);\n }\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 false;\n }\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 false;\n }\n\n try {\n if (editor.isCancelBeforeStart?.()) {\n editor.destroy?.();\n return false;\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 false;\n }\n\n cleanupCellContent(this.core, cell);\n\n cell.textContent = \"\";\n cell.classList.add(\"mach-cell--editing\");\n cell.appendChild(editor.el);\n this.editing = { node, column, editor, rowIndex, oldValue: value };\n\n editor.el.addEventListener(\"keydown\", this.onEditorKeyDown);\n editor.el.addEventListener(\"focusout\", this.onEditorBlur);\n try {\n editor.focus?.();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.focus\", { colId: column.id, rowId: node.id });\n }\n\n this.core.emit(\"cellEditingStarted\", { rowIndex, colId: column.id, rowNode: node });\n return true;\n }\n\n stop(cancel = false): void {\n const editing = this.editing;\n if (!editing) return;\n this.editing = null;\n\n let newValue: any;\n let changed = false;\n if (!cancel) {\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 cancel = true;\n }\n let cancelAfterEnd = cancel;\n if (!cancelAfterEnd) {\n try {\n cancelAfterEnd = editing.editor.isCancelAfterEnd?.(newValue) ?? false;\n } catch (error) {\n this.core.reportError(error, \"cellEditor.isCancelAfterEnd\", { colId: editing.column.id, rowId: editing.node.id });\n cancelAfterEnd = true;\n }\n }\n if (!cancelAfterEnd) {\n const validationError = this.validateValue(editing, newValue);\n if (typeof validationError === \"string\") {\n this.editing = editing;\n this.showError(editing, validationError);\n return;\n }\n changed = this.applyValue(editing, newValue);\n }\n }\n\n editing.editor.el.removeEventListener(\"keydown\", this.onEditorKeyDown);\n editing.editor.el.removeEventListener(\"focusout\", this.onEditorBlur);\n try {\n editing.editor.destroy?.();\n } catch (error) {\n this.core.reportError(error, \"cellEditor.destroy\", { colId: editing.column.id, rowId: editing.node.id });\n }\n\n const cell = this.core.bodyRenderer.getCellElement(editing.rowIndex, editing.column.id);\n if (cell) {\n cell.classList.remove(\"mach-cell--editing\");\n cell.classList.remove(\"mach-cell--error\");\n }\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\n if (editing.node.rowIndex >= 0) {\n this.core.bodyRenderer.refreshRows([editing.node.rowIndex]);\n }\n }\n\n private validateValue(editing: EditingState, newValue: any): string | true | null | undefined {\n const validate = editing.column.colDef.validate;\n if (!validate) return true;\n try {\n return validate(newValue, {\n oldValue: editing.oldValue,\n newValue,\n data: editing.node.data!,\n node: editing.node,\n colDef: editing.column.colDef,\n column: editing.column,\n api: this.core.getApi()\n });\n } catch (error) {\n this.core.reportError(error, \"validate\", { colId: editing.column.id, rowId: editing.node.id });\n return \"Validation failed\";\n }\n }\n\n private showError(editing: EditingState, message: string): void {\n const editorEl = editing.editor.el as HTMLElement;\n editorEl.classList.add(\"mach-editor-invalid\");\n editorEl.setAttribute(\"title\", message);\n editorEl.setAttribute(\"aria-invalid\", \"true\");\n const input = editorEl.querySelector(\"input, select\") ?? 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 applyValue(editing: EditingState, newValue: any): boolean {\n if (newValue === undefined) return false;\n return this.core.setCellValue(editing.node, editing.column, newValue, editing.oldValue);\n }\n\n private onEditorKeyDown = (e: KeyboardEvent): void => {\n if (!this.editing) return;\n if (e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n this.stop(false);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n this.stop(true);\n } else if (e.key === \"Tab\") {\n e.preventDefault();\n e.stopPropagation();\n const current = this.editing;\n const next = this.core.keyboardService.nextEditable(current.rowIndex, current.column.id, e.shiftKey ? -1 : 1);\n this.stop(false);\n if (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 private onEditorBlur = (): void => {\n window.setTimeout(() => {\n if (this.editing) this.stop(false);\n }, 0);\n };\n\n destroy(): void {\n if (this.editing) this.stop(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} 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};\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\" as RgLocaleKey);\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 \"blank\" | \"notBlank\" }] } 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\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 as unknown as Column, 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\", \"menu\");\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 const list = el(\"div\", \"mach-column-panel-list\");\n for (const col of this.core.columnModel.getColumns()) {\n if (col.isDetailToggle) continue;\n const label = el(\"label\", \"mach-filter-set-item\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.checked = !col.hide;\n cb.disabled = col.hasCheckbox;\n cb.addEventListener(\"change\", () => {\n api.setColumnVisibility(col.id, cb.checked);\n this.rebuildListStates();\n });\n const span = el(\"span\");\n span.textContent = col.colDef.headerName ?? col.colDef.field ?? col.id;\n label.append(cb, span);\n list.appendChild(label);\n }\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 items = this.panel.querySelectorAll<HTMLLabelElement>(\".mach-column-panel-list .mach-filter-set-item\");\n const cols = this.core.columnModel.getColumns().filter((c) => !c.isDetailToggle);\n items.forEach((item, i) => {\n const col = cols[i];\n if (!col) return;\n const cb = item.querySelector<HTMLInputElement>(\"input\");\n if (cb && !cb.disabled) cb.checked = !col.hide;\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)) as unknown as number;\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 { ColDef } from \"./colDef\";\nimport type { FilterModel, SortModel } from \"./colDef\";\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 \"detailToggled\",\n \"rowDragEnd\",\n \"rangeSelectionChanged\",\n \"paginationChanged\",\n \"displayedColumnsChanged\",\n \"gridError\"\n] as const;\n\nexport type GridEventType = (typeof EVENT_TYPES)[number];\n\nexport interface GridEventBase {\n type: GridEventType;\n api: GridApi<any>;\n}\n\nexport interface GridReadyEvent extends GridEventBase {\n type: \"gridReady\";\n}\n\nexport interface GridDestroyedEvent extends GridEventBase {\n type: \"gridDestroyed\";\n}\n\nexport interface ModelUpdatedEvent extends GridEventBase {\n type: \"modelUpdated\";\n rowCount: number;\n}\n\nexport interface CellClickEvent<TData = any, TValue = any> extends GridEventBase {\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 {\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 {\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 {\n type: \"rowClicked\" | \"rowDoubleClicked\";\n event: MouseEvent;\n rowNode: RowNode<TData>;\n rowIndex: number;\n}\n\nexport interface SelectionChangedEvent<TData = any> extends GridEventBase {\n type: \"selectionChanged\";\n selectedNodes: RowNode<TData>[];\n selectedRows: TData[];\n}\n\nexport interface SortChangedEvent extends GridEventBase {\n type: \"sortChanged\";\n sortModel: SortModel;\n}\n\nexport interface FilterChangedEvent extends GridEventBase {\n type: \"filterChanged\";\n filterModel: FilterModel;\n}\n\nexport interface ColumnResizedEvent extends GridEventBase {\n type: \"columnResized\";\n colId: string;\n width: number;\n finished: boolean;\n}\n\nexport interface ColumnMovedEvent extends GridEventBase {\n type: \"columnMoved\";\n colId: string;\n toIndex: number;\n}\n\nexport interface ColumnVisibilityChangedEvent extends GridEventBase {\n type: \"columnVisibilityChanged\";\n colId: string;\n visible: boolean;\n}\n\nexport interface CellValueChangedEvent<TData = any, TValue = any> extends GridEventBase {\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 {\n type: \"cellEditingStarted\";\n rowIndex: number;\n colId: string;\n rowNode: RowNode<TData>;\n}\n\nexport interface CellEditingStoppedEvent<TData = any> extends GridEventBase {\n type: \"cellEditingStopped\";\n rowIndex: number;\n colId: string;\n rowNode: RowNode<TData>;\n oldValue: any;\n newValue: any;\n}\n\nexport interface DetailToggledEvent<TData = any> extends GridEventBase {\n type: \"detailToggled\";\n rowId: string;\n rowNode: RowNode<TData>;\n expanded: boolean;\n}\n\nexport interface GridCellRange {\n row1: number;\n row2: number;\n colId1: string;\n colId2: string;\n}\n\nexport interface RangeSelectionChangedEvent extends GridEventBase {\n type: \"rangeSelectionChanged\";\n range: GridCellRange | null;\n}\n\nexport interface RowDragEndEvent<TData = any> extends GridEventBase {\n type: \"rowDragEnd\";\n rowNode: RowNode<TData>;\n fromIndex: number;\n toIndex: number;\n}\n\nexport interface PaginationChangedEvent extends GridEventBase {\n type: \"paginationChanged\";\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface DisplayedColumnsChangedEvent extends GridEventBase {\n type: \"displayedColumnsChanged\";\n}\n\nexport interface GridErrorEvent extends GridEventBase {\n type: \"gridError\";\n error: unknown;\n source: string;\n context?: Record<string, unknown>;\n}\n\nexport interface GridEventMap<TData = any> {\n gridReady: GridReadyEvent;\n gridDestroyed: GridDestroyedEvent;\n modelUpdated: ModelUpdatedEvent;\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;\n filterChanged: FilterChangedEvent;\n columnResized: ColumnResizedEvent;\n columnMoved: ColumnMovedEvent;\n columnVisibilityChanged: ColumnVisibilityChangedEvent;\n cellValueChanged: CellValueChangedEvent<TData>;\n cellEditingStarted: CellEditingStartedEvent<TData>;\n cellEditingStopped: CellEditingStoppedEvent<TData>;\n detailToggled: DetailToggledEvent<TData>;\n rowDragEnd: RowDragEndEvent<TData>;\n rangeSelectionChanged: RangeSelectionChangedEvent;\n paginationChanged: PaginationChangedEvent;\n displayedColumnsChanged: DisplayedColumnsChangedEvent;\n gridError: GridErrorEvent;\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, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\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","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 { GridCore } from \"../core/gridCore\";\nimport type { CsvExportParams, RowTransaction } from \"../types/api\";\nimport type { GridApi, } from \"../types/api\";\nimport type { GridOptions } from \"../types/options\";\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 } 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\";\n\nexport class GridApiImpl<TData = any> implements GridApi<TData> {\n private measureCanvas: HTMLCanvasElement | null = null;\n\n constructor(private core: GridCore<TData>) {}\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 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 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 for (const col of cols) {\n this.core.columnModel.setColumnWidth(col, Math.max(30, Math.floor((col.currentWidth * target) / total)));\n }\n this.core.relayoutColumns();\n this.core.persistColumnState();\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.persistColumnState();\n }\n }\n\n private autoSizeColumnInternal(\n column: Column<TData>,\n skipHeader: boolean\n ): boolean {\n\n if (column.hasCheckbox || column.isDetailToggle) {\n this.core.columnModel.setColumnWidth(column, column.isDetailToggle ? 38 : 46);\n return true;\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 this.core.columnModel.setColumnWidth(column, Math.ceil(maxWidth) + extra);\n return true;\n }\n\n autoSizeAllColumns(skipHeader?: boolean): void {\n if (this.core.isDestroyed()) return;\n let changed = false;\n for (const col of this.core.columnModel.getOrderedVisible()) {\n changed = this.autoSizeColumnInternal(col, skipHeader ?? false) || changed;\n }\n if (changed) {\n this.core.relayoutColumns();\n this.core.persistColumnState();\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.core.emit(\"filterChanged\", { filterModel: this.core.rowModel.getFilterModel() });\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 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 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 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 if (this.core.isDestroyed()) return;\n this.core.columnMenu.openStandalone(anchor);\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: import(\"../types/api\").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 cols = this.core.columnModel.getOrderedVisible().filter((c) => c.colDef.field);\n const byHeader = new Map<string, string>();\n for (const col of cols) {\n byHeader.set(String(col.colDef.headerName ?? col.colDef.field ?? col.id), col.colDef.field!);\n if (col.colDef.field) byHeader.set(col.colDef.field, col.colDef.field);\n }\n if (headerRow.length > 0) headerRow[0] = headerRow[0].replace(/^\\uFEFF/, \"\");\n let fieldOrder = 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\n if (fieldOrder.length === 0) {\n fieldOrder = cols.map((col, index) => ({ field: col.colDef.field!, index }));\n }\n\n const records = body.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 let value: any;\n if (options.parseValue) {\n try {\n value = options.parseValue({ value: raw, field, rowIndex, columnIndex: index });\n } catch (error) {\n this.core.reportError(error, \"csv.parseValue\", { field, rowIndex, columnIndex: index });\n value = raw;\n }\n } else if (raw === \"\") {\n value = null;\n } else if (\n options.coerceNumbers !== false &&\n /^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(raw) &&\n !/^[+-]?0\\d/.test(raw)\n ) {\n value = Number(raw);\n } else {\n value = raw;\n }\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 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 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 stopEditing(cancel?: boolean): void {\n this.core.editingService.stop(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 updateOptions(options: Partial<GridOptions<TData>>): void {\n if (this.core.isDestroyed()) return;\n const resolved = this.core.options;\n let needsRelayout = false;\n let needsCellRefresh = false;\n let needsHeaderRebuild = false;\n let needsPoolRebuild = false;\n let needsSummaryRefresh = false;\n let needsColumnRebuild = false;\n let needsRowRebuild = false;\n let needsStateLoad = false;\n let datasourceChanged = false;\n const prevColumnMenu = resolved.columnMenu;\n const prevUndoSize = resolved.undoStackSize;\n\n for (const eventType of EVENT_TYPES) {\n const key = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}` as keyof GridOptions<TData>;\n if (Object.prototype.hasOwnProperty.call(options, key)) {\n Object.assign(resolved, { [key]: options[key] });\n }\n }\n\n if (options.rowHeight != null && Number.isFinite(options.rowHeight) && options.rowHeight > 0 && options.rowHeight !== resolved.rowHeight) {\n resolved.rowHeight = options.rowHeight;\n needsRelayout = true;\n }\n if (options.headerHeight != null && Number.isFinite(options.headerHeight) && options.headerHeight > 0 && options.headerHeight !== resolved.headerHeight) {\n resolved.headerHeight = options.headerHeight;\n needsRelayout = true;\n needsHeaderRebuild = true;\n }\n if (options.rowBuffer != null && Number.isFinite(options.rowBuffer) && options.rowBuffer >= 0 && options.rowBuffer !== resolved.rowBuffer) {\n resolved.rowBuffer = Math.floor(options.rowBuffer);\n needsRelayout = true;\n }\n if (options.multiSort != null) resolved.multiSort = options.multiSort;\n if (options.detailRowHeight != null && Number.isFinite(options.detailRowHeight) && options.detailRowHeight > 0 && options.detailRowHeight !== resolved.detailRowHeight) {\n resolved.detailRowHeight = options.detailRowHeight;\n this.core.bodyRenderer.applyContainerSizes();\n this.core.bodyRenderer.updateRange(true);\n }\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 if (options.locale != null && options.locale !== resolved.locale) {\n resolved.locale = options.locale;\n needsHeaderRebuild = true;\n 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 needsCellRefresh = true;\n }\n if (options.showSummary != null && options.showSummary !== resolved.showSummary) {\n resolved.showSummary = options.showSummary;\n needsSummaryRefresh = true;\n needsRelayout = true;\n }\n if (options.undoStackSize != null && Number.isFinite(options.undoStackSize) && options.undoStackSize >= 0 && options.undoStackSize !== prevUndoSize) {\n resolved.undoStackSize = Math.floor(options.undoStackSize);\n this.core.undoService.trimToSize();\n }\n if (Object.prototype.hasOwnProperty.call(options, \"getRowHeight\")) {\n const changed = resolved.getRowHeight !== options.getRowHeight;\n resolved.getRowHeight = options.getRowHeight;\n if (changed) this.core.bodyRenderer.invalidateAllRowHeights();\n needsRelayout = true;\n }\n if (options.enableRangeSelection != null) {\n resolved.enableRangeSelection = options.enableRangeSelection;\n if (!options.enableRangeSelection) this.clearRangeSelection();\n }\n if (Object.prototype.hasOwnProperty.call(options, \"tooltipComponent\")) resolved.tooltipComponent = options.tooltipComponent;\n if (options.tooltipShowDelay != null && Number.isFinite(options.tooltipShowDelay) && options.tooltipShowDelay >= 0) {\n resolved.tooltipShowDelay = options.tooltipShowDelay;\n }\n if (options.flashCells != null) resolved.flashCells = options.flashCells;\n if (Object.prototype.hasOwnProperty.call(options, \"getContextMenuItems\")) resolved.getContextMenuItems = options.getContextMenuItems;\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 if (options.pagination !== undefined) {\n const cfg = options.pagination;\n const target = cfg !== false && resolved.datasource == null;\n if (target !== resolved.paginationEnabled) {\n this.core.rowModel.setPaginationEnabled(target);\n }\n if (typeof cfg === \"object\" && cfg) {\n if (cfg.pageSize != null) resolved.paginationPageSize = cfg.pageSize;\n if (cfg.pageSizeOptions != null) resolved.paginationPageSizeOptions = cfg.pageSizeOptions;\n if (cfg.showTotal != null) resolved.paginationShowTotal = cfg.showTotal;\n if (cfg.showPageSizeSelector != null) resolved.paginationShowSizeSelector = cfg.showPageSizeSelector;\n }\n if (resolved.paginationEnabled) {\n this.core.rowModel.onPaginationOptionsChanged();\n }\n this.core.paginationBar.rebuild();\n }\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 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 if (Object.prototype.hasOwnProperty.call(options, \"summaryMethod\")) {\n resolved.summaryMethod = options.summaryMethod;\n needsSummaryRefresh = true;\n }\n if (options.size != null && Object.prototype.hasOwnProperty.call(GRID_SIZE_PRESETS, options.size) && options.size !== resolved.size) {\n const preset = GRID_SIZE_PRESETS[options.size];\n resolved.size = options.size;\n resolved.rowHeight = options.rowHeight ?? preset.rowHeight;\n resolved.headerHeight = options.headerHeight ?? preset.headerHeight;\n this.core.skeleton.applySize(options.size);\n needsRelayout = true;\n needsHeaderRebuild = true;\n }\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 if (options.suppressCellFocus != null) resolved.suppressCellFocus = options.suppressCellFocus;\n if (options.suppressRowHoverHighlight != null) resolved.suppressRowHoverHighlight = options.suppressRowHoverHighlight;\n if (options.suppressNoRowsOverlay != null) resolved.suppressNoRowsOverlay = options.suppressNoRowsOverlay;\n if (options.suppressHeaderFocus != null && options.suppressHeaderFocus !== resolved.suppressHeaderFocus) {\n resolved.suppressHeaderFocus = options.suppressHeaderFocus;\n needsHeaderRebuild = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"overlayNoRowsTemplate\")) {\n resolved.overlayNoRowsTemplate = options.overlayNoRowsTemplate ?? \"\";\n }\n if (Object.prototype.hasOwnProperty.call(options, \"overlayLoadingTemplate\")) {\n resolved.overlayLoadingTemplate = options.overlayLoadingTemplate ?? \"\";\n }\n if (options.allowUnsafeOverlayHtml != null) {\n resolved.allowUnsafeOverlayHtml = options.allowUnsafeOverlayHtml;\n }\n if (Object.prototype.hasOwnProperty.call(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 (options.rowSelection != null && options.rowSelection !== resolved.rowSelection) {\n resolved.rowSelection = options.rowSelection;\n if (options.rowSelection === \"none\") this.deselectAll();\n needsHeaderRebuild = true;\n needsPoolRebuild = true;\n }\n if (options.quickFilterText !== undefined) {\n this.setQuickFilter(options.quickFilterText);\n }\n if (options.defaultColDef !== undefined && options.defaultColDef !== resolved.defaultColDef) {\n resolved.defaultColDef = { ...DEFAULT_COL_DEF, ...options.defaultColDef };\n needsColumnRebuild = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"getRowId\") && options.getRowId !== resolved.getRowId) {\n resolved.getRowId = options.getRowId;\n needsRowRebuild = true;\n }\n if (options.masterDetail != null && options.masterDetail !== resolved.masterDetail) {\n resolved.masterDetail = options.masterDetail;\n needsColumnRebuild = true;\n needsRowRebuild = true;\n }\n if (options.detailToggleColumn != null && options.detailToggleColumn !== resolved.detailToggleColumn) {\n resolved.detailToggleColumn = options.detailToggleColumn;\n needsColumnRebuild = true;\n }\n if (options.treeData != null && options.treeData !== resolved.treeData) {\n resolved.treeData = options.treeData;\n needsRowRebuild = true;\n needsColumnRebuild = true;\n }\n if (options.childrenKey != null && options.childrenKey !== resolved.childrenKey) {\n resolved.childrenKey = options.childrenKey;\n needsRowRebuild = true;\n }\n if (options.autoCheckedChildren != null) resolved.autoCheckedChildren = options.autoCheckedChildren;\n if (options.defaultExpandAll != null && options.defaultExpandAll !== resolved.defaultExpandAll) {\n resolved.defaultExpandAll = options.defaultExpandAll;\n needsRowRebuild = true;\n }\n if (options.applyRowDrag != null) resolved.applyRowDrag = options.applyRowDrag;\n if (options.suppressWarnings != null) resolved.suppressWarnings = options.suppressWarnings;\n if (Object.prototype.hasOwnProperty.call(options, \"aggFuncs\")) {\n resolved.aggFuncs = options.aggFuncs;\n needsRowRebuild = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"components\")) {\n resolved.components = options.components;\n needsCellRefresh = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"features\")) {\n resolved.features = Array.isArray(options.features) ? options.features : [];\n this.core.setFeatures(resolved.features);\n }\n if (Object.prototype.hasOwnProperty.call(options, \"columnStateStore\")) {\n resolved.columnStateStore = options.columnStateStore;\n needsStateLoad = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"columnStateKey\")) {\n resolved.columnStateKey = options.columnStateKey ?? null;\n needsStateLoad = true;\n }\n if (options.blockSize != null && Number.isFinite(options.blockSize) && options.blockSize > 0) {\n resolved.blockSize = Math.floor(options.blockSize);\n }\n if (options.infiniteBufferRows != null && Number.isFinite(options.infiniteBufferRows) && options.infiniteBufferRows >= 0) {\n resolved.infiniteBufferRows = Math.floor(options.infiniteBufferRows);\n }\n if (Object.prototype.hasOwnProperty.call(options, \"datasource\") && options.datasource !== resolved.datasource) {\n resolved.datasource = options.datasource;\n resolved.paginationEnabled = options.datasource == null && resolved.paginationEnabled;\n datasourceChanged = true;\n this.core.paginationBar.rebuild();\n }\n if (Object.prototype.hasOwnProperty.call(options, \"detailRowRenderer\")) {\n resolved.detailRowRenderer = options.detailRowRenderer;\n needsCellRefresh = true;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"isRowExpandable\")) {\n resolved.isRowExpandable = options.isRowExpandable;\n needsCellRefresh = true;\n }\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 if (needsColumnRebuild) {\n this.core.columnModel.setColumnDefs(resolved.columnDefs);\n this.core.onColumnsStructureChanged();\n needsHeaderRebuild = false;\n needsPoolRebuild = false;\n }\n if (needsStateLoad) {\n this.core.loadPersistedColumnState();\n this.core.onColumnsStructureChanged();\n }\n if (datasourceChanged) {\n void this.core.rowModel.onDatasourceChanged();\n } else if (needsRowRebuild) {\n if (this.core.rowModel.isInfinite) void this.core.rowModel.onServerParamsChanged();\n else {\n this.core.rowModel.setRowData(resolved.rowData);\n this.core.bodyRenderer.onDataChanged();\n }\n }\n\n if (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 !== prevColumnMenu) {\n needsHeaderRebuild = true;\n }\n if (needsHeaderRebuild) this.core.headerRenderer.build();\n if (needsPoolRebuild) this.core.bodyRenderer.rebuildPool();\n else if (needsCellRefresh) this.refreshCells();\n if (needsSummaryRefresh) this.core.summaryRenderer.refresh();\n this.core.bodyRenderer.refreshOverlays();\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 setOverlay(type: \"loading\" | \"noRows\" | 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 {\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 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\" | null = null;\n private currentOverlayContent: OverlayTemplate | null = null;\n private currentOverlayAllowsHtml = false;\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 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\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 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 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 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\", 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.overlayContent.replaceChildren();\n\n let resolved: string | HTMLElement;\n try {\n resolved = typeof content === \"function\" ? content() : content;\n } catch (error) {\n this.core.reportError(error, \"overlayTemplate\");\n resolved = \"\";\n }\n\n 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.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.overlayContent.replaceChildren();\n this.root.setAttribute(\"aria-busy\", \"false\");\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.root.remove();\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 | \"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 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 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 = 0;\n cellEl.addEventListener(\"mousedown\", () => cellEl.focus({ preventScroll: true }));\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 (column.resizable) {\n const resizeEl = el(\"div\", \"mach-header-resize\");\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.emit(\"columnResized\", { colId: column.id, width: column.currentWidth, finished: true });\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 (!column.resizable) 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 }\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 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 | \"columnModel\"\n | \"contextMenuService\"\n | \"editingService\"\n | \"emit\"\n | \"getApi\"\n | \"getCellValue\"\n | \"gridId\"\n | \"isDestroyed\"\n | \"options\"\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 detailRow?: HTMLElement;\n}\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] ?? []) cleanupCellContent(this.core, cell);\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\n sk.root.setAttribute(\"aria-rowcount\", String(rowCount + 1));\n }\n\n invalidateRowHeight(node: RowNode<any>): void {\n this.rowHeightCache.delete(node);\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 = visible + this.core.options.rowBuffer * 2 + 1;\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: {} };\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 const cells: HTMLElement[] = [];\n for (const col of cols) {\n const cell = el(\"div\", \"mach-cell\");\n cell.dataset.colId = col.id;\n cell.setAttribute(\"role\", \"gridcell\");\n if (col.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 row.appendChild(cell);\n cells.push(cell);\n }\n sk.rowContainers[pane].appendChild(row);\n slot.rows[pane] = row;\n slot.cells[pane] = cells;\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 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 let globalColOffset = 0;\n for (const pane of PANES) {\n const cols = this.core.columnModel.getPaneColumns(pane);\n let x = 0;\n const lefts: number[] = [];\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(globalColOffset + i + 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 globalColOffset += cols.length;\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 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\n if (rowCount === 0) {\n for (const slot of this.pool) this.hideSlot(slot);\n this.first = 0;\n this.lastExcl = 0;\n return;\n }\n\n const scrollTop = viewport.scrollTop;\n const viewBottom = scrollTop + viewport.clientHeight;\n const firstVisible = lowerBound(this.positions, scrollTop, rowCount);\n let lastVisible = lowerBound(this.positions, viewBottom, rowCount) + 1;\n if (lastVisible > rowCount) lastVisible = rowCount;\n\n const first = clamp(firstVisible - buffer, 0, rowCount - 1);\n const lastExcl = clamp(lastVisible + buffer, 1, rowCount);\n\n if (!force && first === this.first && lastExcl === this.lastExcl) return;\n this.first = first;\n this.lastExcl = lastExcl;\n\n for (const slot of this.pool) {\n if (slot.index !== -1 && (slot.index < first || slot.index >= lastExcl)) {\n this.hideSlot(slot);\n }\n }\n\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 (colWindowChanged && slot.kind === \"master\") {\n this.renderPaneCells(slot, node, \"center\");\n }\n continue;\n }\n this.assignSlot(slot, i);\n }\n }\n\n private hideSlot(slot: RowSlot): void {\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 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 + 2));\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 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 + 2));\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\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.core.columnModel.getPaneColumns(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\n for (let i = 0; i < cols.length; i++) {\n const col = cols[i];\n const cell = cells[i];\n\n if (pane === \"center\") {\n const windowHidden = i < this.colFirst || i >= this.colLastExcl;\n if (windowHidden && !hasColSpan) {\n cleanupCellContent(this.core, cell);\n if (cell.style.display !== \"none\") cell.style.display = \"none\";\n continue;\n }\n }\n\n if (hasColSpan && coverage > 0) {\n coverage--;\n cleanupCellContent(this.core, cell);\n if (cell.style.display !== \"none\") cell.style.display = \"none\";\n continue;\n }\n\n if (cell.style.display === \"none\") cell.style.display = \"\";\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 if (cell.style.width !== `${col.currentWidth}px`) {\n cell.style.width = `${col.currentWidth}px`;\n }\n }\n\n if (this.core.editingService.isEditing(index, col.id)) 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 }\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 cleanupCellContent(this.core, cell);\n if (node.isGroup) {\n this.renderGroupCell(cell, node, column);\n return;\n }\n if (column.isDetailToggle) {\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 return;\n }\n if (column.hasCheckbox) {\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 return;\n }\n if (column.colDef.rowDrag) {\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 return;\n }\n if (column.colDef.type === \"index\" && !node.isDetail) {\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 return;\n }\n if (this.core.rowModel.isTree && this.getTreeColumn()?.id === column.id) {\n this.renderTreeCell(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 }\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 && c.colDef.type !== \"index\"\n ) ?? null;\n return this.treeColumnCache;\n }\n\n private renderTreeCell(cell: HTMLElement, node: RowNode<any>, column: Column): void {\n const hasChildren = this.core.rowModel.hasChildren(node.id);\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 (hasChildren) {\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 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 }\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 return;\n }\n if (cell.style.display === \"none\") cell.style.display = \"\";\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 } 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 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.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.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 (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 cols = this.core.columnModel.getPaneColumns(pane);\n const colIdx = cols.indexOf(column);\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 as unknown as MouseEvent);\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) cell.classList.add(\"mach-cell--focus\");\n }\n\n private clearFocusClass(): void {\n if (!this.focusedCell) return;\n const cell = this.getCellElement(this.focusedCell.rowIndex, this.focusedCell.colId);\n if (cell) cell.classList.remove(\"mach-cell--focus\");\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.core.rowModel.isTree) {\n const treeCol = this.getTreeColumn();\n if (treeCol && cellEl?.dataset.colId === treeCol.id && target.closest(\".mach-detail-toggle\")) {\n if (this.core.rowModel.hasChildren(node.id)) {\n this.focusGridRoot();\n this.core.rowModel.toggleDetail(node.id);\n return;\n }\n }\n }\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 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.isEditing()) {\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 as unknown as MouseEvent);\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\") } as Record<PaneType, HTMLElement>,\n centerViewport: el(\"div\", \"mach-pinned-viewport\"),\n rowWrappers: { left: [], center: [], right: [] } as Record<PaneType, HTMLElement[]>,\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\";\n\nexport function saveColumnState(key: string, state: ColumnState[]): void {\n try {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(`mach-table:col-state:${key}`, JSON.stringify(state));\n } catch {\n void 0;\n }\n}\n\nexport function loadColumnState(key: string): ColumnState[] | null {\n try {\n if (typeof localStorage === \"undefined\") return null;\n const raw = localStorage.getItem(`mach-table:col-state:${key}`);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return null;\n return parsed.filter(\n (s): s is ColumnState => s != null && typeof s === \"object\" && typeof s.colId === \"string\"\n );\n } catch {\n return null;\n }\n}\n\nexport function clearColumnState(key: string): void {\n try {\n if (typeof localStorage === \"undefined\") return;\n localStorage.removeItem(`mach-table:col-state:${key}`);\n } catch {\n void 0;\n }\n}\n","import type { CellRendererParams } from \"../types/params\";\nimport type { CellRendererFn } from \"../types/colDef\";\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 a = document.createElement(\"span\");\n a.className = \"mach-link\";\n a.textContent = params.formatted || String(params.value);\n return a;\n}\n\nconst ICON_PATHS: Record<string, string> = {\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};\n\nfunction iconSvg(name: string, size = 14): string {\n const path = ICON_PATHS[name] ?? \"\";\n return `<svg viewBox=\"0 0 16 16\" width=\"${size}\" height=\"${size}\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${path}</svg>`;\n}\n\nexport interface ActionItem<TData = any> {\n icon?: string;\n label?: string;\n title?: string;\n danger?: boolean;\n show?: (params: CellRendererParams<TData>) => boolean;\n onClick: (params: CellRendererParams<TData>) => void;\n}\n\nexport interface ActionButtonsConfig {\n actions: ActionItem[];\n max?: number;\n}\n\nlet openActionMenu: HTMLElement | null = null;\nlet openActionAnchor: HTMLElement | null = null;\n\nfunction closeActionMenu(): void {\n openActionMenu?.remove();\n openActionMenu = null;\n openActionAnchor = null;\n document.removeEventListener(\"mousedown\", onActionMenuOutside, true);\n}\n\nfunction onActionMenuOutside(e: MouseEvent): void {\n if (openActionMenu && !openActionMenu.contains(e.target as Node)) closeActionMenu();\n}\n\nfunction showActionMenu(anchor: HTMLElement, items: Array<{ label: string; danger?: boolean; pick: () => void }>): void {\n closeActionMenu();\n const menu = document.createElement(\"div\");\n menu.className = \"mach-context-menu\";\n for (const item of items) {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"mach-context-menu-item\";\n if (item.danger) btn.classList.add(\"mach-context-menu-item--danger\");\n btn.textContent = item.label;\n btn.addEventListener(\"click\", () => {\n closeActionMenu();\n item.pick();\n });\n menu.appendChild(btn);\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 openActionMenu = menu;\n openActionAnchor = anchor;\n document.addEventListener(\"mousedown\", onActionMenuOutside, true);\n}\n\nexport function createActionButtonsRenderer(config: ActionButtonsConfig): CellRendererFn {\n const max = config.max ?? 3;\n return (params: CellRendererParams) => {\n const visible = config.actions.filter((action) => {\n if (!action.show) return true;\n try {\n return action.show(params);\n } catch {\n return false;\n }\n });\n if (visible.length === 0) return \"\";\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"mach-actions\";\n\n const shown = visible.slice(0, max);\n const overflow = visible.slice(max);\n\n for (const action of shown) {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"mach-action-btn\";\n if (action.danger) btn.classList.add(\"mach-action-btn--danger\");\n const title = action.title ?? action.label ?? \"\";\n if (title) btn.title = title;\n if (action.icon && ICON_PATHS[action.icon]) {\n btn.innerHTML = iconSvg(action.icon);\n btn.classList.add(\"mach-action-btn--icon\");\n } else {\n btn.textContent = action.label ?? title;\n }\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n action.onClick(params);\n });\n wrap.appendChild(btn);\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 more.title = \"more\";\n more.textContent = \"⋯\";\n more.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n showActionMenu(\n more,\n overflow.map((action) => ({\n label: action.label ?? action.title ?? \"\",\n danger: action.danger,\n pick: () => action.onClick(params)\n }))\n );\n });\n wrap.appendChild(more);\n }\n\n return {\n el: wrap,\n destroy: () => {\n if (openActionAnchor && wrap.contains(openActionAnchor)) closeActionMenu();\n }\n };\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 { 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 { 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 { registerBuiltinRenderers } from \"../lib/presetRenderers\";\nimport {\n ensureCellRenderer,\n getCellEditor,\n getCellRenderer\n} from \"../lib/componentRegistry\";\nimport { validateColumnDefs } from \"../lib/validateDefs\";\nimport { toTsv, parseTsv, writeClipboard } from \"../lib/clipboard\";\nimport { formatCellValueWith } from \"../render/cellContent\";\nimport { DEFAULT_LOCALE, type RgLocale, type RgLocaleKey } from \"../lib/locale\";\nimport type { ResolvedGridOptions } from \"../types/options\";\nimport type { GridApi } 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 { GridEventMap, GridEventType } from \"../types/events\";\nimport type {\n CellEditorFactory,\n CellRendererFn,\n ColumnFilter,\n ColumnState,\n ColDef,\n ColDefGroup\n} from \"../types/colDef\";\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 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 lastColumnLayoutSignature = \"\";\n private activeFeatures = new Map<string, { feature: GridFeature<TData>; cleanup?: () => void }>();\n\n constructor(container: HTMLElement, options: GridOptions<TData>) {\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 as GridCore<any>);\n this.rowModel = new RowModel<TData>(this as GridCore<any>);\n this.selectionService = new SelectionService(this as GridCore<any>);\n this.skeleton = new GridSkeleton(this as GridCore<any>);\n this.headerRenderer = new HeaderRenderer(this as GridCore<any>);\n this.bodyRenderer = new BodyRenderer(this as GridCore<any>);\n this.resizeService = new ResizeService(this as GridCore<any>);\n this.columnDragService = new ColumnDragService(this as GridCore<any>);\n this.keyboardService = new KeyboardService(this as GridCore<any>);\n this.editingService = new EditingService(this as GridCore<any>);\n this.undoService = new UndoRedoService(this as GridCore<any>);\n this.filterPopup = new FilterPopupService(this as GridCore<any>);\n this.columnMenu = new ColumnMenuService(this as GridCore<any>);\n this.contextMenuService = new ContextMenuService(this as GridCore<any>);\n this.tooltipService = new TooltipService(this as GridCore<any>);\n this.watermarkService = new WatermarkService(this as GridCore<any>);\n this.paginationBar = new PaginationBar(this as GridCore<any>);\n this.pinnedRowsRenderer = new PinnedRowsRenderer(this as GridCore<any>);\n this.summaryRenderer = new SummaryRenderer(this as GridCore<any>);\n this.statusBarService = new StatusBarService(this as GridCore<any>);\n this.api = new GridApiImpl<TData>(this as GridCore<TData>);\n\n try {\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.columnModel.setColumnDefs(this.options.columnDefs);\n this.validateDefs(this.options.columnDefs);\n this.checkWarnings();\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 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 });\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 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 setFeatures(features: readonly GridFeature<TData>[] | null | undefined): void {\n this.destroyFeatures();\n if (this.destroyed) return;\n const context: GridFeatureContext<TData> = {\n api: this.api,\n root: this.skeleton.root,\n getOptions: () => this.options,\n addEventListener: (type, listener) => this.eventBus.on(type, listener),\n reportError: (error, source, details) => this.reportError(error, `feature.${source}`, details)\n };\n\n for (const feature of features ?? []) {\n const key = typeof feature?.key === \"string\" ? feature.key.trim() : \"\";\n if (!key) {\n this.reportError(new Error(\"GridFeature.key must be a non-empty string\"), \"feature.setup\");\n continue;\n }\n if (this.activeFeatures.has(key)) {\n this.reportError(new Error(`Duplicate GridFeature key: ${key}`), \"feature.setup\", { key });\n continue;\n }\n try {\n const cleanup = feature.setup(context);\n this.activeFeatures.set(key, {\n feature,\n ...(typeof cleanup === \"function\" ? { cleanup } : {})\n });\n } catch (error) {\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 try {\n active.cleanup?.();\n } catch (error) {\n this.reportError(error, \"feature.cleanup\", { key });\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) {\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,\n data: node.data!\n });\n this.undoService.record({ nodeId: node.id, columnId: column.id, oldValue, newValue });\n }\n return changed;\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 unknown 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 return event;\n }\n\n reportError(error: unknown, source: string, context?: Record<string, unknown>): void {\n console.error(`[mach-table] ${source} error`, error);\n if (this.destroyed) return;\n this.emit(\"gridError\", { error, source, context });\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 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\", { filterModel: this.rowModel.getFilterModel() });\n if (this.rowModel.isInfinite) {\n this.rowModel.onServerParamsChanged();\n return;\n }\n this.rowModel.refreshPipeline();\n this.bodyRenderer.onDataChanged();\n }\n\n applyQuickFilter(): void {\n this.emit(\"filterChanged\", { filterModel: this.rowModel.getFilterModel() });\n if (this.rowModel.isInfinite) {\n 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 private stateLoadToken = 0;\n\n loadPersistedColumnState(): void {\n const token = ++this.stateLoadToken;\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.stateLoadToken || !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 as Promise<void>).catch === \"function\") {\n void (result as Promise<void>).catch((error) => this.reportError(error, \"columnState.save\"));\n }\n } catch (error) {\n this.reportError(error, \"columnState.save\");\n }\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(): void {\n if (this.options.suppressWarnings || this.destroyed) return;\n if (this.options.treeData) {\n if (this.columnModel.getRowGroupColumns().length > 0) {\n console.warn(\"[mach-table] treeData 与 rowGroup 不支持同时启用,行分组已被忽略\");\n }\n if (this.options.masterDetail) {\n console.warn(\"[mach-table] treeData 与 masterDetail 不支持同时启用,主从明细已被忽略\");\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.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 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 this.destroyed = true;\n if (this.readyRafId) cancelAnimationFrame(this.readyRafId);\n this.readyRafId = 0;\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(\"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 { 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 getRowId: { kind: \"function\", update: \"options\" },\n rowHeight: { kind: \"number\", update: \"options\" },\n headerHeight: { kind: \"number\", update: \"options\" },\n rowBuffer: { kind: \"number\", 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 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 features: { kind: \"array\", update: \"options\" },\n locale: { kind: \"object\", 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 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 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 suppressCellFocus: { kind: \"boolean\", update: \"options\" },\n suppressRowHoverHighlight: { kind: \"boolean\", update: \"options\" },\n suppressNoRowsOverlay: { kind: \"boolean\", update: \"options\" },\n suppressHeaderFocus: { kind: \"boolean\", update: \"options\" },\n loading: { kind: \"boolean\", update: \"options\" },\n overlayNoRowsTemplate: { kind: \"unknown\", update: \"options\" },\n overlayLoadingTemplate: { 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 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 { ColDef } from \"../types/colDef\";\nimport type { ActionButtonsConfig } from \"./presetRenderers\";\nimport { createActionButtonsRenderer } from \"./presetRenderers\";\n\nconst NO_INTERACT = { sortable: false, resizable: false, movable: false, filter: false } 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 & { width?: number; pinned?: \"left\" | \"right\" } = { actions: [] }\n): ColDef<TData> {\n const { width, pinned, ...rendererConfig } = config;\n const btnCount = Math.min(rendererConfig.actions?.length ?? 0, rendererConfig.max ?? 3);\n const defaultWidth = Math.max(1, btnCount) * 26 + ((rendererConfig.actions?.length ?? 0) > btnCount ? 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 as ActionButtonsConfig),\n ...NO_INTERACT,\n cellRendererParams: undefined\n };\n}\n"],"mappings":"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","names":["cols","input","container","end","PANES","node"]}