@scion/components 22.6.0 → 22.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"scion-components-table.mjs","sources":["../../../../projects/scion/components/table/src/table-date-column.model.ts","../../../../projects/scion/components/table/src/table-enum-column.model.ts","../../../../projects/scion/components/table/src/ɵtable-column.factory.ts","../../../../projects/scion/components/table/src/common.ts","../../../../projects/scion/components/table/src/table-storage.ts","../../../../projects/scion/components/table/src/ɵtable-cell-value-preloader.ts","../../../../projects/scion/components/table/src/table-cell-value-preloader.ts","../../../../projects/scion/components/table/src/ɵtable-array-datasource.ts","../../../../projects/scion/components/table/src/table.cache.ts","../../../../projects/scion/components/table/src/table-row-binding.ts","../../../../projects/scion/components/table/src/ɵtable.model.ts","../../../../projects/scion/components/table/src/table-datasource.ts","../../../../projects/scion/components/table/src/table.factory.ts","../../../../projects/scion/components/table/src/table-selection.service.ts","../../../../projects/scion/components/table/src/table-cell/number.pipe.ts","../../../../projects/scion/components/table/src/table-cell/table-cell.component.ts","../../../../projects/scion/components/table/src/table-cell/table-cell.component.html","../../../../projects/scion/components/table/src/table-row/table-row.component.ts","../../../../projects/scion/components/table/src/table-row/table-row.component.html","../../../../projects/scion/components/table/src/table-keyboard-navigator.directive.ts","../../../../projects/scion/components/table/src/table-column/table-column.service.ts","../../../../projects/scion/components/table/src/table-column/table-column.component.ts","../../../../projects/scion/components/table/src/table-columns/table-columns.component.ts","../../../../projects/scion/components/table/src/table-columns/table-columns.component.html","../../../../projects/scion/components/table/src/table-viewport.component.ts","../../../../projects/scion/components/table/src/table-grid.component.ts","../../../../projects/scion/components/table/src/table-body.component.ts","../../../../projects/scion/components/table/src/column-header/column-header.component.ts","../../../../projects/scion/components/table/src/column-header/column-header.component.html","../../../../projects/scion/components/table/src/column-filter/enum-label.pipe.ts","../../../../projects/scion/components/table/src/column-filter/column-filter.component.ts","../../../../projects/scion/components/table/src/column-filter/column-filter.component.html","../../../../projects/scion/components/table/src/table-header/table-header.component.ts","../../../../projects/scion/components/table/src/table-header/table-header.component.html","../../../../projects/scion/components/table/src/table.component.ts","../../../../projects/scion/components/table/src/table.component.html","../../../../projects/scion/components/table/src/public_api.ts","../../../../projects/scion/components/table/src/scion-components-table.ts"],"sourcesContent":["import {formatDate} from '@angular/common';\nimport {SciDateLike} from './table.model';\n\n/**\n * Creates a {@link SciDateValue} from the given date-like input.\n *\n * Calling this function is expensive due to date parsing and formatting.\n */\nexport function coerceDateValue(dateLike: SciDateLike | undefined, options: {format: string; locale: string; timezone?: string}): SciDateValue | undefined {\n const {format, locale, timezone} = options;\n\n switch (typeof dateLike) {\n case 'string': {\n const isoString = ensureIso8601DatePrefix(dateLike);\n return {\n isoString,\n millis: new Date(isoString).getTime(),\n formatted: formatDate(isoString, format, locale, timezone),\n };\n }\n case 'number': {\n const millis = dateLike;\n const isoString = new Date(millis).toISOString();\n return {\n isoString,\n millis,\n formatted: formatDate(isoString, format, locale, timezone),\n };\n }\n case 'object': {\n const date = dateLike;\n const isoString = date.toISOString();\n return {\n isoString,\n millis: date.getTime(),\n formatted: formatDate(isoString, format, locale, timezone),\n };\n }\n case 'undefined': {\n return undefined;\n }\n }\n}\n\n/**\n * Prepends '1970-01-01' if the date prefix is missing, as required by {@link formatDate}.\n *\n * Uses fast ASCII character code checks (`-`, `T`, `t`) to avoid string allocation.\n */\nfunction ensureIso8601DatePrefix(isoDate: string): string {\n // Check if iso string already starts with a full year date (YYYY-MM-DD)\n if (isoDate.charCodeAt(4) === 45) { // '-'\n return isoDate;\n }\n\n // Prepend epoch, adding 'T' separator if missing.\n switch (isoDate.charCodeAt(0)) {\n case 84: // 'T'\n case 116: // 't'\n return '1970-01-01' + isoDate;\n default:\n return '1970-01-01T' + isoDate;\n }\n}\n\n/**\n * Represents the internal value of {@link SciDateColumn}.\n */\nexport interface SciDateValue {\n /**\n * Full ISO 8601 date/time string.\n */\n isoString: string;\n /**\n * Milliseconds since UTC epoch.\n */\n millis: number;\n /**\n * Human-readable formatted date and time string.\n */\n formatted: string;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {computed, inject, Injector, Signal} from '@angular/core';\nimport {text} from '@scion/components/text';\nimport {SciEnumColumn, SciEnumColumnValues, SciEnumValueLike} from './table.model';\nimport {coerceSignal, MaybeSignal} from '@scion/components/common';\n\n/**\n * Creates a {@link SciEnumValue} from the given enum-like input.\n */\nexport function coerceEnumValue(enumLike: MaybeSignal<SciEnumValueLike | undefined>, options: {enumeration: MaybeSignal<SciEnumColumnValues>; format: SciEnumColumn['format']; injector?: Injector}): Signal<SciEnumValue | undefined> {\n const value = coerceSignal(enumLike, {coerceUndefined: true});\n const enumeration = coerceSignal(options.enumeration);\n const enumEntry = computed(() => value() !== undefined ? enumeration().find(entry => entry.value === value()) : undefined);\n const label = text(computed(() => enumEntry()?.label), {injector: options.injector ?? inject(Injector)});\n const tooltip = text(computed(() => enumEntry()?.tooltip), {injector: options.injector ?? inject(Injector)});\n\n return computed(() => {\n if (!enumEntry()) {\n return undefined;\n }\n\n return {\n value: enumEntry()!.value,\n label: label()!,\n icon: enumEntry()!.icon,\n // Use tooltip if provided, or fall back to label, but only if it is not configured for display.\n tooltip: tooltip() ?? (tooltip() === null || options.format.label ? undefined : label()),\n } satisfies SciEnumValue;\n });\n}\n\n/**\n * Represents the internal value of {@link SciEnumColumn}.\n */\nexport interface SciEnumValue {\n value: SciEnumValueLike;\n /** localized text */\n label: string;\n /** localized tooltip */\n tooltip?: string;\n icon?: string;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {SciBooleanColumnDescriptor, SciComponentColumnDescriptor, SciDateColumnDescriptor, SciEnumColumnDescriptor, SciIconColumnDescriptor, SciNumberColumnDescriptor, SciStringColumnDescriptor, SciTableColumnDescriptorLike, SciTableColumnFactory, SciTemplateColumnDescriptor} from './table-column.factory';\nimport {SciColumnHeaderLike, SciComponentColumn, SciDateColumn, SciDateLike, SciEnumColumn, SciEnumValueLike, SciNumberColumn, SciStringColumn, SciTableColumn, SciTableColumnLike, SciTemplateColumn} from './table.model';\nimport {computed, DEFAULT_CURRENCY_CODE, inject, signal, untracked} from '@angular/core';\nimport {ɵSciTable} from './ɵtable.model';\nimport {coerceSignal, MaybeSignal, SCI_LOCALE} from '@scion/components/common';\nimport {coerceDateValue} from './table-date-column.model';\nimport {DATE_PIPE_DEFAULT_OPTIONS} from '@angular/common';\nimport {coerceEnumValue} from './table-enum-column.model';\nimport {text, Translatable} from '@scion/components/text';\n\nexport class ɵSciTableColumnFactory<T> implements SciTableColumnFactory<T> {\n\n public readonly columns = new Array<SciTableColumnLike<T>>();\n\n constructor(private readonly _table: ɵSciTable<T>) {\n }\n\n public addStringColumn(value: (item: T) => MaybeSignal<Translatable | undefined>): this;\n public addStringColumn(header: SciColumnHeaderLike, value: (item: T) => MaybeSignal<Translatable | undefined>): this;\n public addStringColumn(descriptor: SciStringColumnDescriptor<T>): this;\n public addStringColumn(descriptorLike: ((item: T) => MaybeSignal<string | undefined>) | SciColumnHeaderLike | SciStringColumnDescriptor<T>, value?: (item: T) => MaybeSignal<Translatable | undefined>): this {\n const descriptor = coerceColumnDescriptor(descriptorLike, value);\n const column = this.mapToColumn(descriptor);\n const sortable = descriptor.sortable ?? true;\n const filterable = descriptor.filterable ?? true;\n\n this.columns.push({\n ...column,\n type: 'string',\n value: item => text(descriptor.value(item)),\n sortable: computed(() => this._table.sortable() && !!sortable),\n filterable: computed(() => this._table.filterable() && !!filterable),\n compare: typeof sortable === 'object' ? sortable.comparator : (a, b) => a.value.localeCompare(b.value),\n matches: typeof filterable === 'object' ? filterable.matcher : (text, context) => context.value.toLowerCase().includes(text.toLowerCase()),\n } satisfies SciStringColumn<T>);\n\n return this;\n }\n\n public addNumberColumn(value: (item: T) => MaybeSignal<number | undefined>): this;\n public addNumberColumn(header: SciColumnHeaderLike, value: (item: T) => MaybeSignal<number | undefined>): this;\n public addNumberColumn(descriptor: SciNumberColumnDescriptor<T>): this;\n public addNumberColumn(descriptorLike: ((item: T) => MaybeSignal<number | undefined>) | SciColumnHeaderLike | SciNumberColumnDescriptor<T>, value?: (item: T) => MaybeSignal<number | undefined>): this {\n const descriptor = coerceColumnDescriptor(descriptorLike, value);\n const column = this.mapToColumn(descriptor);\n\n const locale = coerceSignal(descriptor.locale ?? inject(SCI_LOCALE));\n const currency = inject(DEFAULT_CURRENCY_CODE, {optional: true}) ?? 'USD';\n this.columns.push({\n ...column,\n type: 'number',\n value: item => coerceSignal(descriptor.value(item), {coerceUndefined: true}),\n sortable: computed(() => this._table.sortable() && (descriptor.sortable ?? true)),\n filterable: computed(() => this._table.filterable() && (descriptor.filterable ?? true)),\n compare: (a, b) => a.value - b.value,\n matches: (text, context) => context.value === text,\n format: computed(() => new Intl.NumberFormat(locale(), {currency, ...descriptor.format})),\n } satisfies SciNumberColumn<T>);\n\n return this;\n }\n\n public addBooleanColumn(value: (item: T) => MaybeSignal<boolean | undefined>): this;\n public addBooleanColumn(header: SciColumnHeaderLike, value: (item: T) => MaybeSignal<boolean | undefined>): this;\n public addBooleanColumn(descriptor: SciBooleanColumnDescriptor<T>): this;\n public addBooleanColumn(descriptorLike: ((item: T) => MaybeSignal<boolean | undefined>) | SciColumnHeaderLike | SciBooleanColumnDescriptor<T>, value?: (item: T) => MaybeSignal<boolean | undefined>): this {\n const descriptor = coerceColumnDescriptor(descriptorLike, value);\n\n this.addEnumColumn({\n ...descriptor,\n value: item => coerceSignal(descriptor.value(item), {coerceUndefined: true}),\n values: [\n {value: true, icon: 'scion:true', label: '%scion:components:yes.value', tooltip: null},\n {value: false, icon: 'scion:false', label: '%scion:components:no.value', tooltip: null},\n ],\n format: {icon: true},\n filterable: descriptor.filterable === false ? false : 'single',\n referenceType: 'boolean',\n });\n return this;\n }\n\n public addDateColumn(value: (item: T) => MaybeSignal<SciDateLike | undefined>): this;\n public addDateColumn(header: SciColumnHeaderLike, value: (item: T) => MaybeSignal<SciDateLike | undefined>): this;\n public addDateColumn(descriptor: SciDateColumnDescriptor<T>): this;\n public addDateColumn(descriptorLike: ((item: T) => MaybeSignal<SciDateLike | undefined>) | SciColumnHeaderLike | SciDateColumnDescriptor<T>, value?: (item: T) => MaybeSignal<SciDateLike | undefined>): this {\n const descriptor = coerceColumnDescriptor(descriptorLike, value);\n const column = this.mapToColumn(descriptor);\n\n const defaults = inject(DATE_PIPE_DEFAULT_OPTIONS, {optional: true});\n const locale = coerceSignal(descriptor.locale ?? inject(SCI_LOCALE));\n const format = descriptor.format ?? defaults?.dateFormat ?? 'mediumDate';\n const timezone = descriptor.timezone ?? defaults?.timezone;\n\n this.columns.push({\n ...column,\n type: 'date',\n value: item => {\n const dateLike = coerceSignal(descriptor.value(item), {coerceUndefined: true});\n return computed(() => coerceDateValue(dateLike(), {locale: locale(), format, timezone}));\n },\n sortable: computed(() => this._table.sortable() && (descriptor.sortable ?? true)),\n filterable: computed(() => this._table.filterable() && (descriptor.filterable ?? true)),\n compare: (a, b) => a.value.millis - b.value.millis,\n matches: (text, context) => context.value.formatted.toLowerCase().includes(text.toLowerCase()),\n } satisfies SciDateColumn<T>);\n\n return this;\n }\n\n public addEnumColumn(descriptor: SciEnumColumnDescriptor<T>): this {\n const column = this.mapToColumn(descriptor);\n const enumeration = coerceSignal(descriptor.values);\n const positionByEnumValue = computed(() => enumeration().reduce((acc, entry, index) => acc.set(entry.value, index), new Map<SciEnumValueLike, number>()));\n const format: SciEnumColumn['format'] = descriptor.format\n ? {icon: descriptor.format.icon ?? false, label: descriptor.format.label ?? false, filter: {icon: descriptor.format.filter?.icon ?? false}} // eslint-disable-line @stylistic/operator-linebreak\n : {icon: false, label: true, filter: {icon: true}}; // eslint-disable-line @stylistic/operator-linebreak\n\n this.columns.push({\n ...column,\n type: 'enum',\n referenceType: descriptor.referenceType,\n value: item => coerceEnumValue(descriptor.value(item), {enumeration, format}),\n sortable: computed(() => this._table.sortable() && (descriptor.sortable ?? true)),\n filterable: computed(() => this._table.filterable() && (descriptor.filterable ?? 'multi')),\n enumeration,\n compare: (a, b) => untracked(() => (positionByEnumValue().get(a.value.value) ?? 0) - (positionByEnumValue().get(b.value.value) ?? 0)),\n matches: (filter, context) => {\n if (typeof filter === 'string') { // table filter\n return context.value.label.toLowerCase().includes(filter.toLowerCase());\n }\n else {\n return filter.includes(context.value.value); // column filter\n }\n },\n format,\n } satisfies SciEnumColumn<T>);\n\n return this;\n }\n\n public addIconColumn(descriptor: SciIconColumnDescriptor<T>): this {\n const resizable = typeof descriptor.header === 'string' || !!descriptor.header?.label?.length;\n\n this.addEnumColumn({\n ...descriptor,\n value: item => coerceSignal(descriptor.value(item), {coerceUndefined: true}),\n format: {icon: true, filter: {icon: true}},\n resizable: descriptor.resizable ?? resizable,\n width: descriptor.width ?? (resizable ? undefined : 'max-content'), // adapt width to intrinsic size\n minWidth: descriptor.minWidth ?? (resizable ? undefined : 32),\n referenceType: 'icon',\n });\n return this;\n }\n\n public addComponentColumn(descriptor: SciComponentColumnDescriptor<T>): this {\n // Require a filter matcher if filterable on an array datasource.\n if (this._table.isArrayDatasource() && descriptor.filterable === true) {\n throw Error('[ColumnDefinitionError] Component column requires a filter matcher in order to be filterable.');\n }\n\n // Require a sort comparator if sortable on an array datasource.\n if (this._table.isArrayDatasource() && descriptor.sortable === true) {\n throw Error('[ColumnDefinitionError] Component column requires a sort comparator in order to be sortable.');\n }\n\n const column = this.mapToColumn(descriptor);\n this.columns.push({\n ...column,\n type: 'component',\n component: descriptor.component,\n sortable: computed(() => this._table.sortable() && !!descriptor.sortable),\n filterable: computed(() => this._table.filterable() && !!descriptor.filterable),\n compare: typeof descriptor.sortable === 'object' ? descriptor.sortable.comparator : () => 0,\n matches: typeof descriptor.filterable === 'object' ? descriptor.filterable.matcher : () => false,\n padding: descriptor.padding ?? true,\n } satisfies SciComponentColumn<T>);\n\n return this;\n }\n\n public addTemplateColumn(descriptor: SciTemplateColumnDescriptor<T>): this {\n // Require a filter matcher if filterable on an array datasource.\n if (this._table.isArrayDatasource() && descriptor.filterable === true) {\n throw Error('[ColumnDefinitionError] Template column requires a filter matcher in order to be filterable.');\n }\n\n // Require a sort comparator if sortable on an array datasource.\n if (this._table.isArrayDatasource() && descriptor.sortable === true) {\n throw Error('[ColumnDefinitionError] Template column requires a sort comparator in order to be sortable.');\n }\n\n const column = this.mapToColumn(descriptor);\n this.columns.push({\n ...column,\n type: 'template',\n template: descriptor.template,\n sortable: computed(() => this._table.sortable() && !!descriptor.sortable),\n filterable: computed(() => this._table.filterable() && !!descriptor.filterable),\n compare: typeof descriptor.sortable === 'object' ? descriptor.sortable.comparator : () => 0,\n matches: typeof descriptor.filterable === 'object' ? descriptor.filterable.matcher : () => false,\n padding: descriptor.padding ?? true,\n } satisfies SciTemplateColumn<T>);\n\n return this;\n }\n\n /**\n * Maps given column descriptor to a {@link SciTableColumn}.\n */\n private mapToColumn(descriptor: SciTableColumnDescriptorLike<T>): Omit<SciTableColumn, 'type' | 'sortable' | 'filterable' | 'compare' | 'matches'> {\n // Require a unique column name.\n const name = descriptor.name ?? `column:${this.columns.length}`;\n if (this.columns.find(column => column.name === name)) {\n throw Error(`[ColumnDefinitionError] Column names must be unique. \"${name}\" is defined more than once.`);\n }\n\n // Disallow a filter matcher if using a custom datasource.\n if (!this._table.isArrayDatasource() && typeof descriptor.filterable === 'object') {\n throw Error('[ColumnDefinitionError] Configuring a filter matcher is not supported for tables using a datasource. Filtering must be done by the datasource.');\n }\n\n // Disallow a sort comparator if using a custom datasource.\n if (!this._table.isArrayDatasource() && typeof descriptor.sortable === 'object') {\n throw Error('[ColumnDefinitionError] Configuring a sort comparator is not supported for tables using a datasource. Sorting must be done by the datasource.');\n }\n\n return {\n name: name,\n header: untracked(() => {\n if (typeof descriptor.header === 'string') {\n return {label: text(descriptor.header), icon: undefined, tooltip: undefined};\n }\n return {\n label: descriptor.header?.label !== undefined ? text(descriptor.header.label) : undefined,\n icon: descriptor.header?.icon,\n tooltip: descriptor.header?.tooltip !== undefined ? text(descriptor.header.tooltip) : undefined,\n };\n }),\n resizable: computed(() => this._table.resizable() && (descriptor.resizable ?? true)),\n width: computed(() => {\n const userSettings = this._table.userSettings().columns?.find(column => column.name === name);\n return userSettings?.width ? `${userSettings.width}px` : descriptor.width ?? '1fr';\n }),\n minWidth: descriptor.minWidth ?? 100,\n resizing: signal(false),\n padding: true,\n location: {x: 0, width: 0}, // set in `SciTableColumnComponent`\n };\n }\n}\n\n/**\n * Coerces given column factory arguments to a {@link SciTableColumnDescriptorLike}.\n */\nfunction coerceColumnDescriptor<T>(descriptorLike: ((item: T) => MaybeSignal<string | undefined>) | SciColumnHeaderLike | SciStringColumnDescriptor<T>, value?: (item: T) => MaybeSignal<string | undefined>): SciStringColumnDescriptor<T>;\nfunction coerceColumnDescriptor<T>(descriptorLike: ((item: T) => MaybeSignal<number | undefined>) | SciColumnHeaderLike | SciNumberColumnDescriptor<T>, value?: (item: T) => MaybeSignal<number | undefined>): SciNumberColumnDescriptor<T>;\nfunction coerceColumnDescriptor<T>(descriptorLike: ((item: T) => MaybeSignal<boolean | undefined>) | SciColumnHeaderLike | SciBooleanColumnDescriptor<T>, value?: (item: T) => MaybeSignal<boolean | undefined>): SciBooleanColumnDescriptor<T>;\nfunction coerceColumnDescriptor<T>(descriptorLike: ((item: T) => MaybeSignal<SciDateLike | undefined>) | SciColumnHeaderLike | SciDateColumnDescriptor<T>, value?: (item: T) => MaybeSignal<SciDateLike | undefined>): SciDateColumnDescriptor<T>;\nfunction coerceColumnDescriptor(argument1: unknown, argument2?: unknown): unknown {\n if (argument2 === undefined) {\n return typeof argument1 === 'function' ? {value: argument1} : argument1;\n }\n return {\n header: argument1,\n value: argument2,\n };\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Observable} from 'rxjs';\n\nexport type MaybeAsync<T> = T | Promise<T> | Observable<T>;\n\n/**\n * Creates a range of integers starting at `start` and ending at `end` (including `end`).\n */\nexport function rangeInclusive(start: number, end: number): number[] {\n const range: number[] = [];\n for (let i = start; i <= end; i++) {\n range.push(i);\n }\n return range;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {EnvironmentProviders, InjectionToken, makeEnvironmentProviders, Type} from '@angular/core';\n\n/**\n * Provides persistent storage for the sci-table.\n */\nexport interface SciTableStorage {\n\n /**\n * Method invoked to load a value from persisted storage.\n */\n load(name: `scion.components.table:${string}`): Promise<string | null> | string | null;\n\n /**\n * Method invoked to write a value to persisted storage.\n */\n store(name: `scion.components.table:${string}`, value: string): Promise<void> | void;\n}\n\nexport const SCI_TABLE_STORAGE = new InjectionToken<SciTableStorage>('SCI_TABLE_STORAGE', {factory: () => ({\n load: (name: `scion.components.table:${string}`) => localStorage.getItem(name),\n store: (name: `scion.components.table:${string}`, value: string) => localStorage.setItem(name, value),\n})});\n\n/**\n * Defaults to localStorage persistence.\n * @param storage\n */\nexport function provideTableStorage(storage: Type<SciTableStorage>): EnvironmentProviders {\n return makeEnvironmentProviders([\n {provide: SCI_TABLE_STORAGE, useClass: storage},\n ]);\n}\n","import {computed, DestroyRef, inject, Injectable, Injector, onIdle, runInInjectionContext, signal} from '@angular/core';\nimport {LatestTaskExecutor} from '@scion/toolkit/common';\nimport {SciTableCellValuePreloader} from './table-cell-value-preloader';\n\n/** @inheritDoc */\n@Injectable()\nexport class ɵSciTableCellValuePreloader implements SciTableCellValuePreloader {\n\n private readonly _executor = new LatestTaskExecutor();\n private readonly _queue = new Array<() => void>(); // PERF: Do not change to signal to avoid array re-allocation on enqueue (expensive); queue size is tracked via a separate signal.\n private readonly _queueSize = signal(0);\n private readonly _injector = inject(Injector);\n\n /** @inheritDoc */\n public readonly loading = computed(() => this._queueSize() > 0);\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this._executor.destroy();\n this._queue.length = 0;\n this._queueSize.set(0);\n });\n }\n\n /** @inheritDoc */\n public queue(cellValueFn: () => void): void {\n this._queue.push(cellValueFn);\n this._queueSize.update(size => size + 1);\n\n this._executor.submit(() => this.whenIdle().then(() => this.preloadQueuedBatch(PRELOAD_BATCH_SIZE)));\n }\n\n /**\n * Preloads the next batch of queued cell values, FIFO, then, if the queue is not empty, schedules the next batch.\n */\n private async preloadQueuedBatch(batchSize: number): Promise<void> {\n this._queue.splice(0, batchSize).forEach(fn => fn());\n this._queueSize.set(this._queue.length);\n\n // Preload next batch when idle again.\n if (this._queue.length) {\n this._executor.submit(() => this.whenIdle().then(() => this.preloadQueuedBatch(PRELOAD_BATCH_SIZE)));\n }\n }\n\n /**\n * Resolves when the browser becomes idle.\n *\n * @see onIdle\n */\n private whenIdle(): Promise<void> {\n return runInInjectionContext(this._injector, onIdle);\n }\n}\n\nconst PRELOAD_BATCH_SIZE = 50_000;\n","import {Injectable, Signal} from '@angular/core';\nimport {ɵSciTableCellValuePreloader} from './ɵtable-cell-value-preloader';\n\n/**\n * Preloads cell values in the background when the browser is idle. This prevents lag with large datasets, in particular\n * for expensive computations like formatting dates and generating ISO 8601 strings, providing faster sort and filter performance.\n *\n * If a cell's value is requested before background preloading finishes, it is computed synchronously.\n */\n@Injectable({providedIn: 'root', useClass: ɵSciTableCellValuePreloader})\nexport abstract class SciTableCellValuePreloader {\n\n /**\n * Indicates whether cell values are currently preloading.\n */\n public abstract readonly loading: Signal<boolean>;\n\n /**\n * Queues specified cell value provider function for execution in the background the next time the browser is idle.\n */\n public abstract queue(cellValueFn: () => void): void;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {SciTableColumnFilter, SciTableDataLoaderFn, SciTablePageRequest, SciTablePageResponse, SciTableSortCriterion} from './table-datasource';\nimport {SciTableColumn, SciTableColumnLike} from './table.model';\nimport {computed, inject, runInInjectionContext, signal, Signal, untracked} from '@angular/core';\nimport {Observable} from 'rxjs';\nimport {toObservable} from '@angular/core/rxjs-interop';\nimport {Arrays, Objects} from '@scion/toolkit/util';\nimport {SciTableCellValuePreloader} from './table-cell-value-preloader';\nimport {SciDateValue} from './table-date-column.model';\nimport {SciEnumValue} from './table-enum-column.model';\nimport {ɵSingleActiveInjectorFactory} from '@scion/components/common';\n\nexport function arrayDatasource<T>(data: Signal<T[]>, columns: Signal<SciTableColumnLike<T>[]>): SciTableDataLoaderFn<T> {\n const dataset = new Dataset(data, columns);\n\n return markAsArrayDatasource((request: SciTablePageRequest): Observable<SciTablePageResponse<T>> => {\n dataset.columnFilters.set(request.columnFilters);\n dataset.tableFilter.set(request.tableFilter);\n dataset.sortCriteria.set(request.sortCriteria);\n\n const totalCount = dataset.count;\n const items = dataset.slice(request.start, request.end);\n\n return toObservable(computed(() => ({\n totalCount: totalCount(),\n items: items(),\n })));\n });\n}\n\n/**\n * Provides a filtered and sorted view on given data.\n */\nclass Dataset<T> {\n\n private readonly _dataview: Signal<T[]>;\n\n public readonly columnFilters = signal<SciTableColumnFilter[]>([], {equal: Objects.isEqual});\n public readonly sortCriteria = signal<SciTableSortCriterion[]>([], {equal: Objects.isEqual});\n public readonly tableFilter = signal<string | undefined>(undefined);\n\n /**\n * Returns the total count of items matching the current filters and search criteria.\n */\n public readonly count = computed(() => this._dataview().length);\n\n constructor(data: Signal<T[]>, columns: Signal<SciTableColumnLike<T>[]>) {\n const tableCellValuePreloader = inject(SciTableCellValuePreloader);\n\n // Create a factory to instantiate a new injector per dataset run, releasing resources allocated in column value functions.\n const injectorFactory = new ɵSingleActiveInjectorFactory();\n\n const dataset = computed((): DatasetRow<T>[] => {\n const injector = injectorFactory.create();\n return data().map(item => ({\n item,\n cells: columns().reduce((cells, column) => untracked(() => {\n // PERF: Cell values are computed lazily (on idle or first use) to defer expensive computations like date formatting.\n const tableCellValue = 'value' in column ? new eSciTableCellValue(tableCellValuePreloader, () => runInInjectionContext(injector, () => column.value(item)())) : undefined;\n return cells.set(column.name, {\n column: column as SciTableColumn,\n value: () => tableCellValue?.value(),\n });\n }), new Map<`column:${string}`, DatasetCell>()),\n }));\n });\n\n // Memoize filtered/sorted view; recomputes only when dataset or criteria change, not when scrolling through the view, as sorting is an expensive operation.\n this._dataview = computed(() => {\n const rows = dataset();\n const columnFilters = this.columnFilters();\n const tableFilter = this.tableFilter();\n const sortCriteria = this.sortCriteria();\n\n // PERF: Do not track signals inside `Array.sort` to avoid Angular signal tracking overhead as the comparator runs repeatedly, degrading performance otherwise.\n return untracked(() => rows\n .filter(row => matchesRow(row, columnFilters, {coerceEnumValueToArray: true}) && matchesGlobalFilter(row, tableFilter, {coerceEnumValueToArray: false}))\n .sort((a, b) => compareRows(a, b, sortCriteria))\n .map(row => row.item));\n });\n }\n\n /**\n * Returns a slice of the filtered and sorted data within the given range (start inclusive, end exclusive).\n */\n public slice(start: number, end: number): Signal<T[]> {\n return computed(() => this._dataview().slice(start, end));\n }\n}\n\ninterface DatasetRow<T> {\n item: T;\n cells: Map<`column:${string}`, DatasetCell>;\n}\n\ninterface DatasetCell {\n column: SciTableColumn;\n value: () => string | number | boolean | SciDateValue | SciEnumValue | undefined;\n}\n\n/**\n * Tests whether a row matches the given global filter.\n */\nfunction matchesGlobalFilter<T>(row: DatasetRow<T>, filter: string | undefined, options: {coerceEnumValueToArray: boolean}): boolean {\n if (!filter?.trim()) {\n return true;\n }\n\n for (const cell of row.cells.values()) {\n const text = cell.column.type === 'number' ? toNumber(filter) : filter;\n if (text === undefined) {\n continue;\n }\n\n if (matchesRow(row, [{text, columnName: cell.column.name} satisfies SciTableColumnFilter], options)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Tests whether a row matches the given column filters.\n */\nfunction matchesRow<T>(row: DatasetRow<T>, columnFilters: SciTableColumnFilter[], options: {coerceEnumValueToArray: boolean}): boolean {\n if (!columnFilters.length) {\n return true;\n }\n\n for (const columnFilter of columnFilters) {\n const cell = row.cells.get(columnFilter.columnName)!;\n if ('value' in cell.column && cell.value() === undefined) { // Component and template columns have no value.\n return false;\n }\n\n const filter = cell.column.type === 'enum' && options.coerceEnumValueToArray ? Arrays.coerce(columnFilter.text) : columnFilter.text;\n if (!cell.column.matches(filter, {item: row.item, value: cell.value()})) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Compares two rows based on the given sort criteria.\n */\nfunction compareRows<T>(row1: DatasetRow<T>, row2: DatasetRow<T>, sortCriteria: SciTableSortCriterion[]): number {\n if (!sortCriteria.length) {\n return 0;\n }\n\n for (const criterion of sortCriteria) {\n const cell1 = row1.cells.get(criterion.columnName)!;\n const cell2 = row2.cells.get(criterion.columnName)!;\n const value1 = cell1.value();\n const value2 = cell2.value();\n\n // Always place `undefined` values at the end, independent of the sort direction. Note that component and template columns have no value.\n if (value1 === undefined && value2 !== undefined) {\n return 1;\n }\n if (value2 === undefined && value1 !== undefined) {\n return -1;\n }\n\n // Prevent calling comparator for value columns where both values are undefined. Note that component and template columns have no value.\n if (value1 === undefined && value2 === undefined && 'value' in cell1.column) {\n return 0;\n }\n\n const comparison = cell1.column.compare({item: row1.item, value: value1}, {item: row2.item, value: value2});\n if (comparison !== 0) {\n return criterion.direction === 'asc' ? comparison : -comparison;\n }\n }\n\n return 0;\n}\n\n/**\n * Checks whether given {@link SciTableDataLoaderFn} represents an {@link arrayDatasource}.\n */\nexport function isArrayDatasource(loader: SciTableDataLoaderFn<unknown>): boolean {\n return ARRAY_DATASOURCE_MARKER in loader;\n}\n\n/**\n * Marks given {@link SciTableDataLoaderFn} as an array data source.\n */\nfunction markAsArrayDatasource<TABLE_DATA_LOADER extends SciTableDataLoaderFn<unknown>>(loader: TABLE_DATA_LOADER): TABLE_DATA_LOADER {\n Object.defineProperty(loader, ARRAY_DATASOURCE_MARKER, {value: true, writable: false, enumerable: false, configurable: false});\n return loader;\n}\n\n/**\n * Identifies a {@link SciTableDataLoaderFn} as an {@link arrayDatasource}.\n */\nconst ARRAY_DATASOURCE_MARKER = Symbol('ARRAY_DATASOURCE_HINT');\n\n/**\n * Converts the given string to a number, or `undefined` if it cannot be parsed.\n */\nfunction toNumber(numberLike: string): number | undefined {\n const number = Number.parseFloat(numberLike);\n return !Number.isNaN(number) ? number : undefined;\n}\n\n/**\n * Provides lazy loading for the cell's value, preloading it when idle for better sort/filter performance.\n *\n * The value is computed at most once, whether it gets preloaded during idle time or requested synchronously via {@link value()}.\n */\nclass eSciTableCellValue<V> {\n\n private _value: V | undefined;\n\n constructor(preloader: SciTableCellValuePreloader, private _valueFn: () => V) {\n preloader.queue(() => {\n this._value ??= this._valueFn();\n });\n }\n\n public value(): V {\n return this._value ??= untracked(() => this._valueFn());\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {computed, ResourceRef, signal, Signal} from '@angular/core';\nimport {SciTableRow} from './table.model';\nimport {Objects} from '@scion/toolkit/util';\n\nexport class SciTableCache<T> {\n\n private readonly _cache = signal(new Map<SciTableCacheKey, SciTableCacheEntry<T>>());\n\n public readonly loading: Signal<boolean> = computed(() => this.values().some(entry => entry.rows.isLoading()));\n public readonly error: Signal<Error | undefined> = computed(() => this.values().find(entry => entry.rows.error())?.rows.error());\n public readonly values: Signal<SciTableCacheEntry<T>[]> = computed(() => [...this._cache().values()]);\n\n public readonly rowsByIndex: Signal<Map<number, SciTableRow<T>>> = computed(() => this.values()\n .flatMap(page => page.rows.value())\n .reduce((acc, row) => acc.set(row.index, row), new Map<number, SciTableRow<T>>()), {equal: Objects.isEqual});\n\n public readonly rowsById: Signal<Map<unknown, SciTableRow<T>>> = computed(() => this.values()\n .flatMap(page => page.rows.value())\n .reduce((acc, row) => row.id !== undefined ? acc.set(row.id, row) : acc, new Map<unknown, SciTableRow<T>>()), {equal: Objects.isEqual});\n\n public has(key: SciTableCacheKey): boolean {\n return this._cache().has(key);\n }\n\n public get(key: SciTableCacheKey): SciTableCacheEntry<T> | undefined {\n return this._cache().get(key);\n }\n\n public set(key: SciTableCacheKey, entry: SciTableCacheEntry<T>): void {\n this._cache.update(cache => {\n const cacheCopy = new Map(cache);\n const existing = cacheCopy.get(key);\n if (existing) {\n cacheCopy.delete(key);\n existing.dispose();\n }\n\n cacheCopy.set(key, entry);\n return cacheCopy;\n });\n }\n\n /**\n * Deletes the specified page from the cache, but only if still loading.\n */\n public deleteIfLoading(key: SciTableCacheKey): void {\n const cacheEntry = this._cache().get(key);\n if (!cacheEntry?.rows.isLoading()) {\n return;\n }\n\n this._cache.update(cache => {\n const cacheCopy = new Map(cache);\n cacheCopy.delete(key);\n cacheEntry.dispose();\n return cacheCopy;\n });\n }\n\n public clear(): void {\n this._cache.update(cache => {\n for (const entry of cache.values()) {\n entry.dispose();\n }\n return new Map();\n });\n }\n}\n\nexport interface SciTableCacheEntry<T> {\n rows: ResourceRef<SciTableRow<T>[]>;\n start: number;\n end: number;\n dispose: () => void;\n}\n\ntype SciTableCacheKey = `${number}-${number}`;\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {computed, inject, InjectionToken, Provider, Signal} from '@angular/core';\nimport {Objects} from '@scion/toolkit/util';\n\n/**\n * Provides row bindings to tables in the scope of the injector providing the bindings.\n *\n * Multiple providers can be registered. Providers at different injector tree levels form a hierarchy.\n */\nexport function provideTableRowBinding<T = unknown>(bindings: SciTableRowBindingFactoryFn<T>): Provider[] {\n return [\n {\n provide: SCI_TABLE_ROW_BINDING,\n useValue: bindings,\n multi: true,\n },\n {\n provide: SCI_TABLE_ROW_BINDINGS,\n useFactory: (): SciTableRowBindingFactoryFn<unknown>[] => {\n return [\n // Collect bindings registered in parent injectors.\n ...inject<SciTableRowBindingFactoryFn<unknown>[]>(SCI_TABLE_ROW_BINDINGS, {skipSelf: true, optional: true}) ?? [],\n // Collect bindings registered in this injector.\n ...inject<SciTableRowBindingFactoryFn<unknown>[]>(SCI_TABLE_ROW_BINDING),\n ];\n },\n },\n ];\n}\n\n/**\n * Signature of a function to configure row bindings.\n *\n * Called per item with a {@link SciTableRowBindingFactory} to register bindings.\n *\n * The function:\n * - Runs in a reactive context and re-evaluates when tracked signals change.\n * - Can call `inject` to get required dependencies.\n */\nexport type SciTableRowBindingFactoryFn<T> = (row: SciTableRowBindingFactory, item: T, index: number) => void;\n\n/**\n * Factory for configuring row bindings.\n *\n * Row bindings enable associating metadata and icons with a row. Metadata includes CSS shadow parts, CSS classes, and HTML attributes.\n */\nexport interface SciTableRowBindingFactory {\n /**\n * Binds an icon to the row, displayed in the first column.\n *\n * ```ts\n * import {table} from '@scion/components/table';\n *\n * table({\n * datasource: data,\n * columns: table => ...,\n * rowBindings: bindings => bindings.addIconBinding('account_circle'),\n * });\n * ```\n *\n * SCION uses icon providers to render icons. An icon provider can be registered using {@link provideIconProvider}.\n *\n * Defaults to a Material icon provider if the application has not registered an icon provider, interpreting the icon as a Material Icon font ligature.\n * Refer to https://fonts.google.com/icons for available Material icons and instructions on including the Material icon font.\n */\n addIconBinding(icon: string): this;\n\n /**\n * Binds a CSS shadow part to the row for custom row/cell styling using the `::part()` CSS pseudo-element selector.\n *\n * Example usage:\n * ```ts\n * import {table} from '@scion/components/table';\n *\n * table({\n * datasource: data,\n * columns: table => ...,\n * rowBindings: (bindings, item, index) => bindings\n * .addPartBinding(index % 2 === 0 ? 'row:even' : 'row:odd')\n * .addPartBinding(item.active ? 'row:active' : undefined),\n * });\n * ```\n *\n * ```scss\n * sci-table::part(row\\:even row\\:not\\:selected) {\n * background-color: lightgray;\n * }\n *\n * sci-table::part(row\\:active row\\:not\\:selected) {\n * background-color: green;\n * }\n * ```\n */\n addPartBinding(name: `row:${string}` | undefined): this;\n\n /**\n * Binds an HTML attribute to the row.\n *\n * Useful for end-to-end testing, such as associating a row with an item's primary key.\n *\n * ```ts\n * import {table} from '@scion/components/table';\n *\n * table({\n * datasource: data,\n * columns: table => ...,\n * rowBindings: (bindings, item) => bindings.addAttributeBinding('data-id', item.id),\n * });\n * ```\n */\n addAttributeBinding(name: string, value: unknown | undefined): this;\n\n /**\n * Binds a CSS class to the row.\n */\n addClassBinding(name: string | undefined): this;\n}\n\nclass ɵSciTableRowBindingFactory implements SciTableRowBindingFactory {\n\n public readonly icons = new Array<string>();\n public readonly parts = new Array<`row:${string}`>();\n public readonly attributes = new Array<[string, unknown]>();\n public readonly classes = new Array<string>();\n\n public addIconBinding(icon: string | undefined): this {\n if (icon) {\n this.icons.push(icon);\n }\n return this;\n }\n\n public addPartBinding(name: `row:${string}` | undefined): this {\n if (name) {\n this.parts.push(name);\n }\n return this;\n }\n\n public addAttributeBinding(name: string, value: unknown | undefined): this {\n if (value !== undefined) {\n this.attributes.push([name, value]);\n }\n return this;\n }\n\n public addClassBinding(name: string | undefined): this {\n if (name) {\n this.classes.push(name);\n }\n return this;\n }\n}\n\nexport function coerceTableRowBindings<T>(bindingsFn: SciTableRowBindingFactoryFn<T>[], item: T, index: number): SciTableRowBindings {\n const factory = computed(() => {\n const factory = new ɵSciTableRowBindingFactory();\n bindingsFn.forEach(fn => fn(factory, item, index));\n return factory;\n });\n\n return {\n icons: computed(() => factory().icons, {equal: Objects.isEqual}),\n parts: computed(() => factory().parts, {equal: Objects.isEqual}),\n attributes: computed(() => Object.fromEntries(factory().attributes), {equal: Objects.isEqual}),\n classes: computed(() => factory().classes, {equal: Objects.isEqual}),\n };\n}\n\nexport interface SciTableRowBindings {\n icons: Signal<string[]>;\n parts: Signal<`row:${string}`[]>;\n attributes: Signal<{[name: string]: unknown}>;\n classes: Signal<string[]>;\n}\n\n/**\n * Multi-DI token for registering a {@link SciTableRowBindingFactory}.\n */\nexport const SCI_TABLE_ROW_BINDING = new InjectionToken<SciTableRowBindingFactory[]>('SCI_TABLE_ROW_BINDING');\n\n/**\n * DI token to inject {@link SciTableRowBindingFactory} functions provided in the current and parent injectors.\n */\nexport const SCI_TABLE_ROW_BINDINGS = new InjectionToken<SciTableRowBindingFactory[]>('SCI_TABLE_ROW_BINDINGS');\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {computed, effect, inject, InjectionToken, Injector, isSignal, linkedSignal, NgZone, resource, runInInjectionContext, signal, Signal, untracked, WritableSignal} from '@angular/core';\nimport {SciTableColumnFilter, SciTableDataLoaderFn, SciTableSortCriterion} from './table-datasource';\nimport {SciEnumValueLike, SciTable, SciTableCellLike, SciTableColumnLike, SciTableDescriptor, SciTableRow, SciTableRowActionFactoryFn} from './table.model';\nimport {ɵSciTableColumnFactory} from './ɵtable-column.factory';\nimport {rangeInclusive} from './common';\nimport {SCI_TABLE_STORAGE} from './table-storage';\nimport {toLazyObservable, ɵcreateDestroyableInjector, ɵSingleActiveInjectorFactory} from '@scion/components/common';\nimport {arrayDatasource, isArrayDatasource} from './ɵtable-array-datasource';\nimport {SciTableCache, SciTableCacheEntry} from './table.cache';\nimport {rxResource, takeUntilDestroyed, toObservable} from '@angular/core/rxjs-interop';\nimport {combineLatestWith, concat, defaultIfEmpty, firstValueFrom, fromEvent, of, skip, switchMap, tap, throwError, timer} from 'rxjs';\nimport {coerceTableRowBindings, SCI_TABLE_ROW_BINDINGS, SciTableRowBindingFactoryFn} from './table-row-binding';\nimport {clamp, Objects, Observables, runSafe} from '@scion/toolkit/util';\nimport {first, map, startWith} from 'rxjs/operators';\nimport {subscribeIn} from '@scion/toolkit/operators';\nimport {SciTableCellValuePreloader} from './table-cell-value-preloader';\n\nexport class ɵSciTable<T = unknown> implements SciTable<T> {\n\n private readonly _tableStorage = inject(SCI_TABLE_STORAGE);\n private readonly _injector = inject(Injector);\n\n public readonly name = signal<`table:${string}` | undefined>(undefined);\n public readonly columns: Signal<SciTableColumnLike<T>[]>;\n public readonly rowActions?: SciTableRowActionFactoryFn<T>;\n\n private readonly _rowBindings: SciTableRowBindingFactoryFn<T>[];\n private readonly _dataLoaderFn: SciTableDataLoaderFn<T>;\n private readonly _trackBy?: (item: T) => unknown;\n\n public readonly tableViewRef = signal<SciTableViewRef | undefined>(undefined);\n public readonly userSettings: WritableSignal<SciTableUserSettings>;\n public readonly bufferSize: number;\n public readonly pageSize: number;\n public readonly filterable: WritableSignal<boolean>;\n public readonly showHeader: WritableSignal<boolean>;\n public readonly wrapHeader: WritableSignal<boolean>;\n public readonly sortable: WritableSignal<boolean>;\n public readonly resizable: WritableSignal<boolean>;\n public readonly selectable: WritableSignal<'single' | 'multi' | false>;\n\n public readonly scrollRange: Signal<SciScrollRange | undefined>;\n public readonly scrollTop: Signal<number>;\n public readonly virtualScrollOffset: Signal<{top: number; bottom: number}>;\n public readonly viewportPageSize: Signal<number>;\n\n public readonly scrolling: Signal<boolean>;\n public readonly resizing = computed(() => this.columns().some(column => column.resizing()));\n\n public readonly sortCriteria = linkedSignal<SciTableColumnLike<T>[], SciTableSortCriterion[]>({\n source: () => this.columns(), // Discard stale criteria on column change.\n computation: (columns, previous) => previous?.value.filter(criteria => columns.some(column => column.name === criteria.columnName)) ?? [],\n equal: Objects.isEqual,\n });\n\n public readonly filterCriteria = linkedSignal<SciTableColumnLike<T>[], SciTableColumnFilter[]>({\n source: () => this.columns(), // Discard stale criteria on column change.\n computation: (columns, previous) => previous?.value.filter(criteria => columns.some(column => column.name === criteria.columnName)) ?? [],\n equal: Objects.isEqual,\n });\n\n private readonly _cache = new SciTableCache<T>();\n private readonly _tableCellValuePreloader = inject(SciTableCellValuePreloader);\n private readonly _tableFilter = signal<string | null>(null);\n private readonly _selectedItems = signal(new Map<unknown, T>());\n\n // Reset total count on criteria change to show skeletons instead of stale data while loading.\n public readonly totalCount = linkedSignal({\n source: () => this.criteria(),\n computation: () => undefined as number | undefined,\n });\n\n public readonly activeItem = linkedSignal({\n source: () => this.criteria(),\n computation: () => undefined as T | undefined,\n });\n\n public readonly hoveredIndex = linkedSignal({\n source: () => {\n this.criteria(); // reset on criteria change\n this.scrolling(); // reset when start scrolling\n },\n computation: () => -1,\n });\n\n public readonly criteria = computed(() => ({sort: this.sortCriteria(), filter: this.filterCriteria(), tableFilter: this._tableFilter()}));\n public readonly loading = computed(() => this._cache.loading() || this._tableCellValuePreloader.loading());\n public readonly error = this._cache.error;\n public readonly activeRow: Signal<SciTableRow<T> | undefined>;\n public readonly hoveredRow = computed(() => this.rowsByIndex().get(this.hoveredIndex()));\n public readonly selectedItems = computed(() => [...this._selectedItems().values()]);\n public readonly selectedIds = computed(() => new Set([...this._selectedItems().keys()]));\n public readonly rowsByIndex = this._cache.rowsByIndex;\n public readonly rows = this.computeRows();\n\n constructor(descriptor: SciTableDescriptor<T>) {\n // TODO [table] Remove after datasource is final. See ɵillegaldatasource.\n descriptor = {...descriptor, ɵdatasource: descriptor.ɵdatasource ?? descriptor.datasource};\n\n this.bufferSize = descriptor.bufferSize ?? 10;\n this.pageSize = descriptor.pageSize ?? 50;\n this.sortable = signal(descriptor.sortable ?? true);\n this.filterable = signal(descriptor.filterable ?? false);\n this.showHeader = signal(descriptor.showHeader ?? true);\n this.wrapHeader = signal(descriptor.wrapHeader ?? false);\n this.resizable = signal(descriptor.resizable ?? true);\n this.selectable = signal(descriptor.selectable ?? 'multi');\n this.userSettings = this.computeUserSettings();\n this.scrollRange = this.computeScrollRange();\n this.scrollTop = this.computeScrollTop();\n this.scrolling = this.computeScrolling();\n this.virtualScrollOffset = this.computeVirtualScrollOffset();\n this.viewportPageSize = this.computeViewportPageSize();\n this.activeRow = this.computeActiveRow();\n this.columns = this.computeColumns(descriptor);\n\n this.rowActions = descriptor.rowActions;\n this._rowBindings = [\n ...descriptor.rowBindings ? [descriptor.rowBindings] : [],\n ...inject<SciTableRowBindingFactoryFn<T>[]>(SCI_TABLE_ROW_BINDINGS, {optional: true}) ?? [],\n ];\n this._trackBy = descriptor.trackBy;\n this._dataLoaderFn = isSignal(descriptor.ɵdatasource) ? arrayDatasource(descriptor.ɵdatasource, this.columns) : descriptor.ɵdatasource!;\n\n this.installCriteriaWatcher();\n this.installPageLoader();\n }\n\n /**\n * Connects {@link SciTableComponent} to the model.\n */\n public connect(name: `table:${string}`, viewRef: SciTableViewRef): void {\n this.name.set(name);\n this.tableViewRef.set(viewRef);\n }\n\n public disconnect(): void {\n this.name.set(undefined);\n this.tableViewRef.set(undefined);\n }\n\n private computeColumns(descriptor: SciTableDescriptor<T>): Signal<SciTableColumnLike<T>[]> {\n // Create a factory to instantiate a new injector per column factory execution, releasing resources allocated in the previous execution.\n const injectorFactory = new ɵSingleActiveInjectorFactory();\n\n return computed(() => runInInjectionContext(injectorFactory.create(), () => {\n const tableColumnFactory = new ɵSciTableColumnFactory<T>(this);\n descriptor.columns(tableColumnFactory);\n return tableColumnFactory.columns;\n }));\n }\n\n /**\n * Computes the rows currently visible in the viewport (+buffer).\n */\n private computeRows(): Signal<SciTableRow<T>[]> {\n return computed(() => {\n const scrollRange = this.scrollRange();\n if (!scrollRange) {\n return [];\n }\n\n const rowsByIndex = this.rowsByIndex();\n const rowCount = scrollRange.end - scrollRange.start;\n\n // Populate rows with cached rows in the range window, fallback to row shell to show skeleton.\n return untracked(() => Array.from({length: rowCount}, (_, i) => rowsByIndex.get(scrollRange.start + i) ?? createSyntheticRow(i)));\n });\n\n function createSyntheticRow(index: number): SciTableRow<T> {\n return {\n index,\n loading: true,\n active: signal(false).asReadonly(),\n selected: signal(false).asReadonly(),\n hovered: signal(false).asReadonly(),\n };\n }\n }\n\n /**\n * Computes the visible row count based on the viewport size.\n */\n private computeScrollRange(): Signal<SciScrollRange | undefined> {\n return computed(() => {\n const tableViewRef = this.tableViewRef();\n if (!tableViewRef) {\n return undefined;\n }\n\n const viewportHeight = tableViewRef.viewportHeight();\n const itemHeight = tableViewRef.itemHeight();\n const scrollTop = this.scrollTop();\n\n const start = Math.floor(scrollTop / itemHeight);\n const viewportRowCount = Math.ceil(viewportHeight / itemHeight);\n const end = Math.min(start + viewportRowCount);\n\n const totalCount = this.totalCount() ?? viewportRowCount; // fill viewport if no data loaded yet\n\n return {\n start: clamp(start - this.bufferSize, {min: 0, max: Math.max(0, totalCount - viewportRowCount)}),\n end: clamp(end + this.bufferSize, {max: totalCount}),\n };\n }, {equal: Objects.isEqual});\n }\n\n private computeVirtualScrollOffset(): Signal<{top: number; bottom: number}> {\n return computed(() => {\n const itemHeight = this.tableViewRef()?.itemHeight() ?? 0;\n const totalCount = this.totalCount() ?? 0;\n const rangeEnd = Math.min(this.scrollRange()?.end ?? 0, this.totalCount() ?? 0);\n\n return {\n top: (this.scrollRange()?.start ?? 0) * itemHeight,\n bottom: (totalCount - rangeEnd) * itemHeight,\n };\n }, {equal: Objects.isEqual});\n }\n\n private computeViewportPageSize(): Signal<number> {\n return computed(() => {\n const itemHeight = this.tableViewRef()?.itemHeight() ?? 0;\n const viewportHeight = this.tableViewRef()?.viewportHeight() ?? 0;\n return Math.ceil(viewportHeight / itemHeight);\n });\n }\n\n /**\n * Tracks {@link HTMLElement.scrollTop} of the viewport.\n */\n private computeScrollTop(): Signal<number> {\n const zone = inject(NgZone);\n\n return rxResource({\n defaultValue: 0,\n params: () => this.tableViewRef()?.viewport,\n stream: ({params: viewport}) => fromEvent(viewport, 'scroll', {passive: true})\n .pipe(\n map(() => viewport.scrollTop),\n startWith(viewport.scrollTop),\n subscribeIn(fn => zone.runOutsideAngular(fn)),\n ),\n }).value;\n }\n\n /**\n * Tracks whether currently scrolling the viewport.\n */\n private computeScrolling(): Signal<boolean> {\n const zone = inject(NgZone);\n\n return rxResource({\n defaultValue: false,\n params: () => this.tableViewRef()?.viewport,\n stream: ({params: viewport}) => fromEvent(viewport, 'scroll', {passive: true})\n .pipe(\n switchMap(() => concat(of(true), timer(150).pipe(map(() => false)))),\n startWith(false),\n subscribeIn(fn => zone.runOutsideAngular(fn)),\n ),\n }).value;\n }\n\n /**\n * Loads a range of rows, based on the current sort and filter criteria, into the cache.\n */\n public async loadRange(start: number, end: number): Promise<void> {\n const sortCriteria = this.sortCriteria();\n const columnFilters = this.filterCriteria();\n const tableFilter = this._tableFilter() ?? undefined;\n\n // Calculate pages based on row indices and page size.\n const pages = pagesByRange(start, end, this.pageSize);\n if (!pages) {\n return;\n }\n\n // Load pages and wait until completed loading.\n await Promise.all(pages\n .map(page => this.loadPage({page, pageSize: this.pageSize, columnFilters, tableFilter, sortCriteria}))\n .map(page => firstValueFrom(toLazyObservable(page.loading, {injector: this._injector}).pipe(first(loading => !loading), defaultIfEmpty(true)))));\n }\n\n /**\n * Loads the requested page from the cache or datasource and returns its loading state with a cancelation handler.\n */\n private loadPage({page, pageSize, sortCriteria, columnFilters, tableFilter}: {page: number; pageSize: number; sortCriteria: SciTableSortCriterion[]; columnFilters: SciTableColumnFilter[]; tableFilter?: string}): {loading: Signal<boolean>; cancel: () => void} {\n const pageStart = page * pageSize;\n const pageEnd = pageStart + pageSize;\n const cacheKey = `${pageStart}-${pageEnd}` as const;\n\n if (this._cache.has(cacheKey)) {\n return {\n loading: this._cache.get(cacheKey)!.rows.isLoading,\n cancel: () => this._cache.deleteIfLoading(cacheKey),\n };\n }\n\n const cacheEntryInjector = ɵcreateDestroyableInjector({parent: this._injector});\n const cacheEntry: SciTableCacheEntry<T> = {\n rows: runInInjectionContext(cacheEntryInjector, () => {\n // Fetch data.\n const tableResponse$ = runSafe(\n () => Observables.coerce(this._dataLoaderFn({\n start: pageStart,\n end: pageEnd,\n pageSize,\n page,\n sortCriteria,\n tableFilter,\n columnFilters,\n })),\n error => throwError(() => error));\n\n const columns$ = toObservable(this.columns);\n const injectorFactory = new ɵSingleActiveInjectorFactory();\n\n // Create a resource to track loading and error states.\n return rxResource({\n stream: () => tableResponse$.pipe(\n combineLatestWith(columns$),\n map(([response, columns]) => ({\n rows: runInInjectionContext(injectorFactory.create(), () => this.mapItemsToRow(response.items, columns, pageStart)),\n totalCount: response.totalCount,\n })),\n tap({\n next: ({totalCount}) => this.totalCount.set(totalCount),\n error: error => {\n console.error(error);\n // Reset count to scroll to the top so the user sees the error.\n this.totalCount.set(0);\n },\n }),\n map(({rows}) => rows),\n ),\n defaultValue: [],\n });\n }),\n dispose: () => cacheEntryInjector.destroy(),\n start: pageStart,\n end: pageEnd,\n };\n\n this._cache.set(cacheKey, cacheEntry);\n\n return {\n loading: cacheEntry.rows.isLoading,\n cancel: () => this._cache.deleteIfLoading(cacheKey),\n };\n }\n\n /**\n * Toggles sort on a column. ASC -> DESC -> No sort\n *\n * TODO [ego] Revisit API, do we really want a three-state and implicit toggling logic?\n */\n public sort(columnName: `column:${string}`, multi: boolean): void {\n // Scroll to the top as soon as sort changes.\n // Done here explicitly to avoid race-conditions and pages being loaded unnecessarily.\n this.tableViewRef()?.scrollToTop();\n\n this.sortCriteria.update(sortCriteria => {\n const column = this.columns().find(column => column.name === columnName);\n if (!column) {\n throw Error(`[NullColumnError] Column '${columnName}' not found in table '${this.name()}'.`);\n }\n\n const currentSortCriterion = sortCriteria.find(sortCriterion => sortCriterion.columnName === column.name);\n const otherSortCriteria = sortCriteria.filter(sortCriterion => sortCriterion !== currentSortCriterion);\n\n const direction = currentSortCriterion ? (currentSortCriterion.direction === 'asc' ? 'desc' : undefined) : 'asc';\n if (!direction) {\n return multi ? otherSortCriteria : [];\n }\n\n const newSortCriterion = {columnName: column.name, direction} satisfies SciTableSortCriterion;\n return multi ? [...otherSortCriteria, newSortCriterion] : [newSortCriterion];\n });\n }\n\n /**\n * Applies a filter, either via global filter or on a specific column.\n */\n public filter(text: string | null): void;\n public filter(text: string | number | boolean | SciEnumValueLike | SciEnumValueLike[] | null, options: {columnName: `column:${string}`}): void;\n public filter(text: string | number | boolean | SciEnumValueLike | SciEnumValueLike[] | null, options?: {columnName: `column:${string}`}): void {\n // Scroll to the top as soon as filter changes.\n // Done here explicitly to avoid race-conditions and pages being loaded unnecessarily.\n this.tableViewRef()?.scrollToTop();\n\n if (!options) {\n this._tableFilter.set(text as string | null);\n return;\n }\n\n const column = this.columns().find(column => column.name === options.columnName);\n if (!column) {\n throw Error(`[NullColumnError] Column '${options.columnName}' not found in table '${this.name()}'.`);\n }\n\n this.filterCriteria.update(filterCriteria => {\n const newFilterCriteria = filterCriteria.filter(filterCriterion => filterCriterion.columnName !== options.columnName);\n return text === null ? newFilterCriteria : newFilterCriteria.concat({columnName: column.name, text});\n });\n }\n\n public updateSelectedItems(updateFn: (ids: Map<unknown, T>) => Map<unknown, T>): void {\n this._selectedItems.update(updateFn);\n }\n\n /**\n * Indicates whether the built-in array datasource is used.\n *\n * Supports out-of-the-box filtering and sorting for built-in table columns.\n */\n public isArrayDatasource(): boolean {\n return isArrayDatasource(this._dataLoaderFn);\n }\n\n public reset(): void {\n this._cache.clear();\n this.totalCount.set(undefined);\n }\n\n public dispose(): void {\n this._cache.clear();\n this.disconnect();\n }\n\n /**\n * Loads a set of pages on criteria or viewport changes.\n */\n private installPageLoader(): void {\n effect(onCleanup => {\n const scrollRange = this.scrollRange();\n const sortCriteria = this.sortCriteria();\n const columnFilters = this.filterCriteria();\n const tableFilter = this._tableFilter() ?? undefined;\n\n if (!scrollRange) {\n return;\n }\n\n untracked(() => {\n // Fall back to load the initial page if range is empty. Otherwise, if the table grows with its content,\n // no data would ever load because the scroll range remains 0.\n const pages = pagesByRange(scrollRange.start, scrollRange.end, this.pageSize) ?? [0];\n\n pages.forEach(page => {\n const pageRef = this.loadPage({\n pageSize: this.pageSize,\n page,\n sortCriteria,\n tableFilter,\n columnFilters,\n });\n onCleanup(() => pageRef.cancel());\n });\n });\n });\n }\n\n /**\n * Resets cache on criteria changes.\n */\n private installCriteriaWatcher(): void {\n toObservable(this.criteria).pipe(\n skip(1), // skip first emission to avoid race condition with loader on initialization.\n takeUntilDestroyed(),\n ).subscribe(() => {\n this._cache.clear();\n });\n }\n\n private mapItemsToRow(items: T[], columns: SciTableColumnLike<T>[], pageStart: number): SciTableRow<T>[] {\n return items.map((item, i) => {\n const id = this.trackBy(item);\n const index = pageStart + i;\n\n return {\n id,\n index,\n item,\n loading: false,\n active: computed(() => item === this.activeItem()),\n selected: computed(() => this.selectedIds().has(id)),\n hovered: computed(() => this.hoveredRow()?.index === index),\n bindings: coerceTableRowBindings(this._rowBindings, item, pageStart + i),\n cells: columns.map(column => ({\n value: 'value' in column ? column.value(item) : undefined,\n component: column.type === 'component' ? column.component(item) : undefined,\n template: column.type === 'template' ? column.template(item) : undefined,\n type: column.type,\n column,\n } as SciTableCellLike)),\n };\n });\n }\n\n /**\n * Creates a signal to read and write table user settings.\n */\n private computeUserSettings(): WritableSignal<SciTableUserSettings> {\n // Load user settings from storage.\n const userSettings = resource({\n params: () => this.name(),\n loader: async ({params: tableName}) => {\n try {\n const serialized = await this._tableStorage.load(`scion.components.${tableName}`);\n return serialized ? JSON.parse(serialized) as SciTableUserSettings : {columns: []};\n }\n catch (error) {\n console.warn(`[SciTable] Failed to load user settings for '${tableName}'.`, error);\n return {columns: []};\n }\n },\n defaultValue: {columns: []},\n });\n\n // Persist settings to storage.\n effect(() => {\n if (userSettings.status() === 'local' && this.name()) {\n untracked(() => void this._tableStorage.store(`scion.components.${this.name()!}`, JSON.stringify(userSettings.value())));\n }\n });\n\n return userSettings.value;\n }\n\n /**\n * Call trackBy function or fallback to track by object reference.\n */\n public trackBy(item: T): unknown {\n return this._trackBy?.(item) ?? item;\n }\n\n private computeActiveRow(): Signal<SciTableRow<T> | undefined> {\n return computed(() => {\n const activeItem = this.activeItem();\n if (activeItem === undefined) {\n return undefined;\n }\n\n const id = this.trackBy(activeItem);\n if (id === undefined) {\n return undefined;\n }\n\n return this._cache.rowsById().get(id);\n });\n }\n}\n\nexport interface SciScrollRange {\n /** incluse */\n start: number;\n /** exclusive */\n end: number;\n}\n\n/**\n * Gets pages by range and page size, or `null` if empty. End is exclusive.\n */\nfunction pagesByRange(start: number, end: number, pageSize: number): number[] | null {\n const startPage = Math.floor(start / pageSize);\n const endPage = Math.floor((end - 1) / pageSize); // `end` is exclusive, so use the last included index (`end - 1`) for page calculation.\n const pages = rangeInclusive(startPage, endPage);\n return pages.length ? pages : null;\n}\n\nexport interface SciTableUserSettings {\n columns?: {name: string; width?: number}[];\n}\n\nexport const ɵSCI_TABLE = new InjectionToken<Signal<ɵSciTable>>('ɵSciTable');\n\nexport interface SciTableViewRef {\n viewport: HTMLElement;\n viewportHeight: Signal<number>;\n viewportWidth: Signal<number>;\n viewportClientHeight: Signal<number>;\n viewportClientWidth: Signal<number>;\n headerHeight: Signal<number>;\n cellPadding: Signal<number>;\n itemHeight: Signal<number>;\n scrollToTop: () => void;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {MaybeAsync} from './common';\nimport {computed, Signal} from '@angular/core';\nimport {SciEnumValueLike} from './table.model';\n\nexport interface SciTableColumnFilter {\n columnName: `column:${string}`;\n text: string | number | boolean | SciEnumValueLike | SciEnumValueLike[];\n}\n\nexport interface SciTableSortCriterion {\n columnName: `column:${string}`;\n direction: 'asc' | 'desc';\n}\n\nexport interface SciTablePageRequest {\n page: number; // TODO [ego] Should page be 1-based?\n pageSize: number;\n start: number; // Inclusive\n end: number; // Exclusive\n sortCriteria: SciTableSortCriterion[];\n columnFilters: SciTableColumnFilter[];\n tableFilter?: string;\n}\n\nexport interface SciTablePageResponse<T> {\n /**\n * Items of the requested page.\n */\n items: T[];\n\n /**\n * Total count of the source data, used to calculate the scroll size.\n */\n totalCount: number;\n}\n\n/**\n * @docs-private Not public API. For internal use only.\n * @experimental since 22.3.0; API and behavior may change in any version without notice.\n */\nexport type SciTableDataLoaderFn<T> = (request: SciTablePageRequest) => MaybeAsync<SciTablePageResponse<T>>;\n\n/**\n * TODO [table] Remove after datasource is final.\n *\n * @docs-private Not public API. For internal use only.\n * @experimental since 22.3.0; API and behavior may change in any version without notice.\n */\nexport function ɵillegaldatasource<T>(): Signal<T[]> {\n return computed(() => {\n throw Error('[SciTableError] Illegal state. ɵillegaldatasource should not be used.');\n });\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {assertInInjectionContext, assertNotInReactiveContext, DestroyRef, inject, Injector, isSignal, runInInjectionContext, Signal} from '@angular/core';\nimport {SciTable, SciTableDescriptor} from './table.model';\nimport {SciTableColumnFactory} from './table-column.factory';\nimport {ɵSciTable} from './ɵtable.model';\nimport {ɵillegaldatasource} from './table-datasource';\n\nexport type SciTableColumnFactoryFn<T> = (table: SciTableColumnFactory<T>) => void;\n\n// Do not change order for better IntelliSense.\n\n/** @experimental since 22.3.0; API and behavior may change in any version without notice. */\nexport function table<T>(descriptor: SciTableDescriptor<T>): SciTable<T>;\n/** @experimental since 22.3.0; API and behavior may change in any version without notice. */\nexport function table<T>(data: Signal<T[]>, columnFactoryFn: SciTableColumnFactoryFn<T>, options?: {injector?: Injector}): SciTable<T>;\nexport function table<T>(dataOrDescriptor: Signal<T[]> | SciTableDescriptor<T>, columnFactoryFn?: SciTableColumnFactoryFn<T>, options?: {injector?: Injector}): SciTable<T> {\n assertNotInReactiveContext(table, 'Call table in a non-reactive (non-tracking) context, such as within the untracked() function.');\n\n const descriptor = isSignal(dataOrDescriptor) ? ({ɵdatasource: dataOrDescriptor, datasource: ɵillegaldatasource(), columns: columnFactoryFn!, injector: options?.injector}) satisfies SciTableDescriptor<T> : dataOrDescriptor;\n if (!descriptor.injector) {\n assertInInjectionContext(table);\n }\n\n const injector = descriptor.injector ?? inject(Injector);\n const sciTable = runInInjectionContext(injector, () => new ɵSciTable(descriptor));\n injector.get(DestroyRef).onDestroy(() => sciTable.dispose());\n return sciTable;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {inject, Injectable, Signal} from '@angular/core';\nimport {ɵSCI_TABLE, ɵSciTable} from './ɵtable.model';\nimport {rangeInclusive} from './common';\nimport {firstValueFrom, timer} from 'rxjs';\nimport {SciTableRow} from './table.model';\n\n@Injectable()\nexport class SciTableSelectionService<T> {\n\n private readonly _table = inject<Signal<ɵSciTable<T>>>(ɵSCI_TABLE);\n\n public async onRowClick(index: number, event: {ctrlKey: boolean; shiftKey: boolean; metaKey: boolean}): Promise<void> {\n const table = this._table();\n const rowsByIndex = table.rowsByIndex();\n const row = rowsByIndex.get(index);\n const item = rowsByIndex.get(index)?.item;\n const previousFocusedIndex = table.activeRow()?.index ?? -1;\n\n table.activeItem.set(item);\n\n if (item === undefined || !table.selectable()) {\n return;\n }\n\n if (table.selectable() === 'single') {\n table.updateSelectedItems(() => new Map<unknown, T>().set(row!.id, item));\n return;\n }\n\n if (event.shiftKey && previousFocusedIndex >= 0) {\n const start = Math.min(previousFocusedIndex, index);\n const end = Math.max(previousFocusedIndex, index);\n await this.selectItems(start, end, {add: true});\n }\n else if (event.ctrlKey || event.metaKey) {\n this.toggleSelectedItem(item);\n }\n else {\n // If no modifier is pressed set the selection to the clicked row.\n table.updateSelectedItems(() => new Map<unknown, T>().set(row!.id, item));\n }\n }\n\n public async onArrowUp(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeIndex = this._table().activeRow()?.index ?? -1;\n\n if (activeIndex <= 0) {\n return;\n }\n\n // Set active item.\n const startIndex = activeIndex - 1;\n await this.loadMissingItems(startIndex, startIndex);\n const startItem = table.rowsByIndex().get(startIndex)?.item;\n table.activeItem.set(startItem);\n\n if (!table.selectable()) {\n return;\n }\n\n const keyboardEvent = event as KeyboardEvent;\n const shift = keyboardEvent.shiftKey;\n const ctrlOrMeta = keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n\n if (shift && ctrlOrMeta) {\n await this.ctrlShiftUp({startIndex, activeIndex});\n }\n else if (shift) {\n await this.shiftUp({startIndex, activeIndex});\n }\n else if (ctrlOrMeta) {\n // Selection remains unchanged.\n }\n else {\n await this.selectItems(startIndex, startIndex);\n }\n }\n\n public async onArrowDown(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeIndex = this._table().activeRow()?.index ?? -1;\n const endIndex = Math.min(activeIndex + 1, table.totalCount()! - 1);\n\n if (endIndex === activeIndex) {\n return;\n }\n\n // Set active item.\n await this.loadMissingItems(endIndex, endIndex);\n const endItem = table.rowsByIndex().get(endIndex)?.item;\n table.activeItem.set(endItem);\n\n if (!table.selectable()) {\n return;\n }\n\n const keyboardEvent = event as KeyboardEvent;\n const shift = keyboardEvent.shiftKey;\n const ctrlOrMeta = keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n\n if (shift && ctrlOrMeta) {\n await this.ctrlShiftDown({endIndex, activeIndex});\n }\n else if (shift) {\n await this.shiftDown({endIndex, activeIndex});\n }\n else if (ctrlOrMeta) {\n // Selection remains unchanged.\n }\n else {\n await this.selectItems(endIndex, endIndex);\n }\n }\n\n public async onPageUp(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeIndex = this._table().activeRow()?.index ?? -1;\n\n if (activeIndex === 0) {\n return;\n }\n\n // Set active item.\n const startIndex = Math.max(activeIndex - table.viewportPageSize() + 1, 0);\n await this.loadMissingItems(startIndex, startIndex);\n const startItem = table.rowsByIndex().get(startIndex)?.item;\n table.activeItem.set(startItem);\n\n if (!table.selectable()) {\n return;\n }\n\n const keyboardEvent = event as KeyboardEvent;\n const shift = keyboardEvent.shiftKey;\n const ctrlOrMeta = keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n\n if (shift && ctrlOrMeta) {\n await this.ctrlShiftUp({startIndex, activeIndex});\n }\n else if (shift) {\n await this.shiftUp({startIndex, activeIndex});\n }\n else if (ctrlOrMeta) {\n // Selection remains unchanged.\n }\n else {\n await this.selectItems(startIndex, startIndex);\n }\n }\n\n public async onPageDown(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeIndex = this._table().activeRow()?.index ?? -1;\n const endIndex = Math.min(activeIndex + table.viewportPageSize() - 1, table.totalCount()! - 1);\n\n if (endIndex === activeIndex) {\n return;\n }\n\n // Set active item.\n await this.loadMissingItems(endIndex, endIndex);\n const endItem = table.rowsByIndex().get(endIndex)?.item;\n table.activeItem.set(endItem);\n\n if (!table.selectable()) {\n return;\n }\n\n const keyboardEvent = event as KeyboardEvent;\n const shift = keyboardEvent.shiftKey;\n const ctrlOrMeta = keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n\n if (shift && ctrlOrMeta) {\n await this.ctrlShiftDown({endIndex, activeIndex});\n }\n else if (shift) {\n await this.shiftDown({endIndex, activeIndex});\n }\n else if (ctrlOrMeta) {\n // Selection remains unchanged.\n }\n else {\n await this.selectItems(endIndex, endIndex);\n }\n }\n\n public async onHome(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeIndex = this._table().activeRow()?.index ?? -1;\n\n if (activeIndex <= 0) {\n return;\n }\n\n // Set active item.\n const startIndex = 0;\n await this.loadMissingItems(startIndex, startIndex);\n const startItem = table.rowsByIndex().get(startIndex)?.item;\n table.activeItem.set(startItem);\n\n if (!table.selectable()) {\n return;\n }\n\n const keyboardEvent = event as KeyboardEvent;\n const shift = keyboardEvent.shiftKey;\n const ctrlOrMeta = keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n\n if (shift && ctrlOrMeta) {\n await this.ctrlShiftUp({startIndex, activeIndex});\n }\n else if (shift) {\n await this.shiftUp({startIndex, activeIndex});\n }\n else if (ctrlOrMeta) {\n // Selection remains unchanged.\n }\n else {\n await this.selectItems(startIndex, startIndex);\n }\n }\n\n public async onEnd(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeIndex = this._table().activeRow()?.index ?? -1;\n\n const endIndex = table.totalCount()! - 1;\n\n if (endIndex === activeIndex) {\n return;\n }\n\n // TODO [mmu] should active item be set before selection? this way, further methods cant rely on table.activeItem.\n // But otherwise, loading and setting the active item needs to be done for each case, or once at the end.\n\n // Set active item.\n await this.loadMissingItems(endIndex, endIndex);\n const endItem = table.rowsByIndex().get(endIndex)?.item;\n table.activeItem.set(endItem);\n\n if (!table.selectable()) {\n return;\n }\n\n const keyboardEvent = event as KeyboardEvent;\n const shift = keyboardEvent.shiftKey;\n const ctrlOrMeta = keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n\n if (shift && ctrlOrMeta) {\n await this.ctrlShiftDown({endIndex, activeIndex});\n }\n else if (shift) {\n await this.shiftDown({endIndex, activeIndex});\n }\n else if (ctrlOrMeta) {\n // Selection remains unchanged.\n }\n else {\n await this.selectItems(endIndex, endIndex);\n }\n }\n\n public onSpace(event: Event): void {\n event.preventDefault();\n\n const table = this._table();\n if (!table.selectable()) {\n return;\n }\n\n const activeItem = table.activeItem();\n if (!activeItem) {\n return;\n }\n\n const keyboardEvent = event as KeyboardEvent;\n const ctrlOrMeta = keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n const activeItemId = table.trackBy(activeItem);\n\n if (ctrlOrMeta) {\n this.toggleSelectedItem(activeItem);\n }\n else {\n table.updateSelectedItems(() => new Map<unknown, T>().set(activeItemId, activeItem));\n }\n }\n\n public async onControlA(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const totalCount = table.totalCount() ?? 0;\n\n if (table.selectable() === 'multi' && totalCount >= 0) {\n await this.selectItems(0, totalCount - 1);\n }\n }\n\n // TODO [mmu] Should we add overloads for all variants for better readability, but same logic?\n // shiftArrowDown\n // shiftPageDown\n // ShiftEnd\n private async shiftDown(options: {endIndex: number; activeIndex: number}): Promise<void> {\n const table = this._table();\n const selectedIds = table.selectedIds();\n const activeIndex = options.activeIndex;\n\n const startIndex = activeIndex;\n const endIndex = options.endIndex;\n\n const activeItem = table.rowsByIndex().get(activeIndex)!.item!;\n const activeItemId = table.trackBy(activeItem)!;\n\n if (table.selectable() === 'single') {\n await this.selectItems(endIndex, endIndex);\n return;\n }\n\n if (!selectedIds.has(activeItemId)) {\n await this.selectItems(startIndex, endIndex);\n return;\n }\n\n if (this.isSelectionAtBlockStart(activeIndex)) {\n await this.selectFromBlockStart(startIndex, endIndex);\n return;\n }\n\n await this.selectItems(startIndex, endIndex, {add: true});\n }\n\n private async ctrlShiftDown(options: {endIndex: number; activeIndex: number}): Promise<void> {\n const table = this._table();\n\n const startIndex = options.activeIndex;\n const endIndex = options.endIndex;\n\n if (table.selectable() === 'single') {\n await this.selectItems(endIndex, endIndex);\n }\n else {\n await this.selectItems(startIndex, endIndex, {add: true});\n }\n }\n\n private async shiftUp(options: {startIndex: number; activeIndex: number}): Promise<void> {\n const table = this._table();\n const selectedIds = table.selectedIds();\n const activeIndex = options.activeIndex;\n\n const startIndex = options.startIndex;\n const endIndex = activeIndex;\n\n const activeItem = table.rowsByIndex().get(activeIndex)!.item!;\n const activeItemId = table.trackBy(activeItem)!;\n\n if (table.selectable() === 'single') {\n await this.selectItems(startIndex, startIndex);\n return;\n }\n\n if (!selectedIds.has(activeItemId)) {\n await this.selectItems(startIndex, endIndex);\n return;\n }\n\n if (this.isSelectionAtBlockEnd(activeIndex)) {\n await this.selectFromBlockEnd(startIndex, endIndex);\n return;\n }\n\n await this.selectItems(startIndex, endIndex, {add: true});\n }\n\n private async ctrlShiftUp(options: {startIndex: number; activeIndex: number}): Promise<void> {\n const table = this._table();\n\n const startIndex = options.startIndex;\n const endIndex = options.activeIndex;\n\n if (table.selectable() === 'single') {\n await this.selectItems(startIndex, startIndex);\n }\n else {\n await this.selectItems(startIndex, endIndex, {add: true});\n }\n }\n\n private isSelectionAtBlockStart(activeIndex: number): boolean {\n const table = this._table();\n const selectedIds = table.selectedIds();\n\n const previousItem = table.rowsByIndex().get(activeIndex - 1)?.item;\n const previousItemId = previousItem ? table.trackBy(previousItem) : undefined;\n\n const nextItem = table.rowsByIndex().get(activeIndex + 1)?.item;\n const nextItemId = nextItem ? table.trackBy(nextItem) : undefined;\n\n return !selectedIds.has(previousItemId) && selectedIds.has(nextItemId);\n }\n\n private isSelectionAtBlockEnd(activeIndex: number): boolean {\n const table = this._table();\n const selectedIds = table.selectedIds();\n\n const previousItem = table.rowsByIndex().get(activeIndex - 1)?.item;\n const previousItemId = previousItem ? table.trackBy(previousItem) : undefined;\n\n const nextItem = table.rowsByIndex().get(activeIndex + 1)?.item;\n const nextItemId = nextItem ? table.trackBy(nextItem) : undefined;\n\n return selectedIds.has(previousItemId) && !selectedIds.has(nextItemId);\n }\n\n private async loadMissingItems(startIndex: number, endIndex: number): Promise<void> {\n const table = this._table();\n const indices = rangeInclusive(startIndex, endIndex + 1);\n const rows = indices.map(i => table.rowsByIndex().get(i));\n if (rows.some(row => row?.id === undefined)) {\n await Promise.race([\n table.loadRange(startIndex, endIndex + 1),\n firstValueFrom(timer(5_000)),\n ]);\n }\n }\n\n private async selectItems(startIndex: number, endIndex: number, options?: {add: boolean}): Promise<void> {\n const table = this._table();\n const indices = rangeInclusive(startIndex, endIndex);\n const add = options?.add ?? false;\n let rows = indices.map(i => table.rowsByIndex().get(i));\n\n if (rows.some(row => row?.id === undefined)) {\n // If not all id's could be found load the missing items.\n await Promise.race([\n table.loadRange(startIndex, endIndex),\n firstValueFrom(timer(5_000)),\n ]);\n rows = indices.map(i => table.rowsByIndex().get(i));\n }\n\n table.updateSelectedItems(existing => new Map<unknown, T>([\n ...(add ? existing : []),\n ...rows\n .filter((row): row is Required<SciTableRow<T>> => row?.id !== undefined && row.item !== undefined)\n .map((row): [unknown, T] => [row.id, row.item]),\n ]));\n }\n\n private async selectFromBlockStart(startIndex: number, endIndex: number): Promise<void> {\n const table = this._table();\n\n await this.loadMissingItems(startIndex, endIndex);\n const indices = rangeInclusive(startIndex, endIndex);\n\n table.updateSelectedItems(selection => {\n const newSelection = new Map(selection);\n\n for (let i = 0; i < indices.length; i++) {\n const currentIndex = indices[i]!;\n const nextIndex = indices[i + 1]!;\n\n const item = table.rowsByIndex().get(currentIndex)?.item;\n if (!item) {\n continue;\n }\n\n const itemId = table.trackBy(item);\n const nextItem = table.rowsByIndex().get(nextIndex)?.item;\n const nextItemId = nextItem ? table.trackBy(nextItem) : undefined;\n\n if (selection.has(nextItemId)) {\n newSelection.delete(itemId);\n }\n else {\n newSelection.set(itemId, item);\n }\n }\n return newSelection;\n });\n }\n\n private async selectFromBlockEnd(startIndex: number, endIndex: number): Promise<void> {\n const table = this._table();\n\n await this.loadMissingItems(startIndex, endIndex);\n const indices = rangeInclusive(startIndex, endIndex);\n\n table.updateSelectedItems(selection => {\n const newSelection = new Map(selection);\n\n for (let i = indices.length - 1; i >= 0; i--) {\n const currentIndex = indices[i]!;\n const previousIndex = indices[i - 1]!;\n\n const item = table.rowsByIndex().get(currentIndex)?.item;\n if (!item) {\n continue;\n }\n\n const itemId = table.trackBy(item);\n const previousItem = table.rowsByIndex().get(previousIndex)?.item;\n const previousItemId = previousItem ? table.trackBy(previousItem) : undefined;\n\n if (selection.has(previousItemId)) {\n newSelection.delete(itemId);\n }\n else {\n newSelection.set(itemId, item);\n }\n }\n return newSelection;\n });\n }\n\n private toggleSelectedItem(item: T): void {\n const table = this._table();\n const id = table.trackBy(item);\n\n table.updateSelectedItems(selection => {\n const next = new Map(selection);\n if (next.has(id)) {\n next.delete(id);\n }\n else {\n if (table.selectable() === 'single') {\n next.clear();\n }\n next.set(id, item);\n }\n return next;\n });\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Pipe, PipeTransform} from '@angular/core';\n\n/**\n * Formats a given number based on the provided {@link Intl.NumberFormat}.\n */\n@Pipe({name: 'sciNumber'})\nexport class SciNumberPipe implements PipeTransform {\n\n public transform(number: number | undefined, format: Intl.NumberFormat): string | undefined {\n return number !== undefined ? format.format(number) : undefined;\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, computed, input, Signal, TemplateRef} from '@angular/core';\nimport {SciTableCellLike, SciTableRow} from '../table.model';\nimport {NgTemplateOutlet} from '@angular/common';\nimport {coerceSignal, SciComponentOutletDirective, SciTooltipOnOverflowDirective} from '@scion/components/common';\nimport {Arrays, Objects} from '@scion/toolkit/util';\nimport {SciIconComponent} from '@scion/components/icon';\nimport {SciNumberPipe} from './number.pipe';\n\n@Component({\n selector: 'sci-table-cell',\n templateUrl: './table-cell.component.html',\n styleUrl: './table-cell.component.scss',\n host: {\n '[attr.data-type]': 'cell().column.type',\n '[attr.data-column]': 'cell().column.name',\n '[attr.data-value]': 'value()',\n '[attr.data-padding]': '!cell().column.padding ? false : null',\n '[attr.part]': 'partAttribute()',\n },\n imports: [\n NgTemplateOutlet,\n SciIconComponent,\n SciComponentOutletDirective,\n SciNumberPipe,\n ],\n hostDirectives: [\n SciTooltipOnOverflowDirective,\n ],\n})\nexport class SciTableCellComponent<T> {\n\n public readonly cell = input.required<SciTableCellLike>();\n public readonly row = input.required<SciTableRow<T>>();\n\n protected readonly template = this.computeTemplate();\n protected readonly templateContext = this.computeTemplateContext();\n protected readonly partAttribute = this.computePartAttribute();\n protected readonly value = this.computeValueAttribute();\n\n private computeTemplate(): Signal<TemplateRef<unknown> | null> {\n return computed(() => {\n const cell = this.cell();\n\n if (cell.type !== 'template') {\n return null;\n }\n\n return coerceSignal(cell.template.template)();\n });\n }\n\n private computeTemplateContext(): Signal<{$implicit: NonNullable<T>} | null> {\n return computed(() => {\n const cell = this.cell();\n const item = this.row().item!;\n\n if (cell.type !== 'template') {\n return null;\n }\n\n return {\n $implicit: item,\n ...Objects.entries(cell.template.context ?? {}).reduce((context, [key, value]) => ({\n ...context,\n [key]: coerceSignal(value)?.(), // eslint-disable-line @typescript-eslint/no-unnecessary-condition\n }), {}),\n };\n });\n }\n\n private computePartAttribute(): Signal<string> {\n return computed(() => {\n const cell = this.cell();\n const referenceType = cell.type === 'enum' ? cell.column.referenceType : undefined;\n\n return Arrays.distinct([\n // Enable column styling based on column type. For enum columns, resolves to the reference type, if any, i.e., boolean or icon.\n `column:${referenceType ?? cell.column.type}`,\n // Enable column styling based on column name.\n cell.column.name,\n // Enable row styling based on selection state.\n this.row().selected() ? 'row:selected' : 'row:not:selected',\n // Enable row styling based on active state.\n this.row().active() ? 'row:active' : 'row:not:active',\n // Enable row styling based on row bindings.\n ...Arrays.coerce(this.row().bindings?.parts()),\n ]).join(' ');\n });\n }\n\n private computeValueAttribute(): Signal<string | undefined> {\n return computed(() => {\n const cell = this.cell();\n const value = (() => {\n switch (cell.type) {\n case 'string':\n case 'number':\n return cell.value();\n case 'enum':\n return cell.value()?.value;\n case 'date':\n return cell.value()?.isoString;\n default:\n return undefined;\n }\n })();\n return value !== undefined ? `${value}` : undefined;\n });\n }\n}\n","@let cell = this.cell();\n\n@switch (cell.type) {\n @case ('template') {\n <ng-template *ngTemplateOutlet=\"template(); context: templateContext()\"/>\n }\n @case ('component') {\n <ng-container *sciComponentOutlet=\"cell.component\"/>\n }\n @case ('date') {\n {{cell.value()?.formatted}}\n }\n @case ('number') {\n {{cell.value() | sciNumber:cell.column.format()}}\n }\n @case ('enum') {\n @let value = cell.value();\n @if (value !== undefined) {\n @if (cell.column.format.icon && value.icon !== undefined) {\n <sci-icon [attr.title]=\"value.tooltip\">{{value.icon}}</sci-icon>\n }\n @if (cell.column.format.label) {\n <span>{{value.label}}</span>\n }\n }\n }\n @default {\n {{cell.value()}}\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, inject, input, output, viewChild} from '@angular/core';\nimport {SciTableEvent, SciTableRow} from '../table.model';\nimport {SciTableCellComponent} from '../table-cell/table-cell.component';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\nimport {SciTableSelectionService} from '../table-selection.service';\nimport {contributeMenu, SciToolbarComponent} from '@scion/components/menu';\nimport {UUID} from '@scion/toolkit/uuid';\nimport {SciIconComponent} from '@scion/components/icon';\n\n@Component({\n selector: 'sci-table-row',\n templateUrl: './table-row.component.html',\n styleUrl: './table-row.component.scss',\n imports: [\n SciTableCellComponent,\n SciToolbarComponent,\n SciIconComponent,\n ],\n host: {\n '[attr.data-active]': `row().active() ? '' : null`,\n '[attr.data-selected]': `row().selected() ? '' : null`,\n '[attr.data-hovered]': `row().hovered() ? '' : null`,\n '(click)': 'onRowClick($event)',\n '(dblclick)': 'onRowDblClick($event)',\n '(mouseenter)': 'onRowMouseEnter()',\n '(mouseleave)': 'onRowMouseLeave($event)',\n },\n})\nexport class SciTableRowComponent<T> {\n\n public readonly row = input.required<SciTableRow<T>>();\n public readonly primaryAction = output<SciTableEvent<T>>();\n\n protected readonly table = inject(ɵSCI_TABLE);\n protected readonly rowActionToolbar = viewChild(SciToolbarComponent);\n protected readonly rowActionsToolbarName = `toolbar:${UUID.randomUUID()}` as const;\n\n private readonly _selectionService = inject(SciTableSelectionService);\n\n constructor() {\n this.contributeRowActions();\n }\n\n protected onRowClick(event: PointerEvent): void {\n if (this.row().loading) {\n return;\n }\n void this._selectionService.onRowClick(this.row().index, event);\n }\n\n protected onRowDblClick(event: MouseEvent): void {\n if (this.row().loading) {\n return;\n }\n this.primaryAction.emit({sourceEvent: event, items: [this.row().item!]});\n }\n\n protected onRowMouseEnter(): void {\n this.table().hoveredIndex.set(this.row().index);\n }\n\n protected onRowMouseLeave(event: MouseEvent): void {\n const next = event.relatedTarget;\n // Do not unset hovered row when hovering a column resize splitter.\n if (next instanceof Element && next.closest('sci-splitter')) {\n return;\n }\n\n this.table().hoveredIndex.set(-1);\n }\n\n protected onActionToolbarClick(event: PointerEvent): void {\n event.stopPropagation(); // prevent selecting the row\n this.table().activeItem.set(this.row().item);\n }\n\n private contributeRowActions(): void {\n contributeMenu(this.rowActionsToolbarName, toolbar => {\n if (!this.row().loading) {\n this.table().rowActions?.(toolbar, this.row().item, this.row().index);\n }\n });\n }\n}\n","@let row = this.row();\n\n<!-- Row Icons -->\n@if (row.cells?.length) {\n @for (icon of row.bindings?.icons(); track $index) {\n <sci-icon>{{icon}}</sci-icon>\n }\n}\n\n<!-- Table Cells -->\n@for (cell of row.cells; track cell.column.name) {\n <sci-table-cell [cell]=\"cell\" [row]=\"row\"/>\n} @empty {\n @for (column of table().columns(); track column.name) {\n <div class=\"skeleton e2e-skeleton\" [attr.data-column]=\"column.name\"></div>\n }\n}\n\n<!--Row Actions -->\n@let hasRowActions = !!table().rowActions;\n@let isRowHovered = table().hoveredRow() === row;\n@let isRowActionMenuOpen = rowActionToolbar()?.menuOpen();\n\n@if (hasRowActions && (isRowHovered || isRowActionMenuOpen)) {\n <sci-toolbar [name]=\"rowActionsToolbarName\" (click)=\"onActionToolbarClick($event)\" class=\"row-actions\"/>\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Directive, inject} from '@angular/core';\nimport {SciTableSelectionService} from './table-selection.service';\n\n@Directive({\n selector: '[sciTableKeyboardNavigator]',\n host: {\n '[attr.tabindex]': '0', // required for keyboard navigation\n\n '(keydown.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n '(keydown.shift.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n '(keydown.control.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n '(keydown.meta.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n '(keydown.shift.control.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n '(keydown.shift.meta.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n\n '(keydown.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n '(keydown.shift.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n '(keydown.control.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n '(keydown.meta.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n '(keydown.shift.control.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n '(keydown.shift.meta.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n\n '(keydown.space)': 'isFromInput($event) || isFromButton($event) || selectionService.onSpace($event)',\n '(keydown.control.space)': 'isFromInput($event) || isFromButton($event) || selectionService.onSpace($event)',\n '(keydown.meta.space)': 'isFromInput($event) || isFromButton($event) || selectionService.onSpace($event)',\n\n '(keydown.control.a)': 'isFromInput($event) || selectionService.onControlA($event)',\n '(keydown.meta.a)': 'isFromInput($event) || selectionService.onControlA($event)',\n\n '(keydown.pageUp)': 'isFromInput($event) || selectionService.onPageUp($event)',\n '(keydown.shift.pageUp)': 'isFromInput($event) || selectionService.onPageUp($event)',\n '(keydown.control.pageUp)': 'isFromInput($event) || selectionService.onPageUp($event)',\n '(keydown.shift.control.pageUp)': 'isFromInput($event) || selectionService.onPageUp($event)',\n\n '(keydown.pageDown)': 'isFromInput($event) || selectionService.onPageDown($event)',\n '(keydown.shift.pageDown)': 'isFromInput($event) || selectionService.onPageDown($event)',\n '(keydown.control.pageDown)': 'isFromInput($event) || selectionService.onPageDown($event)',\n '(keydown.shift.control.pageDown)': 'isFromInput($event) || selectionService.onPageDown($event)',\n\n '(keydown.home)': 'isFromInput($event) || selectionService.onHome($event)',\n '(keydown.shift.home)': 'isFromInput($event) || selectionService.onHome($event)',\n '(keydown.control.home)': 'isFromInput($event) || selectionService.onHome($event)',\n '(keydown.shift.control.home)': 'isFromInput($event) || selectionService.onHome($event)',\n\n '(keydown.end)': 'isFromInput($event) || selectionService.onEnd($event)',\n '(keydown.shift.end)': 'isFromInput($event) || selectionService.onEnd($event)',\n '(keydown.control.end)': 'isFromInput($event) || selectionService.onEnd($event)',\n '(keydown.shift.control.end)': 'isFromInput($event) || selectionService.onEnd($event)',\n },\n})\nexport class SciTableKeyboardNavigatorDirective {\n\n protected readonly selectionService = inject(SciTableSelectionService);\n\n /**\n * Indicates whether the given keyboard event was triggered from an input element.\n */\n protected isFromInput(event: Event): boolean {\n if (event.target instanceof Element && event.target.closest('input, textarea, select') !== null) {\n return true;\n }\n if (event.target instanceof HTMLElement && event.target.isContentEditable) {\n return true;\n }\n return false;\n }\n\n /**\n * Indicates whether the given keyboard event was triggered from a button.\n */\n protected isFromButton(event: Event): boolean {\n return event.target instanceof Element && event.target.closest('button') !== null;\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {SciTableColumnLike} from '../table.model';\nimport {afterNextRender, computed, inject, Injectable, Injector, Signal, signal, WritableSignal} from '@angular/core';\nimport {clamp} from '@scion/toolkit/util';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\n\n@Injectable()\nexport class SciTableColumnService {\n\n private readonly _table = inject(ɵSCI_TABLE);\n private readonly _injector = inject(Injector);\n\n /**\n * State while resizing a column.\n */\n private readonly _resizingState = signal<ColumnResizingState | undefined>(undefined);\n\n /**\n * Provides the calculated CSS `grid-template-columns` value based on configured and resized column widths.\n */\n public readonly gridTemplateColumns = this.computeGridTemplateColumns();\n\n /**\n * Computes the CSS `grid-template-columns` value.\n *\n * Columns are layed out according to their configured widths. While resizing a column, absolute pixel widths are used.\n */\n private computeGridTemplateColumns(): Signal<string> {\n return computed(() => {\n return this._table().columns()\n .map(column => {\n const width = this._resizingState()?.columnWidths()?.get(column.name) ?? column.width();\n if (typeof width === 'number') {\n return `${width}px`;\n }\n if (width.endsWith('fr')) {\n return cssMinmax({min: column.minWidth, max: width});\n }\n return width;\n })\n .join(' ') || '100%'; // fill full width if no column\n });\n }\n\n public startResize(column: SciTableColumnLike): void {\n column.resizing.set(true);\n this._resizingState.set({column, columnWidths: signal(undefined)});\n }\n\n public resize(columnWidth: number | 'min-content'): void {\n const state = this._resizingState()!;\n const clampedWidth = typeof columnWidth === 'number' ? clamp(columnWidth, {min: state.column.minWidth}) : columnWidth;\n\n if (clampedWidth !== state.columnWidths()?.get(state.column.name)) {\n const columnWidths = this.calculateColumnWidths(state.column, clampedWidth);\n state.columnWidths.set(columnWidths);\n }\n }\n\n public endResize(): void {\n const {column} = this._resizingState()!;\n\n // Run on next render to update user settings with effective column widths read from the DOM.\n afterNextRender(() => {\n this.updateUserSettings(column);\n column.resizing.set(false);\n this._resizingState.set(undefined);\n }, {injector: this._injector});\n }\n\n /**\n * Updates user settings with current column widths.\n */\n private updateUserSettings(resizedColumn: SciTableColumnLike): void {\n const resizedColumnIndex = this._table().columns().indexOf(resizedColumn);\n this._table().userSettings.update(userSettings => ({\n ...userSettings,\n columns: this._table().columns().flatMap((column, index) => {\n const columnSettings = userSettings.columns?.find(it => it.name === column.name);\n // Store the width of the resized column and all columns to its left.\n if (index <= resizedColumnIndex) {\n return {\n ...columnSettings ?? {name: column.name},\n width: column.location.width,\n };\n }\n\n return columnSettings ?? [];\n }),\n }));\n }\n\n /**\n * Calculates absolute column widths based on the resized column's new width.\n *\n * Any remaining viewport space is distributed proportionally among flex-sized columns using their current width ratio.\n */\n private calculateColumnWidths(columnToResize: SciTableColumnLike, newColumnWidth: number | 'min-content'): Map<`column:${string}`, number | 'min-content'> {\n const columns = this._table().columns();\n const columnIndex = columns.indexOf(columnToResize);\n\n return columns.reduce((map, column, index) => {\n if (index < columnIndex) {\n return map.set(column.name, column.location.width); // columns to the left are fixed\n }\n if (index === columnIndex) {\n return map.set(column.name, newColumnWidth);\n }\n return map;\n }, new Map<`column:${string}`, number | 'min-content'>());\n }\n}\n\n/**\n * State of an active column resize operation.\n */\ninterface ColumnResizingState {\n /**\n * Column being resized.\n */\n column: SciTableColumnLike;\n /**\n * Map of column names to their pixel widths.\n */\n columnWidths: WritableSignal<Map<`column:${string}`, number | 'min-content'> | undefined>;\n}\n\n/**\n * Creates a minmax() CSS function with the given min/max for use in a CSS grid.\n */\nfunction cssMinmax(minmax: {min: number; max: number | string}): string {\n const min = `${minmax.min}px`;\n const max = typeof minmax.max === 'number' ? `${minmax.max}px` : minmax.max;\n return `minmax(${min}, ${max})`;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, effect, ElementRef, inject, input, untracked} from '@angular/core';\nimport {SciTableColumnLike} from '../table.model';\n\n@Component({\n selector: 'sci-table-column',\n template: '',\n host: {\n '[attr.data-column]': 'column().name',\n '[style.min-width.px]': 'column().minWidth', // required when resizing the column to its preferred size to not drop below min-width.\n },\n})\nexport class SciTableColumnComponent {\n\n public readonly column = input.required<SciTableColumnLike>();\n\n constructor() {\n this.injectLocationToColumn();\n }\n\n private injectLocationToColumn(): void {\n const element = inject(ElementRef).nativeElement as HTMLElement;\n\n effect(onCleanup => {\n const column = this.column();\n\n untracked(() => {\n const location = column.location = {\n get x(): number {\n return element.getBoundingClientRect().left;\n },\n get width(): number {\n return element.offsetWidth;\n },\n };\n onCleanup(() => {\n if (column.location === location) {\n column.location = {x: 0, width: 0};\n }\n });\n });\n });\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, inject, input, signal} from '@angular/core';\nimport {SciSplitterComponent, SplitterMoveEvent} from '@scion/components/splitter';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\nimport {SciTableColumnLike} from '../table.model';\nimport {SciTableRowComponent} from '../table-row/table-row.component';\nimport {SciTableColumnService} from '../table-column/table-column.service';\nimport {SciTableColumnComponent} from '../table-column/table-column.component';\n\n@Component({\n selector: 'sci-table-columns',\n templateUrl: './table-columns.component.html',\n styleUrl: './table-columns.component.scss',\n imports: [\n SciSplitterComponent,\n SciTableColumnComponent,\n ],\n})\nexport class SciTableColumnsComponent<T> {\n\n public readonly rows = input.required<readonly SciTableRowComponent<unknown>[]>();\n\n protected readonly table = inject(ɵSCI_TABLE);\n\n private readonly _hovered = signal(false);\n private readonly _columnService = inject(SciTableColumnService);\n\n protected onResizeStart(column: SciTableColumnLike): void {\n this._columnService.startResize(column);\n }\n\n protected onResize(column: SciTableColumnLike<T>, event: SplitterMoveEvent): void {\n const pointerPosition = event.position.clientPos; // TODO [dwi] Change to screen coordinates to work with microfrontends\n const columnStart = column.location.x - 1; // -1 because splitters are positioned at the end of cell content\n const newColumnWidth = pointerPosition - columnStart;\n this._columnService.resize(newColumnWidth);\n }\n\n protected onResizeEnd(): void {\n this._columnService.endResize();\n\n // Clear the hovered row when resizing ends outside the splitter (for example, above or below it).\n if (!this._hovered()) {\n this.table().hoveredIndex.set(-1);\n }\n }\n\n /**\n * Resizes the column to its preferred size.\n */\n protected onPack(column: SciTableColumnLike): void {\n this._columnService.startResize(column);\n this._columnService.resize('min-content');\n this._columnService.endResize();\n }\n\n protected onMouseEnter(): void {\n this._hovered.set(true);\n }\n\n protected onMouseLeave(): void {\n this._hovered.set(false);\n\n // Do not clear the hovered row while dragging the resize handle, or quick movements will accidentally clear it.\n // If the mouse leaves the splitter during drag (above or below), the hovered row is unset when resizing ends.\n if (!this.table().resizing()) {\n this.table().hoveredIndex.set(-1);\n }\n }\n}\n","<!-- Render splitters, also for non-resizable columns, as non-interactive column header dividers. -->\n@for (column of table().columns(); track column.name; let i = $index) {\n <sci-splitter orientation=\"vertical\"\n [class.resizing]=\"column.resizing()\"\n [attr.data-column]=\"column.name\"\n [attr.data-non-interactive]=\"!column.resizable() ? '' : null\"\n [style.grid-column]=\"i + 1\"\n (start)=\"onResizeStart(column)\"\n (move)=\"onResize(column, $event)\"\n (end)=\"onResizeEnd()\"\n (reset)=\"onPack(column)\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"/>\n}\n\n<!-- Render an invisible synthetic column per column to read current widths and set minimum widths. -->\n@for (column of table().columns(); track column.name; let i = $index) {\n <sci-table-column [column]=\"column\" [style.grid-column]=\"i + 1\"/>\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, computed, ElementRef, inject} from '@angular/core';\nimport {ɵSCI_TABLE} from './ɵtable.model';\n\n/**\n * Represents a semantic element for the table viewport provided as slotted content.\n */\n@Component({\n selector: 'sci-table-viewport',\n template: '<ng-content/>',\n host: {\n '[style.--ɵsci-table-viewport-width]': '`${table().tableViewRef()?.viewportWidth() ?? 0}px`',\n '[style.--ɵsci-table-viewport-height]': '`${viewportHeight() ?? 0}px`',\n '[style.--ɵsci-table-viewport-client-width]': '`${table().tableViewRef()?.viewportClientWidth() ?? 0}px`',\n '[style.--ɵsci-table-viewport-client-height]': '`${table().tableViewRef()?.viewportClientHeight() ?? 0}px`',\n '[style.--ɵsci-table-header-height]': '`${table().tableViewRef()?.headerHeight() ?? 0}px`',\n '[style.--ɵsci-table-cell-padding-inline]': '`${table().tableViewRef()?.cellPadding() ?? 0}px`',\n '[style.--ɵsci-table-row-height]': '`${table().tableViewRef()?.itemHeight() ?? 0}px`',\n },\n})\nexport class SciTableViewportComponent {\n\n public readonly host = inject(ElementRef).nativeElement as HTMLElement;\n\n protected readonly table = inject(ɵSCI_TABLE);\n protected readonly viewportHeight = computed(() => {\n const viewportHeight = this.table().tableViewRef()?.viewportHeight() ?? 0;\n const headerHeight = this.table().tableViewRef()?.headerHeight() ?? 0;\n return viewportHeight + headerHeight;\n });\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, inject} from '@angular/core';\nimport {SciTableColumnService} from './table-column/table-column.service';\nimport {ɵSCI_TABLE} from './ɵtable.model';\n\n/**\n * Represents a semantic element for the table body provided as slotted content.\n */\n@Component({\n selector: 'sci-table-grid',\n template: '<ng-content/>',\n providers: [\n SciTableColumnService,\n ],\n host: {\n '[style.--ɵsci-table-columns]': 'gridTemplateColumns()',\n '[style.--ɵsci-table-virtual-scroll-offset-top]': '`${table().virtualScrollOffset().top}px`',\n '[style.--ɵsci-table-virtual-scroll-offset-bottom]': '`${table().virtualScrollOffset().bottom}px`',\n },\n})\nexport class SciTableGridComponent {\n\n protected readonly table = inject(ɵSCI_TABLE);\n protected readonly gridTemplateColumns = inject(SciTableColumnService).gridTemplateColumns;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component} from '@angular/core';\n\n/**\n * Represents a semantic element for the table body provided as slotted content.\n */\n@Component({\n selector: 'sci-table-body',\n template: '<ng-content/>',\n})\nexport class SciTableBodyComponent {\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, computed, ElementRef, inject, input, Provider, viewChild} from '@angular/core';\nimport {SciTableColumnLike} from '../table.model';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\nimport {SciIconComponent} from '@scion/components/icon';\nimport {NgTemplateOutlet} from '@angular/common';\nimport {SciTooltipOnOverflowDirective, TOOLTIP_ON_OVERFLOW_DIRECTIVE_ADDITIONAL_TEXT, TOOLTIP_ON_OVERFLOW_DIRECTIVE_SOURCE_ELEMENT} from '@scion/components/common';\n\n@Component({\n selector: 'sci-column-header',\n imports: [\n SciIconComponent,\n NgTemplateOutlet,\n ],\n templateUrl: './column-header.component.html',\n styleUrl: './column-header.component.scss',\n host: {\n '[attr.data-column]': 'column().name',\n },\n hostDirectives: [\n SciTooltipOnOverflowDirective,\n ],\n providers: [\n configureTooltip(),\n ],\n})\nexport class SciColumnHeaderComponent<T> {\n\n public readonly column = input.required<SciTableColumnLike<T>>();\n public readonly labelElement = viewChild<ElementRef<HTMLElement>>('label'); // public visibility required to be accessible in `configureTooltip` function\n\n protected readonly table = inject(ɵSCI_TABLE);\n protected readonly sortDirection = computed(() => this.table().sortCriteria().find(criteria => criteria.columnName === this.column().name)?.direction);\n\n protected onSort(event: PointerEvent): void {\n this.table().sort(this.column().name, event.ctrlKey || event.metaKey);\n }\n}\n\nfunction configureTooltip(): Provider[] {\n return [\n {\n provide: TOOLTIP_ON_OVERFLOW_DIRECTIVE_ADDITIONAL_TEXT,\n useFactory: () => {\n const host = inject(SciColumnHeaderComponent);\n return computed(() => host.column().header.tooltip?.());\n },\n },\n {\n provide: TOOLTIP_ON_OVERFLOW_DIRECTIVE_SOURCE_ELEMENT,\n useFactory: () => inject(SciColumnHeaderComponent).labelElement,\n },\n ];\n}\n","@if (column().sortable()) {\n <button class=\"sort e2e-sort\"\n [attr.data-sort-direction]=\"sortDirection()\"\n (click)=\"onSort($event)\">\n <!-- Header -->\n <ng-container *ngTemplateOutlet=\"header_template\"/>\n\n <!-- Sort Indicator -->\n @switch (sortDirection()) {\n @case ('asc') {\n <sci-icon>scion:sort_ascending</sci-icon>\n }\n @case ('desc') {\n <sci-icon>scion:sort_descending</sci-icon>\n }\n @default {\n <sci-icon class=\"no-sort\">scion:sort_indicator</sci-icon>\n }\n }\n </button>\n} @else {\n <ng-container *ngTemplateOutlet=\"header_template\"/>\n}\n\n<ng-template #header_template>\n @if (column().header.icon) {\n <sci-icon class=\"icon e2e-icon\">{{column().header.icon}}</sci-icon>\n }\n\n @if (column().header.label) {\n <span [class.wrap]=\"table().wrapHeader()\" class=\"label\" #label>\n {{column().header.label!()}}\n </span>\n }\n</ng-template>\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {computed, inject, Injector, Pipe, PipeTransform, Signal, untracked} from '@angular/core';\nimport {text} from '@scion/components/text';\nimport {SciEnumColumnValues, SciEnumValueLike} from '../table.model';\nimport {Arrays} from '@scion/toolkit/util';\n\n/**\n * Creates a comma-separated string with localized labels of the given enum values.\n */\n@Pipe({name: 'sciEnumLabel'})\nexport class SciEnumLabelPipe implements PipeTransform {\n\n private readonly _injector = inject(Injector);\n\n public transform(values: SciEnumValueLike | SciEnumValueLike[] | null, enumeration: SciEnumColumnValues): Signal<string | undefined> {\n return computed(() => Arrays.coerce(values)\n .map(value => enumeration.find(entry => entry.value === value)?.label)\n .map(label => untracked(() => text(label, {injector: this._injector}))())\n .filter(Boolean)\n .join(', ') || undefined);\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, computed, debounced, effect, ElementRef, inject, Injector, input, Provider, runInInjectionContext, signal, untracked, viewChild} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {SciEnumColumn, SciEnumValueLike, SciTableColumnLike} from '../table.model';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\nimport {SciIconComponent} from '@scion/components/icon';\nimport {firstValueFrom, skip, timer} from 'rxjs';\nimport {contributeMenu, SciMenuRef, ɵSciMenuService} from '@scion/components/menu';\nimport {toObservable} from '@angular/core/rxjs-interop';\nimport {SciTooltipOnOverflowDirective, TOOLTIP_ON_OVERFLOW_DIRECTIVE_SOURCE_ELEMENT, ɵcreateDestroyableInjector} from '@scion/components/common';\nimport {SciEnumLabelPipe} from './enum-label.pipe';\nimport {UUID} from '@scion/toolkit/uuid';\nimport {SciTextPipe} from '@scion/components/text';\nimport {dimension} from '@scion/components/dimension';\n\n@Component({\n selector: 'sci-column-filter',\n templateUrl: './column-filter.component.html',\n styleUrl: './column-filter.component.scss',\n imports: [\n FormsModule,\n SciIconComponent,\n SciEnumLabelPipe,\n SciTextPipe,\n ],\n hostDirectives: [\n SciTooltipOnOverflowDirective,\n ],\n host: {\n '[attr.data-column]': 'column().name',\n '[attr.data-disabled]': `!column().filterable() ? '' : null`,\n '[class.collapsed]': 'dimension().clientWidth < 50',\n '(click)': 'column().filterable() && onFilterClick()',\n },\n providers: [\n configureTooltip(),\n ],\n})\nexport class SciColumnFilterComponent<T> {\n\n public readonly column = input.required<SciTableColumnLike<T>>();\n public readonly inputElement = viewChild<ElementRef<HTMLElement>>('input'); // public visibility required to be accessible in `configureTooltip` function\n\n protected readonly filter = signal<string | number | boolean | SciEnumValueLike | SciEnumValueLike[] | null>(null);\n protected readonly dimension = dimension(inject(ElementRef));\n\n private readonly _table = inject(ɵSCI_TABLE);\n private readonly _menuService = inject(ɵSciMenuService);\n private readonly _injector = inject(Injector);\n private readonly _host = inject(ElementRef).nativeElement as HTMLElement;\n\n protected menu: SciMenuRef | undefined;\n\n constructor() {\n this.bindToModel();\n }\n\n protected onFilterClick(): void {\n if (this.column().type === 'enum') {\n this.toggleEnumChooser();\n }\n else {\n this.inputElement()!.nativeElement.focus();\n }\n }\n\n protected onReset(event: PointerEvent): void {\n this.filter.set(null);\n this.inputElement()!.nativeElement.focus();\n event.stopPropagation(); // prevent opening menu\n }\n\n private bindToModel(): void {\n const filterDebounced = debounced(computed(() => trim(this.filter())), async value => {\n // Debounce only if not empty and not an enum.\n if (value !== null && this.column().type !== 'enum') {\n await firstValueFrom(timer(200));\n }\n });\n\n effect(() => {\n const filter = filterDebounced.value();\n const table = this._table();\n const column = this.column();\n\n untracked(() => {\n table.filter(filter, {columnName: column.name});\n });\n });\n }\n\n private toggleEnumChooser(): void {\n // Close menu if already opened.\n if (this.menu) {\n this.menu.close();\n return;\n }\n\n const column = this.column() as SciEnumColumn;\n const injector = ɵcreateDestroyableInjector({parent: this._injector});\n\n runInInjectionContext(injector, () => {\n const menuId = `menu:column-filter-${UUID.randomUUID()}` as const;\n\n // Contribute menu items.\n contributeMenu(menuId, menu => {\n const multi = column.filterable() === 'multi';\n\n column.enumeration().forEach(entry => menu.addMenuItem({\n label: entry.label,\n checked: multi ? computed(() => (this.filter() as SciEnumValueLike[] | null)?.includes(entry.value) ?? false) : undefined,\n icon: column.format.filter.icon ? entry.icon : undefined,\n attributes: {'data-option': `${entry.value}`},\n onSelect: () => this.filter.update(filter => {\n if (multi) {\n const values = new Set<SciEnumValueLike>(filter as SciEnumValueLike[] | null ?? []);\n values.has(entry.value) ? values.delete(entry.value) : values.add(entry.value);\n return values.size ? Array.from(values) : null;\n }\n else {\n return entry.value;\n }\n }),\n }));\n });\n\n // Open menu.\n this.menu = this._menuService.open(menuId, {\n anchor: this._host,\n minWidth: `${this._host.offsetWidth}px`,\n maxHeight: '300px',\n cssClass: 'e2e-filter',\n filter: column.enumeration().length >= 8 ? {focus: true} : false,\n maxWidth: `max(300px, ${this._host.offsetWidth}px)`, // overflow long enumeration labels\n offset: {y: -1},\n });\n\n // Close menu when start resizing a column. By default, closes the menu only on mouse up.\n toObservable(this._table().resizing)\n .pipe(skip(1))\n .subscribe(() => this.menu?.close());\n\n this.menu.onClose(() => {\n injector.destroy();\n // Restore focus manually as it is not restored automatically since opening the popover inside Shadow DOM.\n // TODO [menu] Consider restore focus manually in Menu API due to restriction in shadow DOM.\n this.inputElement()!.nativeElement.focus();\n this.menu = undefined;\n });\n });\n }\n}\n\nfunction trim(value: string | number | boolean | SciEnumValueLike | SciEnumValueLike[] | null): string | number | boolean | SciEnumValueLike | SciEnumValueLike[] | null {\n return typeof value === 'string' ? value.trim() || null : value;\n}\n\nfunction configureTooltip(): Provider[] {\n return [\n {\n provide: TOOLTIP_ON_OVERFLOW_DIRECTIVE_SOURCE_ELEMENT,\n useFactory: () => inject(SciColumnFilterComponent).inputElement,\n },\n ];\n}\n","@let column = this.column();\n@if (column.filterable()) {\n @let active = filter() !== null && filter() !== '';\n\n <sci-icon class=\"filter e2e-filter\" [class.active]=\"active\">scion:filter</sci-icon>\n\n @switch (column.type) {\n @case ('number') {\n <input [(ngModel)]=\"filter\" type=\"number\" #input/>\n }\n @case ('enum') {\n <input [ngModel]=\"(filter() | sciEnumLabel:column.enumeration())()\" type=\"button\" #input>\n <sci-icon class=\"chevron\">{{menu ? 'scion:chevron_up' : 'scion:chevron_down'}}</sci-icon>\n }\n @default {\n <input [(ngModel)]=\"filter\" type=\"text\" #input/>\n }\n }\n\n @if (active) {\n <button class=\"clear e2e-clear\" (click)=\"onReset($event)\" [attr.title]=\"('%scion:components:clear.tooltip' | sciText)()\">\n <sci-icon>scion:clear</sci-icon>\n </button>\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, inject} from '@angular/core';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\nimport {SciColumnHeaderComponent} from '../column-header/column-header.component';\nimport {SciColumnFilterComponent} from '../column-filter/column-filter.component';\n\n@Component({\n selector: 'sci-table-header',\n templateUrl: './table-header.component.html',\n styleUrl: './table-header.component.scss',\n host: {\n '(wheel)': 'onMouseWheel($event)',\n },\n imports: [\n SciColumnHeaderComponent,\n SciColumnFilterComponent,\n ],\n})\nexport class SciTableHeaderComponent {\n\n protected readonly table = inject(ɵSCI_TABLE);\n\n protected onMouseWheel(event: WheelEvent): void {\n // Prevent vertical scrolling on header, but not horizontal scrolling.\n if (!event.shiftKey) {\n event.preventDefault();\n }\n }\n}\n","@let table = this.table();\n\n@if (table.showHeader()) {\n @for (column of table.columns(); track column.name) {\n <sci-column-header [column]=\"column\"/>\n }\n}\n@if (table.filterable()) {\n @for (column of table.columns(); track column.name) {\n <sci-column-filter [column]=\"column\"/>\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, computed, effect, ElementRef, inject, input, output, Provider, untracked, viewChild, viewChildren, ViewEncapsulation} from '@angular/core';\nimport {SciTable, SciTableEvent} from './table.model';\nimport {ɵSCI_TABLE, ɵSciTable} from './ɵtable.model';\nimport {SciScrollbarComponent} from '@scion/components/viewport';\nimport {dimension} from '@scion/components/dimension';\nimport {SciTableSelectionService} from './table-selection.service';\nimport {SciTableRowComponent} from './table-row/table-row.component';\nimport {SciTableKeyboardNavigatorDirective} from './table-keyboard-navigator.directive';\nimport {SciTableColumnsComponent} from './table-columns/table-columns.component';\nimport {SciTextPipe} from '@scion/components/text';\nimport {SciThrobberComponent} from '@scion/components/throbber';\nimport {SciTableViewportComponent} from './table-viewport.component';\nimport {SciTableGridComponent} from './table-grid.component';\nimport {SciTableBodyComponent} from './table-body.component';\nimport {SciTableHeaderComponent} from './table-header/table-header.component';\nimport {SciAttributesDirective} from '@scion/components/common';\nimport {SciIconComponent} from '@scion/components/icon';\n\n/**\n * @experimental since 22.3.0; API and behavior may change in any version without notice.\n */\n@Component({\n selector: 'sci-table',\n templateUrl: './table.component.html',\n styleUrl: './table.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n host: {\n '[attr.name]': 'name()', // Public API: Enables selecting the table by name in CSS (also if the table has a dynamic name input binding)\n '[style.--ɵsci-table-scrolling]': 'table().scrolling() ? `true` : null',\n '[style.--ɵsci-table-resizing]': 'table().resizing() ? `true` : null',\n },\n imports: [\n SciTableViewportComponent,\n SciTableHeaderComponent,\n SciTableGridComponent,\n SciTableBodyComponent,\n SciTableRowComponent,\n SciTableColumnsComponent,\n SciTableKeyboardNavigatorDirective,\n SciAttributesDirective,\n SciScrollbarComponent,\n SciTextPipe,\n SciThrobberComponent,\n SciIconComponent,\n ],\n providers: [\n provideSciTable(),\n SciTableSelectionService,\n ],\n})\nexport class SciTableComponent<T = unknown> {\n\n /**\n * Specifies a unique table identifier, used as the key for storing user preferences.\n */\n public readonly name = input.required<`table:${string}`>();\n\n /**\n * Specifies the table definition and datasource.\n */\n public readonly table = input.required({transform: (table: SciTable<T>) => table as ɵSciTable<T>});\n\n /**\n * Emits when the user double-clicks a row or presses `Enter` on selected rows.\n */\n public readonly primaryAction = output<SciTableEvent<T>>();\n\n private readonly _viewport = viewChild.required(SciTableViewportComponent, {read: ElementRef});\n private readonly _viewportClient = viewChild.required(SciTableGridComponent, {read: ElementRef});\n private readonly _tableHeader = viewChild(SciTableHeaderComponent, {read: ElementRef});\n private readonly _tableBody = viewChild.required(SciTableBodyComponent, {read: ElementRef});\n private readonly _itemSizeSyntheticElement = viewChild.required<ElementRef<HTMLElement>>('item_size_synthetic_element');\n private readonly _cellPaddingSyntheticElement = viewChild.required<ElementRef<HTMLElement>>('cell_padding_synthetic_element');\n\n protected readonly rows = viewChildren(SciTableRowComponent);\n\n constructor() {\n this.connectToModel();\n this.scrollActiveRowIntoViewport();\n }\n\n protected onRowPrimaryAction(event: SciTableEvent<T>): void {\n this.primaryAction.emit(event);\n }\n\n protected onRetry(): void {\n this.table().reset();\n }\n\n private connectToModel(): void {\n const viewportDimension = dimension(this._viewport);\n const viewportClientDimension = dimension(this._viewportClient);\n const tableHeaderDimension = dimension(this._tableHeader);\n const tableBodyDimension = dimension(this._tableBody);\n const cellPadding = dimension(this._cellPaddingSyntheticElement);\n const itemSizeDimension = dimension(this._itemSizeSyntheticElement);\n\n effect(onCleanup => {\n const name = this.name();\n const table = this.table();\n const viewport = this._viewport().nativeElement as HTMLElement;\n\n untracked(() => {\n table.connect(name, {\n viewport: viewport,\n viewportHeight: computed(() => viewportDimension().clientHeight - (tableHeaderDimension()?.offsetHeight ?? 0)),\n viewportWidth: computed(() => viewportDimension().clientWidth),\n viewportClientHeight: computed(() => viewportClientDimension().offsetHeight),\n viewportClientWidth: computed(() => tableBodyDimension().offsetWidth), // Use `table-body` instead of `table-grid` because `table-grid` has `min-width: 100%`, thus never shrinking below viewport width.\n cellPadding: computed(() => cellPadding().clientWidth),\n headerHeight: computed(() => tableHeaderDimension()?.offsetHeight ?? 0),\n itemHeight: computed(() => itemSizeDimension().offsetHeight),\n scrollToTop: () => viewport.scrollTo({top: 0}),\n });\n onCleanup(() => table.disconnect());\n });\n });\n }\n\n private scrollActiveRowIntoViewport(): void {\n effect(() => {\n const activeRow = this.table().activeRow();\n if (!activeRow) {\n return;\n }\n\n untracked(() => {\n const viewport = this._viewport().nativeElement as HTMLElement;\n const viewportHeight = this.table().tableViewRef()?.viewportHeight() ?? 0;\n const itemHeight = this.table().tableViewRef()?.itemHeight() ?? 0;\n const activeRowTop = activeRow.index * itemHeight;\n const activeRowBottom = activeRowTop + itemHeight;\n const scrollTop = viewport.scrollTop;\n const scrollBottom = scrollTop + viewportHeight;\n\n if (activeRowTop < scrollTop) {\n viewport.scrollTop = activeRowTop;\n }\n else if (activeRowBottom > scrollBottom) {\n viewport.scrollTop = activeRowBottom - viewportHeight;\n }\n });\n });\n }\n}\n\nfunction provideSciTable(): Provider {\n return {\n provide: ɵSCI_TABLE,\n useFactory: () => inject(SciTableComponent).table,\n };\n}\n","@let table = this.table();\n\n<!-- TODO [#384] Replace with sci-viewport -->\n<sci-table-viewport #viewport>\n <sci-table-grid>\n <!-- Table header -->\n @if (table.showHeader() || table.filterable()) {\n <sci-table-header/>\n }\n\n <!-- Table body -->\n <sci-table-body sciTableKeyboardNavigator>\n @if (!table.error()) {\n <!-- Track index to reuse the table row elements -->\n @for (row of table.rows(); track $index) {\n <sci-table-row [row]=\"row\" [sciAttributes]=\"row.bindings?.attributes()\" [class]=\"row.bindings?.classes?.()\" (primaryAction)=\"onRowPrimaryAction($event)\"/>\n } @empty {\n <span class=\"message e2e-no-data\">{{('%scion:components:no_items.message' | sciText)()}}</span>\n }\n } @else {\n <span class=\"message e2e-datasource\">\n {{('%scion:components:datasource_error.message' | sciText)()}}\n\n <button (click)=\"onRetry()\" class=\"action e2e-datasource-retry\">\n <sci-icon>scion:reload</sci-icon>\n <span>{{('%scion:components:retry.action' | sciText)()}}</span>\n </button>\n </span>\n }\n\n <!-- Render active row outline separately to preserve row border-radius within block selection. -->\n @if (table.activeRow()) {\n <div class=\"active-row-outline e2e-active-row-outline\"></div>\n }\n </sci-table-body>\n\n <!-- Render column splitters. -->\n <sci-table-columns [rows]=\"rows()\"/>\n </sci-table-grid>\n</sci-table-viewport>\n\n<!-- Scrollbars -->\n<sci-scrollbar direction=\"hscroll\" [viewport]=\"viewport.host\"/>\n<sci-scrollbar direction=\"vscroll\" [viewport]=\"viewport.host\"/>\n\n@if (table.loading()) {\n <sci-throbber type=\"spinner\" class=\"loading-indicator e2e-loading-indicator\"/>\n}\n\n<!-- Synthetic element to compute the absolute pixel value of the `--sci-table-row-height`, relative to the table's font size if em-based. -->\n<div class=\"synthetic item-size\" #item_size_synthetic_element></div>\n\n<!-- Synthetic element to compute the absolute pixel value of the `--sci-table-cell-padding-inline`, relative to the table's font size if em-based. -->\n<div class=\"synthetic cell-padding\" #cell_padding_synthetic_element></div>\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nexport {table, type SciTableColumnFactoryFn} from './table.factory';\nexport {SciTableComponent} from './table.component';\nexport {type SciTable, type SciTableDescriptor, type SciTableRowActionFactoryFn, type SciTableColumnType, type SciTableEvent, type SciTableCellContext, type SciColumnHeaderLike, type SciDateLike, type SciEnumValueLike, type SciEnumColumnValues, type SciIconColumnValues} from './table.model';\nexport {type SciTableRowBindingFactoryFn, type SciTableRowBindingFactory, provideTableRowBinding} from './table-row-binding';\nexport {type SciTableDataLoaderFn, type SciTablePageResponse, type SciTablePageRequest, type SciTableColumnFilter, type SciTableSortCriterion, ɵillegaldatasource} from './table-datasource';\nexport {type SciTableColumnFactory, type SciTableColumnDescriptor, type SciStringColumnDescriptor, type SciNumberColumnDescriptor, type SciBooleanColumnDescriptor, type SciDateColumnDescriptor, type SciEnumColumnDescriptor, type SciIconColumnDescriptor, type SciComponentColumnDescriptor, type SciTemplateColumnDescriptor, type SciTableColumnSortComparatorFn, type SciTableColumnFilterMatcherFn} from './table-column.factory';\nexport {type SciTableStorage, provideTableStorage} from './table-storage';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["ɵSingleActiveInjectorFactory","ɵcreateDestroyableInjector","configureTooltip","ɵSciMenuService"],"mappings":"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"}
1
+ {"version":3,"file":"scion-components-table.mjs","sources":["../../../../projects/scion/components/table/src/ɵtable-cell-value-preloader.ts","../../../../projects/scion/components/table/src/table-cell-value-preloader.ts","../../../../projects/scion/components/table/src/in-memory-table-datasource.ts","../../../../projects/scion/components/table/src/table-datasource.ts","../../../../projects/scion/components/table/src/table.model.ts","../../../../projects/scion/components/table/src/table-date-column.model.ts","../../../../projects/scion/components/table/src/table-enum-column.model.ts","../../../../projects/scion/components/table/src/ɵtable-column.factory.ts","../../../../projects/scion/components/table/src/table.cache.ts","../../../../projects/scion/components/table/src/table-row-binding.ts","../../../../projects/scion/components/table/src/table-tree.model.ts","../../../../projects/scion/components/table/src/ɵtable.model.ts","../../../../projects/scion/components/table/src/table.factory.ts","../../../../projects/scion/components/table/src/common.ts","../../../../projects/scion/components/table/src/table-selection.service.ts","../../../../projects/scion/components/table/src/table-cell/number.pipe.ts","../../../../projects/scion/components/table/src/table-cell/table-cell.component.ts","../../../../projects/scion/components/table/src/table-cell/table-cell.component.html","../../../../projects/scion/components/table/src/table-row/table-row.component.ts","../../../../projects/scion/components/table/src/table-row/table-row.component.html","../../../../projects/scion/components/table/src/table-keyboard-navigator.directive.ts","../../../../projects/scion/components/table/src/table-column/table-column.service.ts","../../../../projects/scion/components/table/src/table-column/table-column.component.ts","../../../../projects/scion/components/table/src/table-columns/table-columns.component.ts","../../../../projects/scion/components/table/src/table-columns/table-columns.component.html","../../../../projects/scion/components/table/src/table-viewport.component.ts","../../../../projects/scion/components/table/src/table-grid.component.ts","../../../../projects/scion/components/table/src/table-body.component.ts","../../../../projects/scion/components/table/src/column-header/column-header.component.ts","../../../../projects/scion/components/table/src/column-header/column-header.component.html","../../../../projects/scion/components/table/src/column-filter/enum-label.pipe.ts","../../../../projects/scion/components/table/src/column-filter/column-filter.component.ts","../../../../projects/scion/components/table/src/column-filter/column-filter.component.html","../../../../projects/scion/components/table/src/table-header/table-header.component.ts","../../../../projects/scion/components/table/src/table-header/table-header.component.html","../../../../projects/scion/components/table/src/table.component.ts","../../../../projects/scion/components/table/src/table.component.html","../../../../projects/scion/components/table/src/public_api.ts","../../../../projects/scion/components/table/src/scion-components-table.ts"],"sourcesContent":["import {computed, DestroyRef, inject, Injectable, Injector, onIdle, runInInjectionContext, signal, untracked} from '@angular/core';\nimport {LatestTaskExecutor} from '@scion/toolkit/common';\nimport {SciTableCellValuePreloader} from './table-cell-value-preloader';\n\n/** @inheritDoc */\n@Injectable()\nexport class ɵSciTableCellValuePreloader implements SciTableCellValuePreloader {\n\n private readonly _executor = new LatestTaskExecutor();\n private readonly _queue = new Array<() => void>(); // PERF: Do not change to signal to avoid array re-allocation on enqueue (expensive); queue size is tracked via a separate signal.\n private readonly _queueSize = signal(0);\n private readonly _injector = inject(Injector);\n\n /** @inheritDoc */\n public readonly loading = computed(() => this._queueSize() > 0);\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this._executor.destroy();\n this.clear();\n });\n }\n\n /** @inheritDoc */\n public queue(cellValueFn: () => void): void {\n this._queue.push(cellValueFn);\n this._queueSize.update(size => size + 1);\n\n this._executor.submit(() => this.whenIdle().then(() => this.preloadQueuedBatch(PRELOAD_BATCH_SIZE)));\n }\n\n /** @inheritDoc */\n public clear(): void {\n this._queue.length = 0;\n untracked(() => this._queueSize.set(0));\n }\n\n /**\n * Preloads the next batch of queued cell values, FIFO, then, if the queue is not empty, schedules the next batch.\n */\n private async preloadQueuedBatch(batchSize: number): Promise<void> {\n this._queue.splice(0, batchSize).forEach(fn => fn());\n this._queueSize.set(this._queue.length);\n\n // Preload next batch when idle again.\n if (this._queue.length) {\n this._executor.submit(() => this.whenIdle().then(() => this.preloadQueuedBatch(PRELOAD_BATCH_SIZE)));\n }\n }\n\n /**\n * Resolves when the browser becomes idle.\n *\n * @see onIdle\n */\n private whenIdle(): Promise<void> {\n return runInInjectionContext(this._injector, onIdle);\n }\n}\n\nconst PRELOAD_BATCH_SIZE = 50_000;\n","import {Injectable, Signal} from '@angular/core';\nimport {ɵSciTableCellValuePreloader} from './ɵtable-cell-value-preloader';\n\n/**\n * Preloads cell values in the background when the browser is idle. This prevents lag with large datasets, in particular\n * for expensive computations like formatting dates and generating ISO 8601 strings, providing faster sort and filter performance.\n *\n * If a cell's value is requested before background preloading finishes, it is computed synchronously.\n */\n@Injectable({providedIn: 'root', useClass: ɵSciTableCellValuePreloader})\nexport abstract class SciTableCellValuePreloader {\n\n /**\n * Indicates whether cell values are currently preloading.\n */\n public abstract readonly loading: Signal<boolean>;\n\n /**\n * Queues specified cell value provider function for execution in the background the next time the browser is idle.\n */\n public abstract queue(cellValueFn: () => void): void;\n\n /**\n * Clears queued tasks.\n */\n public abstract clear(): void;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {SciTableColumnFilter, SciTableDatasourceQuery, SciTableSortCriterion, SciTreeTableNode, SciTreeTableDatasource} from './table-datasource';\nimport {SciTableColumn} from './table.model';\nimport {computed, inject, runInInjectionContext, Signal, untracked} from '@angular/core';\nimport {toObservable} from '@angular/core/rxjs-interop';\nimport {SciTableCellValuePreloader} from './table-cell-value-preloader';\nimport {Arrays} from '@scion/toolkit/util';\nimport {SciDateValue} from './table-date-column.model';\nimport {SciEnumValue} from './table-enum-column.model';\nimport {ɵSingleActiveInjectorFactory} from '@scion/components/common';\nimport {MaybeAsync} from '@scion/toolkit/types';\nimport {ɵSciTable} from './ɵtable.model';\n\nexport class SciInMemoryTableDatasource<T, ID> implements SciTreeTableDatasource<T, ID> {\n\n private readonly _rows: Signal<Map<ID, Row<T, ID>>>;\n\n constructor(data: Signal<T[]>, table: ɵSciTable<T, ID>, options?: {children?: (node: T) => T[]}) {\n const tableCellValuePreloader = inject(SciTableCellValuePreloader);\n const injectorFactory = new ɵSingleActiveInjectorFactory();\n\n this._rows = computed((): Map<ID, Row<T, ID>> => {\n // Create new value function injector, releasing resources allocated in column value functions.\n const injector = injectorFactory.create();\n\n // Cancel preloading of previous data.\n tableCellValuePreloader.clear();\n\n return data()\n .flatMap(item => createRow(item))\n .reduce((map, row) => map.set(row.id, row), new Map<ID, Row<T, ID>>());\n\n function createRow(item: T, parent?: {id: ID}): Row<T, ID>[] {\n const id = table.trackBy(item);\n return [\n {\n id,\n parentId: parent?.id,\n item,\n cells: table.columns().reduce((cells, column) => untracked(() => {\n // PERF: Cell values are computed lazily (on idle or first use) to defer expensive computations like date formatting.\n const tableCellValue = 'value' in column ? new eSciTableCellValue(tableCellValuePreloader, () => runInInjectionContext(injector, () => column.value(item)())) : undefined;\n return cells.set(column.name, {\n column: column as SciTableColumn,\n value: () => tableCellValue?.value(),\n });\n }), new Map<`column:${string}`, Cell>()),\n },\n // Child rows if a tree structure.\n ...options?.children?.(item).flatMap(child => createRow(child, {id})) ?? [],\n ];\n }\n });\n }\n\n public getTreeTableNodes(query: SciTableDatasourceQuery): MaybeAsync<SciTreeTableNode<ID>[]> {\n return toObservable(computed(() => {\n const rows = this._rows();\n\n // PERF: Do not track signals inside `Array.sort` to avoid Angular signal tracking overhead as the comparator runs repeatedly, degrading performance otherwise.\n return untracked(() => [...rows.values()]\n .filter(row => matchesRow(row, query.columnFilters, {coerceEnumValueToArray: true}) && matchesGlobalFilter(row, query.tableFilter, {coerceEnumValueToArray: false}))\n .sort((a, b) => compareRows(a, b, query.sortCriteria))\n .map(row => ({id: row.id, parentId: row.parentId})));\n }));\n }\n\n public getItems(ids: ID[]): MaybeAsync<T[]> {\n return toObservable(computed(() => ids.flatMap(id => this._rows().has(id) ? this._rows().get(id)!.item : [])));\n }\n}\n\ninterface Row<T, ID> {\n id: ID;\n parentId?: ID;\n item: T;\n cells: Map<`column:${string}`, Cell>;\n}\n\ninterface Cell {\n column: SciTableColumn;\n value: () => string | number | boolean | SciDateValue | SciEnumValue | undefined;\n}\n\n/**\n * Tests whether a row matches the given global filter.\n */\nfunction matchesGlobalFilter<T, ID>(row: Row<T, ID>, filter: string | undefined, options: {coerceEnumValueToArray: boolean}): boolean {\n if (!filter?.trim()) {\n return true;\n }\n\n for (const cell of row.cells.values()) {\n const text = cell.column.type === 'number' ? toNumber(filter) : filter;\n if (text === undefined) {\n continue;\n }\n\n if (matchesRow(row, [{text, columnName: cell.column.name} satisfies SciTableColumnFilter], options)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Tests whether a row matches the given column filters.\n */\nfunction matchesRow<T, ID>(row: Row<T, ID>, columnFilters: SciTableColumnFilter[], options: {coerceEnumValueToArray: boolean}): boolean {\n if (!columnFilters.length) {\n return true;\n }\n\n for (const columnFilter of columnFilters) {\n const cell = row.cells.get(columnFilter.columnName)!;\n if ('value' in cell.column && cell.value() === undefined) { // Component and template columns have no value.\n return false;\n }\n\n const filter = cell.column.type === 'enum' && options.coerceEnumValueToArray ? Arrays.coerce(columnFilter.text) : columnFilter.text;\n if (!cell.column.matches(filter, {item: row.item, value: cell.value()})) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Compares two rows based on the given sort criteria.\n */\nfunction compareRows<T, ID>(row1: Row<T, ID>, row2: Row<T, ID>, sortCriteria: SciTableSortCriterion[]): number {\n if (!sortCriteria.length) {\n return 0;\n }\n\n for (const criterion of sortCriteria) {\n const cell1 = row1.cells.get(criterion.columnName)!;\n const cell2 = row2.cells.get(criterion.columnName)!;\n const value1 = cell1.value();\n const value2 = cell2.value();\n\n // Always place `undefined` values at the end, independent of the sort direction. Note that component and template columns have no value.\n if (value1 === undefined && value2 !== undefined) {\n return 1;\n }\n if (value2 === undefined && value1 !== undefined) {\n return -1;\n }\n\n // Prevent calling comparator for value columns where both values are undefined. Note that component and template columns have no value.\n if (value1 === undefined && value2 === undefined && 'value' in cell1.column) {\n return 0;\n }\n\n const comparison = cell1.column.compare({item: row1.item, value: value1}, {item: row2.item, value: value2});\n if (comparison !== 0) {\n return criterion.direction === 'asc' ? comparison : -comparison;\n }\n }\n\n return 0;\n}\n\n/**\n * Converts the given string to a number, or `undefined` if it cannot be parsed.\n */\nfunction toNumber(numberLike: string): number | undefined {\n const number = Number.parseFloat(numberLike);\n return !Number.isNaN(number) ? number : undefined;\n}\n\n/**\n * Provides lazy loading for the cell's value, preloading it when idle for better sort/filter performance.\n *\n * The value is computed at most once, whether it gets preloaded during idle time or requested synchronously via {@link value()}.\n */\nclass eSciTableCellValue<V> {\n\n private _value: V | undefined;\n\n constructor(preloader: SciTableCellValuePreloader, private _valueFn: () => V) {\n preloader.queue(() => {\n this._value ??= this._valueFn();\n });\n }\n\n public value(): V {\n return this._value ??= untracked(() => this._valueFn());\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Signal} from '@angular/core';\nimport {SciEnumValueLike} from './table.model';\nimport {MaybeAsync} from '@scion/toolkit/types';\nimport {SciInMemoryTableDatasource} from './in-memory-table-datasource';\nimport {ɵSciTable} from './ɵtable.model';\nimport {Observables} from '@scion/toolkit/util';\nimport {mapArray} from '@scion/toolkit/operators';\n\n/**\n * Provides an in-memory datasource for {@link SciTable} with built-in filtering and sorting.\n *\n * A datasource provides data to {@link SciTable}, passing each item to columns for display. For a tree structure, additionally pass a child selector to the datasource.\n *\n * This datasource requires all data to be loaded upfront. The datasource filters and sorts data in memory.\n *\n * Custom columns must configure a filter matcher and sort comparator to be filterable and sortable.\n *\n * For large datasets requiring pagination or server-side filtering and sorting, prefer implementing a custom datasource using {@link ɵprovideTableDatasource}.\n *\n * @example - Usage\n * ```ts\n * import {table, provideTableDatasource} from '@scion/components/table';\n * import {httpResource} from '@angular/common/http';\n *\n * const users = httpResource<User[]>(() => '/api/users', {defaultValue: []});\n *\n * table({\n * datasource: provideTableDatasource(users.value),\n * columns: table => table.addStringColumn('Name', user => user.name),\n * });\n * ```\n *\n * @example - Displaying hierarchical data\n * ```ts\n * import {table, provideTableDatasource} from '@scion/components/table';\n * import {httpResource} from '@angular/common/http';\n *\n * const users = httpResource<User[]>(() => '/api/users', {defaultValue: []});\n *\n * table({\n * datasource: provideTableDatasource(users.value, user => user.children),\n * columns: table => table.addStringColumn('Name', user => user.name),\n * });\n * ```\n *\n * @param data - Provides items to display in the table, or root items if displaying a tree structure.\n * @param children - Function required to display a tree structure, returning an item's children or an empty array if the item has no children or is a leaf.\n * Called eagerly for each item when initializing the table, inside a reactive context that re-evaluates when tracked signals change.\n *\n * @see SciTableDescriptor.datasource\n */\nexport function provideTableDatasource<T>(data: Signal<T[]>, children?: (item: T) => T[]): SciTableDatasourceProvider<T> {\n return {\n [eSCI_TABLE_DATASOURCE_PROVIDER]: <ID>(table: ɵSciTable<T, ID>) => new SciInMemoryTableDatasource(data, table, {children}),\n };\n}\n\n/**\n * @docs-private Not public API. For internal use only.\n * @experimental since 22.7.0; API and behavior may change in any version without notice.\n */\nexport function ɵprovideTableDatasource<T, ID = T>(tableDatasource: SciTableDatasource<T, ID>): SciTableDatasourceProvider<T, ID>;\nexport function ɵprovideTableDatasource<T, ID = T>(treeTableDatasource: SciTreeTableDatasource<T, ID>): SciTableDatasourceProvider<T, ID>;\nexport function ɵprovideTableDatasource<T, ID = T>(datasource: SciTableDatasource<T, ID> | SciTreeTableDatasource<T, ID>): SciTableDatasourceProvider<T, unknown> {\n const isTreeTableDatesource = 'getTreeTableNodes' in datasource;\n\n return {\n [eSCI_TABLE_DATASOURCE_PROVIDER]: () => ({\n getTreeTableNodes: (query: SciTableDatasourceQuery) => isTreeTableDatesource ? datasource.getTreeTableNodes(query) : Observables.coerce(datasource.getIds(query)).pipe(mapArray(id => ({id}))),\n getItems: (ids: ID[]) => datasource.getItems(ids),\n }),\n };\n}\n\nexport interface SciTableDatasource<T, ID> {\n getIds: (query: SciTableDatasourceQuery) => MaybeAsync<ID[]>;\n getItems: (ids: ID[]) => MaybeAsync<T[]>;\n}\n\n/**\n * @experimental since 22.7.0; API and behavior may change in any version without notice.\n */\nexport interface SciTreeTableDatasource<T, ID> {\n getTreeTableNodes(query: SciTableDatasourceQuery): MaybeAsync<SciTreeTableNode<ID>[]>;\n\n getItems(ids: ID[]): MaybeAsync<T[]>;\n}\n\n/**\n * Symbol for providing a {@link SciTreeTableDatasource}.\n */\nexport const eSCI_TABLE_DATASOURCE_PROVIDER: unique symbol = Symbol('eSCI_TABLE_DATASOURCE_PROVIDER');\n\n/**\n * Symbol for providing type inference for the ID type.\n */\nexport declare const eSCI_TABLE_DATASOURCE_ID_TYPE: unique symbol;\n\n/**\n * Provides a datasource to {@link SciTable}.\n */\nexport type SciTableDatasourceProvider<T, ID = never> = {\n // Phantom type required for TypeScript to infer <ID> because TypeScript cannot infer types from function return types.\n readonly [eSCI_TABLE_DATASOURCE_ID_TYPE]?: ID;\n} & ([ID] extends [never] ? // Compare ID as a whole so that ID = never selects the true branch instead of resolving to never.\n {\n // For in-memory datasource, infer the ID type from the table passed to the provider.\n readonly [eSCI_TABLE_DATASOURCE_PROVIDER]: <ID>(table: ɵSciTable<T, ID>) => SciTreeTableDatasource<T, ID>;\n } :\n {\n readonly [eSCI_TABLE_DATASOURCE_PROVIDER]: (table: ɵSciTable<T, ID>) => SciTreeTableDatasource<T, ID>;\n });\n\nexport interface SciTableColumnFilter {\n columnName: `column:${string}`;\n text: string | number | boolean | SciEnumValueLike | SciEnumValueLike[];\n}\n\nexport interface SciTableSortCriterion {\n columnName: `column:${string}`;\n direction: 'asc' | 'desc';\n}\n\nexport interface SciTableDatasourceQuery {\n sortCriteria: SciTableSortCriterion[];\n columnFilters: SciTableColumnFilter[];\n tableFilter?: string;\n}\n\nexport interface SciTreeTableNode<ID> {\n id: ID;\n parentId?: ID;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Injector, Signal, WritableSignal} from '@angular/core';\nimport {SciTableDatasourceProvider, SciTableSortCriterion} from './table-datasource';\nimport {SciComponentDescriptor, SciTemplateDescriptor} from '@scion/components/common';\nimport {SciToolbarFactory} from '@scion/components/menu';\nimport {SciTableRowBindingFactoryFn, SciTableRowBindings} from './table-row-binding';\nimport {SciTableColumnFactoryFn} from './table.factory';\nimport {SciDateValue} from './table-date-column.model';\nimport {SciTableColumnFilterMatcherFn, SciTableColumnSortComparatorFn} from './table-column.factory';\nimport {MaybeArray} from '@scion/toolkit/types';\nimport {Translatable} from '@scion/components/text';\nimport {SciEnumValue} from './table-enum-column.model';\n\n/**\n * Represents supported column types of {@link SciTableComponent}.\n */\nexport type SciTableColumnType = 'string' | 'number' | 'boolean' | 'date' | 'icon' | 'enum' | 'component' | 'template';\n\n/**\n * Represents a descriptor to configure {@link SciTableComponent}.\n *\n * Defines the columns, datasource, and display options. Requires at minimum a datasource and columns.\n */\nexport interface SciTableDescriptor<T, ID = T> {\n /**\n * Specifies the datasource to provide data to {@link SciTable}.\n *\n * Create a datasource using the {@link provideTableDatasource} function and pass a signal containing the items.\n * For a tree structure, additionally pass a child selector to the datasource.\n *\n * As a convenience for non-hierarchical tables, an array signal can be used directly as the datasource.\n *\n * @example - Usage\n * ```ts\n * import {table} from '@scion/components/table';\n * import {httpResource} from '@angular/common/http';\n *\n * const users = httpResource<User[]>(() => '/api/users', {defaultValue: []});\n *\n * table({\n * datasource: users.value,\n * columns: table => table.addStringColumn('Name', user => user.name),\n * });\n * ```\n *\n * @example - Displaying hierarchical data\n * ```ts\n * import {table, provideTableDatasource} from '@scion/components/table';\n * import {httpResource} from '@angular/common/http';\n *\n * const users = httpResource<User[]>(() => '/api/users', {defaultValue: []});\n *\n * table({\n * datasource: provideTableDatasource(users.value, user => user.children),\n * columns: table => table.addStringColumn('Name', user => user.name),\n * });\n * ```\n *\n * @see provideTableDatasource\n */\n datasource: Signal<T[]> | SciTableDatasourceProvider<T, ID>;\n\n /**\n * Configures the table columns.\n *\n * @example\n * ```ts\n * import {table} from '@scion/components/table';\n *\n * table({\n * datasource: data,\n * columns: table => table\n * .addStringColumn('Name', item => item.name)\n * .addNumberColumn('Age', item => item.age),\n * });\n * ```\n *\n * The function:\n * - Runs in a reactive context and re-evaluates when tracked signals change.\n * - Can call `inject` to get required dependencies.\n */\n columns: SciTableColumnFactoryFn<T>;\n\n /**\n * Controls whether the user can sort rows by clicking column headers. Defaults to `true`.\n */\n sortable?: boolean;\n\n /**\n * Controls whether the user can resize columns. Defaults to `true`.\n */\n resizable?: boolean;\n\n /**\n * Controls whether the column filters are displayed. Defaults to `false`.\n *\n * Does not affect filtering via {@link SciTable.filter}.\n */\n filterable?: boolean;\n\n /**\n * Controls whether the user can select a single row (`single`), multiple rows (`multi`), or no rows (`false`). Defaults to `multi`.\n *\n * Does not affect selection via {@link SciTable.select}.\n */\n selectable?: 'single' | 'multi' | false;\n\n /**\n * Controls whether column headers are displayed. Defaults to `true`.\n */\n showHeader?: boolean;\n\n /**\n * Controls whether column headers are wrapped if they overflow. Defaults to `false`.\n *\n * If not wrapped, the headers are truncated and ellipsis are shown on overflow.\n */\n wrapHeader?: boolean;\n\n /**\n * @internal Not Public API yet\n *\n * TODO [dwi] Consider renaming to initialSortOrder\n */\n sortBy?: Array<`column:${string}` | SciTableSortCriterion>;\n\n /**\n * Configures actions to show when hovering over a row.\n *\n * @example\n * ```ts\n * import {table} from '@scion/components/table';\n *\n * table({\n * datasource: data,\n * columns: table => ...,\n * rowActions: (toolbar, item) => toolbar.addToolbarButton({\n * icon: 'delete',\n * onSelect: () => ...,\n * }),\n * });\n * ```\n *\n * The function:\n * - Is called per item with a {@link SciToolbarFactory} to contribute actions.\n * - Runs in a reactive context and re-evaluates when tracked signals change.\n * - Can call `inject` to get required dependencies.\n */\n rowActions?: SciTableRowActionFactoryFn<T>;\n\n /**\n * Configures row bindings for table rows.\n *\n * Row bindings enable associating metadata and icons with a row. Metadata includes CSS shadow parts, CSS classes, and HTML attributes.\n *\n * @example\n * ```ts\n * import {table} from '@scion/components/table';\n *\n * table({\n * datasource: data,\n * columns: table => ...,\n * rowBindings: (bindings, item, index) => bindings\n * .addIconBinding('account_circle')\n * .addPartBinding(index % 2 === 0 ? 'row:even' : 'row:odd')\n * .addAttributeBinding('data-id', item.id)\n * .addClassBinding(item.inactive ? 'inactive' : undefined),\n * });\n * ```\n *\n * Part attribute bindings make a row stylable by associating its cells with one or more HTML part attributes that can be referenced in CSS using the `::part()` CSS pseudo-element selector.\n *\n * ```scss\n * sci-table::part(row\\:even row\\:not\\:selected) {\n * background-color: lightgray;\n * }\n * ```\n *\n * The function:\n * - Is called per item with a {@link SciTableRowBindingFactory} to register bindings.\n * - Runs in a reactive context and re-evaluates when tracked signals change.\n * - Can call `inject` to get required dependencies.\n *\n * @param bindings - Factory providing methods to register row bindings.\n * @param item - Item associated with the row.\n * @param index - Index of the row, zero-based.\n */\n rowBindings?: SciTableRowBindingFactoryFn<T>;\n\n /**\n * Specifies the number of items to render before and after the viewport. Defaults to 10.\n */\n bufferSize?: number;\n\n /**\n * Specifies the number of items to load per page. Defaults to 50.\n */\n pageSize?: number;\n /**\n * Computes a unique and stable identity for items in the table.\n *\n * Defaults to the item object reference. Used to identify items when loading data from the datasource and when tracking table selection.\n */\n trackBy?: (item: T) => ID;\n\n /**\n * Specifies an injector used to create the table. Defaults to the current injection context.\n * The table is disposed when the passed injector is destroyed.\n */\n injector?: Injector;\n}\n\n/**\n * Represents a table for {@link SciTableComponent}.\n *\n * Can be constructed using the {@link table} function.\n * Use to bind to `<sci-table>` and interact with the table.\n *\n * @see table\n * @see SciTableComponent\n */\nexport interface SciTable<ID = unknown> {\n /**\n * Provides the active item, if any.\n *\n * The active item may differ from the selected items and is used as the target for keyboard navigation.\n */\n readonly activeItem: Signal<ID | undefined>;\n\n /**\n * Provides the selected items.\n */\n readonly selectedItems: Signal<Array<ID>>;\n\n /**\n * Controls whether the column filters are displayed.\n *\n * Initialized from {@link SciTableDescriptor.filterable}. Defaults to `false`.\n * Does not affect filtering via {@link SciTable.filter}.\n */\n readonly filterable: WritableSignal<boolean>;\n\n /**\n * Controls whether column headers are displayed.\n *\n * Initialized from {@link SciTableDescriptor.showHeader}. Defaults to `true`.\n */\n readonly showHeader: WritableSignal<boolean>;\n\n /**\n * Controls whether column headers are wrapped if they overflow.\n *\n * If not wrapped, the headers are truncated with an ellipsis on overflow.\n * Initialized from {@link SciTableDescriptor.wrapHeader}. Defaults to `false`.\n */\n readonly wrapHeader: WritableSignal<boolean>;\n\n /**\n * Controls whether the user can sort rows by clicking column headers.\n *\n * Initialized from {@link SciTableDescriptor.sortable}. Defaults to `true`.\n */\n readonly sortable: WritableSignal<boolean>;\n\n /**\n * Controls whether the user can resize columns.\n *\n * Initialized from {@link SciTableDescriptor.resizable}. Defaults to `true`.\n */\n readonly resizable: WritableSignal<boolean>;\n\n /**\n * Controls whether the user can select a single row (`single`), multiple rows (`multi`), or no rows (`false`).\n *\n * Initialized from {@link SciTableDescriptor.selectable}. Defaults to `multi`.\n * Does not affect selection via {@link SciTable.select}.\n */\n readonly selectable: WritableSignal<'single' | 'multi' | false>;\n\n /**\n * Filters items cross-column, ignoring {@link SciTableDescriptor.filterable} and {@link SciTableColumnDescriptor.filterable} settings.\n */\n filter(text: string | null): void;\n\n /**\n * Selects the specified rows, replacing the current selection.\n *\n * Expands parent rows for table tree (hierarchical) datasource.\n *\n * @param id - ID or IDs of the rows to select, or an empty array to clear the selection.\n */\n select(id: MaybeArray<ID>): void;\n\n /**\n * Expands all rows in the tree. Only for table tree (hierarchical) datasource.\n */\n expandAll(): void;\n\n /**\n * Collapses all rows in the tree. Only for table tree (hierarchical) datasource.\n */\n collapseAll(): void;\n}\n\nexport interface SciTableColumn<T = unknown, VALUE = unknown, FILTER = VALUE> {\n type: SciTableColumnType;\n name: `column:${string}`;\n header: {\n icon: string | undefined;\n label: Signal<string> | undefined;\n tooltip: Signal<string> | undefined;\n };\n sortable: Signal<boolean>;\n filterable: Signal<boolean>;\n resizable: Signal<boolean>;\n padding: boolean;\n width: Signal<string>;\n minWidth: number;\n resizing: WritableSignal<boolean>;\n location: {x: number; width: number};\n compare: SciTableColumnSortComparatorFn<T, VALUE>;\n matches: SciTableColumnFilterMatcherFn<T, VALUE, FILTER>;\n}\n\nexport interface SciStringColumn<T = unknown> extends SciTableColumn<T, string> {\n type: 'string';\n value: (item: T) => Signal<string | undefined>;\n}\n\nexport interface SciNumberColumn<T = unknown> extends SciTableColumn<T, number> {\n type: 'number';\n value: (item: T) => Signal<number | undefined>;\n format: Signal<Intl.NumberFormat>;\n}\n\nexport interface SciDateColumn<T = unknown> extends SciTableColumn<T, SciDateValue, string> {\n type: 'date';\n value: (item: T) => Signal<SciDateValue | undefined>;\n}\n\nexport interface SciEnumColumn<T = unknown> extends Omit<SciTableColumn<T, SciEnumValue, SciEnumValueLike[] | string>, 'filterable'> { // `string` for table filter\n type: 'enum';\n value: (item: T) => Signal<SciEnumValue | undefined>;\n filterable: Signal<'single' | 'multi' | false>;\n enumeration: Signal<SciEnumColumnValues>;\n format: {\n icon: boolean;\n label: boolean;\n filter: {\n icon: boolean;\n };\n };\n referenceType: SciTableColumnType | undefined;\n}\n\nexport interface SciComponentColumn<T = unknown> extends SciTableColumn<T, void, string> {\n type: 'component';\n component: (item: T) => SciComponentDescriptor;\n}\n\nexport interface SciTemplateColumn<T = unknown> extends SciTableColumn<T, void, string> {\n type: 'template';\n template: (item: T) => SciTemplateDescriptor;\n}\n\nexport type SciTableColumnLike<T = unknown> = SciStringColumn<T> | SciNumberColumn<T> | SciDateColumn<T> | SciEnumColumn<T> | SciComponentColumn<T> | SciTemplateColumn<T>;\n\nexport const skeletonRowId = Symbol('SKELETON_ROW');\n\n/**\n * Mapped row, used as display state.\n */\nexport interface SciTableRow<T, ID> {\n index: number;\n item: T;\n id: ID | typeof skeletonRowId;\n level?: number;\n parentId?: ID;\n cells: SciTableCellLike[];\n bindings: SciTableRowBindings;\n active: Signal<boolean>;\n selected: Signal<boolean>;\n hovered: Signal<boolean>;\n expanded: Signal<boolean>;\n hasChildren: Signal<boolean>;\n}\n\nexport interface SciStringCell {\n type: 'string';\n column: SciStringColumn;\n value: Signal<string | undefined>;\n}\n\nexport interface SciNumberCell {\n type: 'number';\n column: SciNumberColumn;\n value: Signal<number | undefined>;\n}\n\nexport interface SciDateCell {\n type: 'date';\n column: SciDateColumn;\n value: Signal<SciDateValue | undefined>;\n}\n\nexport interface SciEnumCell {\n type: 'enum';\n column: SciEnumColumn;\n value: Signal<SciEnumValue | undefined>;\n}\n\nexport interface SciComponentCell {\n type: 'component';\n column: SciComponentColumn;\n component: SciComponentDescriptor;\n}\n\nexport interface SciTemplateCell {\n type: 'template';\n column: SciTemplateColumn;\n template: SciTemplateDescriptor;\n}\n\nexport type SciTableCellLike = SciStringCell | SciNumberCell | SciDateCell | SciEnumCell | SciComponentCell | SciTemplateCell;\n\nexport interface SciTableCellContext<T = unknown, VALUE = unknown> {\n item: T;\n value: VALUE;\n}\n\n/**\n * Signature of a function to contribute row actions.\n *\n * Called per item with a {@link SciToolbarFactory} to contribute actions.\n *\n * The function:\n * - Runs in a reactive context and re-evaluates when tracked signals change.\n * - Can call `inject` to get required dependencies.\n */\nexport type SciTableRowActionFactoryFn<T> = (toolbar: SciToolbarFactory, item: T, index: number) => void;\n\n/**\n * Represents an event emitted by {@link SciTableComponent}.\n */\nexport interface SciTableEvent<ID> {\n /**\n * The native browser event (`MouseEvent` or `KeyboardEvent`) that triggered the action.\n */\n sourceEvent: MouseEvent | KeyboardEvent;\n /**\n * The items associated with the action.\n */\n items: ID[];\n}\n\n/**\n * Represents the header of a table column, defined as a {@link Translatable} or an object with an optional icon, label, and tooltip.\n *\n * The label can be text or a translation key. A translation key starts with the percent symbol (`%`) and may include parameters in matrix notation for text interpolation.\n * SCION uses text providers to resolve translation keys. A text provider can be registered using {@link provideTextProvider}.\n *\n * SCION uses icon providers to render icons. An icon provider can be registered using {@link provideIconProvider}.\n *\n * Defaults to a Material icon provider if the application has not registered an icon provider, interpreting the icon as a Material Icon font ligature.\n * Refer to https://fonts.google.com/icons for available Material icons and instructions on including the Material icon font.\n */\nexport type SciColumnHeaderLike = Translatable | {icon?: string; label?: Translatable; tooltip?: Translatable};\n\n/**\n * An ISO 8601 date/time string, milliseconds since the UTC epoch, or a {@link Date} object.\n */\nexport type SciDateLike = string | number | Date;\n\n/**\n * Supported data types for enumeration values used in an enum column.\n */\nexport type SciEnumValueLike = string | number | boolean;\n\n/**\n * Defines the enumeration entries of an enum column.\n *\n * The array order determines the sort order of the enumeration.\n *\n * A label can be text or a translation key. A translation key starts with the percent symbol (`%`) and may include parameters in matrix notation for text interpolation.\n * SCION uses text providers to resolve translation keys. A text provider can be registered using {@link provideTextProvider}.\n *\n * SCION uses icon providers to render icons. An icon provider can be registered using {@link provideIconProvider}.\n * Defaults to a Material icon provider if the application has not registered an icon provider, interpreting the icon as a Material Icon font ligature.\n * Refer to https://fonts.google.com/icons for available Material icons and instructions on including the Material icon font.\n */\nexport type SciEnumColumnValues = {value: SciEnumValueLike; label: Translatable; icon?: string; tooltip?: Translatable | null}[];\n\n/**\n * Defines icons of an icon column.\n *\n * The array order determines the sort order.\n *\n * A label can be text or a translation key. A translation key starts with the percent symbol (`%`) and may include parameters in matrix notation for text interpolation.\n * SCION uses text providers to resolve translation keys. A text provider can be registered using {@link provideTextProvider}.\n *\n * SCION uses icon providers to render icons. An icon provider can be registered using {@link provideIconProvider}.\n * Defaults to a Material icon provider if the application has not registered an icon provider, interpreting the icon as a Material Icon font ligature.\n * Refer to https://fonts.google.com/icons for available Material icons and instructions on including the Material icon font.\n */\nexport type SciIconColumnValues = {value: string | number | boolean; label: Translatable; icon: string; tooltip?: Translatable | null}[];\n","import {formatDate} from '@angular/common';\nimport {SciDateLike} from './table.model';\n\n/**\n * Creates a {@link SciDateValue} from the given date-like input.\n *\n * Calling this function is expensive due to date parsing and formatting.\n */\nexport function coerceDateValue(dateLike: SciDateLike | undefined, options: {format: string; locale: string; timezone?: string}): SciDateValue | undefined {\n const {format, locale, timezone} = options;\n\n switch (typeof dateLike) {\n case 'string': {\n const isoString = ensureIso8601DatePrefix(dateLike);\n return {\n isoString,\n millis: new Date(isoString).getTime(),\n formatted: formatDate(isoString, format, locale, timezone),\n };\n }\n case 'number': {\n const millis = dateLike;\n const isoString = new Date(millis).toISOString();\n return {\n isoString,\n millis,\n formatted: formatDate(isoString, format, locale, timezone),\n };\n }\n case 'object': {\n const date = dateLike;\n const isoString = date.toISOString();\n return {\n isoString,\n millis: date.getTime(),\n formatted: formatDate(isoString, format, locale, timezone),\n };\n }\n case 'undefined': {\n return undefined;\n }\n }\n}\n\n/**\n * Prepends '1970-01-01' if the date prefix is missing, as required by {@link formatDate}.\n *\n * Uses fast ASCII character code checks (`-`, `T`, `t`) to avoid string allocation.\n */\nfunction ensureIso8601DatePrefix(isoDate: string): string {\n // Check if iso string already starts with a full year date (YYYY-MM-DD)\n if (isoDate.charCodeAt(4) === 45) { // '-'\n return isoDate;\n }\n\n // Prepend epoch, adding 'T' separator if missing.\n switch (isoDate.charCodeAt(0)) {\n case 84: // 'T'\n case 116: // 't'\n return '1970-01-01' + isoDate;\n default:\n return '1970-01-01T' + isoDate;\n }\n}\n\n/**\n * Represents the internal value of {@link SciDateColumn}.\n */\nexport interface SciDateValue {\n /**\n * Full ISO 8601 date/time string.\n */\n isoString: string;\n /**\n * Milliseconds since UTC epoch.\n */\n millis: number;\n /**\n * Human-readable formatted date and time string.\n */\n formatted: string;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {computed, inject, Injector, Signal} from '@angular/core';\nimport {text} from '@scion/components/text';\nimport {SciEnumColumn, SciEnumColumnValues, SciEnumValueLike} from './table.model';\nimport {coerceSignal, MaybeSignal} from '@scion/components/common';\n\n/**\n * Creates a {@link SciEnumValue} from the given enum-like input.\n */\nexport function coerceEnumValue(enumLike: MaybeSignal<SciEnumValueLike | undefined>, options: {enumeration: MaybeSignal<SciEnumColumnValues>; format: SciEnumColumn['format']; injector?: Injector}): Signal<SciEnumValue | undefined> {\n const value = coerceSignal(enumLike, {coerceUndefined: true});\n const enumeration = coerceSignal(options.enumeration);\n const enumEntry = computed(() => value() !== undefined ? enumeration().find(entry => entry.value === value()) : undefined);\n const label = text(computed(() => enumEntry()?.label), {injector: options.injector ?? inject(Injector)});\n const tooltip = text(computed(() => enumEntry()?.tooltip), {injector: options.injector ?? inject(Injector)});\n\n return computed(() => {\n if (!enumEntry()) {\n return undefined;\n }\n\n return {\n value: enumEntry()!.value,\n label: label()!,\n icon: enumEntry()!.icon,\n // Use tooltip if provided, or fall back to label, but only if it is not configured for display.\n tooltip: tooltip() ?? (tooltip() === null || options.format.label ? undefined : label()),\n } satisfies SciEnumValue;\n });\n}\n\n/**\n * Represents the internal value of {@link SciEnumColumn}.\n */\nexport interface SciEnumValue {\n value: SciEnumValueLike;\n /** localized text */\n label: string;\n /** localized tooltip */\n tooltip?: string;\n icon?: string;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {SciBooleanColumnDescriptor, SciComponentColumnDescriptor, SciDateColumnDescriptor, SciEnumColumnDescriptor, SciIconColumnDescriptor, SciNumberColumnDescriptor, SciStringColumnDescriptor, SciTableColumnDescriptorLike, SciTableColumnFactory, SciTemplateColumnDescriptor} from './table-column.factory';\nimport {SciColumnHeaderLike, SciComponentColumn, SciDateColumn, SciDateLike, SciEnumColumn, SciEnumValueLike, SciNumberColumn, SciStringColumn, SciTableColumn, SciTableColumnLike, SciTemplateColumn} from './table.model';\nimport {computed, DEFAULT_CURRENCY_CODE, inject, signal, untracked} from '@angular/core';\nimport {ɵSciTable} from './ɵtable.model';\nimport {coerceSignal, MaybeSignal, SCI_LOCALE} from '@scion/components/common';\nimport {coerceDateValue} from './table-date-column.model';\nimport {DATE_PIPE_DEFAULT_OPTIONS} from '@angular/common';\nimport {coerceEnumValue} from './table-enum-column.model';\nimport {text, Translatable} from '@scion/components/text';\n\nexport class ɵSciTableColumnFactory<T, ID> implements SciTableColumnFactory<T> {\n\n public readonly columns = new Array<SciTableColumnLike<T>>();\n\n constructor(private readonly _table: ɵSciTable<T, ID>) {\n }\n\n public addStringColumn(value: (item: T) => MaybeSignal<Translatable | undefined>): this;\n public addStringColumn(header: SciColumnHeaderLike, value: (item: T) => MaybeSignal<Translatable | undefined>): this;\n public addStringColumn(descriptor: SciStringColumnDescriptor<T>): this;\n public addStringColumn(descriptorLike: ((item: T) => MaybeSignal<string | undefined>) | SciColumnHeaderLike | SciStringColumnDescriptor<T>, value?: (item: T) => MaybeSignal<Translatable | undefined>): this {\n const descriptor = coerceColumnDescriptor(descriptorLike, value);\n const column = this.mapToColumn(descriptor);\n const sortable = descriptor.sortable ?? true;\n const filterable = descriptor.filterable ?? true;\n\n this.columns.push({\n ...column,\n type: 'string',\n value: item => text(descriptor.value(item)),\n sortable: computed(() => this._table.sortable() && !!sortable),\n filterable: computed(() => this._table.filterable() && !!filterable),\n compare: typeof sortable === 'object' ? sortable.comparator : (a, b) => a.value.localeCompare(b.value),\n matches: typeof filterable === 'object' ? filterable.matcher : (text, context) => context.value.toLowerCase().includes(text.toLowerCase()),\n } satisfies SciStringColumn<T>);\n\n return this;\n }\n\n public addNumberColumn(value: (item: T) => MaybeSignal<number | undefined>): this;\n public addNumberColumn(header: SciColumnHeaderLike, value: (item: T) => MaybeSignal<number | undefined>): this;\n public addNumberColumn(descriptor: SciNumberColumnDescriptor<T>): this;\n public addNumberColumn(descriptorLike: ((item: T) => MaybeSignal<number | undefined>) | SciColumnHeaderLike | SciNumberColumnDescriptor<T>, value?: (item: T) => MaybeSignal<number | undefined>): this {\n const descriptor = coerceColumnDescriptor(descriptorLike, value);\n const column = this.mapToColumn(descriptor);\n\n const locale = coerceSignal(descriptor.locale ?? inject(SCI_LOCALE));\n const currency = inject(DEFAULT_CURRENCY_CODE, {optional: true}) ?? 'USD';\n this.columns.push({\n ...column,\n type: 'number',\n value: item => coerceSignal(descriptor.value(item), {coerceUndefined: true}),\n sortable: computed(() => this._table.sortable() && (descriptor.sortable ?? true)),\n filterable: computed(() => this._table.filterable() && (descriptor.filterable ?? true)),\n compare: (a, b) => a.value - b.value,\n matches: (text, context) => context.value === text,\n format: computed(() => new Intl.NumberFormat(locale(), {currency, ...descriptor.format})),\n } satisfies SciNumberColumn<T>);\n\n return this;\n }\n\n public addBooleanColumn(value: (item: T) => MaybeSignal<boolean | undefined>): this;\n public addBooleanColumn(header: SciColumnHeaderLike, value: (item: T) => MaybeSignal<boolean | undefined>): this;\n public addBooleanColumn(descriptor: SciBooleanColumnDescriptor<T>): this;\n public addBooleanColumn(descriptorLike: ((item: T) => MaybeSignal<boolean | undefined>) | SciColumnHeaderLike | SciBooleanColumnDescriptor<T>, value?: (item: T) => MaybeSignal<boolean | undefined>): this {\n const descriptor = coerceColumnDescriptor(descriptorLike, value);\n\n this.addEnumColumn({\n ...descriptor,\n value: item => coerceSignal(descriptor.value(item), {coerceUndefined: true}),\n values: [\n {value: true, icon: 'scion:true', label: '%scion:components:yes.value', tooltip: null},\n {value: false, icon: 'scion:false', label: '%scion:components:no.value', tooltip: null},\n ],\n format: {icon: true},\n filterable: descriptor.filterable === false ? false : 'single',\n referenceType: 'boolean',\n });\n return this;\n }\n\n public addDateColumn(value: (item: T) => MaybeSignal<SciDateLike | undefined>): this;\n public addDateColumn(header: SciColumnHeaderLike, value: (item: T) => MaybeSignal<SciDateLike | undefined>): this;\n public addDateColumn(descriptor: SciDateColumnDescriptor<T>): this;\n public addDateColumn(descriptorLike: ((item: T) => MaybeSignal<SciDateLike | undefined>) | SciColumnHeaderLike | SciDateColumnDescriptor<T>, value?: (item: T) => MaybeSignal<SciDateLike | undefined>): this {\n const descriptor = coerceColumnDescriptor(descriptorLike, value);\n const column = this.mapToColumn(descriptor);\n\n const defaults = inject(DATE_PIPE_DEFAULT_OPTIONS, {optional: true});\n const locale = coerceSignal(descriptor.locale ?? inject(SCI_LOCALE));\n const format = descriptor.format ?? defaults?.dateFormat ?? 'mediumDate';\n const timezone = descriptor.timezone ?? defaults?.timezone;\n\n this.columns.push({\n ...column,\n type: 'date',\n value: item => {\n const dateLike = coerceSignal(descriptor.value(item), {coerceUndefined: true});\n return computed(() => coerceDateValue(dateLike(), {locale: locale(), format, timezone}));\n },\n sortable: computed(() => this._table.sortable() && (descriptor.sortable ?? true)),\n filterable: computed(() => this._table.filterable() && (descriptor.filterable ?? true)),\n compare: (a, b) => a.value.millis - b.value.millis,\n matches: (text, context) => context.value.formatted.toLowerCase().includes(text.toLowerCase()),\n } satisfies SciDateColumn<T>);\n\n return this;\n }\n\n public addEnumColumn(descriptor: SciEnumColumnDescriptor<T>): this {\n const column = this.mapToColumn(descriptor);\n const enumeration = coerceSignal(descriptor.values);\n const positionByEnumValue = computed(() => enumeration().reduce((acc, entry, index) => acc.set(entry.value, index), new Map<SciEnumValueLike, number>()));\n const format: SciEnumColumn['format'] = descriptor.format\n ? {icon: descriptor.format.icon ?? false, label: descriptor.format.label ?? false, filter: {icon: descriptor.format.filter?.icon ?? false}} // eslint-disable-line @stylistic/operator-linebreak\n : {icon: false, label: true, filter: {icon: true}}; // eslint-disable-line @stylistic/operator-linebreak\n\n this.columns.push({\n ...column,\n type: 'enum',\n referenceType: descriptor.referenceType,\n value: item => coerceEnumValue(descriptor.value(item), {enumeration, format}),\n sortable: computed(() => this._table.sortable() && (descriptor.sortable ?? true)),\n filterable: computed(() => this._table.filterable() && (descriptor.filterable ?? 'multi')),\n enumeration,\n compare: (a, b) => untracked(() => (positionByEnumValue().get(a.value.value) ?? 0) - (positionByEnumValue().get(b.value.value) ?? 0)),\n matches: (filter, context) => {\n if (typeof filter === 'string') { // table filter\n return context.value.label.toLowerCase().includes(filter.toLowerCase());\n }\n else {\n return filter.includes(context.value.value); // column filter\n }\n },\n format,\n } satisfies SciEnumColumn<T>);\n\n return this;\n }\n\n public addIconColumn(descriptor: SciIconColumnDescriptor<T>): this {\n const resizable = typeof descriptor.header === 'string' || !!descriptor.header?.label?.length;\n\n this.addEnumColumn({\n ...descriptor,\n value: item => coerceSignal(descriptor.value(item), {coerceUndefined: true}),\n format: {icon: true, filter: {icon: true}},\n resizable: descriptor.resizable ?? resizable,\n width: descriptor.width ?? (resizable ? undefined : 'max-content'), // adapt width to intrinsic size\n minWidth: descriptor.minWidth ?? (resizable ? undefined : 32),\n referenceType: 'icon',\n });\n return this;\n }\n\n public addComponentColumn(descriptor: SciComponentColumnDescriptor<T>): this {\n // Require a filter matcher if filterable using the built-in in-memory datasource.\n if (this._table.isInMemoryDatasource() && descriptor.filterable === true) {\n throw Error('[ColumnDefinitionError] Component column requires a filter matcher in order to be filterable.');\n }\n\n // Require a sort comparator if sortable using the built-in in-memory datasource.\n if (this._table.isInMemoryDatasource() && descriptor.sortable === true) {\n throw Error('[ColumnDefinitionError] Component column requires a sort comparator in order to be sortable.');\n }\n\n const column = this.mapToColumn(descriptor);\n this.columns.push({\n ...column,\n type: 'component',\n component: descriptor.component,\n sortable: computed(() => this._table.sortable() && !!descriptor.sortable),\n filterable: computed(() => this._table.filterable() && !!descriptor.filterable),\n compare: typeof descriptor.sortable === 'object' ? descriptor.sortable.comparator : () => 0,\n matches: typeof descriptor.filterable === 'object' ? descriptor.filterable.matcher : () => false,\n padding: descriptor.padding ?? true,\n } satisfies SciComponentColumn<T>);\n\n return this;\n }\n\n public addTemplateColumn(descriptor: SciTemplateColumnDescriptor<T>): this {\n // Require a filter matcher if filterable using the built-in in-memory datasource.\n if (this._table.isInMemoryDatasource() && descriptor.filterable === true) {\n throw Error('[ColumnDefinitionError] Template column requires a filter matcher in order to be filterable.');\n }\n\n // Require a sort comparator if sortable using the built-in in-memory datasource.\n if (this._table.isInMemoryDatasource() && descriptor.sortable === true) {\n throw Error('[ColumnDefinitionError] Template column requires a sort comparator in order to be sortable.');\n }\n\n const column = this.mapToColumn(descriptor);\n this.columns.push({\n ...column,\n type: 'template',\n template: descriptor.template,\n sortable: computed(() => this._table.sortable() && !!descriptor.sortable),\n filterable: computed(() => this._table.filterable() && !!descriptor.filterable),\n compare: typeof descriptor.sortable === 'object' ? descriptor.sortable.comparator : () => 0,\n matches: typeof descriptor.filterable === 'object' ? descriptor.filterable.matcher : () => false,\n padding: descriptor.padding ?? true,\n } satisfies SciTemplateColumn<T>);\n\n return this;\n }\n\n /**\n * Maps given column descriptor to a {@link SciTableColumn}.\n */\n private mapToColumn(descriptor: SciTableColumnDescriptorLike<T>): Omit<SciTableColumn, 'type' | 'sortable' | 'filterable' | 'compare' | 'matches'> {\n // Require a unique column name.\n const name = descriptor.name ?? `column:${this.columns.length}`;\n if (this.columns.find(column => column.name === name)) {\n throw Error(`[ColumnDefinitionError] Column names must be unique. \"${name}\" is defined more than once.`);\n }\n\n // Ensure filter matcher is only configured if using the built-in in-memory datasource.\n if (!this._table.isInMemoryDatasource() && typeof descriptor.filterable === 'object') {\n throw Error('[ColumnDefinitionError] Configuring a filter matcher is not supported for tables using a datasource. Filtering must be done by the datasource.');\n }\n\n // Ensure sort comparator is only configured if using the built-in in-memory datasource.\n if (!this._table.isInMemoryDatasource() && typeof descriptor.sortable === 'object') {\n throw Error('[ColumnDefinitionError] Configuring a sort comparator is not supported for tables using a datasource. Sorting must be done by the datasource.');\n }\n\n return {\n name: name,\n header: untracked(() => {\n if (typeof descriptor.header === 'string') {\n return {label: text(descriptor.header), icon: undefined, tooltip: undefined};\n }\n return {\n label: descriptor.header?.label !== undefined ? text(descriptor.header.label) : undefined,\n icon: descriptor.header?.icon,\n tooltip: descriptor.header?.tooltip !== undefined ? text(descriptor.header.tooltip) : undefined,\n };\n }),\n resizable: computed(() => this._table.resizable() && (descriptor.resizable ?? true)),\n width: computed(() => {\n const userSettings = this._table.userSettings().columns?.find(column => column.name === name);\n return userSettings?.width ? `${userSettings.width}px` : descriptor.width ?? '1fr';\n }),\n minWidth: descriptor.minWidth ?? 100,\n resizing: signal(false),\n padding: true,\n location: {x: 0, width: 0}, // set in `SciTableColumnComponent`\n };\n }\n}\n\n/**\n * Coerces given column factory arguments to a {@link SciTableColumnDescriptorLike}.\n */\nfunction coerceColumnDescriptor<T>(descriptorLike: ((item: T) => MaybeSignal<string | undefined>) | SciColumnHeaderLike | SciStringColumnDescriptor<T>, value?: (item: T) => MaybeSignal<string | undefined>): SciStringColumnDescriptor<T>;\nfunction coerceColumnDescriptor<T>(descriptorLike: ((item: T) => MaybeSignal<number | undefined>) | SciColumnHeaderLike | SciNumberColumnDescriptor<T>, value?: (item: T) => MaybeSignal<number | undefined>): SciNumberColumnDescriptor<T>;\nfunction coerceColumnDescriptor<T>(descriptorLike: ((item: T) => MaybeSignal<boolean | undefined>) | SciColumnHeaderLike | SciBooleanColumnDescriptor<T>, value?: (item: T) => MaybeSignal<boolean | undefined>): SciBooleanColumnDescriptor<T>;\nfunction coerceColumnDescriptor<T>(descriptorLike: ((item: T) => MaybeSignal<SciDateLike | undefined>) | SciColumnHeaderLike | SciDateColumnDescriptor<T>, value?: (item: T) => MaybeSignal<SciDateLike | undefined>): SciDateColumnDescriptor<T>;\nfunction coerceColumnDescriptor(argument1: unknown, argument2?: unknown): unknown {\n if (argument2 === undefined) {\n return typeof argument1 === 'function' ? {value: argument1} : argument1;\n }\n return {\n header: argument1,\n value: argument2,\n };\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {computed, ResourceRef, signal, Signal} from '@angular/core';\nimport {SciTableRow, skeletonRowId} from './table.model';\nimport {Objects} from '@scion/toolkit/util';\n\nexport class SciTableCache<T, ID> {\n\n private readonly _entriesById = signal(new Map<ID, ResourceRef<SciTableRow<T, ID>[]>>());\n\n private readonly _idsByEntry = computed(() => [...this._entriesById().entries()].reduce((map, [id, entry]) => {\n const ids = map.get(entry) ?? new Set();\n ids.add(id);\n return map.set(entry, ids);\n }, new Map<ResourceRef<SciTableRow<T, ID>[]>, Set<ID>>()));\n\n public readonly rowsById: Signal<Map<ID, SciTableRow<T, ID>>> = computed(() => this._entries()\n .flatMap(entry => entry.status() === 'error' ? [] : entry.value())\n .reduce((acc, row) => row.id !== skeletonRowId ? acc.set(row.id, row) : acc, new Map<ID, SciTableRow<T, ID>>()), {equal: Objects.isEqual});\n\n private readonly _entries = computed(() => [...new Set(this._entriesById().values())]);\n\n public readonly loading: Signal<boolean> = computed(() => this._entries().some(entry => entry.isLoading()));\n public readonly error: Signal<boolean> = computed(() => this._entries().some(entry => entry.status() === 'error'));\n\n public has(key: ID): boolean {\n return this._entriesById().has(key);\n }\n\n public set(ids: ID[], entry: ResourceRef<SciTableRow<T, ID>[]>): void {\n this._entriesById.update(cache => {\n const newCache = new Map(cache);\n for (const id of ids) {\n newCache.set(id, entry);\n }\n return newCache;\n });\n }\n\n public deleteIfLoading(ids: ID[]): void {\n this._entriesById.update(cache => {\n const cacheCopy = new Map(cache);\n const entries = new Set(ids.map(id => cacheCopy.get(id)));\n\n for (const id of ids) {\n if (cacheCopy.get(id)?.isLoading()) {\n cacheCopy.delete(id);\n }\n }\n\n // Dispose entries, which have no ids left pointing to them.\n for (const entry of entries) {\n if (!entry) {\n continue;\n }\n const idsByEntry = this._idsByEntry().get(entry);\n if (entry.isLoading() && [...(idsByEntry ?? [])].every(id => ids.includes(id))) {\n entry.destroy();\n }\n }\n\n return cacheCopy;\n });\n }\n\n public reloadFailed(): void {\n for (const entry of this._entries()) {\n if (entry.status() === 'error') {\n entry.reload();\n }\n }\n }\n\n public clear(): void {\n this._entriesById.update(cache => {\n for (const entry of new Set(cache.values())) {\n entry.destroy();\n }\n return new Map();\n });\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {computed, inject, InjectionToken, Provider, Signal} from '@angular/core';\nimport {Objects} from '@scion/toolkit/util';\n\n/**\n * Provides row bindings to tables in the scope of the injector providing the bindings.\n *\n * Multiple providers can be registered. Providers at different injector tree levels form a hierarchy.\n */\nexport function provideTableRowBinding<T = unknown>(bindings: SciTableRowBindingFactoryFn<T>): Provider[] {\n return [\n {\n provide: SCI_TABLE_ROW_BINDING,\n useValue: bindings,\n multi: true,\n },\n {\n provide: SCI_TABLE_ROW_BINDINGS,\n useFactory: (): SciTableRowBindingFactoryFn<unknown>[] => {\n return [\n // Collect bindings registered in parent injectors.\n ...inject<SciTableRowBindingFactoryFn<unknown>[]>(SCI_TABLE_ROW_BINDINGS, {skipSelf: true, optional: true}) ?? [],\n // Collect bindings registered in this injector.\n ...inject<SciTableRowBindingFactoryFn<unknown>[]>(SCI_TABLE_ROW_BINDING),\n ];\n },\n },\n ];\n}\n\n/**\n * Signature of a function to configure row bindings.\n *\n * Called per item with a {@link SciTableRowBindingFactory} to register bindings.\n *\n * The function:\n * - Runs in a reactive context and re-evaluates when tracked signals change.\n * - Can call `inject` to get required dependencies.\n */\nexport type SciTableRowBindingFactoryFn<T> = (row: SciTableRowBindingFactory, item: T, index: number) => void;\n\n/**\n * Factory for configuring row bindings.\n *\n * Row bindings enable associating metadata and icons with a row. Metadata includes CSS shadow parts, CSS classes, and HTML attributes.\n */\nexport interface SciTableRowBindingFactory {\n /**\n * Binds an icon to the row, displayed in the first column.\n *\n * ```ts\n * import {table} from '@scion/components/table';\n *\n * table({\n * datasource: data,\n * columns: table => ...,\n * rowBindings: bindings => bindings.addIconBinding('account_circle'),\n * });\n * ```\n *\n * SCION uses icon providers to render icons. An icon provider can be registered using {@link provideIconProvider}.\n *\n * Defaults to a Material icon provider if the application has not registered an icon provider, interpreting the icon as a Material Icon font ligature.\n * Refer to https://fonts.google.com/icons for available Material icons and instructions on including the Material icon font.\n */\n addIconBinding(icon: string): this;\n\n /**\n * Binds a CSS shadow part to the row for custom row/cell styling using the `::part()` CSS pseudo-element selector.\n *\n * Example usage:\n * ```ts\n * import {table} from '@scion/components/table';\n *\n * table({\n * datasource: data,\n * columns: table => ...,\n * rowBindings: (bindings, item, index) => bindings\n * .addPartBinding(index % 2 === 0 ? 'row:even' : 'row:odd')\n * .addPartBinding(item.active ? 'row:active' : undefined),\n * });\n * ```\n *\n * ```scss\n * sci-table::part(row\\:even row\\:not\\:selected) {\n * background-color: lightgray;\n * }\n *\n * sci-table::part(row\\:active row\\:not\\:selected) {\n * background-color: green;\n * }\n * ```\n */\n addPartBinding(name: `row:${string}` | undefined): this;\n\n /**\n * Binds an HTML attribute to the row.\n *\n * Useful for end-to-end testing, such as associating a row with an item's primary key.\n *\n * ```ts\n * import {table} from '@scion/components/table';\n *\n * table({\n * datasource: data,\n * columns: table => ...,\n * rowBindings: (bindings, item) => bindings.addAttributeBinding('data-id', item.id),\n * });\n * ```\n */\n addAttributeBinding(name: string, value: unknown | undefined): this;\n\n /**\n * Binds a CSS class to the row.\n */\n addClassBinding(name: string | undefined): this;\n}\n\nexport class ɵSciTableRowBindingFactory implements SciTableRowBindingFactory {\n\n public readonly icons = new Array<string>();\n public readonly parts = new Array<string>();\n public readonly attributes = new Array<[string, unknown]>();\n public readonly classes = new Array<string>();\n\n public addIconBinding(icon: string | undefined): this {\n if (icon) {\n this.icons.push(icon);\n }\n return this;\n }\n\n public addPartBinding(name: string | undefined): this {\n if (name) {\n this.parts.push(name);\n }\n return this;\n }\n\n public addAttributeBinding(name: string, value: unknown | undefined): this {\n if (value !== undefined) {\n this.attributes.push([name, value]);\n }\n return this;\n }\n\n public addClassBinding(name: string | undefined): this {\n if (name) {\n this.classes.push(name);\n }\n return this;\n }\n}\n\nexport function coerceTableRowBindings<T>(bindingsFn: SciTableRowBindingFactoryFn<T>[], item: T, index: number): SciTableRowBindings {\n const factory = computed(() => {\n const factory = new ɵSciTableRowBindingFactory();\n bindingsFn.forEach(fn => fn(factory, item, index));\n return factory;\n });\n\n return {\n icons: computed(() => factory().icons, {equal: Objects.isEqual}),\n parts: computed(() => factory().parts, {equal: Objects.isEqual}),\n attributes: computed(() => Object.fromEntries(factory().attributes), {equal: Objects.isEqual}),\n classes: computed(() => factory().classes, {equal: Objects.isEqual}),\n };\n}\n\nexport interface SciTableRowBindings {\n icons: Signal<string[]>;\n parts: Signal<string[]>;\n attributes: Signal<{[name: string]: unknown}>;\n classes: Signal<string[]>;\n}\n\n/**\n * Multi-DI token for registering a {@link SciTableRowBindingFactory}.\n */\nexport const SCI_TABLE_ROW_BINDING = new InjectionToken<SciTableRowBindingFactory[]>('SCI_TABLE_ROW_BINDING');\n\n/**\n * DI token to inject {@link SciTableRowBindingFactory} functions provided in the current and parent injectors.\n */\nexport const SCI_TABLE_ROW_BINDINGS = new InjectionToken<SciTableRowBindingFactory[]>('SCI_TABLE_ROW_BINDINGS');\n","import {computed, inject, Injector, linkedSignal, ResourceRef, runInInjectionContext, Signal, untracked, WritableSignal} from '@angular/core';\nimport {SciTableColumnFilter, SciTableDatasourceQuery, SciTableSortCriterion, SciTreeTableNode, SciTreeTableDatasource} from './table-datasource';\nimport {catchError, Observable} from 'rxjs';\nimport {Arrays, Observables} from '@scion/toolkit/util';\nimport {rxResource, toObservable} from '@angular/core/rxjs-interop';\nimport {ɵSingleActiveInjectorFactory} from '@scion/components/common';\nimport {MaybeArray} from '@scion/toolkit/types';\n\n/**\n * Loads and builds the table's hierarchy using item IDs and parent relationships, without loading full items.\n * Only operates on IDs, never full objects and regardless of the viewport / virtual scrolling state.\n * For non-hierarchical datasources, treats each item as a root node and preserves the order from the unfiltered response.\n *\n * Uses two independent requests:\n * - An unfiltered request loads all nodes initially and whenever the sort criteria change.\n * - A filtered request loads matching nodes when a filter is present and whenever the filters change.\n *\n * Combines both responses to include matching nodes and their parents and children, preserving the order from the unfiltered response.\n * When no filter is present, uses the unfiltered response directly.\n *\n * @example\n * ```ts\n * const unfilteredNodes = [\n * {item: 'Downloads'},\n * {item: 'Desktop'},\n * {item: 'New Folder', parent: 'Desktop'},\n * {item: 'notes.txt', parent: 'New Folder'},\n * ];\n *\n * // Filtered by 'notes'\n * const filteredNodes = [{item: 'notes.txt', parent: 'New Folder'}];\n *\n * // Result includes the matching node and its ancestors.\n * const tree = [\n * {item: 'Desktop'},\n * {item: 'New Folder', parent: 'Desktop'},\n * {item: 'notes.txt', parent: 'New Folder'},\n * ];\n * ```\n */\nexport class SciTableTree<ID> {\n\n private readonly _injector = inject(Injector);\n\n private readonly _datasource: SciTreeTableDatasource<unknown, ID>;\n private readonly _sortCriteria: Signal<SciTableSortCriterion[]>;\n private readonly _columnFilters: Signal<SciTableColumnFilter[]>;\n private readonly _tableFilter: Signal<string | null>;\n\n private readonly _activeNode = this.computeActiveNode();\n private readonly _selectedNodes = this.computeSelectedNodes();\n private readonly _expandedNodes = this.computeExpandedNodes();\n\n private readonly _unfilteredNodes = this.computeUnfilteredNodes();\n private readonly _filteredNodes = this.computeFilteredNodes();\n private readonly _tree = this.computeTree();\n\n public readonly expandedNodes = this._expandedNodes.asReadonly();\n public readonly selectedNodes = this._selectedNodes.asReadonly();\n public readonly activeNode = this._activeNode.asReadonly();\n\n public readonly error = computed(() => this._unfilteredNodes.status() === 'error' || this._filteredNodes.status() === 'error');\n public readonly loading = computed(() => this._unfilteredNodes.isLoading() || this._filteredNodes.isLoading());\n public readonly unfilteredNodesById = computed(() => this._unfilteredNodes.status() === 'error' ? new Map<ID, SciTreeTableNode<ID>>() : this._unfilteredNodes.value().reduce((acc, node) => acc.set(node.id, node), new Map<ID, SciTreeTableNode<ID>>()));\n public readonly nodes = computed(() => this._tree().nodes);\n public readonly nodesById = computed(() => this._tree().nodesById);\n public readonly childrenIdsByParent = computed(() => this._tree().childrenIdsByParent);\n\n public readonly visibleNodes = this.computeVisibleNodes();\n public readonly nodeIndexById = computed(() => this.visibleNodes().reduce((map, node, index) => map.set(node.id, index), new Map<ID, number>()));\n public readonly visibleNodeCount = computed(() => this.visibleNodes().length);\n\n constructor(options: {\n sortCriteria: Signal<SciTableSortCriterion[]>;\n columnFilters: Signal<SciTableColumnFilter[]>;\n tableFilter: Signal<string | null>;\n datasource: SciTreeTableDatasource<unknown, ID>;\n }) {\n this._datasource = options.datasource;\n this._columnFilters = options.columnFilters;\n this._tableFilter = options.tableFilter;\n this._sortCriteria = options.sortCriteria;\n }\n\n public reload(): void {\n this._unfilteredNodes.reload();\n }\n\n public reloadFailed(): void {\n if (this._unfilteredNodes.status() === 'error') {\n this._unfilteredNodes.reload();\n }\n\n if (this._filteredNodes.status() === 'error') {\n this._filteredNodes.reload();\n }\n }\n\n public expand(id: MaybeArray<ID>): void {\n const ids = Arrays.coerce(id);\n this._expandedNodes.update(toggledRows => new Set([...toggledRows, ...ids]));\n }\n\n public expandAll(): void {\n this._expandedNodes.set(new Set([...this.childrenIdsByParent().keys()].filter((id): id is ID => id !== undefined)));\n }\n\n public collapse(id: MaybeArray<ID>): void {\n const ids = Arrays.coerce(id);\n this._expandedNodes.update(toggledRows => {\n const newToggledRows = new Set(toggledRows);\n ids.forEach(id => newToggledRows.delete(id));\n return newToggledRows;\n });\n }\n\n public collapseAll(): void {\n this._expandedNodes.set(new Set());\n }\n\n public toggleRow(id: ID): void {\n this._expandedNodes.update(toggledRows => {\n if (toggledRows.has(id)) {\n const newToggledRows = new Set(toggledRows);\n newToggledRows.delete(id);\n return newToggledRows;\n }\n else {\n return new Set(toggledRows).add(id);\n }\n });\n }\n\n public setActiveNode(id: ID | undefined): void {\n this._activeNode.set(id);\n }\n\n public updateSelectedNodes(updateFn: (ids: Set<ID>) => Set<ID>): void {\n this._selectedNodes.update(updateFn);\n }\n\n public select(ids: MaybeArray<ID>): void {\n // Prevents selecting nodes which do not exist.\n // Check against unfiltered nodes, to allow selecting nodes, which are filtered out.\n const nodesById = this.unfilteredNodesById();\n const nodeIds = Arrays.coerce(ids).filter(id => nodesById.has(id));\n\n // Expand nodes.\n nodeIds.forEach(id => {\n const node = nodesById.get(id);\n\n if (node?.parentId !== undefined && nodesById.has(node.parentId)) {\n // Expand all nodes before the selected ones.\n this.expand(getPathFromRoot(nodesById.get(node.parentId)!, nodesById));\n }\n });\n\n // Wait for viewport height to update after expanding nodes.\n // Else scrollActiveRowIntoViewport operates on an old viewport height.\n requestAnimationFrame(() => {\n this._selectedNodes.set(new Set(nodeIds));\n\n // Find and activate last item based on the visual index.\n const lastItemIndex = Math.max(...nodeIds.map(id => this.nodeIndexById().get(id) ?? -1));\n const lastItem = this.visibleNodes()[lastItemIndex]?.id;\n this._activeNode.set(lastItem);\n });\n }\n\n private getIds$(query: Partial<SciTableDatasourceQuery>, options: {injector: Injector}): Observable<SciTreeTableNode<ID>[]> {\n return runInInjectionContext(options.injector, () => Observables.coerce(this._datasource.getTreeTableNodes({\n columnFilters: query.columnFilters ?? [],\n sortCriteria: query.sortCriteria ?? [],\n tableFilter: query.tableFilter,\n })).pipe(catchError(error => {\n console.error(error);\n throw error;\n })));\n }\n\n private computeUnfilteredNodes(): ResourceRef<SciTreeTableNode<ID>[]> {\n // Create separate injection context per resource invocation to clean up allocated resources.\n const injectorFactory = new ɵSingleActiveInjectorFactory({parent: this._injector});\n\n return rxResource({\n params: () => this._sortCriteria(),\n stream: ({params: sortCriteria}) => this.getIds$({sortCriteria}, {injector: injectorFactory.create()}),\n defaultValue: [],\n });\n }\n\n private computeFilteredNodes(): ResourceRef<SciTreeTableNode<ID>[]> {\n // Create separate injection context per resource invocation to clean up allocated resources.\n const injectorFactory = new ɵSingleActiveInjectorFactory({parent: this._injector});\n\n return rxResource({\n params: () => ({\n columnFilters: this._columnFilters(),\n tableFilter: this._tableFilter() ?? undefined,\n }),\n stream: ({params}) => {\n const injector = injectorFactory.create();\n if (params.columnFilters.length === 0 && params.tableFilter === undefined) {\n return runInInjectionContext(injector, () => toObservable(this._unfilteredNodes.value));\n }\n return this.getIds$({columnFilters: params.columnFilters, tableFilter: params.tableFilter}, {injector});\n },\n defaultValue: [],\n });\n }\n\n private computeTree(): Signal<TreeData<ID>> {\n return computed(() => {\n if (this.error()) {\n return {\n nodes: [],\n nodesById: new Map(),\n childrenIdsByParent: new Map(),\n };\n }\n\n const filteredNodes = this._filteredNodes.value();\n const unfilteredNodes = this._unfilteredNodes.value();\n\n return untracked(() => createTree(filteredNodes, unfilteredNodes));\n });\n }\n\n private computeExpandedNodes(): WritableSignal<Set<ID>> {\n return linkedSignal({\n source: () => ({unfilteredNodesById: this.unfilteredNodesById(), loading: this._unfilteredNodes.isLoading(), columnFilters: this._columnFilters(), tableFilter: this._tableFilter()}),\n computation: ({unfilteredNodesById, loading, tableFilter, columnFilters}, previous): Set<ID> => {\n // Wait until resource finished loading before changing the expanded nodes.\n if (loading) {\n return previous?.value ?? new Set<ID>();\n }\n\n // Expand all items if filter is set.\n if (columnFilters.length > 0 || tableFilter?.trim()) {\n return new Set(unfilteredNodesById.keys());\n }\n\n const expandedNodeIds = previous?.value ?? new Set<ID>();\n return new Set([...expandedNodeIds].filter(id => unfilteredNodesById.has(id)));\n },\n });\n }\n\n private computeSelectedNodes(): WritableSignal<Set<ID>> {\n return linkedSignal({\n source: () => ({unfilteredNodesById: this.unfilteredNodesById(), loading: this._unfilteredNodes.isLoading()}),\n computation: ({unfilteredNodesById, loading}, previous): Set<ID> => {\n // Wait until resource finished loading before changing the selected nodes.\n if (loading) {\n return previous?.value ?? new Set<ID>();\n }\n\n const selectedNodeIds = previous?.value ?? new Set<ID>();\n return new Set([...selectedNodeIds].filter(id => unfilteredNodesById.has(id)));\n },\n });\n }\n\n private computeActiveNode(): WritableSignal<ID | undefined> {\n return linkedSignal({\n source: () => ({unfilteredNodesById: this.unfilteredNodesById(), loading: this._unfilteredNodes.isLoading()}),\n computation: ({unfilteredNodesById, loading}, previous): ID | undefined => {\n // Wait until resource finished loading before changing the active nodes.\n if (loading) {\n return previous?.value;\n }\n\n return previous?.value !== undefined && unfilteredNodesById.has(previous.value) ? previous.value : undefined;\n },\n });\n }\n\n private computeVisibleNodes(): Signal<SciTreeTableNode<ID>[]> {\n return computed(() => {\n if (this.error()) {\n return [];\n }\n\n const expandedNodes = this._expandedNodes();\n const nodesById = this.nodesById();\n const nodes = this.nodes();\n\n const allAncestorsExpanded = (node?: SciTreeTableNode<ID>): boolean => {\n if (node?.parentId === undefined) {\n return true;\n }\n\n if (!expandedNodes.has(node.parentId)) {\n return false;\n }\n\n return allAncestorsExpanded(nodesById.get(node.parentId));\n };\n\n return untracked(() => nodes.filter(allAncestorsExpanded));\n });\n }\n}\n\nexport interface TreeData<ID> {\n nodes: SciTreeTableNode<ID>[];\n nodesById: Map<ID, SciTreeTableNode<ID>>;\n childrenIdsByParent: Map<ID | undefined, ID[]>;\n}\n\nfunction createTree<ID>(filteredNodes: SciTreeTableNode<ID>[], unfilteredNodes: SciTreeTableNode<ID>[]): TreeData<ID> {\n const nodesById = includeParentsAndChildren(unfilteredNodes, filteredNodes);\n const sortedNodes = unfilteredNodes.filter(node => nodesById.has(node.id));\n\n const childrenIdsByParent = groupChildrenByParent(sortedNodes);\n const nodes = flattenTree(nodesById, childrenIdsByParent);\n\n return ({nodes, nodesById, childrenIdsByParent});\n}\n\nfunction includeParentsAndChildren<ID>(unfilteredNodes: SciTreeTableNode<ID>[], filteredNodes: SciTreeTableNode<ID>[]): Map<ID, SciTreeTableNode<ID>> {\n const nodesById = new Map(unfilteredNodes.map(node => [node.id, node]));\n const filteredIds = new Set(filteredNodes.map(node => node.id));\n\n return unfilteredNodes.reduce((acc, node) => {\n const path = getPathFromRoot(node, nodesById);\n\n // Include the full path (parents and children) of any filtered node.\n // This ensures that all parents and children are displayed, even if they don't match the filter.\n if (path.some(id => filteredIds.has(id))) {\n path.forEach(id => acc.set(id, nodesById.get(id)!));\n }\n\n return acc;\n }, new Map<ID, SciTreeTableNode<ID>>());\n}\n\nfunction groupChildrenByParent<ID>(nodes: SciTreeTableNode<ID>[]): Map<ID | undefined, ID[]> {\n return nodes.reduce((acc, node) => {\n const values = acc.get(node.parentId) ?? [];\n values.push(node.id);\n return acc.set(node.parentId, values);\n }, new Map<ID | undefined, ID[]>());\n}\n\n/**\n * Flattens the tree in depth-first order, placing each parent before its descendants and preserving sibling order.\n * Includes all nodes regardless of expansion state.\n *\n * Example:\n * ```\n * [\n * {id: '1'},\n * {id: '1.1', parentId: '1'},\n * {id: '1.2', parentId: '1'},\n * {id: '1.2.1', parentId: '1.2'},\n * {id: '1.3', parentId: '1'},\n * {id: '2'},\n * ]\n * ```\n */\nfunction flattenTree<ID>(nodesById: Map<ID, SciTreeTableNode<ID>>, childrenIdsByParent: Map<ID | undefined, ID[]>): SciTreeTableNode<ID>[] {\n const nodes: SciTreeTableNode<ID>[] = [];\n const roots = childrenIdsByParent.get(undefined) ?? [];\n const stack = roots.slice().reverse();\n\n // Don't use recursion, to avoid stack overflow on large amount of root nodes (e.g. flat table).\n while (stack.length > 0) {\n const id = stack.pop()!;\n\n nodes.push(nodesById.get(id)!);\n\n // Push children in reverse order so the first child is visited next.\n const children = childrenIdsByParent.get(id) ?? [];\n for (let i = children.length - 1; i >= 0; i--) {\n if (children[i] !== undefined) {\n stack.push(children[i]!);\n }\n }\n }\n\n return nodes;\n}\n\nexport function getPathFromRoot<ID>(node: SciTreeTableNode<ID>, nodesById: Map<ID, SciTreeTableNode<ID>>): ID[] {\n const parent = node.parentId !== undefined ? nodesById.get(node.parentId) : undefined;\n const pathFromRoot = parent ? getPathFromRoot(parent, nodesById) : [];\n return pathFromRoot.concat(node.id);\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {computed, effect, inject, InjectionToken, Injector, isSignal, linkedSignal, NgZone, resource, runInInjectionContext, signal, Signal, untracked, WritableSignal} from '@angular/core';\nimport {eSCI_TABLE_DATASOURCE_PROVIDER, provideTableDatasource, SciTableColumnFilter, SciTableSortCriterion, SciTreeTableNode, SciTreeTableDatasource} from './table-datasource';\nimport {SciEnumValueLike, SciTable, SciTableCellLike, SciTableColumnLike, SciTableDescriptor, SciTableRow, SciTableRowActionFactoryFn, skeletonRowId} from './table.model';\nimport {ɵSciTableColumnFactory} from './ɵtable-column.factory';\nimport {SCI_COMPONENTS_STORAGE, toLazyObservable, ɵcreateDestroyableInjector, ɵSingleActiveInjectorFactory} from '@scion/components/common';\nimport {SciTableCache} from './table.cache';\nimport {rxResource} from '@angular/core/rxjs-interop';\nimport {catchError, combineLatestWith, concat, finalize, fromEvent, of, switchMap, timer} from 'rxjs';\nimport {coerceTableRowBindings, SCI_TABLE_ROW_BINDINGS, SciTableRowBindingFactoryFn} from './table-row-binding';\nimport {clamp, Objects, Observables} from '@scion/toolkit/util';\nimport {map, startWith} from 'rxjs/operators';\nimport {subscribeIn} from '@scion/toolkit/operators';\nimport {SciTableCellValuePreloader} from './table-cell-value-preloader';\nimport {SciTableTree} from './table-tree.model';\nimport {MaybeArray} from '@scion/toolkit/types';\nimport {SciInMemoryTableDatasource} from './in-memory-table-datasource';\n\n/**\n * @docs-private Not public API. For internal use only.\n */\nexport class ɵSciTable<T = unknown, ID = T> implements SciTable<ID> {\n\n private readonly _tableStorage = inject(SCI_COMPONENTS_STORAGE);\n private readonly _injector = inject(Injector);\n\n public readonly name = signal<`table:${string}` | undefined>(undefined);\n public readonly columns: Signal<SciTableColumnLike<T>[]>;\n public readonly rowActions?: SciTableRowActionFactoryFn<T>;\n\n private readonly _rowBindings: SciTableRowBindingFactoryFn<T>[];\n private readonly _datasource: SciTreeTableDatasource<T, ID>;\n private readonly _trackBy?: (item: T) => ID;\n\n public readonly tableViewRef = signal<SciTableViewRef | undefined>(undefined);\n public readonly userSettings: WritableSignal<SciTableUserSettings>;\n public readonly type: 'table' | 'tree';\n public readonly bufferSize: number;\n public readonly pageSize: number;\n public readonly filterable: WritableSignal<boolean>;\n public readonly showHeader: WritableSignal<boolean>;\n public readonly wrapHeader: WritableSignal<boolean>;\n public readonly sortable: WritableSignal<boolean>;\n public readonly resizable: WritableSignal<boolean>;\n public readonly selectable: WritableSignal<'single' | 'multi' | false>;\n\n public readonly scrollRange: Signal<SciScrollRange | undefined>;\n public readonly scrollTop: Signal<number>;\n public readonly virtualScrollOffset: Signal<{top: number; bottom: number}>;\n public readonly viewportPageSize: Signal<number>;\n\n public readonly scrolling: Signal<boolean>;\n public readonly resizing = computed(() => this.columns().some(column => column.resizing()));\n\n public readonly sortCriteria = linkedSignal<SciTableColumnLike<T>[], SciTableSortCriterion[]>({\n source: () => this.columns(), // Discard stale criteria on column change.\n computation: (columns, previous) => previous?.value.filter(criteria => columns.some(column => column.name === criteria.columnName)) ?? [],\n equal: Objects.isEqual,\n });\n\n public readonly columnFilters = linkedSignal<SciTableColumnLike<T>[], SciTableColumnFilter[]>({\n source: () => this.columns(), // Discard stale criteria on column change.\n computation: (columns, previous) => previous?.value.filter(criteria => columns.some(column => column.name === criteria.columnName)) ?? [],\n equal: Objects.isEqual,\n });\n private readonly _cache = new SciTableCache<T, ID>();\n private readonly _tableCellValuePreloader = inject(SciTableCellValuePreloader);\n private readonly _tableFilter = signal<string | null>(null);\n private readonly _tableTree: SciTableTree<ID>;\n\n public readonly hoveredIndex = linkedSignal({\n source: () => {\n this.criteria(); // reset on criteria change\n this.scrolling(); // reset when start scrolling\n },\n computation: () => -1,\n });\n\n public readonly criteria = computed(() => ({sort: this.sortCriteria(), filter: this.columnFilters(), tableFilter: this._tableFilter()}));\n public readonly loading = computed(() => this._tableTree.loading() || this._cache.loading() || this._tableCellValuePreloader.loading());\n public readonly error = computed(() => this._cache.error() || this._tableTree.error());\n public readonly activeRow: Signal<SciTableRow<T, ID> | undefined>;\n public readonly selectedItems = computed(() => [...this._tableTree.selectedNodes().values()]);\n public readonly rowsById = this._cache.rowsById;\n public readonly rows = this.computeRows();\n public readonly visibleRowCount: Signal<number>;\n public readonly visibleRows: Signal<SciTreeTableNode<ID>[] | undefined>;\n public readonly rowIndexById: Signal<Map<ID, number>>;\n public readonly activeItem: Signal<ID | undefined>;\n public readonly activeIndex = computed(() => this.activeItem() !== undefined ? (this.rowIndexById().get(this.activeItem()!) ?? -1) : -1);\n\n constructor(descriptor: SciTableDescriptor<T, ID> & {type?: 'table' | 'tree'}) {\n this.type = descriptor.type ?? 'table';\n this.bufferSize = descriptor.bufferSize ?? 10;\n this.pageSize = descriptor.pageSize ?? 50;\n this.sortable = signal(descriptor.sortable ?? true);\n this.filterable = signal(descriptor.filterable ?? false);\n this.showHeader = signal(descriptor.showHeader ?? true);\n this.wrapHeader = signal(descriptor.wrapHeader ?? false);\n this.resizable = signal(descriptor.resizable ?? true);\n this.selectable = signal(descriptor.selectable ?? 'multi');\n this.userSettings = this.computeUserSettings();\n this.scrollRange = this.computeScrollRange();\n this.scrollTop = this.computeScrollTop();\n this.scrolling = this.computeScrolling();\n this.virtualScrollOffset = this.computeVirtualScrollOffset();\n this.viewportPageSize = this.computeViewportPageSize();\n this.activeRow = this.computeActiveRow();\n this.columns = this.computeColumns(descriptor);\n\n this.rowActions = descriptor.rowActions;\n this._rowBindings = [\n ...descriptor.rowBindings ? [descriptor.rowBindings] : [],\n ...inject<SciTableRowBindingFactoryFn<T>[]>(SCI_TABLE_ROW_BINDINGS, {optional: true}) ?? [],\n ];\n this._trackBy = descriptor.trackBy;\n\n const datasourceProvider = isSignal(descriptor.datasource) ? provideTableDatasource<T>(descriptor.datasource) : descriptor.datasource;\n this._datasource = datasourceProvider[eSCI_TABLE_DATASOURCE_PROVIDER](this);\n\n this._tableTree = new SciTableTree<ID>({\n datasource: this._datasource,\n sortCriteria: this.sortCriteria,\n columnFilters: this.columnFilters,\n tableFilter: this._tableFilter,\n });\n this.visibleRowCount = this._tableTree.visibleNodeCount;\n this.rowIndexById = this._tableTree.nodeIndexById;\n this.visibleRows = this._tableTree.visibleNodes;\n this.activeItem = this._tableTree.activeNode;\n\n this.installPageLoader();\n }\n\n /**\n * Connects {@link SciTableComponent} to the model.\n */\n public connect(name: `table:${string}`, viewRef: SciTableViewRef): void {\n this.name.set(name);\n this.tableViewRef.set(viewRef);\n }\n\n public disconnect(): void {\n this.name.set(undefined);\n this.tableViewRef.set(undefined);\n }\n\n private computeColumns(descriptor: SciTableDescriptor<T, ID>): Signal<SciTableColumnLike<T>[]> {\n // Create a factory to instantiate a new injector per column factory execution, releasing resources allocated in the previous execution.\n const injectorFactory = new ɵSingleActiveInjectorFactory();\n\n return computed(() => runInInjectionContext(injectorFactory.create(), () => {\n const tableColumnFactory = new ɵSciTableColumnFactory<T, ID>(this);\n descriptor.columns(tableColumnFactory);\n return tableColumnFactory.columns;\n }));\n }\n\n /**\n * Computes the rows currently visible in the viewport (+buffer).\n */\n private computeRows(): Signal<SciTableRow<T, ID>[]> {\n return computed(() => {\n const scrollRange = this.scrollRange();\n if (!scrollRange) {\n return [];\n }\n\n const visibleNodes = this._tableTree.visibleNodes();\n const rowsById = this.rowsById();\n const rangeCount = scrollRange.end - scrollRange.start;\n\n const rowCount = Math.min(rangeCount, this._tableTree.loading() ? rangeCount : visibleNodes.length);\n\n // Populate rows with cached rows in the range window, fallback to row shell to show skeleton.\n return untracked(() => Array.from({length: rowCount}, (_, i) => {\n const node = visibleNodes[scrollRange.start + i];\n if (node && rowsById.has(node.id)) {\n return rowsById.get(node.id)!;\n }\n return createSkeletonRow(i);\n }));\n });\n\n function createSkeletonRow(index: number): SciTableRow<T, ID> {\n return {\n index,\n id: skeletonRowId,\n item: undefined!,\n cells: [],\n bindings: coerceTableRowBindings([], undefined, index),\n level: 0,\n hasChildren: signal(false).asReadonly(),\n expanded: signal(false).asReadonly(),\n active: signal(false).asReadonly(),\n selected: signal(false).asReadonly(),\n hovered: signal(false).asReadonly(),\n };\n }\n }\n\n /**\n * Computes the visible row count based on the viewport size.\n */\n private computeScrollRange(): Signal<SciScrollRange | undefined> {\n return computed(() => {\n const tableViewRef = this.tableViewRef();\n if (!tableViewRef) {\n return undefined;\n }\n\n const viewportHeight = tableViewRef.viewportHeight();\n const itemHeight = tableViewRef.itemHeight();\n const scrollTop = this.scrollTop();\n\n const start = Math.floor(scrollTop / itemHeight);\n const viewportRowCount = Math.ceil(viewportHeight / itemHeight);\n const end = Math.min(start + viewportRowCount);\n\n // fill viewport if no data loaded yet\n const totalCount = this._tableTree.loading() ? viewportRowCount : this.visibleRowCount();\n\n return {\n start: clamp(start - this.bufferSize, {min: 0, max: Math.max(0, totalCount - viewportRowCount)}),\n end: clamp(end + this.bufferSize, {max: totalCount}),\n };\n }, {equal: Objects.isEqual});\n }\n\n private computeVirtualScrollOffset(): Signal<{top: number; bottom: number}> {\n return computed(() => {\n // Remove virtual-scroll padding so the error message and retry button are in view.\n if (this.error()) {\n return {top: 0, bottom: 0};\n }\n\n const itemHeight = this.tableViewRef()?.itemHeight() ?? 0;\n const totalCount = this.visibleRowCount();\n const rangeEnd = Math.min(this.scrollRange()?.end ?? 0, totalCount);\n\n return {\n top: (this.scrollRange()?.start ?? 0) * itemHeight,\n bottom: (totalCount - rangeEnd) * itemHeight,\n };\n }, {equal: Objects.isEqual});\n }\n\n private computeViewportPageSize(): Signal<number> {\n return computed(() => {\n const itemHeight = this.tableViewRef()?.itemHeight() ?? 0;\n const viewportHeight = this.tableViewRef()?.viewportHeight() ?? 0;\n return Math.ceil(viewportHeight / itemHeight);\n });\n }\n\n /**\n * Tracks {@link HTMLElement.scrollTop} of the viewport.\n */\n private computeScrollTop(): Signal<number> {\n const zone = inject(NgZone);\n\n return rxResource({\n defaultValue: 0,\n params: () => this.tableViewRef()?.viewport,\n stream: ({params: viewport}) => fromEvent(viewport, 'scroll', {passive: true})\n .pipe(\n map(() => viewport.scrollTop),\n startWith(viewport.scrollTop),\n subscribeIn(fn => zone.runOutsideAngular(fn)),\n ),\n }).value;\n }\n\n /**\n * Tracks whether currently scrolling the viewport.\n */\n private computeScrolling(): Signal<boolean> {\n const zone = inject(NgZone);\n\n return rxResource({\n defaultValue: false,\n params: () => this.tableViewRef()?.viewport,\n stream: ({params: viewport}) => fromEvent(viewport, 'scroll', {passive: true})\n .pipe(\n switchMap(() => concat(of(true), timer(150).pipe(map(() => false)))),\n startWith(false),\n subscribeIn(fn => zone.runOutsideAngular(fn)),\n ),\n }).value;\n }\n\n /**\n * Loads the requested page from the cache or datasource and returns its loading state with a cancelation handler.\n */\n private loadPage(nodeIds: ID[]): {cancel: () => void} {\n const nodeIdsToLoad = nodeIds.filter(id => !this._cache.has(id));\n\n if (nodeIdsToLoad.length === 0) {\n return {\n cancel: () => this._cache.deleteIfLoading(nodeIds),\n };\n }\n\n // Track consistent snapshot of columns and node Ids.\n // If the access happens directly in `mapItemsToRow` they can be out of sync because `nodesById` depends on `columns`.\n // Don't use the rowMapping data as resource params, since it should not refetch from the datasource on change.\n const snapshot = computed(() => {\n const columns = this.columns();\n const nodesById = this._tableTree.nodesById();\n const nodeIndexById = this._tableTree.nodeIndexById();\n return {columns, nodesById, nodeIndexById};\n });\n\n // Create a resource to track loading and error states.\n this._cache.set(nodeIdsToLoad, rxResource({\n stream: () => {\n // Injector for the datasource call; destroyed on stream completion to clean up allocated resources.\n const datasourceInjector = ɵcreateDestroyableInjector({parent: this._injector});\n\n // Create separate injection context per items emission to clean up allocated resources.\n const itemsInjectorFactory = new ɵSingleActiveInjectorFactory({parent: datasourceInjector});\n\n return runInInjectionContext(datasourceInjector, () => Observables.coerce(this._datasource.getItems(nodeIdsToLoad)))\n .pipe(\n combineLatestWith(toLazyObservable(snapshot, {injector: datasourceInjector})),\n map(([response, {columns, nodesById, nodeIndexById}]) => runInInjectionContext(itemsInjectorFactory.create(), () => this.mapItemsToRow(response, columns, nodesById, nodeIndexById))),\n catchError(error => { // TODO [ask etienne] required? Wouldn't it be better to have an effect on error at a single place\n console.error(error);\n throw error;\n }),\n finalize(() => datasourceInjector.destroy()),\n );\n },\n injector: this._injector,\n defaultValue: [],\n }));\n\n return {\n cancel: () => this._cache.deleteIfLoading(nodeIdsToLoad),\n };\n }\n\n /**\n * Toggles sort on a column. ASC -> DESC -> No sort\n *\n * TODO [ego] Revisit API, do we really want a three-state and implicit toggling logic?\n */\n public sort(columnName: `column:${string}`, multi: boolean): void {\n // Scroll to the top as soon as sort changes.\n // Done here explicitly to avoid race-conditions and pages being loaded unnecessarily.\n this.tableViewRef()?.scrollToTop();\n\n this.sortCriteria.update(sortCriteria => {\n const column = this.columns().find(column => column.name === columnName);\n if (!column) {\n throw Error(`[NullColumnError] Column '${columnName}' not found in table '${this.name()}'.`);\n }\n\n const currentSortCriterion = sortCriteria.find(sortCriterion => sortCriterion.columnName === column.name);\n const otherSortCriteria = sortCriteria.filter(sortCriterion => sortCriterion !== currentSortCriterion);\n\n const direction = currentSortCriterion ? (currentSortCriterion.direction === 'asc' ? 'desc' : undefined) : 'asc';\n if (!direction) {\n return multi ? otherSortCriteria : [];\n }\n\n const newSortCriterion = {columnName: column.name, direction} satisfies SciTableSortCriterion;\n return multi ? [...otherSortCriteria, newSortCriterion] : [newSortCriterion];\n });\n }\n\n /**\n * Applies a filter, either via global filter or on a specific column.\n */\n public filter(text: string | null): void;\n public filter(text: string | number | boolean | SciEnumValueLike | SciEnumValueLike[] | null, options: {columnName: `column:${string}`}): void;\n public filter(text: string | number | boolean | SciEnumValueLike | SciEnumValueLike[] | null, options?: {columnName: `column:${string}`}): void {\n // Scroll to the top as soon as filter changes.\n // Done here explicitly to avoid race-conditions and pages being loaded unnecessarily.\n this.tableViewRef()?.scrollToTop();\n\n if (!options) {\n this._tableFilter.set(text as string | null);\n return;\n }\n\n const column = this.columns().find(column => column.name === options.columnName);\n if (!column) {\n throw Error(`[NullColumnError] Column '${options.columnName}' not found in table '${this.name()}'.`);\n }\n\n this.columnFilters.update(filterCriteria => {\n const newFilterCriteria = filterCriteria.filter(filterCriterion => filterCriterion.columnName !== options.columnName);\n return text === null ? newFilterCriteria : newFilterCriteria.concat({columnName: column.name, text});\n });\n }\n\n public setActiveItem(id: ID | undefined): void {\n this._tableTree.setActiveNode(id);\n }\n\n public updateSelectedItems(updateFn: (ids: Set<ID>) => Set<ID>): void {\n this._tableTree.updateSelectedNodes(updateFn);\n }\n\n /**\n * Indicates whether the built-in in-memory datasource is used.\n */\n public isInMemoryDatasource(): boolean {\n return this._datasource instanceof SciInMemoryTableDatasource;\n }\n\n public reload(): void {\n this._cache.clear();\n this._tableTree.reload();\n }\n\n public reloadFailed(): void {\n this._cache.reloadFailed();\n this._tableTree.reloadFailed();\n }\n\n public dispose(): void {\n this._cache.clear();\n this.disconnect();\n }\n\n /**\n * Loads a set of pages on criteria or viewport changes.\n */\n private installPageLoader(): void {\n effect(onCleanup => {\n const scrollRange = this.scrollRange();\n const visibleNodes = this._tableTree.visibleNodes();\n\n if (!scrollRange) {\n return;\n }\n\n untracked(() => {\n // Calculate start and end pages that contain the range.\n const startPage = Math.floor(scrollRange.start / this.pageSize);\n const endPage = Math.floor((scrollRange.end - 1) / this.pageSize);\n\n for (let page = startPage; page <= endPage; page++) {\n const index = page * this.pageSize;\n const nodes = visibleNodes.slice(index, index + this.pageSize).map(node => node.id);\n const pageRef = this.loadPage(nodes);\n onCleanup(() => pageRef.cancel());\n }\n });\n });\n }\n\n private mapItemsToRow(items: T[], columns: SciTableColumnLike<T>[], nodesById: Map<ID, SciTreeTableNode<ID>>, nodeIndexById: Map<ID, number>): SciTableRow<T, ID>[] {\n // Indicates whether there are nodes with children.\n const isTree = Array.from(nodesById.values()).some(node => node.parentId !== undefined);\n\n return items.map((item): SciTableRow<T, ID> | undefined => {\n const id = this.trackBy(item);\n const index = nodeIndexById.get(id);\n const node = nodesById.get(id);\n if (node === undefined || index === undefined) {\n return undefined;\n }\n\n return {\n id,\n index,\n item,\n hovered: computed(() => this.hoveredIndex() === index),\n active: computed(() => this.activeItem() === id),\n selected: computed(() => this._tableTree.selectedNodes().has(id)),\n expanded: computed(() => this._tableTree.expandedNodes().has(id)),\n level: isTree ? calculateLevel(node) : undefined,\n parentId: node.parentId,\n hasChildren: computed(() => (this._tableTree.childrenIdsByParent().get(id)?.length ?? 0) > 0),\n bindings: coerceTableRowBindings(this._rowBindings, item, index),\n cells: columns.map(column => ({\n value: 'value' in column ? column.value(item) : undefined,\n component: column.type === 'component' ? column.component(item) : undefined,\n template: column.type === 'template' ? column.template(item) : undefined,\n type: column.type,\n column,\n } as SciTableCellLike)),\n };\n }).filter((node): node is SciTableRow<T, ID> => !!node);\n\n function calculateLevel(node: SciTreeTableNode<ID>): number {\n if (node.parentId === undefined) {\n return 0;\n }\n\n return calculateLevel(nodesById.get(node.parentId)!) + 1;\n }\n }\n\n /**\n * Creates a signal to read and write table user settings.\n */\n private computeUserSettings(): WritableSignal<SciTableUserSettings> {\n // Load user settings from storage.\n const userSettings = resource({\n params: () => this.name(),\n loader: async ({params: tableName}) => {\n try {\n const serialized = await this._tableStorage.load(`scion.components:${tableName}`);\n return serialized ? JSON.parse(serialized) as SciTableUserSettings : {columns: []};\n }\n catch (error) {\n console.warn(`[SciTable] Failed to load user settings for '${tableName}'.`, error);\n return {columns: []};\n }\n },\n defaultValue: {columns: []},\n });\n\n // Persist settings to storage.\n effect(() => {\n if (userSettings.status() === 'local' && this.name()) {\n untracked(() => void this._tableStorage.store(`scion.components:${this.name()!}`, JSON.stringify(userSettings.value())));\n }\n });\n\n return userSettings.value;\n }\n\n /**\n * Call trackBy function or fallback to track by object reference.\n */\n public trackBy(item: T): ID {\n if (this._trackBy !== undefined) {\n return this._trackBy(item);\n }\n\n return item as unknown as ID;\n }\n\n private computeActiveRow(): Signal<SciTableRow<T, ID> | undefined> {\n return computed(() => {\n const activeItem = this.activeItem();\n const rowsById = this._cache.rowsById();\n\n return rowsById.has(activeItem!) ? rowsById.get(activeItem!) : undefined;\n });\n }\n\n public select(ids: MaybeArray<ID>): void {\n this._tableTree.select(ids);\n }\n\n public expand(ids: MaybeArray<ID>): void {\n this._tableTree.expand(ids);\n }\n\n public isExpanded(id: ID): boolean {\n return this._tableTree.expandedNodes().has(id);\n }\n\n public expandAll(): void {\n this._tableTree.expandAll();\n }\n\n public collapse(ids: MaybeArray<ID>): void {\n this._tableTree.collapse(ids);\n }\n\n public collapseAll(): void {\n this._tableTree.collapseAll();\n }\n\n public toggleRow(id: ID): void {\n this._tableTree.toggleRow(id);\n }\n}\n\nexport interface SciScrollRange {\n /** inclusive */\n start: number;\n /** exclusive */\n end: number;\n}\n\nexport interface SciTableUserSettings {\n columns?: {name: string; width?: number}[];\n}\n\nexport const ɵSCI_TABLE = new InjectionToken<Signal<ɵSciTable>>('ɵSciTable');\n\nexport interface SciTableViewRef {\n viewport: HTMLElement;\n viewportHeight: Signal<number>;\n viewportWidth: Signal<number>;\n viewportClientHeight: Signal<number>;\n viewportClientWidth: Signal<number>;\n headerHeight: Signal<number>;\n cellPadding: Signal<number>;\n itemHeight: Signal<number>;\n scrollToTop: () => void;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {assertInInjectionContext, assertNotInReactiveContext, DestroyRef, inject, Injector, isSignal, runInInjectionContext, Signal} from '@angular/core';\nimport {SciTable, SciTableDescriptor} from './table.model';\nimport {SciTableColumnFactory} from './table-column.factory';\nimport {ɵSciTable} from './ɵtable.model';\n\nexport type SciTableColumnFactoryFn<T> = (table: SciTableColumnFactory<T>) => void;\n\n// IMPORTANT: Do not change order of factory functions for better IntelliSense.\n\n/**\n * Creates a table for displaying tabular or hierarchical data in {@link SciTableComponent}.\n *\n * Pass a descriptor to define the columns, datasource, and display options. Requires at minimum a datasource and columns.\n *\n * ```ts\n * import {table} from '@scion/components/table';\n * import {httpResource} from '@angular/common/http';\n *\n * const users = httpResource<User[]>(() => '/api/users', {defaultValue: []});\n *\n * const userTable = table({\n * datasource: users.value,\n * columns: table => table\n * .addStringColumn('Name', user => user.name)\n * .addBooleanColumn('Inactive', user => user.inactive)\n * .addDateColumn('Expiration', user => user.expiration),\n * });\n * ```\n *\n * In the HTML, bind the created table instance to `<sci-table>`.\n *\n * ```html\n * <sci-table name=\"table:users\" [table]=\"userTable\"/>\n * ```\n *\n * To display a tree structure, provide a hierarchical datasource via {@link provideTableDatasource}, passing a signal\n * containing the root items and a function that returns the children of a given item.\n *\n * ```ts\n * import {table, provideTableDatasource} from '@scion/components/table';\n * import {httpResource} from '@angular/common/http';\n *\n * const users = httpResource<User[]>(() => '/api/users', {defaultValue: []});\n *\n * const userTable = table({\n * datasource: provideTableDatasource(users.value, user => user.children),\n * columns: table => table\n * .addStringColumn('Name', user => user.name)\n * .addBooleanColumn('Inactive', user => user.inactive)\n * .addDateColumn('Expiration', user => user.expiration),\n * });\n * ```\n *\n * Callback functions:\n * - Run in a reactive context and re-evaluate when tracked signals change.\n * - Can call `inject` to get required dependencies. The injection context is destroyed each time the function is called anew.\n *\n * This function:\n * - Must be called within an injection context, or an explicit {@link Injector} passed.\n * - Must be called in a non-reactive (non-tracking) context.\n *\n * @see SciTableComponent\n * @experimental since 22.3.0; API and behavior may change in any version without notice.\n *\n * @param descriptor - Configures the table. Requires a datasource and columns.\n * @return Handle to bind to `<sci-table>` and interact with the table.\n */\nexport function table<T>(descriptor: SciTableDescriptor<T>): SciTable<T>;\n\n/**\n * Creates a table for displaying tabular or hierarchical data in {@link SciTableComponent}.\n *\n * Pass a descriptor to define the columns, datasource, and display options. Requires at minimum a datasource and columns.\n *\n * ```ts\n * import {table} from '@scion/components/table';\n * import {httpResource} from '@angular/common/http';\n *\n * const users = httpResource<User[]>(() => '/api/users', {defaultValue: []});\n *\n * const userTable = table({\n * datasource: users.value,\n * columns: table => table\n * .addStringColumn('Name', user => user.name)\n * .addBooleanColumn('Inactive', user => user.inactive)\n * .addDateColumn('Expiration', user => user.expiration),\n * });\n * ```\n *\n * In the HTML, bind the created table instance to `<sci-table>`.\n *\n * ```html\n * <sci-table name=\"table:users\" [table]=\"userTable\"/>\n * ```\n *\n * To display a tree structure, provide a hierarchical datasource via {@link provideTableDatasource}, passing a signal\n * containing the root items and a function that returns the children of a given item.\n *\n * ```ts\n * import {table, provideTableDatasource} from '@scion/components/table';\n * import {httpResource} from '@angular/common/http';\n *\n * const users = httpResource<User[]>(() => '/api/users', {defaultValue: []});\n *\n * const userTable = table({\n * datasource: provideTableDatasource(users.value, user => user.children),\n * columns: table => table\n * .addStringColumn('Name', user => user.name)\n * .addBooleanColumn('Inactive', user => user.inactive)\n * .addDateColumn('Expiration', user => user.expiration),\n * });\n * ```\n *\n * Callback functions:\n * - Run in a reactive context and re-evaluate when tracked signals change.\n * - Can call `inject` to get required dependencies. The injection context is destroyed each time the function is called anew.\n *\n * This function:\n * - Must be called within an injection context, or an explicit {@link Injector} passed.\n * - Must be called in a non-reactive (non-tracking) context.\n *\n * @see SciTableComponent\n * @experimental since 22.3.0; API and behavior may change in any version without notice.\n *\n * @param descriptor - Configures the table. Requires a datasource and columns.\n * @return Handle to bind to `<sci-table>` and interact with the table.\n */\nexport function table<T, ID>(descriptor: SciTableDescriptor<T, ID> & {trackBy: (item: T) => ID}): SciTable<ID>;\n\n/**\n * Creates a table for displaying tabular data in {@link SciTableComponent}.\n *\n * Pass a signal containing the items to display in the table and a factory function to define the columns.\n * The table calls the passed function with a factory that has methods for adding columns to the table.\n *\n * NOTE: This function is a shorthand for creating a table directly from data and columns; pass a descriptor instead to display a tree structure, configure a custom datasource, or set additional options.\n *\n * ```ts\n * import {SciTableComponent, table} from '@scion/components/table';\n * import {httpResource} from '@angular/common/http';\n *\n * // Load data to display in the table.\n * const users = httpResource<User[]>(() => '/api/users', {defaultValue: []});\n *\n * // Create the table and pass data.\n * const userTable = table(users.value, table => table\n * .addStringColumn('Name', user => user.name)\n * .addBooleanColumn('Inactive', user => user.inactive)\n * .addDateColumn('Expiration', user => user.expiration),\n * );\n * ```\n *\n * In the HTML, bind the created table instance to `<sci-table>`.\n *\n * ```html\n * <sci-table name=\"table:users\" [table]=\"userTable\"/>\n * ```\n *\n * Callback functions:\n * - Run in a reactive context and re-evaluate when tracked signals change.\n * - Can call `inject` to get required dependencies. The injection context is destroyed each time the function is called anew.\n *\n * This function:\n * - Must be called within an injection context, or an explicit {@link Injector} passed.\n * - Must be called in a non-reactive (non-tracking) context.\n *\n * @see SciTableComponent\n * @experimental since 22.3.0; API and behavior may change in any version without notice.\n *\n * @param data - Specifies items to display in the table.\n * @param columnFactoryFn - Specifies a factory function to add columns to the table.\n * @param options - Controls table creation.\n * @param options.injector - Injector used to create the table. Defaults to the current injection context. The table is disposed when the passed injector is destroyed.\n * @return Handle to bind to `<sci-table>` and interact with the table.\n */\nexport function table<T>(data: Signal<T[]>, columnFactoryFn: SciTableColumnFactoryFn<T>, options?: {injector?: Injector}): SciTable<T>;\n\nexport function table<T, ID = T>(dataOrDescriptor: Signal<T[]> | SciTableDescriptor<T, ID>, columnFactoryFn?: SciTableColumnFactoryFn<T>, options?: {injector?: Injector}): SciTable<ID> {\n assertNotInReactiveContext(table, 'Call table in a non-reactive (non-tracking) context, such as within the untracked() function.');\n\n const descriptor = isSignal(dataOrDescriptor) ? ({datasource: dataOrDescriptor, columns: columnFactoryFn!, injector: options?.injector}) satisfies SciTableDescriptor<T> : dataOrDescriptor;\n if (!descriptor.injector) {\n assertInInjectionContext(table);\n }\n\n const injector = descriptor.injector ?? inject(Injector);\n const sciTable = runInInjectionContext(injector, () => new ɵSciTable(descriptor));\n injector.get(DestroyRef).onDestroy(() => sciTable.dispose());\n\n return sciTable;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\n/**\n * Creates a range of integers starting at `start` and ending at `end` (including `end`).\n */\nexport function rangeInclusive(start: number, end: number): number[] {\n const range: number[] = [];\n for (let i = start; i <= end; i++) {\n range.push(i);\n }\n return range;\n}\n\n/**\n * Indicates whether the given event was triggered from an input element.\n */\nexport function isFromInput(event: Event): boolean {\n if (event.target instanceof Element && event.target.closest('input, textarea, select') !== null) {\n return true;\n }\n if (event.target instanceof HTMLElement && event.target.isContentEditable) {\n return true;\n }\n return false;\n}\n\n/**\n * Indicates whether the given keyboard event was triggered from a button.\n */\nexport function isFromButton(event: Event): boolean {\n return event.target instanceof Element && event.target.closest('button') !== null;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {inject, Injectable, Signal} from '@angular/core';\nimport {ɵSCI_TABLE, ɵSciTable} from './ɵtable.model';\nimport {rangeInclusive} from './common';\nimport {skeletonRowId} from './table.model';\nimport {SciTreeTableNode} from './table-datasource';\n\n@Injectable()\nexport class SciTableSelectionService<T, ID> {\n\n private readonly _table = inject<Signal<ɵSciTable<T, ID>>>(ɵSCI_TABLE);\n\n public async onRowClick(index: number, event: {ctrlKey: boolean; shiftKey: boolean; metaKey: boolean}): Promise<void> {\n const table = this._table();\n const rowId = table.visibleRows()?.[index]?.id;\n const previousActiveIndex = table.activeIndex();\n\n table.setActiveItem(rowId);\n\n if (rowId === undefined || !table.selectable()) {\n return;\n }\n\n if (table.selectable() === 'single') {\n table.updateSelectedItems(() => new Set<ID>().add(rowId));\n return;\n }\n\n if (event.shiftKey && previousActiveIndex >= 0) {\n const start = Math.min(previousActiveIndex, index);\n const end = Math.max(previousActiveIndex, index);\n await this.selectItems(start, end, {add: true});\n }\n else if (event.ctrlKey || event.metaKey) {\n this.toggleSelectedItem(rowId);\n }\n else {\n // If no modifier is pressed set the selection to the clicked row.\n table.updateSelectedItems(() => new Set<ID>().add(rowId));\n }\n }\n\n public async onArrowUp(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeIndex = table.activeIndex();\n const targetIndex = Math.max(activeIndex - 1, 0);\n\n await this.selectOnKeyboardNavigation(targetIndex, event as KeyboardEvent);\n }\n\n public async onArrowDown(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeIndex = table.activeIndex();\n const targetIndex = Math.min(activeIndex + 1, table.visibleRowCount() - 1);\n\n await this.selectOnKeyboardNavigation(targetIndex, event as KeyboardEvent);\n }\n\n public async onArrowLeft(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeRow = table.activeRow();\n\n if (activeRow?.item === undefined || activeRow.id === skeletonRowId) {\n return;\n }\n\n if (activeRow.hasChildren() && activeRow.expanded()) {\n table.collapse(activeRow.id);\n }\n else if (activeRow.parentId !== undefined) {\n const parentIndex = table.rowIndexById().get(activeRow.parentId) ?? -1;\n await this.selectOnKeyboardNavigation(parentIndex, {shiftKey: false, ctrlKey: false, metaKey: false});\n }\n // Root case\n else {\n const rows = table.visibleRows();\n const row = findPreviousExpandedRow(activeRow.index - 1);\n\n if (row !== undefined) {\n const index = table.rowIndexById().get(row.id) ?? -1;\n await this.selectOnKeyboardNavigation(index, {shiftKey: false, ctrlKey: false, metaKey: false});\n }\n\n function findPreviousExpandedRow(index: number): SciTreeTableNode<ID> | undefined {\n while (index > 0) {\n const row = rows?.[index];\n // Get the row expansion state whether the row is already loaded or not.\n if (row !== undefined && table.isExpanded(row.id)) {\n return row;\n }\n index--;\n }\n\n // Return the first row if no previous row is expanded.\n return rows?.[index];\n }\n }\n }\n\n public async onArrowRight(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeRow = table.activeRow();\n const activeIndex = table.activeIndex();\n const endIndex = Math.min(activeIndex + 1, table.visibleRowCount() - 1);\n\n if (activeRow?.id !== skeletonRowId && activeRow?.hasChildren() && !activeRow.expanded()) {\n table.expand(activeRow.id);\n return;\n }\n\n await this.selectOnKeyboardNavigation(endIndex, {shiftKey: false, ctrlKey: false, metaKey: false});\n }\n\n public async onPageUp(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeIndex = table.activeIndex();\n const targetIndex = Math.max(activeIndex - table.viewportPageSize() + 1, 0);\n\n await this.selectOnKeyboardNavigation(targetIndex, event as KeyboardEvent);\n }\n\n public async onPageDown(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const activeIndex = table.activeIndex();\n const targetIndex = Math.min(activeIndex + table.viewportPageSize() - 1, table.visibleRowCount() - 1);\n\n await this.selectOnKeyboardNavigation(targetIndex, event as KeyboardEvent);\n }\n\n public async onHome(event: Event): Promise<void> {\n event.preventDefault();\n\n await this.selectOnKeyboardNavigation(0, event as KeyboardEvent);\n }\n\n public async onEnd(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const targetIndex = table.visibleRowCount() - 1;\n\n await this.selectOnKeyboardNavigation(targetIndex, event as KeyboardEvent);\n }\n\n public onSpace(event: Event): void {\n event.preventDefault();\n\n const table = this._table();\n if (!table.selectable()) {\n return;\n }\n\n const activeItemId = table.activeItem();\n if (activeItemId === undefined) {\n return;\n }\n\n const keyboardEvent = event as KeyboardEvent;\n const ctrlOrMeta = keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n\n if (ctrlOrMeta) {\n this.toggleSelectedItem(activeItemId);\n }\n else {\n table.updateSelectedItems(() => new Set<ID>().add(activeItemId));\n }\n }\n\n public async onControlA(event: Event): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n const totalCount = table.visibleRowCount();\n\n if (table.selectable() === 'multi' && totalCount >= 0) {\n await this.selectItems(0, totalCount - 1);\n }\n }\n\n private async selectOnKeyboardNavigation(targetIndex: number, event: {shiftKey: boolean; ctrlKey: boolean; metaKey: boolean}): Promise<void> {\n const table = this._table();\n const targetItem = table.visibleRows()?.[targetIndex]?.id;\n const activeIndex = table.activeIndex();\n const direction = activeIndex > targetIndex ? 'up' : 'down';\n const [startIndex, endIndex] = direction === 'up' ? [targetIndex, activeIndex] : [activeIndex, targetIndex];\n const shift = event.shiftKey;\n const ctrlOrMeta = event.ctrlKey || event.metaKey;\n\n if (table.selectable() !== 'multi') {\n // Don't modify selection when only ctrlOrMeta is pressed.\n if (table.selectable() === 'single' && (shift || !ctrlOrMeta)) {\n await this.selectItems(targetIndex, targetIndex);\n }\n\n table.setActiveItem(targetItem);\n return;\n }\n\n if (shift && ctrlOrMeta) {\n await this.selectItems(startIndex, endIndex, {add: true});\n }\n else if (shift) {\n await this.selectOnShiftNavigation(direction, startIndex, endIndex);\n }\n else if (ctrlOrMeta) {\n // Selection remains unchanged.\n }\n else {\n await this.selectItems(targetIndex, targetIndex);\n }\n\n table.setActiveItem(targetItem);\n }\n\n private selectOnShiftNavigation(direction: 'up' | 'down', startIndex: number, endIndex: number): Promise<void> {\n const table = this._table();\n const activeIndex = table.activeIndex();\n const selectedIds = table.selectedItems();\n\n // If the active item is outside the selection, start a new selection.\n if (!selectedIds.includes(table.activeItem()!)) {\n return this.selectItems(startIndex, endIndex);\n }\n\n // Moving down from the block start shrinks the selection until the block end, then extends it.\n if (direction === 'down' && this.isSelectionAtBlockStart(activeIndex)) {\n return this.selectFromBlockStart(startIndex, endIndex);\n }\n\n // Moving up from the block end shrinks the selection until the block start, then extends it.\n if (direction === 'up' && this.isSelectionAtBlockEnd(activeIndex)) {\n return this.selectFromBlockEnd(startIndex, endIndex);\n }\n\n // In other cases, e.g. going down at the end of a selection block, select all items in the range.\n return this.selectItems(startIndex, endIndex, {add: true});\n }\n\n private isSelectionAtBlockStart(activeIndex: number): boolean {\n const table = this._table();\n const selectedIds = table.selectedItems();\n\n const previousItemId = table.visibleRows()?.[activeIndex - 1]?.id;\n const nextItemId = table.visibleRows()?.[activeIndex + 1]?.id;\n\n return (previousItemId === undefined || !selectedIds.includes(previousItemId)) && nextItemId !== undefined && selectedIds.includes(nextItemId);\n }\n\n private isSelectionAtBlockEnd(activeIndex: number): boolean {\n const table = this._table();\n const selectedIds = table.selectedItems();\n\n const previousItemId = table.visibleRows()?.[activeIndex - 1]?.id;\n const nextItemId = table.visibleRows()?.[activeIndex + 1]?.id;\n\n return previousItemId !== undefined && selectedIds.includes(previousItemId) && (nextItemId === undefined || !selectedIds.includes(nextItemId));\n }\n\n private async selectItems(startIndex: number, endIndex: number, options?: {add: boolean}): Promise<void> {\n const table = this._table();\n if (!table.selectable()) {\n return;\n }\n\n const indices = rangeInclusive(startIndex, endIndex);\n const add = options?.add ?? false;\n const rows = indices.map(i => table.visibleRows()?.[i]);\n\n table.updateSelectedItems(existing => new Set<ID>([\n ...(add ? existing : []),\n ...rows\n .filter((row): row is Required<SciTreeTableNode<ID>> => !!row)\n .map(row => row.id),\n ]));\n }\n\n private async selectFromBlockStart(startIndex: number, endIndex: number): Promise<void> {\n const table = this._table();\n const indices = rangeInclusive(startIndex, endIndex);\n\n table.updateSelectedItems(selection => {\n const newSelection = new Set(selection);\n let shrinking = true;\n\n for (let i = 0; i < indices.length; i++) {\n const currentIndex = indices[i]!;\n const nextIndex = indices[i + 1]!;\n const itemId = table.visibleRows()?.[currentIndex]?.id;\n\n if (itemId === undefined) {\n continue;\n }\n\n const nextItemId = table.visibleRows()?.[nextIndex]?.id;\n if (shrinking && nextItemId !== undefined && selection.has(nextItemId)) {\n newSelection.delete(itemId);\n }\n else {\n // Once outside the active block, only add items, even when crossing another selected block.\n shrinking = false;\n newSelection.add(itemId);\n }\n }\n return newSelection;\n });\n }\n\n private async selectFromBlockEnd(startIndex: number, endIndex: number): Promise<void> {\n const table = this._table();\n const indices = rangeInclusive(startIndex, endIndex);\n\n table.updateSelectedItems(selection => {\n const newSelection = new Set(selection);\n let shrinking = true;\n\n for (let i = indices.length - 1; i >= 0; i--) {\n const currentIndex = indices[i]!;\n const previousIndex = indices[i - 1]!;\n const itemId = table.visibleRows()?.[currentIndex]?.id;\n\n if (itemId === undefined) {\n continue;\n }\n\n const previousItemId = table.visibleRows()?.[previousIndex]?.id;\n if (shrinking && previousItemId !== undefined && selection.has(previousItemId)) {\n newSelection.delete(itemId);\n }\n else {\n // Once outside the active block, only add items, even when crossing another selected block.\n shrinking = false;\n newSelection.add(itemId);\n }\n }\n return newSelection;\n });\n }\n\n private toggleSelectedItem(id: ID): void {\n const table = this._table();\n\n table.updateSelectedItems(selection => {\n const next = new Set(selection);\n if (next.has(id)) {\n next.delete(id);\n }\n else {\n if (table.selectable() === 'single') {\n next.clear();\n }\n next.add(id);\n }\n return next;\n });\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Pipe, PipeTransform} from '@angular/core';\n\n/**\n * Formats a given number based on the provided {@link Intl.NumberFormat}.\n */\n@Pipe({name: 'sciNumber'})\nexport class SciNumberPipe implements PipeTransform {\n\n public transform(number: number | undefined, format: Intl.NumberFormat): string | undefined {\n return number !== undefined ? format.format(number) : undefined;\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, computed, inject, input, Signal, TemplateRef} from '@angular/core';\nimport {SciTableCellLike, SciTableRow} from '../table.model';\nimport {NgTemplateOutlet} from '@angular/common';\nimport {coerceSignal, SciComponentOutletDirective, SciTooltipOnOverflowDirective} from '@scion/components/common';\nimport {Arrays, Objects} from '@scion/toolkit/util';\nimport {SciIconComponent} from '@scion/components/icon';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\nimport {SciNumberPipe} from './number.pipe';\n\n@Component({\n selector: 'sci-table-cell',\n templateUrl: './table-cell.component.html',\n styleUrl: './table-cell.component.scss',\n host: {\n '[attr.data-type]': 'cell().column.type',\n '[attr.data-column]': 'cell().column.name',\n '[attr.data-value]': 'value()',\n '[attr.data-padding]': '!cell().column.padding ? false : null',\n '[attr.part]': 'partAttribute()',\n },\n imports: [\n NgTemplateOutlet,\n SciIconComponent,\n SciComponentOutletDirective,\n SciNumberPipe,\n ],\n hostDirectives: [\n SciTooltipOnOverflowDirective,\n ],\n})\nexport class SciTableCellComponent<T, ID> {\n\n public readonly cell = input.required<SciTableCellLike>();\n public readonly row = input.required<SciTableRow<T, ID>>();\n\n private readonly _table = inject(ɵSCI_TABLE);\n\n protected readonly template = this.computeTemplate();\n protected readonly templateContext = this.computeTemplateContext();\n protected readonly partAttribute = this.computePartAttribute();\n protected readonly value = this.computeValueAttribute();\n\n private computeTemplate(): Signal<TemplateRef<unknown> | null> {\n return computed(() => {\n const cell = this.cell();\n\n if (cell.type !== 'template') {\n return null;\n }\n\n return coerceSignal(cell.template.template)();\n });\n }\n\n private computeTemplateContext(): Signal<{$implicit: T} | null> {\n return computed(() => {\n const cell = this.cell();\n const item = this.row().item;\n\n if (cell.type !== 'template') {\n return null;\n }\n\n return {\n $implicit: item,\n ...Objects.entries(cell.template.context ?? {}).reduce((context, [key, value]) => ({\n ...context,\n [key]: coerceSignal(value)?.(), // eslint-disable-line @typescript-eslint/no-unnecessary-condition\n }), {}),\n };\n });\n }\n\n private computePartAttribute(): Signal<string> {\n return computed(() => {\n const cell = this.cell();\n const partType = this._table().type === 'tree' ? 'node' : 'row';\n const referenceType = cell.type === 'enum' ? cell.column.referenceType : undefined;\n\n return Arrays.distinct([\n // Enable column styling based on column type. For enum columns, resolves to the reference type, if any, i.e., boolean or icon.\n `column:${referenceType ?? cell.column.type}`,\n // Enable column styling based on column name.\n cell.column.name,\n // Enable row styling based on selection state.\n this.row().selected() ? `${partType}:selected` : `${partType}:not:selected`,\n // Enable row styling based on active state.\n this.row().active() ? `${partType}:active` : `${partType}:not:active`,\n // Enable row styling based on row bindings.\n ...Arrays.coerce(this.row().bindings.parts()),\n ]).join(' ');\n });\n }\n\n private computeValueAttribute(): Signal<string | undefined> {\n return computed(() => {\n const cell = this.cell();\n const value = (() => {\n switch (cell.type) {\n case 'string':\n case 'number':\n return cell.value();\n case 'enum':\n return cell.value()?.value;\n case 'date':\n return cell.value()?.isoString;\n default:\n return undefined;\n }\n })();\n return value !== undefined ? `${value}` : undefined;\n });\n }\n}\n","@let cell = this.cell();\n\n@switch (cell.type) {\n @case ('template') {\n <ng-template *ngTemplateOutlet=\"template(); context: templateContext()\"/>\n }\n @case ('component') {\n <ng-container *sciComponentOutlet=\"cell.component\"/>\n }\n @case ('date') {\n {{cell.value()?.formatted}}\n }\n @case ('number') {\n {{cell.value() | sciNumber:cell.column.format()}}\n }\n @case ('enum') {\n @let value = cell.value();\n @if (value !== undefined) {\n @if (cell.column.format.icon && value.icon !== undefined) {\n <sci-icon [attr.title]=\"value.tooltip\">{{value.icon}}</sci-icon>\n }\n @if (cell.column.format.label) {\n <span>{{value.label}}</span>\n }\n }\n }\n @default {\n {{cell.value()}}\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, inject, input, output, Signal, viewChild} from '@angular/core';\nimport {SciTableEvent, SciTableRow, skeletonRowId} from '../table.model';\nimport {SciTableCellComponent} from '../table-cell/table-cell.component';\nimport {ɵSCI_TABLE, ɵSciTable} from '../ɵtable.model';\nimport {SciTableSelectionService} from '../table-selection.service';\nimport {contributeMenu, SciToolbarComponent} from '@scion/components/menu';\nimport {UUID} from '@scion/toolkit/uuid';\nimport {SciIconComponent} from '@scion/components/icon';\nimport {isFromButton, isFromInput} from '../common';\n\n@Component({\n selector: 'sci-table-row',\n templateUrl: './table-row.component.html',\n styleUrl: './table-row.component.scss',\n imports: [\n SciTableCellComponent,\n SciToolbarComponent,\n SciIconComponent,\n ],\n host: {\n '[attr.data-active]': `row().active() ? '' : null`,\n '[attr.data-selected]': `row().selected() ? '' : null`,\n '[attr.data-hovered]': `row().hovered() ? '' : null`,\n '[attr.data-level]': 'row().level',\n '[attr.data-state]': `row().level !== undefined && row().hasChildren() ? (row().expanded() ? 'expanded' : 'collapsed') : null`,\n '[style.--ɵsci-table-row-level]': 'row().level', // only set if hierarchical\n '(click)': 'onRowClick($event)',\n '(dblclick)': 'onRowDblClick($event)',\n '(mouseenter)': 'onRowMouseEnter()',\n '(mouseleave)': 'onRowMouseLeave($event)',\n },\n})\nexport class SciTableRowComponent<T, ID> {\n\n public readonly row = input.required<SciTableRow<T, ID>>();\n public readonly primaryAction = output<SciTableEvent<ID>>();\n\n protected readonly table = inject<Signal<ɵSciTable<T, ID>>>(ɵSCI_TABLE);\n private readonly _selectionService = inject(SciTableSelectionService);\n\n protected readonly rowActionToolbar = viewChild(SciToolbarComponent);\n protected readonly rowActionsToolbarName = `toolbar:${UUID.randomUUID()}` as const;\n\n constructor() {\n this.contributeRowActions();\n }\n\n protected onRowClick(event: PointerEvent): void {\n const row = this.row();\n if (row.id === skeletonRowId) {\n return;\n }\n const index = this.table().rowIndexById().get(row.id) ?? -1;\n void this._selectionService.onRowClick(index, event);\n }\n\n protected onRowDblClick(event: MouseEvent): void {\n const row = this.row();\n if (row.id === skeletonRowId || isFromInput(event) || isFromButton(event)) {\n return;\n }\n this.primaryAction.emit({sourceEvent: event, items: [row.id]});\n }\n\n protected onRowMouseEnter(): void {\n const row = this.row();\n if (row.id === skeletonRowId) {\n return;\n }\n const index = this.table().rowIndexById().get(row.id) ?? -1;\n this.table().hoveredIndex.set(index);\n }\n\n protected onRowMouseLeave(event: MouseEvent): void {\n const next = event.relatedTarget;\n // Do not unset hovered row when hovering a column resize splitter.\n if (next instanceof Element && next.closest('sci-splitter')) {\n return;\n }\n\n this.table().hoveredIndex.set(-1);\n }\n\n protected onActionToolbarClick(event: PointerEvent): void {\n const row = this.row();\n if (row.id === skeletonRowId) {\n return;\n }\n event.stopPropagation(); // prevent selecting the row\n this.table().setActiveItem(row.id);\n }\n\n protected onTreeNodeHandle(event: PointerEvent): void {\n const row = this.row();\n if (row.id === skeletonRowId) {\n return;\n }\n event.stopPropagation(); // prevent selecting the row\n this.table().toggleRow(row.id);\n }\n\n private contributeRowActions(): void {\n contributeMenu(this.rowActionsToolbarName, toolbar => {\n if (this.row().id !== skeletonRowId) {\n this.table().rowActions?.(toolbar, this.row().item, this.row().index);\n }\n });\n }\n}\n","@let row = this.row();\n\n<!-- Handle to expand or collapse a tree node -->\n@if (row.level !== undefined) {\n <button class=\"tree-node-handle e2e-tree-node-handle\" (click)=\"onTreeNodeHandle($event)\" [attr.disabled]=\"!row.hasChildren() || null\">\n @if (row.expanded()) {\n <sci-icon class=\"e2e-expanded\">scion:chevron_down</sci-icon>\n } @else {\n <sci-icon class=\"e2e-collapsed\">scion:chevron_right</sci-icon>\n }\n </button>\n}\n\n<!-- Row Icons -->\n@if (row.cells.length) {\n @for (icon of row.bindings.icons(); track $index) {\n <sci-icon>{{icon}}</sci-icon>\n }\n}\n\n<!-- Table Cells -->\n@for (cell of row.cells; track cell.column.name) {\n <sci-table-cell [cell]=\"cell\" [row]=\"row\"/>\n} @empty {\n @for (column of table().columns(); track column.name) {\n <div class=\"skeleton e2e-skeleton\" [attr.data-column]=\"column.name\"></div>\n }\n}\n\n<!--Row Actions -->\n@let hasRowActions = !!table().rowActions;\n@let isRowHovered = table().hoveredIndex() === row.index;\n@let isRowActionMenuOpen = rowActionToolbar()?.menuOpen();\n\n@if (hasRowActions && (isRowHovered || isRowActionMenuOpen)) {\n <sci-toolbar [name]=\"rowActionsToolbarName\" (click)=\"onActionToolbarClick($event)\" class=\"row-actions\"/>\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Directive, inject, Signal} from '@angular/core';\nimport {SciTableSelectionService} from './table-selection.service';\nimport {isFromButton, isFromInput} from './common';\nimport {skeletonRowId} from './table.model';\nimport {ɵSCI_TABLE, ɵSciTable} from './ɵtable.model';\n\n@Directive({\n selector: '[sciTableKeyboardNavigator]',\n host: {\n '[attr.tabindex]': '0', // required for keyboard navigation\n\n '(keydown.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n '(keydown.shift.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n '(keydown.control.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n '(keydown.meta.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n '(keydown.shift.control.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n '(keydown.shift.meta.arrowUp)': 'isFromInput($event) || selectionService.onArrowUp($event)',\n\n '(keydown.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n '(keydown.shift.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n '(keydown.control.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n '(keydown.meta.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n '(keydown.shift.control.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n '(keydown.shift.meta.arrowDown)': 'isFromInput($event) || selectionService.onArrowDown($event)',\n\n '(keydown.arrowLeft)': 'isFromInput($event) || selectionService.onArrowLeft($event)',\n\n '(keydown.arrowRight)': 'isFromInput($event) || selectionService.onArrowRight($event)',\n\n '(keydown.space)': 'isFromInput($event) || isFromButton($event) || selectionService.onSpace($event)',\n '(keydown.control.space)': 'isFromInput($event) || isFromButton($event) || selectionService.onSpace($event)',\n '(keydown.meta.space)': 'isFromInput($event) || isFromButton($event) || selectionService.onSpace($event)',\n\n '(keydown.control.a)': 'isFromInput($event) || selectionService.onControlA($event)',\n '(keydown.meta.a)': 'isFromInput($event) || selectionService.onControlA($event)',\n\n '(keydown.pageUp)': 'isFromInput($event) || selectionService.onPageUp($event)',\n '(keydown.shift.pageUp)': 'isFromInput($event) || selectionService.onPageUp($event)',\n '(keydown.control.pageUp)': 'isFromInput($event) || selectionService.onPageUp($event)',\n '(keydown.meta.pageUp)': 'isFromInput($event) || selectionService.onPageUp($event)',\n '(keydown.shift.control.pageUp)': 'isFromInput($event) || selectionService.onPageUp($event)',\n '(keydown.shift.meta.pageUp)': 'isFromInput($event) || selectionService.onPageUp($event)',\n\n '(keydown.pageDown)': 'isFromInput($event) || selectionService.onPageDown($event)',\n '(keydown.shift.pageDown)': 'isFromInput($event) || selectionService.onPageDown($event)',\n '(keydown.control.pageDown)': 'isFromInput($event) || selectionService.onPageDown($event)',\n '(keydown.meta.pageDown)': 'isFromInput($event) || selectionService.onPageDown($event)',\n '(keydown.shift.control.pageDown)': 'isFromInput($event) || selectionService.onPageDown($event)',\n '(keydown.shift.meta.pageDown)': 'isFromInput($event) || selectionService.onPageDown($event)',\n\n '(keydown.home)': 'isFromInput($event) || selectionService.onHome($event)',\n '(keydown.shift.home)': 'isFromInput($event) || selectionService.onHome($event)',\n '(keydown.control.home)': 'isFromInput($event) || selectionService.onHome($event)',\n '(keydown.meta.home)': 'isFromInput($event) || selectionService.onHome($event)',\n '(keydown.shift.control.home)': 'isFromInput($event) || selectionService.onHome($event)',\n '(keydown.shift.meta.home)': 'isFromInput($event) || selectionService.onHome($event)',\n\n '(keydown.end)': 'isFromInput($event) || selectionService.onEnd($event)',\n '(keydown.shift.end)': 'isFromInput($event) || selectionService.onEnd($event)',\n '(keydown.control.end)': 'isFromInput($event) || selectionService.onEnd($event)',\n '(keydown.meta.end)': 'isFromInput($event) || selectionService.onEnd($event)',\n '(keydown.shift.control.end)': 'isFromInput($event) || selectionService.onEnd($event)',\n '(keydown.shift.meta.end)': 'isFromInput($event) || selectionService.onEnd($event)',\n\n '(keydown)': 'isFromInput($event) || onKeydown($event)',\n },\n})\nexport class SciTableKeyboardNavigatorDirective<T, ID> {\n\n private readonly _table = inject<Signal<ɵSciTable<T, ID>>>(ɵSCI_TABLE);\n\n protected readonly selectionService = inject(SciTableSelectionService);\n\n protected readonly isFromInput = isFromInput;\n protected readonly isFromButton = isFromButton;\n\n public async onKeydown(event: KeyboardEvent): Promise<void> {\n if (event.key === '+' && event.location === 3) { // NumpadAdd\n void this.onNumpadAdd(event);\n }\n else if (event.key === '-' && event.location === 3) { // NumpadSubtract\n void this.onNumpadSubtract(event);\n }\n }\n\n public async onNumpadAdd(event: KeyboardEvent): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n\n if (event.ctrlKey || event.metaKey) {\n table.expandAll();\n return;\n }\n\n const activeRow = table.activeRow();\n if (activeRow?.id !== skeletonRowId && activeRow?.hasChildren()) {\n table.expand(activeRow.id);\n }\n }\n\n public async onNumpadSubtract(event: KeyboardEvent): Promise<void> {\n event.preventDefault();\n\n const table = this._table();\n\n if (event.ctrlKey || event.metaKey) {\n table.collapseAll();\n return;\n }\n\n const activeRow = table.activeRow();\n if (activeRow?.id !== skeletonRowId && activeRow?.hasChildren()) {\n table.collapse(activeRow.id);\n }\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {SciTableColumnLike} from '../table.model';\nimport {afterNextRender, computed, inject, Injectable, Injector, Signal, signal, WritableSignal} from '@angular/core';\nimport {clamp} from '@scion/toolkit/util';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\n\n@Injectable()\nexport class SciTableColumnService {\n\n private readonly _table = inject(ɵSCI_TABLE);\n private readonly _injector = inject(Injector);\n\n /**\n * State while resizing a column.\n */\n private readonly _resizingState = signal<ColumnResizingState | undefined>(undefined);\n\n /**\n * Provides the calculated CSS `grid-template-columns` value based on configured and resized column widths.\n */\n public readonly gridTemplateColumns = this.computeGridTemplateColumns();\n\n /**\n * Computes the CSS `grid-template-columns` value.\n *\n * Columns are layed out according to their configured widths. While resizing a column, absolute pixel widths are used.\n */\n private computeGridTemplateColumns(): Signal<string> {\n return computed(() => {\n return this._table().columns()\n .map(column => {\n const width = this._resizingState()?.columnWidths()?.get(column.name) ?? column.width();\n if (typeof width === 'number') {\n return `${width}px`;\n }\n if (width.endsWith('fr')) {\n return cssMinmax({min: column.minWidth, max: width});\n }\n return width;\n })\n .join(' ') || '100%'; // fill full width if no column\n });\n }\n\n public startResize(column: SciTableColumnLike): void {\n column.resizing.set(true);\n this._resizingState.set({column, columnWidths: signal(undefined)});\n }\n\n public resize(columnWidth: number | 'min-content'): void {\n const state = this._resizingState()!;\n const clampedWidth = typeof columnWidth === 'number' ? clamp(columnWidth, {min: state.column.minWidth}) : columnWidth;\n\n if (clampedWidth !== state.columnWidths()?.get(state.column.name)) {\n const columnWidths = this.calculateColumnWidths(state.column, clampedWidth);\n state.columnWidths.set(columnWidths);\n }\n }\n\n public endResize(): void {\n const {column} = this._resizingState()!;\n\n // Run on next render to update user settings with effective column widths read from the DOM.\n afterNextRender(() => {\n this.updateUserSettings(column);\n column.resizing.set(false);\n this._resizingState.set(undefined);\n }, {injector: this._injector});\n }\n\n /**\n * Updates user settings with current column widths.\n */\n private updateUserSettings(resizedColumn: SciTableColumnLike): void {\n const resizedColumnIndex = this._table().columns().indexOf(resizedColumn);\n this._table().userSettings.update(userSettings => ({\n ...userSettings,\n columns: this._table().columns().flatMap((column, index) => {\n const columnSettings = userSettings.columns?.find(it => it.name === column.name);\n // Store the width of the resized column and all columns to its left.\n if (index <= resizedColumnIndex) {\n return {\n ...columnSettings ?? {name: column.name},\n width: column.location.width,\n };\n }\n\n return columnSettings ?? [];\n }),\n }));\n }\n\n /**\n * Calculates absolute column widths based on the resized column's new width.\n *\n * Any remaining viewport space is distributed proportionally among flex-sized columns using their current width ratio.\n */\n private calculateColumnWidths(columnToResize: SciTableColumnLike, newColumnWidth: number | 'min-content'): Map<`column:${string}`, number | 'min-content'> {\n const columns = this._table().columns();\n const columnIndex = columns.indexOf(columnToResize);\n\n return columns.reduce((map, column, index) => {\n if (index < columnIndex) {\n return map.set(column.name, column.location.width); // columns to the left are fixed\n }\n if (index === columnIndex) {\n return map.set(column.name, newColumnWidth);\n }\n return map;\n }, new Map<`column:${string}`, number | 'min-content'>());\n }\n}\n\n/**\n * State of an active column resize operation.\n */\ninterface ColumnResizingState {\n /**\n * Column being resized.\n */\n column: SciTableColumnLike;\n /**\n * Map of column names to their pixel widths.\n */\n columnWidths: WritableSignal<Map<`column:${string}`, number | 'min-content'> | undefined>;\n}\n\n/**\n * Creates a minmax() CSS function with the given min/max for use in a CSS grid.\n */\nfunction cssMinmax(minmax: {min: number; max: number | string}): string {\n const min = `${minmax.min}px`;\n const max = typeof minmax.max === 'number' ? `${minmax.max}px` : minmax.max;\n return `minmax(${min}, ${max})`;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, effect, ElementRef, inject, input, untracked} from '@angular/core';\nimport {SciTableColumnLike} from '../table.model';\n\n@Component({\n selector: 'sci-table-column',\n template: '',\n host: {\n '[attr.data-column]': 'column().name',\n '[style.min-width.px]': 'column().minWidth', // required when resizing the column to its preferred size to not drop below min-width.\n },\n})\nexport class SciTableColumnComponent {\n\n public readonly column = input.required<SciTableColumnLike>();\n\n constructor() {\n this.injectLocationToColumn();\n }\n\n private injectLocationToColumn(): void {\n const element = inject(ElementRef).nativeElement as HTMLElement;\n\n effect(onCleanup => {\n const column = this.column();\n\n untracked(() => {\n const location = column.location = {\n get x(): number {\n return element.getBoundingClientRect().left;\n },\n get width(): number {\n return element.offsetWidth;\n },\n };\n onCleanup(() => {\n if (column.location === location) {\n column.location = {x: 0, width: 0};\n }\n });\n });\n });\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, inject, input, signal} from '@angular/core';\nimport {SciSplitterComponent, SplitterMoveEvent} from '@scion/components/splitter';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\nimport {SciTableColumnLike} from '../table.model';\nimport {SciTableRowComponent} from '../table-row/table-row.component';\nimport {SciTableColumnService} from '../table-column/table-column.service';\nimport {SciTableColumnComponent} from '../table-column/table-column.component';\n\n@Component({\n selector: 'sci-table-columns',\n templateUrl: './table-columns.component.html',\n styleUrl: './table-columns.component.scss',\n imports: [\n SciSplitterComponent,\n SciTableColumnComponent,\n ],\n})\nexport class SciTableColumnsComponent<T> {\n\n public readonly rows = input.required<readonly SciTableRowComponent<unknown, unknown>[]>();\n\n protected readonly table = inject(ɵSCI_TABLE);\n\n private readonly _hovered = signal(false);\n private readonly _columnService = inject(SciTableColumnService);\n\n protected onResizeStart(column: SciTableColumnLike): void {\n this._columnService.startResize(column);\n }\n\n protected onResize(column: SciTableColumnLike<T>, event: SplitterMoveEvent): void {\n const pointerPosition = event.position.clientPos; // TODO [dwi] Change to screen coordinates to work with microfrontends\n const columnStart = column.location.x - 1; // -1 because splitters are positioned at the end of cell content\n const newColumnWidth = pointerPosition - columnStart;\n this._columnService.resize(newColumnWidth);\n }\n\n protected onResizeEnd(): void {\n this._columnService.endResize();\n\n // Clear the hovered row when resizing ends outside the splitter (for example, above or below it).\n if (!this._hovered()) {\n this.table().hoveredIndex.set(-1);\n }\n }\n\n /**\n * Resizes the column to its preferred size.\n */\n protected onPack(column: SciTableColumnLike): void {\n this._columnService.startResize(column);\n this._columnService.resize('min-content');\n this._columnService.endResize();\n }\n\n protected onMouseEnter(): void {\n this._hovered.set(true);\n }\n\n protected onMouseLeave(): void {\n this._hovered.set(false);\n\n // Do not clear the hovered row while dragging the resize handle, or quick movements will accidentally clear it.\n // If the mouse leaves the splitter during drag (above or below), the hovered row is unset when resizing ends.\n if (!this.table().resizing()) {\n this.table().hoveredIndex.set(-1);\n }\n }\n}\n","<!-- Render splitters, also for non-resizable columns, as non-interactive column header dividers. -->\n@for (column of table().columns(); track column.name; let i = $index) {\n <sci-splitter orientation=\"vertical\"\n [class.resizing]=\"column.resizing()\"\n [attr.data-column]=\"column.name\"\n [attr.data-non-interactive]=\"!column.resizable() ? '' : null\"\n [style.grid-column]=\"i + 1\"\n (start)=\"onResizeStart(column)\"\n (move)=\"onResize(column, $event)\"\n (end)=\"onResizeEnd()\"\n (reset)=\"onPack(column)\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"/>\n}\n\n<!-- Render an invisible synthetic column per column to read current widths and set minimum widths. -->\n@for (column of table().columns(); track column.name; let i = $index) {\n <sci-table-column [column]=\"column\" [style.grid-column]=\"i + 1\"/>\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, computed, ElementRef, inject} from '@angular/core';\nimport {ɵSCI_TABLE} from './ɵtable.model';\n\n/**\n * Represents a semantic element for the table viewport provided as slotted content.\n */\n@Component({\n selector: 'sci-table-viewport',\n template: '<ng-content/>',\n host: {\n '[style.--ɵsci-table-viewport-width]': '`${table().tableViewRef()?.viewportWidth() ?? 0}px`',\n '[style.--ɵsci-table-viewport-height]': '`${viewportHeight() ?? 0}px`',\n '[style.--ɵsci-table-viewport-client-width]': '`${table().tableViewRef()?.viewportClientWidth() ?? 0}px`',\n '[style.--ɵsci-table-viewport-client-height]': '`${table().tableViewRef()?.viewportClientHeight() ?? 0}px`',\n '[style.--ɵsci-table-header-height]': '`${table().tableViewRef()?.headerHeight() ?? 0}px`',\n '[style.--ɵsci-table-cell-padding-inline]': '`${table().tableViewRef()?.cellPadding() ?? 0}px`',\n '[style.--ɵsci-table-row-height]': '`${table().tableViewRef()?.itemHeight() ?? 0}px`',\n },\n})\nexport class SciTableViewportComponent {\n\n public readonly host = inject(ElementRef).nativeElement as HTMLElement;\n\n protected readonly table = inject(ɵSCI_TABLE);\n protected readonly viewportHeight = computed(() => {\n const viewportHeight = this.table().tableViewRef()?.viewportHeight() ?? 0;\n const headerHeight = this.table().tableViewRef()?.headerHeight() ?? 0;\n return viewportHeight + headerHeight;\n });\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, inject} from '@angular/core';\nimport {SciTableColumnService} from './table-column/table-column.service';\nimport {ɵSCI_TABLE} from './ɵtable.model';\n\n/**\n * Represents a semantic element for the table body provided as slotted content.\n */\n@Component({\n selector: 'sci-table-grid',\n template: '<ng-content/>',\n providers: [\n SciTableColumnService,\n ],\n host: {\n '[style.--ɵsci-table-columns]': 'gridTemplateColumns()',\n '[style.--ɵsci-table-virtual-scroll-offset-top]': '`${table().virtualScrollOffset().top}px`',\n '[style.--ɵsci-table-virtual-scroll-offset-bottom]': '`${table().virtualScrollOffset().bottom}px`',\n },\n})\nexport class SciTableGridComponent {\n\n protected readonly table = inject(ɵSCI_TABLE);\n protected readonly gridTemplateColumns = inject(SciTableColumnService).gridTemplateColumns;\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component} from '@angular/core';\n\n/**\n * Represents a semantic element for the table body provided as slotted content.\n */\n@Component({\n selector: 'sci-table-body',\n template: '<ng-content/>',\n})\nexport class SciTableBodyComponent {\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, computed, ElementRef, inject, input, Provider, viewChild} from '@angular/core';\nimport {SciTableColumnLike} from '../table.model';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\nimport {SciIconComponent} from '@scion/components/icon';\nimport {NgTemplateOutlet} from '@angular/common';\nimport {SciTooltipOnOverflowDirective, TOOLTIP_ON_OVERFLOW_DIRECTIVE_ADDITIONAL_TEXT, TOOLTIP_ON_OVERFLOW_DIRECTIVE_SOURCE_ELEMENT} from '@scion/components/common';\n\n@Component({\n selector: 'sci-column-header',\n imports: [\n SciIconComponent,\n NgTemplateOutlet,\n ],\n templateUrl: './column-header.component.html',\n styleUrl: './column-header.component.scss',\n host: {\n '[attr.data-column]': 'column().name',\n },\n hostDirectives: [\n SciTooltipOnOverflowDirective,\n ],\n providers: [\n configureTooltip(),\n ],\n})\nexport class SciColumnHeaderComponent<T> {\n\n public readonly column = input.required<SciTableColumnLike<T>>();\n public readonly labelElement = viewChild<ElementRef<HTMLElement>>('label'); // public visibility required to be accessible in `configureTooltip` function\n\n protected readonly table = inject(ɵSCI_TABLE);\n protected readonly sortDirection = computed(() => this.table().sortCriteria().find(criteria => criteria.columnName === this.column().name)?.direction);\n\n protected onSort(event: PointerEvent): void {\n this.table().sort(this.column().name, event.ctrlKey || event.metaKey);\n }\n}\n\nfunction configureTooltip(): Provider[] {\n return [\n {\n provide: TOOLTIP_ON_OVERFLOW_DIRECTIVE_ADDITIONAL_TEXT,\n useFactory: () => {\n const host = inject(SciColumnHeaderComponent);\n return computed(() => host.column().header.tooltip?.());\n },\n },\n {\n provide: TOOLTIP_ON_OVERFLOW_DIRECTIVE_SOURCE_ELEMENT,\n useFactory: () => inject(SciColumnHeaderComponent).labelElement,\n },\n ];\n}\n","@if (column().sortable()) {\n <button class=\"sort e2e-sort\"\n [attr.data-sort-direction]=\"sortDirection()\"\n (click)=\"onSort($event)\">\n <!-- Header -->\n <ng-container *ngTemplateOutlet=\"header_template\"/>\n\n <!-- Sort Indicator -->\n @switch (sortDirection()) {\n @case ('asc') {\n <sci-icon>scion:sort_ascending</sci-icon>\n }\n @case ('desc') {\n <sci-icon>scion:sort_descending</sci-icon>\n }\n @default {\n <sci-icon class=\"no-sort\">scion:sort_indicator</sci-icon>\n }\n }\n </button>\n} @else {\n <ng-container *ngTemplateOutlet=\"header_template\"/>\n}\n\n<ng-template #header_template>\n @if (column().header.icon) {\n <sci-icon class=\"icon e2e-icon\">{{column().header.icon}}</sci-icon>\n }\n\n @if (column().header.label) {\n <span [class.wrap]=\"table().wrapHeader()\" class=\"label\" #label>\n {{column().header.label!()}}\n </span>\n }\n</ng-template>\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {computed, inject, Injector, Pipe, PipeTransform, Signal, untracked} from '@angular/core';\nimport {text} from '@scion/components/text';\nimport {SciEnumColumnValues, SciEnumValueLike} from '../table.model';\nimport {Arrays} from '@scion/toolkit/util';\n\n/**\n * Creates a comma-separated string with localized labels of the given enum values.\n */\n@Pipe({name: 'sciEnumLabel'})\nexport class SciEnumLabelPipe implements PipeTransform {\n\n private readonly _injector = inject(Injector);\n\n public transform(values: SciEnumValueLike | SciEnumValueLike[] | null, enumeration: SciEnumColumnValues): Signal<string | undefined> {\n return computed(() => Arrays.coerce(values)\n .map(value => enumeration.find(entry => entry.value === value)?.label)\n .map(label => untracked(() => text(label, {injector: this._injector}))())\n .filter(Boolean)\n .join(', ') || undefined);\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, computed, debounced, effect, ElementRef, inject, Injector, input, Provider, runInInjectionContext, signal, untracked, viewChild} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {SciEnumColumn, SciEnumValueLike, SciTableColumnLike} from '../table.model';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\nimport {SciIconComponent} from '@scion/components/icon';\nimport {firstValueFrom, skip, timer} from 'rxjs';\nimport {contributeMenu, SciMenuRef, ɵSciMenuService} from '@scion/components/menu';\nimport {toObservable} from '@angular/core/rxjs-interop';\nimport {SciTooltipOnOverflowDirective, TOOLTIP_ON_OVERFLOW_DIRECTIVE_SOURCE_ELEMENT, ɵcreateDestroyableInjector} from '@scion/components/common';\nimport {SciEnumLabelPipe} from './enum-label.pipe';\nimport {UUID} from '@scion/toolkit/uuid';\nimport {SciTextPipe} from '@scion/components/text';\nimport {dimension} from '@scion/components/dimension';\n\n@Component({\n selector: 'sci-column-filter',\n templateUrl: './column-filter.component.html',\n styleUrl: './column-filter.component.scss',\n imports: [\n FormsModule,\n SciIconComponent,\n SciEnumLabelPipe,\n SciTextPipe,\n ],\n hostDirectives: [\n SciTooltipOnOverflowDirective,\n ],\n host: {\n '[attr.data-column]': 'column().name',\n '[attr.data-disabled]': `!column().filterable() ? '' : null`,\n '[class.collapsed]': 'dimension().clientWidth < 50',\n '(click)': 'column().filterable() && onFilterClick()',\n },\n providers: [\n configureTooltip(),\n ],\n})\nexport class SciColumnFilterComponent<T> {\n\n public readonly column = input.required<SciTableColumnLike<T>>();\n public readonly inputElement = viewChild<ElementRef<HTMLElement>>('input'); // public visibility required to be accessible in `configureTooltip` function\n\n protected readonly filter = signal<string | number | boolean | SciEnumValueLike | SciEnumValueLike[] | null>(null);\n protected readonly dimension = dimension(inject(ElementRef));\n\n private readonly _table = inject(ɵSCI_TABLE);\n private readonly _menuService = inject(ɵSciMenuService);\n private readonly _injector = inject(Injector);\n private readonly _host = inject(ElementRef).nativeElement as HTMLElement;\n\n protected menu: SciMenuRef | undefined;\n\n constructor() {\n this.bindToModel();\n }\n\n protected onFilterClick(): void {\n if (this.column().type === 'enum') {\n this.toggleEnumChooser();\n }\n else {\n this.inputElement()!.nativeElement.focus();\n }\n }\n\n protected onReset(event: PointerEvent): void {\n this.filter.set(null);\n this.inputElement()!.nativeElement.focus();\n event.stopPropagation(); // prevent opening menu\n }\n\n private bindToModel(): void {\n const filterDebounced = debounced(computed(() => trim(this.filter())), async value => {\n // Debounce only if not empty and not an enum.\n if (value !== null && this.column().type !== 'enum') {\n await firstValueFrom(timer(200));\n }\n });\n\n effect(() => {\n const filter = filterDebounced.value();\n const table = this._table();\n const column = this.column();\n\n untracked(() => {\n table.filter(filter, {columnName: column.name});\n });\n });\n }\n\n private toggleEnumChooser(): void {\n // Close menu if already opened.\n if (this.menu) {\n this.menu.close();\n return;\n }\n\n const column = this.column() as SciEnumColumn;\n const injector = ɵcreateDestroyableInjector({parent: this._injector});\n\n runInInjectionContext(injector, () => {\n const menuId = `menu:column-filter-${UUID.randomUUID()}` as const;\n\n // Contribute menu items.\n contributeMenu(menuId, menu => {\n const multi = column.filterable() === 'multi';\n\n column.enumeration().forEach(entry => menu.addMenuItem({\n label: entry.label,\n checked: multi ? computed(() => (this.filter() as SciEnumValueLike[] | null)?.includes(entry.value) ?? false) : undefined,\n icon: column.format.filter.icon ? entry.icon : undefined,\n attributes: {'data-option': `${entry.value}`},\n onSelect: () => this.filter.update(filter => {\n if (multi) {\n const values = new Set<SciEnumValueLike>(filter as SciEnumValueLike[] | null ?? []);\n values.has(entry.value) ? values.delete(entry.value) : values.add(entry.value);\n return values.size ? Array.from(values) : null;\n }\n else {\n return entry.value;\n }\n }),\n }));\n });\n\n // Open menu.\n this.menu = this._menuService.open(menuId, {\n anchor: this._host,\n minWidth: `${this._host.offsetWidth}px`,\n maxHeight: '300px',\n cssClass: 'e2e-filter',\n filter: column.enumeration().length >= 8 ? {focus: true} : false,\n maxWidth: `max(300px, ${this._host.offsetWidth}px)`, // overflow long enumeration labels\n offset: {y: -1},\n });\n\n // Close menu when start resizing a column. By default, closes the menu only on mouse up.\n toObservable(this._table().resizing)\n .pipe(skip(1))\n .subscribe(() => this.menu?.close());\n\n this.menu.onClose(() => {\n injector.destroy();\n // Restore focus manually as it is not restored automatically since opening the popover inside Shadow DOM.\n // TODO [menu] Consider restore focus manually in Menu API due to restriction in shadow DOM.\n this.inputElement()!.nativeElement.focus();\n this.menu = undefined;\n });\n });\n }\n}\n\nfunction trim(value: string | number | boolean | SciEnumValueLike | SciEnumValueLike[] | null): string | number | boolean | SciEnumValueLike | SciEnumValueLike[] | null {\n return typeof value === 'string' ? value.trim() || null : value;\n}\n\nfunction configureTooltip(): Provider[] {\n return [\n {\n provide: TOOLTIP_ON_OVERFLOW_DIRECTIVE_SOURCE_ELEMENT,\n useFactory: () => inject(SciColumnFilterComponent).inputElement,\n },\n ];\n}\n","@let column = this.column();\n@if (column.filterable()) {\n @let active = filter() !== null && filter() !== '';\n\n <sci-icon class=\"filter e2e-filter\" [class.active]=\"active\">scion:filter</sci-icon>\n\n @switch (column.type) {\n @case ('number') {\n <input [(ngModel)]=\"filter\" type=\"number\" #input/>\n }\n @case ('enum') {\n <input [ngModel]=\"(filter() | sciEnumLabel:column.enumeration())()\" type=\"button\" #input>\n <sci-icon class=\"chevron\">{{menu ? 'scion:chevron_up' : 'scion:chevron_down'}}</sci-icon>\n }\n @default {\n <input [(ngModel)]=\"filter\" type=\"text\" #input/>\n }\n }\n\n @if (active) {\n <button class=\"clear e2e-clear\" (click)=\"onReset($event)\" [attr.title]=\"('%scion:components:clear.tooltip' | sciText)()\">\n <sci-icon>scion:clear</sci-icon>\n </button>\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, inject} from '@angular/core';\nimport {ɵSCI_TABLE} from '../ɵtable.model';\nimport {SciColumnHeaderComponent} from '../column-header/column-header.component';\nimport {SciColumnFilterComponent} from '../column-filter/column-filter.component';\n\n@Component({\n selector: 'sci-table-header',\n templateUrl: './table-header.component.html',\n styleUrl: './table-header.component.scss',\n host: {\n '(wheel)': 'onMouseWheel($event)',\n },\n imports: [\n SciColumnHeaderComponent,\n SciColumnFilterComponent,\n ],\n})\nexport class SciTableHeaderComponent {\n\n protected readonly table = inject(ɵSCI_TABLE);\n\n protected onMouseWheel(event: WheelEvent): void {\n // Prevent vertical scrolling on header, but not horizontal scrolling.\n if (!event.shiftKey) {\n event.preventDefault();\n }\n }\n}\n","@let table = this.table();\n\n@if (table.showHeader()) {\n @for (column of table.columns(); track column.name) {\n <sci-column-header [column]=\"column\"/>\n }\n}\n@if (table.filterable()) {\n @for (column of table.columns(); track column.name) {\n <sci-column-filter [column]=\"column\"/>\n }\n}\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, computed, effect, ElementRef, inject, input, output, Provider, untracked, viewChild, viewChildren, ViewEncapsulation} from '@angular/core';\nimport {SciTable, SciTableEvent} from './table.model';\nimport {ɵSCI_TABLE, ɵSciTable} from './ɵtable.model';\nimport {SciScrollbarComponent} from '@scion/components/viewport';\nimport {dimension} from '@scion/components/dimension';\nimport {SciTableSelectionService} from './table-selection.service';\nimport {SciTableRowComponent} from './table-row/table-row.component';\nimport {SciTableKeyboardNavigatorDirective} from './table-keyboard-navigator.directive';\nimport {SciTableColumnsComponent} from './table-columns/table-columns.component';\nimport {SciTextPipe} from '@scion/components/text';\nimport {SciThrobberComponent} from '@scion/components/throbber';\nimport {SciTableViewportComponent} from './table-viewport.component';\nimport {SciTableGridComponent} from './table-grid.component';\nimport {SciTableBodyComponent} from './table-body.component';\nimport {SciTableHeaderComponent} from './table-header/table-header.component';\nimport {SciAttributesDirective} from '@scion/components/common';\nimport {SciIconComponent} from '@scion/components/icon';\n\n/**\n * Provides a table to display tabular or hierarchical data.\n *\n * ### Usage\n *\n * Create a table using the `table()` function, passing a signal containing the items to display in the table and a factory function to define the columns.\n * Alternatively, pass a descriptor to display a tree structure, configure a custom datasource, or set additional options.\n *\n * ```ts\n * import {SciTableComponent, table} from '@scion/components/table';\n * import {httpResource} from '@angular/common/http';\n *\n * // Load data to display in the table.\n * const users = httpResource<User[]>(() => '/api/users', {defaultValue: []});\n *\n * // Create the table and pass data.\n * const userTable = table(users.value, table => table\n * .addNumberColumn('ID', user => user.id)\n * .addStringColumn('Name', user => user.name)\n * .addBooleanColumn('Inactive', user => user.inactive)\n * .addDateColumn('Expiration', user => user.expiration),\n * );\n * ```\n *\n * In the HTML, bind the created table instance to `<sci-table>` and assign it a name.\n * The name must start with the `table:` prefix and is used to store user settings.\n *\n * ```html\n * <sci-table name=\"table:users\" [table]=\"userTable\"/>\n * ```\n *\n * ### Fixed Row Height\n *\n * All rows in the table must have equal height, which is `2em` by default. The height can be changed per table using the CSS variable `--sci-table-row-height`.\n *\n * ```scss\n * sci-table {\n * --sci-table-row-height: 30px;\n * }\n * ```\n *\n * ### Styling\n *\n * The appearance of the table can be customized using the following CSS variables, either globally in the `:root` or at the table level.\n *\n * - `--sci-table-gridline-color`\n * - `--sci-table-header-height`\n * - `--sci-table-header-cursor`\n * - `--sci-table-header-background-color`\n * - `--sci-table-header-background-color-hover`\n * - `--sci-table-header-font-family`\n * - `--sci-table-header-font-size`\n * - `--sci-table-header-font-weight`\n * - `--sci-table-header-text-color`\n * - `--sci-table-header-column-divider`\n * - `--sci-table-row-height`\n * - `--sci-table-row-indent`\n * - `--sci-table-row-background-color-hover`\n * - `--sci-table-row-background-color-selected`\n * - `--sci-table-row-border-radius`\n * - `--sci-table-row-outline-color`\n * - `--sci-table-row-outline-width`\n * - `--sci-table-row-outline-style`\n * - `--sci-table-row-action-background-color`\n * - `--sci-table-row-action-background-color-selected`\n * - `--sci-table-cell-padding-inline`\n *\n * @experimental since 22.3.0; API and behavior may change in any version without notice.\n */\n@Component({\n selector: 'sci-table',\n templateUrl: './table.component.html',\n styleUrl: './table.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n host: {\n '[attr.name]': 'name()', // Public API: Enables selecting the table by name in CSS (also if the table has a dynamic name input binding)\n '[style.--ɵsci-table-scrolling]': 'table().scrolling() ? `true` : null',\n '[style.--ɵsci-table-resizing]': 'table().resizing() ? `true` : null',\n },\n imports: [\n SciTableViewportComponent,\n SciTableHeaderComponent,\n SciTableGridComponent,\n SciTableBodyComponent,\n SciTableRowComponent,\n SciTableColumnsComponent,\n SciTableKeyboardNavigatorDirective,\n SciAttributesDirective,\n SciScrollbarComponent,\n SciTextPipe,\n SciThrobberComponent,\n SciIconComponent,\n ],\n providers: [\n provideSciTable(),\n SciTableSelectionService,\n ],\n})\nexport class SciTableComponent<T = unknown, ID = T> {\n\n /**\n * Specifies a unique table identifier, used as the key for storing user preferences.\n */\n public readonly name = input.required<`table:${string}`>();\n\n /**\n * Specifies the table definition and datasource.\n */\n public readonly table = input.required({transform: (table: SciTable<ID>) => table as ɵSciTable<T, ID>});\n\n /**\n * Emits when the user double-clicks a row or presses `Enter` on selected rows.\n */\n public readonly primaryAction = output<SciTableEvent<ID>>();\n\n private readonly _viewport = viewChild.required(SciTableViewportComponent, {read: ElementRef});\n private readonly _viewportClient = viewChild.required(SciTableGridComponent, {read: ElementRef});\n private readonly _tableHeader = viewChild(SciTableHeaderComponent, {read: ElementRef});\n private readonly _tableBody = viewChild.required(SciTableBodyComponent, {read: ElementRef});\n private readonly _itemSizeSyntheticElement = viewChild.required<ElementRef<HTMLElement>>('item_size_synthetic_element');\n private readonly _cellPaddingSyntheticElement = viewChild.required<ElementRef<HTMLElement>>('cell_padding_synthetic_element');\n\n protected readonly rows = viewChildren(SciTableRowComponent);\n\n constructor() {\n this.connectToModel();\n this.scrollActiveRowIntoViewport();\n }\n\n protected onRowPrimaryAction(event: SciTableEvent<ID>): void {\n this.primaryAction.emit(event);\n event.items.forEach(item => this.table().toggleRow(item));\n }\n\n protected onRetry(): void {\n this.table().reloadFailed();\n }\n\n private connectToModel(): void {\n const viewportDimension = dimension(this._viewport);\n const viewportClientDimension = dimension(this._viewportClient);\n const tableHeaderDimension = dimension(this._tableHeader);\n const tableBodyDimension = dimension(this._tableBody);\n const cellPadding = dimension(this._cellPaddingSyntheticElement);\n const itemSizeDimension = dimension(this._itemSizeSyntheticElement);\n\n effect(onCleanup => {\n const name = this.name();\n const table = this.table();\n const viewport = this._viewport().nativeElement as HTMLElement;\n\n untracked(() => {\n table.connect(name, {\n viewport: viewport,\n viewportHeight: computed(() => viewportDimension().clientHeight - (tableHeaderDimension()?.offsetHeight ?? 0)),\n viewportWidth: computed(() => viewportDimension().clientWidth),\n viewportClientHeight: computed(() => viewportClientDimension().offsetHeight),\n viewportClientWidth: computed(() => tableBodyDimension().offsetWidth), // Use `table-body` instead of `table-grid` because `table-grid` has `min-width: 100%`, thus never shrinking below viewport width.\n cellPadding: computed(() => cellPadding().clientWidth),\n headerHeight: computed(() => tableHeaderDimension()?.offsetHeight ?? 0),\n itemHeight: computed(() => itemSizeDimension().offsetHeight),\n scrollToTop: () => viewport.scrollTo({top: 0}),\n });\n onCleanup(() => table.disconnect());\n });\n });\n }\n\n private scrollActiveRowIntoViewport(): void {\n effect(() => {\n const activeItem = this.table().activeItem();\n if (activeItem === undefined) {\n return;\n }\n\n untracked(() => {\n const viewport = this._viewport().nativeElement as HTMLElement;\n const viewportHeight = this.table().tableViewRef()?.viewportHeight() ?? 0;\n const itemHeight = this.table().tableViewRef()?.itemHeight() ?? 0;\n const activeIndex = this.table().rowIndexById().get(activeItem) ?? -1;\n\n const activeRowTop = activeIndex * itemHeight;\n const activeRowBottom = activeRowTop + itemHeight;\n const scrollTop = viewport.scrollTop;\n const scrollBottom = scrollTop + viewportHeight;\n\n if (activeRowTop < scrollTop) {\n viewport.scrollTop = activeRowTop;\n }\n else if (activeRowBottom > scrollBottom) {\n viewport.scrollTop = activeRowBottom - viewportHeight;\n }\n });\n });\n }\n}\n\nfunction provideSciTable(): Provider {\n return {\n provide: ɵSCI_TABLE,\n useFactory: () => inject(SciTableComponent).table,\n };\n}\n","@let table = this.table();\n\n<!-- TODO [#384] Replace with sci-viewport -->\n<sci-table-viewport #viewport>\n <sci-table-grid>\n <!-- Table header -->\n @if (table.showHeader() || table.filterable()) {\n <sci-table-header/>\n }\n\n <!-- Table body -->\n <sci-table-body sciTableKeyboardNavigator>\n @if (!table.error()) {\n <!-- Track index to reuse the table row elements -->\n @for (row of table.rows(); track $index) {\n <sci-table-row [row]=\"row\" [sciAttributes]=\"row.bindings.attributes()\" [class]=\"row.bindings.classes()\" (primaryAction)=\"onRowPrimaryAction($event)\"/>\n } @empty {\n <span class=\"message e2e-no-data\">{{('%scion:components:no_items.message' | sciText)()}}</span>\n }\n } @else {\n <span class=\"message e2e-datasource\">\n {{('%scion:components:datasource_error.message' | sciText)()}}\n\n <button (click)=\"onRetry()\" class=\"action e2e-datasource-retry\">\n <sci-icon>scion:reload</sci-icon>\n <span>{{('%scion:components:retry.action' | sciText)()}}</span>\n </button>\n </span>\n }\n\n <!-- Render active row outline separately to preserve row border-radius within block selection. -->\n @if (table.activeRow()) {\n <div class=\"active-row-outline e2e-active-row-outline\"></div>\n }\n </sci-table-body>\n\n <!-- Render column splitters. -->\n <sci-table-columns [rows]=\"rows()\"/>\n </sci-table-grid>\n</sci-table-viewport>\n\n<!-- Scrollbars -->\n<sci-scrollbar direction=\"hscroll\" [viewport]=\"viewport.host\"/>\n<sci-scrollbar direction=\"vscroll\" [viewport]=\"viewport.host\"/>\n\n@if (table.loading()) {\n <sci-throbber type=\"spinner\" class=\"loading-indicator e2e-loading-indicator\"/>\n}\n\n<!-- Synthetic element to compute the absolute pixel value of the `--sci-table-row-height`, relative to the table's font size if em-based. -->\n<div class=\"synthetic item-size\" #item_size_synthetic_element></div>\n\n<!-- Synthetic element to compute the absolute pixel value of the `--sci-table-cell-padding-inline`, relative to the table's font size if em-based. -->\n<div class=\"synthetic cell-padding\" #cell_padding_synthetic_element></div>\n","/*\n * Copyright (c) 2018-2026 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nexport {table, type SciTableColumnFactoryFn} from './table.factory';\nexport {SciTableComponent} from './table.component';\nexport {ɵSciTable} from './ɵtable.model';\nexport {type SciTable, type SciTableDescriptor, type SciTableRowActionFactoryFn, type SciTableColumnType, type SciTableEvent, type SciTableCellContext} from './table.model';\nexport {type SciTableRowBindingFactory, provideTableRowBinding, ɵSciTableRowBindingFactory} from './table-row-binding';\nexport {provideTableDatasource, ɵprovideTableDatasource, type SciTableDatasourceProvider, type SciTableDatasource, type SciTreeTableDatasource, type SciTreeTableNode, type SciTableDatasourceQuery, type SciTableColumnFilter, type SciTableSortCriterion} from './table-datasource';\nexport {type SciTableColumnFactory, type SciTableColumnDescriptor, type SciStringColumnDescriptor, type SciNumberColumnDescriptor, type SciBooleanColumnDescriptor, type SciDateColumnDescriptor, type SciComponentColumnDescriptor, type SciTemplateColumnDescriptor, type SciTableColumnSortComparatorFn, type SciTableColumnFilterMatcherFn} from './table-column.factory';\nexport {type SciDateLike, type SciEnumValueLike, type SciEnumColumnValues, type SciIconColumnValues, type SciColumnHeaderLike} from './table.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["ɵSingleActiveInjectorFactory","ɵcreateDestroyableInjector","configureTooltip","ɵSciMenuService"],"mappings":"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"}