@ngneers/controls 0.0.1-pre6 → 0.0.1-pre7
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-accordion.mjs +10 -10
- package/fesm2022/ngneers-controls-accordion.mjs.map +1 -1
- package/fesm2022/ngneers-controls-api-ng.mjs +12 -9
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-avatar.mjs +6 -6
- package/fesm2022/ngneers-controls-avatar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-base.mjs +9 -9
- package/fesm2022/ngneers-controls-base.mjs.map +1 -1
- package/fesm2022/ngneers-controls-breadcrumb.mjs +7 -7
- package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button-group.mjs +3 -3
- package/fesm2022/ngneers-controls-button-group.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button.mjs +6 -6
- package/fesm2022/ngneers-controls-button.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-calendar-time-Bzlv9Vkn.mjs → ngneers-controls-calendar-time-CKAqRgOP.mjs} +4 -4
- package/fesm2022/{ngneers-controls-calendar-time-Bzlv9Vkn.mjs.map → ngneers-controls-calendar-time-CKAqRgOP.mjs.map} +1 -1
- package/fesm2022/ngneers-controls-calendar.mjs +11 -11
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-checkbox.mjs +4 -4
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
- package/fesm2022/ngneers-controls-chip.mjs +4 -4
- package/fesm2022/ngneers-controls-chip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-default-icons.mjs +61 -0
- package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -0
- package/fesm2022/ngneers-controls-defer.mjs +3 -3
- package/fesm2022/ngneers-controls-defer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-dialog.mjs +10 -10
- package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +21 -21
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
- package/fesm2022/ngneers-controls-drawer.mjs +7 -7
- package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-edit-inplace.mjs +7 -7
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-filter.mjs +4 -4
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
- package/fesm2022/ngneers-controls-i18n.mjs +3 -3
- package/fesm2022/ngneers-controls-i18n.mjs.map +1 -1
- package/fesm2022/ngneers-controls-icon.mjs +108 -44
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-inplace.mjs +6 -6
- package/fesm2022/ngneers-controls-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-field.mjs +5 -5
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-mask.mjs +3 -3
- package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input.mjs +3 -3
- package/fesm2022/ngneers-controls-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-item-view.mjs +6 -6
- package/fesm2022/ngneers-controls-item-view.mjs.map +1 -1
- package/fesm2022/ngneers-controls-list-box.mjs +6 -6
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-menu.mjs +10 -10
- package/fesm2022/ngneers-controls-menu.mjs.map +1 -1
- package/fesm2022/ngneers-controls-message.mjs +3 -3
- package/fesm2022/ngneers-controls-message.mjs.map +1 -1
- package/fesm2022/ngneers-controls-paginator.mjs +4 -4
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
- package/fesm2022/ngneers-controls-popover.mjs +11 -6
- package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
- package/fesm2022/ngneers-controls-progress.mjs +3 -3
- package/fesm2022/ngneers-controls-progress.mjs.map +1 -1
- package/fesm2022/ngneers-controls-scroll-shadow.mjs +54 -0
- package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroller.mjs +9 -9
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +4 -4
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select.mjs +8 -7
- 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-spinner.mjs +3 -3
- package/fesm2022/ngneers-controls-spinner.mjs.map +1 -1
- package/fesm2022/ngneers-controls-splitter.mjs +10 -10
- package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
- package/fesm2022/ngneers-controls-switch.mjs +3 -3
- package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
- package/fesm2022/ngneers-controls-table.mjs +227 -293
- package/fesm2022/ngneers-controls-table.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tabs.mjs +10 -10
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tag.mjs +3 -3
- package/fesm2022/ngneers-controls-tag.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toast.mjs +10 -10
- package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toggle-button.mjs +4 -4
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tooltip.mjs +44 -8
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils-ng.mjs +3 -3
- package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils.mjs +1 -1
- package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
- package/package.json +29 -11
- package/types/ngneers-controls-accordion.d.ts +6 -4
- package/types/ngneers-controls-api-ng.d.ts +5 -0
- package/types/ngneers-controls-api.d.ts +2 -2
- package/types/ngneers-controls-breadcrumb.d.ts +5 -3
- package/types/ngneers-controls-checkbox.d.ts +5 -3
- package/types/ngneers-controls-chip.d.ts +3 -1
- package/types/ngneers-controls-default-icons.d.ts +5 -0
- package/types/ngneers-controls-drawer.d.ts +3 -1
- package/types/ngneers-controls-filter.d.ts +1 -1
- package/types/ngneers-controls-icon.d.ts +23 -40
- package/types/ngneers-controls-input-field.d.ts +3 -1
- package/types/ngneers-controls-item-view.d.ts +4 -2
- package/types/ngneers-controls-menu.d.ts +3 -1
- package/types/ngneers-controls-message.d.ts +3 -1
- package/types/ngneers-controls-popover.d.ts +1 -0
- package/types/ngneers-controls-scroll-shadow.d.ts +16 -0
- package/types/ngneers-controls-select.d.ts +5 -10
- package/types/ngneers-controls-table.d.ts +29 -41
- package/types/ngneers-controls-tabs.d.ts +4 -2
- package/types/ngneers-controls-tag.d.ts +3 -1
- package/types/ngneers-controls-toast.d.ts +4 -2
- package/types/ngneers-controls-toggle-button.d.ts +5 -3
- package/types/ngneers-controls-tooltip.d.ts +7 -1
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-table.mjs","sources":["../../src/table/table-group-header-row.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/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 { Directive, effect, ElementRef, inject, input } from '@angular/core';\r\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnScrollerItem } from '@ngneers/controls/scroller';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { setInputSignalValue } from '@ngneers/controls/utils-ng';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport type { FormattedTableGroupHeaderRow } from './types';\r\n\r\n@Directive({\r\n selector: '[ngnTableGroupHeaderTr]',\r\n host: {\r\n '[attr.aria-rowindex]': 'ngnTableGroupHeaderTr().index + 2',\r\n '[style.--ngn-table-row-index]': 'ngnTableGroupHeaderTr().index + 2',\r\n },\r\n})\r\nexport class NgnTableGroupHeaderTr extends NgnScrollerItem {\r\n public readonly ngnTableGroupHeaderTr = input.required<FormattedTableGroupHeaderRow>();\r\n public override readonly ngnScrollerItem = input<object>({});\r\n private readonly _element = inject(ElementRef<HTMLElement>);\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n const row = this.ngnTableGroupHeaderTr();\r\n setInputSignalValue(this.ngnScrollerItem, row);\r\n });\r\n this.prepareDom();\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\r\n toggleClass(this._element.nativeElement, this.theme.class('group-header-row'), true);\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, contentChild, TemplateRef } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\n\r\nimport type { FormattedTableDataRow } from './types';\r\n\r\nexport type GroupHeaderContext = {\r\n $implicit: {\r\n groupKey: unknown;\r\n groupValue: unknown;\r\n count: number;\r\n expanded: boolean;\r\n };\r\n};\r\n\r\n@Component({\r\n template: '',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport abstract class NgnTableTemplates<T extends object> extends NgnBase<'table'> {\r\n private readonly _headerTemplate = contentChild<TemplateRef<unknown>>('header');\r\n private readonly _bodyTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.body>>('body');\r\n private readonly _groupHeaderTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.groupHeader>>('groupHeader');\r\n\r\n protected readonly headerTemplate = this._headerTemplate;\r\n protected readonly bodyTemplate = this._bodyTemplate;\r\n protected readonly groupHeaderTemplate = this._groupHeaderTemplate;\r\n\r\n /**\r\n * Types for the table templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n /**\r\n * Type of the template variable for the body template.\r\n */\r\n body: { $implicit: FormattedTableDataRow<T> };\r\n /**\r\n * Type of the template variable for the group header template.\r\n */\r\n groupHeader: GroupHeaderContext;\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n model,\r\n signal,\r\n booleanAttribute,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { executeMultiFilter } from '@ngneers/controls/api';\r\nimport { elementSizeSignal, NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { ResizeEngine, getResizeLimitInPx, type ResizableItem } from '@ngneers/controls/api/resize';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnPaginator, type PaginationState } from '@ngneers/controls/paginator';\r\nimport { NgnScroller } from '@ngneers/controls/scroller';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTableGroupHeaderTr } from './table-group-header-row';\r\nimport { NgnTableTemplates } from './table-templates';\r\n\r\n/**\r\n * Default minimum column width in pixels for table columns.\r\n * Enforced as an absolute floor even when a relative min-size (e.g. `5%`) resolves smaller.\r\n */\r\nconst TABLE_MIN_COLUMN_WIDTH_PX = 50;\r\n\r\n/** Splits a CSS grid-template-columns string into individual track values, handling minmax(). */\r\nconst GRID_TRACK_RE = /(?:minmax\\([^)]+\\)|[^\\s]+)/g;\r\n\r\nimport type { NgnTableTh } from './table-header-cell';\r\nimport type {\r\n FormattedTableDataRow,\r\n FormattedTableGroupHeaderRow,\r\n FormattedTableRow,\r\n TableSelectionMode,\r\n} from './types';\r\nimport type { NgnFilterConfig } from '@ngneers/controls/filter';\r\nimport type { AllKeysOfUnion } from '@ngneers/controls/utils';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n selector: 'ngn-table',\r\n templateUrl: './table.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n NgTemplateOutlet,\r\n NgnScroller,\r\n NgnPaginator,\r\n NgnTemplate,\r\n NgnPt,\r\n NgnIcon,\r\n NgnTableGroupHeaderTr,\r\n ],\r\n providers: [provideSelf(NgnTable)],\r\n host: {\r\n tabindex: '0',\r\n '[attr.aria-multiselectable]': 'selectionMode() === \"multi\" ? true : null',\r\n '(keydown)': 'onKeyDown($event)',\r\n },\r\n})\r\nexport class NgnTable<\r\n T extends object,\r\n K extends keyof T,\r\n G extends Extract<AllKeysOfUnion<T>, string> = never,\r\n> extends NgnTableTemplates<T> {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate, {\r\n root: true,\r\n virtual: () => this.virtual(),\r\n resizing: () => this._resizeEngine?.isDragging() ?? false,\r\n selectable: () => !!this.selectionMode(),\r\n reorderable: () => this.reorderable(),\r\n reordering: () => this._isReordering(),\r\n });\r\n private readonly _registeredHeaderCells = signal<NgnTableTh[]>([]);\r\n private readonly _scroller = viewChild.required(NgnScroller);\r\n\r\n public readonly rows = input.required<readonly T[]>();\r\n public readonly rowHeight = input<number>();\r\n public readonly fieldId = input.required<K>();\r\n public readonly virtual = input<boolean>(false);\r\n public readonly virtualPadding = input<number>(2);\r\n public readonly striped = input<boolean>(false);\r\n public readonly paginator = input<boolean>(false);\r\n\r\n /**\r\n * The selection mode for the table.\r\n * - `'single'`: Only one row can be selected at a time.\r\n * - `'multi'`: Multiple rows can be selected (with Ctrl/Shift click or checkboxes).\r\n * - `null`: Selection is disabled.\r\n * @default null\r\n */\r\n public readonly selectionMode = input<TableSelectionMode | null>(null);\r\n\r\n /**\r\n * The selected row IDs. Two-way bindable via `[(selection)]`.\r\n * @default []\r\n */\r\n public readonly selection = model<T[K & keyof T][]>([]);\r\n\r\n /**\r\n * Whether a selection column directive is present in the template.\r\n * Set automatically by `NgnTableSelectionColumn` — do not set manually.\r\n */\r\n private readonly _hasSelectionColumn = signal(false);\r\n\r\n /**\r\n * Column key to group rows by. Rows with the same value in this column\r\n * are collected under a collapsible group header.\r\n * @default null (no grouping)\r\n */\r\n public readonly groupBy = input<G | null>(null);\r\n\r\n /**\r\n * Two-way model tracking which groups are currently expanded, identified\r\n * by their column value. Defaults to `[]` (all collapsed).\r\n * Pass all group values to start with all groups expanded.\r\n *\r\n * Type-safe: when `groupBy` is set, this is typed as `T[G][]` where G\r\n * is the groupBy column key (inferred by Angular's template type checker).\r\n */\r\n public readonly expandedGroups = model<Array<T[G] & (string | number)>>([]);\r\n\r\n /**\r\n * Whether column resizing is enabled.\r\n * @default false\r\n */\r\n public readonly resizable = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * The resize distribution mode.\r\n * - `'adjacent'`: Only columns adjacent to the resize handle change. Total width stays the same.\r\n * - `'push'`: Column grows/shrinks independently, total width changes (enables horizontal scrolling).\r\n * @default 'adjacent'\r\n */\r\n public readonly resizeMode = input<'adjacent' | 'proportional' | 'push'>('adjacent');\r\n\r\n /**\r\n * Whether to lock affected columns to fixed `px` values after a resize completes.\r\n *\r\n * - **`proportional` mode**: when `true`, the resized column stays as `px` (locked);\r\n * when `false`, it is converted back to `fr` and continues to flex with the container.\r\n * - **`adjacent` / `push` modes**: when `true`, columns whose size changed are converted\r\n * to `px`; when `false`, columns keep their original units.\r\n *\r\n * @default false\r\n */\r\n public readonly lockSizes = input<boolean>(false);\r\n\r\n /**\r\n * Whether column reordering is enabled.\r\n * @default false\r\n */\r\n public readonly reorderable = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * The current column order as an array of column identifiers.\r\n * When empty, the natural registration order (DOM order) is used.\r\n * Supports two-way binding for persistence.\r\n */\r\n public readonly columnOrder = model<string[]>([]);\r\n\r\n protected readonly trackById = (item: T): unknown => item[this.fieldId()];\r\n public readonly sort = model<{\r\n column: Extract<AllKeysOfUnion<T>, string>;\r\n direction: 'asc' | 'desc';\r\n } | null>(null);\r\n public readonly filters = model<\r\n | {\r\n [key in Extract<AllKeysOfUnion<T>, string>]?: NgnFilterConfig;\r\n }\r\n | null\r\n >(null);\r\n protected readonly pageState = signal<PaginationState | null>(null);\r\n\r\n // --- Selection state ---\r\n\r\n public readonly showCheckboxes = this._hasSelectionColumn.asReadonly();\r\n\r\n /**\r\n * Set of selected row IDs for O(1) lookup.\r\n * Uses a content-aware equality check to avoid invalidating dependents\r\n * (50+ per-row computeds) when the selection hasn't actually changed.\r\n */\r\n protected readonly selectionSet = computed(() => new Set(this.selection()), {\r\n equal: (a, b) => a.size === b.size && [...a].every(v => b.has(v)),\r\n });\r\n\r\n /**\r\n * Anchor index for Shift+click range selection (index in formattedRows).\r\n */\r\n private readonly _selectionAnchor = signal<number | null>(null);\r\n\r\n /**\r\n * Currently focused row index for keyboard navigation (index in formattedRows).\r\n */\r\n public readonly focusedRowIndex = signal<number | null>(null);\r\n\r\n protected readonly isAllSelected = computed(() => {\r\n const rows = this.formattedRows();\r\n const selSet = this.selectionSet();\r\n return rows.length > 0 && rows.every(row => selSet.has(row.id as T[K & keyof T]));\r\n });\r\n\r\n protected readonly isIndeterminate = computed(() => {\r\n const selSet = this.selectionSet();\r\n return selSet.size > 0 && !this.isAllSelected();\r\n });\r\n\r\n public readonly headerCheckboxValue = computed<boolean | null>(() => {\r\n if (this.isAllSelected()) return true;\r\n if (this.isIndeterminate()) return null;\r\n return false;\r\n });\r\n\r\n /**\r\n * Total column count including the selection checkbox column.\r\n */\r\n protected readonly totalColumnCount = computed(\r\n () => this.columnCount() + (this.showCheckboxes() ? 1 : 0)\r\n );\r\n\r\n protected readonly formattedRows = computed<FormattedTableRow<T>[]>(() => {\r\n const groupBy = this.groupBy();\r\n if (groupBy) {\r\n return this._groupedRows();\r\n }\r\n const rows = this._sortedRows();\r\n return rows.map((data, index) => ({\r\n kind: 'data' as const,\r\n id: data[this.fieldId()] as T[keyof T] & (string | number),\r\n data,\r\n index,\r\n }));\r\n });\r\n\r\n private readonly _groupedRows = computed<FormattedTableRow<T>[]>(() => {\r\n const groupBy = this.groupBy();\r\n if (!groupBy) return [];\r\n const rows = this._sortedRows();\r\n const expandedSet = new Set<T[G] & (string | number)>(this.expandedGroups());\r\n const fieldId = this.fieldId();\r\n\r\n // Group rows by the groupBy column value, preserving sort order\r\n type GroupKey = T[G] & (string | number);\r\n const groupMap = new Map<GroupKey, T[]>();\r\n for (const row of rows) {\r\n const key = (row as Record<string, unknown>)[groupBy] as GroupKey;\r\n let group = groupMap.get(key);\r\n if (!group) {\r\n group = [];\r\n groupMap.set(key, group);\r\n }\r\n group.push(row);\r\n }\r\n\r\n // Build flat list with group headers interleaved\r\n const result: FormattedTableRow<T>[] = [];\r\n let index = 0;\r\n for (const [groupKey, groupRows] of groupMap) {\r\n const expanded = expandedSet.has(groupKey);\r\n result.push({\r\n kind: 'group-header',\r\n id: `group-${String(groupKey)}`,\r\n groupKey,\r\n groupValue: groupKey,\r\n count: groupRows.length,\r\n expanded,\r\n index: index++,\r\n });\r\n if (expanded) {\r\n for (const data of groupRows) {\r\n result.push({\r\n kind: 'data',\r\n id: data[fieldId] as T[keyof T] & (string | number),\r\n data,\r\n index: index++,\r\n });\r\n }\r\n }\r\n }\r\n return result;\r\n });\r\n\r\n protected readonly pagedRows = computed<FormattedTableRow<T>[]>(() => {\r\n const paginator = this.paginator();\r\n if (!paginator) {\r\n return this.formattedRows();\r\n }\r\n const pageState = this.pageState();\r\n if (!pageState) {\r\n return [];\r\n }\r\n return this.formattedRows().slice(\r\n pageState.slice.skip,\r\n pageState.slice.take + pageState.slice.skip\r\n );\r\n });\r\n\r\n private readonly _filteredRows = computed<readonly T[]>(() => {\r\n const filters = this.filters();\r\n const rows = this.rows();\r\n if (!filters) {\r\n return rows;\r\n }\r\n return executeMultiFilter(rows, filters);\r\n });\r\n\r\n private readonly _sortedRows = computed<readonly T[]>(() => {\r\n const rows = this._filteredRows();\r\n const sort = this.sort();\r\n if (!sort) {\r\n return rows;\r\n }\r\n const { column, direction } = sort;\r\n // @jasc @todo outsource sorting & allow custom sort functions\r\n return rows.toSorted((a, b) => {\r\n const aValue = a[column];\r\n const bValue = b[column];\r\n if (aValue == null && bValue != null) {\r\n return direction === 'asc' ? -1 : 1;\r\n }\r\n if (aValue != null && bValue == null) {\r\n return direction === 'asc' ? 1 : -1;\r\n }\r\n if (aValue == null && bValue == null) {\r\n return 0;\r\n }\r\n return typeof aValue === 'number' && typeof bValue === 'number'\r\n ? direction === 'asc'\r\n ? (aValue as number) - (bValue as number)\r\n : (bValue as number) - (aValue as number)\r\n : direction === 'asc'\r\n ? String(aValue).localeCompare(String(bValue))\r\n : String(bValue).localeCompare(String(aValue));\r\n });\r\n });\r\n\r\n protected readonly columnCount = computed(() => this._registeredHeaderCells().length);\r\n\r\n // --- Sticky column registry (lightweight — directive owns the logic) ---\r\n\r\n private readonly _stickyColumnIds = signal<ReadonlyMap<string, 'left' | 'right'>>(new Map());\r\n\r\n public registerStickyColumnId(columnId: string, side: 'left' | 'right'): void {\r\n this._stickyColumnIds.update(m => {\r\n const n = new Map(m);\r\n n.set(columnId, side);\r\n return n;\r\n });\r\n }\r\n\r\n public unregisterStickyColumnId(columnId: string): void {\r\n this._stickyColumnIds.update(m => {\r\n const n = new Map(m);\r\n n.delete(columnId);\r\n return n;\r\n });\r\n }\r\n\r\n public getStickyColumnIds(): ReadonlyMap<string, 'left' | 'right'> {\r\n return this._stickyColumnIds();\r\n }\r\n\r\n // --- Column reorder state ---\r\n\r\n private readonly _isReordering = signal(false);\r\n private readonly _reorderSourceColumnId = signal<string | null>(null);\r\n protected readonly _dropIndicatorState = signal<{\r\n leftPx: number;\r\n topPx: number;\r\n heightPx: number;\r\n } | null>(null);\r\n private _reorderTargetIndex = -1;\r\n\r\n /**\r\n * Effective column order: merges user-provided `columnOrder` with registered header cells.\r\n * If `columnOrder` is empty, falls back to registration order.\r\n * Unknown keys are filtered; new columns not in the order are appended.\r\n */\r\n private readonly _effectiveColumnOrder = computed<string[]>(() => {\r\n const cells = this._registeredHeaderCells();\r\n const cellIds = cells.map(c => c.ngnTableTh());\r\n const userOrder = this.columnOrder();\r\n\r\n if (!userOrder.length) {\r\n return cellIds;\r\n }\r\n\r\n // Filter to valid keys and append any new columns not in the order\r\n const validOrder = userOrder.filter(id => cellIds.includes(id));\r\n const missing = cellIds.filter(id => !validOrder.includes(id));\r\n return [...validOrder, ...missing];\r\n });\r\n\r\n /**\r\n * Maps column ID → 1-based visual position.\r\n */\r\n public readonly columnOrderMap = computed<ReadonlyMap<string, number>>(() => {\r\n const order = this._effectiveColumnOrder();\r\n const map = new Map<string, number>();\r\n for (let i = 0; i < order.length; i++) {\r\n map.set(order[i]!, i + 1);\r\n }\r\n return map;\r\n });\r\n\r\n /**\r\n * Returns the 1-based visual column index for a given 0-based logical (DOM) index.\r\n */\r\n public getVisualColumnIndex(logicalIndex: number): number {\r\n const cells = this._registeredHeaderCells();\r\n const cell = cells[logicalIndex];\r\n if (!cell) return logicalIndex + 1;\r\n return this.columnOrderMap().get(cell.ngnTableTh()) ?? logicalIndex + 1;\r\n }\r\n\r\n // --- Resize engine ---\r\n\r\n private readonly _tableElementSize = elementSizeSignal(this.element);\r\n private readonly _resizeEngine: ResizeEngine;\r\n\r\n /**\r\n * Grid template columns computed from the resize engine when resizable,\r\n * otherwise falls back to the standard equal-width repeat.\r\n */\r\n protected readonly gridTemplateColumns: ReturnType<typeof computed<string>>;\r\n\r\n constructor() {\r\n super();\r\n\r\n // Create engine eagerly in constructor (outside reactive context) to avoid NG0602\r\n this._resizeEngine = new ResizeEngine({\r\n items: computed(() => this._registeredHeaderCells() as unknown as readonly ResizableItem[]),\r\n containerSize: computed(() => {\r\n // Subscribe to the size signal for reactivity, but use clientWidth\r\n // to exclude vertical scrollbar width and avoid horizontal overflow.\r\n this._tableElementSize();\r\n const tableEl = this.element.nativeElement.querySelector('table');\r\n const total = tableEl?.clientWidth ?? 0;\r\n if (!this._hasSelectionColumn()) return total;\r\n // Subtract the selection column width so the resize engine only distributes\r\n // the remaining space among data columns.\r\n const selCol = this.element.nativeElement.querySelector(\r\n `.${this.theme.class('selection-column')}`\r\n );\r\n return total - (selCol?.getBoundingClientRect().width ?? 0);\r\n }),\r\n gapSizes: signal([]),\r\n distributionMode: computed(() => this.resizeMode()),\r\n containerConstrained: computed(() => this.resizeMode() !== 'push'),\r\n lockSizes: computed(() => this.lockSizes()),\r\n minItemSizePx: TABLE_MIN_COLUMN_WIDTH_PX,\r\n resolveItemSizes: () =>\r\n this._registeredHeaderCells().map(\r\n cell => cell.element.nativeElement.getBoundingClientRect().width\r\n ),\r\n });\r\n\r\n this.gridTemplateColumns = computed(() => {\r\n const checkboxCol = this._hasSelectionColumn() ? 'min-content ' : '';\r\n if (this.resizable()) {\r\n const rawSizes = this._resizeEngine.gridTemplateSizes();\r\n // When reorderable, permute grid track sizes to match visual column order\r\n if (this.reorderable()) {\r\n return `${checkboxCol}${this._permuteGridSizes(rawSizes)}`;\r\n }\r\n return `${checkboxCol}${rawSizes}`;\r\n }\r\n return `${checkboxCol}repeat(${this.columnCount()}, 1fr)`;\r\n });\r\n }\r\n\r\n protected pageChanged(event: PaginationState) {\r\n this.pageState.set(event);\r\n }\r\n\r\n public column<V extends AllKeysOfUnion<T> & string>(column: V): V {\r\n return column;\r\n }\r\n\r\n public registerSelectionColumn(): void {\r\n this._hasSelectionColumn.set(true);\r\n }\r\n\r\n public unregisterSelectionColumn(): void {\r\n this._hasSelectionColumn.set(false);\r\n }\r\n\r\n public registerHeaderCell(cell: NgnTableTh): void {\r\n this._registeredHeaderCells.update(cells => [...cells, cell]);\r\n }\r\n\r\n public unregisterHeaderCell(cell: NgnTableTh): void {\r\n this._registeredHeaderCells.update(cells => cells.filter(c => c !== cell));\r\n }\r\n\r\n public getRegisteredHeaderCells(): readonly NgnTableTh[] {\r\n return this._registeredHeaderCells();\r\n }\r\n\r\n // --- Resize operations (called by NgnTableTh) ---\r\n\r\n public startColumnResize(columnIndex: number, event: PointerEvent): void {\r\n if (!this.resizable()) return;\r\n this._resizeEngine.startDrag(columnIndex, event.clientX);\r\n }\r\n\r\n public dragColumnResize(columnIndex: number, event: PointerEvent): void {\r\n if (!this.resizable()) return;\r\n this._resizeEngine.drag(columnIndex, event.clientX);\r\n }\r\n\r\n public endColumnResize(columnIndex: number, cancel: boolean): void {\r\n if (!this.resizable()) return;\r\n this._resizeEngine.endDrag(columnIndex, cancel);\r\n }\r\n\r\n // --- Selection operations ---\r\n\r\n public isRowSelected(id: T[keyof T] & (string | number)): boolean {\r\n return this.selectionSet().has(id as T[K & keyof T]);\r\n }\r\n\r\n public handleRowClick(row: FormattedTableDataRow<T>, event: MouseEvent): void {\r\n const mode = this.selectionMode();\r\n if (!mode) return;\r\n\r\n const id = row.id as T[K & keyof T];\r\n const rowIndex = this.formattedRows().findIndex(r => r.id === row.id);\r\n\r\n if (mode === 'single') {\r\n this.selection.set([id]);\r\n this._selectionAnchor.set(rowIndex);\r\n this.focusedRowIndex.set(null);\r\n return;\r\n }\r\n\r\n // Multi mode\r\n if (event.shiftKey && this._selectionAnchor() !== null) {\r\n this._selectRange(this._selectionAnchor()!, rowIndex);\r\n } else if (event.ctrlKey || event.metaKey) {\r\n this._toggleRowInSelection(id);\r\n } else {\r\n this._toggleRowInSelection(id);\r\n }\r\n this._selectionAnchor.set(rowIndex);\r\n this.focusedRowIndex.set(null);\r\n }\r\n\r\n public handleCheckboxChange(row: FormattedTableDataRow<T>): void {\r\n const id = row.id as T[K & keyof T];\r\n this._toggleRowInSelection(id);\r\n const rowIndex = this.formattedRows().findIndex(r => r.id === row.id);\r\n this._selectionAnchor.set(rowIndex);\r\n this.focusedRowIndex.set(null);\r\n }\r\n\r\n public toggleSelectAll(): void {\r\n if (this.isAllSelected()) {\r\n this.selection.set([]);\r\n } else {\r\n const dataRows = this.formattedRows().filter(\r\n (r): r is FormattedTableDataRow<T> => r.kind === 'data'\r\n );\r\n this.selection.set(dataRows.map(r => r.id as T[K & keyof T]));\r\n }\r\n }\r\n\r\n private _toggleRowInSelection(id: T[K & keyof T]): void {\r\n const current = this.selection();\r\n if (this.selectionSet().has(id)) {\r\n this.selection.set(current.filter(v => v !== id));\r\n } else {\r\n this.selection.set([...current, id]);\r\n }\r\n }\r\n\r\n private _selectRange(fromIndex: number, toIndex: number): void {\r\n const rows = this.formattedRows();\r\n const start = Math.min(fromIndex, toIndex);\r\n const end = Math.max(fromIndex, toIndex);\r\n const rangeIds = rows\r\n .slice(start, end + 1)\r\n .filter((r): r is FormattedTableDataRow<T> => r.kind === 'data')\r\n .map(r => r.id as T[K & keyof T]);\r\n\r\n // Merge with existing selection (union)\r\n const currentSet = new Set(this.selection());\r\n for (const id of rangeIds) {\r\n currentSet.add(id);\r\n }\r\n this.selection.set([...currentSet]);\r\n }\r\n\r\n // --- Keyboard navigation ---\r\n\r\n protected onKeyDown(event: KeyboardEvent): void {\r\n const mode = this.selectionMode();\r\n if (!mode) return;\r\n\r\n const rows = this.formattedRows();\r\n if (rows.length === 0) return;\r\n\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Start from current focus, or current selection in single mode, or -1\r\n let currentIndex = this.focusedRowIndex();\r\n if (currentIndex === null && mode === 'single') {\r\n const sel = this.selection();\r\n if (sel.length > 0) {\r\n currentIndex = rows.findIndex(r => r.id === sel[0]);\r\n }\r\n }\r\n currentIndex ??= -1;\r\n\r\n const nextIndex =\r\n event.key === 'ArrowDown'\r\n ? Math.min(currentIndex + 1, rows.length - 1)\r\n : Math.max(currentIndex - 1, 0);\r\n\r\n this.focusedRowIndex.set(nextIndex);\r\n this._scroller().scrollToIndex(nextIndex);\r\n\r\n if (mode === 'single') {\r\n const id = rows[nextIndex]!.id as T[K & keyof T];\r\n this.selection.set([id]);\r\n this._selectionAnchor.set(nextIndex);\r\n } else if (event.shiftKey) {\r\n // Extend range selection with Shift+Arrow\r\n const anchor = this._selectionAnchor() ?? nextIndex;\r\n this._selectRange(anchor, nextIndex);\r\n }\r\n } else if (event.key === ' ' || event.key === 'Enter') {\r\n if (mode === 'multi') {\r\n const focusIdx = this.focusedRowIndex();\r\n if (focusIdx !== null && rows[focusIdx]) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const id = rows[focusIdx]!.id as T[K & keyof T];\r\n this._toggleRowInSelection(id);\r\n this._selectionAnchor.set(focusIdx);\r\n }\r\n }\r\n }\r\n }\r\n // --- Row grouping ---\r\n\r\n /**\r\n * Toggle the expanded state of a group identified by its column value.\r\n */\r\n public toggleGroup(groupKey: T[G] & (string | number)): void {\r\n const current = this.expandedGroups();\r\n if (current.includes(groupKey)) {\r\n this.expandedGroups.set(current.filter(k => k !== groupKey));\r\n } else {\r\n this.expandedGroups.set([...current, groupKey]);\r\n }\r\n }\r\n\r\n /**\r\n * Toggle a group from a group-header row. Used in the template where\r\n * the scroller item type cannot carry the `G` generic.\r\n * @internal\r\n */\r\n protected toggleGroupFromRow(row: FormattedTableGroupHeaderRow): void {\r\n this.toggleGroup(row.groupKey as T[G] & (string | number));\r\n }\r\n\r\n // --- Reorder operations (called by NgnTableReorderableColumn) ---\r\n\r\n public startColumnReorder(columnId: string): void {\r\n if (!this.reorderable()) return;\r\n this._isReordering.set(true);\r\n this._reorderSourceColumnId.set(columnId);\r\n this._reorderTargetIndex = -1;\r\n }\r\n\r\n public dragColumnReorder(event: PointerEvent): void {\r\n if (!this.reorderable() || !this._isReordering()) return;\r\n\r\n const cells = this._registeredHeaderCells();\r\n const effectiveOrder = this._effectiveColumnOrder();\r\n const sourceId = this._reorderSourceColumnId();\r\n if (!sourceId) return;\r\n\r\n // Find drop target by comparing cursor X to header cell midpoints (in visual order)\r\n const cursorX = event.clientX;\r\n let targetIndex = effectiveOrder.length;\r\n\r\n // Build visual-order cells with their bounding boxes\r\n const visualCells = effectiveOrder\r\n .map(id => cells.find(c => c.ngnTableTh() === id))\r\n .filter((c): c is NgnTableTh => !!c);\r\n\r\n for (let i = 0; i < visualCells.length; i++) {\r\n const rect = visualCells[i]!.element.nativeElement.getBoundingClientRect();\r\n const midX = rect.left + rect.width / 2;\r\n if (cursorX < midX) {\r\n targetIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n // Clamp target so non-sticky columns cannot land inside sticky zones\r\n const stickyMap = this._stickyColumnIds();\r\n if (stickyMap.size > 0) {\r\n // Count sticky-left columns at the start\r\n let stickyLeftCount = 0;\r\n for (const id of effectiveOrder) {\r\n if (stickyMap.get(id) === 'left') stickyLeftCount++;\r\n else break;\r\n }\r\n // Count sticky-right columns at the end\r\n let stickyRightCount = 0;\r\n for (let i = effectiveOrder.length - 1; i >= 0; i--) {\r\n if (stickyMap.get(effectiveOrder[i]!) === 'right') stickyRightCount++;\r\n else break;\r\n }\r\n targetIndex = Math.max(\r\n stickyLeftCount,\r\n Math.min(targetIndex, effectiveOrder.length - stickyRightCount)\r\n );\r\n }\r\n\r\n this._reorderTargetIndex = targetIndex;\r\n\r\n // Compute indicator position relative to the table element\r\n const tableEl = this.element.nativeElement.querySelector(':scope > table');\r\n if (!tableEl) return;\r\n const tableRect = tableEl.getBoundingClientRect();\r\n\r\n // Use the first header cell's height for the indicator\r\n const firstCellRect = visualCells[0]?.element.nativeElement.getBoundingClientRect();\r\n const indicatorHeight = firstCellRect?.height ?? 40;\r\n\r\n let indicatorLeftPx: number;\r\n if (targetIndex === 0) {\r\n const firstCell = visualCells[0];\r\n if (!firstCell) return;\r\n const rect = firstCell.element.nativeElement.getBoundingClientRect();\r\n indicatorLeftPx = rect.left - tableRect.left;\r\n } else if (targetIndex >= visualCells.length) {\r\n const lastCell = visualCells[visualCells.length - 1];\r\n if (!lastCell) return;\r\n const rect = lastCell.element.nativeElement.getBoundingClientRect();\r\n indicatorLeftPx = rect.right - tableRect.left;\r\n } else {\r\n const prevCell = visualCells[targetIndex - 1]!;\r\n const nextCell = visualCells[targetIndex]!;\r\n const prevRect = prevCell.element.nativeElement.getBoundingClientRect();\r\n const nextRect = nextCell.element.nativeElement.getBoundingClientRect();\r\n indicatorLeftPx = (prevRect.right + nextRect.left) / 2 - tableRect.left;\r\n }\r\n\r\n // Clamp so the 3px-wide indicator stays within the visible content area\r\n // (use clientWidth to exclude scrollbar width from the boundary)\r\n const maxLeft = tableEl.clientWidth - 3;\r\n indicatorLeftPx = Math.max(0, Math.min(indicatorLeftPx, maxLeft));\r\n\r\n this._dropIndicatorState.set({\r\n leftPx: indicatorLeftPx,\r\n topPx: tableEl.scrollTop,\r\n heightPx: indicatorHeight,\r\n });\r\n }\r\n\r\n public endColumnReorder(cancel: boolean): void {\r\n if (!this.reorderable()) return;\r\n\r\n if (!cancel && this._reorderTargetIndex >= 0) {\r\n const sourceId = this._reorderSourceColumnId();\r\n if (sourceId) {\r\n const effectiveOrder = [...this._effectiveColumnOrder()];\r\n const sourceIndex = effectiveOrder.indexOf(sourceId);\r\n\r\n if (sourceIndex >= 0) {\r\n // Remove source from its current position\r\n effectiveOrder.splice(sourceIndex, 1);\r\n // Adjust target index if source was before target\r\n let insertAt = this._reorderTargetIndex;\r\n if (sourceIndex < this._reorderTargetIndex) {\r\n insertAt--;\r\n }\r\n // Insert at new position\r\n effectiveOrder.splice(insertAt, 0, sourceId);\r\n\r\n this.columnOrder.set(effectiveOrder);\r\n }\r\n }\r\n }\r\n\r\n this._isReordering.set(false);\r\n this._reorderSourceColumnId.set(null);\r\n this._dropIndicatorState.set(null);\r\n this._reorderTargetIndex = -1;\r\n }\r\n\r\n public getReorderSourceColumnId(): string | null {\r\n return this._reorderSourceColumnId();\r\n }\r\n\r\n /**\r\n * Permutes grid template sizes from logical (registration) order to visual (column order) order.\r\n */\r\n private _permuteGridSizes(rawSizes: string): string {\r\n const tracks = rawSizes.match(GRID_TRACK_RE) ?? [];\r\n const cells = this._registeredHeaderCells();\r\n const effectiveOrder = this._effectiveColumnOrder();\r\n\r\n if (tracks.length !== cells.length) {\r\n return rawSizes; // Mismatch — don't permute\r\n }\r\n\r\n // Build map: column ID → track size (logical order)\r\n const sizeByColumnId = new Map<string, string>();\r\n for (let i = 0; i < cells.length; i++) {\r\n sizeByColumnId.set(cells[i]!.ngnTableTh(), tracks[i]!);\r\n }\r\n\r\n // Emit sizes in visual order\r\n return effectiveOrder.map(id => sizeByColumnId.get(id) ?? '1fr').join(' ');\r\n }\r\n\r\n /**\r\n * Auto-sizes the column at `columnIndex` to fit its visible content.\r\n * Uses `Canvas.measureText()` for fast, reflow-free text measurement since\r\n * grid-constrained cells (`min-width: 0`) don't report natural content width\r\n * via `scrollWidth`.\r\n */\r\n public autoSizeColumn(columnIndex: number): void {\r\n if (!this.resizable()) return;\r\n\r\n const cells = this._registeredHeaderCells();\r\n const headerCell = cells[columnIndex];\r\n if (!headerCell) return;\r\n\r\n const tableEl = this.element.nativeElement.querySelector('table');\r\n if (!tableEl) return;\r\n\r\n const headerEl = headerCell.element.nativeElement as HTMLElement;\r\n const ctx = autoSizeCanvasCtx();\r\n\r\n let maxContentWidth = 0;\r\n\r\n // Measure header: text width + non-text siblings (icons, controls) + flex gap.\r\n // The header cell is a flex container with: cell-text, spacer, filter/sort icons, resize handle.\r\n const cellTextClass = this.theme.class('cell-text');\r\n const headerTextEl = headerEl.querySelector<HTMLElement>(`.${cellTextClass}`);\r\n let headerRequiredWidth = 0;\r\n if (headerTextEl) {\r\n ctx.font = getCssFont(headerEl);\r\n const text = headerTextEl.textContent ?? '';\r\n headerRequiredWidth = Math.ceil(ctx.measureText(text).width);\r\n }\r\n // Add width of visible non-text siblings (filter icon, sort icon, etc.)\r\n const headerStyle = getComputedStyle(headerEl);\r\n const headerGap = parseFloat(headerStyle.gap) || 0;\r\n let visibleSiblingCount = 0;\r\n for (let i = 0; i < headerEl.children.length; i++) {\r\n const child = headerEl.children[i] as HTMLElement;\r\n if (child === headerTextEl) continue;\r\n // Skip spacer (zero intrinsic width) and hidden resize handle\r\n if (child.offsetWidth > 0 && getComputedStyle(child).flexGrow === '0') {\r\n headerRequiredWidth += child.offsetWidth;\r\n visibleSiblingCount++;\r\n }\r\n }\r\n // Add flex gaps between visible items\r\n if (visibleSiblingCount > 0) {\r\n headerRequiredWidth += headerGap * visibleSiblingCount;\r\n }\r\n maxContentWidth = headerRequiredWidth;\r\n\r\n // Measure visible body cells (nth-child is 1-indexed, offset by selection column)\r\n const selectionOffset = this._hasSelectionColumn() ? 1 : 0;\r\n const bodyCells = Array.from(\r\n tableEl.querySelectorAll<HTMLElement>(\r\n `tbody tr td:nth-child(${columnIndex + selectionOffset + 1})`\r\n )\r\n );\r\n if (bodyCells.length > 0) {\r\n ctx.font = getCssFont(bodyCells[0]!);\r\n for (let i = 0; i < bodyCells.length; i++) {\r\n const text = bodyCells[i]!.textContent ?? '';\r\n maxContentWidth = Math.max(maxContentWidth, Math.ceil(ctx.measureText(text).width));\r\n }\r\n }\r\n\r\n // Add cell horizontal padding\r\n const paddingLeft = parseFloat(headerStyle.paddingLeft) || 0;\r\n const paddingRight = parseFloat(headerStyle.paddingRight) || 0;\r\n const totalWidth = maxContentWidth + paddingLeft + paddingRight;\r\n\r\n // Clamp to min/max constraints\r\n const containerSize = this._tableElementSize().width;\r\n const minPx = Math.max(\r\n TABLE_MIN_COLUMN_WIDTH_PX,\r\n getResizeLimitInPx(headerCell.minSize(), containerSize)\r\n );\r\n const maxPx = getResizeLimitInPx(headerCell.maxSize(), containerSize);\r\n const clampedWidth = Math.max(minPx, Math.min(maxPx, totalWidth));\r\n\r\n this._resizeEngine.setItemSize(headerCell as unknown as ResizableItem, `${clampedWidth}px`);\r\n this._resizeEngine.hasBeenResized.set(true);\r\n }\r\n}\r\n\r\n// --- Auto-size helpers ---\r\n\r\n/** Lazily created canvas context for text measurement (no DOM reflows). */\r\nlet _autoSizeCtx: CanvasRenderingContext2D | null = null;\r\nfunction autoSizeCanvasCtx(): CanvasRenderingContext2D {\r\n if (!_autoSizeCtx) {\r\n _autoSizeCtx = document.createElement('canvas').getContext('2d')!;\r\n }\r\n return _autoSizeCtx;\r\n}\r\n\r\n/** Builds the CSS font shorthand from an element's computed style. */\r\nfunction getCssFont(el: HTMLElement): string {\r\n const s = getComputedStyle(el);\r\n return `${s.fontStyle} ${s.fontWeight} ${s.fontSize} ${s.fontFamily}`;\r\n}\r\n","<table\r\n #scrollContainer\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{ table: true, striped: striped() }\"\r\n [attr.aria-rowcount]=\"formattedRows().length\"\r\n [style.--ngn-table-column-count]=\"totalColumnCount()\"\r\n [style.--ngn-table-selection-offset]=\"showCheckboxes() ? 1 : 0\"\r\n [style.grid-template-columns]=\"gridTemplateColumns()\"\r\n [style.--ngn-table-row-height.px]=\"rowHeight()\"\r\n>\r\n <thead [ptInt]=\"this\" [ptClass]=\"'head'\">\r\n <ng-container [ngTemplateOutlet]=\"headerTemplate()\"></ng-container>\r\n </thead>\r\n @if (_dropIndicatorState()) {\r\n <div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'drop-indicator'\"\r\n [style.left.px]=\"_dropIndicatorState()!.leftPx\"\r\n [style.top.px]=\"_dropIndicatorState()!.topPx\"\r\n [style.height.px]=\"_dropIndicatorState()!.heightPx\"\r\n ></div>\r\n }\r\n\r\n <tbody\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'body'\"\r\n ngn-scroller\r\n #scroller\r\n [scrollContainer]=\"scrollContainer\"\r\n [virtual]=\"virtual()\"\r\n [items]=\"pagedRows()\"\r\n [fieldId]=\"'id'\"\r\n [itemHeight]=\"rowHeight() || 0\"\r\n [virtualPadding]=\"virtualPadding()\"\r\n [style.--ngn-table-item-start-index]=\"scroller.itemStartIndex()\"\r\n >\r\n <ng-template #item [ngnTemplate]=\"scroller.templateTypes.item\" let-item let-index=\"index\">\r\n @if (item.kind === 'group-header') {\r\n @if (groupHeaderTemplate(); as customGroupHeader) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"customGroupHeader\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: {\r\n groupKey: item.groupKey,\r\n groupValue: item.groupValue,\r\n count: item.count,\r\n expanded: item.expanded,\r\n },\r\n }\"\r\n ></ng-container>\r\n } @else {\r\n <tr\r\n [ngnTableGroupHeaderTr]=\"item\"\r\n [class]=\"theme.classes({ 'group-expanded': item.expanded })\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n role=\"row\"\r\n (click)=\"toggleGroupFromRow(item)\"\r\n >\r\n <td [class]=\"theme.class('group-header-cell')\" role=\"gridcell\">\r\n <ngn-icon [defaultIcon]=\"'chevron_right'\" [class]=\"theme.class('group-toggle')\" />\r\n <span>{{ item.groupValue }}</span>\r\n <span>({{ item.count }})</span>\r\n </td>\r\n </tr>\r\n }\r\n } @else {\r\n <ng-container\r\n [ngTemplateOutlet]=\"bodyTemplate()\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n ></ng-container>\r\n }\r\n </ng-template>\r\n </tbody>\r\n</table>\r\n@if (paginator()) {\r\n <ngn-paginator [totalItems]=\"rows().length\" (value)=\"pageChanged($event)\" />\r\n}\r\n","import { afterNextRender, computed, Directive, signal } from '@angular/core';\r\nimport { getNearestNgnInstance, NgnBase } from '@ngneers/controls/base';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\n\r\n@Directive({\r\n selector: '[ngnTableTd]',\r\n host: { '[style.--ngn-table-column-index]': '_visualColumnIndex()' },\r\n})\r\nexport class NgnTableTd extends NgnBase<'table'> {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\r\n private readonly _table = signal<NgnTable<any, any> | null>(null);\r\n\r\n /** 0-based logical (DOM) index of this cell within its row. */\r\n private readonly _logicalIndex = signal(0);\r\n\r\n /** 1-based visual column index, remapped through the table's column order. */\r\n protected readonly _visualColumnIndex = computed(() => {\r\n const logicalIndex = this._logicalIndex();\r\n const table = this._table();\r\n if (table) {\r\n // Subtract the selection column offset so DOM index aligns with registered header cells.\r\n const offset = table.showCheckboxes() ? 1 : 0;\r\n return table.getVisualColumnIndex(logicalIndex - offset);\r\n }\r\n return logicalIndex + 1;\r\n });\r\n\r\n constructor() {\r\n super();\r\n this.prepareDom();\r\n const parent = this.element.nativeElement.parentElement?.children;\r\n if (parent) {\r\n const index = Array.from(parent).findIndex(child => child === this.element.nativeElement);\r\n this._logicalIndex.set(index);\r\n }\r\n\r\n afterNextRender(() => {\r\n const table = getNearestNgnInstance(this.element.nativeElement, NgnTable) as NgnTable<\r\n any,\r\n any\r\n > | null;\r\n this._table.set(table);\r\n });\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this.element.nativeElement, this.theme.class('cell'), true);\r\n }\r\n}\r\n","import {\r\n afterNextRender,\r\n afterRenderEffect,\r\n computed,\r\n Directive,\r\n ElementRef,\r\n inject,\r\n input,\r\n model,\r\n type OnDestroy,\r\n type OnInit,\r\n Renderer2,\r\n type Signal,\r\n} from '@angular/core';\r\nimport { getNearestNgnInstance, NgnBase } from '@ngneers/controls/base';\r\nimport { NgnError, toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\n\r\nimport type { ResizableItem, ResizeLimit, ResizeSize } from '@ngneers/controls/api/resize';\r\n\r\n@Directive({\r\n selector: '[ngnTableTh]',\r\n host: {\r\n '[style.--ngn-table-column-index]': '_visualColumnIndex()',\r\n },\r\n})\r\nexport class NgnTableTh extends NgnBase<'table'> implements ResizableItem, OnDestroy, OnInit {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\r\n private _table?: NgnTable<any, any>;\r\n private _resizeHandle?: HTMLDivElement;\r\n\r\n public readonly ngnTableTh = input.required<string>();\r\n\r\n /**\r\n * The size of this column (e.g. '1fr', '200px', '25%').\r\n * @default '1fr'\r\n */\r\n public readonly size = model<ResizeSize>('1fr');\r\n\r\n /**\r\n * The minimum size constraint for this column.\r\n * @default '50px'\r\n */\r\n public readonly minSize: Signal<ResizeLimit> = input<ResizeLimit>('50px');\r\n\r\n /**\r\n * The maximum size constraint for this column.\r\n * @default '100%'\r\n */\r\n public readonly maxSize: Signal<ResizeLimit> = input<ResizeLimit>('100%');\r\n\r\n /**\r\n * Whether this column is resizable. Computed from the parent table's `resizable` input.\r\n */\r\n public readonly resizable = computed(() => this._table?.resizable() ?? false);\r\n\r\n /**\r\n * Whether the resize handle should be shown. Hidden for the last column in adjacent\r\n * and proportional modes since it is implicitly resized via the previous column's handle.\r\n * Push mode shows handles on all columns since each column grows independently.\r\n */\r\n private readonly _showHandle = computed(() => {\r\n if (!this._table?.resizable()) return false;\r\n if (this._table.resizeMode() === 'push') return true;\r\n // Adjacent & proportional: hide handle on last column\r\n const cells = this._table.getRegisteredHeaderCells();\r\n return cells.indexOf(this) < cells.length - 1;\r\n });\r\n\r\n /**\r\n * 1-based visual column index, derived from the table's column order map.\r\n * Falls back to registration index + 1 when no reordering is active.\r\n */\r\n public readonly _visualColumnIndex = computed(() => {\r\n if (!this._table) return undefined;\r\n const map = this._table.columnOrderMap();\r\n return map.get(this.ngnTableTh()) ?? this.getColumnIndex() + 1;\r\n });\r\n\r\n constructor() {\r\n super();\r\n this.prepareDom();\r\n\r\n const renderer = inject(Renderer2);\r\n const elRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n afterNextRender(() => {\r\n // Wrap existing content in a text container for ellipsis support\r\n const textWrapper = renderer.createElement('span');\r\n textWrapper.classList.add(this.theme.class('cell-text'));\r\n const el = elRef.nativeElement;\r\n while (el.firstChild) {\r\n textWrapper.appendChild(el.firstChild);\r\n }\r\n el.appendChild(textWrapper);\r\n\r\n // Move dynamically-created controls back out of the text wrapper\r\n // so they participate in the header cell's flex layout (order: 2, 3)\r\n const filterControl = textWrapper.querySelector(`.${this.theme.class('filter-control')}`);\r\n if (filterControl) el.appendChild(filterControl);\r\n const sortControl = textWrapper.querySelector(`.${this.theme.class('sort-control')}`);\r\n if (sortControl) el.appendChild(sortControl);\r\n\r\n // Spacer div for flex layout\r\n const spacer = renderer.createElement('div');\r\n spacer.classList.add(this.theme.class('spacer'));\r\n elRef.nativeElement.appendChild(spacer);\r\n\r\n // Resize handle\r\n this._resizeHandle = renderer.createElement('div') as HTMLDivElement;\r\n this._resizeHandle.classList.add(this.theme.class('resize-handle'));\r\n this._resizeHandle.addEventListener('pointerdown', this.onResizePointerDown);\r\n this._resizeHandle.addEventListener('dblclick', this.onResizeDblClick);\r\n elRef.nativeElement.appendChild(this._resizeHandle);\r\n });\r\n\r\n // Toggle handle visibility based on mode and column position\r\n afterRenderEffect(() => {\r\n const show = this._showHandle();\r\n if (this._resizeHandle) {\r\n this._resizeHandle.style.display = show ? '' : 'none';\r\n }\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n const table = getNearestNgnInstance(this.element.nativeElement, NgnTable<any, any>);\r\n if (!table) {\r\n throw new NgnError('ngnTableTh', 'ngnTableTh must be used within an NgnTable component');\r\n }\r\n this._table = table;\r\n this._table.registerHeaderCell(this);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._table?.unregisterHeaderCell(this);\r\n this._resizeHandle?.removeEventListener('pointerdown', this.onResizePointerDown);\r\n this._resizeHandle?.removeEventListener('dblclick', this.onResizeDblClick);\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this.element.nativeElement, this.theme.class('cell'), true);\r\n toggleClass(this.element.nativeElement, this.theme.class('resizable'), true);\r\n }\r\n\r\n private readonly onResizeDblClick = (event: MouseEvent) => {\r\n if (!this._table?.resizable()) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const columnIndex = this.getColumnIndex();\r\n if (columnIndex < 0) return;\r\n this._table.autoSizeColumn(columnIndex);\r\n };\r\n\r\n private readonly onResizePointerDown = (event: PointerEvent) => {\r\n if (!this._table?.resizable()) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const target = event.target as HTMLElement;\r\n try {\r\n target.setPointerCapture(event.pointerId);\r\n } catch {\r\n // Ignore\r\n }\r\n\r\n const columnIndex = this.getColumnIndex();\r\n if (columnIndex < 0) return;\r\n\r\n this._table.startColumnResize(columnIndex, event);\r\n\r\n const onPointerMove = (e: PointerEvent) => {\r\n this._table!.dragColumnResize(columnIndex, e);\r\n };\r\n const cleanup = (cancel: boolean) => {\r\n this._table!.endColumnResize(columnIndex, cancel);\r\n target.removeEventListener('pointermove', onPointerMove);\r\n target.removeEventListener('pointerup', onPointerUp);\r\n target.removeEventListener('pointercancel', onPointerCancel);\r\n };\r\n const onPointerUp = () => cleanup(false);\r\n const onPointerCancel = () => cleanup(true);\r\n\r\n target.addEventListener('pointermove', onPointerMove);\r\n target.addEventListener('pointerup', onPointerUp);\r\n target.addEventListener('pointercancel', onPointerCancel);\r\n };\r\n\r\n private getColumnIndex(): number {\r\n if (!this._table) return -1;\r\n const cells = this._table.getRegisteredHeaderCells();\r\n return cells.indexOf(this);\r\n }\r\n}\r\n","import { Directive, ElementRef, inject } from '@angular/core';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\n@Directive({ selector: '[ngnTableHeadTr]', host: { '[attr.aria-rowindex]': '1' } })\r\nexport class NgnTableHeadTr extends NgnBase<'table'> {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject(ElementRef<HTMLElement>);\r\n\r\n constructor() {\r\n super();\r\n this.prepareDom();\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\r\n }\r\n}\r\n","import {\r\n afterNextRender,\r\n Directive,\r\n ElementRef,\r\n inject,\r\n type OnDestroy,\r\n Type,\r\n} from '@angular/core';\r\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTh } from './table-header-cell';\r\n\r\n/** Minimum distance in pixels before a drag is initiated. */\r\nconst REORDER_DEAD_ZONE_PX = 5;\r\n\r\n/**\r\n * @category directive\r\n */\r\n@Directive({\r\n selector: '[ngnTableReorderableColumn]',\r\n})\r\nexport class NgnTableReorderableColumn implements OnDestroy {\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _headerCell = inject(NgnTableTh);\r\n private readonly _columnId = this._headerCell.ngnTableTh;\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n\r\n private _isDragging = false;\r\n private _startX = 0;\r\n private _startY = 0;\r\n private _pointerId: number | null = null;\r\n private _boundOnPointerMove: ((e: PointerEvent) => void) | null = null;\r\n private _boundOnPointerUp: (() => void) | null = null;\r\n private _boundOnPointerCancel: (() => void) | null = null;\r\n private _boundOnKeyDown: ((e: KeyboardEvent) => void) | null = null;\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n const el = this._element.nativeElement;\r\n el.addEventListener('pointerdown', this.onPointerDown);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._element.nativeElement.removeEventListener('pointerdown', this.onPointerDown);\r\n this.cleanup();\r\n }\r\n\r\n private readonly onPointerDown = (event: PointerEvent) => {\r\n const table = this._table();\r\n if (!table?.reorderable()) return;\r\n\r\n // Don't intercept resize handle clicks\r\n const target = event.target as HTMLElement;\r\n if (target.classList.contains(this.theme.class('resize-handle'))) return;\r\n\r\n // Don't allow reordering of sticky columns\r\n const stickyMap = table.getStickyColumnIds();\r\n if (stickyMap.has(this._columnId())) return;\r\n\r\n event.preventDefault();\r\n\r\n this._startX = event.clientX;\r\n this._startY = event.clientY;\r\n this._isDragging = false;\r\n this._pointerId = event.pointerId;\r\n\r\n try {\r\n this._element.nativeElement.setPointerCapture(event.pointerId);\r\n } catch {\r\n // Ignore\r\n }\r\n\r\n this._boundOnPointerMove = (e: PointerEvent) => this.onPointerMove(e);\r\n this._boundOnPointerUp = () => this.onPointerUp();\r\n this._boundOnPointerCancel = () => this.onPointerCancel();\r\n this._boundOnKeyDown = (e: KeyboardEvent) => this.onKeyDown(e);\r\n\r\n this._element.nativeElement.addEventListener('pointermove', this._boundOnPointerMove);\r\n this._element.nativeElement.addEventListener('pointerup', this._boundOnPointerUp);\r\n this._element.nativeElement.addEventListener('pointercancel', this._boundOnPointerCancel);\r\n document.addEventListener('keydown', this._boundOnKeyDown);\r\n };\r\n\r\n private onPointerMove(event: PointerEvent): void {\r\n if (!this._isDragging) {\r\n const deltaX = event.clientX - this._startX;\r\n const deltaY = event.clientY - this._startY;\r\n const distance = Math.sqrt(deltaX ** 2 + deltaY ** 2);\r\n if (distance < REORDER_DEAD_ZONE_PX) return;\r\n\r\n // Start dragging\r\n this._isDragging = true;\r\n const table = this._table();\r\n table?.startColumnReorder(this._columnId());\r\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), true);\r\n }\r\n\r\n this._table()?.dragColumnReorder(event);\r\n }\r\n\r\n private onPointerUp(): void {\r\n if (this._isDragging) {\r\n this._table()?.endColumnReorder(false);\r\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\r\n }\r\n this.cleanup();\r\n }\r\n\r\n private onPointerCancel(): void {\r\n if (this._isDragging) {\r\n this._table()?.endColumnReorder(true);\r\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\r\n }\r\n this.cleanup();\r\n }\r\n\r\n private onKeyDown(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' && this._isDragging) {\r\n this._table()?.endColumnReorder(true);\r\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\r\n this.cleanup();\r\n }\r\n }\r\n\r\n private cleanup(): void {\r\n this._isDragging = false;\r\n if (this._pointerId != null) {\r\n try {\r\n this._element.nativeElement.releasePointerCapture(this._pointerId);\r\n } catch {\r\n // Ignore — capture may already be released\r\n }\r\n this._pointerId = null;\r\n }\r\n if (this._boundOnPointerMove) {\r\n this._element.nativeElement.removeEventListener('pointermove', this._boundOnPointerMove);\r\n this._boundOnPointerMove = null;\r\n }\r\n if (this._boundOnPointerUp) {\r\n this._element.nativeElement.removeEventListener('pointerup', this._boundOnPointerUp);\r\n this._boundOnPointerUp = null;\r\n }\r\n if (this._boundOnPointerCancel) {\r\n this._element.nativeElement.removeEventListener('pointercancel', this._boundOnPointerCancel);\r\n this._boundOnPointerCancel = null;\r\n }\r\n if (this._boundOnKeyDown) {\r\n document.removeEventListener('keydown', this._boundOnKeyDown);\r\n this._boundOnKeyDown = null;\r\n }\r\n }\r\n}\r\n","import { computed, Directive, effect, ElementRef, inject, input, Type } from '@angular/core';\r\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { NgnScrollerItem } from '@ngneers/controls/scroller';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { setInputSignalValue } from '@ngneers/controls/utils-ng';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\n\r\nimport type { FormattedTableDataRow } from './types';\r\n\r\n@Directive({\r\n selector: '[ngnTableBodyTr]',\r\n host: {\r\n '[attr.aria-rowindex]': 'ngnTableBodyTr().index + 2',\r\n '[style.--ngn-table-row-index]': 'ngnTableBodyTr().index + 2',\r\n '[class]': `theme.classes({\r\n 'even': ngnTableBodyTr().index % 2 === 0,\r\n 'selected-row': selected(),\r\n 'focused-row': focused()\r\n })`,\r\n '[attr.aria-selected]': 'selectable() ? selected() : null',\r\n role: 'row',\r\n '(click)': 'onRowClick($event)',\r\n },\r\n})\r\nexport class NgnTableBodyTr<T> extends NgnScrollerItem {\r\n public readonly ngnTableBodyTr = input.required<FormattedTableDataRow<T>>();\r\n public override readonly ngnScrollerItem = input<object>({});\r\n private readonly _element = inject(ElementRef<HTMLElement>);\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n\r\n protected readonly selectable = computed(() => !!this._table()?.selectionMode());\r\n\r\n protected readonly selected = computed(() => {\r\n const table = this._table();\r\n if (!table || !table.selectionMode()) return false;\r\n const row = this.ngnTableBodyTr();\r\n return table.isRowSelected(row.id as any);\r\n });\r\n\r\n protected readonly focused = computed(() => {\r\n const table = this._table();\r\n if (!table || !table.selectionMode()) return false;\r\n const row = this.ngnTableBodyTr();\r\n return table.focusedRowIndex() === row.index;\r\n });\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n const row = this.ngnTableBodyTr();\r\n setInputSignalValue(this.ngnScrollerItem, row);\r\n });\r\n this.prepareDom();\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\r\n }\r\n\r\n protected onRowClick(event: MouseEvent): void {\r\n const table = this._table();\r\n if (!table || !table.selectionMode()) return;\r\n table.handleRowClick(this.ngnTableBodyTr(), event);\r\n }\r\n}\r\n","import {\r\n ApplicationRef,\r\n type ComponentRef,\r\n computed,\r\n createComponent,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n EnvironmentInjector,\r\n inject,\r\n type OnDestroy,\r\n Type,\r\n} from '@angular/core';\r\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { NgnCheckbox } from '@ngneers/controls/checkbox';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableBodyTr } from './table-row';\r\n\r\n/**\r\n * Directive that turns a `<th>` or `<td>` into a selection checkbox column.\r\n *\r\n * **Header usage** — renders a \"select all / none\" checkbox:\r\n * ```html\r\n * <th ngnTableSelectionColumn></th>\r\n * ```\r\n *\r\n * **Body usage** — renders a per-row checkbox (must be inside a `[ngnTableBodyTr]`):\r\n * ```html\r\n * <td ngnTableSelectionColumn></td>\r\n * ```\r\n *\r\n * @category directive\r\n */\r\n@Directive({\r\n selector: '[ngnTableSelectionColumn]',\r\n host: {\r\n '(click)': 'onClick($event)',\r\n },\r\n})\r\nexport class NgnTableSelectionColumn implements OnDestroy {\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _envInjector = inject(EnvironmentInjector);\r\n private readonly _appRef = inject(ApplicationRef);\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n\r\n /** Non-null only when used inside a body row (`<td>`). */\r\n private readonly _bodyTr = inject(NgnTableBodyTr, { optional: true });\r\n\r\n private readonly _isHeader = this._element.nativeElement.tagName === 'TH';\r\n\r\n /**\r\n * NgnCheckbox created at the application level via `createComponent` + `EnvironmentInjector`.\r\n * This keeps it outside Angular's view tree so @for reconciliation cannot destroy it.\r\n */\r\n private _checkboxRef!: ComponentRef<NgnCheckbox<boolean>>;\r\n\r\n protected readonly selected = computed(() => {\r\n if (this._isHeader) return false;\r\n const table = this._table();\r\n const row = this._bodyTr?.ngnTableBodyTr();\r\n if (!table || !row) return false;\r\n return table.isRowSelected(row.id as any);\r\n });\r\n\r\n protected readonly focused = computed(() => {\r\n if (this._isHeader) return false;\r\n const table = this._table();\r\n const row = this._bodyTr?.ngnTableBodyTr();\r\n if (!table || !row) return false;\r\n return table.focusedRowIndex() === row.index;\r\n });\r\n\r\n constructor() {\r\n this._prepareDom();\r\n this._createCheckbox();\r\n\r\n if (this._isHeader) {\r\n this._setupHeaderEffects();\r\n // Register the selection column once the table signal resolves\r\n effect(() => {\r\n const table = this._table();\r\n if (table) {\r\n table.registerSelectionColumn();\r\n }\r\n });\r\n } else {\r\n this._setupBodyEffects();\r\n }\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n if (this._isHeader) {\r\n this._table()?.unregisterSelectionColumn();\r\n }\r\n this._appRef.detachView(this._checkboxRef.hostView);\r\n this._checkboxRef.destroy();\r\n }\r\n\r\n private _prepareDom(): void {\r\n const el = this._element.nativeElement;\r\n toggleClass(el, this.theme.class('cell'), true);\r\n toggleClass(el, this.theme.class('selection-column'), true);\r\n if (this._isHeader) {\r\n el.setAttribute('aria-label', 'Select all rows');\r\n }\r\n }\r\n\r\n /**\r\n * Creates an NgnCheckbox via `createComponent` + `EnvironmentInjector`.\r\n * The component is attached to `ApplicationRef` (not a ViewContainerRef),\r\n * so Angular's @for block reconciliation cannot destroy it.\r\n */\r\n private _createCheckbox(): void {\r\n this._checkboxRef = createComponent(NgnCheckbox, {\r\n environmentInjector: this._envInjector,\r\n });\r\n this._appRef.attachView(this._checkboxRef.hostView);\r\n\r\n const cbEl = this._checkboxRef.location.nativeElement;\r\n cbEl.classList.add(this.theme.class('selection-checkbox'));\r\n\r\n if (this._isHeader) {\r\n this._checkboxRef.setInput('allowIndeterminate', true);\r\n }\r\n\r\n this._element.nativeElement.appendChild(cbEl);\r\n }\r\n\r\n // --- Header (select-all) ---\r\n\r\n private _setupHeaderEffects(): void {\r\n effect(() => {\r\n const table = this._table();\r\n if (!table) return;\r\n setComponentInput(this._checkboxRef, 'value', table.headerCheckboxValue());\r\n });\r\n }\r\n\r\n // --- Body (per-row) ---\r\n\r\n private _setupBodyEffects(): void {\r\n effect(() => {\r\n const isSelected = this.selected();\r\n const isFocused = this.focused();\r\n const row = this._bodyTr?.ngnTableBodyTr();\r\n const el = this._element.nativeElement;\r\n\r\n setComponentInput(this._checkboxRef, 'value', isSelected);\r\n if (row) {\r\n el.style.setProperty('--ngn-table-row-index', String(row.index + 2));\r\n }\r\n toggleClass(el, this.theme.class('selected-row-cell'), isSelected);\r\n toggleClass(el, this.theme.class('focused-row-cell'), isFocused);\r\n });\r\n }\r\n\r\n // --- Click handling ---\r\n\r\n protected onClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n const table = this._table();\r\n if (!table) return;\r\n\r\n if (this._isHeader) {\r\n table.toggleSelectAll();\r\n } else {\r\n const row = this._bodyTr?.ngnTableBodyTr();\r\n if (row) {\r\n table.handleCheckboxChange(row);\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n afterNextRender,\r\n Directive,\r\n ElementRef,\r\n inject,\r\n input,\r\n type OnDestroy,\r\n Type,\r\n} from '@angular/core';\r\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTh } from './table-header-cell';\r\n\r\n// ── Shared scroll + resize tracking per <table> element ─────────────────────\r\n\r\ninterface TableTrackingState {\r\n scrollListener: () => void;\r\n resizeObserver: ResizeObserver;\r\n recalcRafId: number;\r\n directives: Set<NgnTableStickyColumn>;\r\n tableHostEl: HTMLElement;\r\n}\r\nconst tableTracker = new WeakMap<Element, TableTrackingState>();\r\n\r\nfunction attachTableTracking(\r\n scrollContainer: Element,\r\n tableHostEl: HTMLElement,\r\n directive: NgnTableStickyColumn,\r\n theme: ReturnType<typeof injectThemeTemplate<typeof tableControlTemplate>>\r\n): void {\r\n const existing = tableTracker.get(scrollContainer);\r\n if (existing) {\r\n existing.directives.add(directive);\r\n return;\r\n }\r\n\r\n const updateScrollClasses = () => {\r\n const el = scrollContainer;\r\n const scrolledLeft = el.scrollLeft > 1;\r\n const scrolledRight = el.scrollLeft < el.scrollWidth - el.clientWidth - 1;\r\n toggleClass(tableHostEl, theme.class('sticky-scrolled-left'), scrolledLeft);\r\n toggleClass(tableHostEl, theme.class('sticky-scrolled-right'), scrolledRight);\r\n };\r\n\r\n const stickyColumnClass = theme.class('sticky-column');\r\n const selectionColumnClass = theme.class('selection-column');\r\n\r\n const recalcAllOffsets = () => {\r\n const state = tableTracker.get(scrollContainer);\r\n if (!state) return;\r\n\r\n // Make all checkbox/selection columns sticky (they're created dynamically,\r\n // not via template, so the directive can't be placed on them).\r\n const selectionCols = Array.from(\r\n scrollContainer.querySelectorAll<HTMLElement>(`.${selectionColumnClass}`)\r\n );\r\n for (const col of selectionCols) {\r\n if (!col.classList.contains(stickyColumnClass)) {\r\n toggleClass(col, stickyColumnClass, true);\r\n toggleClass(col, theme.class('sticky-left'), true);\r\n }\r\n col.style.left = '0px';\r\n }\r\n\r\n for (const dir of state.directives) {\r\n dir._recalcOffset();\r\n }\r\n updateScrollClasses();\r\n };\r\n\r\n scrollContainer.addEventListener('scroll', updateScrollClasses, { passive: true });\r\n\r\n const directives = new Set<NgnTableStickyColumn>();\r\n directives.add(directive);\r\n\r\n // Coalesce rapid ResizeObserver callbacks (e.g. from selection class toggles)\r\n // into a single recalculation per animation frame.\r\n const state: TableTrackingState = {\r\n scrollListener: updateScrollClasses,\r\n resizeObserver: null!,\r\n recalcRafId: 0,\r\n directives,\r\n tableHostEl,\r\n };\r\n const debouncedRecalc = () => {\r\n if (state.recalcRafId) return;\r\n state.recalcRafId = requestAnimationFrame(() => {\r\n state.recalcRafId = 0;\r\n recalcAllOffsets();\r\n });\r\n };\r\n\r\n state.resizeObserver = new ResizeObserver(() => debouncedRecalc());\r\n state.resizeObserver.observe(scrollContainer);\r\n // Also observe <thead> — its subgrid cells change size when grid-template-columns updates,\r\n // but the table container's border-box may not change (overflow: auto).\r\n const thead = scrollContainer.querySelector('thead');\r\n if (thead) {\r\n state.resizeObserver.observe(thead);\r\n }\r\n\r\n // Initial update\r\n requestAnimationFrame(() => {\r\n recalcAllOffsets();\r\n updateScrollClasses();\r\n });\r\n\r\n tableTracker.set(scrollContainer, state);\r\n}\r\n\r\nfunction detachTableTracking(scrollContainer: Element, directive: NgnTableStickyColumn): void {\r\n const state = tableTracker.get(scrollContainer);\r\n if (!state) return;\r\n state.directives.delete(directive);\r\n if (state.directives.size === 0) {\r\n scrollContainer.removeEventListener('scroll', state.scrollListener);\r\n state.resizeObserver.disconnect();\r\n if (state.recalcRafId) cancelAnimationFrame(state.recalcRafId);\r\n toggleClass(\r\n state.tableHostEl,\r\n state.tableHostEl.className.split(' ').find(c => c.includes('sticky-scrolled-left')) ?? '',\r\n false\r\n );\r\n toggleClass(\r\n state.tableHostEl,\r\n state.tableHostEl.className.split(' ').find(c => c.includes('sticky-scrolled-right')) ?? '',\r\n false\r\n );\r\n tableTracker.delete(scrollContainer);\r\n }\r\n}\r\n\r\n// ── Directive ───────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * @category directive\r\n */\r\n@Directive({\r\n selector: '[ngnTableStickyColumn]',\r\n})\r\nexport class NgnTableStickyColumn implements OnDestroy {\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _headerCell = inject(NgnTableTh, { optional: true });\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n\r\n /**\r\n * Which side this column sticks to.\r\n */\r\n public readonly ngnTableStickyColumn = input.required<'left' | 'right'>();\r\n\r\n private _scrollContainer: Element | null = null;\r\n\r\n constructor() {\r\n const el = this._element.nativeElement;\r\n\r\n // Apply static sticky classes immediately\r\n toggleClass(el, this.theme.class('sticky-column'), true);\r\n\r\n afterNextRender(() => {\r\n const side = this.ngnTableStickyColumn();\r\n toggleClass(el, this.theme.class('sticky-left'), side === 'left');\r\n toggleClass(el, this.theme.class('sticky-right'), side === 'right');\r\n\r\n // Register with table for reorder awareness\r\n const table = this._table();\r\n const columnId = this._getColumnId();\r\n if (table && columnId) {\r\n table.registerStickyColumnId(columnId, side);\r\n }\r\n\r\n // Set up shared scroll + resize listener\r\n this._scrollContainer = el.closest('table');\r\n if (this._scrollContainer && table) {\r\n attachTableTracking(this._scrollContainer, table.element.nativeElement, this, this.theme);\r\n }\r\n\r\n // Initial offset + boundary calculation\r\n this._recalcOffset();\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n const table = this._table();\r\n const columnId = this._getColumnId();\r\n if (table && columnId) {\r\n table.unregisterStickyColumnId(columnId);\r\n }\r\n if (this._scrollContainer) {\r\n detachTableTracking(this._scrollContainer, this);\r\n }\r\n }\r\n\r\n /**\r\n * Recalculates sticky offset and boundary classes. Called by the shared\r\n * ResizeObserver when the table container changes size.\r\n * @internal\r\n */\r\n public _recalcOffset(): void {\r\n const el = this._element.nativeElement;\r\n const side = this.ngnTableStickyColumn();\r\n this._applyStickyOffset(el, side);\r\n this._applyBoundaryClasses(el, side);\r\n }\r\n\r\n private _getColumnId(): string | null {\r\n return this._headerCell?.ngnTableTh() ?? null;\r\n }\r\n\r\n /**\r\n * Computes and applies the sticky offset by measuring sibling sticky elements.\r\n * For left: offset = sum of widths of all preceding sticky-left cells + selection column.\r\n * For right: offset = sum of widths of all following sticky-right cells.\r\n */\r\n private _applyStickyOffset(el: HTMLElement, side: 'left' | 'right'): void {\r\n const stickyLeftClass = this.theme.class('sticky-left');\r\n const stickyRightClass = this.theme.class('sticky-right');\r\n const selectionColumnClass = this.theme.class('selection-column');\r\n\r\n // Find the row-level container.\r\n // For headers: all sticky cells in <thead>\r\n // For body: all sticky cells in the same <tr>\r\n const container = el.tagName === 'TH' ? el.closest('thead') : el.parentElement;\r\n if (!container) return;\r\n\r\n if (side === 'left') {\r\n let offset = 0;\r\n\r\n // Sum widths of all preceding sticky-left siblings (includes selection column\r\n // which was given sticky-left by the shared tracker)\r\n const stickyCells = Array.from(container.querySelectorAll(`.${stickyLeftClass}`));\r\n for (const cell of stickyCells) {\r\n if (cell === el) break;\r\n offset += cell.getBoundingClientRect().width;\r\n }\r\n\r\n el.style.left = `${offset}px`;\r\n el.style.right = '';\r\n } else {\r\n let offset = 0;\r\n\r\n // Sum widths of all following sticky-right siblings\r\n const stickyCells = Array.from(container.querySelectorAll(`.${stickyRightClass}`));\r\n let found = false;\r\n for (let i = stickyCells.length - 1; i >= 0; i--) {\r\n if (stickyCells[i] === el) {\r\n found = true;\r\n break;\r\n }\r\n if (!found) {\r\n offset += stickyCells[i]!.getBoundingClientRect().width;\r\n }\r\n }\r\n\r\n el.style.right = `${offset}px`;\r\n el.style.left = '';\r\n }\r\n }\r\n\r\n /**\r\n * Marks boundary cells: last sticky-left gets `sticky-left-last`,\r\n * first sticky-right gets `sticky-right-first`.\r\n */\r\n private _applyBoundaryClasses(el: HTMLElement, side: 'left' | 'right'): void {\r\n const stickyLeftClass = this.theme.class('sticky-left');\r\n const stickyRightClass = this.theme.class('sticky-right');\r\n\r\n const container = el.tagName === 'TH' ? el.closest('thead') : el.parentElement;\r\n if (!container) return;\r\n\r\n if (side === 'left') {\r\n const stickyCells = Array.from(container.querySelectorAll(`.${stickyLeftClass}`));\r\n const isLast = stickyCells[stickyCells.length - 1] === el;\r\n toggleClass(el, this.theme.class('sticky-left-last'), isLast);\r\n } else {\r\n const stickyCells = Array.from(container.querySelectorAll(`.${stickyRightClass}`));\r\n const isFirst = stickyCells[0] === el;\r\n toggleClass(el, this.theme.class('sticky-right-first'), isFirst);\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTd } from './table-cell';\r\nimport { NgnTableGroupHeaderTr } from './table-group-header-row';\r\nimport { NgnTableTh } from './table-header-cell';\r\nimport { NgnTableHeadTr } from './table-header-row';\r\nimport { NgnTableReorderableColumn } from './table-reorderable-column';\r\nimport { NgnTableBodyTr } from './table-row';\r\nimport { NgnTableSelectionColumn } from './table-selection-column';\r\nimport { NgnTableStickyColumn } from './table-sticky-column';\r\n\r\n@NgModule({\r\n imports: [\r\n NgnTable,\r\n NgnTableBodyTr,\r\n NgnTableTd,\r\n NgnTableTh,\r\n NgnTableHeadTr,\r\n NgnTableGroupHeaderTr,\r\n NgnTableReorderableColumn,\r\n NgnTableSelectionColumn,\r\n NgnTableStickyColumn,\r\n ],\r\n exports: [\r\n NgnTable,\r\n NgnTableBodyTr,\r\n NgnTableTd,\r\n NgnTableTh,\r\n NgnTableHeadTr,\r\n NgnTableGroupHeaderTr,\r\n NgnTableReorderableColumn,\r\n NgnTableSelectionColumn,\r\n NgnTableStickyColumn,\r\n ],\r\n})\r\nexport class NgnTableModule {}\r\n","import {\r\n ComponentRef,\r\n computed,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n type OnDestroy,\r\n Type,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { NgnActionButton } from '@ngneers/controls/button';\r\nimport { NgnFilter, type NgnFilterDataType } from '@ngneers/controls/filter';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTh } from './table-header-cell';\r\n\r\nimport type { NgnActionButtonConfig } from '@ngneers/controls/api';\r\n\r\n/**\r\n * @category directive\r\n */\r\n@Directive({\r\n selector: '[ngnTableFilterableColumn]',\r\n host: {\r\n '[class]': `theme.classes({'filterable-column': true, 'filtered-column': !!filter() })`,\r\n },\r\n})\r\nexport class NgnTableFilterableColumn implements OnDestroy {\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _columnId = inject(NgnTableTh).ngnTableTh;\r\n\r\n public readonly ngnTableFilterableColumn = input();\r\n\r\n private readonly _ngnActionButton: ComponentRef<NgnActionButton<null>>;\r\n private readonly _ngnFilter: ComponentRef<NgnFilter>;\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n private readonly _rows = computed(() => {\r\n return this._table()?.rows() || [];\r\n });\r\n protected readonly filter = computed(() => {\r\n const tableFilter = this._table()?.filters()?.[this._columnId()];\r\n return tableFilter;\r\n });\r\n\r\n public readonly ngnTableFilterableColumnType = input.required<NgnFilterDataType>();\r\n public readonly ngnTableFilterableColumnItems = input<string[] | null | undefined>();\r\n\r\n constructor() {\r\n this._ngnActionButton = inject(ViewContainerRef).createComponent(NgnActionButton<null>);\r\n this._ngnFilter = inject(ViewContainerRef).createComponent(NgnFilter);\r\n this._element.nativeElement.appendChild(this._ngnActionButton.location.nativeElement);\r\n this._element.nativeElement.appendChild(this._ngnFilter.location.nativeElement);\r\n this._ngnActionButton.location.nativeElement.classList.add(this.theme.class('filter-control'));\r\n\r\n setComponentInput(this._ngnActionButton, 'kind', 'icon');\r\n setComponentInput(this._ngnActionButton, 'inline', true);\r\n setComponentInput(this._ngnFilter, 'anchor', this._ngnActionButton.location.nativeElement);\r\n setComponentInput(this._ngnFilter, 'mode', 'headless');\r\n setComponentInput(this._ngnFilter, 'allowMultiple', true);\r\n\r\n const cfg = computed(\r\n () =>\r\n <NgnActionButtonConfig<null>>{\r\n label: 'Filter',\r\n value: null,\r\n kind: 'icon',\r\n defaultIcon: this.filter() ? 'filter_solid' : 'filter',\r\n action: event => {\r\n event.stopPropagation();\r\n this._ngnFilter.instance.show();\r\n },\r\n }\r\n );\r\n\r\n effect(() => {\r\n setComponentInput(this._ngnActionButton, 'config', cfg());\r\n });\r\n effect(() => {\r\n setComponentInput(\r\n this._ngnFilter,\r\n 'data',\r\n this._rows().map(row => row[this._columnId()])\r\n );\r\n });\r\n effect(() => {\r\n setComponentInput(this._ngnFilter, 'dataType', this.ngnTableFilterableColumnType());\r\n });\r\n effect(() => {\r\n setComponentInput(this._ngnFilter, 'listOptions', this.ngnTableFilterableColumnItems());\r\n });\r\n this._ngnFilter.instance.filterChange.subscribe(cfg => {\r\n const table = this._table();\r\n const currentFilters = table?.filters() || {};\r\n table?.filters.set({ ...currentFilters, [this._columnId()]: cfg ?? undefined });\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._ngnActionButton.destroy();\r\n this._ngnFilter.destroy();\r\n }\r\n}\r\n","import {\r\n ComponentRef,\r\n computed,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n type OnDestroy,\r\n Type,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTh } from './table-header-cell';\r\n\r\n/**\r\n * @category directive\r\n */\r\n@Directive({\r\n selector: '[ngnTableSortableColumn]',\r\n host: {\r\n '[class]': `theme.classes({'sortable-column': true, 'sorted-column': !!sort() })`,\r\n '(click)': `onHostClick($event)`,\r\n },\r\n})\r\nexport class NgnTableSortableColumn implements OnDestroy {\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n public readonly ngnTableSortableColumn = input();\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n protected readonly sort = computed(() => {\r\n const tableSort = this._table()?.sort();\r\n if (tableSort?.column === this.columnId()) {\r\n return tableSort.direction;\r\n }\r\n return null;\r\n });\r\n\r\n private readonly columnId = inject(NgnTableTh).ngnTableTh;\r\n\r\n private readonly _ngnIcon: ComponentRef<NgnIcon>;\r\n\r\n constructor() {\r\n this._ngnIcon = inject(ViewContainerRef).createComponent(NgnIcon);\r\n this._element.nativeElement.appendChild(this._ngnIcon.location.nativeElement);\r\n this._ngnIcon.location.nativeElement.classList.add(this.theme.class('sort-control'));\r\n\r\n effect(() => {\r\n const sort = this.sort();\r\n setComponentInput(\r\n this._ngnIcon,\r\n 'defaultIcon',\r\n sort === 'asc' ? 'sort_down' : sort === 'desc' ? 'sort_up' : 'sort'\r\n );\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._ngnIcon.destroy();\r\n }\r\n\r\n protected onHostClick(event: MouseEvent): void {\r\n const target = event.target as HTMLElement;\r\n if (target.classList.contains(this.theme.class('resize-handle'))) return;\r\n this.toggleSort();\r\n }\r\n\r\n protected toggleSort(): void {\r\n const currentSort = this.sort();\r\n const table = this._table();\r\n table?.sort.set(\r\n currentSort === null\r\n ? { column: this.columnId(), direction: 'asc' }\r\n : currentSort === 'asc'\r\n ? { column: this.columnId(), direction: 'desc' }\r\n : null\r\n );\r\n }\r\n}\r\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-group-header-row.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/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 { Directive, effect, ElementRef, inject, input } from '@angular/core';\r\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnScrollerItem } from '@ngneers/controls/scroller';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { setInputSignalValue } from '@ngneers/controls/utils-ng';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport type { FormattedTableGroupHeaderRow } from './types';\r\n\r\n@Directive({\r\n selector: '[ngnTableGroupHeaderTr]',\r\n host: {\r\n '[attr.aria-rowindex]': 'ngnTableGroupHeaderTr().index + 2',\r\n '[style.--ngn-table-row-index]': 'ngnTableGroupHeaderTr().index + 2',\r\n },\r\n})\r\nexport class NgnTableGroupHeaderTr extends NgnScrollerItem {\r\n public readonly ngnTableGroupHeaderTr = input.required<FormattedTableGroupHeaderRow>();\r\n public override readonly ngnScrollerItem = input<object>({});\r\n private readonly _element = inject(ElementRef<HTMLElement>);\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n const row = this.ngnTableGroupHeaderTr();\r\n setInputSignalValue(this.ngnScrollerItem, row);\r\n });\r\n this.prepareDom();\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\r\n toggleClass(this._element.nativeElement, this.theme.class('group-header-row'), true);\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, contentChild, TemplateRef } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\n\r\nimport type { FormattedTableDataRow } from './types';\r\n\r\nexport type GroupHeaderContext = {\r\n $implicit: {\r\n groupKey: unknown;\r\n groupValue: unknown;\r\n count: number;\r\n expanded: boolean;\r\n };\r\n};\r\n\r\n@Component({\r\n template: '',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport abstract class NgnTableTemplates<T extends object> extends NgnBase<'table'> {\r\n private readonly _headerTemplate = contentChild<TemplateRef<unknown>>('header');\r\n private readonly _bodyTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.body>>('body');\r\n private readonly _groupHeaderTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.groupHeader>>('groupHeader');\r\n\r\n protected readonly headerTemplate = this._headerTemplate;\r\n protected readonly bodyTemplate = this._bodyTemplate;\r\n protected readonly groupHeaderTemplate = this._groupHeaderTemplate;\r\n\r\n /**\r\n * Types for the table templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n /**\r\n * Type of the template variable for the body template.\r\n */\r\n body: { $implicit: FormattedTableDataRow<T> };\r\n /**\r\n * Type of the template variable for the group header template.\r\n */\r\n groupHeader: GroupHeaderContext;\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n afterRenderEffect,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n model,\r\n signal,\r\n booleanAttribute,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { executeMultiFilter } from '@ngneers/controls/api';\r\nimport { elementSizeSignal, NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { ResizeEngine, getResizeLimitInPx, type ResizableItem } from '@ngneers/controls/api/resize';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnPaginator, type PaginationState } from '@ngneers/controls/paginator';\r\nimport { NgnScrollShadow } from '@ngneers/controls/scroll-shadow';\r\nimport { NgnScroller } from '@ngneers/controls/scroller';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTableGroupHeaderTr } from './table-group-header-row';\r\nimport { NgnTableTemplates } from './table-templates';\r\n\r\n/**\r\n * Default minimum column width in pixels for table columns.\r\n * Enforced as an absolute floor even when a relative min-size (e.g. `5%`) resolves smaller.\r\n */\r\nconst TABLE_MIN_COLUMN_WIDTH_PX = 50;\r\n\r\n/** Splits a CSS grid-template-columns string into individual track values, handling minmax(). */\r\nconst GRID_TRACK_RE = /(?:minmax\\([^)]+\\)|[^\\s]+)/g;\r\n\r\nimport type { NgnTableTh } from './table-header-cell';\r\nimport type {\r\n FormattedTableDataRow,\r\n FormattedTableGroupHeaderRow,\r\n FormattedTableRow,\r\n TableSelectionMode,\r\n} from './types';\r\nimport type { NgnFilterConfig } from '@ngneers/controls/filter';\r\nimport type { AllKeysOfUnion } from '@ngneers/controls/utils';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n selector: 'ngn-table',\r\n templateUrl: './table.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n NgTemplateOutlet,\r\n NgnScroller,\r\n NgnPaginator,\r\n NgnTemplate,\r\n NgnPt,\r\n NgnIcon,\r\n NgnTableGroupHeaderTr,\r\n NgnScrollShadow,\r\n ],\r\n providers: [provideSelf(NgnTable)],\r\n host: {\r\n tabindex: '0',\r\n '[attr.aria-multiselectable]': 'selectionMode() === \"multi\" ? true : null',\r\n '(keydown)': 'onKeyDown($event)',\r\n },\r\n})\r\nexport class NgnTable<\r\n T extends object,\r\n K extends keyof T,\r\n G extends Extract<AllKeysOfUnion<T>, string> = never,\r\n> extends NgnTableTemplates<T> {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate, {\r\n root: true,\r\n virtual: () => this.virtual(),\r\n resizing: () => this._resizeEngine?.isDragging() ?? false,\r\n selectable: () => !!this.selectionMode(),\r\n reorderable: () => this.reorderable(),\r\n reordering: () => this._isReordering(),\r\n });\r\n private readonly _registeredHeaderCells = signal<NgnTableTh[]>([]);\r\n private readonly _stickyColumns = signal<ReadonlyMap<string, 'start' | 'end'>>(new Map());\r\n private readonly _scroller = viewChild.required(NgnScroller);\r\n\r\n public readonly rows = input.required<readonly T[]>();\r\n public readonly rowHeight = input<number>();\r\n public readonly fieldId = input.required<K>();\r\n public readonly virtual = input<boolean>(false);\r\n public readonly virtualPadding = input<number>(2);\r\n public readonly striped = input<boolean>(false);\r\n public readonly paginator = input<boolean>(false);\r\n\r\n /**\r\n * The selection mode for the table.\r\n * - `'single'`: Only one row can be selected at a time.\r\n * - `'multi'`: Multiple rows can be selected (with Ctrl/Shift click or checkboxes).\r\n * - `null`: Selection is disabled.\r\n * @default null\r\n */\r\n public readonly selectionMode = input<TableSelectionMode | null>(null);\r\n\r\n /**\r\n * The selected row IDs. Two-way bindable via `[(selection)]`.\r\n * @default []\r\n */\r\n public readonly selection = model<T[K & keyof T][]>([]);\r\n\r\n /**\r\n * Whether a selection column directive is present in the template.\r\n * Set automatically by `NgnTableSelectionColumn` — do not set manually.\r\n */\r\n private readonly _hasSelectionColumn = signal(false);\r\n\r\n /**\r\n * Column key to group rows by. Rows with the same value in this column\r\n * are collected under a collapsible group header.\r\n * @default null (no grouping)\r\n */\r\n public readonly groupBy = input<G | null>(null);\r\n\r\n /**\r\n * Two-way model tracking which groups are currently expanded, identified\r\n * by their column value. Defaults to `[]` (all collapsed).\r\n * Pass all group values to start with all groups expanded.\r\n *\r\n * Type-safe: when `groupBy` is set, this is typed as `T[G][]` where G\r\n * is the groupBy column key (inferred by Angular's template type checker).\r\n */\r\n public readonly expandedGroups = model<Array<T[G] & (string | number)>>([]);\r\n\r\n /**\r\n * Whether column resizing is enabled.\r\n * @default false\r\n */\r\n public readonly resizable = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * The resize distribution mode.\r\n * - `'adjacent'`: Only columns adjacent to the resize handle change. Total width stays the same.\r\n * - `'push'`: Column grows/shrinks independently, total width changes (enables horizontal scrolling).\r\n * @default 'adjacent'\r\n */\r\n public readonly resizeMode = input<'adjacent' | 'proportional' | 'push'>('adjacent');\r\n\r\n /**\r\n * Whether to lock affected columns to fixed `px` values after a resize completes.\r\n *\r\n * - **`proportional` mode**: when `true`, the resized column stays as `px` (locked);\r\n * when `false`, it is converted back to `fr` and continues to flex with the container.\r\n * - **`adjacent` / `push` modes**: when `true`, columns whose size changed are converted\r\n * to `px`; when `false`, columns keep their original units.\r\n *\r\n * @default false\r\n */\r\n public readonly lockSizes = input<boolean>(false);\r\n\r\n /**\r\n * Whether column reordering is enabled.\r\n * @default false\r\n */\r\n public readonly reorderable = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * The current column order as an array of column identifiers.\r\n * When empty, the natural registration order (DOM order) is used.\r\n * Supports two-way binding for persistence.\r\n */\r\n public readonly columnOrder = model<string[]>([]);\r\n\r\n protected readonly trackById = (item: T): unknown => item[this.fieldId()];\r\n public readonly sort = model<{\r\n column: Extract<AllKeysOfUnion<T>, string>;\r\n direction: 'asc' | 'desc';\r\n } | null>(null);\r\n public readonly filters = model<\r\n | {\r\n [key in Extract<AllKeysOfUnion<T>, string>]?: NgnFilterConfig;\r\n }\r\n | null\r\n >(null);\r\n protected readonly pageState = signal<PaginationState | null>(null);\r\n\r\n // --- Selection state ---\r\n\r\n public readonly showCheckboxes = this._hasSelectionColumn.asReadonly();\r\n\r\n /**\r\n * Set of selected row IDs for O(1) lookup.\r\n * Uses a content-aware equality check to avoid invalidating dependents\r\n * (50+ per-row computeds) when the selection hasn't actually changed.\r\n */\r\n protected readonly selectionSet = computed(() => new Set(this.selection()), {\r\n equal: (a, b) => a.size === b.size && [...a].every(v => b.has(v)),\r\n });\r\n\r\n /**\r\n * Anchor index for Shift+click range selection (index in formattedRows).\r\n */\r\n private readonly _selectionAnchor = signal<number | null>(null);\r\n\r\n /**\r\n * Currently focused row index for keyboard navigation (index in formattedRows).\r\n */\r\n public readonly focusedRowIndex = signal<number | null>(null);\r\n\r\n protected readonly isAllSelected = computed(() => {\r\n const rows = this.formattedRows();\r\n const selSet = this.selectionSet();\r\n return rows.length > 0 && rows.every(row => selSet.has(row.id as T[K & keyof T]));\r\n });\r\n\r\n protected readonly isIndeterminate = computed(() => {\r\n const selSet = this.selectionSet();\r\n return selSet.size > 0 && !this.isAllSelected();\r\n });\r\n\r\n public readonly headerCheckboxValue = computed<boolean | null>(() => {\r\n if (this.isAllSelected()) return true;\r\n if (this.isIndeterminate()) return null;\r\n return false;\r\n });\r\n\r\n /**\r\n * Total column count including the selection checkbox column.\r\n */\r\n protected readonly totalColumnCount = computed(\r\n () => this.columnCount() + (this.showCheckboxes() ? 1 : 0)\r\n );\r\n\r\n protected readonly formattedRows = computed<FormattedTableRow<T>[]>(() => {\r\n const groupBy = this.groupBy();\r\n if (groupBy) {\r\n return this._groupedRows();\r\n }\r\n const rows = this._sortedRows();\r\n return rows.map((data, index) => ({\r\n kind: 'data' as const,\r\n id: data[this.fieldId()] as T[keyof T] & (string | number),\r\n data,\r\n index,\r\n }));\r\n });\r\n\r\n private readonly _groupedRows = computed<FormattedTableRow<T>[]>(() => {\r\n const groupBy = this.groupBy();\r\n if (!groupBy) return [];\r\n const rows = this._sortedRows();\r\n const expandedSet = new Set<T[G] & (string | number)>(this.expandedGroups());\r\n const fieldId = this.fieldId();\r\n\r\n // Group rows by the groupBy column value, preserving sort order\r\n type GroupKey = T[G] & (string | number);\r\n const groupMap = new Map<GroupKey, T[]>();\r\n for (const row of rows) {\r\n const key = (row as Record<string, unknown>)[groupBy] as GroupKey;\r\n let group = groupMap.get(key);\r\n if (!group) {\r\n group = [];\r\n groupMap.set(key, group);\r\n }\r\n group.push(row);\r\n }\r\n\r\n // Build flat list with group headers interleaved\r\n const result: FormattedTableRow<T>[] = [];\r\n let index = 0;\r\n for (const [groupKey, groupRows] of groupMap) {\r\n const expanded = expandedSet.has(groupKey);\r\n result.push({\r\n kind: 'group-header',\r\n id: `group-${String(groupKey)}`,\r\n groupKey,\r\n groupValue: groupKey,\r\n count: groupRows.length,\r\n expanded,\r\n index: index++,\r\n });\r\n if (expanded) {\r\n for (const data of groupRows) {\r\n result.push({\r\n kind: 'data',\r\n id: data[fieldId] as T[keyof T] & (string | number),\r\n data,\r\n index: index++,\r\n });\r\n }\r\n }\r\n }\r\n return result;\r\n });\r\n\r\n protected readonly pagedRows = computed<FormattedTableRow<T>[]>(() => {\r\n const paginator = this.paginator();\r\n if (!paginator) {\r\n return this.formattedRows();\r\n }\r\n const pageState = this.pageState();\r\n if (!pageState) {\r\n return [];\r\n }\r\n return this.formattedRows().slice(\r\n pageState.slice.skip,\r\n pageState.slice.take + pageState.slice.skip\r\n );\r\n });\r\n\r\n private readonly _filteredRows = computed<readonly T[]>(() => {\r\n const filters = this.filters();\r\n const rows = this.rows();\r\n if (!filters) {\r\n return rows;\r\n }\r\n return executeMultiFilter(rows, filters);\r\n });\r\n\r\n private readonly _sortedRows = computed<readonly T[]>(() => {\r\n const rows = this._filteredRows();\r\n const sort = this.sort();\r\n if (!sort) {\r\n return rows;\r\n }\r\n const { column, direction } = sort;\r\n // @jasc @todo outsource sorting & allow custom sort functions\r\n return rows.toSorted((a, b) => {\r\n const aValue = a[column];\r\n const bValue = b[column];\r\n if (aValue == null && bValue != null) {\r\n return direction === 'asc' ? -1 : 1;\r\n }\r\n if (aValue != null && bValue == null) {\r\n return direction === 'asc' ? 1 : -1;\r\n }\r\n if (aValue == null && bValue == null) {\r\n return 0;\r\n }\r\n return typeof aValue === 'number' && typeof bValue === 'number'\r\n ? direction === 'asc'\r\n ? (aValue as number) - (bValue as number)\r\n : (bValue as number) - (aValue as number)\r\n : direction === 'asc'\r\n ? String(aValue).localeCompare(String(bValue))\r\n : String(bValue).localeCompare(String(aValue));\r\n });\r\n });\r\n\r\n protected readonly columnCount = computed(() => this._registeredHeaderCells().length);\r\n\r\n // --- Column reorder state ---\r\n\r\n private readonly _isReordering = signal(false);\r\n private readonly _reorderSourceColumnId = signal<string | null>(null);\r\n protected readonly _dropIndicatorState = signal<{\r\n leftPx: number;\r\n topPx: number;\r\n heightPx: number;\r\n } | null>(null);\r\n private _reorderTargetIndex = -1;\r\n\r\n /**\r\n * Effective column order: merges user-provided `columnOrder` with registered header cells.\r\n * If `columnOrder` is empty, falls back to registration order.\r\n * Unknown keys are filtered; new columns not in the order are appended.\r\n */\r\n private readonly _effectiveColumnOrder = computed<string[]>(() => {\r\n const cells = this._registeredHeaderCells();\r\n const cellIds = cells.map(c => c.ngnTableTh());\r\n const userOrder = this.columnOrder();\r\n\r\n if (!userOrder.length) {\r\n return cellIds;\r\n }\r\n\r\n // Filter to valid keys and append any new columns not in the order\r\n const validOrder = userOrder.filter(id => cellIds.includes(id));\r\n const missing = cellIds.filter(id => !validOrder.includes(id));\r\n return [...validOrder, ...missing];\r\n });\r\n\r\n protected readonly _stickyStartColumns = computed<string[]>(() => {\r\n const stickyMap = this._stickyColumns();\r\n const order = this._effectiveColumnOrder();\r\n const contiguous: string[] = [];\r\n for (const id of order) {\r\n if (stickyMap.get(id) === 'start') {\r\n contiguous.push(id);\r\n } else {\r\n break;\r\n }\r\n }\r\n return contiguous;\r\n });\r\n\r\n protected readonly _stickyEndColumns = computed<string[]>(() => {\r\n const stickyMap = this._stickyColumns();\r\n const order = this._effectiveColumnOrder();\r\n const contiguous: string[] = [];\r\n for (let i = order.length - 1; i >= 0; i--) {\r\n if (stickyMap.get(order[i]!) === 'end') {\r\n contiguous.unshift(order[i]!);\r\n } else {\r\n break;\r\n }\r\n }\r\n return contiguous;\r\n });\r\n\r\n /**\r\n * Maps column ID → 1-based visual position.\r\n */\r\n public readonly columnOrderMap = computed<ReadonlyMap<string, number>>(() => {\r\n const order = this._effectiveColumnOrder();\r\n const map = new Map<string, number>();\r\n for (let i = 0; i < order.length; i++) {\r\n map.set(order[i]!, i + 1);\r\n }\r\n return map;\r\n });\r\n\r\n /**\r\n * Returns the 1-based visual column index for a given 0-based logical (DOM) index.\r\n */\r\n public getVisualColumnIndex(logicalIndex: number): number {\r\n const cells = this._registeredHeaderCells();\r\n const cell = cells[logicalIndex];\r\n if (!cell) return logicalIndex + 1;\r\n return this.columnOrderMap().get(cell.ngnTableTh()) ?? logicalIndex + 1;\r\n }\r\n\r\n // --- Resize engine ---\r\n\r\n private readonly _tableElementSize = elementSizeSignal(this.element);\r\n private readonly _resizeEngine: ResizeEngine;\r\n\r\n /**\r\n * Grid template columns computed from the resize engine when resizable,\r\n * otherwise falls back to the standard equal-width repeat.\r\n */\r\n protected readonly gridTemplateColumns: ReturnType<typeof computed<string>>;\r\n\r\n constructor() {\r\n super();\r\n\r\n // Create engine eagerly in constructor (outside reactive context) to avoid NG0602\r\n this._resizeEngine = new ResizeEngine({\r\n items: computed(() => this._registeredHeaderCells() as unknown as readonly ResizableItem[]),\r\n containerSize: computed(() => {\r\n // Subscribe to the size signal for reactivity, but use clientWidth\r\n // to exclude vertical scrollbar width and avoid horizontal overflow.\r\n this._tableElementSize();\r\n const tableEl = this.element.nativeElement.querySelector('table');\r\n const total = tableEl?.clientWidth ?? 0;\r\n if (!this._hasSelectionColumn()) return total;\r\n // Subtract the selection column width so the resize engine only distributes\r\n // the remaining space among data columns.\r\n const selCol = this.element.nativeElement.querySelector(\r\n `.${this.theme.class('selection-column')}`\r\n );\r\n return total - (selCol?.getBoundingClientRect().width ?? 0);\r\n }),\r\n gapSizes: signal([]),\r\n distributionMode: computed(() => this.resizeMode()),\r\n containerConstrained: computed(() => this.resizeMode() !== 'push'),\r\n lockSizes: computed(() => this.lockSizes()),\r\n minItemSizePx: TABLE_MIN_COLUMN_WIDTH_PX,\r\n resolveItemSizes: () =>\r\n this._registeredHeaderCells().map(\r\n cell => cell.element.nativeElement.getBoundingClientRect().width\r\n ),\r\n });\r\n\r\n this.gridTemplateColumns = computed(() => {\r\n const checkboxCol = this._hasSelectionColumn() ? 'min-content ' : '';\r\n if (this.resizable()) {\r\n const rawSizes = this._resizeEngine.gridTemplateSizes();\r\n // When reorderable, permute grid track sizes to match visual column order\r\n if (this.reorderable()) {\r\n return `${checkboxCol}${this._permuteGridSizes(rawSizes)}`;\r\n }\r\n return `${checkboxCol}${rawSizes}`;\r\n }\r\n return `${checkboxCol}repeat(${this.columnCount()}, 1fr)`;\r\n });\r\n\r\n afterRenderEffect(() => {\r\n const startCols = this._stickyStartColumns();\r\n const endCols = this._stickyEndColumns();\r\n if (startCols.length === 0 && endCols.length === 0) return;\r\n if (this._resizeEngine.isDragging()) return;\r\n this._tableElementSize();\r\n\r\n const tableEl = this.element.nativeElement.querySelector(':scope > table');\r\n if (!tableEl) return;\r\n\r\n const cells = this._registeredHeaderCells();\r\n\r\n let selectionWidth = 0;\r\n if (this._hasSelectionColumn()) {\r\n const selCol = tableEl.querySelector(`.${this.theme.class('selection-column')}`);\r\n selectionWidth = selCol?.getBoundingClientRect().width ?? 0;\r\n }\r\n\r\n let cumulativeLeft = selectionWidth;\r\n for (let i = 0; i < startCols.length; i++) {\r\n (tableEl as HTMLElement).style.setProperty(\r\n `--ngn-sticky-start-offset-${i}`,\r\n `${cumulativeLeft}px`\r\n );\r\n const cell = cells.find(c => c.ngnTableTh() === startCols[i]);\r\n cumulativeLeft += cell?.element.nativeElement.getBoundingClientRect().width ?? 0;\r\n }\r\n\r\n let cumulativeRight = 0;\r\n for (let i = endCols.length - 1; i >= 0; i--) {\r\n (tableEl as HTMLElement).style.setProperty(\r\n `--ngn-sticky-end-offset-${i}`,\r\n `${cumulativeRight}px`\r\n );\r\n const cell = cells.find(c => c.ngnTableTh() === endCols[i]);\r\n cumulativeRight += cell?.element.nativeElement.getBoundingClientRect().width ?? 0;\r\n }\r\n });\r\n }\r\n\r\n protected pageChanged(event: PaginationState) {\r\n this.pageState.set(event);\r\n }\r\n\r\n public column<V extends AllKeysOfUnion<T> & string>(column: V): V {\r\n return column;\r\n }\r\n\r\n public registerSelectionColumn(): void {\r\n this._hasSelectionColumn.set(true);\r\n }\r\n\r\n public unregisterSelectionColumn(): void {\r\n this._hasSelectionColumn.set(false);\r\n }\r\n\r\n public registerHeaderCell(cell: NgnTableTh): void {\r\n this._registeredHeaderCells.update(cells => [...cells, cell]);\r\n }\r\n\r\n public unregisterHeaderCell(cell: NgnTableTh): void {\r\n this._registeredHeaderCells.update(cells => cells.filter(c => c !== cell));\r\n }\r\n\r\n public getRegisteredHeaderCells(): readonly NgnTableTh[] {\r\n return this._registeredHeaderCells();\r\n }\r\n\r\n public registerStickyColumn(columnId: string, side: 'start' | 'end'): void {\r\n this._stickyColumns.update(map => {\r\n const next = new Map(map);\r\n next.set(columnId, side);\r\n return next;\r\n });\r\n }\r\n\r\n public unregisterStickyColumn(columnId: string): void {\r\n this._stickyColumns.update(map => {\r\n const next = new Map(map);\r\n next.delete(columnId);\r\n return next;\r\n });\r\n }\r\n\r\n public getStickyInfo(\r\n columnId: string\r\n ): { side: 'start' | 'end'; index: number; isEdge: boolean } | null {\r\n const startCols = this._stickyStartColumns();\r\n const endCols = this._stickyEndColumns();\r\n const startIndex = startCols.indexOf(columnId);\r\n if (startIndex >= 0) {\r\n return { side: 'start', index: startIndex, isEdge: startIndex === startCols.length - 1 };\r\n }\r\n const endIndex = endCols.indexOf(columnId);\r\n if (endIndex >= 0) {\r\n return { side: 'end', index: endIndex, isEdge: endIndex === 0 };\r\n }\r\n return null;\r\n }\r\n\r\n // --- Resize operations (called by NgnTableTh) ---\r\n\r\n public startColumnResize(columnIndex: number, event: PointerEvent): void {\r\n if (!this.resizable()) return;\r\n this._resizeEngine.startDrag(columnIndex, event.clientX);\r\n }\r\n\r\n public dragColumnResize(columnIndex: number, event: PointerEvent): void {\r\n if (!this.resizable()) return;\r\n this._resizeEngine.drag(columnIndex, event.clientX);\r\n }\r\n\r\n public endColumnResize(columnIndex: number, cancel: boolean): void {\r\n if (!this.resizable()) return;\r\n this._resizeEngine.endDrag(columnIndex, cancel);\r\n }\r\n\r\n // --- Selection operations ---\r\n\r\n public isRowSelected(id: T[keyof T] & (string | number)): boolean {\r\n return this.selectionSet().has(id as T[K & keyof T]);\r\n }\r\n\r\n public handleRowClick(row: FormattedTableDataRow<T>, event: MouseEvent): void {\r\n const mode = this.selectionMode();\r\n if (!mode) return;\r\n\r\n const id = row.id as T[K & keyof T];\r\n const rowIndex = this.formattedRows().findIndex(r => r.id === row.id);\r\n\r\n if (mode === 'single') {\r\n this.selection.set([id]);\r\n this._selectionAnchor.set(rowIndex);\r\n this.focusedRowIndex.set(null);\r\n return;\r\n }\r\n\r\n // Multi mode\r\n if (event.shiftKey && this._selectionAnchor() !== null) {\r\n this._selectRange(this._selectionAnchor()!, rowIndex);\r\n } else if (event.ctrlKey || event.metaKey) {\r\n this._toggleRowInSelection(id);\r\n } else {\r\n this._toggleRowInSelection(id);\r\n }\r\n this._selectionAnchor.set(rowIndex);\r\n this.focusedRowIndex.set(null);\r\n }\r\n\r\n public handleCheckboxChange(row: FormattedTableDataRow<T>): void {\r\n const id = row.id as T[K & keyof T];\r\n this._toggleRowInSelection(id);\r\n const rowIndex = this.formattedRows().findIndex(r => r.id === row.id);\r\n this._selectionAnchor.set(rowIndex);\r\n this.focusedRowIndex.set(null);\r\n }\r\n\r\n public toggleSelectAll(): void {\r\n if (this.isAllSelected()) {\r\n this.selection.set([]);\r\n } else {\r\n const dataRows = this.formattedRows().filter(\r\n (r): r is FormattedTableDataRow<T> => r.kind === 'data'\r\n );\r\n this.selection.set(dataRows.map(r => r.id as T[K & keyof T]));\r\n }\r\n }\r\n\r\n private _toggleRowInSelection(id: T[K & keyof T]): void {\r\n const current = this.selection();\r\n if (this.selectionSet().has(id)) {\r\n this.selection.set(current.filter(v => v !== id));\r\n } else {\r\n this.selection.set([...current, id]);\r\n }\r\n }\r\n\r\n private _selectRange(fromIndex: number, toIndex: number): void {\r\n const rows = this.formattedRows();\r\n const start = Math.min(fromIndex, toIndex);\r\n const end = Math.max(fromIndex, toIndex);\r\n const rangeIds = rows\r\n .slice(start, end + 1)\r\n .filter((r): r is FormattedTableDataRow<T> => r.kind === 'data')\r\n .map(r => r.id as T[K & keyof T]);\r\n\r\n // Merge with existing selection (union)\r\n const currentSet = new Set(this.selection());\r\n for (const id of rangeIds) {\r\n currentSet.add(id);\r\n }\r\n this.selection.set([...currentSet]);\r\n }\r\n\r\n // --- Keyboard navigation ---\r\n\r\n protected onKeyDown(event: KeyboardEvent): void {\r\n const mode = this.selectionMode();\r\n if (!mode) return;\r\n\r\n const rows = this.formattedRows();\r\n if (rows.length === 0) return;\r\n\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Start from current focus, or current selection in single mode, or -1\r\n let currentIndex = this.focusedRowIndex();\r\n if (currentIndex === null && mode === 'single') {\r\n const sel = this.selection();\r\n if (sel.length > 0) {\r\n currentIndex = rows.findIndex(r => r.id === sel[0]);\r\n }\r\n }\r\n currentIndex ??= -1;\r\n\r\n const nextIndex =\r\n event.key === 'ArrowDown'\r\n ? Math.min(currentIndex + 1, rows.length - 1)\r\n : Math.max(currentIndex - 1, 0);\r\n\r\n this.focusedRowIndex.set(nextIndex);\r\n this._scroller().scrollToIndex(nextIndex);\r\n\r\n if (mode === 'single') {\r\n const id = rows[nextIndex]!.id as T[K & keyof T];\r\n this.selection.set([id]);\r\n this._selectionAnchor.set(nextIndex);\r\n } else if (event.shiftKey) {\r\n // Extend range selection with Shift+Arrow\r\n const anchor = this._selectionAnchor() ?? nextIndex;\r\n this._selectRange(anchor, nextIndex);\r\n }\r\n } else if (event.key === ' ' || event.key === 'Enter') {\r\n if (mode === 'multi') {\r\n const focusIdx = this.focusedRowIndex();\r\n if (focusIdx !== null && rows[focusIdx]) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const id = rows[focusIdx]!.id as T[K & keyof T];\r\n this._toggleRowInSelection(id);\r\n this._selectionAnchor.set(focusIdx);\r\n }\r\n }\r\n }\r\n }\r\n // --- Row grouping ---\r\n\r\n /**\r\n * Toggle the expanded state of a group identified by its column value.\r\n */\r\n public toggleGroup(groupKey: T[G] & (string | number)): void {\r\n const current = this.expandedGroups();\r\n if (current.includes(groupKey)) {\r\n this.expandedGroups.set(current.filter(k => k !== groupKey));\r\n } else {\r\n this.expandedGroups.set([...current, groupKey]);\r\n }\r\n }\r\n\r\n /**\r\n * Toggle a group from a group-header row. Used in the template where\r\n * the scroller item type cannot carry the `G` generic.\r\n * @internal\r\n */\r\n protected toggleGroupFromRow(row: FormattedTableGroupHeaderRow): void {\r\n this.toggleGroup(row.groupKey as T[G] & (string | number));\r\n }\r\n\r\n // --- Reorder operations (called by NgnTableReorderableColumn) ---\r\n\r\n public getReorderBounds(columnId: string): { min: number; max: number } {\r\n const order = this._effectiveColumnOrder();\r\n const startCols = this._stickyStartColumns();\r\n const endCols = this._stickyEndColumns();\r\n const side = this._stickyColumns().get(columnId);\r\n\r\n if (side === 'start') {\r\n return { min: 0, max: startCols.length };\r\n } else if (side === 'end') {\r\n return { min: order.length - endCols.length, max: order.length };\r\n } else {\r\n return { min: startCols.length, max: order.length - endCols.length };\r\n }\r\n }\r\n\r\n public startColumnReorder(columnId: string): void {\r\n if (!this.reorderable()) return;\r\n this._isReordering.set(true);\r\n this._reorderSourceColumnId.set(columnId);\r\n this._reorderTargetIndex = -1;\r\n }\r\n\r\n public dragColumnReorder(event: PointerEvent): void {\r\n if (!this.reorderable() || !this._isReordering()) return;\r\n\r\n const cells = this._registeredHeaderCells();\r\n const effectiveOrder = this._effectiveColumnOrder();\r\n const sourceId = this._reorderSourceColumnId();\r\n if (!sourceId) return;\r\n\r\n // Find drop target by comparing cursor X to header cell midpoints (in visual order)\r\n const cursorX = event.clientX;\r\n let targetIndex = effectiveOrder.length;\r\n\r\n // Build visual-order cells with their bounding boxes\r\n const visualCells = effectiveOrder\r\n .map(id => cells.find(c => c.ngnTableTh() === id))\r\n .filter((c): c is NgnTableTh => !!c);\r\n\r\n for (let i = 0; i < visualCells.length; i++) {\r\n const rect = visualCells[i]!.element.nativeElement.getBoundingClientRect();\r\n const midX = rect.left + rect.width / 2;\r\n if (cursorX < midX) {\r\n targetIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n const bounds = this.getReorderBounds(sourceId);\r\n targetIndex = Math.max(bounds.min, Math.min(bounds.max, targetIndex));\r\n\r\n this._reorderTargetIndex = targetIndex;\r\n\r\n // Compute indicator position relative to the table element\r\n const tableEl = this.element.nativeElement.querySelector(':scope > table');\r\n if (!tableEl) return;\r\n const tableRect = tableEl.getBoundingClientRect();\r\n\r\n // Use the first header cell's height for the indicator\r\n const firstCellRect = visualCells[0]?.element.nativeElement.getBoundingClientRect();\r\n const indicatorHeight = firstCellRect?.height ?? 40;\r\n\r\n let indicatorLeftPx: number;\r\n if (targetIndex === 0) {\r\n const firstCell = visualCells[0];\r\n if (!firstCell) return;\r\n const rect = firstCell.element.nativeElement.getBoundingClientRect();\r\n indicatorLeftPx = rect.left - tableRect.left;\r\n } else if (targetIndex >= visualCells.length) {\r\n const lastCell = visualCells[visualCells.length - 1];\r\n if (!lastCell) return;\r\n const rect = lastCell.element.nativeElement.getBoundingClientRect();\r\n indicatorLeftPx = rect.right - tableRect.left;\r\n } else {\r\n const prevCell = visualCells[targetIndex - 1]!;\r\n const nextCell = visualCells[targetIndex]!;\r\n const prevRect = prevCell.element.nativeElement.getBoundingClientRect();\r\n const nextRect = nextCell.element.nativeElement.getBoundingClientRect();\r\n indicatorLeftPx = (prevRect.right + nextRect.left) / 2 - tableRect.left;\r\n }\r\n\r\n // Clamp so the 3px-wide indicator stays within the visible content area\r\n // (use clientWidth to exclude scrollbar width from the boundary)\r\n const maxLeft = tableEl.clientWidth - 3;\r\n indicatorLeftPx = Math.max(0, Math.min(indicatorLeftPx, maxLeft));\r\n\r\n this._dropIndicatorState.set({\r\n leftPx: indicatorLeftPx,\r\n topPx: tableEl.scrollTop,\r\n heightPx: indicatorHeight,\r\n });\r\n }\r\n\r\n public endColumnReorder(cancel: boolean): void {\r\n if (!this.reorderable()) return;\r\n\r\n if (!cancel && this._reorderTargetIndex >= 0) {\r\n const sourceId = this._reorderSourceColumnId();\r\n if (sourceId) {\r\n const effectiveOrder = [...this._effectiveColumnOrder()];\r\n const sourceIndex = effectiveOrder.indexOf(sourceId);\r\n\r\n if (sourceIndex >= 0) {\r\n // Remove source from its current position\r\n effectiveOrder.splice(sourceIndex, 1);\r\n // Adjust target index if source was before target\r\n let insertAt = this._reorderTargetIndex;\r\n if (sourceIndex < this._reorderTargetIndex) {\r\n insertAt--;\r\n }\r\n // Insert at new position\r\n effectiveOrder.splice(insertAt, 0, sourceId);\r\n\r\n this.columnOrder.set(effectiveOrder);\r\n }\r\n }\r\n }\r\n\r\n this._isReordering.set(false);\r\n this._reorderSourceColumnId.set(null);\r\n this._dropIndicatorState.set(null);\r\n this._reorderTargetIndex = -1;\r\n }\r\n\r\n public getReorderSourceColumnId(): string | null {\r\n return this._reorderSourceColumnId();\r\n }\r\n\r\n /**\r\n * Permutes grid template sizes from logical (registration) order to visual (column order) order.\r\n */\r\n private _permuteGridSizes(rawSizes: string): string {\r\n const tracks = rawSizes.match(GRID_TRACK_RE) ?? [];\r\n const cells = this._registeredHeaderCells();\r\n const effectiveOrder = this._effectiveColumnOrder();\r\n\r\n if (tracks.length !== cells.length) {\r\n return rawSizes; // Mismatch — don't permute\r\n }\r\n\r\n // Build map: column ID → track size (logical order)\r\n const sizeByColumnId = new Map<string, string>();\r\n for (let i = 0; i < cells.length; i++) {\r\n sizeByColumnId.set(cells[i]!.ngnTableTh(), tracks[i]!);\r\n }\r\n\r\n // Emit sizes in visual order\r\n return effectiveOrder.map(id => sizeByColumnId.get(id) ?? '1fr').join(' ');\r\n }\r\n\r\n /**\r\n * Auto-sizes the column at `columnIndex` to fit its visible content.\r\n * Uses `Canvas.measureText()` for fast, reflow-free text measurement since\r\n * grid-constrained cells (`min-width: 0`) don't report natural content width\r\n * via `scrollWidth`.\r\n */\r\n public autoSizeColumn(columnIndex: number): void {\r\n if (!this.resizable()) return;\r\n\r\n const cells = this._registeredHeaderCells();\r\n const headerCell = cells[columnIndex];\r\n if (!headerCell) return;\r\n\r\n const tableEl = this.element.nativeElement.querySelector('table');\r\n if (!tableEl) return;\r\n\r\n const headerEl = headerCell.element.nativeElement as HTMLElement;\r\n const ctx = autoSizeCanvasCtx();\r\n\r\n // Measure header: text width + non-text siblings (icons, controls) + flex gap.\r\n // The header cell is a flex container with: cell-text, spacer, filter/sort icons, resize handle.\r\n const cellTextClass = this.theme.class('cell-text');\r\n const headerTextEl = headerEl.querySelector<HTMLElement>(`.${cellTextClass}`);\r\n let headerRequiredWidth = 0;\r\n if (headerTextEl) {\r\n ctx.font = getCssFont(headerEl);\r\n const text = headerTextEl.textContent ?? '';\r\n headerRequiredWidth = Math.ceil(ctx.measureText(text).width);\r\n }\r\n // Add width of visible non-text siblings (filter icon, sort icon, etc.)\r\n const headerStyle = getComputedStyle(headerEl);\r\n const headerGap = parseFloat(headerStyle.gap) || 0;\r\n let visibleSiblingCount = 0;\r\n for (let i = 0; i < headerEl.children.length; i++) {\r\n const child = headerEl.children[i] as HTMLElement;\r\n if (child === headerTextEl) continue;\r\n // Skip spacer (zero intrinsic width) and hidden resize handle\r\n if (child.offsetWidth > 0 && getComputedStyle(child).flexGrow === '0') {\r\n headerRequiredWidth += child.offsetWidth;\r\n visibleSiblingCount++;\r\n }\r\n }\r\n // Add flex gaps between visible items\r\n if (visibleSiblingCount > 0) {\r\n headerRequiredWidth += headerGap * visibleSiblingCount;\r\n }\r\n let maxContentWidth = headerRequiredWidth;\r\n\r\n // Measure visible body cells (nth-child is 1-indexed, offset by selection column)\r\n const selectionOffset = this._hasSelectionColumn() ? 1 : 0;\r\n const bodyCells = Array.from(\r\n tableEl.querySelectorAll<HTMLElement>(\r\n `tbody tr td:nth-child(${columnIndex + selectionOffset + 1})`\r\n )\r\n );\r\n if (bodyCells.length > 0) {\r\n ctx.font = getCssFont(bodyCells[0]!);\r\n for (let i = 0; i < bodyCells.length; i++) {\r\n const text = bodyCells[i]!.textContent ?? '';\r\n maxContentWidth = Math.max(maxContentWidth, Math.ceil(ctx.measureText(text).width));\r\n }\r\n }\r\n\r\n // Add cell horizontal padding\r\n const paddingLeft = parseFloat(headerStyle.paddingLeft) || 0;\r\n const paddingRight = parseFloat(headerStyle.paddingRight) || 0;\r\n const totalWidth = maxContentWidth + paddingLeft + paddingRight;\r\n\r\n // Clamp to min/max constraints\r\n const containerSize = this._tableElementSize().width;\r\n const minPx = Math.max(\r\n TABLE_MIN_COLUMN_WIDTH_PX,\r\n getResizeLimitInPx(headerCell.minSize(), containerSize)\r\n );\r\n const maxPx = getResizeLimitInPx(headerCell.maxSize(), containerSize);\r\n const clampedWidth = Math.max(minPx, Math.min(maxPx, totalWidth));\r\n\r\n this._resizeEngine.setItemSize(headerCell as unknown as ResizableItem, `${clampedWidth}px`);\r\n this._resizeEngine.hasBeenResized.set(true);\r\n }\r\n}\r\n\r\n// --- Auto-size helpers ---\r\n\r\n/** Lazily created canvas context for text measurement (no DOM reflows). */\r\nlet _autoSizeCtx: CanvasRenderingContext2D | null = null;\r\nfunction autoSizeCanvasCtx(): CanvasRenderingContext2D {\r\n if (!_autoSizeCtx) {\r\n _autoSizeCtx = document.createElement('canvas').getContext('2d')!;\r\n }\r\n return _autoSizeCtx;\r\n}\r\n\r\n/** Builds the CSS font shorthand from an element's computed style. */\r\nfunction getCssFont(el: HTMLElement): string {\r\n const s = getComputedStyle(el);\r\n return `${s.fontStyle} ${s.fontWeight} ${s.fontSize} ${s.fontFamily}`;\r\n}\r\n","<table\r\n #scrollContainer\r\n ngnScrollShadow=\"horizontal\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{ table: true, striped: striped() }\"\r\n [attr.aria-rowcount]=\"formattedRows().length\"\r\n [style.--ngn-table-column-count]=\"totalColumnCount()\"\r\n [style.--ngn-table-selection-offset]=\"showCheckboxes() ? 1 : 0\"\r\n [style.grid-template-columns]=\"gridTemplateColumns()\"\r\n [style.--ngn-table-row-height.px]=\"rowHeight()\"\r\n>\r\n <thead [ptInt]=\"this\" [ptClass]=\"'head'\">\r\n <ng-container [ngTemplateOutlet]=\"headerTemplate()\"></ng-container>\r\n </thead>\r\n @if (_dropIndicatorState()) {\r\n <div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'drop-indicator'\"\r\n [style.left.px]=\"_dropIndicatorState()!.leftPx\"\r\n [style.top.px]=\"_dropIndicatorState()!.topPx\"\r\n [style.height.px]=\"_dropIndicatorState()!.heightPx\"\r\n ></div>\r\n }\r\n\r\n <tbody\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'body'\"\r\n ngn-scroller\r\n #scroller\r\n [scrollContainer]=\"scrollContainer\"\r\n [virtual]=\"virtual()\"\r\n [items]=\"pagedRows()\"\r\n [fieldId]=\"'id'\"\r\n [itemHeight]=\"rowHeight() || 0\"\r\n [virtualPadding]=\"virtualPadding()\"\r\n [style.--ngn-table-item-start-index]=\"scroller.itemStartIndex()\"\r\n >\r\n <ng-template #item [ngnTemplate]=\"scroller.templateTypes.item\" let-item let-index=\"index\">\r\n @if (item.kind === 'group-header') {\r\n @if (groupHeaderTemplate(); as customGroupHeader) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"customGroupHeader\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: {\r\n groupKey: item.groupKey,\r\n groupValue: item.groupValue,\r\n count: item.count,\r\n expanded: item.expanded,\r\n },\r\n }\"\r\n ></ng-container>\r\n } @else {\r\n <tr\r\n [ngnTableGroupHeaderTr]=\"item\"\r\n [class]=\"theme.classes({ 'group-expanded': item.expanded })\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n role=\"row\"\r\n (click)=\"toggleGroupFromRow(item)\"\r\n >\r\n <td [class]=\"theme.class('group-header-cell')\" role=\"gridcell\">\r\n <ngn-icon\r\n [defaultIcon]=\"'table-group-toggle'\"\r\n [class]=\"theme.class('group-toggle')\"\r\n />\r\n <span>{{ item.groupValue }}</span>\r\n <span>({{ item.count }})</span>\r\n </td>\r\n </tr>\r\n }\r\n } @else {\r\n <ng-container\r\n [ngTemplateOutlet]=\"bodyTemplate()\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n ></ng-container>\r\n }\r\n </ng-template>\r\n </tbody>\r\n</table>\r\n@if (paginator()) {\r\n <ngn-paginator [totalItems]=\"rows().length\" (value)=\"pageChanged($event)\" />\r\n}\r\n","import { afterNextRender, afterRenderEffect, computed, Directive, signal } from '@angular/core';\r\nimport { getNearestNgnInstance, NgnBase } from '@ngneers/controls/base';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\n\r\n@Directive({\r\n selector: '[ngnTableTd]',\r\n host: { '[style.--ngn-table-column-index]': '_visualColumnIndex()' },\r\n})\r\nexport class NgnTableTd extends NgnBase<'table'> {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\r\n private readonly _table = signal<NgnTable<any, any> | null>(null);\r\n\r\n /** 0-based logical (DOM) index of this cell within its row. */\r\n private readonly _logicalIndex = signal(0);\r\n\r\n /** 1-based visual column index, remapped through the table's column order. */\r\n protected readonly _visualColumnIndex = computed(() => {\r\n const logicalIndex = this._logicalIndex();\r\n const table = this._table();\r\n if (table) {\r\n // Subtract the selection column offset so DOM index aligns with registered header cells.\r\n const offset = table.showCheckboxes() ? 1 : 0;\r\n return table.getVisualColumnIndex(logicalIndex - offset);\r\n }\r\n return logicalIndex + 1;\r\n });\r\n\r\n private readonly _columnId = computed(() => {\r\n const table = this._table();\r\n if (!table) return null;\r\n const offset = table.showCheckboxes() ? 1 : 0;\r\n const logicalIndex = this._logicalIndex() - offset;\r\n const cells = table.getRegisteredHeaderCells();\r\n return cells[logicalIndex]?.ngnTableTh() ?? null;\r\n });\r\n\r\n private readonly _stickyInfo = computed(() => {\r\n const table = this._table();\r\n const columnId = this._columnId();\r\n if (!table || !columnId) return null;\r\n return table.getStickyInfo(columnId);\r\n });\r\n\r\n constructor() {\r\n super();\r\n this.prepareDom();\r\n const parent = this.element.nativeElement.parentElement?.children;\r\n if (parent) {\r\n const index = Array.from(parent).findIndex(child => child === this.element.nativeElement);\r\n this._logicalIndex.set(index);\r\n }\r\n\r\n afterNextRender(() => {\r\n const table = getNearestNgnInstance(this.element.nativeElement, NgnTable) as NgnTable<\r\n any,\r\n any\r\n > | null;\r\n this._table.set(table);\r\n });\r\n\r\n afterRenderEffect(() => {\r\n const info = this._stickyInfo();\r\n const el = this.element.nativeElement;\r\n toggleClass(el, this.theme.class('sticky-start'), info?.side === 'start');\r\n toggleClass(el, this.theme.class('sticky-end'), info?.side === 'end');\r\n toggleClass(el, this.theme.class('sticky-start-edge'), info?.side === 'start' && info.isEdge);\r\n toggleClass(el, this.theme.class('sticky-end-edge'), info?.side === 'end' && info.isEdge);\r\n\r\n if (info) {\r\n el.style.position = 'sticky';\r\n if (info.side === 'start') {\r\n el.style.left = `var(--ngn-sticky-start-offset-${info.index})`;\r\n el.style.removeProperty('right');\r\n } else {\r\n el.style.right = `var(--ngn-sticky-end-offset-${info.index})`;\r\n el.style.removeProperty('left');\r\n }\r\n } else {\r\n el.style.removeProperty('position');\r\n el.style.removeProperty('left');\r\n el.style.removeProperty('right');\r\n }\r\n });\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this.element.nativeElement, this.theme.class('cell'), true);\r\n }\r\n}\r\n","import {\r\n afterNextRender,\r\n afterRenderEffect,\r\n computed,\r\n Directive,\r\n ElementRef,\r\n inject,\r\n input,\r\n model,\r\n type OnDestroy,\r\n type OnInit,\r\n Renderer2,\r\n signal,\r\n type Signal,\r\n} from '@angular/core';\r\nimport { getNearestNgnInstance, NgnBase } from '@ngneers/controls/base';\r\nimport { NgnError, toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\n\r\nimport type { ResizableItem, ResizeLimit, ResizeSize } from '@ngneers/controls/api/resize';\r\n\r\n@Directive({\r\n selector: '[ngnTableTh]',\r\n host: {\r\n '[style.--ngn-table-column-index]': '_visualColumnIndex()',\r\n },\r\n})\r\nexport class NgnTableTh extends NgnBase<'table'> implements ResizableItem, OnDestroy, OnInit {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\r\n private _table?: NgnTable<any, any>;\r\n private readonly _tableSignal = signal<NgnTable<any, any> | null>(null);\r\n private _resizeHandle?: HTMLDivElement;\r\n\r\n public readonly ngnTableTh = input.required<string>();\r\n\r\n /**\r\n * The size of this column (e.g. '1fr', '200px', '25%').\r\n * @default '1fr'\r\n */\r\n public readonly size = model<ResizeSize>('1fr');\r\n\r\n /**\r\n * The minimum size constraint for this column.\r\n * @default '50px'\r\n */\r\n public readonly minSize: Signal<ResizeLimit> = input<ResizeLimit>('50px');\r\n\r\n /**\r\n * The maximum size constraint for this column.\r\n * @default '100%'\r\n */\r\n public readonly maxSize: Signal<ResizeLimit> = input<ResizeLimit>('100%');\r\n\r\n /**\r\n * Whether this column is resizable. Computed from the parent table's `resizable` input.\r\n */\r\n public readonly resizable = computed(() => this._table?.resizable() ?? false);\r\n\r\n /**\r\n * Whether the resize handle should be shown. Hidden for the last column in adjacent\r\n * and proportional modes since it is implicitly resized via the previous column's handle.\r\n * Push mode shows handles on all columns since each column grows independently.\r\n */\r\n private readonly _showHandle = computed(() => {\r\n if (!this._table?.resizable()) return false;\r\n if (this._table.resizeMode() === 'push') return true;\r\n // Adjacent & proportional: hide handle on last column\r\n const cells = this._table.getRegisteredHeaderCells();\r\n return cells.indexOf(this) < cells.length - 1;\r\n });\r\n\r\n /**\r\n * 1-based visual column index, derived from the table's column order map.\r\n * Falls back to registration index + 1 when no reordering is active.\r\n */\r\n public readonly _visualColumnIndex = computed(() => {\r\n if (!this._table) return undefined;\r\n const map = this._table.columnOrderMap();\r\n return map.get(this.ngnTableTh()) ?? this.getColumnIndex() + 1;\r\n });\r\n\r\n constructor() {\r\n super();\r\n this.prepareDom();\r\n\r\n const renderer = inject(Renderer2);\r\n const elRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n afterNextRender(() => {\r\n // Wrap existing content in a text container for ellipsis support\r\n const textWrapper = renderer.createElement('span');\r\n textWrapper.classList.add(this.theme.class('cell-text'));\r\n const el = elRef.nativeElement;\r\n while (el.firstChild) {\r\n textWrapper.appendChild(el.firstChild);\r\n }\r\n el.appendChild(textWrapper);\r\n\r\n // Move dynamically-created controls back out of the text wrapper\r\n // so they participate in the header cell's flex layout (order: 2, 3)\r\n const filterControl = textWrapper.querySelector(`.${this.theme.class('filter-control')}`);\r\n if (filterControl) el.appendChild(filterControl);\r\n const sortControl = textWrapper.querySelector(`.${this.theme.class('sort-control')}`);\r\n if (sortControl) el.appendChild(sortControl);\r\n\r\n // Spacer div for flex layout\r\n const spacer = renderer.createElement('div');\r\n spacer.classList.add(this.theme.class('spacer'));\r\n elRef.nativeElement.appendChild(spacer);\r\n\r\n // Resize handle\r\n this._resizeHandle = renderer.createElement('div') as HTMLDivElement;\r\n this._resizeHandle.classList.add(this.theme.class('resize-handle'));\r\n this._resizeHandle.addEventListener('pointerdown', this.onResizePointerDown);\r\n this._resizeHandle.addEventListener('dblclick', this.onResizeDblClick);\r\n elRef.nativeElement.appendChild(this._resizeHandle);\r\n });\r\n\r\n // Toggle handle visibility based on mode and column position\r\n afterRenderEffect(() => {\r\n const show = this._showHandle();\r\n if (this._resizeHandle) {\r\n this._resizeHandle.style.display = show ? '' : 'none';\r\n }\r\n });\r\n\r\n // Sticky column classes and offsets\r\n afterRenderEffect(() => {\r\n const table = this._tableSignal();\r\n if (!table) return;\r\n const info = table.getStickyInfo(this.ngnTableTh());\r\n const el = this.element.nativeElement;\r\n toggleClass(el, this.theme.class('sticky-start'), info?.side === 'start');\r\n toggleClass(el, this.theme.class('sticky-end'), info?.side === 'end');\r\n toggleClass(el, this.theme.class('sticky-start-edge'), info?.side === 'start' && info.isEdge);\r\n toggleClass(el, this.theme.class('sticky-end-edge'), info?.side === 'end' && info.isEdge);\r\n\r\n if (info) {\r\n el.style.position = 'sticky';\r\n if (info.side === 'start') {\r\n el.style.left = `var(--ngn-sticky-start-offset-${info.index})`;\r\n el.style.removeProperty('right');\r\n } else {\r\n el.style.right = `var(--ngn-sticky-end-offset-${info.index})`;\r\n el.style.removeProperty('left');\r\n }\r\n } else {\r\n el.style.removeProperty('position');\r\n el.style.removeProperty('left');\r\n el.style.removeProperty('right');\r\n }\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n const table = getNearestNgnInstance(this.element.nativeElement, NgnTable<any, any>);\r\n if (!table) {\r\n throw new NgnError('ngnTableTh', 'ngnTableTh must be used within an NgnTable component');\r\n }\r\n this._table = table;\r\n this._tableSignal.set(table);\r\n this._table.registerHeaderCell(this);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._table?.unregisterHeaderCell(this);\r\n this._resizeHandle?.removeEventListener('pointerdown', this.onResizePointerDown);\r\n this._resizeHandle?.removeEventListener('dblclick', this.onResizeDblClick);\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this.element.nativeElement, this.theme.class('cell'), true);\r\n toggleClass(this.element.nativeElement, this.theme.class('resizable'), true);\r\n }\r\n\r\n private readonly onResizeDblClick = (event: MouseEvent) => {\r\n if (!this._table?.resizable()) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const columnIndex = this.getColumnIndex();\r\n if (columnIndex < 0) return;\r\n this._table.autoSizeColumn(columnIndex);\r\n };\r\n\r\n private readonly onResizePointerDown = (event: PointerEvent) => {\r\n if (!this._table?.resizable()) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const target = event.target as HTMLElement;\r\n try {\r\n target.setPointerCapture(event.pointerId);\r\n } catch {\r\n // Ignore\r\n }\r\n\r\n const columnIndex = this.getColumnIndex();\r\n if (columnIndex < 0) return;\r\n\r\n this._table.startColumnResize(columnIndex, event);\r\n\r\n const onPointerMove = (e: PointerEvent) => {\r\n this._table!.dragColumnResize(columnIndex, e);\r\n };\r\n const cleanup = (cancel: boolean) => {\r\n this._table!.endColumnResize(columnIndex, cancel);\r\n target.removeEventListener('pointermove', onPointerMove);\r\n target.removeEventListener('pointerup', onPointerUp);\r\n target.removeEventListener('pointercancel', onPointerCancel);\r\n };\r\n const onPointerUp = () => cleanup(false);\r\n const onPointerCancel = () => cleanup(true);\r\n\r\n target.addEventListener('pointermove', onPointerMove);\r\n target.addEventListener('pointerup', onPointerUp);\r\n target.addEventListener('pointercancel', onPointerCancel);\r\n };\r\n\r\n private getColumnIndex(): number {\r\n if (!this._table) return -1;\r\n const cells = this._table.getRegisteredHeaderCells();\r\n return cells.indexOf(this);\r\n }\r\n}\r\n","import { Directive, ElementRef, inject } from '@angular/core';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\n@Directive({ selector: '[ngnTableHeadTr]', host: { '[attr.aria-rowindex]': '1' } })\r\nexport class NgnTableHeadTr extends NgnBase<'table'> {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject(ElementRef<HTMLElement>);\r\n\r\n constructor() {\r\n super();\r\n this.prepareDom();\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\r\n }\r\n}\r\n","import {\r\n afterNextRender,\r\n Directive,\r\n ElementRef,\r\n inject,\r\n type OnDestroy,\r\n Type,\r\n} from '@angular/core';\r\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTh } from './table-header-cell';\r\n\r\n/** Minimum distance in pixels before a drag is initiated. */\r\nconst REORDER_DEAD_ZONE_PX = 5;\r\n\r\n/**\r\n * @category directive\r\n */\r\n@Directive({\r\n selector: '[ngnTableReorderableColumn]',\r\n})\r\nexport class NgnTableReorderableColumn implements OnDestroy {\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _headerCell = inject(NgnTableTh);\r\n private readonly _columnId = this._headerCell.ngnTableTh;\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n\r\n private _isDragging = false;\r\n private _startX = 0;\r\n private _startY = 0;\r\n private _pointerId: number | null = null;\r\n private _boundOnPointerMove: ((e: PointerEvent) => void) | null = null;\r\n private _boundOnPointerUp: (() => void) | null = null;\r\n private _boundOnPointerCancel: (() => void) | null = null;\r\n private _boundOnKeyDown: ((e: KeyboardEvent) => void) | null = null;\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n const el = this._element.nativeElement;\r\n el.addEventListener('pointerdown', this.onPointerDown);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._element.nativeElement.removeEventListener('pointerdown', this.onPointerDown);\r\n this.cleanup();\r\n }\r\n\r\n private readonly onPointerDown = (event: PointerEvent) => {\r\n const table = this._table();\r\n if (!table?.reorderable()) return;\r\n\r\n // Don't intercept resize handle clicks\r\n const target = event.target as HTMLElement;\r\n if (target.classList.contains(this.theme.class('resize-handle'))) return;\r\n\r\n event.preventDefault();\r\n\r\n this._startX = event.clientX;\r\n this._startY = event.clientY;\r\n this._isDragging = false;\r\n this._pointerId = event.pointerId;\r\n\r\n try {\r\n this._element.nativeElement.setPointerCapture(event.pointerId);\r\n } catch {\r\n // Ignore\r\n }\r\n\r\n this._boundOnPointerMove = (e: PointerEvent) => this.onPointerMove(e);\r\n this._boundOnPointerUp = () => this.onPointerUp();\r\n this._boundOnPointerCancel = () => this.onPointerCancel();\r\n this._boundOnKeyDown = (e: KeyboardEvent) => this.onKeyDown(e);\r\n\r\n this._element.nativeElement.addEventListener('pointermove', this._boundOnPointerMove);\r\n this._element.nativeElement.addEventListener('pointerup', this._boundOnPointerUp);\r\n this._element.nativeElement.addEventListener('pointercancel', this._boundOnPointerCancel);\r\n document.addEventListener('keydown', this._boundOnKeyDown);\r\n };\r\n\r\n private onPointerMove(event: PointerEvent): void {\r\n if (!this._isDragging) {\r\n const deltaX = event.clientX - this._startX;\r\n const deltaY = event.clientY - this._startY;\r\n const distance = Math.sqrt(deltaX ** 2 + deltaY ** 2);\r\n if (distance < REORDER_DEAD_ZONE_PX) return;\r\n\r\n // Start dragging\r\n this._isDragging = true;\r\n const table = this._table();\r\n table?.startColumnReorder(this._columnId());\r\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), true);\r\n }\r\n\r\n this._table()?.dragColumnReorder(event);\r\n }\r\n\r\n private onPointerUp(): void {\r\n if (this._isDragging) {\r\n this._table()?.endColumnReorder(false);\r\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\r\n }\r\n this.cleanup();\r\n }\r\n\r\n private onPointerCancel(): void {\r\n if (this._isDragging) {\r\n this._table()?.endColumnReorder(true);\r\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\r\n }\r\n this.cleanup();\r\n }\r\n\r\n private onKeyDown(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' && this._isDragging) {\r\n this._table()?.endColumnReorder(true);\r\n toggleClass(this._element.nativeElement, this.theme.class('drag-source'), false);\r\n this.cleanup();\r\n }\r\n }\r\n\r\n private cleanup(): void {\r\n this._isDragging = false;\r\n if (this._pointerId != null) {\r\n try {\r\n this._element.nativeElement.releasePointerCapture(this._pointerId);\r\n } catch {\r\n // Ignore — capture may already be released\r\n }\r\n this._pointerId = null;\r\n }\r\n if (this._boundOnPointerMove) {\r\n this._element.nativeElement.removeEventListener('pointermove', this._boundOnPointerMove);\r\n this._boundOnPointerMove = null;\r\n }\r\n if (this._boundOnPointerUp) {\r\n this._element.nativeElement.removeEventListener('pointerup', this._boundOnPointerUp);\r\n this._boundOnPointerUp = null;\r\n }\r\n if (this._boundOnPointerCancel) {\r\n this._element.nativeElement.removeEventListener('pointercancel', this._boundOnPointerCancel);\r\n this._boundOnPointerCancel = null;\r\n }\r\n if (this._boundOnKeyDown) {\r\n document.removeEventListener('keydown', this._boundOnKeyDown);\r\n this._boundOnKeyDown = null;\r\n }\r\n }\r\n}\r\n","import { computed, Directive, effect, ElementRef, inject, input, Type } from '@angular/core';\r\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { NgnScrollerItem } from '@ngneers/controls/scroller';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { setInputSignalValue } from '@ngneers/controls/utils-ng';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\n\r\nimport type { FormattedTableDataRow } from './types';\r\n\r\n@Directive({\r\n selector: '[ngnTableBodyTr]',\r\n host: {\r\n '[attr.aria-rowindex]': 'ngnTableBodyTr().index + 2',\r\n '[style.--ngn-table-row-index]': 'ngnTableBodyTr().index + 2',\r\n '[class]': `theme.classes({\r\n 'even': ngnTableBodyTr().index % 2 === 0,\r\n 'selected-row': selected(),\r\n 'focused-row': focused()\r\n })`,\r\n '[attr.aria-selected]': 'selectable() ? selected() : null',\r\n role: 'row',\r\n '(click)': 'onRowClick($event)',\r\n },\r\n})\r\nexport class NgnTableBodyTr<T> extends NgnScrollerItem {\r\n public readonly ngnTableBodyTr = input.required<FormattedTableDataRow<T>>();\r\n public override readonly ngnScrollerItem = input<object>({});\r\n private readonly _element = inject(ElementRef<HTMLElement>);\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n\r\n protected readonly selectable = computed(() => !!this._table()?.selectionMode());\r\n\r\n protected readonly selected = computed(() => {\r\n const table = this._table();\r\n if (!table || !table.selectionMode()) return false;\r\n const row = this.ngnTableBodyTr();\r\n return table.isRowSelected(row.id as any);\r\n });\r\n\r\n protected readonly focused = computed(() => {\r\n const table = this._table();\r\n if (!table || !table.selectionMode()) return false;\r\n const row = this.ngnTableBodyTr();\r\n return table.focusedRowIndex() === row.index;\r\n });\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n const row = this.ngnTableBodyTr();\r\n setInputSignalValue(this.ngnScrollerItem, row);\r\n });\r\n this.prepareDom();\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\r\n }\r\n\r\n protected onRowClick(event: MouseEvent): void {\r\n const table = this._table();\r\n if (!table || !table.selectionMode()) return;\r\n table.handleRowClick(this.ngnTableBodyTr(), event);\r\n }\r\n}\r\n","import {\r\n ApplicationRef,\r\n type ComponentRef,\r\n computed,\r\n createComponent,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n EnvironmentInjector,\r\n inject,\r\n type OnDestroy,\r\n Type,\r\n} from '@angular/core';\r\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { NgnCheckbox } from '@ngneers/controls/checkbox';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableBodyTr } from './table-row';\r\n\r\n/**\r\n * Directive that turns a `<th>` or `<td>` into a selection checkbox column.\r\n *\r\n * **Header usage** — renders a \"select all / none\" checkbox:\r\n * ```html\r\n * <th ngnTableSelectionColumn></th>\r\n * ```\r\n *\r\n * **Body usage** — renders a per-row checkbox (must be inside a `[ngnTableBodyTr]`):\r\n * ```html\r\n * <td ngnTableSelectionColumn></td>\r\n * ```\r\n *\r\n * @category directive\r\n */\r\n@Directive({\r\n selector: '[ngnTableSelectionColumn]',\r\n host: {\r\n '(click)': 'onClick($event)',\r\n },\r\n})\r\nexport class NgnTableSelectionColumn implements OnDestroy {\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _envInjector = inject(EnvironmentInjector);\r\n private readonly _appRef = inject(ApplicationRef);\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n\r\n /** Non-null only when used inside a body row (`<td>`). */\r\n private readonly _bodyTr = inject(NgnTableBodyTr, { optional: true });\r\n\r\n private readonly _isHeader = this._element.nativeElement.tagName === 'TH';\r\n\r\n /**\r\n * NgnCheckbox created at the application level via `createComponent` + `EnvironmentInjector`.\r\n * This keeps it outside Angular's view tree so @for reconciliation cannot destroy it.\r\n */\r\n private _checkboxRef!: ComponentRef<NgnCheckbox<boolean>>;\r\n\r\n protected readonly selected = computed(() => {\r\n if (this._isHeader) return false;\r\n const table = this._table();\r\n const row = this._bodyTr?.ngnTableBodyTr();\r\n if (!table || !row) return false;\r\n return table.isRowSelected(row.id as any);\r\n });\r\n\r\n protected readonly focused = computed(() => {\r\n if (this._isHeader) return false;\r\n const table = this._table();\r\n const row = this._bodyTr?.ngnTableBodyTr();\r\n if (!table || !row) return false;\r\n return table.focusedRowIndex() === row.index;\r\n });\r\n\r\n constructor() {\r\n this._prepareDom();\r\n this._createCheckbox();\r\n\r\n if (this._isHeader) {\r\n this._setupHeaderEffects();\r\n // Register the selection column once the table signal resolves\r\n effect(() => {\r\n const table = this._table();\r\n if (table) {\r\n table.registerSelectionColumn();\r\n }\r\n });\r\n } else {\r\n this._setupBodyEffects();\r\n }\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n if (this._isHeader) {\r\n this._table()?.unregisterSelectionColumn();\r\n }\r\n this._appRef.detachView(this._checkboxRef.hostView);\r\n this._checkboxRef.destroy();\r\n }\r\n\r\n private _prepareDom(): void {\r\n const el = this._element.nativeElement;\r\n toggleClass(el, this.theme.class('cell'), true);\r\n toggleClass(el, this.theme.class('selection-column'), true);\r\n if (this._isHeader) {\r\n el.setAttribute('aria-label', 'Select all rows');\r\n }\r\n }\r\n\r\n /**\r\n * Creates an NgnCheckbox via `createComponent` + `EnvironmentInjector`.\r\n * The component is attached to `ApplicationRef` (not a ViewContainerRef),\r\n * so Angular's @for block reconciliation cannot destroy it.\r\n */\r\n private _createCheckbox(): void {\r\n this._checkboxRef = createComponent(NgnCheckbox, {\r\n environmentInjector: this._envInjector,\r\n });\r\n this._appRef.attachView(this._checkboxRef.hostView);\r\n\r\n const cbEl = this._checkboxRef.location.nativeElement;\r\n cbEl.classList.add(this.theme.class('selection-checkbox'));\r\n\r\n if (this._isHeader) {\r\n setComponentInput(this._checkboxRef, 'allowIndeterminate', true);\r\n }\r\n\r\n this._element.nativeElement.appendChild(cbEl);\r\n }\r\n\r\n // --- Header (select-all) ---\r\n\r\n private _setupHeaderEffects(): void {\r\n effect(() => {\r\n const table = this._table();\r\n if (!table) return;\r\n setComponentInput(this._checkboxRef, 'value', table.headerCheckboxValue());\r\n });\r\n }\r\n\r\n // --- Body (per-row) ---\r\n\r\n private _setupBodyEffects(): void {\r\n effect(() => {\r\n const isSelected = this.selected();\r\n const isFocused = this.focused();\r\n const row = this._bodyTr?.ngnTableBodyTr();\r\n const el = this._element.nativeElement;\r\n\r\n setComponentInput(this._checkboxRef, 'value', isSelected);\r\n if (row) {\r\n el.style.setProperty('--ngn-table-row-index', String(row.index + 2));\r\n }\r\n toggleClass(el, this.theme.class('selected-row-cell'), isSelected);\r\n toggleClass(el, this.theme.class('focused-row-cell'), isFocused);\r\n });\r\n }\r\n\r\n // --- Click handling ---\r\n\r\n protected onClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n const table = this._table();\r\n if (!table) return;\r\n\r\n if (this._isHeader) {\r\n table.toggleSelectAll();\r\n } else {\r\n const row = this._bodyTr?.ngnTableBodyTr();\r\n if (row) {\r\n table.handleCheckboxChange(row);\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n afterNextRender,\r\n Directive,\r\n ElementRef,\r\n inject,\r\n input,\r\n type OnDestroy,\r\n Type,\r\n} from '@angular/core';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTh } from './table-header-cell';\r\n\r\n@Directive({\r\n selector: '[ngnTableStickyColumn]',\r\n})\r\nexport class NgnTableStickyColumn implements OnDestroy {\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _headerCell = inject(NgnTableTh);\r\n private readonly _columnId = this._headerCell.ngnTableTh;\r\n\r\n public readonly ngnTableStickyColumn = input.required<'start' | 'end'>();\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n const table = this._table();\r\n if (table) {\r\n table.registerStickyColumn(this._columnId(), this.ngnTableStickyColumn());\r\n }\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._table()?.unregisterStickyColumn(this._columnId());\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTd } from './table-cell';\r\nimport { NgnTableGroupHeaderTr } from './table-group-header-row';\r\nimport { NgnTableTh } from './table-header-cell';\r\nimport { NgnTableHeadTr } from './table-header-row';\r\nimport { NgnTableReorderableColumn } from './table-reorderable-column';\r\nimport { NgnTableBodyTr } from './table-row';\r\nimport { NgnTableSelectionColumn } from './table-selection-column';\r\nimport { NgnTableStickyColumn } from './table-sticky-column';\r\n\r\n@NgModule({\r\n imports: [\r\n NgnTable,\r\n NgnTableBodyTr,\r\n NgnTableTd,\r\n NgnTableTh,\r\n NgnTableHeadTr,\r\n NgnTableGroupHeaderTr,\r\n NgnTableReorderableColumn,\r\n NgnTableSelectionColumn,\r\n NgnTableStickyColumn,\r\n ],\r\n exports: [\r\n NgnTable,\r\n NgnTableBodyTr,\r\n NgnTableTd,\r\n NgnTableTh,\r\n NgnTableHeadTr,\r\n NgnTableGroupHeaderTr,\r\n NgnTableReorderableColumn,\r\n NgnTableSelectionColumn,\r\n NgnTableStickyColumn,\r\n ],\r\n})\r\nexport class NgnTableModule {}\r\n","import {\r\n ComponentRef,\r\n computed,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n type OnDestroy,\r\n Type,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { NgnActionButton } from '@ngneers/controls/button';\r\nimport { NgnFilter, type NgnFilterDataType } from '@ngneers/controls/filter';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTh } from './table-header-cell';\r\n\r\nimport type { NgnActionButtonConfig } from '@ngneers/controls/api';\r\n\r\n/**\r\n * @category directive\r\n */\r\n@Directive({\r\n selector: '[ngnTableFilterableColumn]',\r\n host: {\r\n '[class]': `theme.classes({'filterable-column': true, 'filtered-column': !!filter() })`,\r\n },\r\n})\r\nexport class NgnTableFilterableColumn implements OnDestroy {\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _columnId = inject(NgnTableTh).ngnTableTh;\r\n\r\n public readonly ngnTableFilterableColumn = input();\r\n\r\n private readonly _ngnActionButton: ComponentRef<NgnActionButton<null>>;\r\n private readonly _ngnFilter: ComponentRef<NgnFilter>;\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n private readonly _rows = computed(() => {\r\n return this._table()?.rows() || [];\r\n });\r\n protected readonly filter = computed(() => {\r\n const tableFilter = this._table()?.filters()?.[this._columnId()];\r\n return tableFilter;\r\n });\r\n\r\n public readonly ngnTableFilterableColumnType = input.required<NgnFilterDataType>();\r\n public readonly ngnTableFilterableColumnItems = input<string[] | null | undefined>();\r\n\r\n constructor() {\r\n this._ngnActionButton = inject(ViewContainerRef).createComponent(NgnActionButton<null>);\r\n this._ngnFilter = inject(ViewContainerRef).createComponent(NgnFilter);\r\n this._element.nativeElement.appendChild(this._ngnActionButton.location.nativeElement);\r\n this._element.nativeElement.appendChild(this._ngnFilter.location.nativeElement);\r\n this._ngnActionButton.location.nativeElement.classList.add(this.theme.class('filter-control'));\r\n\r\n setComponentInput(this._ngnActionButton, 'kind', 'icon');\r\n setComponentInput(this._ngnActionButton, 'inline', true);\r\n setComponentInput(this._ngnFilter, 'anchor', this._ngnActionButton.location.nativeElement);\r\n setComponentInput(this._ngnFilter, 'mode', 'headless');\r\n setComponentInput(this._ngnFilter, 'allowMultiple', true);\r\n\r\n const cfg = computed(\r\n () =>\r\n <NgnActionButtonConfig<null>>{\r\n label: 'Filter',\r\n value: null,\r\n kind: 'icon',\r\n defaultIcon: this.filter() ? 'filter-active' : 'filter-inactive',\r\n action: event => {\r\n event.stopPropagation();\r\n this._ngnFilter.instance.show();\r\n },\r\n }\r\n );\r\n\r\n effect(() => {\r\n setComponentInput(this._ngnActionButton, 'config', cfg());\r\n });\r\n effect(() => {\r\n setComponentInput(\r\n this._ngnFilter,\r\n 'data',\r\n this._rows().map(row => row[this._columnId()])\r\n );\r\n });\r\n effect(() => {\r\n setComponentInput(this._ngnFilter, 'dataType', this.ngnTableFilterableColumnType());\r\n });\r\n effect(() => {\r\n setComponentInput(this._ngnFilter, 'listOptions', this.ngnTableFilterableColumnItems());\r\n });\r\n this._ngnFilter.instance.filterChange.subscribe(cfg => {\r\n const table = this._table();\r\n const currentFilters = table?.filters() || {};\r\n table?.filters.set({ ...currentFilters, [this._columnId()]: cfg ?? undefined });\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._ngnActionButton.destroy();\r\n this._ngnFilter.destroy();\r\n }\r\n}\r\n","import {\r\n ComponentRef,\r\n computed,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n type OnDestroy,\r\n Type,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTh } from './table-header-cell';\r\n\r\n/**\r\n * @category directive\r\n */\r\n@Directive({\r\n selector: '[ngnTableSortableColumn]',\r\n host: {\r\n '[class]': `theme.classes({'sortable-column': true, 'sorted-column': !!sort() })`,\r\n '(click)': `onHostClick($event)`,\r\n },\r\n})\r\nexport class NgnTableSortableColumn implements OnDestroy {\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n public readonly ngnTableSortableColumn = input();\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n protected readonly sort = computed(() => {\r\n const tableSort = this._table()?.sort();\r\n if (tableSort?.column === this.columnId()) {\r\n return tableSort.direction;\r\n }\r\n return null;\r\n });\r\n\r\n private readonly columnId = inject(NgnTableTh).ngnTableTh;\r\n\r\n private readonly _ngnIcon: ComponentRef<NgnIcon>;\r\n\r\n constructor() {\r\n this._ngnIcon = inject(ViewContainerRef).createComponent(NgnIcon);\r\n this._element.nativeElement.appendChild(this._ngnIcon.location.nativeElement);\r\n this._ngnIcon.location.nativeElement.classList.add(this.theme.class('sort-control'));\r\n\r\n effect(() => {\r\n const sort = this.sort();\r\n setComponentInput(\r\n this._ngnIcon,\r\n 'defaultIcon',\r\n sort === 'asc' ? 'sort-ascending' : sort === 'desc' ? 'sort-descending' : 'sort-neutral'\r\n );\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._ngnIcon.destroy();\r\n }\r\n\r\n protected onHostClick(event: MouseEvent): void {\r\n const target = event.target as HTMLElement;\r\n if (target.classList.contains(this.theme.class('resize-handle'))) return;\r\n this.toggleSort();\r\n }\r\n\r\n protected toggleSort(): void {\r\n const currentSort = this.sort();\r\n const table = this._table();\r\n table?.sort.set(\r\n currentSort === null\r\n ? { column: this.columnId(), direction: 'asc' }\r\n : currentSort === 'asc'\r\n ? { column: this.columnId(), direction: 'desc' }\r\n : null\r\n );\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|