@ngneers/controls 0.0.1-next.1 → 0.0.1-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngneers-controls-api-ng.mjs +11 -18
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-badge.mjs +160 -0
- package/fesm2022/ngneers-controls-badge.mjs.map +1 -0
- package/fesm2022/ngneers-controls-base.mjs +85 -8
- package/fesm2022/ngneers-controls-base.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs → ngneers-controls-calendar-time-paM6WVpV.mjs} +2 -2
- package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs.map → ngneers-controls-calendar-time-paM6WVpV.mjs.map} +1 -1
- package/fesm2022/ngneers-controls-calendar.mjs +13 -6
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-checkbox.mjs +3 -3
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
- package/fesm2022/ngneers-controls-color-picker.mjs +336 -0
- package/fesm2022/ngneers-controls-color-picker.mjs.map +1 -0
- package/fesm2022/ngneers-controls-default-icons.mjs +5 -0
- package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +64 -7
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
- package/fesm2022/ngneers-controls-edit-inplace.mjs +15 -5
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-errors.mjs +203 -148
- package/fesm2022/ngneers-controls-errors.mjs.map +1 -1
- package/fesm2022/ngneers-controls-filter.mjs +2 -2
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
- package/fesm2022/ngneers-controls-hint.mjs +18 -1
- package/fesm2022/ngneers-controls-hint.mjs.map +1 -1
- package/fesm2022/ngneers-controls-i18n-translations-de.mjs +14 -0
- package/fesm2022/ngneers-controls-i18n-translations-de.mjs.map +1 -1
- package/fesm2022/ngneers-controls-i18n-translations-en.mjs +16 -0
- package/fesm2022/ngneers-controls-i18n-translations-en.mjs.map +1 -1
- package/fesm2022/ngneers-controls-icon.mjs +23 -6
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-field.mjs +18 -2
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input.mjs +49 -9
- package/fesm2022/ngneers-controls-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-list-box.mjs +2 -2
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-mask-input.mjs +4 -1
- package/fesm2022/ngneers-controls-mask-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-number-input.mjs +4 -4
- package/fesm2022/ngneers-controls-number-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-otp.mjs +16 -4
- package/fesm2022/ngneers-controls-otp.mjs.map +1 -1
- package/fesm2022/ngneers-controls-paginator.mjs +36 -9
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
- package/fesm2022/ngneers-controls-radio.mjs +4 -4
- package/fesm2022/ngneers-controls-radio.mjs.map +1 -1
- package/fesm2022/ngneers-controls-rating.mjs +180 -0
- package/fesm2022/ngneers-controls-rating.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroll-shadow.mjs +33 -7
- package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -1
- package/fesm2022/ngneers-controls-scroller.mjs +4 -2
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +2 -1
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select.mjs +24 -4
- package/fesm2022/ngneers-controls-select.mjs.map +1 -1
- package/fesm2022/ngneers-controls-slider.mjs +3 -3
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
- package/fesm2022/ngneers-controls-stepper.mjs +142 -0
- package/fesm2022/ngneers-controls-stepper.mjs.map +1 -0
- package/fesm2022/ngneers-controls-switch.mjs +3 -3
- package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
- package/fesm2022/ngneers-controls-table.mjs +282 -15
- package/fesm2022/ngneers-controls-table.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tabs.mjs +2 -2
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toggle-button.mjs +3 -3
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tooltip.mjs +16 -28
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tree.mjs +2 -2
- package/fesm2022/ngneers-controls-tree.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils.mjs +138 -1
- package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
- package/package.json +18 -2
- package/types/ngneers-controls-api-ng.d.ts +12 -9
- package/types/ngneers-controls-badge.d.ts +67 -0
- package/types/ngneers-controls-base.d.ts +61 -4
- package/types/ngneers-controls-breadcrumb.d.ts +14 -0
- package/types/ngneers-controls-calendar.d.ts +21 -6
- package/types/ngneers-controls-chip.d.ts +14 -0
- package/types/ngneers-controls-color-picker.d.ts +119 -0
- package/types/ngneers-controls-dialog.d.ts +14 -0
- package/types/ngneers-controls-directives.d.ts +31 -2
- package/types/ngneers-controls-drawer.d.ts +14 -0
- package/types/ngneers-controls-edit-inplace.d.ts +20 -0
- package/types/ngneers-controls-errors.d.ts +105 -16
- package/types/ngneers-controls-filter.d.ts +27 -13
- package/types/ngneers-controls-hint.d.ts +8 -1
- package/types/ngneers-controls-i18n-translations-de.d.ts +14 -0
- package/types/ngneers-controls-i18n-translations-en.d.ts +14 -0
- package/types/ngneers-controls-i18n.d.ts +14 -0
- package/types/ngneers-controls-icon.d.ts +2 -2
- package/types/ngneers-controls-input-field.d.ts +25 -2
- package/types/ngneers-controls-input.d.ts +35 -3
- package/types/ngneers-controls-list-box.d.ts +14 -0
- package/types/ngneers-controls-mask-input.d.ts +14 -0
- package/types/ngneers-controls-otp.d.ts +19 -0
- package/types/ngneers-controls-paginator.d.ts +31 -3
- package/types/ngneers-controls-rating.d.ts +69 -0
- package/types/ngneers-controls-scroll-shadow.d.ts +11 -2
- package/types/ngneers-controls-scroller.d.ts +3 -1
- package/types/ngneers-controls-select.d.ts +27 -3
- package/types/ngneers-controls-snackbar.d.ts +14 -0
- package/types/ngneers-controls-splitter.d.ts +14 -0
- package/types/ngneers-controls-state.d.ts +2 -2
- package/types/ngneers-controls-stepper.d.ts +68 -0
- package/types/ngneers-controls-table.d.ts +273 -169
- package/types/ngneers-controls-toast.d.ts +14 -0
- package/types/ngneers-controls-tooltip.d.ts +0 -1
- package/types/ngneers-controls-tree.d.ts +14 -0
- package/types/ngneers-controls-upload.d.ts +14 -0
- package/types/ngneers-controls-utils.d.ts +27 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-table.mjs","sources":["../../src/table/table-column-layout-model.ts","../../src/table/table-group-header-row.ts","../../src/table/table-row-model.ts","../../src/table/table-row-navigation-model.ts","../../src/table/table-selection-model.ts","../../src/table/table-templates.ts","../../src/table/table.ts","../../src/table/table.html","../../src/table/table-cell.ts","../../src/table/table-header-cell.ts","../../src/table/table-header-row.ts","../../src/table/table-reorderable-column.ts","../../src/table/table-row.ts","../../src/table/action-item-mapping.ts","../../src/table/table-row-actions-bar.ts","../../src/table/table-row-actions.ts","../../src/table/table-selection-column.ts","../../src/table/table-sticky-column.ts","../../src/table/module.ts","../../src/table/table-filterable-column.ts","../../src/table/table-sortable-column.ts","../../src/table/ngneers-controls-table.ts"],"sourcesContent":["import { afterRenderEffect, computed, signal } from '@angular/core';\nimport { elementSizeSignal } from '@ngneers/controls/api/ng';\nimport { getResizeLimitInPx, ResizeEngine } from '@ngneers/controls/api/resize';\n\nimport type { NgnTableTh } from './table-header-cell';\nimport type { ElementRef, ModelSignal, Signal } from '@angular/core';\nimport type { ResizableItem } from '@ngneers/controls/api/resize';\n\n/**\n * Default minimum column width in pixels for table columns.\n * Enforced as an absolute floor even when a relative min-size (e.g. `5%`) resolves smaller.\n */\nconst TABLE_MIN_COLUMN_WIDTH_PX = 50;\n\n/** Splits a CSS grid-template-columns string into individual track values, handling minmax(). */\nconst GRID_TRACK_RE = /(?:minmax\\([^)]+\\)|[^\\s]+)/g;\n\nexport interface TableColumnLayoutModelDeps {\n element: ElementRef<HTMLElement>;\n resizable: Signal<boolean>;\n reorderable: Signal<boolean>;\n resizeMode: Signal<'adjacent' | 'proportional' | 'push'>;\n lockSizes: Signal<boolean>;\n columnOrder: ModelSignal<string[]>;\n themeClass: (name: string) => string;\n}\n\n/**\n * Owns all column geometry for {@link NgnTable}: effective order, widths (via the wrapped\n * {@link ResizeEngine}), sticky columns, reorder gestures, auto-sizing, and the composed\n * `grid-template-columns`. Reads table flags through injected signals; writes only its own\n * state and the injected `columnOrder` model.\n */\nexport class TableColumnLayoutModel {\n private readonly _registeredHeaderCells = signal<NgnTableTh[]>([]);\n private readonly _stickyColumns = signal<ReadonlyMap<string, 'start' | 'end'>>(new Map());\n private readonly _hasSelectionColumn = signal(false);\n private readonly _isReordering = signal(false);\n private readonly _reorderSourceColumnId = signal<string | null>(null);\n private readonly _dropIndicatorState = signal<{\n leftPx: number;\n topPx: number;\n heightPx: number;\n } | null>(null);\n private _reorderTargetIndex = -1;\n\n private readonly _tableElementSize: ReturnType<typeof elementSizeSignal>;\n private readonly _resizeEngine: ResizeEngine;\n\n public readonly hasSelectionColumn = this._hasSelectionColumn.asReadonly();\n public readonly isReordering = this._isReordering.asReadonly();\n public readonly dropIndicatorState = this._dropIndicatorState.asReadonly();\n public readonly isDragging = (): boolean => this._resizeEngine.isDragging();\n\n public readonly columnCount = computed(() => this._registeredHeaderCells().length);\n\n /**\n * Effective column order: merges user-provided `columnOrder` with registered header cells.\n * If `columnOrder` is empty, falls back to registration order.\n * Unknown keys are filtered; new columns not in the order are appended.\n */\n private readonly _effectiveColumnOrder = computed<string[]>(() => {\n const cells = this._registeredHeaderCells();\n const cellIds = cells.map(c => c.ngnTableTh());\n const userOrder = this._deps.columnOrder();\n\n if (!userOrder.length) {\n return cellIds;\n }\n\n // Filter to valid keys and append any new columns not in the order\n const validOrder = userOrder.filter(id => cellIds.includes(id));\n const missing = cellIds.filter(id => !validOrder.includes(id));\n return [...validOrder, ...missing];\n });\n\n public readonly stickyStartColumns = computed<string[]>(() => {\n const stickyMap = this._stickyColumns();\n const order = this._effectiveColumnOrder();\n const contiguous: string[] = [];\n for (const id of order) {\n if (stickyMap.get(id) === 'start') {\n contiguous.push(id);\n } else {\n break;\n }\n }\n return contiguous;\n });\n\n public readonly stickyEndColumns = computed<string[]>(() => {\n const stickyMap = this._stickyColumns();\n const order = this._effectiveColumnOrder();\n const contiguous: string[] = [];\n for (let i = order.length - 1; i >= 0; i--) {\n if (stickyMap.get(order[i]!) === 'end') {\n contiguous.unshift(order[i]!);\n } else {\n break;\n }\n }\n return contiguous;\n });\n\n /**\n * Maps column ID → 1-based visual position.\n */\n public readonly columnOrderMap = computed<ReadonlyMap<string, number>>(() => {\n const order = this._effectiveColumnOrder();\n const map = new Map<string, number>();\n for (let i = 0; i < order.length; i++) {\n map.set(order[i]!, i + 1);\n }\n return map;\n });\n\n /**\n * Grid template columns computed from the resize engine when resizable,\n * otherwise falls back to the standard equal-width repeat.\n */\n public readonly gridTemplateColumns: Signal<string>;\n\n constructor(private readonly _deps: TableColumnLayoutModelDeps) {\n this._tableElementSize = elementSizeSignal(this._deps.element);\n\n // Create engine eagerly in constructor (outside reactive context) to avoid NG0602\n this._resizeEngine = new ResizeEngine({\n items: computed(() => this._registeredHeaderCells() as unknown as readonly ResizableItem[]),\n containerSize: computed(() => {\n // Subscribe to the size signal for reactivity, but use clientWidth\n // to exclude vertical scrollbar width and avoid horizontal overflow.\n this._tableElementSize();\n const tableEl = this._deps.element.nativeElement.querySelector('table');\n const total = tableEl?.clientWidth ?? 0;\n if (!this._hasSelectionColumn()) return total;\n // Subtract the selection column width so the resize engine only distributes\n // the remaining space among data columns.\n const selCol = this._deps.element.nativeElement.querySelector(\n `.${this._deps.themeClass('selection-column')}`\n );\n return total - (selCol?.getBoundingClientRect().width ?? 0);\n }),\n gapSizes: signal([]),\n distributionMode: computed(() => this._deps.resizeMode()),\n containerConstrained: computed(() => this._deps.resizeMode() !== 'push'),\n lockSizes: computed(() => this._deps.lockSizes()),\n minItemSizePx: TABLE_MIN_COLUMN_WIDTH_PX,\n resolveItemSizes: () =>\n this._registeredHeaderCells().map(\n cell => cell.element.nativeElement.getBoundingClientRect().width\n ),\n });\n\n this.gridTemplateColumns = computed(() => {\n const checkboxCol = this._hasSelectionColumn() ? 'min-content ' : '';\n if (this._deps.resizable()) {\n const rawSizes = this._resizeEngine.gridTemplateSizes();\n // When reorderable, permute grid track sizes to match visual column order\n if (this._deps.reorderable()) {\n return `${checkboxCol}${this._permuteGridSizes(rawSizes)}`;\n }\n return `${checkboxCol}${rawSizes}`;\n }\n return `${checkboxCol}repeat(${this.columnCount()}, 1fr)`;\n });\n\n afterRenderEffect(() => {\n const startCols = this.stickyStartColumns();\n const endCols = this.stickyEndColumns();\n if (startCols.length === 0 && endCols.length === 0) return;\n if (this._resizeEngine.isDragging()) return;\n this._tableElementSize();\n\n const tableEl = this._deps.element.nativeElement.querySelector(':scope > table');\n if (!tableEl) return;\n\n const cells = this._registeredHeaderCells();\n\n let selectionWidth = 0;\n if (this._hasSelectionColumn()) {\n const selCol = tableEl.querySelector(`.${this._deps.themeClass('selection-column')}`);\n selectionWidth = selCol?.getBoundingClientRect().width ?? 0;\n }\n\n let cumulativeLeft = selectionWidth;\n for (let i = 0; i < startCols.length; i++) {\n (tableEl as HTMLElement).style.setProperty(\n `--ngn-sticky-start-offset-${i}`,\n `${cumulativeLeft}px`\n );\n const cell = cells.find(c => c.ngnTableTh() === startCols[i]);\n cumulativeLeft += cell?.element.nativeElement.getBoundingClientRect().width ?? 0;\n }\n\n let cumulativeRight = 0;\n for (let i = endCols.length - 1; i >= 0; i--) {\n (tableEl as HTMLElement).style.setProperty(\n `--ngn-sticky-end-offset-${i}`,\n `${cumulativeRight}px`\n );\n const cell = cells.find(c => c.ngnTableTh() === endCols[i]);\n cumulativeRight += cell?.element.nativeElement.getBoundingClientRect().width ?? 0;\n }\n });\n }\n\n /**\n * Returns the 1-based visual column index for a given 0-based logical (DOM) index.\n */\n public getVisualColumnIndex(logicalIndex: number): number {\n const cells = this._registeredHeaderCells();\n const cell = cells[logicalIndex];\n if (!cell) return logicalIndex + 1;\n return this.columnOrderMap().get(cell.ngnTableTh()) ?? logicalIndex + 1;\n }\n\n public registerSelectionColumn(): void {\n this._hasSelectionColumn.set(true);\n }\n\n public unregisterSelectionColumn(): void {\n this._hasSelectionColumn.set(false);\n }\n\n public registerHeaderCell(cell: NgnTableTh): void {\n this._registeredHeaderCells.update(cells => [...cells, cell]);\n }\n\n public unregisterHeaderCell(cell: NgnTableTh): void {\n this._registeredHeaderCells.update(cells => cells.filter(c => c !== cell));\n }\n\n public getRegisteredHeaderCells(): readonly NgnTableTh[] {\n return this._registeredHeaderCells();\n }\n\n public registerStickyColumn(columnId: string, side: 'start' | 'end'): void {\n this._stickyColumns.update(map => {\n const next = new Map(map);\n next.set(columnId, side);\n return next;\n });\n }\n\n public unregisterStickyColumn(columnId: string): void {\n this._stickyColumns.update(map => {\n const next = new Map(map);\n next.delete(columnId);\n return next;\n });\n }\n\n public getStickyInfo(\n columnId: string\n ): { side: 'start' | 'end'; index: number; isEdge: boolean } | null {\n const startCols = this.stickyStartColumns();\n const endCols = this.stickyEndColumns();\n const startIndex = startCols.indexOf(columnId);\n if (startIndex >= 0) {\n return { side: 'start', index: startIndex, isEdge: startIndex === startCols.length - 1 };\n }\n const endIndex = endCols.indexOf(columnId);\n if (endIndex >= 0) {\n return { side: 'end', index: endIndex, isEdge: endIndex === 0 };\n }\n return null;\n }\n\n // --- Resize operations (called by NgnTableTh) ---\n\n public startColumnResize(columnIndex: number, event: PointerEvent): void {\n if (!this._deps.resizable()) return;\n this._resizeEngine.startDrag(columnIndex, event.clientX);\n }\n\n public dragColumnResize(columnIndex: number, event: PointerEvent): void {\n if (!this._deps.resizable()) return;\n this._resizeEngine.drag(columnIndex, event.clientX);\n }\n\n public endColumnResize(columnIndex: number, cancel: boolean): void {\n if (!this._deps.resizable()) return;\n this._resizeEngine.endDrag(columnIndex, cancel);\n }\n\n // --- Reorder operations (called by NgnTableReorderableColumn) ---\n\n public getReorderBounds(columnId: string): { min: number; max: number } {\n const order = this._effectiveColumnOrder();\n const startCols = this.stickyStartColumns();\n const endCols = this.stickyEndColumns();\n const side = this._stickyColumns().get(columnId);\n\n if (side === 'start') {\n return { min: 0, max: startCols.length };\n } else if (side === 'end') {\n return { min: order.length - endCols.length, max: order.length };\n } else {\n return { min: startCols.length, max: order.length - endCols.length };\n }\n }\n\n public startColumnReorder(columnId: string): void {\n if (!this._deps.reorderable()) return;\n this._isReordering.set(true);\n this._reorderSourceColumnId.set(columnId);\n this._reorderTargetIndex = -1;\n }\n\n public dragColumnReorder(event: PointerEvent): void {\n if (!this._deps.reorderable() || !this._isReordering()) return;\n\n const cells = this._registeredHeaderCells();\n const effectiveOrder = this._effectiveColumnOrder();\n const sourceId = this._reorderSourceColumnId();\n if (!sourceId) return;\n\n // Find drop target by comparing cursor X to header cell midpoints (in visual order)\n const cursorX = event.clientX;\n let targetIndex = effectiveOrder.length;\n\n // Build visual-order cells with their bounding boxes\n const visualCells = effectiveOrder\n .map(id => cells.find(c => c.ngnTableTh() === id))\n .filter((c): c is NgnTableTh => !!c);\n\n for (let i = 0; i < visualCells.length; i++) {\n const rect = visualCells[i]!.element.nativeElement.getBoundingClientRect();\n const midX = rect.left + rect.width / 2;\n if (cursorX < midX) {\n targetIndex = i;\n break;\n }\n }\n\n const bounds = this.getReorderBounds(sourceId);\n targetIndex = Math.max(bounds.min, Math.min(bounds.max, targetIndex));\n\n this._reorderTargetIndex = targetIndex;\n\n // Compute indicator position relative to the table element\n const tableEl = this._deps.element.nativeElement.querySelector(':scope > table');\n if (!tableEl) return;\n const tableRect = tableEl.getBoundingClientRect();\n\n // Use the first header cell's height for the indicator\n const firstCellRect = visualCells[0]?.element.nativeElement.getBoundingClientRect();\n const indicatorHeight = firstCellRect?.height ?? 40;\n\n let indicatorLeftPx: number;\n if (targetIndex === 0) {\n const firstCell = visualCells[0];\n if (!firstCell) return;\n const rect = firstCell.element.nativeElement.getBoundingClientRect();\n indicatorLeftPx = rect.left - tableRect.left;\n } else if (targetIndex >= visualCells.length) {\n const lastCell = visualCells[visualCells.length - 1];\n if (!lastCell) return;\n const rect = lastCell.element.nativeElement.getBoundingClientRect();\n indicatorLeftPx = rect.right - tableRect.left;\n } else {\n const prevCell = visualCells[targetIndex - 1]!;\n const nextCell = visualCells[targetIndex]!;\n const prevRect = prevCell.element.nativeElement.getBoundingClientRect();\n const nextRect = nextCell.element.nativeElement.getBoundingClientRect();\n indicatorLeftPx = (prevRect.right + nextRect.left) / 2 - tableRect.left;\n }\n\n // Clamp so the 3px-wide indicator stays within the visible content area\n // (use clientWidth to exclude scrollbar width from the boundary)\n const maxLeft = tableEl.clientWidth - 3;\n indicatorLeftPx = Math.max(0, Math.min(indicatorLeftPx, maxLeft));\n\n this._dropIndicatorState.set({\n leftPx: indicatorLeftPx,\n topPx: tableEl.scrollTop,\n heightPx: indicatorHeight,\n });\n }\n\n public endColumnReorder(cancel: boolean): void {\n if (!this._deps.reorderable()) return;\n\n if (!cancel && this._reorderTargetIndex >= 0) {\n const sourceId = this._reorderSourceColumnId();\n if (sourceId) {\n const effectiveOrder = [...this._effectiveColumnOrder()];\n const sourceIndex = effectiveOrder.indexOf(sourceId);\n\n if (sourceIndex >= 0) {\n // Remove source from its current position\n effectiveOrder.splice(sourceIndex, 1);\n // Adjust target index if source was before target\n let insertAt = this._reorderTargetIndex;\n if (sourceIndex < this._reorderTargetIndex) {\n insertAt--;\n }\n // Insert at new position\n effectiveOrder.splice(insertAt, 0, sourceId);\n\n this._deps.columnOrder.set(effectiveOrder);\n }\n }\n }\n\n this._isReordering.set(false);\n this._reorderSourceColumnId.set(null);\n this._dropIndicatorState.set(null);\n this._reorderTargetIndex = -1;\n }\n\n public getReorderSourceColumnId(): string | null {\n return this._reorderSourceColumnId();\n }\n\n /**\n * Permutes grid template sizes from logical (registration) order to visual (column order) order.\n */\n private _permuteGridSizes(rawSizes: string): string {\n const tracks = rawSizes.match(GRID_TRACK_RE) ?? [];\n const cells = this._registeredHeaderCells();\n const effectiveOrder = this._effectiveColumnOrder();\n\n if (tracks.length !== cells.length) {\n return rawSizes; // Mismatch — don't permute\n }\n\n // Build map: column ID → track size (logical order)\n const sizeByColumnId = new Map<string, string>();\n for (let i = 0; i < cells.length; i++) {\n sizeByColumnId.set(cells[i]!.ngnTableTh(), tracks[i]!);\n }\n\n // Emit sizes in visual order\n return effectiveOrder.map(id => sizeByColumnId.get(id) ?? '1fr').join(' ');\n }\n\n /**\n * Auto-sizes the column at `columnIndex` to fit its visible content.\n * Uses `Canvas.measureText()` for fast, reflow-free text measurement since\n * grid-constrained cells (`min-width: 0`) don't report natural content width\n * via `scrollWidth`.\n */\n public autoSizeColumn(columnIndex: number): void {\n if (!this._deps.resizable()) return;\n\n const cells = this._registeredHeaderCells();\n const headerCell = cells[columnIndex];\n if (!headerCell) return;\n\n const tableEl = this._deps.element.nativeElement.querySelector('table');\n if (!tableEl) return;\n\n const headerEl = headerCell.element.nativeElement as HTMLElement;\n const ctx = autoSizeCanvasCtx();\n\n // Measure header: text width + non-text siblings (icons, controls) + flex gap.\n // The header cell is a flex container with: cell-text, spacer, filter/sort icons, resize handle.\n const cellTextClass = this._deps.themeClass('cell-text');\n const headerTextEl = headerEl.querySelector<HTMLElement>(`.${cellTextClass}`);\n let headerRequiredWidth = 0;\n if (headerTextEl) {\n ctx.font = getCssFont(headerEl);\n const text = headerTextEl.textContent ?? '';\n headerRequiredWidth = Math.ceil(ctx.measureText(text).width);\n }\n // Add width of visible non-text siblings (filter icon, sort icon, etc.)\n const headerStyle = getComputedStyle(headerEl);\n const headerGap = parseFloat(headerStyle.gap) || 0;\n let visibleSiblingCount = 0;\n for (let i = 0; i < headerEl.children.length; i++) {\n const child = headerEl.children[i] as HTMLElement;\n if (child === headerTextEl) continue;\n // Skip spacer (zero intrinsic width) and hidden resize handle\n if (child.offsetWidth > 0 && getComputedStyle(child).flexGrow === '0') {\n headerRequiredWidth += child.offsetWidth;\n visibleSiblingCount++;\n }\n }\n // Add flex gaps between visible items\n if (visibleSiblingCount > 0) {\n headerRequiredWidth += headerGap * visibleSiblingCount;\n }\n let maxContentWidth = headerRequiredWidth;\n\n // Measure visible body cells (nth-child is 1-indexed, offset by selection column)\n const selectionOffset = this._hasSelectionColumn() ? 1 : 0;\n const bodyCells = Array.from(\n tableEl.querySelectorAll<HTMLElement>(\n `tbody tr td:nth-child(${columnIndex + selectionOffset + 1})`\n )\n );\n if (bodyCells.length > 0) {\n ctx.font = getCssFont(bodyCells[0]!);\n for (let i = 0; i < bodyCells.length; i++) {\n const text = bodyCells[i]!.textContent ?? '';\n maxContentWidth = Math.max(maxContentWidth, Math.ceil(ctx.measureText(text).width));\n }\n }\n\n // Add cell horizontal padding\n const paddingLeft = parseFloat(headerStyle.paddingLeft) || 0;\n const paddingRight = parseFloat(headerStyle.paddingRight) || 0;\n const totalWidth = maxContentWidth + paddingLeft + paddingRight;\n\n // Clamp to min/max constraints\n const containerSize = this._tableElementSize().width;\n const minPx = Math.max(\n TABLE_MIN_COLUMN_WIDTH_PX,\n getResizeLimitInPx(headerCell.minSize(), containerSize)\n );\n const maxPx = getResizeLimitInPx(headerCell.maxSize(), containerSize);\n const clampedWidth = Math.max(minPx, Math.min(maxPx, totalWidth));\n\n this._resizeEngine.setItemSize(headerCell as unknown as ResizableItem, `${clampedWidth}px`);\n this._resizeEngine.hasBeenResized.set(true);\n }\n}\n\n// --- Auto-size helpers ---\n\n/** Lazily created canvas context for text measurement (no DOM reflows). */\nlet _autoSizeCtx: CanvasRenderingContext2D | null = null;\nfunction autoSizeCanvasCtx(): CanvasRenderingContext2D {\n if (!_autoSizeCtx) {\n _autoSizeCtx = document.createElement('canvas').getContext('2d')!;\n }\n return _autoSizeCtx;\n}\n\n/** Builds the CSS font shorthand from an element's computed style. */\nfunction getCssFont(el: HTMLElement): string {\n const s = getComputedStyle(el);\n return `${s.fontStyle} ${s.fontWeight} ${s.fontSize} ${s.fontFamily}`;\n}\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\nimport { NgnScrollerItem } from '@ngneers/controls/scroller';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { setInputSignalValue } from '@ngneers/controls/utils-ng';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport type { FormattedTableGroupHeaderRow } from './types';\n\n@Directive({\n selector: '[ngnTableGroupHeaderTr]',\n host: {\n '[attr.aria-rowindex]': 'ngnTableGroupHeaderTr().index + 2',\n '[style.--ngn-table-row-index]': 'ngnTableGroupHeaderTr().index + 2',\n },\n})\nexport class NgnTableGroupHeaderTr extends NgnScrollerItem {\n /** The group-header row this `<tr>` renders. */\n public readonly ngnTableGroupHeaderTr = input.required<FormattedTableGroupHeaderRow>();\n /** The item bound to the underlying scroller entry; kept in sync with {@link ngnTableGroupHeaderTr}. */\n public override readonly ngnScrollerItem = input<object>({});\n private readonly _element = inject(ElementRef<HTMLElement>);\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n\n constructor() {\n super();\n effect(() => {\n const row = this.ngnTableGroupHeaderTr();\n setInputSignalValue(this.ngnScrollerItem, row);\n });\n this.prepareDom();\n }\n\n private prepareDom() {\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\n toggleClass(this._element.nativeElement, this.theme.class('group-header-row'), true);\n }\n}\n","import { executeMultiFilter } from '@ngneers/controls/api';\n\nimport type { FormattedTableRow } from './types';\nimport type { NgnFilterConfig } from '@ngneers/controls/filter';\nimport type { PaginationState } from '@ngneers/controls/paginator';\nimport type { AllKeysOfUnion } from '@ngneers/controls/utils';\n\nexport type TableSort<T> = {\n column: Extract<AllKeysOfUnion<T>, string>;\n direction: 'asc' | 'desc';\n};\n\nexport type TableFilters<T> =\n | { [key in Extract<AllKeysOfUnion<T>, string>]?: NgnFilterConfig }\n | null;\n\nexport type TableSortComparator<T> = (a: T, b: T, sort: TableSort<T>) => number;\n\n/** Applies the active multi-column filter set. Returns the input untouched when no filters are set. */\nexport function filterRows<T extends object>(\n rows: readonly T[],\n filters: TableFilters<T>\n): readonly T[] {\n if (!filters) {\n return rows;\n }\n return executeMultiFilter(rows, filters);\n}\n\n/**\n * Default comparator: nulls sort first on `asc` / last on `desc`; numbers compare\n * numerically; everything else compares via `localeCompare` on the stringified value.\n */\nexport function defaultSortComparator<T>(a: T, b: T, sort: TableSort<T>): number {\n const { column, direction } = sort;\n // Mirrors the existing index access in groupRows / the original inline comparator.\n const aValue = (a as Record<string, unknown>)[column];\n const bValue = (b as Record<string, unknown>)[column];\n if (aValue == null && bValue != null) {\n return direction === 'asc' ? -1 : 1;\n }\n if (aValue != null && bValue == null) {\n return direction === 'asc' ? 1 : -1;\n }\n if (aValue == null && bValue == null) {\n return 0;\n }\n return typeof aValue === 'number' && typeof bValue === 'number'\n ? direction === 'asc'\n ? aValue - bValue\n : bValue - aValue\n : direction === 'asc'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n}\n\n/** Sorts rows without mutating the input. Returns the input untouched when no sort is set. */\nexport function sortRows<T>(\n rows: readonly T[],\n sort: TableSort<T> | null,\n comparator: TableSortComparator<T> = defaultSortComparator\n): readonly T[] {\n if (!sort) {\n return rows;\n }\n return rows.toSorted((a, b) => comparator(a, b, sort));\n}\n\n/**\n * Builds a flat row list with group headers interleaved, preserving the incoming\n * (already filtered + sorted) order. Data rows appear only under expanded groups.\n */\nexport function groupRows<T>(\n rows: readonly T[],\n groupBy: string,\n fieldId: keyof T,\n expanded: ReadonlySet<unknown>\n): FormattedTableRow<T>[] {\n const groupMap = new Map<unknown, T[]>();\n for (const row of rows) {\n const key = (row as Record<string, unknown>)[groupBy];\n let group = groupMap.get(key);\n if (!group) {\n group = [];\n groupMap.set(key, group);\n }\n group.push(row);\n }\n\n const result: FormattedTableRow<T>[] = [];\n let index = 0;\n for (const [groupKey, members] of groupMap) {\n const isExpanded = expanded.has(groupKey);\n result.push({\n kind: 'group-header',\n id: `group-${String(groupKey)}`,\n groupKey,\n groupValue: groupKey,\n count: members.length,\n expanded: isExpanded,\n index: index++,\n });\n if (isExpanded) {\n for (const data of members) {\n result.push({\n kind: 'data',\n id: data[fieldId] as T[keyof T] & (string | number),\n data,\n index: index++,\n });\n }\n }\n }\n return result;\n}\n\n/** Slices a formatted row list to the current page. Returns `[]` when there is no page state. */\nexport function paginateRows<T, V>(\n rows: readonly FormattedTableRow<T, V>[],\n pageState: PaginationState | null\n): readonly FormattedTableRow<T, V>[] {\n if (!pageState) {\n return [];\n }\n return rows.slice(pageState.slice.skip, pageState.slice.take + pageState.slice.skip);\n}\n","import { signal } from '@angular/core';\n\nimport type { FormattedTableRow, TableSelectionMode } from './types';\nimport type { Signal, WritableSignal } from '@angular/core';\n\nexport interface RowNavigationDeps<T extends object> {\n /** The currently rendered/formatted rows, in view order. */\n viewRows: Signal<readonly FormattedTableRow<T>[]>;\n /**\n * Whether any row currently has a registered row-actions directive. Gates\n * the whole model — when `false` the model consumes nothing, so tables\n * without row actions keep byte-for-byte selection keyboard behavior.\n */\n hasActions: () => boolean;\n /**\n * The table's single current-row index, shared with (and driven by)\n * {@link import('./table-selection-model').TableSelectionModel}. This model\n * reads and writes it directly instead of owning a separate index, so\n * row-actions navigation and selection navigation always agree on which\n * row is current.\n */\n focusedRowIndex: WritableSignal<number | null>;\n /** The table's active selection mode, or `null` when selection is disabled. */\n selectionMode: Signal<TableSelectionMode | null>;\n /** Scrolls the row at `index` into view (used when the current row moves). */\n scrollToIndex: (index: number) => void;\n /** Enter the current row's action bar; returns true if a bar exists + focus moved in. */\n enterActions: (rowIndex: number) => boolean;\n /** Move within the bar; returns true while focus stays in the bar. */\n moveAction: (rowIndex: number, delta: 1 | -1) => boolean;\n /** Open the context menu for the current row (keyboard trigger). */\n openMenu: (rowIndex: number) => boolean;\n /** Returns DOM focus to the table's own tab stop when leaving the action bar. */\n focusHost: () => void;\n}\n\n/**\n * Roving keyboard model for row actions, reconciled onto the table's single\n * current-row index ({@link RowNavigationDeps.focusedRowIndex}). The single\n * tab stop lives on the table host; ArrowRight enters the action bar and\n * ArrowLeft/Right move between actions, ArrowLeft off the first action\n * returns to row navigation. ContextMenu and Shift+F10 always open the\n * context menu on the current row, regardless of selection mode.\n *\n * When {@link RowNavigationDeps.selectionMode} is set and focus is not in\n * the action bar, this model deliberately does **not** handle\n * ArrowUp/Down/Enter/Space itself — it returns `false` so the table's own\n * `onKeyDown` falls through to\n * {@link import('./table-selection-model').TableSelectionModel#onKeyDown},\n * which already resolves the start row correctly (including the\n * null-`focusedRowIndex` → currently-selected-row fallback after a mouse\n * click). Recomputing that start index here would silently diverge from the\n * selection model's resolution — that's exactly the bug this delegation\n * avoids. When `selectionMode` is `null`, this model owns ArrowUp/Down\n * itself (moves `focusedRowIndex`) and Enter opens the context menu. Only\n * claims keys when at least one row has registered actions (see\n * {@link RowNavigationDeps.hasActions}), so tables without row actions keep\n * selection's keyboard behavior untouched.\n */\nexport class TableRowNavigationModel<T extends object> {\n /** Whether DOM focus is currently inside the current row's action bar (as opposed to on the row itself). */\n public readonly inActions = signal(false);\n\n constructor(private readonly _deps: RowNavigationDeps<T>) {}\n\n /** Returns true when the event was handled (caller should stop propagation to other handlers). */\n public onKeyDown(event: KeyboardEvent): boolean {\n if (!this._deps.hasActions()) return false;\n\n const rows = this._deps.viewRows();\n if (rows.length === 0) return false;\n const current = this._deps.focusedRowIndex();\n const mode = this._deps.selectionMode();\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n return this._moveRow(event, rows.length, current, mode);\n case 'ArrowRight':\n return this._moveRight(event, current);\n case 'ArrowLeft':\n return this._moveLeft(event, current);\n case 'Enter':\n case ' ':\n return this._activate(event, current, mode);\n case 'ContextMenu':\n return this._openMenu(event, current);\n case 'F10':\n return event.shiftKey ? this._openMenu(event, current) : false;\n case 'Escape':\n // Back out of the action bar to the row (standard roving-toolbar exit),\n // mirroring ArrowLeft off the first action.\n if (!this.inActions()) return false;\n this.inActions.set(false);\n this._deps.focusHost();\n event.preventDefault();\n return true;\n default:\n return false;\n }\n }\n\n private _moveRow(\n event: KeyboardEvent,\n rowCount: number,\n current: number | null,\n mode: TableSelectionMode | null\n ): boolean {\n // While focus is inside the action bar, ArrowUp/Down must not move the\n // current row (and must not fall through to selection) — swallow them.\n if (this.inActions()) {\n event.preventDefault();\n return true;\n }\n if (mode) {\n // Delegate entirely to TableSelectionModel.onKeyDown — it already\n // resolves the start index (including the null-focus → selected-row\n // fallback) and applies the move/select/scroll side-effects. Returning\n // `false` here lets the table's onKeyDown fall through to it, so the\n // combined single/multi-select + actions behavior stays byte-identical\n // to the no-actions case.\n return false;\n }\n const start = current ?? -1;\n const next =\n event.key === 'ArrowDown' ? Math.min(start + 1, rowCount - 1) : Math.max(start - 1, 0);\n this._deps.focusedRowIndex.set(next);\n this._deps.scrollToIndex(next);\n event.preventDefault();\n return true;\n }\n\n private _moveRight(event: KeyboardEvent, current: number | null): boolean {\n if (current === null) return false;\n if (this.inActions()) {\n this._deps.moveAction(current, 1);\n event.preventDefault();\n return true;\n }\n if (!this._deps.enterActions(current)) return false;\n this.inActions.set(true);\n event.preventDefault();\n return true;\n }\n\n private _moveLeft(event: KeyboardEvent, current: number | null): boolean {\n if (current === null || !this.inActions()) return false;\n const stayed = this._deps.moveAction(current, -1);\n if (!stayed) {\n this.inActions.set(false); // fell off the first action → back to row navigation\n this._deps.focusHost();\n }\n event.preventDefault();\n return true;\n }\n\n private _activate(\n event: KeyboardEvent,\n current: number | null,\n mode: TableSelectionMode | null\n ): boolean {\n // Let the focused native <button> handle Enter/Space itself — do not\n // preventDefault, do not open the menu.\n if (this.inActions()) return false;\n // Delegate entirely to TableSelectionModel.onKeyDown when selection is\n // active — same rationale as the ArrowUp/Down case in `_moveRow`: it\n // reads the same `focusedRowIndex`, but keeping a single handler avoids\n // this model silently drifting from the selection model's semantics.\n if (mode) return false;\n if (current === null) return false;\n if (event.key !== 'Enter') return false; // Space is a no-op without selection\n return this._openMenu(event, current);\n }\n\n private _openMenu(event: KeyboardEvent, current: number | null): boolean {\n if (current === null || this.inActions()) return false;\n if (!this._deps.openMenu(current)) return false;\n event.preventDefault();\n return true;\n }\n}\n","import { computed, signal } from '@angular/core';\n\nimport type { FormattedTableDataRow, FormattedTableRow, TableSelectionMode } from './types';\nimport type { ModelSignal, Signal, WritableSignal } from '@angular/core';\n\nexport interface TableSelectionModelDeps<T extends object, K extends keyof T> {\n viewRows: Signal<readonly FormattedTableRow<T>[]>;\n selectionMode: Signal<TableSelectionMode | null>;\n fieldId: Signal<K>;\n /** The table's public two-way `selection` model, by reference. */\n selection: ModelSignal<T[K & keyof T][]>;\n /** The table's public `focusedRowIndex` signal, by reference. */\n focusedRowIndex: WritableSignal<number | null>;\n /** Scrolls the row at the given index into view (delegates to the table's NgnScroller). */\n scrollToIndex: (index: number) => void;\n}\n\n/**\n * Owns row selection, the selection anchor, keyboard navigation, and the derived\n * select-all / indeterminate state for {@link NgnTable}. Reads the view rows through an\n * injected signal and writes only the selection + focus state passed in.\n */\nexport class TableSelectionModel<T extends object, K extends keyof T> {\n constructor(private readonly _deps: TableSelectionModelDeps<T, K>) {}\n\n /** Anchor index for Shift+click range selection (index in viewRows). */\n private readonly _selectionAnchor = signal<number | null>(null);\n\n public readonly selectionSet = computed(() => new Set(this._deps.selection()), {\n equal: (a, b) => a.size === b.size && [...a].every(v => b.has(v)),\n });\n\n public readonly isAllSelected = computed(() => {\n const rows = this._deps.viewRows();\n const selSet = this.selectionSet();\n return rows.length > 0 && rows.every(row => selSet.has(row.id as T[K & keyof T]));\n });\n\n public readonly isIndeterminate = computed(() => {\n const selSet = this.selectionSet();\n return selSet.size > 0 && !this.isAllSelected();\n });\n\n public readonly headerCheckboxValue = computed<boolean | null>(() => {\n if (this.isAllSelected()) return true;\n if (this.isIndeterminate()) return null;\n return false;\n });\n\n public isRowSelected(id: T[keyof T] & (string | number)): boolean {\n return this.selectionSet().has(id as T[K & keyof T]);\n }\n\n public handleRowClick(row: FormattedTableDataRow<T>, event: MouseEvent): void {\n const mode = this._deps.selectionMode();\n if (!mode) return;\n\n const id = row.id as T[K & keyof T];\n const rowIndex = this._deps.viewRows().findIndex(r => r.id === row.id);\n\n if (mode === 'single') {\n this._deps.selection.set([id]);\n this._selectionAnchor.set(rowIndex);\n this._deps.focusedRowIndex.set(null);\n return;\n }\n\n if (event.shiftKey && this._selectionAnchor() !== null) {\n this._selectRange(this._selectionAnchor()!, rowIndex);\n } else if (event.ctrlKey || event.metaKey) {\n this._toggleRowInSelection(id);\n } else {\n this._toggleRowInSelection(id);\n }\n this._selectionAnchor.set(rowIndex);\n this._deps.focusedRowIndex.set(null);\n }\n\n public handleCheckboxChange(row: FormattedTableDataRow<T>): void {\n const id = row.id as T[K & keyof T];\n this._toggleRowInSelection(id);\n const rowIndex = this._deps.viewRows().findIndex(r => r.id === row.id);\n this._selectionAnchor.set(rowIndex);\n this._deps.focusedRowIndex.set(null);\n }\n\n public toggleSelectAll(): void {\n if (this.isAllSelected()) {\n this._deps.selection.set([]);\n } else {\n const dataRows = this._deps\n .viewRows()\n .filter((r): r is FormattedTableDataRow<T> => r.kind === 'data');\n this._deps.selection.set(dataRows.map(r => r.id as T[K & keyof T]));\n }\n }\n\n private _toggleRowInSelection(id: T[K & keyof T]): void {\n const current = this._deps.selection();\n if (this.selectionSet().has(id)) {\n this._deps.selection.set(current.filter(v => v !== id));\n } else {\n this._deps.selection.set([...current, id]);\n }\n }\n\n private _selectRange(fromIndex: number, toIndex: number): void {\n const rows = this._deps.viewRows();\n const start = Math.min(fromIndex, toIndex);\n const end = Math.max(fromIndex, toIndex);\n const rangeIds = rows\n .slice(start, end + 1)\n .filter((r): r is FormattedTableDataRow<T> => r.kind === 'data')\n .map(r => r.id as T[K & keyof T]);\n\n const currentSet = new Set(this._deps.selection());\n for (const id of rangeIds) {\n currentSet.add(id);\n }\n this._deps.selection.set([...currentSet]);\n }\n\n public onKeyDown(event: KeyboardEvent): void {\n const mode = this._deps.selectionMode();\n if (!mode) return;\n\n const rows = this._deps.viewRows();\n if (rows.length === 0) return;\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n event.stopPropagation();\n\n let currentIndex = this._deps.focusedRowIndex();\n if (currentIndex === null && mode === 'single') {\n const sel = this._deps.selection();\n if (sel.length > 0) {\n currentIndex = rows.findIndex(r => r.id === sel[0]);\n }\n }\n currentIndex ??= -1;\n\n const nextIndex =\n event.key === 'ArrowDown'\n ? Math.min(currentIndex + 1, rows.length - 1)\n : Math.max(currentIndex - 1, 0);\n\n this._deps.focusedRowIndex.set(nextIndex);\n this._deps.scrollToIndex(nextIndex);\n this.applyArrowMove(nextIndex, event.shiftKey);\n } else if (event.key === ' ' || event.key === 'Enter') {\n if (mode === 'multi') {\n const focusIdx = this._deps.focusedRowIndex();\n if (focusIdx !== null && rows[focusIdx]) {\n event.preventDefault();\n event.stopPropagation();\n this.toggleCurrentRow(focusIdx);\n }\n }\n }\n }\n\n /**\n * Applies the selection side-effects of an arrow-key move that already set\n * `focusedRowIndex` to `nextIndex` — single mode selects the row and resets\n * the anchor, multi mode with `shiftKey` extends the range from the anchor,\n * multi mode alone only moves focus (a no-op here). No-ops when\n * {@link TableSelectionModelDeps.selectionMode} is `null`. Only called from\n * {@link onKeyDown} — {@link TableRowNavigationModel} deliberately does not\n * recompute or replicate this (it would risk diverging from this model's\n * null-`focusedRowIndex` start-index resolution), and instead defers\n * ArrowUp/Down entirely to {@link onKeyDown} when a row-actions table also\n * has a `selectionMode`.\n */\n private applyArrowMove(nextIndex: number, shiftKey: boolean): void {\n const mode = this._deps.selectionMode();\n if (!mode) return;\n const rows = this._deps.viewRows();\n const row = rows[nextIndex];\n if (!row) return;\n\n if (mode === 'single') {\n this._deps.selection.set([row.id as T[K & keyof T]]);\n this._selectionAnchor.set(nextIndex);\n } else if (shiftKey) {\n const anchor = this._selectionAnchor() ?? nextIndex;\n this._selectRange(anchor, nextIndex);\n }\n }\n\n /**\n * Toggles selection of the row at `index` and sets it as the new anchor —\n * the multi-mode Enter/Space behavior. Only called from {@link onKeyDown};\n * {@link TableRowNavigationModel} defers Enter/Space to it for the same\n * reason as {@link applyArrowMove}.\n */\n public toggleCurrentRow(index: number): void {\n const rows = this._deps.viewRows();\n const row = rows[index];\n if (!row) return;\n this._toggleRowInSelection(row.id as T[K & keyof T]);\n this._selectionAnchor.set(index);\n }\n}\n","import { Component, contentChild, TemplateRef } from '@angular/core';\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\nimport { NgnBase } from '@ngneers/controls/base';\n\nimport type { FormattedTableDataRow } from './types';\n\nexport type GroupHeaderContext = {\n $implicit: {\n groupKey: unknown;\n groupValue: unknown;\n count: number;\n expanded: boolean;\n };\n};\n\n@Component({\n template: '',\n})\nexport abstract class NgnTableTemplates<T extends object> extends NgnBase<'table'> {\n private readonly _headerTemplate = contentChild<TemplateRef<unknown>>('header');\n private readonly _bodyTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.body>>('body');\n private readonly _groupHeaderTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.groupHeader>>('groupHeader');\n\n protected readonly headerTemplate = this._headerTemplate;\n protected readonly bodyTemplate = this._bodyTemplate;\n protected readonly groupHeaderTemplate = this._groupHeaderTemplate;\n\n /**\n * Types for the table templates.\n */\n public readonly templateTypes = templateTypesFn<{\n /**\n * Type of the template variable for the body template.\n */\n body: { $implicit: FormattedTableDataRow<T> };\n /**\n * Type of the template variable for the group header template.\n */\n groupHeader: GroupHeaderContext;\n }>();\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n booleanAttribute,\n viewChild,\n} from '@angular/core';\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { NgnPaginator, type PaginationState } from '@ngneers/controls/paginator';\nimport { NgnScrollShadow } from '@ngneers/controls/scroll-shadow';\nimport { NgnScroller } from '@ngneers/controls/scroller';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { TableColumnLayoutModel } from './table-column-layout-model';\nimport { NgnTableGroupHeaderTr } from './table-group-header-row';\nimport {\n filterRows,\n groupRows,\n paginateRows,\n sortRows,\n type TableSortComparator,\n} from './table-row-model';\nimport { TableRowNavigationModel } from './table-row-navigation-model';\nimport { TableSelectionModel } from './table-selection-model';\nimport { NgnTableTemplates } from './table-templates';\n\nimport type { NgnTableTh } from './table-header-cell';\nimport type { NgnTableRowActions } from './table-row-actions';\nimport type {\n FormattedTableDataRow,\n FormattedTableGroupHeaderRow,\n FormattedTableRow,\n TableSelectionMode,\n} from './types';\nimport type { NgnFilterConfig } from '@ngneers/controls/filter';\nimport type { AllKeysOfUnion } from '@ngneers/controls/utils';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-table',\n templateUrl: './table.html',\n\n imports: [\n NgTemplateOutlet,\n NgnScroller,\n NgnPaginator,\n NgnTemplate,\n NgnPt,\n NgnIcon,\n NgnTableGroupHeaderTr,\n NgnScrollShadow,\n ],\n providers: [provideSelf(NgnTable)],\n host: {\n tabindex: '0',\n '(keydown)': 'onKeyDown($event)',\n },\n})\nexport class NgnTable<\n T extends object,\n K extends keyof T,\n G extends Extract<AllKeysOfUnion<T>, string> = never,\n> extends NgnTableTemplates<T> {\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate, {\n root: true,\n virtual: () => this.virtual(),\n resizing: () => this._columns?.isDragging() ?? false,\n selectable: () => !!this.selectionMode(),\n reorderable: () => this.reorderable(),\n reordering: () => this._columns?.isReordering() ?? false,\n });\n private readonly _scroller = viewChild.required(NgnScroller);\n\n /** The data rows to render. */\n public readonly rows = input.required<readonly T[]>();\n /**\n * When {@link virtual} is enabled, this defines the height of each row in pixels.\n */\n public readonly rowHeight = input<number>();\n /** The key of the property that uniquely identifies each row. */\n public readonly fieldId = input.required<K>();\n /**\n * Whether the table is virtualized. When enabled, provide {@link rowHeight}.\n * @default false\n */\n public readonly virtual = input<boolean>(false);\n /**\n * When {@link virtual} is enabled, the number of extra rows to render above and below the viewport.\n * @default 2\n */\n public readonly virtualPadding = input<number>(2);\n /**\n * Whether to apply alternating background colors to rows.\n * @default false\n */\n public readonly striped = input<boolean>(false);\n /**\n * Whether to render a paginator and page the rows.\n * @default false\n */\n public readonly paginator = input<boolean>(false);\n\n /**\n * The selection mode for the table.\n * - `'single'`: Only one row can be selected at a time.\n * - `'multi'`: Multiple rows can be selected (with Ctrl/Shift click or checkboxes).\n * - `null`: Selection is disabled.\n * @default null\n */\n public readonly selectionMode = input<TableSelectionMode | null>(null);\n\n /**\n * The selected row IDs. Two-way bindable via `[(selection)]`.\n * @default []\n */\n public readonly selection = model<T[K & keyof T][]>([]);\n\n /**\n * Column key to group rows by. Rows with the same value in this column\n * are collected under a collapsible group header.\n * @default null (no grouping)\n */\n public readonly groupBy = input<G | null>(null);\n\n /**\n * Two-way model tracking which groups are currently expanded, identified\n * by their column value. Defaults to `[]` (all collapsed).\n * Pass all group values to start with all groups expanded.\n *\n * Type-safe: when `groupBy` is set, this is typed as `T[G][]` where G\n * is the groupBy column key (inferred by Angular's template type checker).\n */\n public readonly expandedGroups = model<Array<T[G] & (string | number)>>([]);\n\n /**\n * Whether column resizing is enabled.\n * @default false\n */\n public readonly resizable = input(false, { transform: booleanAttribute });\n\n /**\n * The resize distribution mode.\n * - `'adjacent'`: Only columns adjacent to the resize handle change. Total width stays the same.\n * - `'push'`: Column grows/shrinks independently, total width changes (enables horizontal scrolling).\n * @default 'adjacent'\n */\n public readonly resizeMode = input<'adjacent' | 'proportional' | 'push'>('adjacent');\n\n /**\n * Whether to lock affected columns to fixed `px` values after a resize completes.\n *\n * - **`proportional` mode**: when `true`, the resized column stays as `px` (locked);\n * when `false`, it is converted back to `fr` and continues to flex with the container.\n * - **`adjacent` / `push` modes**: when `true`, columns whose size changed are converted\n * to `px`; when `false`, columns keep their original units.\n *\n * @default false\n */\n public readonly lockSizes = input<boolean>(false);\n\n /**\n * Whether column reordering is enabled.\n * @default false\n */\n public readonly reorderable = input(false, { transform: booleanAttribute });\n\n /**\n * The current column order as an array of column identifiers.\n * When empty, the natural registration order (DOM order) is used.\n * Supports two-way binding for persistence.\n */\n public readonly columnOrder = model<string[]>([]);\n\n protected readonly trackById = (item: T): unknown => item[this.fieldId()];\n /**\n * The active sort descriptor (column + direction), or `null` when unsorted. Two-way bindable.\n * @default null\n */\n public readonly sort = model<{\n column: Extract<AllKeysOfUnion<T>, string>;\n direction: 'asc' | 'desc';\n } | null>(null);\n\n /**\n * Optional custom comparator used when `sort` is active. Receives the two rows and the\n * active sort descriptor. When omitted, a default comparator is used (nulls-first on asc,\n * numeric for numbers, `localeCompare` otherwise).\n */\n public readonly sortComparator = input<TableSortComparator<T> | undefined>(undefined);\n\n /**\n * The active per-column filter configuration, keyed by column, or `null` when unfiltered. Two-way bindable.\n * @default null\n */\n public readonly filters = model<\n | {\n [key in Extract<AllKeysOfUnion<T>, string>]?: NgnFilterConfig;\n }\n | null\n >(null);\n protected readonly pageState = signal<PaginationState | null>(null);\n\n protected readonly i18n = inject(I18n).translations;\n /**\n * Polite live-region text announcing sort / filter / pagination / selection\n * changes to assistive tech. Populated by an effect in the constructor.\n */\n protected readonly liveAnnouncement = signal('');\n\n // --- Column layout (geometry, sticky, resize, reorder, auto-size) ---\n\n private readonly _columns: TableColumnLayoutModel = new TableColumnLayoutModel({\n element: this.element,\n resizable: this.resizable,\n reorderable: this.reorderable,\n resizeMode: this.resizeMode,\n lockSizes: this.lockSizes,\n columnOrder: this.columnOrder,\n themeClass: name => this.theme.class(name as Parameters<typeof this.theme.class>[0]),\n });\n\n /**\n * Whether a selection column directive is present in the template.\n * Set automatically by `NgnTableSelectionColumn` — do not set manually.\n */\n public readonly showCheckboxes = this._columns.hasSelectionColumn;\n protected readonly dropIndicatorState = this._columns.dropIndicatorState;\n public readonly columnOrderMap = computed(() => this._columns.columnOrderMap());\n\n /**\n * Grid template columns computed from the resize engine when resizable,\n * otherwise falls back to the standard equal-width repeat.\n */\n public get gridTemplateColumns() {\n return this._columns.gridTemplateColumns;\n }\n\n // --- Selection state ---\n\n /**\n * The single current-row index (index in {@link formattedRows}) for\n * keyboard navigation. Shared by {@link NgnTable}'s selection keyboard\n * handling and row-actions keyboard navigation — arrows move it, and (when\n * {@link selectionMode} is set) selection follows it. Cleared whenever\n * {@link formattedRows} changes identity (sort/filter/rows replaced) so it\n * never points at a stale row.\n */\n public readonly focusedRowIndex = signal<number | null>(null);\n\n private readonly _selection: TableSelectionModel<T, K>;\n\n public readonly headerCheckboxValue: ReturnType<typeof computed<boolean | null>>;\n\n // --- Row actions registry + keyboard navigation ---\n\n private readonly _rowActions = new Map<number, NgnTableRowActions>();\n private readonly _rowNav: TableRowNavigationModel<T>;\n\n /**\n * Total column count including the selection checkbox column.\n */\n protected readonly totalColumnCount = computed(\n () => this._columns.columnCount() + (this._columns.hasSelectionColumn() ? 1 : 0)\n );\n\n protected readonly formattedRows = computed<FormattedTableRow<T>[]>(() => {\n const groupBy = this.groupBy();\n if (groupBy) {\n return this._groupedRows();\n }\n const rows = this._sortedRows();\n return rows.map((data, index) => ({\n kind: 'data' as const,\n id: data[this.fieldId()] as T[keyof T] & (string | number),\n data,\n index,\n }));\n });\n\n private readonly _groupedRows = computed<FormattedTableRow<T>[]>(() => {\n const groupBy = this.groupBy();\n if (!groupBy) return [];\n return groupRows(\n this._sortedRows(),\n groupBy,\n this.fieldId() as keyof T,\n new Set(this.expandedGroups())\n );\n });\n\n protected readonly pagedRows = computed<FormattedTableRow<T>[]>(() => {\n if (!this.paginator()) {\n return this.formattedRows();\n }\n return [...paginateRows(this.formattedRows(), this.pageState())];\n });\n\n private readonly _filteredRows = computed<readonly T[]>(() =>\n filterRows(this.rows() as readonly T[], this.filters())\n );\n\n private readonly _sortedRows = computed<readonly T[]>(() =>\n sortRows(this._filteredRows(), this.sort(), this.sortComparator())\n );\n\n constructor() {\n super();\n\n this._selection = new TableSelectionModel<T, K>({\n viewRows: this.formattedRows,\n selectionMode: this.selectionMode,\n fieldId: this.fieldId,\n selection: this.selection,\n focusedRowIndex: this.focusedRowIndex,\n scrollToIndex: index => this._scroller().scrollToIndex(index),\n });\n\n this._rowNav = new TableRowNavigationModel<T>({\n viewRows: this.formattedRows,\n hasActions: () => this._rowActions.size > 0,\n focusedRowIndex: this.focusedRowIndex,\n selectionMode: this.selectionMode,\n scrollToIndex: index => this._scroller().scrollToIndex(index),\n enterActions: index => this.getRowActions(index)?.focusFirstAction() ?? false,\n moveAction: (index, delta) => this.getRowActions(index)?.moveAction(delta) ?? false,\n openMenu: index => this.getRowActions(index)?.openMenuFromKeyboard() ?? false,\n focusHost: () => this.element.nativeElement.focus(),\n });\n\n this.headerCheckboxValue = computed<boolean | null>(() =>\n this._selection.headerCheckboxValue()\n );\n\n // Minor #3: clear the current-row highlight whenever the underlying row\n // set changes identity (sort/filter/rows replaced), so it never lingers\n // on a stale index. Only reads `formattedRows` as a dependency — the\n // writes below must not be read here, or this effect would re-run on its\n // own writes and clobber every keyboard row move.\n effect(() => {\n this.formattedRows();\n this.focusedRowIndex.set(null);\n this._rowNav.inActions.set(false);\n });\n\n // A11y: announce sort / filter / pagination / selection changes through a\n // polite live region — none of these are otherwise conveyed to assistive\n // tech. Only the aspect that actually changed is announced (checked in\n // priority order), and the first run only seeds the baselines. Writes only\n // `liveAnnouncement`, which it never reads, so it cannot re-trigger itself.\n let seeded = false;\n let prevSort = '';\n let prevFilterCount = 0;\n let prevPageKey = '';\n let prevSelCount = 0;\n effect(() => {\n const sort = this.sort();\n const filterCount = this._filteredRows().length;\n const page = this.pageState();\n const selCount = this.selection().length;\n\n const sortKey = sort ? `${sort.column}:${sort.direction}` : '';\n const pageKey = page ? `${page.page.current}/${page.page.size}` : '';\n\n if (!seeded) {\n seeded = true;\n [prevSort, prevFilterCount, prevPageKey, prevSelCount] = [\n sortKey,\n filterCount,\n pageKey,\n selCount,\n ];\n return;\n }\n\n let message = '';\n if (filterCount !== prevFilterCount) {\n message = this.i18n['table_resultCount']({ count: filterCount });\n } else if (sortKey !== prevSort) {\n message = sort\n ? this.i18n['table_sortedBy']({\n column: sort.column,\n direction:\n this.i18n[\n sort.direction === 'asc' ? 'table_sortAscending' : 'table_sortDescending'\n ](),\n })\n : this.i18n['table_sortCleared']();\n } else if (pageKey !== prevPageKey) {\n const size = page?.page.size ?? 0;\n const pages = size > 0 ? Math.ceil(filterCount / size) : 1;\n message = this.i18n['table_page']({ page: (page?.page.current ?? 0) + 1, pages });\n } else if (selCount !== prevSelCount) {\n message = this.i18n['table_selectedCount']({ count: selCount, total: this.rows().length });\n }\n\n [prevSort, prevFilterCount, prevPageKey, prevSelCount] = [\n sortKey,\n filterCount,\n pageKey,\n selCount,\n ];\n if (message) {\n this.liveAnnouncement.set(message);\n }\n });\n }\n\n protected pageChanged(event: PaginationState) {\n this.pageState.set(event);\n }\n\n public column<V extends AllKeysOfUnion<T> & string>(column: V): V {\n return column;\n }\n\n // --- Column registration / geometry (delegated to TableColumnLayoutModel) ---\n\n public getVisualColumnIndex(logicalIndex: number): number {\n return this._columns.getVisualColumnIndex(logicalIndex);\n }\n\n public getRegisteredHeaderCells(): readonly NgnTableTh[] {\n return this._columns.getRegisteredHeaderCells();\n }\n\n public getStickyInfo(\n columnId: string\n ): { side: 'start' | 'end'; index: number; isEdge: boolean } | null {\n return this._columns.getStickyInfo(columnId);\n }\n\n public registerHeaderCell(cell: NgnTableTh): void {\n this._columns.registerHeaderCell(cell);\n }\n\n public unregisterHeaderCell(cell: NgnTableTh): void {\n this._columns.unregisterHeaderCell(cell);\n }\n\n public registerSelectionColumn(): void {\n this._columns.registerSelectionColumn();\n }\n\n public unregisterSelectionColumn(): void {\n this._columns.unregisterSelectionColumn();\n }\n\n public registerStickyColumn(columnId: string, side: 'start' | 'end'): void {\n this._columns.registerStickyColumn(columnId, side);\n }\n\n public unregisterStickyColumn(columnId: string): void {\n this._columns.unregisterStickyColumn(columnId);\n }\n\n // --- Resize operations (called by NgnTableTh) ---\n\n public startColumnResize(columnIndex: number, event: PointerEvent): void {\n this._columns.startColumnResize(columnIndex, event);\n }\n\n public dragColumnResize(columnIndex: number, event: PointerEvent): void {\n this._columns.dragColumnResize(columnIndex, event);\n }\n\n public endColumnResize(columnIndex: number, cancel: boolean): void {\n this._columns.endColumnResize(columnIndex, cancel);\n }\n\n public autoSizeColumn(columnIndex: number): void {\n this._columns.autoSizeColumn(columnIndex);\n }\n\n // --- Reorder operations (called by NgnTableReorderableColumn) ---\n\n public getReorderBounds(columnId: string): { min: number; max: number } {\n return this._columns.getReorderBounds(columnId);\n }\n\n public startColumnReorder(columnId: string): void {\n this._columns.startColumnReorder(columnId);\n }\n\n public dragColumnReorder(event: PointerEvent): void {\n this._columns.dragColumnReorder(event);\n }\n\n public endColumnReorder(cancel: boolean): void {\n this._columns.endColumnReorder(cancel);\n }\n\n public getReorderSourceColumnId(): string | null {\n return this._columns.getReorderSourceColumnId();\n }\n\n // --- Selection operations ---\n\n public isRowSelected(id: T[keyof T] & (string | number)): boolean {\n return this._selection.isRowSelected(id);\n }\n\n public handleRowClick(row: FormattedTableDataRow<T>, event: MouseEvent): void {\n this._selection.handleRowClick(row, event);\n }\n\n public handleCheckboxChange(row: FormattedTableDataRow<T>): void {\n this._selection.handleCheckboxChange(row);\n }\n\n public toggleSelectAll(): void {\n this._selection.toggleSelectAll();\n }\n\n // --- Row actions registry ---\n\n /**\n * Registers a row's {@link NgnTableRowActions} directive keyed by its row\n * index, so keyboard navigation can look up the active row's actions.\n * Called by `NgnTableRowActions`; not intended for manual use.\n */\n public registerRowActions(index: number, dir: NgnTableRowActions): void {\n this._rowActions.set(index, dir);\n }\n\n /**\n * Unregisters a row's actions directive. Called by `NgnTableRowActions`.\n * Only removes the entry if `dir` is still the registered owner for\n * `index`, so a stale unregister (e.g. after row recycling re-registered\n * a different instance at the same index) cannot clobber it.\n */\n public unregisterRowActions(index: number, dir: NgnTableRowActions): void {\n if (this._rowActions.get(index) === dir) this._rowActions.delete(index);\n }\n\n /** Looks up the registered actions directive for a row index, if any. */\n public getRowActions(index: number): NgnTableRowActions | undefined {\n return this._rowActions.get(index);\n }\n\n /**\n * Whether keyboard focus is currently inside the action bar of the row at\n * `index` — i.e. this row is both the current row and\n * {@link TableRowNavigationModel.inActions}. Drives the `active-row`\n * highlight in {@link NgnTableBodyTr}.\n */\n public isRowInActions(index: number): boolean {\n return this._rowNav.inActions() && this.focusedRowIndex() === index;\n }\n\n // --- Keyboard navigation ---\n\n protected onKeyDown(event: KeyboardEvent): void {\n if (this._rowNav.onKeyDown(event)) return;\n if (this._rowNav.inActions()) return; // focus is in a row's action bar — selection must not handle keys\n this._selection.onKeyDown(event);\n }\n\n // --- Row grouping ---\n\n /**\n * Toggle the expanded state of a group identified by its column value.\n */\n public toggleGroup(groupKey: T[G] & (string | number)): void {\n const current = this.expandedGroups();\n if (current.includes(groupKey)) {\n this.expandedGroups.set(current.filter(k => k !== groupKey));\n } else {\n this.expandedGroups.set([...current, groupKey]);\n }\n }\n\n /**\n * Toggle a group from a group-header row. Used in the template where\n * the scroller item type cannot carry the `G` generic.\n * @internal\n */\n protected toggleGroupFromRow(row: FormattedTableGroupHeaderRow): void {\n this.toggleGroup(row.groupKey as T[G] & (string | number));\n }\n}\n","<span\n aria-live=\"polite\"\n aria-atomic=\"true\"\n style=\"\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n \"\n >{{ liveAnnouncement() }}</span\n>\n<table\n #scrollContainer\n role=\"grid\"\n ngnScrollShadow=\"horizontal\"\n [ptInt]=\"this\"\n [ptClass]=\"{ table: true, striped: striped() }\"\n [attr.aria-multiselectable]=\"selectionMode() === 'multi' ? true : null\"\n [attr.aria-rowcount]=\"formattedRows().length\"\n [style.--ngn-table-column-count]=\"totalColumnCount()\"\n [style.--ngn-table-selection-offset]=\"showCheckboxes() ? 1 : 0\"\n [style.grid-template-columns]=\"gridTemplateColumns()\"\n [style.--ngn-table-row-height.px]=\"rowHeight()\"\n>\n <thead role=\"rowgroup\" [ptInt]=\"this\" [ptClass]=\"'head'\">\n <ng-container [ngTemplateOutlet]=\"headerTemplate()\"></ng-container>\n </thead>\n @if (dropIndicatorState()) {\n <div\n [ptInt]=\"this\"\n [ptClass]=\"'drop-indicator'\"\n [style.left.px]=\"dropIndicatorState()!.leftPx\"\n [style.top.px]=\"dropIndicatorState()!.topPx\"\n [style.height.px]=\"dropIndicatorState()!.heightPx\"\n ></div>\n }\n\n <tbody\n role=\"rowgroup\"\n [ptInt]=\"this\"\n [ptClass]=\"'body'\"\n [ptDep]=\"'scroller'\"\n ngn-scroller\n #scroller\n [scrollContainer]=\"scrollContainer\"\n [virtual]=\"virtual()\"\n [items]=\"pagedRows()\"\n [fieldId]=\"'id'\"\n [itemHeight]=\"rowHeight() || 0\"\n [virtualPadding]=\"virtualPadding()\"\n [style.--ngn-table-item-start-index]=\"scroller.itemStartIndex()\"\n >\n <ng-template #item [ngnTemplate]=\"scroller.templateTypes.item\" let-item let-index=\"index\">\n @if (item.kind === 'group-header') {\n @if (groupHeaderTemplate(); as customGroupHeader) {\n <ng-container\n [ngTemplateOutlet]=\"customGroupHeader\"\n [ngTemplateOutletContext]=\"{\n $implicit: {\n groupKey: item.groupKey,\n groupValue: item.groupValue,\n count: item.count,\n expanded: item.expanded,\n },\n }\"\n ></ng-container>\n } @else {\n <tr\n [ngnTableGroupHeaderTr]=\"item\"\n [class]=\"theme.classes({ 'group-expanded': item.expanded })\"\n [attr.aria-expanded]=\"item.expanded\"\n role=\"row\"\n (click)=\"toggleGroupFromRow(item)\"\n >\n <td [class]=\"theme.class('group-header-cell')\" role=\"gridcell\">\n <ngn-icon\n [ptInt]=\"this\"\n [ptClass]=\"'group-toggle'\"\n [ptDep]=\"'group-toggle-icon'\"\n [defaultIcon]=\"'table-group-toggle'\"\n />\n <span>{{ item.groupValue }}</span>\n <span>({{ item.count }})</span>\n </td>\n </tr>\n }\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"bodyTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n ></ng-container>\n }\n </ng-template>\n </tbody>\n</table>\n@if (paginator()) {\n <ngn-paginator\n [ptInt]=\"this\"\n [ptDep]=\"'paginator'\"\n [totalItems]=\"rows().length\"\n (value)=\"pageChanged($event)\"\n />\n}\n","import {\n afterNextRender,\n afterRenderEffect,\n computed,\n Directive,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstance } from '@ngneers/controls/base';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\n\n/**\n * Lightweight body-cell directive. Deliberately does **not** extend `NgnBase`:\n * a `<td>` is instantiated once per cell (thousands per table), so it avoids the\n * per-control overhead (kind/color effects, `viewChildren` query, theme kind/color\n * injection, leave-animation hooks). It only does what a cell needs — apply the\n * `cell` class, expose its visual column index, and mirror sticky positioning.\n */\n@Directive({\n selector: '[ngnTableTd]',\n host: { role: 'gridcell', '[style.--ngn-table-column-index]': '_visualColumnIndex()' },\n})\nexport class NgnTableTd {\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _table = signal<NgnTable<any, any> | null>(null);\n\n /** 0-based logical (DOM) index of this cell within its row. */\n private readonly _logicalIndex = signal(0);\n\n /** 1-based visual column index, remapped through the table's column order. */\n protected readonly _visualColumnIndex = computed(() => {\n const logicalIndex = this._logicalIndex();\n const table = this._table();\n if (table) {\n // Subtract the selection column offset so DOM index aligns with registered header cells.\n const offset = table.showCheckboxes() ? 1 : 0;\n return table.getVisualColumnIndex(logicalIndex - offset);\n }\n return logicalIndex + 1;\n });\n\n private readonly _columnId = computed(() => {\n const table = this._table();\n if (!table) return null;\n const offset = table.showCheckboxes() ? 1 : 0;\n const logicalIndex = this._logicalIndex() - offset;\n const cells = table.getRegisteredHeaderCells();\n return cells[logicalIndex]?.ngnTableTh() ?? null;\n });\n\n private readonly _stickyInfo = computed(() => {\n const table = this._table();\n const columnId = this._columnId();\n if (!table || !columnId) return null;\n return table.getStickyInfo(columnId);\n });\n\n constructor() {\n this.prepareDom();\n const el = this._element.nativeElement;\n const parent = el.parentElement?.children;\n if (parent) {\n const index = Array.from(parent).findIndex(child => child === el);\n this._logicalIndex.set(index);\n }\n\n afterNextRender(() => {\n const table = getNearestNgnInstance(el, NgnTable) as NgnTable<any, any> | null;\n this._table.set(table);\n });\n\n afterRenderEffect(() => {\n const info = this._stickyInfo();\n const el = this._element.nativeElement;\n toggleClass(el, this.theme.class('sticky-start'), info?.side === 'start');\n toggleClass(el, this.theme.class('sticky-end'), info?.side === 'end');\n toggleClass(el, this.theme.class('sticky-start-edge'), info?.side === 'start' && info.isEdge);\n toggleClass(el, this.theme.class('sticky-end-edge'), info?.side === 'end' && info.isEdge);\n\n if (info) {\n el.style.position = 'sticky';\n if (info.side === 'start') {\n el.style.left = `var(--ngn-sticky-start-offset-${info.index})`;\n el.style.removeProperty('right');\n } else {\n el.style.right = `var(--ngn-sticky-end-offset-${info.index})`;\n el.style.removeProperty('left');\n }\n } else {\n el.style.removeProperty('position');\n el.style.removeProperty('left');\n el.style.removeProperty('right');\n }\n });\n }\n\n private prepareDom() {\n toggleClass(this._element.nativeElement, this.theme.class('cell'), true);\n }\n}\n","import {\n afterNextRender,\n afterRenderEffect,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n model,\n type OnDestroy,\n type OnInit,\n Renderer2,\n signal,\n type Signal,\n} from '@angular/core';\nimport { getNearestNgnInstance, NgnBase } from '@ngneers/controls/base';\nimport { NgnError, toggleClass } from '@ngneers/controls/utils';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\n\nimport type { ResizableItem, ResizeLimit, ResizeSize } from '@ngneers/controls/api/resize';\n\n@Directive({\n selector: '[ngnTableTh]',\n host: {\n role: 'columnheader',\n '[style.--ngn-table-column-index]': '_visualColumnIndex()',\n },\n})\nexport class NgnTableTh extends NgnBase<'table'> implements ResizableItem, OnDestroy, OnInit {\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\n private _table?: NgnTable<any, any>;\n private readonly _tableSignal = signal<NgnTable<any, any> | null>(null);\n private _resizeHandle?: HTMLDivElement;\n\n /** The unique column identifier for this header cell, used for sorting, filtering, sticky, and reorder. */\n public readonly ngnTableTh = input.required<string>();\n\n /**\n * The size of this column (e.g. '1fr', '200px', '25%').\n * @default '1fr'\n */\n public readonly size = model<ResizeSize>('1fr');\n\n /**\n * The minimum size constraint for this column.\n * @default '50px'\n */\n public readonly minSize: Signal<ResizeLimit> = input<ResizeLimit>('50px');\n\n /**\n * The maximum size constraint for this column.\n * @default '100%'\n */\n public readonly maxSize: Signal<ResizeLimit> = input<ResizeLimit>('100%');\n\n /**\n * Whether this column is resizable. Computed from the parent table's `resizable` input.\n */\n public readonly resizable = computed(() => this._table?.resizable() ?? false);\n\n /**\n * Whether the resize handle should be shown. Hidden for the last column in adjacent\n * and proportional modes since it is implicitly resized via the previous column's handle.\n * Push mode shows handles on all columns since each column grows independently.\n */\n private readonly _showHandle = computed(() => {\n if (!this._table?.resizable()) return false;\n if (this._table.resizeMode() === 'push') return true;\n // Adjacent & proportional: hide handle on last column\n const cells = this._table.getRegisteredHeaderCells();\n return cells.indexOf(this) < cells.length - 1;\n });\n\n /**\n * 1-based visual column index, derived from the table's column order map.\n * Falls back to registration index + 1 when no reordering is active.\n */\n public readonly _visualColumnIndex = computed(() => {\n if (!this._table) return undefined;\n const map = this._table.columnOrderMap();\n return map.get(this.ngnTableTh()) ?? this.getColumnIndex() + 1;\n });\n\n constructor() {\n super();\n this.prepareDom();\n\n const renderer = inject(Renderer2);\n const elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n afterNextRender(() => {\n // Wrap existing content in a text container for ellipsis support\n const textWrapper = renderer.createElement('span');\n textWrapper.classList.add(this.theme.class('cell-text'));\n const el = elRef.nativeElement;\n while (el.firstChild) {\n textWrapper.appendChild(el.firstChild);\n }\n el.appendChild(textWrapper);\n\n // Move dynamically-created controls back out of the text wrapper\n // so they participate in the header cell's flex layout (order: 2, 3)\n const filterControl = textWrapper.querySelector(`.${this.theme.class('filter-control')}`);\n if (filterControl) el.appendChild(filterControl);\n const sortControl = textWrapper.querySelector(`.${this.theme.class('sort-control')}`);\n if (sortControl) el.appendChild(sortControl);\n\n // Spacer div for flex layout\n const spacer = renderer.createElement('div');\n spacer.classList.add(this.theme.class('spacer'));\n elRef.nativeElement.appendChild(spacer);\n\n // Resize handle\n this._resizeHandle = renderer.createElement('div') as HTMLDivElement;\n this._resizeHandle.classList.add(this.theme.class('resize-handle'));\n this._resizeHandle.addEventListener('pointerdown', this.onResizePointerDown);\n this._resizeHandle.addEventListener('dblclick', this.onResizeDblClick);\n elRef.nativeElement.appendChild(this._resizeHandle);\n });\n\n // Toggle handle visibility based on mode and column position\n afterRenderEffect(() => {\n const show = this._showHandle();\n if (this._resizeHandle) {\n this._resizeHandle.style.display = show ? '' : 'none';\n }\n });\n\n // Sticky column classes and offsets\n afterRenderEffect(() => {\n const table = this._tableSignal();\n if (!table) return;\n const info = table.getStickyInfo(this.ngnTableTh());\n const el = this.element.nativeElement;\n toggleClass(el, this.theme.class('sticky-start'), info?.side === 'start');\n toggleClass(el, this.theme.class('sticky-end'), info?.side === 'end');\n toggleClass(el, this.theme.class('sticky-start-edge'), info?.side === 'start' && info.isEdge);\n toggleClass(el, this.theme.class('sticky-end-edge'), info?.side === 'end' && info.isEdge);\n\n if (info) {\n el.style.position = 'sticky';\n if (info.side === 'start') {\n el.style.left = `var(--ngn-sticky-start-offset-${info.index})`;\n el.style.removeProperty('right');\n } else {\n el.style.right = `var(--ngn-sticky-end-offset-${info.index})`;\n el.style.removeProperty('left');\n }\n } else {\n el.style.removeProperty('position');\n el.style.removeProperty('left');\n el.style.removeProperty('right');\n }\n });\n }\n\n public ngOnInit(): void {\n const table = getNearestNgnInstance(this.element.nativeElement, NgnTable<any, any>);\n if (!table) {\n throw new NgnError('ngnTableTh', 'ngnTableTh must be used within an NgnTable component');\n }\n this._table = table;\n this._tableSignal.set(table);\n this._table.registerHeaderCell(this);\n }\n\n public ngOnDestroy(): void {\n this._table?.unregisterHeaderCell(this);\n this._resizeHandle?.removeEventListener('pointerdown', this.onResizePointerDown);\n this._resizeHandle?.removeEventListener('dblclick', this.onResizeDblClick);\n }\n\n private prepareDom() {\n toggleClass(this.element.nativeElement, this.theme.class('cell'), true);\n toggleClass(this.element.nativeElement, this.theme.class('resizable'), true);\n }\n\n private readonly onResizeDblClick = (event: MouseEvent) => {\n if (!this._table?.resizable()) return;\n event.preventDefault();\n event.stopPropagation();\n const columnIndex = this.getColumnIndex();\n if (columnIndex < 0) return;\n this._table.autoSizeColumn(columnIndex);\n };\n\n private readonly onResizePointerDown = (event: PointerEvent) => {\n if (!this._table?.resizable()) return;\n event.preventDefault();\n event.stopPropagation();\n\n const target = event.target as HTMLElement;\n try {\n target.setPointerCapture(event.pointerId);\n } catch {\n // Ignore\n }\n\n const columnIndex = this.getColumnIndex();\n if (columnIndex < 0) return;\n\n this._table.startColumnResize(columnIndex, event);\n\n const onPointerMove = (e: PointerEvent) => {\n this._table!.dragColumnResize(columnIndex, e);\n };\n const cleanup = (cancel: boolean) => {\n this._table!.endColumnResize(columnIndex, cancel);\n target.removeEventListener('pointermove', onPointerMove);\n target.removeEventListener('pointerup', onPointerUp);\n target.removeEventListener('pointercancel', onPointerCancel);\n };\n const onPointerUp = () => cleanup(false);\n const onPointerCancel = () => cleanup(true);\n\n target.addEventListener('pointermove', onPointerMove);\n target.addEventListener('pointerup', onPointerUp);\n target.addEventListener('pointercancel', onPointerCancel);\n };\n\n private getColumnIndex(): number {\n if (!this._table) return -1;\n const cells = this._table.getRegisteredHeaderCells();\n return cells.indexOf(this);\n }\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\nimport { NgnBase } from '@ngneers/controls/base';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\n@Directive({ selector: '[ngnTableHeadTr]', host: { role: 'row', '[attr.aria-rowindex]': '1' } })\nexport class NgnTableHeadTr extends NgnBase<'table'> {\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\n private readonly _element = inject(ElementRef<HTMLElement>);\n\n constructor() {\n super();\n this.prepareDom();\n }\n\n private prepareDom() {\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\n }\n}\n","import {\n afterNextRender,\n Directive,\n ElementRef,\n inject,\n type OnDestroy,\n Type,\n} from '@angular/core';\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\nimport { NgnTableTh } from './table-header-cell';\n\n/** Minimum distance in pixels before a drag is initiated. */\nconst REORDER_DEAD_ZONE_PX = 5;\n\n/**\n * @category directive\n */\n@Directive({\n selector: '[ngnTableReorderableColumn]',\n})\nexport class NgnTableReorderableColumn implements OnDestroy {\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _headerCell = inject(NgnTableTh);\n private readonly _columnId = this._headerCell.ngnTableTh;\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n\n private _isDragging = false;\n private _startX = 0;\n private _startY = 0;\n private _pointerId: number | null = null;\n private _boundOnPointerMove: ((e: PointerEvent) => void) | null = null;\n private _boundOnPointerUp: (() => void) | null = null;\n private _boundOnPointerCancel: (() => void) | null = null;\n private _boundOnKeyDown: ((e: KeyboardEvent) => void) | null = null;\n\n constructor() {\n afterNextRender(() => {\n const el = this._element.nativeElement;\n el.addEventListener('pointerdown', this.onPointerDown);\n });\n }\n\n public ngOnDestroy(): void {\n this._element.nativeElement.removeEventListener('pointerdown', this.onPointerDown);\n this.cleanup();\n }\n\n private readonly onPointerDown = (event: PointerEvent) => {\n const table = this._table();\n if (!table?.reorderable()) return;\n\n // Don't intercept resize handle clicks\n const target = event.target as HTMLElement;\n if (target.classList.contains(this.theme.class('resize-handle'))) return;\n\n event.preventDefault();\n\n this._startX = event.clientX;\n this._startY = event.clientY;\n this._isDragging = false;\n this._pointerId = event.pointerId;\n\n try {\n this._element.nativeElement.setPointerCapture(event.pointerId);\n } catch {\n // Ignore\n }\n\n this._boundOnPointerMove = (e: PointerEvent) => this.onPointerMove(e);\n this._boundOnPointerUp = () => this.onPointerUp();\n this._boundOnPointerCancel = () => this.onPointerCancel();\n this._boundOnKeyDown = (e: KeyboardEvent) => this.onKeyDown(e);\n\n this._element.nativeElement.addEventListener('pointermove', this._boundOnPointerMove);\n this._element.nativeElement.addEventListener('pointerup', this._boundOnPointerUp);\n this._element.nativeElement.addEventListener('pointercancel', this._boundOnPointerCancel);\n document.addEventListener('keydown', this._boundOnKeyDown);\n };\n\n private onPointerMove(event: PointerEvent): void {\n if (!this._isDragging) {\n const deltaX = event.clientX - this._startX;\n const deltaY = event.clientY - this._startY;\n const distance = Math.sqrt(deltaX ** 2 + deltaY ** 2);\n if (distance < REORDER_DEAD_ZONE_PX) return;\n\n // Start dragging\n this._isDragging = true;\n const table = this._table();\n table?.startColumnReorder(this._columnId());\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), true);\n }\n\n this._table()?.dragColumnReorder(event);\n }\n\n private onPointerUp(): void {\n if (this._isDragging) {\n this._table()?.endColumnReorder(false);\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\n }\n this.cleanup();\n }\n\n private onPointerCancel(): void {\n if (this._isDragging) {\n this._table()?.endColumnReorder(true);\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\n }\n this.cleanup();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this._isDragging) {\n this._table()?.endColumnReorder(true);\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\n this.cleanup();\n }\n }\n\n private cleanup(): void {\n this._isDragging = false;\n if (this._pointerId != null) {\n try {\n this._element.nativeElement.releasePointerCapture(this._pointerId);\n } catch {\n // Ignore — capture may already be released\n }\n this._pointerId = null;\n }\n if (this._boundOnPointerMove) {\n this._element.nativeElement.removeEventListener('pointermove', this._boundOnPointerMove);\n this._boundOnPointerMove = null;\n }\n if (this._boundOnPointerUp) {\n this._element.nativeElement.removeEventListener('pointerup', this._boundOnPointerUp);\n this._boundOnPointerUp = null;\n }\n if (this._boundOnPointerCancel) {\n this._element.nativeElement.removeEventListener('pointercancel', this._boundOnPointerCancel);\n this._boundOnPointerCancel = null;\n }\n if (this._boundOnKeyDown) {\n document.removeEventListener('keydown', this._boundOnKeyDown);\n this._boundOnKeyDown = null;\n }\n }\n}\n","import { computed, Directive, effect, ElementRef, inject, input, Type } from '@angular/core';\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { NgnScrollerItem } from '@ngneers/controls/scroller';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { setInputSignalValue } from '@ngneers/controls/utils-ng';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\n\nimport type { FormattedTableDataRow } from './types';\n\n@Directive({\n selector: '[ngnTableBodyTr]',\n host: {\n '[attr.aria-rowindex]': 'ngnTableBodyTr().index + 2',\n '[style.--ngn-table-row-index]': 'ngnTableBodyTr().index + 2',\n '[class]': `theme.classes({\n 'even': ngnTableBodyTr().index % 2 === 0,\n 'selected-row': selected(),\n 'focused-row': focused(),\n 'active-row': active()\n })`,\n '[attr.aria-selected]': 'selectable() ? selected() : null',\n role: 'row',\n '(click)': 'onRowClick($event)',\n },\n})\nexport class NgnTableBodyTr<T> extends NgnScrollerItem {\n /** The formatted data row this `<tr>` renders. */\n public readonly ngnTableBodyTr = input.required<FormattedTableDataRow<T>>();\n /** The item bound to the underlying scroller entry; kept in sync with {@link ngnTableBodyTr}. */\n public override readonly ngnScrollerItem = input<object>({});\n private readonly _element = inject(ElementRef<HTMLElement>);\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n\n protected readonly selectable = computed(() => !!this._table()?.selectionMode());\n\n protected readonly selected = computed(() => {\n const table = this._table();\n if (!table || !table.selectionMode()) return false;\n const row = this.ngnTableBodyTr();\n return table.isRowSelected(row.id);\n });\n\n /**\n * Whether this row is the table's single current-row for keyboard\n * navigation ({@link NgnTable.focusedRowIndex}). Tracks selection keyboard\n * nav when {@link NgnTable.selectionMode} is set, and also tracks\n * row-actions keyboard nav on non-selectable tables that have row actions,\n * so a keyboard user always sees which row is current.\n */\n protected readonly focused = computed(() => {\n const table = this._table();\n if (!table) return false;\n return table.focusedRowIndex() === this.ngnTableBodyTr().index;\n });\n\n /** Whether this row's action bar currently has DOM focus. */\n protected readonly active = computed(() => {\n const table = this._table();\n if (!table) return false;\n return table.isRowInActions(this.ngnTableBodyTr().index);\n });\n\n constructor() {\n super();\n effect(() => {\n const row = this.ngnTableBodyTr();\n setInputSignalValue(this.ngnScrollerItem, row);\n });\n this.prepareDom();\n }\n\n private prepareDom() {\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\n }\n\n protected onRowClick(event: MouseEvent): void {\n const table = this._table();\n if (!table || !table.selectionMode()) return;\n table.handleRowClick(this.ngnTableBodyTr(), event);\n }\n}\n","import type { NgnActionButtonConfig, NgnActionItem } from '@ngneers/controls/api';\n\n/** Whether an action opens a submenu rather than firing a leaf callback. */\nexport function hasChildren(item: NgnActionItem): boolean {\n return !!item.children && item.children.length > 0;\n}\n\n/**\n * Adapts an {@link NgnActionItem} (the context-menu shape) to the\n * {@link NgnActionButtonConfig} that `ngn-action-button` consumes. Icon-only\n * rendering (`kind: 'icon'`) is chosen when the item has an icon, so the label\n * becomes the button's tooltip / accessible name.\n */\nexport function actionItemToButtonConfig(item: NgnActionItem): NgnActionButtonConfig<string> {\n return {\n label: item.label,\n value: item.id,\n icon: item.icon,\n kind: item.icon ? 'icon' : undefined,\n disabled: item.disabled,\n testId: item.testId,\n action: () => item.callback?.(),\n };\n}\n","import {\n ComponentRef,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n type OnDestroy,\n type Signal,\n ViewContainerRef,\n viewChildren,\n} from '@angular/core';\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\nimport { NgnActionButton } from '@ngneers/controls/button';\nimport { NgnMenu, openMenuAt } from '@ngneers/controls/menu';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { actionItemToButtonConfig, hasChildren } from './action-item-mapping';\n\nimport type { NgnActionButtonConfig, NgnActionItem } from '@ngneers/controls/api';\n\ntype BarAction = {\n item: NgnActionItem;\n config: NgnActionButtonConfig<string>;\n hasChildren: boolean;\n};\n\n/**\n * Inline row-actions bar: renders each {@link NgnActionItem} as an\n * `ngn-action-button`. An action with `children` opens a submenu popover\n * anchored to its own button — the anchor is resolved from the rendered\n * button element itself, never from a `testId` lookup, so it keeps working\n * even when an action has no `testId`. Positioning/visibility is applied by\n * the table theme via the `row-actions` class; this component only renders\n * the buttons.\n */\n@Component({\n selector: 'ngn-table-row-actions-bar',\n imports: [NgnActionButton],\n template: `\n @for (action of barActions(); track action.item.id) {\n <ngn-action-button\n [config]=\"action.config\"\n [inline]=\"true\"\n [attr.aria-haspopup]=\"action.hasChildren ? 'menu' : null\"\n (clicked)=\"onClicked(action)\"\n />\n }\n `,\n host: {\n '[class]': `theme.class('row-actions')`,\n role: 'presentation',\n '(click)': 'onBarClick($event)',\n },\n})\nexport class NgnTableRowActionsBar implements OnDestroy {\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _vcr = inject(ViewContainerRef);\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private _menu?: ComponentRef<NgnMenu>;\n\n // One host `ElementRef` per rendered `ngn-action-button`, in the same order\n // as `barActions()`. Reading the native `<button>` off these refs is the\n // robust anchor for the submenu popover — it doesn't depend on the action\n // having a `testId`. The accessible name itself is owned by `NgnTooltip`\n // (via `ngnTooltipAutoAriaMode=\"label\"` on `action-button.html`), not this\n // component.\n private readonly _buttonHosts = viewChildren(NgnActionButton, { read: ElementRef });\n\n /**\n * The actions to render as buttons. Used for standalone consumers that bind\n * an array directly. When {@link actionsSource} is provided (the directive\n * mounts the bar imperatively), that signal takes precedence.\n */\n public readonly actions = input<NgnActionItem[]>([]);\n\n /**\n * A reactive source of actions. Preferred over {@link actions} when set:\n * the host directive passes its own `actions` input signal here so the bar\n * reads it lazily during its own change detection. This avoids the directive\n * imperatively re-pushing the array every change-detection pass — which, when\n * a consumer binds a fresh array each pass (e.g. `actionsFor(row)`), would\n * otherwise loop into infinite change detection (NG0103).\n * @internal\n */\n public readonly actionsSource = input<Signal<NgnActionItem[]> | null>(null);\n\n protected readonly barActions = computed<BarAction[]>(() => {\n const source = this.actionsSource();\n const items = source ? source() : this.actions();\n return items.map(item => ({\n item,\n config: actionItemToButtonConfig(item),\n hasChildren: hasChildren(item),\n }));\n });\n\n public ngOnDestroy(): void {\n this._menu?.destroy();\n }\n\n // Single source of truth for the rendered `<button>` elements, in bar order:\n // derived from the `_buttonHosts()` view query (same as the submenu anchor\n // uses), rather than a parallel `querySelectorAll` — so focus navigation and\n // anchoring can never drift apart.\n private readonly _buttons = (): HTMLButtonElement[] =>\n this._buttonHosts()\n .map(host => this._buttonElement(host))\n .filter((b): b is HTMLButtonElement => b !== null);\n\n /** Focuses the first enabled action button. Returns whether one was focused. */\n public focusFirst(): boolean {\n const btn = this._buttons().find(b => !b.disabled);\n btn?.focus();\n return !!btn;\n }\n\n /**\n * Moves focus by `delta` among the rendered action buttons. Returns whether\n * focus stayed within the bar — `false` when the move would go past the\n * first/last button, in which case focus is left unchanged.\n */\n public move(delta: 1 | -1): boolean {\n const buttons = this._buttons();\n const active = document.activeElement;\n const idx = buttons.findIndex(b => b === active);\n const next = idx + delta;\n if (next < 0 || next >= buttons.length) return false;\n buttons[next]?.focus();\n return true;\n }\n\n /**\n * Stops a native button click (mouse or Space/Enter key activation) from\n * bubbling to the row's own click handler — otherwise, on a table with\n * `selectionMode` set, activating an action would also select/toggle the\n * row it lives in. Mirrors {@link import('./table-selection-column').NgnTableSelectionColumn}'s\n * click guard for the same reason.\n */\n protected onBarClick(event: MouseEvent): void {\n event.stopPropagation();\n }\n\n protected onClicked(action: BarAction): void {\n if (!action.hasChildren) return;\n const index = this.barActions().indexOf(action);\n const host = index >= 0 ? this._buttonHosts()[index] : undefined;\n const anchor = (host && this._buttonElement(host)) ?? this._element.nativeElement;\n this._menu = openMenuAt(\n this._vcr,\n this._menu,\n action.item.children ?? [],\n anchor,\n 'bottom-end'\n );\n }\n\n private _buttonElement(host: ElementRef<HTMLElement>): HTMLButtonElement | null {\n return host.nativeElement.querySelector('button');\n }\n}\n","import {\n booleanAttribute,\n ComponentRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n type OnDestroy,\n Renderer2,\n Type,\n ViewContainerRef,\n} from '@angular/core';\nimport { domEventHandler, setComponentInput } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { NgnMenu, openMenuAt } from '@ngneers/controls/menu';\n\nimport { NgnTable } from './table';\nimport { NgnTableBodyTr } from './table-row';\nimport { NgnTableRowActionsBar } from './table-row-actions-bar';\n\nimport type { NgnActionItem } from '@ngneers/controls/api';\n\n/**\n * Per-row actions for the table body `<tr>`. Exposes the same `NgnActionItem[]`\n * as a right-click context menu ({@link context}) and/or an inline hover\n * button-bar ({@link inline}). Both modes are on by default and independent.\n */\n@Directive({ selector: '[ngnTableRowActions]' })\nexport class NgnTableRowActions implements OnDestroy {\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _vcr = inject(ViewContainerRef);\n private readonly _renderer = inject(Renderer2);\n private readonly _row = inject(NgnTableBodyTr, { optional: true });\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n private _menu?: ComponentRef<NgnMenu>;\n private _bar?: ComponentRef<NgnTableRowActionsBar>;\n\n /** The actions available on this row. */\n public readonly actions = input.required<NgnActionItem[]>({ alias: 'ngnTableRowActions' });\n\n /**\n * Whether right-clicking the row opens a context menu of the actions.\n * @default true\n */\n public readonly context = input(true, {\n transform: booleanAttribute,\n alias: 'ngnTableRowActionsContext',\n });\n\n /**\n * Whether an inline button-bar is rendered at the row's right edge, revealed\n * on hover or keyboard focus.\n * @default true\n */\n public readonly inline = input(true, {\n transform: booleanAttribute,\n alias: 'ngnTableRowActionsInline',\n });\n\n constructor() {\n domEventHandler(this._element, 'contextmenu', e => this._onContextMenu(e));\n\n effect(() => {\n if (this.inline()) {\n this._mountBar();\n } else {\n this._unmountBar();\n }\n });\n\n // Register with the nearest table keyed by this row's index, so the\n // table's keyboard navigation model can reach this directive.\n effect(onCleanup => {\n const table = this._table();\n const row = this._row;\n if (!table || !row) return;\n const index = row.ngnTableBodyTr().index;\n table.registerRowActions(index, this);\n onCleanup(() => table.unregisterRowActions(index, this));\n });\n }\n\n public ngOnDestroy(): void {\n this._menu?.destroy();\n this._unmountBar();\n }\n\n /**\n * Opens the context menu anchored to the row element (keyboard trigger:\n * Enter, ContextMenu, or Shift+F10). Deliberately independent of\n * {@link context} — that input only toggles the right-click affordance,\n * not the keyboard one, so keyboard users can always reach a row's menu.\n */\n public openMenuFromKeyboard(): boolean {\n this._menu = openMenuAt(\n this._vcr,\n this._menu,\n this.actions(),\n this._element.nativeElement,\n 'bottom-start'\n );\n return true;\n }\n\n /** Focuses the first enabled action button in the inline bar. Returns whether one was focused. */\n public focusFirstAction(): boolean {\n return this._bar?.instance.focusFirst() ?? false;\n }\n\n /** Moves focus by `delta` among the inline bar's action buttons. Returns whether focus stayed within the bar. */\n public moveAction(delta: 1 | -1): boolean {\n return this._bar?.instance.move(delta) ?? false;\n }\n\n private _onContextMenu(event: PointerEvent): void {\n // A `contextmenu` event is by definition a context-menu request (right-click\n // or the keyboard menu key), so no mouse-button check is needed — and\n // `event.button` is not reliably `2` across browsers (e.g. WebKit/Firefox),\n // which would otherwise suppress the menu there.\n if (!this.context()) return;\n if (this._menu?.instance.open()) return;\n event.preventDefault();\n event.stopPropagation();\n this._menu = openMenuAt(this._vcr, this._menu, this.actions(), {\n x: event.clientX,\n y: event.clientY,\n });\n }\n\n private _mountBar(): void {\n if (this._bar) return;\n this._bar = this._vcr.createComponent(NgnTableRowActionsBar);\n // Move the bar's host element inside the <tr> so it joins the row's\n // subgrid and the table's horizontal scroll container. Use Renderer2 so the\n // move stays platform-agnostic (SSR / non-DOM renderers).\n this._renderer.appendChild(this._element.nativeElement, this._bar.location.nativeElement);\n // Pass the actions SIGNAL (not its current value) once. The bar reads it\n // reactively in its own change detection, so we never re-push the array\n // here. Reading `this.actions()` inside this effect-driven method would\n // make the effect re-run on every actions change — and when a consumer\n // binds a fresh array each change-detection pass, re-pushing it would loop\n // into infinite change detection (NG0103).\n setComponentInput(this._bar, 'actionsSource', this.actions);\n }\n\n private _unmountBar(): void {\n this._bar?.destroy();\n this._bar = undefined;\n }\n}\n","import {\n ApplicationRef,\n type ComponentRef,\n computed,\n createComponent,\n Directive,\n effect,\n ElementRef,\n EnvironmentInjector,\n inject,\n type OnDestroy,\n Type,\n} from '@angular/core';\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { NgnCheckbox } from '@ngneers/controls/checkbox';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\nimport { NgnTableBodyTr } from './table-row';\n\n/**\n * Directive that turns a `<th>` or `<td>` into a selection checkbox column.\n *\n * **Header usage** — renders a \"select all / none\" checkbox:\n * ```html\n * <th ngnTableSelectionColumn></th>\n * ```\n *\n * **Body usage** — renders a per-row checkbox (must be inside a `[ngnTableBodyTr]`):\n * ```html\n * <td ngnTableSelectionColumn></td>\n * ```\n *\n * @category directive\n */\n@Directive({\n selector: '[ngnTableSelectionColumn]',\n host: {\n '(click)': 'onClick($event)',\n },\n})\nexport class NgnTableSelectionColumn implements OnDestroy {\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _envInjector = inject(EnvironmentInjector);\n private readonly _appRef = inject(ApplicationRef);\n private readonly _i18n = inject(I18n).translations;\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n\n /** Non-null only when used inside a body row (`<td>`). */\n private readonly _bodyTr = inject(NgnTableBodyTr, { optional: true });\n\n private readonly _isHeader = this._element.nativeElement.tagName === 'TH';\n\n /**\n * NgnCheckbox created at the application level via `createComponent` + `EnvironmentInjector`.\n * This keeps it outside Angular's view tree so `@for` reconciliation cannot destroy it.\n */\n private _checkboxRef!: ComponentRef<NgnCheckbox<boolean>>;\n\n protected readonly selected = computed(() => {\n if (this._isHeader) return false;\n const table = this._table();\n const row = this._bodyTr?.ngnTableBodyTr();\n if (!table || !row) return false;\n return table.isRowSelected(row.id);\n });\n\n protected readonly focused = computed(() => {\n if (this._isHeader) return false;\n const table = this._table();\n const row = this._bodyTr?.ngnTableBodyTr();\n if (!table || !row) return false;\n return table.focusedRowIndex() === row.index;\n });\n\n constructor() {\n this._prepareDom();\n this._createCheckbox();\n\n if (this._isHeader) {\n this._setupHeaderEffects();\n // Name the select-all checkbox, kept in sync with the active language\n // (translations load asynchronously, so this cannot be set once at init).\n effect(() => {\n setComponentInput(this._checkboxRef, 'label', this._i18n['table_selectAllRows']());\n });\n // Register the selection column once the table signal resolves\n effect(() => {\n const table = this._table();\n if (table) {\n table.registerSelectionColumn();\n }\n });\n } else {\n this._setupBodyEffects();\n // Mirror the header: name the per-row checkbox, kept in sync with language.\n effect(() => {\n setComponentInput(this._checkboxRef, 'label', this._i18n['table_selectRow']());\n });\n }\n }\n\n public ngOnDestroy(): void {\n if (this._isHeader) {\n this._table()?.unregisterSelectionColumn();\n }\n this._appRef.detachView(this._checkboxRef.hostView);\n this._checkboxRef.destroy();\n }\n\n private _prepareDom(): void {\n const el = this._element.nativeElement;\n // Mirror the grid roles that ngnTableTh/ngnTableTd set, so the selection column\n // stays inside the table's `role=\"grid\"` semantics instead of being an orphan cell.\n el.setAttribute('role', this._isHeader ? 'columnheader' : 'gridcell');\n toggleClass(el, this.theme.class('cell'), true);\n toggleClass(el, this.theme.class('selection-column'), true);\n }\n\n /**\n * Creates an NgnCheckbox via `createComponent` + `EnvironmentInjector`.\n * The component is attached to `ApplicationRef` (not a ViewContainerRef),\n * so Angular's `@for` block reconciliation cannot destroy it.\n */\n private _createCheckbox(): void {\n this._checkboxRef = createComponent(NgnCheckbox, {\n environmentInjector: this._envInjector,\n });\n this._appRef.attachView(this._checkboxRef.hostView);\n\n const cbEl = this._checkboxRef.location.nativeElement;\n cbEl.classList.add(this.theme.class('selection-checkbox'));\n\n if (this._isHeader) {\n setComponentInput(this._checkboxRef, 'allowIndeterminate', true);\n }\n\n this._element.nativeElement.appendChild(cbEl);\n }\n\n // --- Header (select-all) ---\n\n private _setupHeaderEffects(): void {\n effect(() => {\n const table = this._table();\n if (!table) return;\n setComponentInput(this._checkboxRef, 'value', table.headerCheckboxValue());\n });\n }\n\n // --- Body (per-row) ---\n\n private _setupBodyEffects(): void {\n effect(() => {\n const isSelected = this.selected();\n const isFocused = this.focused();\n const row = this._bodyTr?.ngnTableBodyTr();\n const el = this._element.nativeElement;\n\n setComponentInput(this._checkboxRef, 'value', isSelected);\n if (row) {\n el.style.setProperty('--ngn-table-row-index', String(row.index + 2));\n }\n toggleClass(el, this.theme.class('selected-row-cell'), isSelected);\n toggleClass(el, this.theme.class('focused-row-cell'), isFocused);\n });\n }\n\n // --- Click handling ---\n\n protected onClick(event: MouseEvent): void {\n event.stopPropagation();\n const table = this._table();\n if (!table) return;\n\n if (this._isHeader) {\n table.toggleSelectAll();\n } else {\n const row = this._bodyTr?.ngnTableBodyTr();\n if (row) {\n table.handleCheckboxChange(row);\n }\n }\n }\n}\n","import {\n afterNextRender,\n Directive,\n ElementRef,\n inject,\n input,\n type OnDestroy,\n Type,\n} from '@angular/core';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\n\nimport { NgnTable } from './table';\nimport { NgnTableTh } from './table-header-cell';\n\n@Directive({\n selector: '[ngnTableStickyColumn]',\n})\nexport class NgnTableStickyColumn implements OnDestroy {\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _headerCell = inject(NgnTableTh);\n private readonly _columnId = this._headerCell.ngnTableTh;\n\n /** Which edge the column sticks to: `'start'` (left) or `'end'` (right). */\n public readonly ngnTableStickyColumn = input.required<'start' | 'end'>();\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n\n constructor() {\n afterNextRender(() => {\n const table = this._table();\n if (table) {\n table.registerStickyColumn(this._columnId(), this.ngnTableStickyColumn());\n }\n });\n }\n\n public ngOnDestroy(): void {\n this._table()?.unregisterStickyColumn(this._columnId());\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { NgnTable } from './table';\nimport { NgnTableTd } from './table-cell';\nimport { NgnTableGroupHeaderTr } from './table-group-header-row';\nimport { NgnTableTh } from './table-header-cell';\nimport { NgnTableHeadTr } from './table-header-row';\nimport { NgnTableReorderableColumn } from './table-reorderable-column';\nimport { NgnTableBodyTr } from './table-row';\nimport { NgnTableRowActions } from './table-row-actions';\nimport { NgnTableRowActionsBar } from './table-row-actions-bar';\nimport { NgnTableSelectionColumn } from './table-selection-column';\nimport { NgnTableStickyColumn } from './table-sticky-column';\n\n@NgModule({\n imports: [\n NgnTable,\n NgnTableBodyTr,\n NgnTableTd,\n NgnTableTh,\n NgnTableHeadTr,\n NgnTableGroupHeaderTr,\n NgnTableReorderableColumn,\n NgnTableRowActions,\n NgnTableRowActionsBar,\n NgnTableSelectionColumn,\n NgnTableStickyColumn,\n ],\n exports: [\n NgnTable,\n NgnTableBodyTr,\n NgnTableTd,\n NgnTableTh,\n NgnTableHeadTr,\n NgnTableGroupHeaderTr,\n NgnTableReorderableColumn,\n NgnTableRowActions,\n NgnTableRowActionsBar,\n NgnTableSelectionColumn,\n NgnTableStickyColumn,\n ],\n})\nexport class NgnTableModule {}\n","import {\n ComponentRef,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n type OnDestroy,\n Type,\n ViewContainerRef,\n} from '@angular/core';\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { NgnActionButton } from '@ngneers/controls/button';\nimport { NgnFilter, type NgnFilterDataType } from '@ngneers/controls/filter';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\nimport { NgnTableTh } from './table-header-cell';\n\nimport type { NgnActionButtonConfig } from '@ngneers/controls/api';\n\n/**\n * @category directive\n */\n@Directive({\n selector: '[ngnTableFilterableColumn]',\n host: {\n '[class]': `theme.classes({'filterable-column': true, 'filtered-column': !!filter() })`,\n },\n})\nexport class NgnTableFilterableColumn implements OnDestroy {\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _columnId = inject(NgnTableTh).ngnTableTh;\n\n /** Enables filtering on this column. The directive selector; its value is unused. */\n public readonly ngnTableFilterableColumn = input();\n\n private readonly _ngnActionButton: ComponentRef<NgnActionButton<null>>;\n private readonly _ngnFilter: ComponentRef<NgnFilter>;\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n private readonly _rows = computed(() => {\n return this._table()?.rows() || [];\n });\n protected readonly filter = computed(() => {\n const tableFilter = this._table()?.filters()?.[this._columnId()];\n return tableFilter;\n });\n\n /** The data type of the column, which determines the available filter operators and UI. */\n public readonly ngnTableFilterableColumnType = input.required<NgnFilterDataType>();\n /** For list-based filters, the set of selectable option values to offer. */\n public readonly ngnTableFilterableColumnItems = input<string[] | null | undefined>();\n\n constructor() {\n this._ngnActionButton = inject(ViewContainerRef).createComponent(NgnActionButton<null>);\n this._ngnFilter = inject(ViewContainerRef).createComponent(NgnFilter);\n this._element.nativeElement.appendChild(this._ngnActionButton.location.nativeElement);\n this._element.nativeElement.appendChild(this._ngnFilter.location.nativeElement);\n this._ngnActionButton.location.nativeElement.classList.add(this.theme.class('filter-control'));\n\n setComponentInput(this._ngnActionButton, 'kind', 'icon');\n setComponentInput(this._ngnActionButton, 'inline', true);\n setComponentInput(this._ngnFilter, 'anchor', this._ngnActionButton.location.nativeElement);\n setComponentInput(this._ngnFilter, 'mode', 'headless');\n setComponentInput(this._ngnFilter, 'allowMultiple', true);\n\n const cfg = computed(\n () =>\n <NgnActionButtonConfig<null>>{\n label: 'Filter',\n value: null,\n kind: 'icon',\n defaultIcon: this.filter() ? 'filter-active' : 'filter-inactive',\n action: event => {\n event.stopPropagation();\n this._ngnFilter.instance.show();\n },\n }\n );\n\n effect(() => {\n setComponentInput(this._ngnActionButton, 'config', cfg());\n });\n effect(() => {\n setComponentInput(\n this._ngnFilter,\n 'data',\n this._rows().map(row => row[this._columnId()])\n );\n });\n effect(() => {\n setComponentInput(this._ngnFilter, 'dataType', this.ngnTableFilterableColumnType());\n });\n effect(() => {\n setComponentInput(this._ngnFilter, 'listOptions', this.ngnTableFilterableColumnItems());\n });\n this._ngnFilter.instance.filterChange.subscribe(cfg => {\n const table = this._table();\n const currentFilters = table?.filters() || {};\n table?.filters.set({ ...currentFilters, [this._columnId()]: cfg ?? undefined });\n });\n }\n\n public ngOnDestroy(): void {\n this._ngnActionButton.destroy();\n this._ngnFilter.destroy();\n }\n}\n","import {\n ComponentRef,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n type OnDestroy,\n Type,\n ViewContainerRef,\n} from '@angular/core';\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\nimport { NgnTableTh } from './table-header-cell';\n\n/**\n * @category directive\n */\n@Directive({\n selector: '[ngnTableSortableColumn]',\n host: {\n '[class]': `theme.classes({'sortable-column': true, 'sorted-column': !!sort() })`,\n '[attr.aria-sort]': `sort() === 'asc' ? 'ascending' : sort() === 'desc' ? 'descending' : 'none'`,\n '(click)': `onHostClick($event)`,\n },\n})\nexport class NgnTableSortableColumn implements OnDestroy {\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Enables sorting on this column. The directive selector; its value is unused. */\n public readonly ngnTableSortableColumn = input();\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n protected readonly sort = computed(() => {\n const tableSort = this._table()?.sort();\n if (tableSort?.column === this.columnId()) {\n return tableSort.direction;\n }\n return null;\n });\n\n private readonly columnId = inject(NgnTableTh).ngnTableTh;\n\n private readonly _ngnIcon: ComponentRef<NgnIcon>;\n\n constructor() {\n this._ngnIcon = inject(ViewContainerRef).createComponent(NgnIcon);\n this._element.nativeElement.appendChild(this._ngnIcon.location.nativeElement);\n this._ngnIcon.location.nativeElement.classList.add(this.theme.class('sort-control'));\n\n effect(() => {\n const sort = this.sort();\n setComponentInput(\n this._ngnIcon,\n 'defaultIcon',\n sort === 'asc' ? 'sort-ascending' : sort === 'desc' ? 'sort-descending' : 'sort-neutral'\n );\n });\n }\n\n public ngOnDestroy(): void {\n this._ngnIcon.destroy();\n }\n\n protected onHostClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target.classList.contains(this.theme.class('resize-handle'))) return;\n this.toggleSort();\n }\n\n protected toggleSort(): void {\n const currentSort = this.sort();\n const table = this._table();\n table?.sort.set(\n currentSort === null\n ? { column: this.columnId(), direction: 'asc' }\n : currentSort === 'asc'\n ? { column: this.columnId(), direction: 'desc' }\n : null\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngneers-controls-table.mjs","sources":["../../src/table/table-column-layout-model.ts","../../src/table/table-group-header-row.ts","../../src/table/table-lazy-model.ts","../../src/table/table-row-model.ts","../../src/table/table-row-navigation-model.ts","../../src/table/table-selection-model.ts","../../src/table/table-templates.ts","../../src/table/table.ts","../../src/table/table.html","../../src/table/table-cell.ts","../../src/table/table-header-cell.ts","../../src/table/table-header-row.ts","../../src/table/table-reorderable-column.ts","../../src/table/table-row.ts","../../src/table/action-item-mapping.ts","../../src/table/table-row-actions-bar.ts","../../src/table/table-row-actions.ts","../../src/table/table-selection-column.ts","../../src/table/table-sticky-column.ts","../../src/table/module.ts","../../src/table/table-filterable-column.ts","../../src/table/table-sortable-column.ts","../../src/table/ngneers-controls-table.ts"],"sourcesContent":["import { afterRenderEffect, computed, signal } from '@angular/core';\nimport { elementSizeSignal } from '@ngneers/controls/api/ng';\nimport { getResizeLimitInPx, ResizeEngine } from '@ngneers/controls/api/resize';\n\nimport type { NgnTableTh } from './table-header-cell';\nimport type { ElementRef, ModelSignal, Signal } from '@angular/core';\nimport type { ResizableItem } from '@ngneers/controls/api/resize';\n\n/**\n * Default minimum column width in pixels for table columns.\n * Enforced as an absolute floor even when a relative min-size (e.g. `5%`) resolves smaller.\n */\nconst TABLE_MIN_COLUMN_WIDTH_PX = 50;\n\n/** Splits a CSS grid-template-columns string into individual track values, handling minmax(). */\nconst GRID_TRACK_RE = /(?:minmax\\([^)]+\\)|[^\\s]+)/g;\n\nexport interface TableColumnLayoutModelDeps {\n element: ElementRef<HTMLElement>;\n resizable: Signal<boolean>;\n reorderable: Signal<boolean>;\n resizeMode: Signal<'adjacent' | 'proportional' | 'push'>;\n lockSizes: Signal<boolean>;\n columnOrder: ModelSignal<string[]>;\n themeClass: (name: string) => string;\n}\n\n/**\n * Owns all column geometry for {@link NgnTable}: effective order, widths (via the wrapped\n * {@link ResizeEngine}), sticky columns, reorder gestures, auto-sizing, and the composed\n * `grid-template-columns`. Reads table flags through injected signals; writes only its own\n * state and the injected `columnOrder` model.\n */\nexport class TableColumnLayoutModel {\n private readonly _registeredHeaderCells = signal<NgnTableTh[]>([]);\n private readonly _stickyColumns = signal<ReadonlyMap<string, 'start' | 'end'>>(new Map());\n private readonly _hasSelectionColumn = signal(false);\n private readonly _isReordering = signal(false);\n private readonly _reorderSourceColumnId = signal<string | null>(null);\n private readonly _dropIndicatorState = signal<{\n leftPx: number;\n topPx: number;\n heightPx: number;\n } | null>(null);\n private _reorderTargetIndex = -1;\n\n private readonly _tableElementSize: ReturnType<typeof elementSizeSignal>;\n private readonly _resizeEngine: ResizeEngine;\n\n public readonly hasSelectionColumn = this._hasSelectionColumn.asReadonly();\n public readonly isReordering = this._isReordering.asReadonly();\n public readonly dropIndicatorState = this._dropIndicatorState.asReadonly();\n public readonly isDragging = (): boolean => this._resizeEngine.isDragging();\n\n public readonly columnCount = computed(() => this._registeredHeaderCells().length);\n\n /**\n * Effective column order: merges user-provided `columnOrder` with registered header cells.\n * If `columnOrder` is empty, falls back to registration order.\n * Unknown keys are filtered; new columns not in the order are appended.\n */\n private readonly _effectiveColumnOrder = computed<string[]>(() => {\n const cells = this._registeredHeaderCells();\n const cellIds = cells.map(c => c.ngnTableTh());\n const userOrder = this._deps.columnOrder();\n\n if (!userOrder.length) {\n return cellIds;\n }\n\n // Filter to valid keys and append any new columns not in the order\n const validOrder = userOrder.filter(id => cellIds.includes(id));\n const missing = cellIds.filter(id => !validOrder.includes(id));\n return [...validOrder, ...missing];\n });\n\n public readonly stickyStartColumns = computed<string[]>(() => {\n const stickyMap = this._stickyColumns();\n const order = this._effectiveColumnOrder();\n const contiguous: string[] = [];\n for (const id of order) {\n if (stickyMap.get(id) === 'start') {\n contiguous.push(id);\n } else {\n break;\n }\n }\n return contiguous;\n });\n\n public readonly stickyEndColumns = computed<string[]>(() => {\n const stickyMap = this._stickyColumns();\n const order = this._effectiveColumnOrder();\n const contiguous: string[] = [];\n for (let i = order.length - 1; i >= 0; i--) {\n if (stickyMap.get(order[i]!) === 'end') {\n contiguous.unshift(order[i]!);\n } else {\n break;\n }\n }\n return contiguous;\n });\n\n /**\n * Maps column ID → 1-based visual position.\n */\n public readonly columnOrderMap = computed<ReadonlyMap<string, number>>(() => {\n const order = this._effectiveColumnOrder();\n const map = new Map<string, number>();\n for (let i = 0; i < order.length; i++) {\n map.set(order[i]!, i + 1);\n }\n return map;\n });\n\n /**\n * Grid template columns computed from the resize engine when resizable,\n * otherwise falls back to the standard equal-width repeat.\n */\n public readonly gridTemplateColumns: Signal<string>;\n\n constructor(private readonly _deps: TableColumnLayoutModelDeps) {\n this._tableElementSize = elementSizeSignal(this._deps.element);\n\n // Create engine eagerly in constructor (outside reactive context) to avoid NG0602\n this._resizeEngine = new ResizeEngine({\n items: computed(() => this._registeredHeaderCells() as unknown as readonly ResizableItem[]),\n containerSize: computed(() => {\n // Subscribe to the size signal for reactivity, but use clientWidth\n // to exclude vertical scrollbar width and avoid horizontal overflow.\n this._tableElementSize();\n const tableEl = this._deps.element.nativeElement.querySelector('table');\n const total = tableEl?.clientWidth ?? 0;\n if (!this._hasSelectionColumn()) return total;\n // Subtract the selection column width so the resize engine only distributes\n // the remaining space among data columns.\n const selCol = this._deps.element.nativeElement.querySelector(\n `.${this._deps.themeClass('selection-column')}`\n );\n return total - (selCol?.getBoundingClientRect().width ?? 0);\n }),\n gapSizes: signal([]),\n distributionMode: computed(() => this._deps.resizeMode()),\n containerConstrained: computed(() => this._deps.resizeMode() !== 'push'),\n lockSizes: computed(() => this._deps.lockSizes()),\n minItemSizePx: TABLE_MIN_COLUMN_WIDTH_PX,\n resolveItemSizes: () =>\n this._registeredHeaderCells().map(\n cell => cell.element.nativeElement.getBoundingClientRect().width\n ),\n });\n\n this.gridTemplateColumns = computed(() => {\n const checkboxCol = this._hasSelectionColumn() ? 'min-content ' : '';\n if (this._deps.resizable()) {\n const rawSizes = this._resizeEngine.gridTemplateSizes();\n // When reorderable, permute grid track sizes to match visual column order\n if (this._deps.reorderable()) {\n return `${checkboxCol}${this._permuteGridSizes(rawSizes)}`;\n }\n return `${checkboxCol}${rawSizes}`;\n }\n return `${checkboxCol}repeat(${this.columnCount()}, 1fr)`;\n });\n\n afterRenderEffect(() => {\n const startCols = this.stickyStartColumns();\n const endCols = this.stickyEndColumns();\n if (startCols.length === 0 && endCols.length === 0) return;\n if (this._resizeEngine.isDragging()) return;\n this._tableElementSize();\n\n const tableEl = this._deps.element.nativeElement.querySelector(':scope > table');\n if (!tableEl) return;\n\n const cells = this._registeredHeaderCells();\n\n let selectionWidth = 0;\n if (this._hasSelectionColumn()) {\n const selCol = tableEl.querySelector(`.${this._deps.themeClass('selection-column')}`);\n selectionWidth = selCol?.getBoundingClientRect().width ?? 0;\n }\n\n let cumulativeLeft = selectionWidth;\n for (let i = 0; i < startCols.length; i++) {\n (tableEl as HTMLElement).style.setProperty(\n `--ngn-sticky-start-offset-${i}`,\n `${cumulativeLeft}px`\n );\n const cell = cells.find(c => c.ngnTableTh() === startCols[i]);\n cumulativeLeft += cell?.element.nativeElement.getBoundingClientRect().width ?? 0;\n }\n\n let cumulativeRight = 0;\n for (let i = endCols.length - 1; i >= 0; i--) {\n (tableEl as HTMLElement).style.setProperty(\n `--ngn-sticky-end-offset-${i}`,\n `${cumulativeRight}px`\n );\n const cell = cells.find(c => c.ngnTableTh() === endCols[i]);\n cumulativeRight += cell?.element.nativeElement.getBoundingClientRect().width ?? 0;\n }\n });\n }\n\n /**\n * Returns the 1-based visual column index for a given 0-based logical (DOM) index.\n */\n public getVisualColumnIndex(logicalIndex: number): number {\n const cells = this._registeredHeaderCells();\n const cell = cells[logicalIndex];\n if (!cell) return logicalIndex + 1;\n return this.columnOrderMap().get(cell.ngnTableTh()) ?? logicalIndex + 1;\n }\n\n public registerSelectionColumn(): void {\n this._hasSelectionColumn.set(true);\n }\n\n public unregisterSelectionColumn(): void {\n this._hasSelectionColumn.set(false);\n }\n\n public registerHeaderCell(cell: NgnTableTh): void {\n this._registeredHeaderCells.update(cells => [...cells, cell]);\n }\n\n public unregisterHeaderCell(cell: NgnTableTh): void {\n this._registeredHeaderCells.update(cells => cells.filter(c => c !== cell));\n }\n\n public getRegisteredHeaderCells(): readonly NgnTableTh[] {\n return this._registeredHeaderCells();\n }\n\n public registerStickyColumn(columnId: string, side: 'start' | 'end'): void {\n this._stickyColumns.update(map => {\n const next = new Map(map);\n next.set(columnId, side);\n return next;\n });\n }\n\n public unregisterStickyColumn(columnId: string): void {\n this._stickyColumns.update(map => {\n const next = new Map(map);\n next.delete(columnId);\n return next;\n });\n }\n\n public getStickyInfo(\n columnId: string\n ): { side: 'start' | 'end'; index: number; isEdge: boolean } | null {\n const startCols = this.stickyStartColumns();\n const endCols = this.stickyEndColumns();\n const startIndex = startCols.indexOf(columnId);\n if (startIndex >= 0) {\n return { side: 'start', index: startIndex, isEdge: startIndex === startCols.length - 1 };\n }\n const endIndex = endCols.indexOf(columnId);\n if (endIndex >= 0) {\n return { side: 'end', index: endIndex, isEdge: endIndex === 0 };\n }\n return null;\n }\n\n // --- Resize operations (called by NgnTableTh) ---\n\n public startColumnResize(columnIndex: number, event: PointerEvent): void {\n if (!this._deps.resizable()) return;\n this._resizeEngine.startDrag(columnIndex, event.clientX);\n }\n\n public dragColumnResize(columnIndex: number, event: PointerEvent): void {\n if (!this._deps.resizable()) return;\n this._resizeEngine.drag(columnIndex, event.clientX);\n }\n\n public endColumnResize(columnIndex: number, cancel: boolean): void {\n if (!this._deps.resizable()) return;\n this._resizeEngine.endDrag(columnIndex, cancel);\n }\n\n // --- Reorder operations (called by NgnTableReorderableColumn) ---\n\n public getReorderBounds(columnId: string): { min: number; max: number } {\n const order = this._effectiveColumnOrder();\n const startCols = this.stickyStartColumns();\n const endCols = this.stickyEndColumns();\n const side = this._stickyColumns().get(columnId);\n\n if (side === 'start') {\n return { min: 0, max: startCols.length };\n } else if (side === 'end') {\n return { min: order.length - endCols.length, max: order.length };\n } else {\n return { min: startCols.length, max: order.length - endCols.length };\n }\n }\n\n public startColumnReorder(columnId: string): void {\n if (!this._deps.reorderable()) return;\n this._isReordering.set(true);\n this._reorderSourceColumnId.set(columnId);\n this._reorderTargetIndex = -1;\n }\n\n public dragColumnReorder(event: PointerEvent): void {\n if (!this._deps.reorderable() || !this._isReordering()) return;\n\n const cells = this._registeredHeaderCells();\n const effectiveOrder = this._effectiveColumnOrder();\n const sourceId = this._reorderSourceColumnId();\n if (!sourceId) return;\n\n // Find drop target by comparing cursor X to header cell midpoints (in visual order)\n const cursorX = event.clientX;\n let targetIndex = effectiveOrder.length;\n\n // Build visual-order cells with their bounding boxes\n const visualCells = effectiveOrder\n .map(id => cells.find(c => c.ngnTableTh() === id))\n .filter((c): c is NgnTableTh => !!c);\n\n for (let i = 0; i < visualCells.length; i++) {\n const rect = visualCells[i]!.element.nativeElement.getBoundingClientRect();\n const midX = rect.left + rect.width / 2;\n if (cursorX < midX) {\n targetIndex = i;\n break;\n }\n }\n\n const bounds = this.getReorderBounds(sourceId);\n targetIndex = Math.max(bounds.min, Math.min(bounds.max, targetIndex));\n\n this._reorderTargetIndex = targetIndex;\n\n // Compute indicator position relative to the table element\n const tableEl = this._deps.element.nativeElement.querySelector(':scope > table');\n if (!tableEl) return;\n const tableRect = tableEl.getBoundingClientRect();\n\n // Use the first header cell's height for the indicator\n const firstCellRect = visualCells[0]?.element.nativeElement.getBoundingClientRect();\n const indicatorHeight = firstCellRect?.height ?? 40;\n\n let indicatorLeftPx: number;\n if (targetIndex === 0) {\n const firstCell = visualCells[0];\n if (!firstCell) return;\n const rect = firstCell.element.nativeElement.getBoundingClientRect();\n indicatorLeftPx = rect.left - tableRect.left;\n } else if (targetIndex >= visualCells.length) {\n const lastCell = visualCells[visualCells.length - 1];\n if (!lastCell) return;\n const rect = lastCell.element.nativeElement.getBoundingClientRect();\n indicatorLeftPx = rect.right - tableRect.left;\n } else {\n const prevCell = visualCells[targetIndex - 1]!;\n const nextCell = visualCells[targetIndex]!;\n const prevRect = prevCell.element.nativeElement.getBoundingClientRect();\n const nextRect = nextCell.element.nativeElement.getBoundingClientRect();\n indicatorLeftPx = (prevRect.right + nextRect.left) / 2 - tableRect.left;\n }\n\n // Clamp so the 3px-wide indicator stays within the visible content area\n // (use clientWidth to exclude scrollbar width from the boundary)\n const maxLeft = tableEl.clientWidth - 3;\n indicatorLeftPx = Math.max(0, Math.min(indicatorLeftPx, maxLeft));\n\n this._dropIndicatorState.set({\n leftPx: indicatorLeftPx,\n topPx: tableEl.scrollTop,\n heightPx: indicatorHeight,\n });\n }\n\n public endColumnReorder(cancel: boolean): void {\n if (!this._deps.reorderable()) return;\n\n if (!cancel && this._reorderTargetIndex >= 0) {\n const sourceId = this._reorderSourceColumnId();\n if (sourceId) {\n const effectiveOrder = [...this._effectiveColumnOrder()];\n const sourceIndex = effectiveOrder.indexOf(sourceId);\n\n if (sourceIndex >= 0) {\n // Remove source from its current position\n effectiveOrder.splice(sourceIndex, 1);\n // Adjust target index if source was before target\n let insertAt = this._reorderTargetIndex;\n if (sourceIndex < this._reorderTargetIndex) {\n insertAt--;\n }\n // Insert at new position\n effectiveOrder.splice(insertAt, 0, sourceId);\n\n this._deps.columnOrder.set(effectiveOrder);\n }\n }\n }\n\n this._isReordering.set(false);\n this._reorderSourceColumnId.set(null);\n this._dropIndicatorState.set(null);\n this._reorderTargetIndex = -1;\n }\n\n public getReorderSourceColumnId(): string | null {\n return this._reorderSourceColumnId();\n }\n\n /**\n * Permutes grid template sizes from logical (registration) order to visual (column order) order.\n */\n private _permuteGridSizes(rawSizes: string): string {\n const tracks = rawSizes.match(GRID_TRACK_RE) ?? [];\n const cells = this._registeredHeaderCells();\n const effectiveOrder = this._effectiveColumnOrder();\n\n if (tracks.length !== cells.length) {\n return rawSizes; // Mismatch — don't permute\n }\n\n // Build map: column ID → track size (logical order)\n const sizeByColumnId = new Map<string, string>();\n for (let i = 0; i < cells.length; i++) {\n sizeByColumnId.set(cells[i]!.ngnTableTh(), tracks[i]!);\n }\n\n // Emit sizes in visual order\n return effectiveOrder.map(id => sizeByColumnId.get(id) ?? '1fr').join(' ');\n }\n\n /**\n * Auto-sizes the column at `columnIndex` to fit its visible content.\n * Uses `Canvas.measureText()` for fast, reflow-free text measurement since\n * grid-constrained cells (`min-width: 0`) don't report natural content width\n * via `scrollWidth`.\n */\n public autoSizeColumn(columnIndex: number): void {\n if (!this._deps.resizable()) return;\n\n const cells = this._registeredHeaderCells();\n const headerCell = cells[columnIndex];\n if (!headerCell) return;\n\n const tableEl = this._deps.element.nativeElement.querySelector('table');\n if (!tableEl) return;\n\n const headerEl = headerCell.element.nativeElement as HTMLElement;\n const ctx = autoSizeCanvasCtx();\n\n // Measure header: text width + non-text siblings (icons, controls) + flex gap.\n // The header cell is a flex container with: cell-text, spacer, filter/sort icons, resize handle.\n const cellTextClass = this._deps.themeClass('cell-text');\n const headerTextEl = headerEl.querySelector<HTMLElement>(`.${cellTextClass}`);\n let headerRequiredWidth = 0;\n if (headerTextEl) {\n ctx.font = getCssFont(headerEl);\n const text = headerTextEl.textContent ?? '';\n headerRequiredWidth = Math.ceil(ctx.measureText(text).width);\n }\n // Add width of visible non-text siblings (filter icon, sort icon, etc.)\n const headerStyle = getComputedStyle(headerEl);\n const headerGap = parseFloat(headerStyle.gap) || 0;\n let visibleSiblingCount = 0;\n for (let i = 0; i < headerEl.children.length; i++) {\n const child = headerEl.children[i] as HTMLElement;\n if (child === headerTextEl) continue;\n // Skip spacer (zero intrinsic width) and hidden resize handle\n if (child.offsetWidth > 0 && getComputedStyle(child).flexGrow === '0') {\n headerRequiredWidth += child.offsetWidth;\n visibleSiblingCount++;\n }\n }\n // Add flex gaps between visible items\n if (visibleSiblingCount > 0) {\n headerRequiredWidth += headerGap * visibleSiblingCount;\n }\n let maxContentWidth = headerRequiredWidth;\n\n // Measure visible body cells (nth-child is 1-indexed, offset by selection column)\n const selectionOffset = this._hasSelectionColumn() ? 1 : 0;\n const bodyCells = Array.from(\n tableEl.querySelectorAll<HTMLElement>(\n `tbody tr td:nth-child(${columnIndex + selectionOffset + 1})`\n )\n );\n if (bodyCells.length > 0) {\n ctx.font = getCssFont(bodyCells[0]!);\n for (let i = 0; i < bodyCells.length; i++) {\n const text = bodyCells[i]!.textContent ?? '';\n maxContentWidth = Math.max(maxContentWidth, Math.ceil(ctx.measureText(text).width));\n }\n }\n\n // Add cell horizontal padding\n const paddingLeft = parseFloat(headerStyle.paddingLeft) || 0;\n const paddingRight = parseFloat(headerStyle.paddingRight) || 0;\n const totalWidth = maxContentWidth + paddingLeft + paddingRight;\n\n // Clamp to min/max constraints\n const containerSize = this._tableElementSize().width;\n const minPx = Math.max(\n TABLE_MIN_COLUMN_WIDTH_PX,\n getResizeLimitInPx(headerCell.minSize(), containerSize)\n );\n const maxPx = getResizeLimitInPx(headerCell.maxSize(), containerSize);\n const clampedWidth = Math.max(minPx, Math.min(maxPx, totalWidth));\n\n this._resizeEngine.setItemSize(headerCell as unknown as ResizableItem, `${clampedWidth}px`);\n this._resizeEngine.hasBeenResized.set(true);\n }\n}\n\n// --- Auto-size helpers ---\n\n/** Lazily created canvas context for text measurement (no DOM reflows). */\nlet _autoSizeCtx: CanvasRenderingContext2D | null = null;\nfunction autoSizeCanvasCtx(): CanvasRenderingContext2D {\n if (!_autoSizeCtx) {\n _autoSizeCtx = document.createElement('canvas').getContext('2d')!;\n }\n return _autoSizeCtx;\n}\n\n/** Builds the CSS font shorthand from an element's computed style. */\nfunction getCssFont(el: HTMLElement): string {\n const s = getComputedStyle(el);\n return `${s.fontStyle} ${s.fontWeight} ${s.fontSize} ${s.fontFamily}`;\n}\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\nimport { NgnScrollerItem } from '@ngneers/controls/scroller';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { setInputSignalValue } from '@ngneers/controls/utils-ng';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport type { FormattedTableGroupHeaderRow } from './types';\n\n@Directive({\n selector: '[ngnTableGroupHeaderTr]',\n host: {\n '[attr.aria-rowindex]': 'ngnTableGroupHeaderTr().index + 2',\n '[style.--ngn-table-row-index]': 'ngnTableGroupHeaderTr().index + 2',\n },\n})\nexport class NgnTableGroupHeaderTr extends NgnScrollerItem {\n /** The group-header row this `<tr>` renders. */\n public readonly ngnTableGroupHeaderTr = input.required<FormattedTableGroupHeaderRow>();\n /** The item bound to the underlying scroller entry; kept in sync with {@link ngnTableGroupHeaderTr}. */\n public override readonly ngnScrollerItem = input<object>({});\n private readonly _element = inject(ElementRef<HTMLElement>);\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n\n constructor() {\n super();\n effect(() => {\n const row = this.ngnTableGroupHeaderTr();\n setInputSignalValue(this.ngnScrollerItem, row);\n });\n this.prepareDom();\n }\n\n private prepareDom() {\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\n toggleClass(this._element.nativeElement, this.theme.class('group-header-row'), true);\n }\n}\n","import { signal, type Signal } from '@angular/core';\n\nimport type { PaginationState } from '@ngneers/controls/paginator';\nimport type { NgnFilterConfig } from '@ngneers/controls/filter';\nimport type { TableDataSource, TableLoadResult } from './types';\n\nexport type TableLazyMode = 'paginate' | 'infinite';\n\nexport type TableLazyDeps<T> = {\n dataSource: Signal<TableDataSource<T> | null>;\n sort: Signal<{ column: string; direction: 'asc' | 'desc' } | null>;\n filters: Signal<Record<string, NgnFilterConfig> | null>;\n mode: Signal<TableLazyMode>;\n};\n\n/**\n * Owns lazy-loading state for {@link NgnTable}: the loaded row window,\n * request status, per-page cache, and an epoch that invalidates on\n * sort/filter/pageSize/dataSource change. Plain signal class (no DI), mirroring\n * `TableSelectionModel`.\n */\nexport class TableLazyModel<T> {\n public readonly loaded = signal<readonly T[]>([]);\n public readonly status = signal<'idle' | 'loading' | 'error'>('idle');\n public readonly error = signal<unknown>(null);\n public readonly total = signal<number | undefined>(undefined);\n public readonly hasMore = signal(true);\n\n /** page index -> result, valid within the current epoch. */\n private readonly _cache = new Map<number, TableLoadResult<T>>();\n private _epoch = 0;\n private _controller: AbortController | null = null;\n private _lastState: PaginationState | null = null;\n private _nextWindow = 0;\n /** The most recent load attempt, replayed by {@link retry}. */\n private _lastLoad: {\n state: PaginationState;\n apply: 'replace' | 'append';\n cursor: unknown;\n } | null = null;\n\n constructor(private readonly _deps: TableLazyDeps<T>) {}\n\n /** Load (or serve from cache) the page described by `state`. */\n public async setPage(state: PaginationState): Promise<void> {\n this._lastState = state;\n const cached = this._cache.get(state.page.current);\n if (cached) {\n // Supersede any in-flight load so it can't resolve over the cached page.\n this._controller?.abort();\n this._controller = null;\n this.loaded.set(cached.rows);\n this.total.set(cached.total);\n this.hasMore.set(cached.hasMore);\n this.status.set('idle');\n this.error.set(null);\n return;\n }\n await this._load(state, 'replace');\n }\n\n /**\n * Invalidate everything and refetch the current page/window from scratch.\n * No-op if {@link setPage} has never been called (nothing to refetch yet).\n */\n public async reload(): Promise<void> {\n const state = this._lastState;\n // Capture the cursor before _bumpEpoch clears the cache it's read from.\n const cursor = state ? this.cursorFor(state.page.current) : undefined;\n this._bumpEpoch();\n if (state) await this._load(state, 'replace', cursor);\n }\n\n /** Called by the component when sort/filter/pageSize/dataSource change. */\n public invalidate(): void {\n this._bumpEpoch();\n }\n\n /**\n * Infinite scroll: load and append the next window of `pageSize` rows.\n * No-op while a load is in flight or when `hasMore` is false.\n */\n public async loadNext(pageSize: number): Promise<void> {\n if (this.status() === 'loading' || !this.hasMore()) return;\n const current = this._nextWindow;\n const state: PaginationState = {\n page: { current, size: pageSize },\n slice: { skip: current * pageSize, take: pageSize },\n };\n await this._load(state, 'append');\n }\n\n /** Re-issue the last load attempt after a rejection; keeps loaded rows in infinite scroll. */\n public async retry(): Promise<void> {\n const last = this._lastLoad;\n if (last) await this._load(last.state, last.apply, last.cursor);\n }\n\n protected cursorFor(pageIndex: number): unknown {\n return this._cache.get(pageIndex - 1)?.cursor;\n }\n\n private _bumpEpoch(): void {\n this._epoch++;\n this._cache.clear();\n this._controller?.abort();\n this._controller = null;\n this.loaded.set([]);\n this.total.set(undefined);\n this.hasMore.set(true);\n this.status.set('idle');\n this.error.set(null);\n this._nextWindow = 0;\n this._lastLoad = null;\n }\n\n protected async _load(\n state: PaginationState,\n apply: 'replace' | 'append',\n cursorOverride?: unknown\n ): Promise<void> {\n const loader = this._deps.dataSource();\n if (!loader) return;\n const cursor = cursorOverride ?? this.cursorFor(state.page.current);\n this._lastLoad = { state, apply, cursor };\n const epoch = this._epoch;\n this._controller?.abort();\n const controller = new AbortController();\n this._controller = controller;\n this.status.set('loading');\n this.error.set(null);\n try {\n const result = await loader({\n pagination: state,\n sort: this._deps.sort(),\n filters: this._deps.filters(),\n cursor,\n signal: controller.signal,\n });\n if (epoch !== this._epoch || controller !== this._controller) return; // superseded\n this._cache.set(state.page.current, result);\n this.total.set(result.total);\n this.hasMore.set(result.hasMore);\n this.loaded.set(apply === 'append' ? [...this.loaded(), ...result.rows] : result.rows);\n // Advance only on success, so a failed append retries the same window.\n if (apply === 'append') this._nextWindow = state.page.current + 1;\n this.status.set('idle');\n } catch (err) {\n if (epoch !== this._epoch || controller !== this._controller || controller.signal.aborted)\n return;\n this.error.set(err);\n this.status.set('error');\n }\n }\n}\n","import { executeMultiFilter } from '@ngneers/controls/api';\n\nimport type { FormattedTableRow } from './types';\nimport type { NgnFilterConfig } from '@ngneers/controls/filter';\nimport type { PaginationState } from '@ngneers/controls/paginator';\nimport type { AllKeysOfUnion } from '@ngneers/controls/utils';\n\nexport type TableSort<T> = {\n column: Extract<AllKeysOfUnion<T>, string>;\n direction: 'asc' | 'desc';\n};\n\nexport type TableFilters<T> =\n | { [key in Extract<AllKeysOfUnion<T>, string>]?: NgnFilterConfig }\n | null;\n\nexport type TableSortComparator<T> = (a: T, b: T, sort: TableSort<T>) => number;\n\n/** Applies the active multi-column filter set. Returns the input untouched when no filters are set. */\nexport function filterRows<T extends object>(\n rows: readonly T[],\n filters: TableFilters<T>\n): readonly T[] {\n if (!filters) {\n return rows;\n }\n return executeMultiFilter(rows, filters);\n}\n\n/**\n * Default comparator: nulls sort first on `asc` / last on `desc`; numbers compare\n * numerically; everything else compares via `localeCompare` on the stringified value.\n */\nexport function defaultSortComparator<T>(a: T, b: T, sort: TableSort<T>): number {\n const { column, direction } = sort;\n // Mirrors the existing index access in groupRows / the original inline comparator.\n const aValue = (a as Record<string, unknown>)[column];\n const bValue = (b as Record<string, unknown>)[column];\n if (aValue == null && bValue != null) {\n return direction === 'asc' ? -1 : 1;\n }\n if (aValue != null && bValue == null) {\n return direction === 'asc' ? 1 : -1;\n }\n if (aValue == null && bValue == null) {\n return 0;\n }\n return typeof aValue === 'number' && typeof bValue === 'number'\n ? direction === 'asc'\n ? aValue - bValue\n : bValue - aValue\n : direction === 'asc'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n}\n\n/** Sorts rows without mutating the input. Returns the input untouched when no sort is set. */\nexport function sortRows<T>(\n rows: readonly T[],\n sort: TableSort<T> | null,\n comparator: TableSortComparator<T> = defaultSortComparator\n): readonly T[] {\n if (!sort) {\n return rows;\n }\n return rows.toSorted((a, b) => comparator(a, b, sort));\n}\n\n/**\n * Builds a flat row list with group headers interleaved, preserving the incoming\n * (already filtered + sorted) order. Data rows appear only under expanded groups.\n */\nexport function groupRows<T>(\n rows: readonly T[],\n groupBy: string,\n fieldId: keyof T,\n expanded: ReadonlySet<unknown>\n): FormattedTableRow<T>[] {\n const groupMap = new Map<unknown, T[]>();\n for (const row of rows) {\n const key = (row as Record<string, unknown>)[groupBy];\n let group = groupMap.get(key);\n if (!group) {\n group = [];\n groupMap.set(key, group);\n }\n group.push(row);\n }\n\n const result: FormattedTableRow<T>[] = [];\n let index = 0;\n for (const [groupKey, members] of groupMap) {\n const isExpanded = expanded.has(groupKey);\n result.push({\n kind: 'group-header',\n id: `group-${String(groupKey)}`,\n groupKey,\n groupValue: groupKey,\n count: members.length,\n expanded: isExpanded,\n index: index++,\n });\n if (isExpanded) {\n for (const data of members) {\n result.push({\n kind: 'data',\n id: data[fieldId] as T[keyof T] & (string | number),\n data,\n index: index++,\n });\n }\n }\n }\n return result;\n}\n\n/** Slices a formatted row list to the current page. Returns `[]` when there is no page state. */\nexport function paginateRows<T, V>(\n rows: readonly FormattedTableRow<T, V>[],\n pageState: PaginationState | null\n): readonly FormattedTableRow<T, V>[] {\n if (!pageState) {\n return [];\n }\n return rows.slice(pageState.slice.skip, pageState.slice.take + pageState.slice.skip);\n}\n","import { signal } from '@angular/core';\n\nimport type { FormattedTableRow, TableSelectionMode } from './types';\nimport type { Signal, WritableSignal } from '@angular/core';\n\nexport interface RowNavigationDeps<T extends object> {\n /** The currently rendered/formatted rows, in view order. */\n viewRows: Signal<readonly FormattedTableRow<T>[]>;\n /**\n * Whether any row currently has a registered row-actions directive. Gates\n * the whole model — when `false` the model consumes nothing, so tables\n * without row actions keep byte-for-byte selection keyboard behavior.\n */\n hasActions: () => boolean;\n /**\n * The table's single current-row index, shared with (and driven by)\n * {@link import('./table-selection-model').TableSelectionModel}. This model\n * reads and writes it directly instead of owning a separate index, so\n * row-actions navigation and selection navigation always agree on which\n * row is current.\n */\n focusedRowIndex: WritableSignal<number | null>;\n /** The table's active selection mode, or `null` when selection is disabled. */\n selectionMode: Signal<TableSelectionMode | null>;\n /** Scrolls the row at `index` into view (used when the current row moves). */\n scrollToIndex: (index: number) => void;\n /** Enter the current row's action bar; returns true if a bar exists + focus moved in. */\n enterActions: (rowIndex: number) => boolean;\n /** Move within the bar; returns true while focus stays in the bar. */\n moveAction: (rowIndex: number, delta: 1 | -1) => boolean;\n /** Open the context menu for the current row (keyboard trigger). */\n openMenu: (rowIndex: number) => boolean;\n /** Returns DOM focus to the table's own tab stop when leaving the action bar. */\n focusHost: () => void;\n}\n\n/**\n * Roving keyboard model for row actions, reconciled onto the table's single\n * current-row index ({@link RowNavigationDeps.focusedRowIndex}). The single\n * tab stop lives on the table host; ArrowRight enters the action bar and\n * ArrowLeft/Right move between actions, ArrowLeft off the first action\n * returns to row navigation. ContextMenu and Shift+F10 always open the\n * context menu on the current row, regardless of selection mode.\n *\n * When {@link RowNavigationDeps.selectionMode} is set and focus is not in\n * the action bar, this model deliberately does **not** handle\n * ArrowUp/Down/Enter/Space itself — it returns `false` so the table's own\n * `onKeyDown` falls through to\n * {@link import('./table-selection-model').TableSelectionModel#onKeyDown},\n * which already resolves the start row correctly (including the\n * null-`focusedRowIndex` → currently-selected-row fallback after a mouse\n * click). Recomputing that start index here would silently diverge from the\n * selection model's resolution — that's exactly the bug this delegation\n * avoids. When `selectionMode` is `null`, this model owns ArrowUp/Down\n * itself (moves `focusedRowIndex`) and Enter opens the context menu. Only\n * claims keys when at least one row has registered actions (see\n * {@link RowNavigationDeps.hasActions}), so tables without row actions keep\n * selection's keyboard behavior untouched.\n */\nexport class TableRowNavigationModel<T extends object> {\n /** Whether DOM focus is currently inside the current row's action bar (as opposed to on the row itself). */\n public readonly inActions = signal(false);\n\n constructor(private readonly _deps: RowNavigationDeps<T>) {}\n\n /** Returns true when the event was handled (caller should stop propagation to other handlers). */\n public onKeyDown(event: KeyboardEvent): boolean {\n if (!this._deps.hasActions()) return false;\n\n const rows = this._deps.viewRows();\n if (rows.length === 0) return false;\n const current = this._deps.focusedRowIndex();\n const mode = this._deps.selectionMode();\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n return this._moveRow(event, rows.length, current, mode);\n case 'ArrowRight':\n return this._moveRight(event, current);\n case 'ArrowLeft':\n return this._moveLeft(event, current);\n case 'Enter':\n case ' ':\n return this._activate(event, current, mode);\n case 'ContextMenu':\n return this._openMenu(event, current);\n case 'F10':\n return event.shiftKey ? this._openMenu(event, current) : false;\n case 'Escape':\n // Back out of the action bar to the row (standard roving-toolbar exit),\n // mirroring ArrowLeft off the first action.\n if (!this.inActions()) return false;\n this.inActions.set(false);\n this._deps.focusHost();\n event.preventDefault();\n return true;\n default:\n return false;\n }\n }\n\n private _moveRow(\n event: KeyboardEvent,\n rowCount: number,\n current: number | null,\n mode: TableSelectionMode | null\n ): boolean {\n // While focus is inside the action bar, ArrowUp/Down must not move the\n // current row (and must not fall through to selection) — swallow them.\n if (this.inActions()) {\n event.preventDefault();\n return true;\n }\n if (mode) {\n // Delegate entirely to TableSelectionModel.onKeyDown — it already\n // resolves the start index (including the null-focus → selected-row\n // fallback) and applies the move/select/scroll side-effects. Returning\n // `false` here lets the table's onKeyDown fall through to it, so the\n // combined single/multi-select + actions behavior stays byte-identical\n // to the no-actions case.\n return false;\n }\n const start = current ?? -1;\n const next =\n event.key === 'ArrowDown' ? Math.min(start + 1, rowCount - 1) : Math.max(start - 1, 0);\n this._deps.focusedRowIndex.set(next);\n this._deps.scrollToIndex(next);\n event.preventDefault();\n return true;\n }\n\n private _moveRight(event: KeyboardEvent, current: number | null): boolean {\n if (current === null) return false;\n if (this.inActions()) {\n this._deps.moveAction(current, 1);\n event.preventDefault();\n return true;\n }\n if (!this._deps.enterActions(current)) return false;\n this.inActions.set(true);\n event.preventDefault();\n return true;\n }\n\n private _moveLeft(event: KeyboardEvent, current: number | null): boolean {\n if (current === null || !this.inActions()) return false;\n const stayed = this._deps.moveAction(current, -1);\n if (!stayed) {\n this.inActions.set(false); // fell off the first action → back to row navigation\n this._deps.focusHost();\n }\n event.preventDefault();\n return true;\n }\n\n private _activate(\n event: KeyboardEvent,\n current: number | null,\n mode: TableSelectionMode | null\n ): boolean {\n // Let the focused native <button> handle Enter/Space itself — do not\n // preventDefault, do not open the menu.\n if (this.inActions()) return false;\n // Delegate entirely to TableSelectionModel.onKeyDown when selection is\n // active — same rationale as the ArrowUp/Down case in `_moveRow`: it\n // reads the same `focusedRowIndex`, but keeping a single handler avoids\n // this model silently drifting from the selection model's semantics.\n if (mode) return false;\n if (current === null) return false;\n if (event.key !== 'Enter') return false; // Space is a no-op without selection\n return this._openMenu(event, current);\n }\n\n private _openMenu(event: KeyboardEvent, current: number | null): boolean {\n if (current === null || this.inActions()) return false;\n if (!this._deps.openMenu(current)) return false;\n event.preventDefault();\n return true;\n }\n}\n","import { computed, signal } from '@angular/core';\n\nimport type { FormattedTableDataRow, FormattedTableRow, TableSelectionMode } from './types';\nimport type { ModelSignal, Signal, WritableSignal } from '@angular/core';\n\nexport interface TableSelectionModelDeps<T extends object, K extends keyof T> {\n viewRows: Signal<readonly FormattedTableRow<T>[]>;\n selectionMode: Signal<TableSelectionMode | null>;\n fieldId: Signal<K>;\n /** The table's public two-way `selection` model, by reference. */\n selection: ModelSignal<T[K & keyof T][]>;\n /** The table's public `focusedRowIndex` signal, by reference. */\n focusedRowIndex: WritableSignal<number | null>;\n /** Scrolls the row at the given index into view (delegates to the table's NgnScroller). */\n scrollToIndex: (index: number) => void;\n}\n\n/**\n * Owns row selection, the selection anchor, keyboard navigation, and the derived\n * select-all / indeterminate state for {@link NgnTable}. Reads the view rows through an\n * injected signal and writes only the selection + focus state passed in.\n */\nexport class TableSelectionModel<T extends object, K extends keyof T> {\n constructor(private readonly _deps: TableSelectionModelDeps<T, K>) {}\n\n /** Anchor index for Shift+click range selection (index in viewRows). */\n private readonly _selectionAnchor = signal<number | null>(null);\n\n public readonly selectionSet = computed(() => new Set(this._deps.selection()), {\n equal: (a, b) => a.size === b.size && [...a].every(v => b.has(v)),\n });\n\n public readonly isAllSelected = computed(() => {\n const rows = this._deps.viewRows();\n const selSet = this.selectionSet();\n return rows.length > 0 && rows.every(row => selSet.has(row.id as T[K & keyof T]));\n });\n\n public readonly isIndeterminate = computed(() => {\n const selSet = this.selectionSet();\n return selSet.size > 0 && !this.isAllSelected();\n });\n\n public readonly headerCheckboxValue = computed<boolean | null>(() => {\n if (this.isAllSelected()) return true;\n if (this.isIndeterminate()) return null;\n return false;\n });\n\n public isRowSelected(id: T[keyof T] & (string | number)): boolean {\n return this.selectionSet().has(id as T[K & keyof T]);\n }\n\n public handleRowClick(row: FormattedTableDataRow<T>, event: MouseEvent): void {\n const mode = this._deps.selectionMode();\n if (!mode) return;\n\n const id = row.id as T[K & keyof T];\n const rowIndex = this._deps.viewRows().findIndex(r => r.id === row.id);\n\n if (mode === 'single') {\n this._deps.selection.set([id]);\n this._selectionAnchor.set(rowIndex);\n this._deps.focusedRowIndex.set(null);\n return;\n }\n\n if (event.shiftKey && this._selectionAnchor() !== null) {\n this._selectRange(this._selectionAnchor()!, rowIndex);\n } else if (event.ctrlKey || event.metaKey) {\n this._toggleRowInSelection(id);\n } else {\n this._toggleRowInSelection(id);\n }\n this._selectionAnchor.set(rowIndex);\n this._deps.focusedRowIndex.set(null);\n }\n\n public handleCheckboxChange(row: FormattedTableDataRow<T>): void {\n const id = row.id as T[K & keyof T];\n this._toggleRowInSelection(id);\n const rowIndex = this._deps.viewRows().findIndex(r => r.id === row.id);\n this._selectionAnchor.set(rowIndex);\n this._deps.focusedRowIndex.set(null);\n }\n\n public toggleSelectAll(): void {\n if (this.isAllSelected()) {\n this._deps.selection.set([]);\n } else {\n const dataRows = this._deps\n .viewRows()\n .filter((r): r is FormattedTableDataRow<T> => r.kind === 'data');\n this._deps.selection.set(dataRows.map(r => r.id as T[K & keyof T]));\n }\n }\n\n private _toggleRowInSelection(id: T[K & keyof T]): void {\n const current = this._deps.selection();\n if (this.selectionSet().has(id)) {\n this._deps.selection.set(current.filter(v => v !== id));\n } else {\n this._deps.selection.set([...current, id]);\n }\n }\n\n private _selectRange(fromIndex: number, toIndex: number): void {\n const rows = this._deps.viewRows();\n const start = Math.min(fromIndex, toIndex);\n const end = Math.max(fromIndex, toIndex);\n const rangeIds = rows\n .slice(start, end + 1)\n .filter((r): r is FormattedTableDataRow<T> => r.kind === 'data')\n .map(r => r.id as T[K & keyof T]);\n\n const currentSet = new Set(this._deps.selection());\n for (const id of rangeIds) {\n currentSet.add(id);\n }\n this._deps.selection.set([...currentSet]);\n }\n\n public onKeyDown(event: KeyboardEvent): void {\n const mode = this._deps.selectionMode();\n if (!mode) return;\n\n const rows = this._deps.viewRows();\n if (rows.length === 0) return;\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n event.stopPropagation();\n\n let currentIndex = this._deps.focusedRowIndex();\n if (currentIndex === null && mode === 'single') {\n const sel = this._deps.selection();\n if (sel.length > 0) {\n currentIndex = rows.findIndex(r => r.id === sel[0]);\n }\n }\n currentIndex ??= -1;\n\n const nextIndex =\n event.key === 'ArrowDown'\n ? Math.min(currentIndex + 1, rows.length - 1)\n : Math.max(currentIndex - 1, 0);\n\n this._deps.focusedRowIndex.set(nextIndex);\n this._deps.scrollToIndex(nextIndex);\n this.applyArrowMove(nextIndex, event.shiftKey);\n } else if (event.key === ' ' || event.key === 'Enter') {\n if (mode === 'multi') {\n const focusIdx = this._deps.focusedRowIndex();\n if (focusIdx !== null && rows[focusIdx]) {\n event.preventDefault();\n event.stopPropagation();\n this.toggleCurrentRow(focusIdx);\n }\n }\n }\n }\n\n /**\n * Applies the selection side-effects of an arrow-key move that already set\n * `focusedRowIndex` to `nextIndex` — single mode selects the row and resets\n * the anchor, multi mode with `shiftKey` extends the range from the anchor,\n * multi mode alone only moves focus (a no-op here). No-ops when\n * {@link TableSelectionModelDeps.selectionMode} is `null`. Only called from\n * {@link onKeyDown} — {@link TableRowNavigationModel} deliberately does not\n * recompute or replicate this (it would risk diverging from this model's\n * null-`focusedRowIndex` start-index resolution), and instead defers\n * ArrowUp/Down entirely to {@link onKeyDown} when a row-actions table also\n * has a `selectionMode`.\n */\n private applyArrowMove(nextIndex: number, shiftKey: boolean): void {\n const mode = this._deps.selectionMode();\n if (!mode) return;\n const rows = this._deps.viewRows();\n const row = rows[nextIndex];\n if (!row) return;\n\n if (mode === 'single') {\n this._deps.selection.set([row.id as T[K & keyof T]]);\n this._selectionAnchor.set(nextIndex);\n } else if (shiftKey) {\n const anchor = this._selectionAnchor() ?? nextIndex;\n this._selectRange(anchor, nextIndex);\n }\n }\n\n /**\n * Toggles selection of the row at `index` and sets it as the new anchor —\n * the multi-mode Enter/Space behavior. Only called from {@link onKeyDown};\n * {@link TableRowNavigationModel} defers Enter/Space to it for the same\n * reason as {@link applyArrowMove}.\n */\n public toggleCurrentRow(index: number): void {\n const rows = this._deps.viewRows();\n const row = rows[index];\n if (!row) return;\n this._toggleRowInSelection(row.id as T[K & keyof T]);\n this._selectionAnchor.set(index);\n }\n}\n","import { Component, contentChild, TemplateRef } from '@angular/core';\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\nimport { NgnBase } from '@ngneers/controls/base';\n\nimport type { FormattedTableDataRow } from './types';\n\nexport type GroupHeaderContext = {\n $implicit: {\n groupKey: unknown;\n groupValue: unknown;\n count: number;\n expanded: boolean;\n };\n};\n\n@Component({\n template: '',\n})\nexport abstract class NgnTableTemplates<T extends object> extends NgnBase<'table'> {\n private readonly _headerTemplate = contentChild<TemplateRef<unknown>>('header');\n private readonly _bodyTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.body>>('body');\n private readonly _groupHeaderTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.groupHeader>>('groupHeader');\n private readonly _loadingTemplate = contentChild<TemplateRef<unknown>>('loading');\n private readonly _errorTemplate = contentChild<TemplateRef<unknown>>('error');\n\n protected readonly headerTemplate = this._headerTemplate;\n protected readonly bodyTemplate = this._bodyTemplate;\n protected readonly groupHeaderTemplate = this._groupHeaderTemplate;\n /** Custom rows shown while a lazy load is in flight, via `<ng-template #loading>`. */\n protected readonly loadingTemplate = this._loadingTemplate;\n /** Custom error row via `<ng-template #error>`; receives `{ error, retry }`, where `retry` re-issues the failed load. */\n protected readonly errorTemplate = this._errorTemplate;\n\n /**\n * Types for the table templates.\n */\n public readonly templateTypes = templateTypesFn<{\n /**\n * Type of the template variable for the body template.\n */\n body: { $implicit: FormattedTableDataRow<T> };\n /**\n * Type of the template variable for the group header template.\n */\n groupHeader: GroupHeaderContext;\n }>();\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n untracked,\n booleanAttribute,\n viewChild,\n} from '@angular/core';\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { NgnButton } from '@ngneers/controls/button';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { NgnPaginator, type PaginationState } from '@ngneers/controls/paginator';\nimport { NgnScrollShadow } from '@ngneers/controls/scroll-shadow';\nimport { NgnScroller } from '@ngneers/controls/scroller';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { TableColumnLayoutModel } from './table-column-layout-model';\nimport { NgnTableGroupHeaderTr } from './table-group-header-row';\nimport { TableLazyModel } from './table-lazy-model';\nimport {\n filterRows,\n groupRows,\n paginateRows,\n sortRows,\n type TableSortComparator,\n} from './table-row-model';\nimport { TableRowNavigationModel } from './table-row-navigation-model';\nimport { TableSelectionModel } from './table-selection-model';\nimport { NgnTableTemplates } from './table-templates';\n\nimport type { NgnTableTh } from './table-header-cell';\nimport type { NgnTableRowActions } from './table-row-actions';\nimport type {\n FormattedTableDataRow,\n FormattedTableGroupHeaderRow,\n FormattedTableRow,\n TableDataSource,\n TableSelectionMode,\n} from './types';\nimport type { NgnFilterConfig } from '@ngneers/controls/filter';\nimport { NgnError, type AllKeysOfUnion } from '@ngneers/controls/utils';\n\nconst DEFAULT_LAZY_PAGE_SIZE = 25;\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-table',\n templateUrl: './table.html',\n\n imports: [\n NgTemplateOutlet,\n NgnScroller,\n NgnPaginator,\n NgnTemplate,\n NgnPt,\n NgnIcon,\n NgnTableGroupHeaderTr,\n NgnScrollShadow,\n NgnButton,\n ],\n providers: [provideSelf(NgnTable)],\n host: {\n tabindex: '0',\n '(keydown)': 'onKeyDown($event)',\n },\n})\nexport class NgnTable<\n T extends object,\n K extends keyof T,\n G extends Extract<AllKeysOfUnion<T>, string> = never,\n> extends NgnTableTemplates<T> {\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate, {\n root: true,\n virtual: () => this.virtual(),\n resizing: () => this._columns?.isDragging() ?? false,\n selectable: () => !!this.selectionMode(),\n reorderable: () => this.reorderable(),\n reordering: () => this._columns?.isReordering() ?? false,\n loading: () => this.loadStatus() === 'loading',\n });\n private readonly _scroller = viewChild.required(NgnScroller);\n\n /** The data rows to render in client-side mode. Ignored when {@link dataSource} is set. */\n public readonly rows = input<readonly T[]>([]);\n /**\n * When {@link virtual} is enabled, this defines the height of each row in pixels.\n */\n public readonly rowHeight = input<number>();\n /** The key of the property that uniquely identifies each row. */\n public readonly fieldId = input.required<K>();\n /**\n * Whether the table is virtualized. When enabled, provide {@link rowHeight}.\n * @default false\n */\n public readonly virtual = input<boolean>(false);\n /**\n * When {@link virtual} is enabled, the number of extra rows to render above and below the viewport.\n * @default 2\n */\n public readonly virtualPadding = input<number>(2);\n /**\n * Whether to apply alternating background colors to rows.\n * @default false\n */\n public readonly striped = input<boolean>(false);\n /**\n * Whether to render a paginator and page the rows.\n * @default false\n */\n public readonly paginator = input<boolean>(false);\n\n /**\n * A loader callback for server-driven lazy loading. When set, the table fetches\n * rows on demand instead of reading {@link rows}, and client-side sort/filter are\n * delegated to the loader. With {@link paginator} it pages lazily; without, it\n * infinite-scrolls. Incompatible with {@link groupBy} (throws).\n *\n * @remarks Bind to a stable reference (a class field/method), not an inline\n * arrow — a new function identity each change-detection cycle invalidates the\n * page cache and refetches every cycle.\n * @default null\n */\n public readonly dataSource = input<TableDataSource<T> | null>(null);\n /**\n * Infinite scroll only: set by the header select-all checkbox to request a\n * \"select everything matching the current filters\" bulk operation, since the\n * full set is not loaded. Two-way bindable.\n * @default false\n */\n public readonly selectAllMatching = model<boolean>(false);\n\n /**\n * The selection mode for the table.\n * - `'single'`: Only one row can be selected at a time.\n * - `'multi'`: Multiple rows can be selected (with Ctrl/Shift click or checkboxes).\n * - `null`: Selection is disabled.\n * @default null\n */\n public readonly selectionMode = input<TableSelectionMode | null>(null);\n\n /**\n * The selected row IDs. Two-way bindable via `[(selection)]`.\n * @default []\n */\n public readonly selection = model<T[K & keyof T][]>([]);\n\n /**\n * Column key to group rows by. Rows with the same value in this column\n * are collected under a collapsible group header.\n * @default null (no grouping)\n */\n public readonly groupBy = input<G | null>(null);\n\n /**\n * Two-way model tracking which groups are currently expanded, identified\n * by their column value. Defaults to `[]` (all collapsed).\n * Pass all group values to start with all groups expanded.\n *\n * Type-safe: when `groupBy` is set, this is typed as `T[G][]` where G\n * is the groupBy column key (inferred by Angular's template type checker).\n */\n public readonly expandedGroups = model<Array<T[G] & (string | number)>>([]);\n\n /**\n * Whether column resizing is enabled.\n * @default false\n */\n public readonly resizable = input(false, { transform: booleanAttribute });\n\n /**\n * The resize distribution mode.\n * - `'adjacent'`: Only columns adjacent to the resize handle change. Total width stays the same.\n * - `'push'`: Column grows/shrinks independently, total width changes (enables horizontal scrolling).\n * @default 'adjacent'\n */\n public readonly resizeMode = input<'adjacent' | 'proportional' | 'push'>('adjacent');\n\n /**\n * Whether to lock affected columns to fixed `px` values after a resize completes.\n *\n * - **`proportional` mode**: when `true`, the resized column stays as `px` (locked);\n * when `false`, it is converted back to `fr` and continues to flex with the container.\n * - **`adjacent` / `push` modes**: when `true`, columns whose size changed are converted\n * to `px`; when `false`, columns keep their original units.\n *\n * @default false\n */\n public readonly lockSizes = input<boolean>(false);\n\n /**\n * Whether column reordering is enabled.\n * @default false\n */\n public readonly reorderable = input(false, { transform: booleanAttribute });\n\n /**\n * The current column order as an array of column identifiers.\n * When empty, the natural registration order (DOM order) is used.\n * Supports two-way binding for persistence.\n */\n public readonly columnOrder = model<string[]>([]);\n\n protected readonly trackById = (item: T): unknown => item[this.fieldId()];\n /**\n * The active sort descriptor (column + direction), or `null` when unsorted. Two-way bindable.\n * @default null\n */\n public readonly sort = model<{\n column: Extract<AllKeysOfUnion<T>, string>;\n direction: 'asc' | 'desc';\n } | null>(null);\n\n /**\n * Optional custom comparator used when `sort` is active. Receives the two rows and the\n * active sort descriptor. When omitted, a default comparator is used (nulls-first on asc,\n * numeric for numbers, `localeCompare` otherwise).\n */\n public readonly sortComparator = input<TableSortComparator<T> | undefined>(undefined);\n\n /**\n * The active per-column filter configuration, keyed by column, or `null` when unfiltered. Two-way bindable.\n * @default null\n */\n public readonly filters = model<\n | {\n [key in Extract<AllKeysOfUnion<T>, string>]?: NgnFilterConfig;\n }\n | null\n >(null);\n protected readonly pageState = signal<PaginationState | null>(null);\n\n // --- Lazy (server-driven) loading ---\n\n protected readonly lazy = computed(() => !!this.dataSource());\n protected readonly lazyMode = computed<'paginate' | 'infinite'>(() =>\n this.paginator() ? 'paginate' : 'infinite'\n );\n\n private readonly _lazyModel = new TableLazyModel<T>({\n dataSource: this.dataSource,\n sort: this.sort,\n filters: computed(() => this.filters() as Record<string, NgnFilterConfig> | null),\n mode: this.lazyMode,\n });\n\n protected readonly loadStatus = this._lazyModel.status;\n protected readonly loadError = this._lazyModel.error;\n protected readonly loadTotal = this._lazyModel.total;\n protected readonly lazyHasMore = this._lazyModel.hasMore;\n\n protected readonly i18n = inject(I18n).translations;\n /**\n * Polite live-region text announcing sort / filter / pagination / selection\n * changes to assistive tech. Populated by an effect in the constructor.\n */\n protected readonly liveAnnouncement = signal('');\n\n // --- Column layout (geometry, sticky, resize, reorder, auto-size) ---\n\n private readonly _columns: TableColumnLayoutModel = new TableColumnLayoutModel({\n element: this.element,\n resizable: this.resizable,\n reorderable: this.reorderable,\n resizeMode: this.resizeMode,\n lockSizes: this.lockSizes,\n columnOrder: this.columnOrder,\n themeClass: name => this.theme.class(name as Parameters<typeof this.theme.class>[0]),\n });\n\n /**\n * Whether a selection column directive is present in the template.\n * Set automatically by `NgnTableSelectionColumn` — do not set manually.\n */\n public readonly showCheckboxes = this._columns.hasSelectionColumn;\n protected readonly dropIndicatorState = this._columns.dropIndicatorState;\n public readonly columnOrderMap = computed(() => this._columns.columnOrderMap());\n\n /**\n * Grid template columns computed from the resize engine when resizable,\n * otherwise falls back to the standard equal-width repeat.\n */\n public get gridTemplateColumns() {\n return this._columns.gridTemplateColumns;\n }\n\n // --- Selection state ---\n\n /**\n * The single current-row index (index in {@link formattedRows}) for\n * keyboard navigation. Shared by {@link NgnTable}'s selection keyboard\n * handling and row-actions keyboard navigation — arrows move it, and (when\n * {@link selectionMode} is set) selection follows it. Cleared whenever\n * {@link formattedRows} changes identity (sort/filter/rows replaced) so it\n * never points at a stale row.\n */\n public readonly focusedRowIndex = signal<number | null>(null);\n\n private readonly _selection: TableSelectionModel<T, K>;\n\n public readonly headerCheckboxValue: ReturnType<typeof computed<boolean | null>>;\n\n // --- Row actions registry + keyboard navigation ---\n\n private readonly _rowActions = new Map<number, NgnTableRowActions>();\n private readonly _rowNav: TableRowNavigationModel<T>;\n\n /**\n * Total column count including the selection checkbox column.\n */\n protected readonly totalColumnCount = computed(\n () => this._columns.columnCount() + (this._columns.hasSelectionColumn() ? 1 : 0)\n );\n\n /** Number of placeholder rows to show while a lazy load is in flight. */\n protected readonly skeletonRows = computed(() => {\n if (this.loadStatus() !== 'loading') return 0;\n return this.paginator()\n ? (this.pageState()?.page.size ?? DEFAULT_LAZY_PAGE_SIZE)\n : this.virtualPadding() * 2 + 1;\n });\n\n protected readonly formattedRows = computed<FormattedTableRow<T>[]>(() => {\n const groupBy = this.groupBy();\n if (groupBy) {\n return this._groupedRows();\n }\n const rows = this._sortedRows();\n return rows.map((data, index) => ({\n kind: 'data' as const,\n id: data[this.fieldId()] as T[keyof T] & (string | number),\n data,\n index,\n }));\n });\n\n private readonly _groupedRows = computed<FormattedTableRow<T>[]>(() => {\n const groupBy = this.groupBy();\n if (!groupBy) return [];\n return groupRows(\n this._sortedRows(),\n groupBy,\n this.fieldId() as keyof T,\n new Set(this.expandedGroups())\n );\n });\n\n protected readonly pagedRows = computed<FormattedTableRow<T>[]>(() => {\n // Lazy pagination clears rows while fetching so skeletons replace the page.\n if (this.lazy() && this.lazyMode() === 'paginate' && this.loadStatus() === 'loading') {\n return [];\n }\n // Lazy loaders return exactly one page — never re-slice client-side.\n if (!this.paginator() || this.lazy()) {\n return this.formattedRows();\n }\n return [...paginateRows(this.formattedRows(), this.pageState())];\n });\n\n private readonly _baseRows = computed<readonly T[]>(() =>\n this.lazy() ? this._lazyModel.loaded() : this.rows()\n );\n\n private readonly _filteredRows = computed<readonly T[]>(() =>\n this.lazy() ? this._baseRows() : filterRows(this._baseRows(), this.filters())\n );\n\n /** Page size only — page navigation must not invalidate the per-page cache. */\n private readonly _lazyPageSize = computed(() => this.pageState()?.page.size);\n\n private readonly _sortedRows = computed<readonly T[]>(() =>\n this.lazy()\n ? this._baseRows()\n : sortRows(this._filteredRows(), this.sort(), this.sortComparator())\n );\n\n constructor() {\n super();\n\n this._selection = new TableSelectionModel<T, K>({\n viewRows: this.formattedRows,\n selectionMode: this.selectionMode,\n fieldId: this.fieldId,\n selection: this.selection,\n focusedRowIndex: this.focusedRowIndex,\n scrollToIndex: index => this._scroller().scrollToIndex(index),\n });\n\n this._rowNav = new TableRowNavigationModel<T>({\n viewRows: this.formattedRows,\n hasActions: () => this._rowActions.size > 0,\n focusedRowIndex: this.focusedRowIndex,\n selectionMode: this.selectionMode,\n scrollToIndex: index => this._scroller().scrollToIndex(index),\n enterActions: index => this.getRowActions(index)?.focusFirstAction() ?? false,\n moveAction: (index, delta) => this.getRowActions(index)?.moveAction(delta) ?? false,\n openMenu: index => this.getRowActions(index)?.openMenuFromKeyboard() ?? false,\n focusHost: () => this.element.nativeElement.focus(),\n });\n\n this.headerCheckboxValue = computed<boolean | null>(() =>\n this.lazy() && this.lazyMode() === 'infinite'\n ? this.selectAllMatching()\n : this._selection.headerCheckboxValue()\n );\n\n // Minor #3: clear the current-row highlight whenever the underlying row\n // set changes identity (sort/filter/rows replaced), so it never lingers\n // on a stale index. Only reads `formattedRows` as a dependency — the\n // writes below must not be read here, or this effect would re-run on its\n // own writes and clobber every keyboard row move.\n effect(() => {\n this.formattedRows();\n this.focusedRowIndex.set(null);\n this._rowNav.inActions.set(false);\n });\n\n // A11y: announce sort / filter / pagination / selection changes through a\n // polite live region — none of these are otherwise conveyed to assistive\n // tech. Only the aspect that actually changed is announced (checked in\n // priority order), and the first run only seeds the baselines. Writes only\n // `liveAnnouncement`, which it never reads, so it cannot re-trigger itself.\n let seeded = false;\n let prevSort = '';\n let prevFilterCount = 0;\n let prevPageKey = '';\n let prevSelCount = 0;\n effect(() => {\n const sort = this.sort();\n // Lazy: announce the server total; fall back to the loaded window count.\n const filterCount = this.lazy()\n ? (this.loadTotal() ?? this._filteredRows().length)\n : this._filteredRows().length;\n const page = this.pageState();\n const selCount = this.selection().length;\n const selTotal = this.lazy() ? (this.loadTotal() ?? this.rows().length) : this.rows().length;\n\n const sortKey = sort ? `${sort.column}:${sort.direction}` : '';\n const pageKey = page ? `${page.page.current}/${page.page.size}` : '';\n\n if (!seeded) {\n seeded = true;\n [prevSort, prevFilterCount, prevPageKey, prevSelCount] = [\n sortKey,\n filterCount,\n pageKey,\n selCount,\n ];\n return;\n }\n\n let message = '';\n if (filterCount !== prevFilterCount) {\n message = this.i18n['table_resultCount']({ count: filterCount });\n } else if (sortKey !== prevSort) {\n message = sort\n ? this.i18n['table_sortedBy']({\n column: sort.column,\n direction:\n this.i18n[\n sort.direction === 'asc' ? 'table_sortAscending' : 'table_sortDescending'\n ](),\n })\n : this.i18n['table_sortCleared']();\n } else if (pageKey !== prevPageKey) {\n const size = page?.page.size ?? 0;\n const pages = size > 0 ? Math.ceil(filterCount / size) : 1;\n message = this.i18n['table_page']({ page: (page?.page.current ?? 0) + 1, pages });\n } else if (selCount !== prevSelCount) {\n message = this.i18n['table_selectedCount']({ count: selCount, total: selTotal });\n }\n\n [prevSort, prevFilterCount, prevPageKey, prevSelCount] = [\n sortKey,\n filterCount,\n pageKey,\n selCount,\n ];\n if (message) {\n this.liveAnnouncement.set(message);\n }\n });\n\n // Lazy grouping needs the full row set, which lazy mode never has.\n effect(() => {\n if (this.lazy() && this.groupBy()) {\n throw new NgnError('table', 'groupBy is not supported with a lazy dataSource (v1)');\n }\n });\n\n // Reset the lazy cache when sort, filter, page size or dataSource change.\n effect(() => {\n this.sort();\n this.filters();\n this._lazyPageSize();\n this.dataSource();\n if (!this.lazy()) return;\n untracked(() => this._lazyModel.invalidate());\n });\n\n // Lazy pagination: load the current page when it, sort, filters or dataSource change.\n effect(() => {\n const state = this.pageState();\n this.sort();\n this.filters();\n this.dataSource();\n if (!this.lazy() || this.lazyMode() !== 'paginate' || !state) return;\n untracked(() => void this._lazyModel.setPage(state));\n });\n\n // Infinite scroll: load the next window when the viewport nears the end.\n effect(() => {\n if (!this.lazy() || this.lazyMode() !== 'infinite') return;\n const distance = this._scroller().distanceFromEnd();\n const threshold = (this.rowHeight() ?? 40) * this.virtualPadding();\n const pageSize = this.pageState()?.page.size ?? DEFAULT_LAZY_PAGE_SIZE;\n if (distance <= threshold) {\n untracked(() => void this._lazyModel.loadNext(pageSize));\n }\n });\n }\n\n /** Force a lazy refetch, clearing the page cache. No-op in client-side mode. */\n public reload(): void {\n // Infinite scroll has no current page — restart from the first window.\n if (this.lazy() && this.lazyMode() === 'infinite') {\n this._lazyModel.invalidate();\n void this._lazyModel.loadNext(this.pageState()?.page.size ?? DEFAULT_LAZY_PAGE_SIZE);\n return;\n }\n void this._lazyModel.reload();\n }\n\n /** Retry the failed load, keeping already-loaded rows in infinite scroll. */\n protected retryLoad(): void {\n void this._lazyModel.retry();\n }\n\n protected pageChanged(event: PaginationState) {\n this.pageState.set(event);\n }\n\n public column<V extends AllKeysOfUnion<T> & string>(column: V): V {\n return column;\n }\n\n // --- Column registration / geometry (delegated to TableColumnLayoutModel) ---\n\n public getVisualColumnIndex(logicalIndex: number): number {\n return this._columns.getVisualColumnIndex(logicalIndex);\n }\n\n public getRegisteredHeaderCells(): readonly NgnTableTh[] {\n return this._columns.getRegisteredHeaderCells();\n }\n\n public getStickyInfo(\n columnId: string\n ): { side: 'start' | 'end'; index: number; isEdge: boolean } | null {\n return this._columns.getStickyInfo(columnId);\n }\n\n public registerHeaderCell(cell: NgnTableTh): void {\n this._columns.registerHeaderCell(cell);\n }\n\n public unregisterHeaderCell(cell: NgnTableTh): void {\n this._columns.unregisterHeaderCell(cell);\n }\n\n public registerSelectionColumn(): void {\n this._columns.registerSelectionColumn();\n }\n\n public unregisterSelectionColumn(): void {\n this._columns.unregisterSelectionColumn();\n }\n\n public registerStickyColumn(columnId: string, side: 'start' | 'end'): void {\n this._columns.registerStickyColumn(columnId, side);\n }\n\n public unregisterStickyColumn(columnId: string): void {\n this._columns.unregisterStickyColumn(columnId);\n }\n\n // --- Resize operations (called by NgnTableTh) ---\n\n public startColumnResize(columnIndex: number, event: PointerEvent): void {\n this._columns.startColumnResize(columnIndex, event);\n }\n\n public dragColumnResize(columnIndex: number, event: PointerEvent): void {\n this._columns.dragColumnResize(columnIndex, event);\n }\n\n public endColumnResize(columnIndex: number, cancel: boolean): void {\n this._columns.endColumnResize(columnIndex, cancel);\n }\n\n public autoSizeColumn(columnIndex: number): void {\n this._columns.autoSizeColumn(columnIndex);\n }\n\n // --- Reorder operations (called by NgnTableReorderableColumn) ---\n\n public getReorderBounds(columnId: string): { min: number; max: number } {\n return this._columns.getReorderBounds(columnId);\n }\n\n public startColumnReorder(columnId: string): void {\n this._columns.startColumnReorder(columnId);\n }\n\n public dragColumnReorder(event: PointerEvent): void {\n this._columns.dragColumnReorder(event);\n }\n\n public endColumnReorder(cancel: boolean): void {\n this._columns.endColumnReorder(cancel);\n }\n\n public getReorderSourceColumnId(): string | null {\n return this._columns.getReorderSourceColumnId();\n }\n\n // --- Selection operations ---\n\n public isRowSelected(id: T[keyof T] & (string | number)): boolean {\n return this._selection.isRowSelected(id);\n }\n\n public handleRowClick(row: FormattedTableDataRow<T>, event: MouseEvent): void {\n this._selection.handleRowClick(row, event);\n }\n\n public handleCheckboxChange(row: FormattedTableDataRow<T>): void {\n this._selection.handleCheckboxChange(row);\n }\n\n public toggleSelectAll(): void {\n if (this.lazy() && this.lazyMode() === 'infinite') {\n this.selectAllMatching.update(v => !v);\n return;\n }\n this._selection.toggleSelectAll();\n }\n\n // --- Row actions registry ---\n\n /**\n * Registers a row's {@link NgnTableRowActions} directive keyed by its row\n * index, so keyboard navigation can look up the active row's actions.\n * Called by `NgnTableRowActions`; not intended for manual use.\n */\n public registerRowActions(index: number, dir: NgnTableRowActions): void {\n this._rowActions.set(index, dir);\n }\n\n /**\n * Unregisters a row's actions directive. Called by `NgnTableRowActions`.\n * Only removes the entry if `dir` is still the registered owner for\n * `index`, so a stale unregister (e.g. after row recycling re-registered\n * a different instance at the same index) cannot clobber it.\n */\n public unregisterRowActions(index: number, dir: NgnTableRowActions): void {\n if (this._rowActions.get(index) === dir) this._rowActions.delete(index);\n }\n\n /** Looks up the registered actions directive for a row index, if any. */\n public getRowActions(index: number): NgnTableRowActions | undefined {\n return this._rowActions.get(index);\n }\n\n /**\n * Whether keyboard focus is currently inside the action bar of the row at\n * `index` — i.e. this row is both the current row and\n * {@link TableRowNavigationModel.inActions}. Drives the `active-row`\n * highlight in {@link NgnTableBodyTr}.\n */\n public isRowInActions(index: number): boolean {\n return this._rowNav.inActions() && this.focusedRowIndex() === index;\n }\n\n // --- Keyboard navigation ---\n\n protected onKeyDown(event: KeyboardEvent): void {\n if (this._rowNav.onKeyDown(event)) return;\n if (this._rowNav.inActions()) return; // focus is in a row's action bar — selection must not handle keys\n this._selection.onKeyDown(event);\n }\n\n // --- Row grouping ---\n\n /**\n * Toggle the expanded state of a group identified by its column value.\n */\n public toggleGroup(groupKey: T[G] & (string | number)): void {\n const current = this.expandedGroups();\n if (current.includes(groupKey)) {\n this.expandedGroups.set(current.filter(k => k !== groupKey));\n } else {\n this.expandedGroups.set([...current, groupKey]);\n }\n }\n\n /**\n * Toggle a group from a group-header row. Used in the template where\n * the scroller item type cannot carry the `G` generic.\n * @internal\n */\n protected toggleGroupFromRow(row: FormattedTableGroupHeaderRow): void {\n this.toggleGroup(row.groupKey as T[G] & (string | number));\n }\n}\n","<span\n aria-live=\"polite\"\n aria-atomic=\"true\"\n style=\"\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n \"\n >{{ liveAnnouncement() }}</span\n>\n<table\n #scrollContainer\n role=\"grid\"\n ngnScrollShadow=\"horizontal\"\n ngnScrollShadowUnstyled\n [ptInt]=\"this\"\n [ptClass]=\"{ table: true, striped: striped() }\"\n [attr.aria-multiselectable]=\"selectionMode() === 'multi' ? true : null\"\n [attr.aria-rowcount]=\"formattedRows().length\"\n [style.--ngn-table-column-count]=\"totalColumnCount()\"\n [style.--ngn-table-selection-offset]=\"showCheckboxes() ? 1 : 0\"\n [style.grid-template-columns]=\"gridTemplateColumns()\"\n [style.--ngn-table-row-height.px]=\"rowHeight()\"\n>\n <thead role=\"rowgroup\" [ptInt]=\"this\" [ptClass]=\"'head'\">\n <ng-container [ngTemplateOutlet]=\"headerTemplate()\"></ng-container>\n </thead>\n @if (dropIndicatorState()) {\n <div\n [ptInt]=\"this\"\n [ptClass]=\"'drop-indicator'\"\n [style.left.px]=\"dropIndicatorState()!.leftPx\"\n [style.top.px]=\"dropIndicatorState()!.topPx\"\n [style.height.px]=\"dropIndicatorState()!.heightPx\"\n ></div>\n }\n\n <tbody\n role=\"rowgroup\"\n [ptInt]=\"this\"\n [ptClass]=\"'body'\"\n [ptDep]=\"'scroller'\"\n ngn-scroller\n #scroller\n [scrollContainer]=\"scrollContainer\"\n [virtual]=\"virtual()\"\n [items]=\"pagedRows()\"\n [fieldId]=\"'id'\"\n [itemHeight]=\"rowHeight() || 0\"\n [virtualPadding]=\"virtualPadding()\"\n [style.--ngn-table-item-start-index]=\"scroller.itemStartIndex()\"\n >\n <ng-template #item [ngnTemplate]=\"scroller.templateTypes.item\" let-item let-index=\"index\">\n @if (item.kind === 'group-header') {\n @if (groupHeaderTemplate(); as customGroupHeader) {\n <ng-container\n [ngTemplateOutlet]=\"customGroupHeader\"\n [ngTemplateOutletContext]=\"{\n $implicit: {\n groupKey: item.groupKey,\n groupValue: item.groupValue,\n count: item.count,\n expanded: item.expanded,\n },\n }\"\n ></ng-container>\n } @else {\n <tr\n [ngnTableGroupHeaderTr]=\"item\"\n [class]=\"theme.classes({ 'group-expanded': item.expanded })\"\n [attr.aria-expanded]=\"item.expanded\"\n role=\"row\"\n (click)=\"toggleGroupFromRow(item)\"\n >\n <td [class]=\"theme.class('group-header-cell')\" role=\"gridcell\">\n <ngn-icon\n [ptInt]=\"this\"\n [ptClass]=\"'group-toggle'\"\n [ptDep]=\"'group-toggle-icon'\"\n [defaultIcon]=\"'table-group-toggle'\"\n />\n <span>{{ item.groupValue }}</span>\n <span>({{ item.count }})</span>\n </td>\n </tr>\n }\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"bodyTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n ></ng-container>\n }\n </ng-template>\n @if (skeletonRows() > 0) {\n @if (loadingTemplate(); as customLoading) {\n <ng-container [ngTemplateOutlet]=\"customLoading\"></ng-container>\n } @else {\n @for (i of [].constructor(skeletonRows()); track $index) {\n <tr [class]=\"theme.class('skeleton-row')\" role=\"row\" aria-hidden=\"true\">\n <td [class]=\"theme.class('skeleton-cell')\" role=\"gridcell\"></td>\n </tr>\n }\n }\n }\n @if (loadStatus() === 'error') {\n @if (errorTemplate(); as customError) {\n <ng-container\n [ngTemplateOutlet]=\"customError\"\n [ngTemplateOutletContext]=\"{\n $implicit: { error: loadError(), retry: retryLoad.bind(this) },\n }\"\n ></ng-container>\n } @else {\n <tr [class]=\"theme.class('error-row')\" role=\"row\">\n <td [attr.colspan]=\"totalColumnCount()\" role=\"gridcell\">\n <span>{{ i18n['table_loadError']() }}</span>\n <button ngnButton [kind]=\"'text'\" (click)=\"retryLoad()\">\n {{ i18n['table_retry']() }}\n </button>\n </td>\n </tr>\n }\n }\n </tbody>\n</table>\n@if (paginator()) {\n <ngn-paginator\n [ptInt]=\"this\"\n [ptDep]=\"'paginator'\"\n [mode]=\"lazy() && loadTotal() === undefined ? 'compact' : 'pages'\"\n [totalItems]=\"lazy() ? (loadTotal() ?? 0) : rows().length\"\n [hasNext]=\"lazyHasMore()\"\n (value)=\"pageChanged($event)\"\n />\n}\n","import {\n afterNextRender,\n afterRenderEffect,\n computed,\n Directive,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstance } from '@ngneers/controls/base';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\n\n/**\n * Lightweight body-cell directive. Deliberately does **not** extend `NgnBase`:\n * a `<td>` is instantiated once per cell (thousands per table), so it avoids the\n * per-control overhead (kind/color effects, `viewChildren` query, theme kind/color\n * injection, leave-animation hooks). It only does what a cell needs — apply the\n * `cell` class, expose its visual column index, and mirror sticky positioning.\n */\n@Directive({\n selector: '[ngnTableTd]',\n host: { role: 'gridcell', '[style.--ngn-table-column-index]': '_visualColumnIndex()' },\n})\nexport class NgnTableTd {\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _table = signal<NgnTable<any, any> | null>(null);\n\n /** 0-based logical (DOM) index of this cell within its row. */\n private readonly _logicalIndex = signal(0);\n\n /** 1-based visual column index, remapped through the table's column order. */\n protected readonly _visualColumnIndex = computed(() => {\n const logicalIndex = this._logicalIndex();\n const table = this._table();\n if (table) {\n // Subtract the selection column offset so DOM index aligns with registered header cells.\n const offset = table.showCheckboxes() ? 1 : 0;\n return table.getVisualColumnIndex(logicalIndex - offset);\n }\n return logicalIndex + 1;\n });\n\n private readonly _columnId = computed(() => {\n const table = this._table();\n if (!table) return null;\n const offset = table.showCheckboxes() ? 1 : 0;\n const logicalIndex = this._logicalIndex() - offset;\n const cells = table.getRegisteredHeaderCells();\n return cells[logicalIndex]?.ngnTableTh() ?? null;\n });\n\n private readonly _stickyInfo = computed(() => {\n const table = this._table();\n const columnId = this._columnId();\n if (!table || !columnId) return null;\n return table.getStickyInfo(columnId);\n });\n\n constructor() {\n this.prepareDom();\n const el = this._element.nativeElement;\n const parent = el.parentElement?.children;\n if (parent) {\n const index = Array.from(parent).findIndex(child => child === el);\n this._logicalIndex.set(index);\n }\n\n afterNextRender(() => {\n const table = getNearestNgnInstance(el, NgnTable) as NgnTable<any, any> | null;\n this._table.set(table);\n });\n\n afterRenderEffect(() => {\n const info = this._stickyInfo();\n const el = this._element.nativeElement;\n toggleClass(el, this.theme.class('sticky-start'), info?.side === 'start');\n toggleClass(el, this.theme.class('sticky-end'), info?.side === 'end');\n toggleClass(el, this.theme.class('sticky-start-edge'), info?.side === 'start' && info.isEdge);\n toggleClass(el, this.theme.class('sticky-end-edge'), info?.side === 'end' && info.isEdge);\n\n if (info) {\n el.style.position = 'sticky';\n if (info.side === 'start') {\n el.style.left = `var(--ngn-sticky-start-offset-${info.index})`;\n el.style.removeProperty('right');\n } else {\n el.style.right = `var(--ngn-sticky-end-offset-${info.index})`;\n el.style.removeProperty('left');\n }\n } else {\n el.style.removeProperty('position');\n el.style.removeProperty('left');\n el.style.removeProperty('right');\n }\n });\n }\n\n private prepareDom() {\n toggleClass(this._element.nativeElement, this.theme.class('cell'), true);\n }\n}\n","import {\n afterNextRender,\n afterRenderEffect,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n model,\n type OnDestroy,\n type OnInit,\n Renderer2,\n signal,\n type Signal,\n} from '@angular/core';\nimport { getNearestNgnInstance, NgnBase } from '@ngneers/controls/base';\nimport { NgnError, toggleClass } from '@ngneers/controls/utils';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\n\nimport type { ResizableItem, ResizeLimit, ResizeSize } from '@ngneers/controls/api/resize';\n\n@Directive({\n selector: '[ngnTableTh]',\n host: {\n role: 'columnheader',\n '[style.--ngn-table-column-index]': '_visualColumnIndex()',\n },\n})\nexport class NgnTableTh extends NgnBase<'table'> implements ResizableItem, OnDestroy, OnInit {\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\n private _table?: NgnTable<any, any>;\n private readonly _tableSignal = signal<NgnTable<any, any> | null>(null);\n private _resizeHandle?: HTMLDivElement;\n\n /** The unique column identifier for this header cell, used for sorting, filtering, sticky, and reorder. */\n public readonly ngnTableTh = input.required<string>();\n\n /**\n * The size of this column (e.g. '1fr', '200px', '25%').\n * @default '1fr'\n */\n public readonly size = model<ResizeSize>('1fr');\n\n /**\n * The minimum size constraint for this column.\n * @default '50px'\n */\n public readonly minSize: Signal<ResizeLimit> = input<ResizeLimit>('50px');\n\n /**\n * The maximum size constraint for this column.\n * @default '100%'\n */\n public readonly maxSize: Signal<ResizeLimit> = input<ResizeLimit>('100%');\n\n /**\n * Whether this column is resizable. Computed from the parent table's `resizable` input.\n */\n public readonly resizable = computed(() => this._table?.resizable() ?? false);\n\n /**\n * Whether the resize handle should be shown. Hidden for the last column in adjacent\n * and proportional modes since it is implicitly resized via the previous column's handle.\n * Push mode shows handles on all columns since each column grows independently.\n */\n private readonly _showHandle = computed(() => {\n if (!this._table?.resizable()) return false;\n if (this._table.resizeMode() === 'push') return true;\n // Adjacent & proportional: hide handle on last column\n const cells = this._table.getRegisteredHeaderCells();\n return cells.indexOf(this) < cells.length - 1;\n });\n\n /**\n * 1-based visual column index, derived from the table's column order map.\n * Falls back to registration index + 1 when no reordering is active.\n */\n public readonly _visualColumnIndex = computed(() => {\n if (!this._table) return undefined;\n const map = this._table.columnOrderMap();\n return map.get(this.ngnTableTh()) ?? this.getColumnIndex() + 1;\n });\n\n constructor() {\n super();\n this.prepareDom();\n\n const renderer = inject(Renderer2);\n const elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n afterNextRender(() => {\n // Wrap existing content in a text container for ellipsis support\n const textWrapper = renderer.createElement('span');\n textWrapper.classList.add(this.theme.class('cell-text'));\n const el = elRef.nativeElement;\n while (el.firstChild) {\n textWrapper.appendChild(el.firstChild);\n }\n el.appendChild(textWrapper);\n\n // Move dynamically-created controls back out of the text wrapper\n // so they participate in the header cell's flex layout (order: 2, 3)\n const filterControl = textWrapper.querySelector(`.${this.theme.class('filter-control')}`);\n if (filterControl) el.appendChild(filterControl);\n const sortControl = textWrapper.querySelector(`.${this.theme.class('sort-control')}`);\n if (sortControl) el.appendChild(sortControl);\n\n // Spacer div for flex layout\n const spacer = renderer.createElement('div');\n spacer.classList.add(this.theme.class('spacer'));\n elRef.nativeElement.appendChild(spacer);\n\n // Resize handle\n this._resizeHandle = renderer.createElement('div') as HTMLDivElement;\n this._resizeHandle.classList.add(this.theme.class('resize-handle'));\n this._resizeHandle.addEventListener('pointerdown', this.onResizePointerDown);\n this._resizeHandle.addEventListener('dblclick', this.onResizeDblClick);\n elRef.nativeElement.appendChild(this._resizeHandle);\n });\n\n // Toggle handle visibility based on mode and column position\n afterRenderEffect(() => {\n const show = this._showHandle();\n if (this._resizeHandle) {\n this._resizeHandle.style.display = show ? '' : 'none';\n }\n });\n\n // Sticky column classes and offsets\n afterRenderEffect(() => {\n const table = this._tableSignal();\n if (!table) return;\n const info = table.getStickyInfo(this.ngnTableTh());\n const el = this.element.nativeElement;\n toggleClass(el, this.theme.class('sticky-start'), info?.side === 'start');\n toggleClass(el, this.theme.class('sticky-end'), info?.side === 'end');\n toggleClass(el, this.theme.class('sticky-start-edge'), info?.side === 'start' && info.isEdge);\n toggleClass(el, this.theme.class('sticky-end-edge'), info?.side === 'end' && info.isEdge);\n\n if (info) {\n el.style.position = 'sticky';\n if (info.side === 'start') {\n el.style.left = `var(--ngn-sticky-start-offset-${info.index})`;\n el.style.removeProperty('right');\n } else {\n el.style.right = `var(--ngn-sticky-end-offset-${info.index})`;\n el.style.removeProperty('left');\n }\n } else {\n el.style.removeProperty('position');\n el.style.removeProperty('left');\n el.style.removeProperty('right');\n }\n });\n }\n\n public ngOnInit(): void {\n const table = getNearestNgnInstance(this.element.nativeElement, NgnTable<any, any>);\n if (!table) {\n throw new NgnError('ngnTableTh', 'ngnTableTh must be used within an NgnTable component');\n }\n this._table = table;\n this._tableSignal.set(table);\n this._table.registerHeaderCell(this);\n }\n\n public ngOnDestroy(): void {\n this._table?.unregisterHeaderCell(this);\n this._resizeHandle?.removeEventListener('pointerdown', this.onResizePointerDown);\n this._resizeHandle?.removeEventListener('dblclick', this.onResizeDblClick);\n }\n\n private prepareDom() {\n toggleClass(this.element.nativeElement, this.theme.class('cell'), true);\n toggleClass(this.element.nativeElement, this.theme.class('resizable'), true);\n }\n\n private readonly onResizeDblClick = (event: MouseEvent) => {\n if (!this._table?.resizable()) return;\n event.preventDefault();\n event.stopPropagation();\n const columnIndex = this.getColumnIndex();\n if (columnIndex < 0) return;\n this._table.autoSizeColumn(columnIndex);\n };\n\n private readonly onResizePointerDown = (event: PointerEvent) => {\n if (!this._table?.resizable()) return;\n event.preventDefault();\n event.stopPropagation();\n\n const target = event.target as HTMLElement;\n try {\n target.setPointerCapture(event.pointerId);\n } catch {\n // Ignore\n }\n\n const columnIndex = this.getColumnIndex();\n if (columnIndex < 0) return;\n\n this._table.startColumnResize(columnIndex, event);\n\n const onPointerMove = (e: PointerEvent) => {\n this._table!.dragColumnResize(columnIndex, e);\n };\n const cleanup = (cancel: boolean) => {\n this._table!.endColumnResize(columnIndex, cancel);\n target.removeEventListener('pointermove', onPointerMove);\n target.removeEventListener('pointerup', onPointerUp);\n target.removeEventListener('pointercancel', onPointerCancel);\n };\n const onPointerUp = () => cleanup(false);\n const onPointerCancel = () => cleanup(true);\n\n target.addEventListener('pointermove', onPointerMove);\n target.addEventListener('pointerup', onPointerUp);\n target.addEventListener('pointercancel', onPointerCancel);\n };\n\n private getColumnIndex(): number {\n if (!this._table) return -1;\n const cells = this._table.getRegisteredHeaderCells();\n return cells.indexOf(this);\n }\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\nimport { NgnBase } from '@ngneers/controls/base';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\n@Directive({ selector: '[ngnTableHeadTr]', host: { role: 'row', '[attr.aria-rowindex]': '1' } })\nexport class NgnTableHeadTr extends NgnBase<'table'> {\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\n private readonly _element = inject(ElementRef<HTMLElement>);\n\n constructor() {\n super();\n this.prepareDom();\n }\n\n private prepareDom() {\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\n }\n}\n","import {\n afterNextRender,\n Directive,\n ElementRef,\n inject,\n type OnDestroy,\n Type,\n} from '@angular/core';\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\nimport { NgnTableTh } from './table-header-cell';\n\n/** Minimum distance in pixels before a drag is initiated. */\nconst REORDER_DEAD_ZONE_PX = 5;\n\n/**\n * @category directive\n */\n@Directive({\n selector: '[ngnTableReorderableColumn]',\n})\nexport class NgnTableReorderableColumn implements OnDestroy {\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _headerCell = inject(NgnTableTh);\n private readonly _columnId = this._headerCell.ngnTableTh;\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n\n private _isDragging = false;\n private _startX = 0;\n private _startY = 0;\n private _pointerId: number | null = null;\n private _boundOnPointerMove: ((e: PointerEvent) => void) | null = null;\n private _boundOnPointerUp: (() => void) | null = null;\n private _boundOnPointerCancel: (() => void) | null = null;\n private _boundOnKeyDown: ((e: KeyboardEvent) => void) | null = null;\n\n constructor() {\n afterNextRender(() => {\n const el = this._element.nativeElement;\n el.addEventListener('pointerdown', this.onPointerDown);\n });\n }\n\n public ngOnDestroy(): void {\n this._element.nativeElement.removeEventListener('pointerdown', this.onPointerDown);\n this.cleanup();\n }\n\n private readonly onPointerDown = (event: PointerEvent) => {\n const table = this._table();\n if (!table?.reorderable()) return;\n\n // Don't intercept resize handle clicks\n const target = event.target as HTMLElement;\n if (target.classList.contains(this.theme.class('resize-handle'))) return;\n\n event.preventDefault();\n\n this._startX = event.clientX;\n this._startY = event.clientY;\n this._isDragging = false;\n this._pointerId = event.pointerId;\n\n try {\n this._element.nativeElement.setPointerCapture(event.pointerId);\n } catch {\n // Ignore\n }\n\n this._boundOnPointerMove = (e: PointerEvent) => this.onPointerMove(e);\n this._boundOnPointerUp = () => this.onPointerUp();\n this._boundOnPointerCancel = () => this.onPointerCancel();\n this._boundOnKeyDown = (e: KeyboardEvent) => this.onKeyDown(e);\n\n this._element.nativeElement.addEventListener('pointermove', this._boundOnPointerMove);\n this._element.nativeElement.addEventListener('pointerup', this._boundOnPointerUp);\n this._element.nativeElement.addEventListener('pointercancel', this._boundOnPointerCancel);\n document.addEventListener('keydown', this._boundOnKeyDown);\n };\n\n private onPointerMove(event: PointerEvent): void {\n if (!this._isDragging) {\n const deltaX = event.clientX - this._startX;\n const deltaY = event.clientY - this._startY;\n const distance = Math.sqrt(deltaX ** 2 + deltaY ** 2);\n if (distance < REORDER_DEAD_ZONE_PX) return;\n\n // Start dragging\n this._isDragging = true;\n const table = this._table();\n table?.startColumnReorder(this._columnId());\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), true);\n }\n\n this._table()?.dragColumnReorder(event);\n }\n\n private onPointerUp(): void {\n if (this._isDragging) {\n this._table()?.endColumnReorder(false);\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\n }\n this.cleanup();\n }\n\n private onPointerCancel(): void {\n if (this._isDragging) {\n this._table()?.endColumnReorder(true);\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\n }\n this.cleanup();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this._isDragging) {\n this._table()?.endColumnReorder(true);\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\n this.cleanup();\n }\n }\n\n private cleanup(): void {\n this._isDragging = false;\n if (this._pointerId != null) {\n try {\n this._element.nativeElement.releasePointerCapture(this._pointerId);\n } catch {\n // Ignore — capture may already be released\n }\n this._pointerId = null;\n }\n if (this._boundOnPointerMove) {\n this._element.nativeElement.removeEventListener('pointermove', this._boundOnPointerMove);\n this._boundOnPointerMove = null;\n }\n if (this._boundOnPointerUp) {\n this._element.nativeElement.removeEventListener('pointerup', this._boundOnPointerUp);\n this._boundOnPointerUp = null;\n }\n if (this._boundOnPointerCancel) {\n this._element.nativeElement.removeEventListener('pointercancel', this._boundOnPointerCancel);\n this._boundOnPointerCancel = null;\n }\n if (this._boundOnKeyDown) {\n document.removeEventListener('keydown', this._boundOnKeyDown);\n this._boundOnKeyDown = null;\n }\n }\n}\n","import { computed, Directive, effect, ElementRef, inject, input, Type } from '@angular/core';\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { NgnScrollerItem } from '@ngneers/controls/scroller';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { setInputSignalValue } from '@ngneers/controls/utils-ng';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\n\nimport type { FormattedTableDataRow } from './types';\n\n@Directive({\n selector: '[ngnTableBodyTr]',\n host: {\n '[attr.aria-rowindex]': 'ngnTableBodyTr().index + 2',\n '[style.--ngn-table-row-index]': 'ngnTableBodyTr().index + 2',\n '[class]': `theme.classes({\n 'even': ngnTableBodyTr().index % 2 === 0,\n 'selected-row': selected(),\n 'focused-row': focused(),\n 'active-row': active()\n })`,\n '[attr.aria-selected]': 'selectable() ? selected() : null',\n role: 'row',\n '(click)': 'onRowClick($event)',\n },\n})\nexport class NgnTableBodyTr<T> extends NgnScrollerItem {\n /** The formatted data row this `<tr>` renders. */\n public readonly ngnTableBodyTr = input.required<FormattedTableDataRow<T>>();\n /** The item bound to the underlying scroller entry; kept in sync with {@link ngnTableBodyTr}. */\n public override readonly ngnScrollerItem = input<object>({});\n private readonly _element = inject(ElementRef<HTMLElement>);\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n\n protected readonly selectable = computed(() => !!this._table()?.selectionMode());\n\n protected readonly selected = computed(() => {\n const table = this._table();\n if (!table || !table.selectionMode()) return false;\n const row = this.ngnTableBodyTr();\n return table.isRowSelected(row.id);\n });\n\n /**\n * Whether this row is the table's single current-row for keyboard\n * navigation ({@link NgnTable.focusedRowIndex}). Tracks selection keyboard\n * nav when {@link NgnTable.selectionMode} is set, and also tracks\n * row-actions keyboard nav on non-selectable tables that have row actions,\n * so a keyboard user always sees which row is current.\n */\n protected readonly focused = computed(() => {\n const table = this._table();\n if (!table) return false;\n return table.focusedRowIndex() === this.ngnTableBodyTr().index;\n });\n\n /** Whether this row's action bar currently has DOM focus. */\n protected readonly active = computed(() => {\n const table = this._table();\n if (!table) return false;\n return table.isRowInActions(this.ngnTableBodyTr().index);\n });\n\n constructor() {\n super();\n effect(() => {\n const row = this.ngnTableBodyTr();\n setInputSignalValue(this.ngnScrollerItem, row);\n });\n this.prepareDom();\n }\n\n private prepareDom() {\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\n }\n\n protected onRowClick(event: MouseEvent): void {\n const table = this._table();\n if (!table || !table.selectionMode()) return;\n table.handleRowClick(this.ngnTableBodyTr(), event);\n }\n}\n","import type { NgnActionButtonConfig, NgnActionItem } from '@ngneers/controls/api';\n\n/** Whether an action opens a submenu rather than firing a leaf callback. */\nexport function hasChildren(item: NgnActionItem): boolean {\n return !!item.children && item.children.length > 0;\n}\n\n/**\n * Adapts an {@link NgnActionItem} (the context-menu shape) to the\n * {@link NgnActionButtonConfig} that `ngn-action-button` consumes. Icon-only\n * rendering (`kind: 'icon'`) is chosen when the item has an icon, so the label\n * becomes the button's tooltip / accessible name.\n */\nexport function actionItemToButtonConfig(item: NgnActionItem): NgnActionButtonConfig<string> {\n return {\n label: item.label,\n value: item.id,\n icon: item.icon,\n kind: item.icon ? 'icon' : undefined,\n disabled: item.disabled,\n testId: item.testId,\n action: () => item.callback?.(),\n };\n}\n","import {\n ComponentRef,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n type OnDestroy,\n type Signal,\n ViewContainerRef,\n viewChildren,\n} from '@angular/core';\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\nimport { NgnActionButton } from '@ngneers/controls/button';\nimport { NgnMenu, openMenuAt } from '@ngneers/controls/menu';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { actionItemToButtonConfig, hasChildren } from './action-item-mapping';\n\nimport type { NgnActionButtonConfig, NgnActionItem } from '@ngneers/controls/api';\n\ntype BarAction = {\n item: NgnActionItem;\n config: NgnActionButtonConfig<string>;\n hasChildren: boolean;\n};\n\n/**\n * Inline row-actions bar: renders each {@link NgnActionItem} as an\n * `ngn-action-button`. An action with `children` opens a submenu popover\n * anchored to its own button — the anchor is resolved from the rendered\n * button element itself, never from a `testId` lookup, so it keeps working\n * even when an action has no `testId`. Positioning/visibility is applied by\n * the table theme via the `row-actions` class; this component only renders\n * the buttons.\n */\n@Component({\n selector: 'ngn-table-row-actions-bar',\n imports: [NgnActionButton],\n template: `\n @for (action of barActions(); track action.item.id) {\n <ngn-action-button\n [config]=\"action.config\"\n [inline]=\"true\"\n [attr.aria-haspopup]=\"action.hasChildren ? 'menu' : null\"\n (clicked)=\"onClicked(action)\"\n />\n }\n `,\n host: {\n '[class]': `theme.class('row-actions')`,\n role: 'presentation',\n '(click)': 'onBarClick($event)',\n },\n})\nexport class NgnTableRowActionsBar implements OnDestroy {\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _vcr = inject(ViewContainerRef);\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private _menu?: ComponentRef<NgnMenu>;\n\n // One host `ElementRef` per rendered `ngn-action-button`, in the same order\n // as `barActions()`. Reading the native `<button>` off these refs is the\n // robust anchor for the submenu popover — it doesn't depend on the action\n // having a `testId`. The accessible name itself is owned by `NgnTooltip`\n // (via `ngnTooltipAutoAriaMode=\"label\"` on `action-button.html`), not this\n // component.\n private readonly _buttonHosts = viewChildren(NgnActionButton, { read: ElementRef });\n\n /**\n * The actions to render as buttons. Used for standalone consumers that bind\n * an array directly. When {@link actionsSource} is provided (the directive\n * mounts the bar imperatively), that signal takes precedence.\n */\n public readonly actions = input<NgnActionItem[]>([]);\n\n /**\n * A reactive source of actions. Preferred over {@link actions} when set:\n * the host directive passes its own `actions` input signal here so the bar\n * reads it lazily during its own change detection. This avoids the directive\n * imperatively re-pushing the array every change-detection pass — which, when\n * a consumer binds a fresh array each pass (e.g. `actionsFor(row)`), would\n * otherwise loop into infinite change detection (NG0103).\n * @internal\n */\n public readonly actionsSource = input<Signal<NgnActionItem[]> | null>(null);\n\n protected readonly barActions = computed<BarAction[]>(() => {\n const source = this.actionsSource();\n const items = source ? source() : this.actions();\n return items.map(item => ({\n item,\n config: actionItemToButtonConfig(item),\n hasChildren: hasChildren(item),\n }));\n });\n\n public ngOnDestroy(): void {\n this._menu?.destroy();\n }\n\n // Single source of truth for the rendered `<button>` elements, in bar order:\n // derived from the `_buttonHosts()` view query (same as the submenu anchor\n // uses), rather than a parallel `querySelectorAll` — so focus navigation and\n // anchoring can never drift apart.\n private readonly _buttons = (): HTMLButtonElement[] =>\n this._buttonHosts()\n .map(host => this._buttonElement(host))\n .filter((b): b is HTMLButtonElement => b !== null);\n\n /** Focuses the first enabled action button. Returns whether one was focused. */\n public focusFirst(): boolean {\n const btn = this._buttons().find(b => !b.disabled);\n btn?.focus();\n return !!btn;\n }\n\n /**\n * Moves focus by `delta` among the rendered action buttons. Returns whether\n * focus stayed within the bar — `false` when the move would go past the\n * first/last button, in which case focus is left unchanged.\n */\n public move(delta: 1 | -1): boolean {\n const buttons = this._buttons();\n const active = document.activeElement;\n const idx = buttons.findIndex(b => b === active);\n const next = idx + delta;\n if (next < 0 || next >= buttons.length) return false;\n buttons[next]?.focus();\n return true;\n }\n\n /**\n * Stops a native button click (mouse or Space/Enter key activation) from\n * bubbling to the row's own click handler — otherwise, on a table with\n * `selectionMode` set, activating an action would also select/toggle the\n * row it lives in. Mirrors {@link import('./table-selection-column').NgnTableSelectionColumn}'s\n * click guard for the same reason.\n */\n protected onBarClick(event: MouseEvent): void {\n event.stopPropagation();\n }\n\n protected onClicked(action: BarAction): void {\n if (!action.hasChildren) return;\n const index = this.barActions().indexOf(action);\n const host = index >= 0 ? this._buttonHosts()[index] : undefined;\n const anchor = (host && this._buttonElement(host)) ?? this._element.nativeElement;\n this._menu = openMenuAt(\n this._vcr,\n this._menu,\n action.item.children ?? [],\n anchor,\n 'bottom-end'\n );\n }\n\n private _buttonElement(host: ElementRef<HTMLElement>): HTMLButtonElement | null {\n return host.nativeElement.querySelector('button');\n }\n}\n","import {\n booleanAttribute,\n ComponentRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n type OnDestroy,\n Renderer2,\n Type,\n ViewContainerRef,\n} from '@angular/core';\nimport { domEventHandler, setComponentInput } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { NgnMenu, openMenuAt } from '@ngneers/controls/menu';\n\nimport { NgnTable } from './table';\nimport { NgnTableBodyTr } from './table-row';\nimport { NgnTableRowActionsBar } from './table-row-actions-bar';\n\nimport type { NgnActionItem } from '@ngneers/controls/api';\n\n/**\n * Per-row actions for the table body `<tr>`. Exposes the same `NgnActionItem[]`\n * as a right-click context menu ({@link context}) and/or an inline hover\n * button-bar ({@link inline}). Both modes are on by default and independent.\n */\n@Directive({ selector: '[ngnTableRowActions]' })\nexport class NgnTableRowActions implements OnDestroy {\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _vcr = inject(ViewContainerRef);\n private readonly _renderer = inject(Renderer2);\n private readonly _row = inject(NgnTableBodyTr, { optional: true });\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n private _menu?: ComponentRef<NgnMenu>;\n private _bar?: ComponentRef<NgnTableRowActionsBar>;\n\n /** The actions available on this row. */\n public readonly actions = input.required<NgnActionItem[]>({ alias: 'ngnTableRowActions' });\n\n /**\n * Whether right-clicking the row opens a context menu of the actions.\n * @default true\n */\n public readonly context = input(true, {\n transform: booleanAttribute,\n alias: 'ngnTableRowActionsContext',\n });\n\n /**\n * Whether an inline button-bar is rendered at the row's right edge, revealed\n * on hover or keyboard focus.\n * @default true\n */\n public readonly inline = input(true, {\n transform: booleanAttribute,\n alias: 'ngnTableRowActionsInline',\n });\n\n constructor() {\n domEventHandler(this._element, 'contextmenu', e => this._onContextMenu(e));\n\n effect(() => {\n if (this.inline()) {\n this._mountBar();\n } else {\n this._unmountBar();\n }\n });\n\n // Register with the nearest table keyed by this row's index, so the\n // table's keyboard navigation model can reach this directive.\n effect(onCleanup => {\n const table = this._table();\n const row = this._row;\n if (!table || !row) return;\n const index = row.ngnTableBodyTr().index;\n table.registerRowActions(index, this);\n onCleanup(() => table.unregisterRowActions(index, this));\n });\n }\n\n public ngOnDestroy(): void {\n this._menu?.destroy();\n this._unmountBar();\n }\n\n /**\n * Opens the context menu anchored to the row element (keyboard trigger:\n * Enter, ContextMenu, or Shift+F10). Deliberately independent of\n * {@link context} — that input only toggles the right-click affordance,\n * not the keyboard one, so keyboard users can always reach a row's menu.\n */\n public openMenuFromKeyboard(): boolean {\n this._menu = openMenuAt(\n this._vcr,\n this._menu,\n this.actions(),\n this._element.nativeElement,\n 'bottom-start'\n );\n return true;\n }\n\n /** Focuses the first enabled action button in the inline bar. Returns whether one was focused. */\n public focusFirstAction(): boolean {\n return this._bar?.instance.focusFirst() ?? false;\n }\n\n /** Moves focus by `delta` among the inline bar's action buttons. Returns whether focus stayed within the bar. */\n public moveAction(delta: 1 | -1): boolean {\n return this._bar?.instance.move(delta) ?? false;\n }\n\n private _onContextMenu(event: PointerEvent): void {\n // A `contextmenu` event is by definition a context-menu request (right-click\n // or the keyboard menu key), so no mouse-button check is needed — and\n // `event.button` is not reliably `2` across browsers (e.g. WebKit/Firefox),\n // which would otherwise suppress the menu there.\n if (!this.context()) return;\n if (this._menu?.instance.open()) return;\n event.preventDefault();\n event.stopPropagation();\n this._menu = openMenuAt(this._vcr, this._menu, this.actions(), {\n x: event.clientX,\n y: event.clientY,\n });\n }\n\n private _mountBar(): void {\n if (this._bar) return;\n this._bar = this._vcr.createComponent(NgnTableRowActionsBar);\n // Move the bar's host element inside the <tr> so it joins the row's\n // subgrid and the table's horizontal scroll container. Use Renderer2 so the\n // move stays platform-agnostic (SSR / non-DOM renderers).\n this._renderer.appendChild(this._element.nativeElement, this._bar.location.nativeElement);\n // Pass the actions SIGNAL (not its current value) once. The bar reads it\n // reactively in its own change detection, so we never re-push the array\n // here. Reading `this.actions()` inside this effect-driven method would\n // make the effect re-run on every actions change — and when a consumer\n // binds a fresh array each change-detection pass, re-pushing it would loop\n // into infinite change detection (NG0103).\n setComponentInput(this._bar, 'actionsSource', this.actions);\n }\n\n private _unmountBar(): void {\n this._bar?.destroy();\n this._bar = undefined;\n }\n}\n","import {\n ApplicationRef,\n type ComponentRef,\n computed,\n createComponent,\n Directive,\n effect,\n ElementRef,\n EnvironmentInjector,\n inject,\n type OnDestroy,\n Type,\n} from '@angular/core';\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { NgnCheckbox } from '@ngneers/controls/checkbox';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { toggleClass } from '@ngneers/controls/utils';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\nimport { NgnTableBodyTr } from './table-row';\n\n/**\n * Directive that turns a `<th>` or `<td>` into a selection checkbox column.\n *\n * **Header usage** — renders a \"select all / none\" checkbox:\n * ```html\n * <th ngnTableSelectionColumn></th>\n * ```\n *\n * **Body usage** — renders a per-row checkbox (must be inside a `[ngnTableBodyTr]`):\n * ```html\n * <td ngnTableSelectionColumn></td>\n * ```\n *\n * @category directive\n */\n@Directive({\n selector: '[ngnTableSelectionColumn]',\n host: {\n '(click)': 'onClick($event)',\n },\n})\nexport class NgnTableSelectionColumn implements OnDestroy {\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _envInjector = inject(EnvironmentInjector);\n private readonly _appRef = inject(ApplicationRef);\n private readonly _i18n = inject(I18n).translations;\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n\n /** Non-null only when used inside a body row (`<td>`). */\n private readonly _bodyTr = inject(NgnTableBodyTr, { optional: true });\n\n private readonly _isHeader = this._element.nativeElement.tagName === 'TH';\n\n /**\n * NgnCheckbox created at the application level via `createComponent` + `EnvironmentInjector`.\n * This keeps it outside Angular's view tree so `@for` reconciliation cannot destroy it.\n */\n private _checkboxRef!: ComponentRef<NgnCheckbox<boolean>>;\n\n protected readonly selected = computed(() => {\n if (this._isHeader) return false;\n const table = this._table();\n const row = this._bodyTr?.ngnTableBodyTr();\n if (!table || !row) return false;\n return table.isRowSelected(row.id);\n });\n\n protected readonly focused = computed(() => {\n if (this._isHeader) return false;\n const table = this._table();\n const row = this._bodyTr?.ngnTableBodyTr();\n if (!table || !row) return false;\n return table.focusedRowIndex() === row.index;\n });\n\n constructor() {\n this._prepareDom();\n this._createCheckbox();\n\n if (this._isHeader) {\n this._setupHeaderEffects();\n // Name the select-all checkbox, kept in sync with the active language\n // (translations load asynchronously, so this cannot be set once at init).\n effect(() => {\n setComponentInput(this._checkboxRef, 'label', this._i18n['table_selectAllRows']());\n });\n // Register the selection column once the table signal resolves\n effect(() => {\n const table = this._table();\n if (table) {\n table.registerSelectionColumn();\n }\n });\n } else {\n this._setupBodyEffects();\n // Mirror the header: name the per-row checkbox, kept in sync with language.\n effect(() => {\n setComponentInput(this._checkboxRef, 'label', this._i18n['table_selectRow']());\n });\n }\n }\n\n public ngOnDestroy(): void {\n if (this._isHeader) {\n this._table()?.unregisterSelectionColumn();\n }\n this._appRef.detachView(this._checkboxRef.hostView);\n this._checkboxRef.destroy();\n }\n\n private _prepareDom(): void {\n const el = this._element.nativeElement;\n // Mirror the grid roles that ngnTableTh/ngnTableTd set, so the selection column\n // stays inside the table's `role=\"grid\"` semantics instead of being an orphan cell.\n el.setAttribute('role', this._isHeader ? 'columnheader' : 'gridcell');\n toggleClass(el, this.theme.class('cell'), true);\n toggleClass(el, this.theme.class('selection-column'), true);\n }\n\n /**\n * Creates an NgnCheckbox via `createComponent` + `EnvironmentInjector`.\n * The component is attached to `ApplicationRef` (not a ViewContainerRef),\n * so Angular's `@for` block reconciliation cannot destroy it.\n */\n private _createCheckbox(): void {\n this._checkboxRef = createComponent(NgnCheckbox, {\n environmentInjector: this._envInjector,\n });\n this._appRef.attachView(this._checkboxRef.hostView);\n\n const cbEl = this._checkboxRef.location.nativeElement;\n cbEl.classList.add(this.theme.class('selection-checkbox'));\n\n if (this._isHeader) {\n setComponentInput(this._checkboxRef, 'allowIndeterminate', true);\n }\n\n this._element.nativeElement.appendChild(cbEl);\n }\n\n // --- Header (select-all) ---\n\n private _setupHeaderEffects(): void {\n effect(() => {\n const table = this._table();\n if (!table) return;\n setComponentInput(this._checkboxRef, 'value', table.headerCheckboxValue());\n });\n }\n\n // --- Body (per-row) ---\n\n private _setupBodyEffects(): void {\n effect(() => {\n const isSelected = this.selected();\n const isFocused = this.focused();\n const row = this._bodyTr?.ngnTableBodyTr();\n const el = this._element.nativeElement;\n\n setComponentInput(this._checkboxRef, 'value', isSelected);\n if (row) {\n el.style.setProperty('--ngn-table-row-index', String(row.index + 2));\n }\n toggleClass(el, this.theme.class('selected-row-cell'), isSelected);\n toggleClass(el, this.theme.class('focused-row-cell'), isFocused);\n });\n }\n\n // --- Click handling ---\n\n protected onClick(event: MouseEvent): void {\n event.stopPropagation();\n const table = this._table();\n if (!table) return;\n\n if (this._isHeader) {\n table.toggleSelectAll();\n } else {\n const row = this._bodyTr?.ngnTableBodyTr();\n if (row) {\n table.handleCheckboxChange(row);\n }\n }\n }\n}\n","import {\n afterNextRender,\n Directive,\n ElementRef,\n inject,\n input,\n type OnDestroy,\n Type,\n} from '@angular/core';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\n\nimport { NgnTable } from './table';\nimport { NgnTableTh } from './table-header-cell';\n\n@Directive({\n selector: '[ngnTableStickyColumn]',\n})\nexport class NgnTableStickyColumn implements OnDestroy {\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _headerCell = inject(NgnTableTh);\n private readonly _columnId = this._headerCell.ngnTableTh;\n\n /** Which edge the column sticks to: `'start'` (left) or `'end'` (right). */\n public readonly ngnTableStickyColumn = input.required<'start' | 'end'>();\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n\n constructor() {\n afterNextRender(() => {\n const table = this._table();\n if (table) {\n table.registerStickyColumn(this._columnId(), this.ngnTableStickyColumn());\n }\n });\n }\n\n public ngOnDestroy(): void {\n this._table()?.unregisterStickyColumn(this._columnId());\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { NgnTable } from './table';\nimport { NgnTableTd } from './table-cell';\nimport { NgnTableGroupHeaderTr } from './table-group-header-row';\nimport { NgnTableTh } from './table-header-cell';\nimport { NgnTableHeadTr } from './table-header-row';\nimport { NgnTableReorderableColumn } from './table-reorderable-column';\nimport { NgnTableBodyTr } from './table-row';\nimport { NgnTableRowActions } from './table-row-actions';\nimport { NgnTableRowActionsBar } from './table-row-actions-bar';\nimport { NgnTableSelectionColumn } from './table-selection-column';\nimport { NgnTableStickyColumn } from './table-sticky-column';\n\n@NgModule({\n imports: [\n NgnTable,\n NgnTableBodyTr,\n NgnTableTd,\n NgnTableTh,\n NgnTableHeadTr,\n NgnTableGroupHeaderTr,\n NgnTableReorderableColumn,\n NgnTableRowActions,\n NgnTableRowActionsBar,\n NgnTableSelectionColumn,\n NgnTableStickyColumn,\n ],\n exports: [\n NgnTable,\n NgnTableBodyTr,\n NgnTableTd,\n NgnTableTh,\n NgnTableHeadTr,\n NgnTableGroupHeaderTr,\n NgnTableReorderableColumn,\n NgnTableRowActions,\n NgnTableRowActionsBar,\n NgnTableSelectionColumn,\n NgnTableStickyColumn,\n ],\n})\nexport class NgnTableModule {}\n","import {\n ComponentRef,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n type OnDestroy,\n Type,\n ViewContainerRef,\n} from '@angular/core';\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { NgnActionButton } from '@ngneers/controls/button';\nimport { NgnFilter, type NgnFilterDataType } from '@ngneers/controls/filter';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\nimport { NgnTableTh } from './table-header-cell';\n\nimport type { NgnActionButtonConfig } from '@ngneers/controls/api';\n\n/**\n * @category directive\n */\n@Directive({\n selector: '[ngnTableFilterableColumn]',\n host: {\n '[class]': `theme.classes({'filterable-column': true, 'filtered-column': !!filter() })`,\n },\n})\nexport class NgnTableFilterableColumn implements OnDestroy {\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _columnId = inject(NgnTableTh).ngnTableTh;\n\n /** Enables filtering on this column. The directive selector; its value is unused. */\n public readonly ngnTableFilterableColumn = input();\n\n private readonly _ngnActionButton: ComponentRef<NgnActionButton<null>>;\n private readonly _ngnFilter: ComponentRef<NgnFilter>;\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n private readonly _rows = computed(() => {\n return this._table()?.rows() || [];\n });\n protected readonly filter = computed(() => {\n const tableFilter = this._table()?.filters()?.[this._columnId()];\n return tableFilter;\n });\n\n /** The data type of the column, which determines the available filter operators and UI. */\n public readonly ngnTableFilterableColumnType = input.required<NgnFilterDataType>();\n /** For list-based filters, the set of selectable option values to offer. */\n public readonly ngnTableFilterableColumnItems = input<string[] | null | undefined>();\n\n constructor() {\n this._ngnActionButton = inject(ViewContainerRef).createComponent(NgnActionButton<null>);\n this._ngnFilter = inject(ViewContainerRef).createComponent(NgnFilter);\n this._element.nativeElement.appendChild(this._ngnActionButton.location.nativeElement);\n this._element.nativeElement.appendChild(this._ngnFilter.location.nativeElement);\n this._ngnActionButton.location.nativeElement.classList.add(this.theme.class('filter-control'));\n\n setComponentInput(this._ngnActionButton, 'kind', 'icon');\n setComponentInput(this._ngnActionButton, 'inline', true);\n setComponentInput(this._ngnFilter, 'anchor', this._ngnActionButton.location.nativeElement);\n setComponentInput(this._ngnFilter, 'mode', 'headless');\n setComponentInput(this._ngnFilter, 'allowMultiple', true);\n\n const cfg = computed(\n () =>\n <NgnActionButtonConfig<null>>{\n label: 'Filter',\n value: null,\n kind: 'icon',\n defaultIcon: this.filter() ? 'filter-active' : 'filter-inactive',\n action: event => {\n event.stopPropagation();\n this._ngnFilter.instance.show();\n },\n }\n );\n\n effect(() => {\n setComponentInput(this._ngnActionButton, 'config', cfg());\n });\n effect(() => {\n setComponentInput(\n this._ngnFilter,\n 'data',\n this._rows().map(row => row[this._columnId()])\n );\n });\n effect(() => {\n setComponentInput(this._ngnFilter, 'dataType', this.ngnTableFilterableColumnType());\n });\n effect(() => {\n setComponentInput(this._ngnFilter, 'listOptions', this.ngnTableFilterableColumnItems());\n });\n this._ngnFilter.instance.filterChange.subscribe(cfg => {\n const table = this._table();\n const currentFilters = table?.filters() || {};\n table?.filters.set({ ...currentFilters, [this._columnId()]: cfg ?? undefined });\n });\n }\n\n public ngOnDestroy(): void {\n this._ngnActionButton.destroy();\n this._ngnFilter.destroy();\n }\n}\n","import {\n ComponentRef,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n type OnDestroy,\n Type,\n ViewContainerRef,\n} from '@angular/core';\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\n\nimport { NgnTable } from './table';\nimport { NgnTableTh } from './table-header-cell';\n\n/**\n * @category directive\n */\n@Directive({\n selector: '[ngnTableSortableColumn]',\n host: {\n '[class]': `theme.classes({'sortable-column': true, 'sorted-column': !!sort() })`,\n '[attr.aria-sort]': `sort() === 'asc' ? 'ascending' : sort() === 'desc' ? 'descending' : 'none'`,\n '(click)': `onHostClick($event)`,\n },\n})\nexport class NgnTableSortableColumn implements OnDestroy {\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Enables sorting on this column. The directive selector; its value is unused. */\n public readonly ngnTableSortableColumn = input();\n\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\n this._element.nativeElement,\n NgnTable\n );\n protected readonly sort = computed(() => {\n const tableSort = this._table()?.sort();\n if (tableSort?.column === this.columnId()) {\n return tableSort.direction;\n }\n return null;\n });\n\n private readonly columnId = inject(NgnTableTh).ngnTableTh;\n\n private readonly _ngnIcon: ComponentRef<NgnIcon>;\n\n constructor() {\n this._ngnIcon = inject(ViewContainerRef).createComponent(NgnIcon);\n this._element.nativeElement.appendChild(this._ngnIcon.location.nativeElement);\n this._ngnIcon.location.nativeElement.classList.add(this.theme.class('sort-control'));\n\n effect(() => {\n const sort = this.sort();\n setComponentInput(\n this._ngnIcon,\n 'defaultIcon',\n sort === 'asc' ? 'sort-ascending' : sort === 'desc' ? 'sort-descending' : 'sort-neutral'\n );\n });\n }\n\n public ngOnDestroy(): void {\n this._ngnIcon.destroy();\n }\n\n protected onHostClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target.classList.contains(this.theme.class('resize-handle'))) return;\n this.toggleSort();\n }\n\n protected toggleSort(): void {\n const currentSort = this.sort();\n const table = this._table();\n table?.sort.set(\n currentSort === null\n ? { column: this.columnId(), direction: 'asc' }\n : currentSort === 'asc'\n ? { column: this.columnId(), direction: 'desc' }\n : null\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|