@openziti/ziti-console-lib 1.7.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openziti-ziti-console-lib-table-core.mjs","sources":["../../../projects/ziti-console-lib/table-core/src/lib/features/data-table/data-table-filter.service.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-column.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-table.service.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/click-outside.directive.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-menu/list-menu.component.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-menu/list-menu.component.html","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-filter-cell/list-filter-cell.component.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-filter-cell/list-filter-cell.component.html","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-header-cell/list-header-cell.component.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-header-cell/list-header-cell.component.html","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-table-auto-refresh/list-table-auto-refresh.component.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-table-auto-refresh/list-table-auto-refresh.component.html","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/select-cell/select-cell.component.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/select-cell/select-cell.component.html","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-empty/list-empty.component.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-empty/list-empty.component.html","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-table.component.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/list-table/list-table.component.html","../../../projects/ziti-console-lib/table-core/src/lib/features/no-items/no-items.component.ts","../../../projects/ziti-console-lib/table-core/src/lib/features/no-items/no-items.component.html","../../../projects/ziti-console-lib/table-core/src/public-api.ts","../../../projects/ziti-console-lib/table-core/src/openziti-ziti-console-lib-table-core.ts"],"sourcesContent":["import {Injectable} from '@angular/core';\nimport {BehaviorSubject} from \"rxjs\";\nimport {forEach, isEmpty} from \"lodash\";\nimport { HttpParams } from \"@angular/common/http\";\nimport {ActivatedRoute, Router} from \"@angular/router\";\nimport {Location} from \"@angular/common\";\n\nexport type FilterObj = {\n filterName: string;\n columnId: string;\n value: any;\n label: string;\n type?: string;\n hidden?: boolean;\n verb?: string\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DataTableFilterService {\n\n filters: FilterObj[] = [];\n currentPage = 1;\n /** Rows requested per page. Defaults to the legacy page size; the list-table's\n * rows-per-page control changes it via {@link changePageSize}. */\n pageSize = 50;\n filtersChanged = new BehaviorSubject<FilterObj[]>(this.filters);\n public filtering = new BehaviorSubject<boolean>(false);\n\n pageChanged = new BehaviorSubject<any>(this.currentPage);\n pageSizeChanged = new BehaviorSubject<number>(this.pageSize);\n\n currentQueryParams = [];\n\n // filter params live under this prefix so unrelated params (e.g. ?tab=) aren't treated as filters\n private static readonly URL_FILTER_PREFIX = 'f.';\n\n constructor(private location: Location, private router: Router, private activatedRoute: ActivatedRoute) {\n }\n\n updateFilter(filterObj: FilterObj) {\n if(isEmpty(filterObj.value) && (isNaN(filterObj.value) || filterObj.value === '')) this.removeFilter(filterObj);\n else {\n let isFound = false;\n for (let idx = 0; idx < this.filters.length; idx++) {\n if (this.filters[idx].columnId === filterObj.columnId) {\n this.filters[idx] = filterObj;\n isFound = true;\n break;\n }\n }\n if (!isFound) {\n this.filters.push(filterObj);\n }\n }\n this.updateUrlParameters();\n this.filtersChanged.next(this.filters);\n }\n\n removeFilter(filterObj: FilterObj) {\n for (let idx = 0; idx < this.filters.length; idx++) {\n if (this.filters[idx].columnId === filterObj.columnId) {\n this.filters.splice(idx, 1);\n break;\n }\n }\n this.updateUrlParameters([filterObj]);\n this.filtersChanged.next(this.filters);\n }\n\n getFilterString(key: string) {\n let value = '';\n for (let idx = 0; idx < this.filters.length; idx++) {\n if (this.filters[idx].columnId === key) {\n value = this.filters[idx].value;\n break;\n }\n }\n return value;\n }\n\n changePage(page: any) {\n this.currentPage = page;\n this.pageChanged.next(page);\n }\n\n changePageSize(size: number) {\n this.pageSize = size;\n this.currentPage = 1;\n this.pageSizeChanged.next(size);\n }\n\n clearFilters() {\n this.filters = [];\n this.updateUrlParameters();\n this.filtersChanged.next(this.filters);\n }\n\n /**\n * Remove every active filter (the toolbar/empty-state \"clear filters\" action).\n * clearFilters() above re-reads the URL and so is really a load-time sync; this one\n * passes the active filters to updateUrlParameters so they are dropped from the URL\n * and storage instead of being restored, then emits the now-empty list.\n */\n clearAllFilters() {\n const toRemove = Object.values(this.getUrlFiltersMap());\n this.filters = [];\n this.updateUrlParameters(toRemove);\n this.filtersChanged.next(this.filters);\n }\n\n storeFilters() {\n localStorage.setItem('search_filters', JSON.stringify(this.filters));\n }\n\n getStoredFilters() {\n const storageItem = localStorage.getItem('search_filters');\n const filters = storageItem ? JSON.parse(storageItem) : [];\n return filters;\n }\n\n updateUrlParameters(filtersToRemove: any[] = []) {\n const prefix = DataTableFilterService.URL_FILTER_PREFIX;\n const urlFiltersMap = this.getUrlFiltersMap();\n this.filters.forEach(filter => {\n urlFiltersMap[filter.columnId] = filter;\n });\n const currentParamString = window.location.href.split(\"?\")[1] || '';\n let params: HttpParams = new HttpParams({ fromString: currentParamString });\n params.keys()\n .filter((key) => key.startsWith(prefix))\n .forEach((key) => {\n params = params.delete(key);\n });\n const newFilters = [];\n forEach(urlFiltersMap, (value, key) => {\n const filterRemoved = filtersToRemove.some((removed) => {\n return removed.columnId === key;\n })\n if (!filterRemoved) {\n params = params.append(prefix + key, value.value);\n newFilters.push(value);\n }\n });\n this.filters = newFilters;\n const path = this.router.url.split(\"?\")[0];\n this.location.replaceState(path, params.toString());\n this.storeFilters();\n }\n\n getUrlFiltersMap(): any {\n const prefix = DataTableFilterService.URL_FILTER_PREFIX;\n const paramString = window.location.href.split(\"?\")[1];\n const params: HttpParams = new HttpParams({ fromString: paramString });\n const storedFilters = this.getStoredFilters();\n const appliedFiltersMap = {};\n\n params.keys().forEach((rawKey) => {\n if (!rawKey.startsWith(prefix)) {\n return;\n }\n const key = rawKey.slice(prefix.length);\n const storedFilter = storedFilters.find((filter) => {\n return filter.columnId === key;\n });\n if (storedFilter) {\n appliedFiltersMap[key] = storedFilter;\n } else {\n let val: any = params.get(rawKey);\n let type = 'TEXTINPUT'\n let label = val;\n if (val?.split(',')?.length > 1) {\n val = val?.split(',');\n label = val[0];\n type = 'ATTRIBUTE'\n }\n appliedFiltersMap[key] = {\n columnId: key,\n value: val,\n label: decodeURIComponent(label),\n filterName: key,\n type: type\n };\n }\n });\n return appliedFiltersMap;\n }\n\n}\n","/*\n Copyright NetFoundry Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\nimport {Type} from '@angular/core';\n\nexport type ListSortDir = 'asc' | 'desc' | undefined;\n\n/**\n * Context handed to component-cell input mappers.\n */\nexport interface ListCellContext<T = any> {\n row: T;\n value: any;\n colId: string;\n rowIndex: number;\n /** Emit a row action (flows to the table's `actionRequested` → the page handler). */\n emitAction: (action: string, item?: any) => void;\n}\n\n/**\n * Shim shape passed to legacy `cellHtml` / `valueFormatter` functions so the existing\n * ag-grid-era renderer bodies (which read `row.data`, `row.column.colId`, `row.value`)\n * keep working unchanged.\n */\nexport interface ListLegacyCellShim {\n data: any;\n value?: any;\n column: { colId: string };\n rowIndex?: number;\n}\n\n/**\n * Declarative column definition for {@link ListTableComponent}. Replaces the ag-grid\n * `ColDef` shape used by the legacy `lib-data-table`. Rendering precedence for a cell is:\n * `cell` (a component) > `cellHtml` (sanitized markup) > `valueFormatter` (plain text) >\n * the raw value at `field`.\n */\nexport interface ListColumn<T = any> {\n /** Stable column id (was ag-grid `colId`). Used for persistence + tracking. */\n key: string;\n /** Dot-path used to read the raw value from a row. Defaults to `key`. */\n field?: string;\n /** Header label (was ag-grid `headerName`). */\n label: string;\n\n // ---- rendering ------------------------------------------------------------\n /** Component class rendered in each cell, hosted via NgComponentOutlet. */\n cell?: Type<any>;\n /** Maps a row to the `@Input()`s of the `cell` component. */\n cellInputs?: (ctx: ListCellContext<T>) => Record<string, unknown>;\n /** Returns sanitized HTML for the cell (legacy string renderers). */\n cellHtml?: (shim: ListLegacyCellShim) => string;\n /** Returns plain text for the cell. */\n valueFormatter?: (shim: ListLegacyCellShim) => string;\n\n // ---- sizing / layout ------------------------------------------------------\n /** Initial width in px. Omit to let the column flex to fill available space. */\n width?: number;\n minWidth?: number;\n /** Defaults to true. */\n resizable?: boolean;\n /** Extra class(es) applied to every cell in the column. */\n cellClass?: string;\n\n // ---- interaction ----------------------------------------------------------\n sortable?: boolean;\n /** Convenience flag mirrored from legacy `headerComponentParams.enableSorting`. */\n enableSorting?: boolean;\n sortDir?: ListSortDir;\n /** Called on header sort click with the resolved direction (was `sortColumn`). */\n onSort?: (colId: string, dir: ListSortDir) => void;\n /** Called on cell click (was ag-grid `onCellClicked`). */\n onCellClick?: (ctx: ListCellContext<T>) => void;\n\n // ---- header filter plumbing (reuses the existing filter overlays) ---------\n filterType?: 'TEXTINPUT' | 'SELECT' | 'COMBO' | 'DATETIME' | 'ATTRIBUTE' | 'MULTISELECT' | 'CUSTOM' | string;\n /** API field the filter queries. Defaults to `field` then `key`. Use when the\n * display field differs from the filterable field (e.g. key `os` → `envInfo.os`,\n * key `type` (display `type.name`) → `typeId`). */\n filterField?: string;\n /** Placeholder shown in the filter-row control when nothing is selected. */\n filterPlaceholder?: string;\n filterOptions?: any[];\n getFilterOptions?: () => any[];\n /** Extra params for the filter controls (attribute getters, combo options, etc.). */\n headerParams?: Record<string, any>;\n\n // ---- tooltip --------------------------------------------------------------\n /** Component class rendered as a hover tooltip. */\n tooltip?: Type<any>;\n tooltipInputs?: (ctx: ListCellContext<T>) => Record<string, unknown>;\n\n // ---- column chrome --------------------------------------------------------\n /** Defaults to true. When false the column cannot be hidden. */\n hideable?: boolean;\n /** Leave the column out of the Columns menu (it still renders in the table). */\n excludeFromChooser?: boolean;\n /** In tree mode, the column that holds the expand/collapse control and per-level\n * indentation. When no column sets this, the first visible column is used. */\n treeColumn?: boolean;\n /** Defaults to true. When false the column cannot be drag-reordered. */\n reorderable?: boolean;\n /** Initial visibility (was ag-grid `hide`). */\n hidden?: boolean;\n}\n\n/**\n * Optional base interface for component cells hosted by {@link ListTableComponent}.\n * The table sets whatever `@Input()`s a column's `cellInputs` returns; implementing this\n * is not required but documents the common ones.\n */\nexport interface ListCell<T = any> {\n row?: T;\n value?: any;\n}\n\n/** Nested-row layout: 'card' floats each level as a bordered card, 'flat' renders inline. */\nexport type TreeVariant = 'card' | 'flat';\n\n/** Per-control toolbar config. A control shows and is interactive by default; set\n * `show: false` to remove it, or `disabled: true` to keep it visible but greyed out. */\nexport interface ToolbarControlOptions {\n show?: boolean;\n disabled?: boolean;\n}\n\n/** Show/hide and enable/disable each control around the table: the bar above it\n * (search, filters, refresh, auto-refresh, columns) and the footer below it\n * (rows-per-page, pagination). */\nexport interface ListTableToolbarOptions {\n search?: ToolbarControlOptions;\n filters?: ToolbarControlOptions;\n refresh?: ToolbarControlOptions;\n autoRefresh?: ToolbarControlOptions;\n columns?: ToolbarControlOptions;\n pageSize?: ToolbarControlOptions;\n pagination?: ToolbarControlOptions;\n}\n\n/** Structural options for {@link ListTableComponent}. */\nexport interface ListTableOptions {\n noSelect?: boolean;\n noMenu?: boolean;\n pager?: 'pages' | 'cursor';\n tree?: boolean;\n /** Tree mode: render checkboxes on nested rows and include them in the selection. */\n selectChildren?: boolean;\n fitColumns?: boolean;\n toolbar?: ListTableToolbarOptions;\n}\n","/*\n Copyright NetFoundry Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\nimport {Injectable} from '@angular/core';\nimport {Subject} from 'rxjs';\nimport {ListColumn, TreeVariant} from './list-column';\n\n/**\n * Per-instance state + localStorage persistence for {@link ListTableComponent}.\n * Uses its own `lt_<tableId>_*` keys (separate from the legacy ag-grid table) so a\n * first visit starts from the column defs' default widths, not a carried-over ag layout.\n */\n@Injectable()\nexport class ListTableService {\n tableId = '';\n\n /** Coordinates the toolbar dropdowns so only one (filter pill or column chooser)\n * is open at a time. Openers emit themselves; others close when they see an\n * owner that isn't them. */\n private readonly menuOpenedSubject = new Subject<unknown>();\n readonly menuOpened$ = this.menuOpenedSubject.asObservable();\n\n notifyMenuOpened(owner: unknown): void {\n this.menuOpenedSubject.next(owner);\n }\n\n private stateKey(): string {\n return `lt_${this.tableId}_table_state`;\n }\n\n private widthsKey(): string {\n return `lt_${this.tableId}_column_widths`;\n }\n\n private pageSizeKey(): string {\n return `lt_${this.tableId}_page_size`;\n }\n\n private treeVariantKey(): string {\n return `lt_${this.tableId}_tree_variant`;\n }\n\n /** Returns the saved tree layout ('card' | 'flat'), or `fallback` if none. */\n restoreTreeVariant(fallback: TreeVariant): TreeVariant {\n try {\n const raw = localStorage.getItem(this.treeVariantKey());\n return raw === 'card' || raw === 'flat' ? raw : fallback;\n } catch {\n return fallback;\n }\n }\n\n saveTreeVariant(variant: TreeVariant): void {\n try {\n localStorage.setItem(this.treeVariantKey(), variant);\n } catch {\n // ignore\n }\n }\n\n private static pageSizeKeyFor(tableId: string): string {\n return `lt_${tableId}_page_size`;\n }\n\n restorePageSize(fallback: number): number {\n return ListTableService.readPersistedPageSize(this.tableId, fallback);\n }\n\n savePageSize(size: number): void {\n try {\n localStorage.setItem(this.pageSizeKey(), String(size));\n } catch {\n // ignore\n }\n }\n\n /** Reads a table's remembered rows-per-page without an instance (for host pre-seeding). */\n static readPersistedPageSize(tableId: string, fallback: number): number {\n try {\n const raw = localStorage.getItem(ListTableService.pageSizeKeyFor(tableId));\n const n = raw ? parseInt(raw, 10) : NaN;\n return Number.isFinite(n) && n > 0 ? n : fallback;\n } catch {\n return fallback;\n }\n }\n\n /**\n * Returns a shallow-cloned copy of `columns` with any persisted width, visibility,\n * and order applied. Columns not present in the saved state keep their declared\n * position (appended after the saved ones).\n */\n /** Parses a stored JSON value, or null when missing/unavailable/malformed. */\n private readJson(key: string): any {\n try {\n const raw = localStorage.getItem(key);\n return raw ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n }\n\n /** Applies a widths map then a persisted order/visibility list onto a fresh copy of\n * `columns`. Shared by the top-level and per-depth restore paths. */\n private mergePersistedColumns(columns: ListColumn[], widths: any, state: any[]): ListColumn[] {\n let cols: ListColumn[] = columns.map((c) => ({...c}));\n cols.forEach((c) => {\n if (widths[c.key] != null) {\n c.width = widths[c.key];\n }\n });\n if (state.length) {\n const ordered: ListColumn[] = [];\n state.forEach((s) => {\n const found = cols.find((c) => c.key === s.colId);\n if (found && !ordered.includes(found)) {\n if (s.hide != null) {\n found.hidden = s.hide;\n }\n if (s.width != null) {\n found.width = s.width;\n }\n ordered.push(found);\n }\n });\n cols.forEach((c) => {\n if (!ordered.includes(c)) {\n ordered.push(c);\n }\n });\n cols = ordered;\n }\n return cols;\n }\n\n /** Order + visibility + width entries for one set of columns. */\n private columnStateEntries(columns: ListColumn[]): any[] {\n return columns.map((c) => ({colId: c.key, hide: !!c.hidden, width: c.width}));\n }\n\n applyPersistedState(columns: ListColumn[]): ListColumn[] {\n const widths = this.readJson(this.widthsKey()) || {};\n const state = this.readJson(this.stateKey()) || [];\n return this.mergePersistedColumns(columns, widths, state);\n }\n\n /** Persists the current order + visibility (and widths embedded in each entry). */\n saveState(columns: ListColumn[]): void {\n try {\n localStorage.setItem(this.stateKey(), JSON.stringify(this.columnStateEntries(columns)));\n } catch {\n // ignore\n }\n }\n\n // ---- nested (per-depth) child columns: same contract as above, keyed by level ----\n private childStateKey(): string {\n return `lt_${this.tableId}_child_state`;\n }\n\n private childWidthsKey(): string {\n return `lt_${this.tableId}_child_widths`;\n }\n\n /** Applies persisted order/visibility/width for one nested depth to its columns. */\n applyPersistedChildState(level: number, columns: ListColumn[]): ListColumn[] {\n const widths = (this.readJson(this.childWidthsKey()) || {})[level] || {};\n const state = (this.readJson(this.childStateKey()) || {})[level] || [];\n return this.mergePersistedColumns(columns, widths, state);\n }\n\n saveChildState(level: number, columns: ListColumn[]): void {\n try {\n const byLevel = this.readJson(this.childStateKey()) || {};\n byLevel[level] = this.columnStateEntries(columns);\n localStorage.setItem(this.childStateKey(), JSON.stringify(byLevel));\n } catch {\n // ignore\n }\n }\n\n saveChildWidth(level: number, colId: string, width: number, columns: ListColumn[]): void {\n try {\n const byLevel = this.readJson(this.childWidthsKey()) || {};\n byLevel[level] = {...(byLevel[level] || {}), [colId]: width};\n localStorage.setItem(this.childWidthsKey(), JSON.stringify(byLevel));\n } catch {\n // ignore\n }\n this.saveChildState(level, columns);\n }\n\n /** Persists a single column's width, then rewrites the ordered state. */\n saveWidth(colId: string, width: number, columns: ListColumn[]): void {\n try {\n const raw = localStorage.getItem(this.widthsKey());\n const widths = raw ? JSON.parse(raw) : {};\n widths[colId] = width;\n localStorage.setItem(this.widthsKey(), JSON.stringify(widths));\n } catch {\n // ignore\n }\n this.saveState(columns);\n }\n\n /** Clears all persisted layout for this table (\"Restore Default Table\"). */\n reset(): void {\n try {\n localStorage.removeItem(this.stateKey());\n localStorage.removeItem(this.widthsKey());\n localStorage.removeItem(this.pageSizeKey());\n localStorage.removeItem(this.treeVariantKey());\n localStorage.removeItem(this.childStateKey());\n localStorage.removeItem(this.childWidthsKey());\n } catch {\n // ignore\n }\n }\n}\n","/*\n Copyright NetFoundry Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\nimport {Directive, ElementRef, EventEmitter, Inject, NgZone, OnDestroy, OnInit, Output, PLATFORM_ID} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\n\n/**\n * Emits `clickOutside` when a click lands outside the host element. A local,\n * dependency-free standalone replacement for `ng-click-outside`, so the table and\n * its cells can be consumed from the package without pulling an undeclared dependency.\n *\n * The document listener runs outside Angular to avoid a change-detection pass on every\n * click anywhere on the page; the emit re-enters the zone so bound handlers run normally.\n */\n@Directive({\n selector: '[clickOutside]',\n standalone: true,\n})\nexport class ClickOutsideDirective implements OnInit, OnDestroy {\n @Output() clickOutside = new EventEmitter<Event>();\n\n constructor(\n private el: ElementRef,\n private ngZone: NgZone,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.onDocumentClick = this.onDocumentClick.bind(this);\n }\n\n ngOnInit(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n this.ngZone.runOutsideAngular(() => {\n document.addEventListener('click', this.onDocumentClick);\n });\n }\n\n ngOnDestroy(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n this.ngZone.runOutsideAngular(() => {\n document.removeEventListener('click', this.onDocumentClick);\n });\n }\n\n private onDocumentClick(event: Event): void {\n if (!this.el.nativeElement.contains(event.target)) {\n this.ngZone.run(() => this.clickOutside.emit(event));\n }\n }\n}\n","import {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {SafeHtml} from '@angular/platform-browser';\nimport {ClickOutsideDirective} from '../click-outside.directive';\n\n/**\n * A single row in a {@link ListMenuComponent}.\n *\n * `action` is the identifier the host dispatches on; `data` carries the original\n * domain object (menu item / header action / filter option) so the host can act\n * on it without the menu needing to know its shape.\n */\nexport interface ListMenuItem {\n /** Visible text. */\n label: string;\n /** Identifier emitted back to the host on click. */\n action: string;\n /** Optional icon class(es) rendered before the label. */\n icon?: string;\n /** Optional sanitized SVG rendered before the label (takes precedence over `icon`). */\n iconSvg?: SafeHtml;\n /** When true the row is present but visually removed (keeps list order stable). */\n hidden?: boolean;\n /** When true the row is shown but not clickable. */\n disabled?: boolean;\n /** Optional element id (preserves existing automation hooks). */\n id?: string;\n /** Original domain object this row was built from. */\n data?: any;\n}\n\n/**\n * Generic, theme-driven action menu popover. Presentational only: the host owns\n * open state and position and handles `(itemClick)` / `(closed)`.\n */\n@Component({\n selector: 'lib-list-menu',\n templateUrl: './list-menu.component.html',\n styleUrls: ['./list-menu.component.scss'],\n standalone: true,\n imports: [CommonModule, ClickOutsideDirective],\n})\nexport class ListMenuComponent {\n /** Whether the menu is rendered. */\n @Input() open = false;\n /** Rows to render. */\n @Input() items: ListMenuItem[] = [];\n /** Fixed-position left offset (px). */\n @Input() left = 0;\n /** Fixed-position top offset (px). */\n @Input() top = 0;\n /** Optional id for the menu container (automation hook). */\n @Input() menuId?: string;\n\n /** Emitted when a clickable row is selected. */\n @Output() itemClick = new EventEmitter<{item: ListMenuItem; event: MouseEvent}>();\n /** Emitted when the user clicks outside the open menu. */\n @Output() closed = new EventEmitter<Event>();\n\n onItem(item: ListMenuItem, event: MouseEvent): void {\n if (item.disabled) {\n return;\n }\n this.itemClick.emit({item, event});\n }\n\n onClickOutside(event: Event): void {\n this.closed.emit(event);\n }\n\n trackItem = (_: number, item: ListMenuItem): string => item.action ?? item.label;\n}\n","@if (open) {\n <div\n class=\"lt-menu\"\n [attr.id]=\"menuId || null\"\n [ngStyle]=\"{ left: left + 'px', top: top + 'px' }\"\n (clickOutside)=\"onClickOutside($event)\"\n >\n @for (item of items; track trackItem($index, item)) {\n <button\n type=\"button\"\n class=\"lt-menu-item\"\n [class.has-icon]=\"!!item.icon || !!item.iconSvg\"\n [class.is-hidden]=\"item.hidden\"\n [disabled]=\"!!item.disabled\"\n [attr.id]=\"item.id || null\"\n (click)=\"onItem(item, $event)\"\n >\n @if (item.iconSvg) {\n <span class=\"lt-menu-icon\" aria-hidden=\"true\" [innerHTML]=\"item.iconSvg\"></span>\n } @else if (item.icon) {\n <span class=\"lt-menu-icon {{ item.icon }}\" aria-hidden=\"true\"></span>\n }\n <span class=\"lt-menu-label\">{{ item.label }}</span>\n </button>\n }\n </div>\n}\n","/*\n Copyright NetFoundry Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\nimport {Component, ElementRef, Input, OnDestroy, OnInit, ViewChild} from '@angular/core';\nimport _ from 'lodash';\nimport moment from 'moment';\nimport {Subscription} from 'rxjs';\nimport {CommonModule} from '@angular/common';\nimport {FormsModule} from '@angular/forms';\nimport {MatDatepickerModule, MatDateRangePicker} from '@angular/material/datepicker';\nimport {MatNativeDateModule} from '@angular/material/core';\nimport {DataTableFilterService, FilterObj} from '../../data-table/data-table-filter.service';\nimport {ListColumn} from '../list-column';\nimport {ListTableService} from '../list-table.service';\nimport {ClickOutsideDirective} from '../click-outside.directive';\n\ntype FilterMode = 'text' | 'single' | 'multi' | 'daterange';\n\ninterface FilterOption {\n label: string;\n value: any;\n /** Optional class(es) to render the option as a colored chip/badge (e.g. Type). */\n chipClass?: string;\n}\n\nconst DATE_PRESETS: FilterOption[] = [\n {label: 'Any time', value: ''},\n {label: 'Last Hour', value: 'hour'},\n {label: 'Last Day', value: 'day'},\n {label: 'Last Week', value: 'week'},\n {label: 'Last Month', value: 'month'},\n];\n\n/**\n * A single control in the table's filter row. Renders the right widget for the\n * column's `filterType` (text input / single-select / multi-select / date-range)\n * and pushes changes through {@link DataTableFilterService}, whose value contract the\n * controller query-builder already understands (icontains / = / anyOf() / datetime range).\n */\n@Component({\n selector: 'lib-list-filter-cell',\n templateUrl: './list-filter-cell.component.html',\n styleUrls: ['./list-filter-cell.component.scss'],\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatDatepickerModule,\n MatNativeDateModule,\n ClickOutsideDirective,\n ],\n})\nexport class ListFilterCellComponent implements OnInit, OnDestroy {\n @Input() column!: ListColumn;\n\n mode: FilterMode = 'text';\n options: FilterOption[] = [];\n\n textValue = '';\n selectedValue: any = '';\n selectedValues: string[] = [];\n /** In-dropdown search text for the multi-select attribute combo. */\n attrSearch = '';\n /** Match any selected attribute (or) vs every one (and); attribute filters only. */\n attrSemantic: 'AnyOf' | 'AllOf' = 'AnyOf';\n\n open = false;\n menuLeft = 0;\n menuTop = 0;\n menuWidth = 0;\n\n @ViewChild('trigger') trigger?: ElementRef<HTMLElement>;\n @ViewChild('rangePicker') rangePicker?: MatDateRangePicker<Date>;\n\n // custom date range (daterange mode)\n dateRangeStart: Date | null = null;\n dateRangeEnd: Date | null = null;\n\n private sub = new Subscription();\n private textDebounced = _.debounce(() => this.emitText(), 400);\n\n constructor(\n private filterService: DataTableFilterService,\n private listSvc: ListTableService\n ) {}\n\n ngOnInit(): void {\n this.mode = this.resolveMode();\n this.options = this.resolveOptions();\n this.sub.add(\n this.filterService.filtersChanged.subscribe((filters) => this.syncFromFilters(filters))\n );\n // close this menu whenever another dropdown opens\n this.sub.add(\n this.listSvc.menuOpened$.subscribe((owner) => {\n if (owner !== this) {\n this.open = false;\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n this.sub.unsubscribe();\n }\n\n // ------------------------------------------------------------------ config\n get field(): string {\n return this.column.filterField || this.column.field || this.column.key;\n }\n\n get placeholder(): string {\n return this.column.filterPlaceholder || 'All';\n }\n\n /** True only for the Ziti role-attribute flavor of multi-select (adds #/@ prefixing). */\n get isAttributeMode(): boolean {\n return this.column.filterType === 'ATTRIBUTE';\n }\n\n private resolveMode(): FilterMode {\n switch (this.column.filterType) {\n case 'TEXTINPUT':\n return 'text';\n case 'ATTRIBUTE':\n case 'MULTISELECT':\n return 'multi';\n case 'DATETIME':\n return 'daterange';\n default:\n return 'single';\n }\n }\n\n private resolveOptions(): FilterOption[] {\n if (this.mode === 'daterange') {\n return DATE_PRESETS;\n }\n if (this.mode === 'multi') {\n let raw: any[];\n if (this.isAttributeMode) {\n const getAttrs = this.column.headerParams?.['getRoleAttributes'];\n raw = (typeof getAttrs === 'function' ? getAttrs() : null) || this.column.filterOptions || [];\n } else {\n raw = this.column.getFilterOptions ? this.column.getFilterOptions() : (this.column.filterOptions || []);\n }\n return raw.map((a: any) => (typeof a === 'string' ? {label: a, value: a} : a));\n }\n const raw = this.column.getFilterOptions ? this.column.getFilterOptions() : this.column.filterOptions || [];\n return raw as FilterOption[];\n }\n\n // ------------------------------------------------------------------ display\n private labelForValue(value: any): string {\n const opt = this.options.find((o) => `${o.value}` === `${value}`);\n return opt ? opt.label : `${value}`;\n }\n\n /** Short display of the current selection, shown after the field label when set. */\n get valueLabel(): string {\n if (this.mode === 'multi') {\n if (this.selectedValues.length === 1) {\n return this.labelForValue(this.selectedValues[0]);\n }\n return `${this.selectedValues.length}`;\n }\n if (this.mode === 'daterange') {\n if (this.selectedValue === 'custom' && this.dateRangeStart) {\n const start = moment(this.dateRangeStart).format('M/D/YY');\n const end = this.dateRangeEnd ? moment(this.dateRangeEnd).format('M/D/YY') : '';\n return end ? `${start} – ${end}` : start;\n }\n const found = this.options.find((o) => o.value === this.selectedValue);\n return found && found.value ? found.label : '';\n }\n const match = this.options.find((o) => `${o.value}` === `${this.selectedValue}`);\n return match && match.value !== '' && match.value != null ? match.label : '';\n }\n\n get hasValue(): boolean {\n if (this.mode === 'multi') {\n return this.selectedValues.length > 0;\n }\n return this.selectedValue !== '' && this.selectedValue != null;\n }\n\n isOptionSelected(opt: FilterOption): boolean {\n if (this.mode === 'multi') {\n return this.selectedValues.includes(opt.value);\n }\n return `${opt.value}` === `${this.selectedValue}`;\n }\n\n /** Attribute options filtered by the in-dropdown search box (multi mode). */\n get filteredOptions(): FilterOption[] {\n if (this.mode !== 'multi' || !this.attrSearch) {\n return this.options;\n }\n const q = this.attrSearch.toLowerCase();\n return this.options.filter((o) => `${o.label ?? o.value}`.toLowerCase().includes(q));\n }\n\n /** A named attribute (rendered with @ + secondary color) vs a role attribute (# + primary). */\n isNamedOption(opt: FilterOption): boolean {\n return this.isAttributeMode && String(opt?.value ?? opt?.label ?? '').charAt(0) === '@';\n }\n\n /** Option label. The attribute flavor prefixes # (role) / keeps @ (named); others render plain. */\n optionLabel(opt: FilterOption): string {\n const raw = String(opt?.label ?? opt?.value ?? '');\n if (!this.isAttributeMode) {\n return raw;\n }\n if (raw.charAt(0) === '@' || raw.charAt(0) === '#') {\n return raw;\n }\n return '#' + raw;\n }\n\n // ------------------------------------------------------------------ open/close\n toggleMenu(event: MouseEvent): void {\n event.stopPropagation();\n if (this.open) {\n this.open = false;\n return;\n }\n const rect = this.trigger?.nativeElement.getBoundingClientRect();\n if (rect) {\n this.menuLeft = rect.left;\n this.menuTop = rect.bottom + 4;\n this.menuWidth = Math.max(rect.width, this.mode === 'multi' ? 220 : 160);\n }\n // refresh dynamic option sources (e.g. role attributes) each open\n this.options = this.resolveOptions();\n this.attrSearch = '';\n this.open = true;\n this.listSvc.notifyMenuOpened(this);\n }\n\n closeMenu(): void {\n this.open = false;\n }\n\n // ------------------------------------------------------------------ text\n onTextInput(): void {\n this.textDebounced();\n }\n\n private emitText(): void {\n this.filterService.updateFilter({\n filterName: this.column.label,\n columnId: this.field,\n value: this.textValue,\n label: this.textValue,\n type: 'TEXTINPUT',\n });\n }\n\n // ------------------------------------------------------------------ single\n selectOption(opt: FilterOption): void {\n this.selectedValue = opt.value;\n this.open = false;\n if (opt.value === '' || opt.value == null) {\n this.removeThis();\n return;\n }\n this.filterService.updateFilter({\n filterName: this.column.label,\n columnId: this.field,\n value: opt.value,\n label: opt.label,\n type: (this.column.filterType as string) || 'SELECT',\n });\n }\n\n // ------------------------------------------------------------------ multi\n toggleOption(opt: FilterOption): void {\n const idx = this.selectedValues.indexOf(opt.value);\n if (idx >= 0) {\n this.selectedValues.splice(idx, 1);\n } else {\n this.selectedValues.push(opt.value);\n }\n this.emitMulti();\n }\n\n private emitMulti(): void {\n if (!this.selectedValues.length) {\n this.removeThis();\n return;\n }\n const filter: FilterObj & {semantic?: string} = {\n filterName: this.column.label,\n columnId: this.field,\n value: [...this.selectedValues],\n label: this.selectedValues.map((v) => this.labelForValue(v)).join(', '),\n type: this.isAttributeMode ? 'ATTRIBUTE' : 'MULTISELECT',\n semantic: this.isAttributeMode ? this.attrSemantic : 'AnyOf',\n };\n this.filterService.updateFilter(filter);\n }\n\n setSemantic(semantic: 'AnyOf' | 'AllOf'): void {\n if (this.attrSemantic === semantic) {\n return;\n }\n this.attrSemantic = semantic;\n if (this.selectedValues.length) {\n this.emitMulti();\n }\n }\n\n // ------------------------------------------------------------------ date range\n selectDatePreset(opt: FilterOption): void {\n this.selectedValue = opt.value;\n this.dateRangeStart = null;\n this.dateRangeEnd = null;\n this.open = false;\n if (!opt.value) {\n this.removeThis();\n return;\n }\n const end = moment();\n let start;\n switch (opt.value) {\n case 'hour': start = moment().subtract(1, 'hours'); break;\n case 'week': start = moment().subtract(7, 'days'); break;\n case 'month': start = moment().subtract(1, 'month'); break;\n case 'day':\n default: start = moment().subtract(24, 'hours'); break;\n }\n this.filterService.updateFilter({\n filterName: this.column.label,\n columnId: this.field,\n value: [encodeURIComponent(start.toISOString()), encodeURIComponent(end.toISOString())],\n label: opt.label,\n type: 'DATETIME',\n });\n }\n\n openCustomRange(event: MouseEvent): void {\n event.stopPropagation();\n this.open = false;\n // open the Material calendar on the next tick (after the menu closes)\n _.delay(() => this.rangePicker?.open(), 0);\n }\n\n onRangeStartChanged(date: Date | null): void {\n this.dateRangeStart = date;\n this.emitCustomRange();\n }\n\n onRangeEndChanged(date: Date | null): void {\n this.dateRangeEnd = date;\n this.emitCustomRange();\n }\n\n private emitCustomRange(): void {\n if (!this.dateRangeStart || !this.dateRangeEnd) {\n return;\n }\n this.selectedValue = 'custom';\n const start = moment(this.dateRangeStart).startOf('day');\n const end = moment(this.dateRangeEnd).endOf('day');\n this.filterService.updateFilter({\n filterName: this.column.label,\n columnId: this.field,\n value: [encodeURIComponent(start.toISOString()), encodeURIComponent(end.toISOString())],\n label: `${start.format('M/D/YY')} – ${end.format('M/D/YY')}`,\n type: 'DATETIME',\n });\n }\n\n // ------------------------------------------------------------------ clear\n clear(event: MouseEvent): void {\n event.stopPropagation();\n this.selectedValue = '';\n this.selectedValues = [];\n this.textValue = '';\n this.dateRangeStart = null;\n this.dateRangeEnd = null;\n this.attrSemantic = 'AnyOf';\n this.removeThis();\n }\n\n private removeThis(): void {\n this.filterService.removeFilter({\n filterName: this.column.label,\n columnId: this.field,\n value: '',\n label: '',\n });\n }\n\n // ------------------------------------------------------------------ sync\n private syncFromFilters(filters: FilterObj[]): void {\n const match = filters.find((f) => f.columnId === this.field);\n if (!match) {\n this.textValue = '';\n this.selectedValue = '';\n this.selectedValues = [];\n this.dateRangeStart = null;\n this.dateRangeEnd = null;\n return;\n }\n if (this.mode === 'text') {\n this.textValue = match.value ?? '';\n } else if (this.mode === 'multi') {\n this.selectedValues = _.isArray(match.value) ? [...match.value] : [match.value];\n if (this.isAttributeMode) {\n this.attrSemantic = (match as any).semantic === 'AllOf' ? 'AllOf' : 'AnyOf';\n }\n } else if (this.mode === 'daterange') {\n // keep the locally chosen preset label; match.value is the raw [start,end] range\n } else {\n this.selectedValue = match.value;\n }\n }\n}\n","@switch (mode) {\n @case ('text') {\n <div class=\"fc-text\">\n <input\n class=\"fc-input\"\n type=\"text\"\n [placeholder]=\"column.filterPlaceholder || 'Filter'\"\n [(ngModel)]=\"textValue\"\n (keyup)=\"onTextInput()\"\n />\n @if (textValue) {\n <span class=\"fc-clear\" (click)=\"clear($event)\" title=\"Clear\" aria-label=\"Clear filter\">&times;</span>\n }\n </div>\n }\n @default {\n <button\n #trigger\n type=\"button\"\n class=\"fc-pill\"\n [class.has-value]=\"hasValue\"\n [class.is-open]=\"open\"\n (click)=\"toggleMenu($event)\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"open\"\n >\n <span class=\"fc-pill-field\">{{ column.label }}</span>\n @if (hasValue) {\n <span class=\"fc-pill-value\" [title]=\"valueLabel\">{{ valueLabel }}</span>\n <span class=\"fc-clear\" (click)=\"clear($event)\" title=\"Clear\" aria-label=\"Clear filter\">&times;</span>\n } @else {\n <span class=\"fc-caret\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 10 6\" width=\"9\" height=\"6\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M1 1.5 5 5 9 1.5\"/></svg>\n </span>\n }\n </button>\n\n @if (open) {\n <div\n class=\"fc-menu\"\n (clickOutside)=\"closeMenu()\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px', 'min-width.px': menuWidth }\"\n >\n @if (mode === 'multi') {\n <div class=\"fc-search\">\n <svg class=\"fc-search-icon\" viewBox=\"0 0 16 16\" width=\"13\" height=\"13\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"4.3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <line x1=\"10.4\" y1=\"10.4\" x2=\"14.6\" y2=\"14.6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"fc-search-input\"\n type=\"text\"\n [(ngModel)]=\"attrSearch\"\n [placeholder]=\"isAttributeMode ? 'Search attributes' : 'Search'\"\n (click)=\"$event.stopPropagation()\"\n autocomplete=\"off\"\n />\n </div>\n @if (isAttributeMode) {\n <div class=\"fc-semantic\" role=\"group\" aria-label=\"Match\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"fc-semantic-opt\" [class.active]=\"attrSemantic === 'AnyOf'\" (click)=\"setSemantic('AnyOf')\">Any of</button>\n <button type=\"button\" class=\"fc-semantic-opt\" [class.active]=\"attrSemantic === 'AllOf'\" (click)=\"setSemantic('AllOf')\">All of</button>\n </div>\n }\n @if (!filteredOptions.length) {\n <div class=\"fc-empty\">{{ options.length ? 'No matches' : (isAttributeMode ? 'No attributes available' : 'No options available') }}</div>\n }\n <div class=\"fc-opt-list\">\n @for (opt of filteredOptions; track opt.value) {\n <button type=\"button\" class=\"fc-opt\" [class.selected]=\"isOptionSelected(opt)\" (click)=\"toggleOption(opt)\">\n <span class=\"fc-check\" aria-hidden=\"true\">\n @if (isOptionSelected(opt)) {\n <svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2 6.3 4.6 9 10 3\"/></svg>\n }\n </span>\n @if (isAttributeMode) {\n <span class=\"fc-attr\" [class.at]=\"isNamedOption(opt)\">{{ optionLabel(opt) }}</span>\n } @else if (opt.chipClass) {\n <span [ngClass]=\"opt.chipClass\">{{ opt.label }}</span>\n } @else {\n <span class=\"fc-opt-label\">{{ optionLabel(opt) }}</span>\n }\n </button>\n }\n </div>\n } @else if (mode === 'daterange') {\n @for (opt of options; track opt.value) {\n <button type=\"button\" class=\"fc-opt\" [class.selected]=\"isOptionSelected(opt)\" (click)=\"selectDatePreset(opt)\">\n <span class=\"fc-opt-label\">{{ opt.label }}</span>\n </button>\n }\n <div class=\"fc-divider\"></div>\n <button type=\"button\" class=\"fc-opt\" [class.selected]=\"selectedValue === 'custom'\" (click)=\"openCustomRange($event)\">\n <span class=\"fc-opt-label\">Custom range…</span>\n </button>\n } @else {\n @for (opt of options; track opt.value) {\n <button type=\"button\" class=\"fc-opt\" [class.selected]=\"isOptionSelected(opt)\" (click)=\"selectOption(opt)\">\n @if (opt.chipClass) {\n <span [ngClass]=\"opt.chipClass\">{{ opt.label }}</span>\n } @else {\n <span class=\"fc-opt-label\">{{ opt.label }}</span>\n }\n </button>\n }\n }\n </div>\n }\n }\n}\n\n@if (mode === 'daterange') {\n <!-- hidden Material range input; the calendar is opened from the \"Custom range…\" option -->\n <mat-date-range-input class=\"fc-hidden-range\" [rangePicker]=\"rangePicker\">\n <input matStartDate [(ngModel)]=\"dateRangeStart\" (dateChange)=\"onRangeStartChanged($event.value)\" tabindex=\"-1\" aria-hidden=\"true\" />\n <input matEndDate [(ngModel)]=\"dateRangeEnd\" (dateChange)=\"onRangeEndChanged($event.value)\" tabindex=\"-1\" aria-hidden=\"true\" />\n </mat-date-range-input>\n <mat-date-range-picker #rangePicker xPosition=\"start\" yPosition=\"below\"></mat-date-range-picker>\n}\n","/*\n Copyright NetFoundry Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\nimport {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ListColumn, ListSortDir} from '../list-column';\n\n/** Header cell for {@link ListTableComponent}: label and 3-state sort (asc/desc). */\n@Component({\n selector: 'lib-list-header-cell',\n templateUrl: './list-header-cell.component.html',\n styleUrls: ['./list-header-cell.component.scss'],\n standalone: true,\n imports: [CommonModule],\n})\nexport class ListHeaderCellComponent {\n @Input() column!: ListColumn;\n @Input() sortDir: ListSortDir;\n\n @Output() sortChanged = new EventEmitter<{colId: string; dir: ListSortDir}>();\n\n get enableSorting(): boolean {\n return !!(this.column?.sortable || this.column?.enableSorting);\n }\n\n sort(): void {\n if (!this.enableSorting) {\n return;\n }\n const dir: ListSortDir = !this.sortDir || this.sortDir === 'desc' ? 'asc' : 'desc';\n this.sortDir = dir;\n this.column.onSort?.(this.column.key, dir);\n this.sortChanged.emit({colId: this.column.key, dir});\n }\n}\n","<div\n (click)=\"sort()\"\n [ngClass]=\"{ 'nf-can-sort': enableSorting }\"\n class=\"lt-header-container\"\n id=\"TableHeaderContainer_{{ column.key }}\"\n>\n <div class=\"lt-header-label\">\n <span\n [title]=\"column.label || null\"\n class=\"lt-header-text\"\n [class.is-sorted]=\"sortDir === 'asc' || sortDir === 'desc'\"\n id=\"HeaderName_{{ column.key }}\"\n unselectable=\"on\"\n >{{ column.label }}</span>\n @if (enableSorting) {\n <span class=\"lt-sort\" [class.asc]=\"sortDir === 'asc'\" [class.desc]=\"sortDir === 'desc'\">\n <svg viewBox=\"0 0 8 14\" width=\"8\" height=\"13\" aria-hidden=\"true\">\n <path class=\"lt-sort-up\" d=\"M4 0 7.5 4.5H0.5z\"/>\n <path class=\"lt-sort-down\" d=\"M4 14 0.5 9.5H7.5z\"/>\n </svg>\n </span>\n }\n </div>\n</div>\n","/*\n Copyright NetFoundry Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\nimport {Component, ElementRef, EventEmitter, Input, OnDestroy, Output, ViewChild} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ClickOutsideDirective} from '../click-outside.directive';\n\nexport interface RefreshInterval {\n label: string;\n seconds: number;\n}\n\n/** Auto-refresh control: a pill + interval menu. Owns the timer and emits `refresh` each tick. */\n@Component({\n selector: 'lib-list-table-auto-refresh',\n templateUrl: './list-table-auto-refresh.component.html',\n styleUrls: ['./list-table-auto-refresh.component.scss'],\n standalone: true,\n imports: [CommonModule, ClickOutsideDirective],\n})\nexport class ListTableAutoRefreshComponent implements OnDestroy {\n /** Current interval in seconds; 0 means off. */\n @Input() set seconds(value: number) {\n this._seconds = value || 0;\n this.restartTimer();\n }\n get seconds(): number {\n return this._seconds;\n }\n private _seconds = 0;\n\n /** Skip a tick while a refresh is already in flight. */\n @Input() loading = false;\n\n @Input() intervals: RefreshInterval[] = [\n {label: '15s', seconds: 15},\n {label: '30s', seconds: 30},\n {label: '1m', seconds: 60},\n {label: '5m', seconds: 300},\n ];\n\n @Output() refresh = new EventEmitter<void>();\n @Output() secondsChange = new EventEmitter<number>();\n\n open = false;\n /** Menu geometry, all measured when the menu opens: left offset so labels line up\n * under the button's value, width so the right edge lands on the button's right\n * edge, and right padding so the check centers under the chevron. */\n menuLeft = 0;\n menuWidth = 0;\n menuPadRight = 0;\n private timer?: ReturnType<typeof setInterval>;\n\n @ViewChild('arEl') arEl?: ElementRef<HTMLElement>;\n @ViewChild('valueEl') valueEl?: ElementRef<HTMLElement>;\n @ViewChild('chevronEl') chevronEl?: ElementRef<HTMLElement>;\n\n get enabled(): boolean {\n return this._seconds > 0;\n }\n\n get valueLabel(): string {\n if (!this.enabled) {\n return 'Off';\n }\n const match = this.intervals.find((i) => i.seconds === this._seconds);\n return match ? match.label : `${this._seconds}s`;\n }\n\n toggleMenu(event: MouseEvent): void {\n event.stopPropagation();\n if (this.open) {\n this.open = false;\n return;\n }\n this.alignMenuToValue();\n this.open = true;\n }\n\n /** Position + size the menu so its labels sit directly under the button's value,\n * its right edge lands on the button's right edge (one shared border), and the\n * right-aligned check centers under the chevron. */\n private alignMenuToValue(): void {\n const el = this.arEl?.nativeElement;\n const btn = el?.querySelector('.lt-ar-btn') as HTMLElement | null;\n const value = this.valueEl?.nativeElement?.getBoundingClientRect();\n const chevron = this.chevronEl?.nativeElement?.getBoundingClientRect();\n const container = el?.getBoundingClientRect();\n if (!btn || !value || !chevron || !container) {\n return;\n }\n const rem = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n // left padding we back out of the value position so labels sit under it\n const itemPadLeft = 0.875 * rem;\n // half the check's box, so we can land its center rather than its edge\n const tickHalf = 0.375 * rem;\n const borderWidth = parseFloat(getComputedStyle(btn).borderRightWidth) || 1;\n this.menuLeft = Math.max(0, value.left - container.left - itemPadLeft);\n this.menuWidth = container.width - this.menuLeft;\n // the check is right-aligned, so its right padding is the gap from the menu's\n // right edge to the chevron center, less the border and half the check box\n const chevronCenter = (chevron.left + chevron.right) / 2;\n this.menuPadRight = Math.max(0, container.right - chevronCenter - borderWidth - tickHalf);\n }\n\n closeMenu(): void {\n this.open = false;\n }\n\n isSelected(seconds: number): boolean {\n return this._seconds === seconds;\n }\n\n select(seconds: number): void {\n this.open = false;\n if (seconds === this._seconds) {\n return;\n }\n this._seconds = seconds;\n this.secondsChange.emit(seconds);\n this.restartTimer();\n }\n\n private restartTimer(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n if (this._seconds > 0) {\n this.timer = setInterval(() => {\n if (!this.loading) {\n this.refresh.emit();\n }\n }, this._seconds * 1000);\n }\n }\n\n ngOnDestroy(): void {\n if (this.timer) {\n clearInterval(this.timer);\n }\n }\n}\n","<div class=\"lt-ar\" #arEl [class.is-open]=\"open\">\n <button\n type=\"button\"\n class=\"lt-ar-btn\"\n [class.is-on]=\"enabled\"\n [class.is-open]=\"open\"\n (click)=\"toggleMenu($event)\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-label]=\"'Auto-refresh: ' + valueLabel\"\n id=\"AutoRefreshButton\"\n >\n <svg class=\"lt-ar-icon\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\">\n <path fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 6.4A5.6 5.6 0 1 1 2.4 9\"/>\n <path fill=\"currentColor\" d=\"M1.4 3.1l.7 3.3 3.2-.9z\"/>\n <path fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8 5.3V8.2l2 1.3\"/>\n </svg>\n <span class=\"lt-ar-prefix\">Auto-refresh:</span>\n <span class=\"lt-ar-value\" #valueEl>{{ valueLabel }}</span>\n <svg class=\"lt-ar-chevron\" #chevronEl viewBox=\"0 0 10 6\" width=\"9\" height=\"6\" aria-hidden=\"true\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M1 1.5 5 5 9 1.5\"/></svg>\n </button>\n\n @if (open) {\n <div class=\"lt-ar-menu\" [style.left.px]=\"menuLeft\" [style.width.px]=\"menuWidth\" [style.--lt-ar-pad-right]=\"menuPadRight + 'px'\" (clickOutside)=\"closeMenu()\" role=\"menu\">\n <button type=\"button\" class=\"lt-ar-item\" [class.is-selected]=\"!enabled\" (click)=\"select(0)\" role=\"menuitemradio\" [attr.aria-checked]=\"!enabled\">\n <span class=\"lt-ar-label\">Off</span>\n <span class=\"lt-ar-tick\" aria-hidden=\"true\">\n @if (!enabled) {\n <svg viewBox=\"0 0 12 12\" width=\"11\" height=\"11\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2 6.3 4.6 9 10 3\"/></svg>\n }\n </span>\n </button>\n @for (interval of intervals; track interval.seconds) {\n <button type=\"button\" class=\"lt-ar-item\" [class.is-selected]=\"isSelected(interval.seconds)\" (click)=\"select(interval.seconds)\" role=\"menuitemradio\" [attr.aria-checked]=\"isSelected(interval.seconds)\">\n <span class=\"lt-ar-label\">{{ interval.label }}</span>\n <span class=\"lt-ar-tick\" aria-hidden=\"true\">\n @if (isSelected(interval.seconds)) {\n <svg viewBox=\"0 0 12 12\" width=\"11\" height=\"11\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2 6.3 4.6 9 10 3\"/></svg>\n }\n </span>\n </button>\n }\n </div>\n }\n</div>\n","import {Component, Input} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport _ from 'lodash';\n\n/**\n * Row selection toggle for {@link ListTableComponent}. Router / exclusive /\n * reserved / system rows cannot be toggled.\n */\n@Component({\n selector: 'lib-select-cell',\n templateUrl: './select-cell.component.html',\n styleUrls: ['./select-cell.component.scss'],\n standalone: true,\n imports: [CommonModule, MatTooltipModule],\n})\nexport class SelectCellComponent {\n item: any = {\n id: '',\n name: '',\n selected: false,\n hideSelect: false,\n };\n disableToggle = false;\n\n @Input() set row(v: any) {\n this.item = v || this.item;\n this.disableToggle =\n _.get(this.item, 'typeId') === 'Router' ||\n _.get(this.item, 'exclusiveTo') ||\n _.get(this.item, 'reserved') === true ||\n _.get(this.item, 'isSystem') === true;\n }\n\n /** Host callback invoked with the row when a selectable row is toggled. */\n @Input() toggleItem: ((item: any) => void) | undefined;\n\n toggle(item: any): void {\n if (this.disableToggle || !this.toggleItem) {\n return;\n }\n this.toggleItem(item);\n }\n\n get tooltip(): string {\n let tooltip = '';\n if (this.item?.isSystem) {\n tooltip = 'Deleting \"system\" entities is not allowed';\n } else if (this.item?.typeId === 'Router') {\n tooltip = 'Unable to delete \"Router\" Identities. Please delete the associated Router instead.';\n }\n return tooltip;\n }\n}\n","@if (!item.hideSelect) {\n <div\n #toggleButton\n (click)=\"toggle(item)\"\n [ngClass]=\"{ selected: item.selected, indeterminate: item.indeterminate && !item.selected, disabled: disableToggle }\"\n attr.name=\"RowSelect0_{{ item.name }}\"\n class=\"row-toggle tSelect\"\n id=\"RowSelect0_{{ item.id }}\"\n attr.data-id=\"{{item.id}}\"\n [matTooltip]=\"tooltip\"\n ></div>\n}\n","/*\n Copyright NetFoundry Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\nimport {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {CommonModule} from '@angular/common';\n\n/** Which situation the table is in when it has nothing to show. */\nexport type EmptyVariant = 'empty' | 'no-results' | 'access-denied' | 'error';\n\n/** Line glyph drawn in the empty-state figure. */\nexport type EmptyGlyph = 'generic' | 'service' | 'identity' | 'router' | 'policy' | 'search' | 'lock' | 'alert';\n\ninterface EmptyCopy {\n noun: string;\n glyph: EmptyGlyph;\n cta: string;\n}\n\n/**\n * Modern, themeable placeholder shown inside {@link ListTableComponent} when a list has\n * no rows. Four variants (first-use empty, no search results, access denied, load error),\n * per-entity default copy keyed by tableId, and a `[empty-state]` projection slot for a\n * fully custom placeholder. All copy/glyph/actions can be overridden per table.\n */\n@Component({\n selector: 'lib-list-empty',\n templateUrl: './list-empty.component.html',\n styleUrls: ['./list-empty.component.scss'],\n standalone: true,\n imports: [CommonModule],\n})\nexport class ListEmptyComponent {\n @Input() variant: EmptyVariant = 'empty';\n /** tableId used to look up the default copy (e.g. 'services', 'identities'). */\n @Input() entityKey = '';\n /** Human label used to derive a noun when the key has no tailored copy. */\n @Input() entityLabel = '';\n /** What this list belongs to, e.g. 'network'. Set: \"This network has no services\";\n * blank: \"There are no services\", for lists not tied to a network. */\n @Input() scope = '';\n\n /** Overrides for the generated content; unset falls back to the per-entity defaults. */\n @Input() title?: string;\n @Input() message?: string;\n @Input() icon?: EmptyGlyph;\n /** Label for the primary create action (first-use empty only). */\n @Input() createLabel = '';\n\n /** Whether the create action is offered (false hides it, e.g. read-only tables). */\n @Input() hasAdd = true;\n @Input() readonly = false;\n /** Draw the soft card. On for the full-page state; off inside the table, so a card isn't nested in the grid. */\n @Input() framed = true;\n\n @Output() create = new EventEmitter<void>();\n @Output() clearFilters = new EventEmitter<void>();\n @Output() retry = new EventEmitter<void>();\n\n // ---- per-entity default copy (first-use \"empty\" variant) ---------------------\n // Keyed by tableId. Anything not listed falls back to a generic noun-based template.\n private static readonly COPY: Record<string, EmptyCopy> = {\n services: { noun: 'services', glyph: 'service', cta: 'Create service' },\n identities: { noun: 'identities', glyph: 'identity', cta: 'Create identity' },\n 'edge-routers': { noun: 'edge routers', glyph: 'router', cta: 'Create edge router' },\n 'service-policies': { noun: 'service policies', glyph: 'policy', cta: 'Create service policy' },\n 'edge-router-policies': { noun: 'edge router policies', glyph: 'policy', cta: 'Create edge router policy' },\n 'service-edge-router-policies': { noun: 'service edge router policies', glyph: 'policy', cta: 'Create policy' },\n 'posture-checks': { noun: 'posture checks', glyph: 'policy', cta: 'Create posture check' },\n configurations: { noun: 'configs', glyph: 'service', cta: 'Create config' },\n 'config-types': { noun: 'config types', glyph: 'service', cta: 'Create config type' },\n 'auth-policies': { noun: 'auth policies', glyph: 'policy', cta: 'Create auth policy' },\n 'certificate-authorities': { noun: 'certificate authorities', glyph: 'policy', cta: 'Create authority' },\n 'ext-jwt-signers': { noun: 'external JWT signers', glyph: 'policy', cta: 'Create signer' },\n terminators: { noun: 'terminators', glyph: 'router', cta: 'Create terminator' },\n 'transit-routers': { noun: 'transit routers', glyph: 'router', cta: 'Create transit router' },\n };\n\n // ---- resolved content --------------------------------------------------------\n private get copy(): EmptyCopy {\n const hit = ListEmptyComponent.COPY[this.entityKey];\n if (hit) {\n return hit;\n }\n const noun = (this.entityLabel || 'items').toLowerCase();\n return {\n noun,\n glyph: 'service',\n cta: this.createLabel || 'Create',\n };\n }\n\n get glyph(): EmptyGlyph {\n if (this.icon) {\n return this.icon;\n }\n switch (this.variant) {\n case 'no-results':\n return 'search';\n case 'access-denied':\n return 'lock';\n case 'error':\n return 'alert';\n default:\n // one generic icon for the no-data state on every page\n return 'generic';\n }\n }\n\n /** Tone drives the glyph colour away from the create-accent for non-create variants. */\n get tone(): '' | 'warn' | 'danger' {\n if (this.variant === 'access-denied') {\n return 'warn';\n }\n if (this.variant === 'error') {\n return 'danger';\n }\n return '';\n }\n\n private get noun(): string {\n return this.copy.noun;\n }\n\n get resolvedTitle(): string {\n if (this.title) {\n return this.title;\n }\n switch (this.variant) {\n case 'no-results':\n return `No matching ${this.noun}`;\n case 'access-denied':\n return 'Access restricted';\n case 'error':\n return `Couldn’t load ${this.noun}`;\n default:\n // first-use empty: name what the list belongs to when we know it\n return this.scope\n ? `This ${this.scope} has no ${this.noun}`\n : `There are no ${this.noun}`;\n }\n }\n\n get resolvedMessage(): string {\n if (this.message) {\n return this.message;\n }\n switch (this.variant) {\n case 'no-results':\n return `No ${this.noun} match your current filters. Try different terms or clear them to see everything.`;\n case 'access-denied':\n return `You don’t have permission to view ${this.noun}. Ask your network administrator to grant access.`;\n case 'error':\n return 'Something interrupted the request. Check the connection to the controller, then try again.';\n default:\n // first-use empty state keeps just the headline, no explanatory subtext\n return '';\n }\n }\n\n /** The primary create action shows only on the first-use empty state when allowed. */\n get showCreate(): boolean {\n return this.variant === 'empty' && this.hasAdd && !this.readonly;\n }\n\n get primaryLabel(): string {\n return this.createLabel || this.copy.cta;\n }\n\n onCreate(): void {\n this.create.emit();\n }\n\n onClear(): void {\n this.clearFilters.emit();\n }\n\n onRetry(): void {\n this.retry.emit();\n }\n}\n","<!-- host-projected custom empty state; when nothing is projected the default below renders -->\n<div class=\"le-projected\" #projected><ng-content select=\"[empty-state]\"></ng-content></div>\n\n@if (projected.children.length === 0) {\n <div class=\"le\" [class.le-card]=\"framed\" [attr.data-tone]=\"tone\" role=\"status\">\n <div class=\"le-figure\" aria-hidden=\"true\">\n <div class=\"le-glyph\">\n @switch (glyph) {\n @case ('generic') {\n <!-- overlay (stacked layers): what Ziti is, a layer over the network -->\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12 3 21 7.8 12 12.6 3 7.8z\"/>\n <path d=\"M3.4 12 12 16.6 20.6 12\" opacity=\"0.72\"/>\n <path d=\"M3.4 16 12 20.6 20.6 16\" opacity=\"0.4\"/>\n </svg>\n }\n @case ('service') {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"5\" r=\"2.2\"/><circle cx=\"5\" cy=\"18\" r=\"2.2\"/><circle cx=\"19\" cy=\"18\" r=\"2.2\"/>\n <path d=\"M12 7.2v4.3M12 11.5l-5.2 4.6M12 11.5l5.2 4.6\"/>\n </svg>\n }\n @case ('identity') {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"9\" r=\"3.2\"/><path d=\"M5.5 19.2a6.8 6.8 0 0 1 13 0\"/><circle cx=\"12\" cy=\"12\" r=\"9.2\" opacity=\"0.35\"/>\n </svg>\n }\n @case ('router') {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3.5\" y=\"13\" width=\"17\" height=\"6\" rx=\"1.6\"/><path d=\"M7 16h.01M11 16h.01\"/><path d=\"M12 13V9M12 9l-3-3M12 9l3-3\"/>\n </svg>\n }\n @case ('policy') {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12 3l7 3v5c0 4.4-3 7.6-7 9-4-1.4-7-4.6-7-9V6z\"/><path d=\"M9.2 12.2l2 2 3.6-3.8\"/>\n </svg>\n }\n @case ('search') {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"6\"/><line x1=\"15.5\" y1=\"15.5\" x2=\"20\" y2=\"20\"/>\n </svg>\n }\n @case ('lock') {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"5\" y=\"10.5\" width=\"14\" height=\"9\" rx=\"2\"/><path d=\"M8 10.5V7.5a4 4 0 0 1 8 0v3\"/><circle cx=\"12\" cy=\"15\" r=\"1.1\"/>\n </svg>\n }\n @case ('alert') {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12 4.5l8.5 15H3.5z\"/><line x1=\"12\" y1=\"10\" x2=\"12\" y2=\"14\"/><circle cx=\"12\" cy=\"16.6\" r=\"0.6\" fill=\"currentColor\"/>\n </svg>\n }\n }\n </div>\n </div>\n\n <h2 class=\"le-title\">{{ resolvedTitle }}</h2>\n @if (resolvedMessage) {\n <p class=\"le-message\">{{ resolvedMessage }}</p>\n }\n\n @if (showCreate || variant === 'no-results' || variant === 'error') {\n <div class=\"le-actions\">\n @if (showCreate) {\n <button type=\"button\" class=\"le-btn le-btn-primary\" (click)=\"onCreate()\" id=\"EmptyCreateButton\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\n </svg>\n <span>{{ primaryLabel }}</span>\n </button>\n }\n @if (variant === 'no-results') {\n <button type=\"button\" class=\"le-btn le-btn-ghost\" (click)=\"onClear()\" id=\"EmptyClearFiltersButton\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n </svg>\n <span>Clear filters</span>\n </button>\n }\n @if (variant === 'error') {\n <button type=\"button\" class=\"le-btn le-btn-ghost\" (click)=\"onRetry()\" id=\"EmptyRetryButton\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M20 11a8 8 0 1 0-1.3 5.5\"/><path d=\"M20 5v4h-4\"/>\n </svg>\n <span>Retry</span>\n </button>\n }\n </div>\n }\n </div>\n}\n","/*\n Copyright NetFoundry Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\nimport {\n AfterViewChecked,\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n NgZone,\n OnDestroy,\n OnInit,\n Output,\n Type,\n ViewChild,\n} from '@angular/core';\nimport _ from 'lodash';\nimport {Subscription} from 'rxjs';\nimport {CommonModule} from '@angular/common';\nimport {FormsModule} from '@angular/forms';\nimport {CdkDragDrop, DragDropModule, moveItemInArray} from '@angular/cdk/drag-drop';\nimport {DomSanitizer, SafeHtml} from '@angular/platform-browser';\n\nimport {DataTableFilterService, FilterObj} from '../data-table/data-table-filter.service';\nimport {ListColumn, ListCellContext, ListLegacyCellShim, ListSortDir, ListTableOptions, ListTableToolbarOptions, TreeVariant} from './list-column';\nimport {ListTableService} from './list-table.service';\nimport {ListMenuComponent, ListMenuItem} from './list-menu/list-menu.component';\nimport {ClickOutsideDirective} from './click-outside.directive';\nimport {ListFilterCellComponent} from './list-filter-cell/list-filter-cell.component';\nimport {ListHeaderCellComponent} from './list-header-cell/list-header-cell.component';\nimport {ListTableAutoRefreshComponent} from './list-table-auto-refresh/list-table-auto-refresh.component';\nimport {SelectCellComponent} from './select-cell/select-cell.component';\nimport {ListEmptyComponent} from './list-empty/list-empty.component';\n\n/**\n * Custom, token-skinnable list table. Columns are declared with {@link ListColumn};\n * sort, filter, and pagination flow through {@link DataTableFilterService}.\n */\n@Component({\n selector: 'lib-list-table',\n templateUrl: './list-table.component.html',\n styleUrls: ['./list-table.component.scss'],\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DragDropModule,\n ClickOutsideDirective,\n ListFilterCellComponent,\n ListHeaderCellComponent,\n ListMenuComponent,\n ListTableAutoRefreshComponent,\n SelectCellComponent,\n ListEmptyComponent,\n ],\n providers: [ListTableService],\n})\nexport class ListTableComponent implements OnInit, AfterViewInit, AfterViewChecked, OnDestroy {\n @Input() set tableId(id: string) {\n this._tableId = id;\n this.svc.tableId = id;\n }\n get tableId(): string {\n return this._tableId;\n }\n private _tableId = '';\n\n @Input() set columns(value: ListColumn[]) {\n this._rawColumns = value || [];\n if (this._initialized) {\n this.buildColumns();\n }\n }\n\n @Input() set rowData(value: any[]) {\n this._rowData = value || [];\n // once real rows have arrived, later loads are \"refresh\" (keep rows + top bar)\n // rather than \"initial\" (skeleton). Never flips back on a later empty result.\n if (this._rowData.length > 0) {\n this.hasLoadedOnce = true;\n }\n this.updateSkeleton();\n this.rebuildFlatRows();\n }\n get rowData(): any[] {\n return this._rowData;\n }\n private _rowData: any[] = [];\n\n @Input() set isLoading(value: boolean) {\n this._isLoading = value;\n this.updateRefreshBar();\n this.updateSkeleton();\n }\n get isLoading(): boolean {\n return this._isLoading;\n }\n private _isLoading = false;\n\n /** Placeholder rows drawn during the first load, before any data has arrived. */\n @Input() skeletonRowCount = 8;\n\n /** True once the table has shown real rows at least once, so a later load shows the\n * refresh bar over the existing rows instead of the full-page skeleton again. */\n hasLoadedOnce = false;\n\n /** The logical \"first load with nothing on screen yet\" state. The skeleton renders\n * off showSkeleton (below), which debounces this so a very fast first load goes\n * straight to rows without a skeleton flash. */\n get isInitialLoad(): boolean {\n return this._isLoading && !this.hasLoadedOnce;\n }\n\n /** Whether the skeleton placeholder is visible. Debounced from isInitialLoad with the\n * same show-delay as the refresh bar: a first load shorter than REFRESH_SHOW_DELAY\n * never shows it. Unlike the bar there is no minimum-visible hold, so real rows\n * replace the skeleton the moment they arrive. */\n showSkeleton = false;\n private skeletonShowTimer: any;\n\n private updateSkeleton(): void {\n if (this.isInitialLoad) {\n // arm the show-delay once; a fast first load that finishes before it fires\n // never shows the skeleton - the rows just appear\n if (!this.showSkeleton && !this.skeletonShowTimer) {\n this.skeletonShowTimer = setTimeout(() => {\n this.skeletonShowTimer = undefined;\n this.showSkeleton = true;\n }, this.REFRESH_SHOW_DELAY);\n }\n } else {\n // first load ended (rows arrived) or this is not a first load: cancel a\n // pending skeleton and hide it now so real rows show at once\n clearTimeout(this.skeletonShowTimer);\n this.skeletonShowTimer = undefined;\n this.showSkeleton = false;\n }\n }\n\n /** Whether the thin top refresh bar is visible. Debounced from isLoading via\n * updateRefreshBar rather than read straight off it. */\n showRefreshBar = false;\n\n // The refresh bar is debounced so quick reloads (including fast auto-refresh polls)\n // don't flash it: it only appears once a reload has run past REFRESH_SHOW_DELAY, and\n // once shown it stays at least REFRESH_MIN_VISIBLE so it never blinks in and out.\n private readonly REFRESH_SHOW_DELAY = 150;\n private readonly REFRESH_MIN_VISIBLE = 450;\n private refreshShowTimer: any;\n private refreshHideTimer: any;\n private refreshShownAt = 0;\n\n private updateRefreshBar(): void {\n // the skeleton covers the first load; the bar is only for reloads with rows present\n const refreshing = this._isLoading && this.hasLoadedOnce;\n if (refreshing) {\n // a reload is running: cancel any pending hide and arm the show timer once\n clearTimeout(this.refreshHideTimer);\n this.refreshHideTimer = undefined;\n if (!this.showRefreshBar && !this.refreshShowTimer) {\n this.refreshShowTimer = setTimeout(() => {\n this.refreshShowTimer = undefined;\n this.showRefreshBar = true;\n this.refreshShownAt = Date.now();\n }, this.REFRESH_SHOW_DELAY);\n }\n } else {\n // reload ended (or it was the first load): drop a not-yet-shown bar at once,\n // but let a visible one finish its minimum time on screen so it doesn't blink\n if (this.refreshShowTimer) {\n clearTimeout(this.refreshShowTimer);\n this.refreshShowTimer = undefined;\n }\n if (this.showRefreshBar && !this.refreshHideTimer) {\n const remaining = Math.max(0, this.REFRESH_MIN_VISIBLE - (Date.now() - this.refreshShownAt));\n this.refreshHideTimer = setTimeout(() => {\n this.refreshHideTimer = undefined;\n this.showRefreshBar = false;\n }, remaining);\n }\n }\n }\n\n /** Row indexes for the skeleton loop (at least one). */\n get skeletonRows(): number[] {\n const n = Math.max(1, this.skeletonRowCount || 0);\n return Array.from({length: n}, (_v, i) => i);\n }\n\n // A small spread of bar widths so skeleton cells don't read as an identical grid.\n // Deterministic (no randomness) so the widths don't flicker across change detection.\n private readonly SK_WIDTHS = [70, 52, 84, 46, 64, 58, 76, 48];\n\n /** Skeleton bar width (as a %) for a given column/row, varied but stable. */\n skeletonBarWidth(colIndex: number, rowIndex: number): number {\n const base = this.SK_WIDTHS[colIndex % this.SK_WIDTHS.length];\n const jitter = ((rowIndex * 7 + colIndex * 3) % 5) * 4 - 8; // -8..+8\n return Math.max(30, Math.min(92, base + jitter));\n }\n // fitColumns: keep the table within its visible width when resizing - a column can only grow until\n // the other columns reach their set or minimum width, then the drag stops, so nothing is pushed\n // off screen into the horizontal scroll. Off by default (columns can grow past the view and scroll).\n @Input() set options(value: ListTableOptions) {\n const wasTree = !!this._options?.tree;\n this._options = value || {};\n this.toolbarControls = this.normalizeToolbar(this._options.toolbar);\n // rebuild the render list if tree mode was flipped after init, otherwise flatRows\n // keeps the pre-toggle shape\n if (this._initialized && !!this._options.tree !== wasTree) {\n this.rebuildFlatRows();\n }\n }\n get options(): ListTableOptions {\n return this._options;\n }\n private _options: ListTableOptions = {noSelect: false, noMenu: false};\n\n /** Resolved show/disabled state for each toolbar control, read by the template.\n * Every control shows and is enabled unless the host's `options.toolbar` says otherwise. */\n toolbarControls = this.normalizeToolbar(undefined);\n\n private normalizeToolbar(toolbar: ListTableToolbarOptions | undefined) {\n const resolve = (c?: {show?: boolean; disabled?: boolean}) => ({\n show: c?.show !== false,\n disabled: !!c?.disabled,\n });\n return {\n search: resolve(toolbar?.search),\n filters: resolve(toolbar?.filters),\n refresh: resolve(toolbar?.refresh),\n autoRefresh: resolve(toolbar?.autoRefresh),\n columns: resolve(toolbar?.columns),\n pageSize: resolve(toolbar?.pageSize),\n pagination: resolve(toolbar?.pagination),\n };\n }\n\n /** Tree mode: fetch a row's children the first time it is expanded. Return the\n * child rows (any shape the columns render). A row with `leaf: true`, or one that\n * resolves to an empty array, shows no expand control.\n * Note: tree runtime state (`children`, `leaf`, `__tree*`) is written onto the row\n * objects, so a host that reuses a row in a save call should strip it first. */\n @Input() loadChildren?: (row: any) => Promise<any[]> | any[];\n\n /** Tree mode: columns per depth level (index = level; level 0 uses `columns`).\n * Nested rows render in their own grid with a per-level sub-header, so children\n * need not match the parent. Unset renders children with the parent's columns.\n * The bound value is the default; users can show/hide/reorder/resize child columns\n * per depth from the Columns menu, persisted per table. */\n @Input() set childColumnsByLevel(v: ListColumn[][] | undefined) {\n this._declaredChildColumnsByLevel = v;\n this.buildChildColumns();\n }\n get childColumnsByLevel(): ListColumn[][] | undefined {\n return this._childColumnsByLevel;\n }\n private _declaredChildColumnsByLevel?: ListColumn[][];\n private _childColumnsByLevel?: ListColumn[][];\n\n // Cached per level; a width change mutates the same column objects, so no rebuild is needed.\n private _childLevelCache = new Map<number, ListColumn[]>();\n private _childColsVersion = 0;\n private _childLevelCacheVersion = -1;\n // per-level derived values, recomputed only when the column set changes, so the\n // template's per-cell/per-row calls stay cheap on every change-detection pass\n private _treeKeyCache = new Map<number, string | undefined>();\n private _leadOffsetCache = new Map<string, string>();\n private _treeMemoVersion = -1;\n\n private invalidateColumnCache(): void {\n this._childColsVersion++;\n }\n\n private syncTreeMemo(): void {\n if (this._treeMemoVersion !== this._childColsVersion) {\n this._treeKeyCache.clear();\n this._leadOffsetCache.clear();\n this._treeMemoVersion = this._childColsVersion;\n }\n }\n\n /** Rebuilds the effective per-level child columns from the declared defaults with\n * any persisted order/visibility/width applied. */\n private buildChildColumns(): void {\n const declared = this._declaredChildColumnsByLevel;\n if (!declared) {\n this._childColumnsByLevel = undefined;\n this.invalidateColumnCache();\n return;\n }\n this._childColumnsByLevel = declared.map((set, level) =>\n set && set.length ? this.svc.applyPersistedChildState(level, set) : (set ? [...set] : set)\n );\n this.invalidateColumnCache();\n }\n\n @Output() nodeToggled = new EventEmitter<{row: any; expanded: boolean}>();\n @Input() hasNext = false;\n @Input() hasPrev = false;\n @Input() startCount: any = '-';\n @Input() endCount: any = '-';\n @Input() totalCount: any = '-';\n @Input() filterApplied = false;\n @Input() menuItems: any[] = [];\n @Input() headerActions: any[] = [];\n /** @deprecated kept for the old lib-no-items bindings; the new empty state uses line glyphs, not images. */\n @Input() noItemsImage = 'nodata';\n @Input() showNoItemsAdd = true;\n @Input() noItemsReadonly = false;\n /** Primary create label shown on the first-use empty state (else the per-entity default). */\n @Input() createLabel = '';\n /** What these rows belong to, used in the empty headline (\"This network has no services\").\n * Defaults to 'network' since the Ziti pages are network-scoped; set '' for a list that is not. */\n @Input() emptyScope = 'network';\n @Input() accessDenied = false;\n @Input() entityTypeName = '';\n @Input() filterName = 'name';\n @Input() filterColumn = 'name';\n\n @Output() actionRequested = new EventEmitter<{action: string; item?: any}>();\n @Output() tableReady = new EventEmitter<any>();\n /** Full set of selected rows (all depths) whenever the selection changes. */\n @Output() selectionChanged = new EventEmitter<any[]>();\n /** The row the pointer is over, or null when it leaves. Emitted once per row (at the\n * row level, not per cell) so consumers can react to the whole hovered row, for\n * example to highlight that row's path in a connected diagram. */\n @Output() rowHover = new EventEmitter<any | null>();\n\n @ViewChild('contextMenu') contextMenu?: ElementRef;\n @ViewChild('filterZone') filterZone?: ElementRef<HTMLElement>;\n @ViewChild('filtersRow') filtersRow?: ElementRef<HTMLElement>;\n\n /** Full column list (includes hidden), after persisted state. */\n allColumns: ListColumn[] = [];\n /** Currently rendered columns (visible + ordered). */\n visibleColumns: ListColumn[] = [];\n /** Hidden columns, shaped for the shared hidden-columns bar (`headerName`). */\n hiddenColumns: any[] = [];\n\n entityTypeLabel = '';\n\n // ---- action menus ----\n openMenu = false;\n openHeaderMenu = false;\n menuLeft = 0;\n menuTop = 0;\n selectedItem: any = {actionList: []};\n\n // ---- selection ----\n allToggled = false;\n\n /** Rows actually rendered: in tree mode this is the roots plus the expanded\n * descendants in order; otherwise it is `rowData` unchanged. */\n flatRows: any[] = [];\n /** Tree look: 'card' floats each nested level as a bordered card; 'flat' renders\n * nested rows inline with the table, sub-headers as plain strips, no card chrome.\n * The bound value is the default; the user can switch it from the Columns menu and\n * the choice is remembered per table. */\n @Input() set treeVariant(v: TreeVariant) {\n this._declaredTreeVariant = v;\n this._treeVariant = v;\n }\n get treeVariant(): TreeVariant {\n return this._treeVariant;\n }\n private _treeVariant: TreeVariant = 'card';\n private _declaredTreeVariant: TreeVariant = 'card';\n /** Show the flat/nested row-layout switch in the Columns menu. Hidden for now;\n * the variant still comes from the `treeVariant` input. */\n @Input() showTreeVariantToggle = false;\n /** Flat variant only: draw a running guide rail down the left of each nested level. */\n @Input() treeRail = false;\n @HostBinding('class.lt-tree-flat') get isFlatTree(): boolean {\n return this.isTreeMode && this.treeVariant === 'flat';\n }\n\n /** Show the flat/nested switch only when the table actually renders nested rows. */\n get canSwitchTreeVariant(): boolean {\n return this.isTreeMode && this.hasChildColumns;\n }\n\n setTreeVariant(variant: TreeVariant): void {\n if (this._treeVariant === variant) {\n return;\n }\n this._treeVariant = variant;\n this.svc.saveTreeVariant(variant);\n }\n readonly treeIndentRem = 1.25;\n // nudges cards past the first nested level right so their edge lands on the\n // parent chevron (a nested chevron sits one grid-padding deeper than the root's)\n readonly treeDeepAlignRem = 0.625;\n // flat first-column indent: base clears the select gutter, then one chevron-width\n // per level so each sub-header lines up under its parent row's name\n readonly treeFlatBaseRem = 3.75;\n readonly treeFlatStepRem = 2.125;\n // nested card's left inset before per-depth indent; must match the --lt-card-inset token\n readonly treeCardBaseRem = 4;\n // width of the leading checkbox column injected into nested grids when selectChildren is on\n readonly treeSelectColRem = 2.25;\n\n // ---- column chooser (skinned show/hide + reorder panel) ----\n showColumnChooser = false;\n\n // ---- integrated toolbar: search + filter chips + pagination ----\n searchString = '';\n activeFilters: FilterObj[] = [];\n filtering = false;\n private inputChangedDebounced = _.debounce(() => this.applySearch(), 400);\n\n // ---- responsive filter overflow: controls that don't fit collapse into \"More\" ----\n visibleFilterColumns: ListColumn[] = [];\n overflowFilterColumns: ListColumn[] = [];\n showFilterOverflow = false;\n private filterWidths = new Map<string, number>();\n private filtersDirty = true;\n private filterRO?: ResizeObserver;\n private observedToolbar?: HTMLElement;\n private overflowRaf = 0;\n private readonly FILTER_GAP = 8; // px, matches the .lt-filter-zone/.lt-filters gap\n private readonly MORE_BTN_W = 92; // px reserved for the \"More\" trigger when overflowing\n\n // ---- resize ----\n // `level` is set when resizing a nested child column, so its width persists under\n // that depth's own state rather than the parent table's\n private resizing?: {\n col: ListColumn;\n startX: number;\n startWidth: number;\n persist: boolean;\n level?: number;\n // fitColumns: the one column that absorbs the opposite change so the table width stays constant.\n sink?: ListColumn;\n sinkStart?: number;\n minDelta?: number;\n maxDelta?: number;\n // flex columns frozen to px only for the duration of the drag; restored after\n frozen?: ListColumn[];\n };\n private readonly onPointerMove = (e: PointerEvent) => this.handleResizeMove(e);\n private readonly onPointerUp = () => this.handleResizeEnd();\n\n private _rawColumns: ListColumn[] = [];\n private _initialColumns: ListColumn[] = [];\n private _initialized = false;\n private subscription = new Subscription();\n // expansion + lazily-loaded children keyed by __treeRowKey, so a rowData refresh\n // (auto-refresh, paging, filter) keeps the tree open instead of collapsing it\n private _expandedKeys = new Set<string>();\n private _childrenCache = new Map<string, any[]>();\n private _destroyed = false;\n\n constructor(\n public svc: ListTableService,\n private tableFilterService: DataTableFilterService,\n private el: ElementRef,\n private ngZone: NgZone,\n private sanitizer: DomSanitizer\n ) {}\n\n ngOnInit(): void {\n this._initialized = true;\n // set directly (no emit) to avoid forcing a second fetch when a host pre-seeded it\n this.tableFilterService.pageSize = this.svc.restorePageSize(this.initialPageSize);\n this._treeVariant = this.svc.restoreTreeVariant(this._declaredTreeVariant);\n this.buildChildColumns();\n this.buildColumns();\n // all inputs are bound by now, so settle the render list against the final\n // tree flag (the rowData setter may have run before `options` arrived)\n this.rebuildFlatRows();\n this.updateEntityTypeLabel();\n this.subscription.add(\n this.tableFilterService.filtersChanged.subscribe((filters) => {\n // chips: every non-hidden filter except the free-text search (shown in the box)\n this.activeFilters = filters.filter((f) => f.hidden !== true && f.columnId !== this.filterColumn);\n const match = filters.find((f) => f.columnId === this.filterColumn);\n this.searchString = match ? match.value : '';\n // an activated filter changes which controls are pinned and how wide they render\n this.filtersDirty = true;\n this.scheduleFilterOverflow();\n })\n );\n this.subscription.add(\n this.tableFilterService.filtering.subscribe((f) => (this.filtering = f))\n );\n // close the column chooser whenever a filter dropdown (or anything else) opens\n this.subscription.add(\n this.svc.menuOpened$.subscribe((owner) => {\n if (owner !== this) {\n this.showColumnChooser = false;\n }\n })\n );\n this.tableReady.emit({component: this});\n }\n\n ngAfterViewInit(): void {\n this.ensureFilterResizeObserver();\n }\n\n ngAfterViewChecked(): void {\n // the whole table sits behind @if(showTable), so the toolbar may not exist\n // until row data arrives; (re)attach the observer once/whenever it appears\n this.ensureFilterResizeObserver();\n }\n\n ngOnDestroy(): void {\n this._destroyed = true;\n this.subscription.unsubscribe();\n this.detachResizeListeners();\n this.filterRO?.disconnect();\n if (this.overflowRaf) {\n cancelAnimationFrame(this.overflowRaf);\n }\n clearTimeout(this.refreshShowTimer);\n clearTimeout(this.refreshHideTimer);\n clearTimeout(this.skeletonShowTimer);\n }\n\n get showTable(): boolean {\n // always keep the table chrome (toolbar, headers, footer); the body shows a\n // skeleton while loading and an in-table empty state when there are no rows\n return true;\n }\n\n /** Columns surfaced as inline filter controls in the toolbar. Text filters are\n * excluded because the free-text search box already covers the primary text field. */\n get filterableColumns(): ListColumn[] {\n return this.allColumns.filter((c) => c.filterType && c.filterType !== 'TEXTINPUT');\n }\n\n // -------------------------------------------------- responsive filter overflow\n /** A filter column is \"active\" when it has an applied filter. */\n isFilterActive(col: ListColumn): boolean {\n return this.activeFilters.some((f) => f.columnId === col.key);\n }\n\n /** Applied filters that are currently hidden in the overflow dropdown. */\n get hiddenActiveCount(): number {\n return this.overflowFilterColumns.filter((c) => this.isFilterActive(c)).length;\n }\n\n toggleFilterOverflow(event: MouseEvent): void {\n event.stopPropagation();\n this.showFilterOverflow = !this.showFilterOverflow;\n if (this.showFilterOverflow) {\n this.svc.notifyMenuOpened(this);\n }\n }\n\n closeFilterOverflow(event?: Event): void {\n // keep open when the click lands in a filter's own Material overlay (e.g. the\n // date-range calendar), which renders outside this popover's DOM subtree\n const target = event?.target as HTMLElement | undefined;\n if (target?.closest?.('.cdk-overlay-container')) {\n return;\n }\n this.showFilterOverflow = false;\n }\n\n private ensureFilterResizeObserver(): void {\n // observe the toolbar row (not the content-sized zone) so a window resize,\n // which changes the row's available width, actually fires the observer\n const target = this.filterZone?.nativeElement?.parentElement ?? undefined;\n if (!target || typeof ResizeObserver === 'undefined' || target === this.observedToolbar) {\n return;\n }\n // ResizeObserver fires outside Angular's zone; re-enter so the recomputed\n // visible/overflow split actually triggers change detection.\n if (!this.filterRO) {\n this.filterRO = new ResizeObserver(() => this.ngZone.run(() => this.scheduleFilterOverflow()));\n } else {\n this.filterRO.disconnect();\n }\n this.filterRO.observe(target);\n this.observedToolbar = target;\n // compute the split for the newly-observed row (deferred, so it never mutates\n // bound state inside the change-detection pass that called us)\n this.scheduleFilterOverflow();\n }\n\n private scheduleFilterOverflow(): void {\n if (this.overflowRaf) {\n cancelAnimationFrame(this.overflowRaf);\n }\n this.overflowRaf = requestAnimationFrame(() => {\n this.overflowRaf = 0;\n this.ensureFilterResizeObserver();\n this.recomputeFilterOverflow();\n });\n }\n\n private recomputeFilterOverflow(): void {\n const cols = this.filterableColumns;\n if (!cols.length) {\n this.visibleFilterColumns = [];\n this.overflowFilterColumns = [];\n return;\n }\n const needMeasure = this.filtersDirty || cols.some((c) => !this.filterWidths.has(c.key));\n if (!needMeasure) {\n this.applyFilterSplit();\n return;\n }\n // render every control inline for one frame so each can be measured, then collapse\n this.visibleFilterColumns = cols;\n this.overflowFilterColumns = [];\n requestAnimationFrame(() => {\n const row = this.filtersRow?.nativeElement;\n if (row) {\n row.querySelectorAll<HTMLElement>('[data-filter-key]').forEach((el) => {\n const key = el.getAttribute('data-filter-key');\n if (key) {\n this.filterWidths.set(key, Math.ceil(el.getBoundingClientRect().width));\n }\n });\n }\n this.filtersDirty = false;\n this.applyFilterSplit();\n });\n }\n\n /** Split filter controls into inline vs. overflow, pinning active filters and\n * dropping inactive (then, only if forced, active) from the right until they fit. */\n private applyFilterSplit(): void {\n const zone = this.filterZone?.nativeElement;\n const cols = this.filterableColumns;\n if (!zone || !cols.length) {\n return;\n }\n // budget = the toolbar row's width minus its fixed siblings (search / divider /\n // Columns) and the gaps between them, i.e. the space filters may take before\n // they'd push the Columns control off the row\n const toolbarLeft = zone.parentElement as HTMLElement | null;\n const siblingWidth = (sel: string): number => {\n const node = toolbarLeft?.querySelector(sel) as HTMLElement | null;\n return node ? Math.ceil(node.getBoundingClientRect().width) : 0;\n };\n const available =\n (toolbarLeft?.clientWidth ?? zone.clientWidth) -\n siblingWidth('.lt-search') -\n siblingWidth('.lt-divider') -\n siblingWidth('.lt-columns') -\n 3 * this.FILTER_GAP;\n const widthOf = (c: ListColumn) => this.filterWidths.get(c.key) ?? 0;\n const totalOf = (list: ListColumn[], withMore: boolean): number => {\n let w = 0;\n list.forEach((c, i) => (w += widthOf(c) + (i > 0 ? this.FILTER_GAP : 0)));\n if (withMore) {\n w += (list.length ? this.FILTER_GAP : 0) + this.MORE_BTN_W;\n }\n return w;\n };\n\n if (totalOf(cols, false) <= available) {\n this.visibleFilterColumns = cols;\n this.overflowFilterColumns = [];\n return;\n }\n\n // removal priority: inactive right-to-left first, then active right-to-left\n const inactive = cols.filter((c) => !this.isFilterActive(c)).reverse();\n const active = cols.filter((c) => this.isFilterActive(c)).reverse();\n const removalOrder = [...inactive, ...active];\n const overflow = new Set<string>();\n for (const c of removalOrder) {\n overflow.add(c.key);\n const visible = cols.filter((x) => !overflow.has(x.key));\n if (totalOf(visible, true) <= available) {\n break;\n }\n }\n this.visibleFilterColumns = cols.filter((c) => !overflow.has(c.key));\n this.overflowFilterColumns = cols.filter((c) => overflow.has(c.key));\n if (!this.overflowFilterColumns.length) {\n this.showFilterOverflow = false;\n }\n }\n\n // ---------------------------------------------------------------- columns\n private buildColumns(): void {\n this._initialColumns = this._rawColumns.map((c) => ({...c}));\n this.allColumns = this.svc.applyPersistedState(this._rawColumns);\n this.updateVisible();\n // start with every filter control visible; the overflow pass collapses to fit\n this.visibleFilterColumns = this.filterableColumns;\n this.overflowFilterColumns = [];\n this.filtersDirty = true;\n this.scheduleFilterOverflow();\n }\n\n private updateVisible(): void {\n this.visibleColumns = this.allColumns.filter((c) => !c.hidden);\n this.hiddenColumns = this.allColumns\n .filter((c) => c.hidden)\n .map((c) => ({...c, headerName: c.label}));\n this.invalidateColumnCache();\n }\n\n trackRow = (index: number, row: any) => row?.__treeRowKey ?? row?.id ?? row?.name ?? index;\n trackCol = (index: number, col: ListColumn) => col.key;\n\n colWidth(col: ListColumn): string | null {\n return col.width != null ? `${col.width}px` : null;\n }\n\n // ---------------------------------------------------------------- cells\n private rawValue(col: ListColumn, row: any): any {\n return _.get(row, col.field || col.key);\n }\n\n private cellContext(col: ListColumn, row: any, i: number): ListCellContext {\n return {\n row,\n value: this.rawValue(col, row),\n colId: col.key,\n rowIndex: i,\n emitAction: (action: string, item: any = row) => this.actionRequested.emit({action, item}),\n };\n }\n\n private legacyShim(col: ListColumn, row: any, i: number): ListLegacyCellShim {\n return {data: row, value: this.rawValue(col, row), column: {colId: col.key}, rowIndex: i};\n }\n\n renderMode(col: ListColumn): 'component' | 'html' | 'text' {\n if (col.cell) {\n return 'component';\n }\n if (col.cellHtml) {\n return 'html';\n }\n return 'text';\n }\n\n cellInputs(col: ListColumn, row: any, i: number): Record<string, unknown> {\n if (col.cellInputs) {\n return col.cellInputs(this.cellContext(col, row, i));\n }\n return {row, value: this.rawValue(col, row)};\n }\n\n cellHtml(col: ListColumn, row: any, i: number): string {\n return col.cellHtml ? col.cellHtml(this.legacyShim(col, row, i)) : '';\n }\n\n cellText(col: ListColumn, row: any, i: number): any {\n if (col.valueFormatter) {\n return col.valueFormatter(this.legacyShim(col, row, i));\n }\n return this.rawValue(col, row);\n }\n\n cellClass(col: ListColumn): string {\n return col.cellClass || '';\n }\n\n onCellClick(col: ListColumn, row: any, i: number): void {\n col.onCellClick?.(this.cellContext(col, row, i));\n }\n\n tooltipInputs(col: ListColumn, row: any, i: number): Record<string, unknown> {\n return col.tooltipInputs ? col.tooltipInputs(this.cellContext(col, row, i)) : {row};\n }\n\n // ---------------------------------------------------------------- hover tooltip\n hoverTooltip: {component: Type<any>; inputs: Record<string, unknown>; left: number; top: number} | null = null;\n\n onCellHover(col: ListColumn, row: any, i: number, event: MouseEvent): void {\n if (!col.tooltip) {\n return;\n }\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n this.hoverTooltip = {\n component: col.tooltip,\n inputs: this.tooltipInputs(col, row, i),\n left: rect.left,\n top: rect.bottom + 6,\n };\n }\n\n onCellLeave(): void {\n this.hoverTooltip = null;\n }\n\n // ---------------------------------------------------------------- row hover\n /** The row currently under the pointer, so we only emit when it actually changes. */\n private hoveredRow: any = null;\n\n onRowHover(row: any): void {\n if (this.hoveredRow === row) {\n return;\n }\n this.hoveredRow = row;\n this.rowHover.emit(row);\n }\n\n onRowLeave(row: any): void {\n if (this.hoveredRow !== row) {\n return;\n }\n this.hoveredRow = null;\n this.rowHover.emit(null);\n }\n\n // ---------------------------------------------------------------- selection\n /** True when nested rows get checkboxes and join the selection (opt-in). */\n get childSelectEnabled(): boolean {\n return !!this.options?.selectChildren && !this.options?.noSelect;\n }\n\n /** Rows the checkboxes and select-all act on: top-level only, unless selectChildren\n * is set. Keeps select-all from marking nested rows a host that reads rowData never sees. */\n private get selectableRows(): any[] {\n if (!this.isTreeMode || this.childSelectEnabled) {\n return this.flatRows;\n }\n return this.flatRows.filter((r) => (r.__treeLevel ?? 0) === 0);\n }\n\n toggleItem = (item: any): void => {\n item.selected = !item.selected;\n this.syncSelectAll();\n this.actionRequested.emit({action: 'toggleItem', item});\n this.emitSelection();\n };\n\n /** Some rows selected but the header select-all isn't fully on (indeterminate). */\n get someSelected(): boolean {\n return !this.allToggled && this.selectableRows.some((r) => r.selected);\n }\n\n toggleAll(): void {\n const newState = !this.allToggled;\n this.allToggled = newState;\n this.selectableRows.forEach((row) => (row.selected = newState));\n this.actionRequested.emit({action: 'toggleAll'});\n this.emitSelection();\n }\n\n private syncSelectAll(): void {\n const rows = this.selectableRows;\n this.allToggled = rows.length > 0 && rows.every((r) => r.selected);\n }\n\n /** Emit every selected row across all depths. Walks the full data, not just the rendered\n * rows, so a collapsed parent's selected children are still reported. */\n private emitSelection(): void {\n const out: any[] = [];\n const walk = (rows: any[]) => {\n (rows || []).forEach((r) => {\n if (r.selected) {\n out.push(r);\n }\n if (Array.isArray(r.children)) {\n walk(r.children);\n }\n });\n };\n walk(this._rowData);\n this.selectionChanged.emit(out);\n }\n\n // ---------------------------------------------------------------- tree rows\n get isTreeMode(): boolean {\n return !!this.options?.tree;\n }\n\n /** True when per-level child columns are configured (children render in their own\n * grid with a sub-header rather than the parent's columns). */\n get hasChildColumns(): boolean {\n return !!(this.childColumnsByLevel && this.childColumnsByLevel.length);\n }\n\n /** Columns used at a given depth: level 0 is the main (visible) columns; deeper\n * levels use `childColumnsByLevel`, falling back to the deepest set defined. */\n columnsForLevel(level: number): ListColumn[] {\n if (level <= 0 || !this.hasChildColumns) {\n return this.visibleColumns;\n }\n if (this._childLevelCacheVersion !== this._childColsVersion) {\n this._childLevelCache.clear();\n this._childLevelCacheVersion = this._childColsVersion;\n }\n const cached = this._childLevelCache.get(level);\n if (cached) {\n return cached;\n }\n const sets = this.childColumnsByLevel!;\n const set = sets[level] ?? sets[sets.length - 1];\n const cols = (set ?? this.visibleColumns).filter((c) => !c.hidden);\n this._childLevelCache.set(level, cols);\n return cols;\n }\n\n /** Child columns the chooser lists at a depth: all declared ones (including hidden),\n * minus structural columns like the select checkbox or row-actions gutter. */\n allColumnsForLevel(level: number): ListColumn[] {\n return (this._childColumnsByLevel?.[level] ?? []).filter((c) => !c.excludeFromChooser);\n }\n\n /** Depths that offer configurable columns (skips the level-0 placeholder and any\n * level that only holds structural columns), one chooser group per level. */\n get childLevels(): number[] {\n const sets = this._childColumnsByLevel;\n if (!sets) {\n return [];\n }\n const levels: number[] = [];\n sets.forEach((_set, level) => {\n if (level > 0 && this.allColumnsForLevel(level).length) {\n levels.push(level);\n }\n });\n return levels;\n }\n\n /** Chooser hint for a nested level: its first few column labels, then \"+N\". */\n childLevelLabel(level: number): string {\n const labels = this.allColumnsForLevel(level)\n .map((c) => c.label)\n .filter(Boolean) as string[];\n const max = 3;\n if (labels.length <= max) {\n return labels.join(' / ');\n }\n return labels.slice(0, max).join(' / ') + ' +' + (labels.length - max);\n }\n\n /** Key of the column that carries the expand control + indentation for a column set:\n * the flagged one, else the first real data column (skipping a leading structural\n * column such as a select checkbox the host put at the start). */\n private treeColumnKeyFor(cols: ListColumn[]): string | undefined {\n return (cols.find((c) => c.treeColumn) || cols.find((c) => !c.excludeFromChooser) || cols[0])?.key;\n }\n\n treeColumnKeyForLevel(level: number): string | undefined {\n this.syncTreeMemo();\n if (!this._treeKeyCache.has(level)) {\n this._treeKeyCache.set(level, this.treeColumnKeyFor(this.columnsForLevel(level)));\n }\n return this._treeKeyCache.get(level);\n }\n\n /** Width of the columns before the tree column, used to pull the flat first-column\n * indent back by whatever structural columns (like a select checkbox) sit ahead of\n * it, so its content still lands under the parent row's name. */\n treeLeadOffset(level: number): string {\n this.syncTreeMemo();\n const cacheKey = `${level}|${this.childSelectEnabled}`;\n const hit = this._leadOffsetCache.get(cacheKey);\n if (hit !== undefined) {\n return hit;\n }\n const cols = this.columnsForLevel(level);\n const treeKey = this.treeColumnKeyForLevel(level);\n let px = 0;\n let count = 0;\n for (const c of cols) {\n if (c.key === treeKey) {\n break;\n }\n px += c.width ?? 0;\n count++;\n }\n const gap = 'var(--lt-tree-col-gap, 0.5rem)';\n // the injected select column (when on) sits before every data column\n const selRem = this.childSelectEnabled ? this.treeSelectColRem : 0;\n const gaps = count + (this.childSelectEnabled ? 1 : 0);\n const result = (!gaps && !selRem && !px) ? '0px' : `calc(${selRem}rem + ${px}px + ${gaps} * ${gap})`;\n this._leadOffsetCache.set(cacheKey, result);\n return result;\n }\n\n isTreeColumn(col: ListColumn, level: number): boolean {\n return this.isTreeMode && col.key === this.treeColumnKeyForLevel(level);\n }\n\n isTreeCell(col: ListColumn): boolean {\n return this.isTreeColumn(col, 0);\n }\n\n /** Columns a full-width nested row spans: the data columns plus the select and\n * menu gutters, matching the header's cell count. */\n get treeSpanCount(): number {\n return this.visibleColumns.length + (this.options?.noSelect ? 0 : 1) + (this.options?.noMenu ? 0 : 1);\n }\n\n /** Per-level indent (rem); the card variant nudges levels past the first so the edge meets the parent chevron. */\n treeIndentFor(level: number): number {\n const align = this.treeVariant === 'card' && level >= 2 ? this.treeDeepAlignRem : 0;\n return level * this.treeIndentRem + align;\n }\n\n /** Flat variant: left pad (rem) of a nested row's first column (sub-header + data),\n * one chevron-width per level so it lines up under the parent row's name. */\n treeFlatFirstIndentRem(level: number): number {\n return this.treeFlatBaseRem + level * this.treeFlatStepRem;\n }\n\n /** Flat variant: drop the chevron slot for a leaf-only level so values sit under their header. */\n showTreeLead(row: any): boolean {\n return !(this.isFlatTree && row?.__treeSiblingsCanExpand === false);\n }\n\n /** Left inset (rem) of a nested card at a given depth, matching the td padding. */\n private treeCardLeftRem(level: number): number {\n return this.treeCardBaseRem + this.treeIndentFor(level);\n }\n\n private _railCache = new Map<string, string | null>();\n\n /** Vertical guide lines redrawing each ancestor card's left edge at this row's\n * position, so a card's left border stays continuous where a nested card is\n * inserted between its rows. Returns a stack of 1px background gradients, or null\n * when there is no ancestor to redraw (roots and the first nested level). */\n treeAncestorRails(level: number): string | null {\n const key = `${level}|${this._treeVariant}|${this.treeRail}|${this.isTreeMode}`;\n const cached = this._railCache.get(key);\n if (cached !== undefined) {\n return cached;\n }\n const rails = this.computeAncestorRails(level);\n this._railCache.set(key, rails);\n return rails;\n }\n\n private computeAncestorRails(level: number): string | null {\n if (!this.isTreeMode || level < 2) {\n return null;\n }\n const flat = this.treeVariant === 'flat';\n // card mode always redraws ancestor card borders; flat mode draws the rail\n // only when the optional running rail is turned on\n if (flat && !this.treeRail) {\n return null;\n }\n const color = flat\n ? 'var(--lt-tree-rail, color-mix(in srgb, var(--lt-border) 55%, var(--lt-icon)))'\n : 'var(--lt-tree-card-border, color-mix(in srgb, var(--lt-border) 70%, var(--lt-icon)))';\n const rails: string[] = [];\n for (let k = 1; k < level; k++) {\n const x = this.treeCardLeftRem(k);\n rails.push(`linear-gradient(90deg, transparent ${x}rem, ${color} ${x}rem, ${color} calc(${x}rem + 1px), transparent calc(${x}rem + 1px))`);\n }\n return rails.join(', ');\n }\n\n gridTemplate(level: number): string {\n const tracks = this.columnsForLevel(level)\n .map((c) => (c.width != null ? `${c.width}px` : 'minmax(0, 1fr)'));\n if (this.childSelectEnabled) {\n tracks.unshift(`${this.treeSelectColRem}rem`);\n }\n return tracks.join(' ');\n }\n\n private hasChildren(row: any): boolean {\n return Array.isArray(row?.children) && row.children.length > 0;\n }\n\n /** A row can be expanded unless it is a leaf, has no loaded children, and has no\n * loader left to try. */\n canExpand(row: any): boolean {\n if (!this.isTreeMode || row?.leaf === true) {\n return false;\n }\n if (this.hasChildren(row)) {\n return true;\n }\n const key = row?.__treeRowKey;\n if (key && this._childrenCache.has(key)) {\n return true;\n }\n return !!this.loadChildren && row?.__treeLoaded !== true;\n }\n\n toggleNode(row: any): void {\n if (!this.isTreeMode || row?.__treeLoading) {\n return;\n }\n const key = row.__treeRowKey;\n if (this._expandedKeys.has(key)) {\n this._expandedKeys.delete(key);\n this.rebuildFlatRows();\n this.nodeToggled.emit({row, expanded: false});\n return;\n }\n if (this.loadChildren && !this.hasChildren(row) && !this._childrenCache.has(key)) {\n row.__treeLoading = true;\n row.__treeLoadError = false; // clear any previous failure on retry\n this.rebuildFlatRows(); // surface the spinner while children load\n // run the loader inside the executor so a synchronous throw rejects the\n // promise instead of escaping and leaving __treeLoading stuck on forever\n new Promise<any[]>((resolve) => resolve(this.loadChildren!(row))).then(\n (children) => this.onChildrenLoaded(row, children),\n () => this.onChildrenLoaded(row, [], true)\n );\n return;\n }\n this._expandedKeys.add(key);\n this.rebuildFlatRows();\n this.nodeToggled.emit({row, expanded: true});\n }\n\n private onChildrenLoaded(row: any, children: any[], failed = false): void {\n if (this._destroyed) {\n return;\n }\n row.__treeLoading = false;\n if (failed) {\n // flag the failure so the toggle shows a retry affordance, and leave it collapsed\n row.__treeLoadError = true;\n this.rebuildFlatRows();\n return;\n }\n const list = Array.isArray(children) ? children : [];\n this._childrenCache.set(row.__treeRowKey, list);\n row.children = list;\n row.__treeLoaded = true;\n if (!list.length) {\n row.leaf = true; // nothing under it, so stop offering the control\n }\n this._expandedKeys.add(row.__treeRowKey);\n this.rebuildFlatRows();\n this.nodeToggled.emit({row, expanded: true});\n }\n\n /** Flatten the tree into the ordered render list, tagging each row with its depth.\n * Outside tree mode the render list is `rowData` as-is. */\n private rebuildFlatRows(): void {\n if (!this.isTreeMode) {\n this.flatRows = this._rowData;\n return;\n }\n const out: any[] = [];\n const walk = (rows: any[], level: number, parentKey: string): void => {\n const list = rows || [];\n // when no sibling can expand, the level needs no chevron slot\n const siblingsCanExpand = list.some((r) => this.canExpand(r));\n list.forEach((row, idx) => {\n row.__treeLevel = level;\n row.__treeSiblingsCanExpand = siblingsCanExpand;\n // first child of a group drives the per-expansion sub-header;\n // first and last mark the top and bottom of the nested card\n row.__treeFirstChild = level > 0 && idx === 0;\n row.__treeLastChild = level > 0 && idx === list.length - 1;\n // branch-unique track key: the same entity can appear under two parents\n // in a flat tree, so fold the parent path in to keep @for keys distinct\n row.__treeRowKey = parentKey + '/' + (row?.id ?? row?.name ?? idx);\n // a rowData refresh replaces the row object; re-attach children we loaded\n // earlier so an expanded lazy node stays populated instead of emptying out\n if (!this.hasChildren(row) && this._childrenCache.has(row.__treeRowKey)) {\n row.children = this._childrenCache.get(row.__treeRowKey)!;\n row.__treeLoaded = true;\n }\n row.__treeExpanded = this._expandedKeys.has(row.__treeRowKey);\n out.push(row);\n if (row.__treeExpanded && this.hasChildren(row)) {\n walk(row.children, level + 1, row.__treeRowKey);\n }\n });\n };\n walk(this._rowData, 0, '');\n this.flatRows = out;\n }\n\n // ---------------------------------------------------------------- sort\n onHeaderSort(event: {colId: string; dir: ListSortDir}): void {\n this.allColumns.forEach((c) => {\n c.sortDir = c.key === event.colId ? event.dir : undefined;\n });\n }\n\n // ---------------------------------------------------------------- show / reorder\n showColumn(event: {column: any; visible: boolean}): void {\n const target = this.allColumns.find((c) => c.key === event.column?.key);\n if (!target) {\n return;\n }\n target.hidden = false;\n this.updateVisible();\n this.svc.saveState(this.allColumns);\n }\n\n onReorder(event: CdkDragDrop<ListColumn[]>): void {\n if (event.previousIndex === event.currentIndex) {\n return;\n }\n moveItemInArray(this.visibleColumns, event.previousIndex, event.currentIndex);\n const nextVisible = [...this.visibleColumns];\n let vi = 0;\n this.allColumns = this.allColumns.map((c) => (c.hidden ? c : nextVisible[vi++]));\n this.updateVisible();\n this.svc.saveState(this.allColumns);\n }\n\n resetTableColumns(): void {\n this.svc.reset();\n this._treeVariant = this._declaredTreeVariant;\n this.allColumns = this._initialColumns.map((c) => ({...c}));\n this._childColumnsByLevel = this._declaredChildColumnsByLevel?.map((set) =>\n set ? set.map((c) => ({...c})) : set\n );\n this.updateVisible();\n this.closeActionMenu();\n }\n\n // ---------------------------------------------------------------- column chooser\n /** Count of columns the user has hidden beyond the defaults (drives the badge).\n * Columns hidden by default don't count, so a fresh/default load shows no badge. */\n get hiddenColumnCount(): number {\n return this.allColumns.filter((c) => c.hidden && !c.excludeFromChooser && !this.isDefaultHidden(c)).length;\n }\n\n /** True when visibility, order, and width all match the originally declared\n * columns. Width is included so resizing a column alone still enables the\n * reset button; a column with no declared width uses null on both sides so\n * it only counts as changed once the user drags it to a concrete width. */\n get columnsAtDefault(): boolean {\n if (this.canSwitchTreeVariant && this._treeVariant !== this._declaredTreeVariant) {\n return false;\n }\n if (this.allColumns.length !== this._initialColumns.length) {\n return false;\n }\n const parentAtDefault = this.allColumns.every((c, i) => {\n const init = this._initialColumns[i];\n return init\n && init.key === c.key\n && !!init.hidden === !!c.hidden\n && (init.width ?? null) === (c.width ?? null);\n });\n return parentAtDefault && this.childColumnsAtDefault;\n }\n\n /** True when every nested level's columns match their declared order/visibility/width. */\n private get childColumnsAtDefault(): boolean {\n const declared = this._declaredChildColumnsByLevel;\n const current = this._childColumnsByLevel;\n if (!declared || !current) {\n return true;\n }\n return declared.every((set, level) => {\n const cur = current[level] ?? [];\n if (!set || set.length !== cur.length) {\n return set ? set.length === cur.length : true;\n }\n return set.every((d, i) => {\n const c = cur[i];\n return c\n && d.key === c.key\n && !!d.hidden === !!c.hidden\n && (d.width ?? null) === (c.width ?? null);\n });\n });\n }\n\n /** True when the column is hidden in the originally declared defaults. */\n isDefaultHidden(col: ListColumn): boolean {\n const init = this._initialColumns.find((c) => c.key === col.key);\n return !!init?.hidden;\n }\n\n toggleColumnChooser(event: MouseEvent): void {\n event.stopPropagation();\n this.showColumnChooser = !this.showColumnChooser;\n if (this.showColumnChooser) {\n this.svc.notifyMenuOpened(this);\n }\n }\n\n closeColumnChooser(): void {\n this.showColumnChooser = false;\n }\n\n // The whole chooser row is draggable, and the label sits inside the visibility\n // toggle button, so a reorder drag ends with a click on that button. This guard\n // swallows that one click so dragging a row never also hides its column.\n private _chooserDragged = false;\n\n onChooserDragStarted(): void {\n this._chooserDragged = true;\n }\n\n onChooserDragEnded(): void {\n // clear after the post-drag click has been handled (and skipped) below\n setTimeout(() => (this._chooserDragged = false));\n }\n\n /** Toggle a column's visibility. `level` undefined targets the top-level columns;\n * a number targets that nested depth's columns. */\n toggleColumnVisible(col: ListColumn, level?: number): void {\n if (this._chooserDragged || col.hideable === false) {\n return;\n }\n const set = level == null ? this.allColumns : this._childColumnsByLevel?.[level];\n const target = set?.find((c) => c.key === col.key);\n if (!target) {\n return;\n }\n if (!target.hidden && this.isLastVisibleColumn(target, level)) {\n return;\n }\n target.hidden = !target.hidden;\n this.afterColumnChange(level, set);\n }\n\n /** True when this is the only visible column at its level, so its toggle is disabled\n * to keep at least one column on screen. */\n isLastVisibleColumn(col: ListColumn, level?: number): boolean {\n const list = level == null ? this.chooserColumns : this.allColumnsForLevel(level);\n return !col.hidden && list.filter((c) => !c.hidden).length <= 1;\n }\n\n /** Columns shown in the top-level Columns menu. */\n get chooserColumns(): ListColumn[] {\n return this.allColumns.filter((c) => !c.excludeFromChooser);\n }\n\n /** Reorder columns from a chooser drag. `level` undefined targets the top-level\n * columns; a number targets that nested depth's columns. */\n chooserReorder(event: CdkDragDrop<ListColumn[]>, level?: number): void {\n if (event.previousIndex === event.currentIndex) {\n return;\n }\n // the menu lists a chooser subset, so map the drag indices back onto the full set\n const full = level == null ? this.allColumns : this._childColumnsByLevel?.[level];\n const list = level == null ? this.chooserColumns : this.allColumnsForLevel(level);\n if (!full) {\n return;\n }\n const from = full.indexOf(list[event.previousIndex]);\n const to = full.indexOf(list[event.currentIndex]);\n if (from < 0 || to < 0) {\n return;\n }\n moveItemInArray(full, from, to);\n this.afterColumnChange(level, full);\n }\n\n /** Refresh and persist after a column visibility/order change, routing to the\n * top-level or nested-level persistence as appropriate. */\n private afterColumnChange(level: number | undefined, set: ListColumn[]): void {\n if (level == null) {\n this.updateVisible();\n this.svc.saveState(this.allColumns);\n } else {\n this.invalidateColumnCache();\n this.svc.saveChildState(level, set);\n }\n }\n\n // ---- nested-column chooser: one expandable group per depth level ----\n private nestedChooserOpen = new Set<string>();\n\n isNestedGroupOpen(id: string): boolean {\n return this.nestedChooserOpen.has(id);\n }\n\n toggleNestedGroup(id: string): void {\n if (this.nestedChooserOpen.has(id)) {\n this.nestedChooserOpen.delete(id);\n } else {\n this.nestedChooserOpen.add(id);\n }\n }\n\n // ---------------------------------------------------------------- resize\n startResize(col: ListColumn, event: PointerEvent): void {\n if (col.resizable === false) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const th = (event.target as HTMLElement)?.closest('th') as HTMLElement;\n const startWidth = col.width ?? th?.offsetWidth ?? 150;\n this.resizing = {col, startX: event.clientX, startWidth, persist: true};\n this.setupFitCompensation(col, startWidth, this.visibleColumns, (key) => this.measuredHeaderWidth(key));\n document.addEventListener('pointermove', this.onPointerMove);\n document.addEventListener('pointerup', this.onPointerUp);\n }\n\n /** Resize a nested row's column. Measures the sub-header cell's current rendered\n * width so a flexible (1fr) column converts to a concrete width before dragging;\n * the grid reflows live because its template reads each column's width. */\n startChildResize(col: ListColumn, level: number, event: PointerEvent): void {\n if (col.resizable === false) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const cell = (event.target as HTMLElement)?.closest('.lt-tree-subhead-cell') as HTMLElement;\n const startWidth = col.width ?? Math.round(cell?.getBoundingClientRect().width ?? 150);\n const grid = cell?.closest('.lt-tree-grid') as HTMLElement | null;\n this.resizing = {col, startX: event.clientX, startWidth, persist: true, level};\n this.setupFitCompensation(col, startWidth, this.columnsForLevel(level), (key) => this.measuredCellWidth(grid, level, key));\n document.addEventListener('pointermove', this.onPointerMove);\n document.addEventListener('pointerup', this.onPointerUp);\n }\n\n private handleResizeMove(event: PointerEvent): void {\n if (!this.resizing) {\n return;\n }\n const r = this.resizing;\n const delta = event.clientX - r.startX;\n if (r.sink && r.sinkStart != null) {\n // fitColumns: the column grows and the sink shrinks by the same amount, so the table stays\n // the same width and no other column (notably the tree column) shifts. The drag stops once\n // the column or the sink reaches its minimum.\n const d = Math.min(r.maxDelta ?? delta, Math.max(r.minDelta ?? delta, delta));\n r.col.width = Math.round(r.startWidth + d);\n r.sink.width = Math.round(r.sinkStart - d);\n } else {\n const min = r.col.minWidth ?? 40;\n r.col.width = Math.max(min, Math.round(r.startWidth + delta));\n }\n }\n\n /** fitColumns: pick the sink column and the range the drag may travel, so the column and the sink\n * trade width while every other column stays fixed. No-op (plain resize) when fitColumns is off. */\n private setupFitCompensation(col: ListColumn, startWidth: number, columns: ListColumn[], measure: (key: string) => number): void {\n if (!this.options?.fitColumns || !this.resizing) {\n return;\n }\n const sink = this.pickSink(col, columns);\n if (!sink) {\n return;\n }\n const FLOOR = 60;\n // measure() returns 0 when the element isn't found; fall back so a width of 0\n // never gets frozen in (and later persisted) for the sink or a flex column\n const sinkStart = sink.width ?? (measure(sink.key) || startWidth);\n // Freeze any other flexible column to its rendered width so only the column and the sink move\n // (otherwise the browser would still redistribute slack among the flexible columns). These are\n // restored to flexible when the drag ends, so one resize doesn't pin the whole table to px.\n const frozen: ListColumn[] = [];\n columns.forEach((c) => {\n if (c.key !== col.key && c.key !== sink.key && c.width == null) {\n const w = measure(c.key);\n if (w > 0) {\n c.width = w;\n frozen.push(c);\n }\n }\n });\n this.resizing.sink = sink;\n this.resizing.sinkStart = sinkStart;\n this.resizing.frozen = frozen;\n this.resizing.maxDelta = Math.max(0, sinkStart - (sink.minWidth ?? FLOOR)); // grow until the sink hits its min\n this.resizing.minDelta = Math.min(0, (col.minWidth ?? 40) - startWidth); // shrink until the column hits its min\n }\n\n /** The column that absorbs a resize: a flexible column first (it is meant to take up slack), else\n * the nearest resizable column that is not the tree column, so indentation never shifts. */\n private pickSink(col: ListColumn, columns: ListColumn[]): ListColumn | undefined {\n // never pick the tree column (explicit or implicit) as the sink, or resizing\n // would move the expand chevrons\n const treeKey = this.treeColumnKeyFor(columns);\n const usable = columns.filter((c) => c.key !== col.key && c.resizable !== false && c.key !== treeKey);\n const flex = usable.find((c) => c.width == null);\n if (flex) {\n return flex;\n }\n const idx = columns.findIndex((c) => c.key === col.key);\n return usable.find((c) => columns.indexOf(c) > idx) ?? usable[usable.length - 1];\n }\n\n private measuredHeaderWidth(key: string): number {\n const host = this.el?.nativeElement as HTMLElement | undefined;\n const th = host?.querySelector(`[id=\"Header_${key}\"]`) as HTMLElement | null;\n return th ? Math.round(th.getBoundingClientRect().width) : 0;\n }\n\n private measuredCellWidth(grid: HTMLElement | null, level: number, key: string): number {\n const idx = this.columnsForLevel(level).findIndex((c) => c.key === key);\n const cells = grid?.querySelectorAll('.lt-tree-subhead-cell');\n const cell = cells ? (cells[idx] as HTMLElement | undefined) : undefined;\n return cell ? Math.round(cell.getBoundingClientRect().width) : 0;\n }\n\n private handleResizeEnd(): void {\n const r = this.resizing;\n // columns frozen only to steady the drag go back to flexible, so the table keeps\n // filling the viewport and their temporary px widths are not persisted by saveState\n r?.frozen?.forEach((c) => (c.width = undefined));\n if (r?.persist) {\n if (r.level != null) {\n const set = this._childColumnsByLevel?.[r.level];\n if (set) {\n this.svc.saveChildWidth(r.level, r.col.key, r.col.width!, set);\n }\n } else {\n this.svc.saveWidth(r.col.key, r.col.width!, this.allColumns);\n }\n }\n this.resizing = undefined;\n this.detachResizeListeners();\n }\n\n private detachResizeListeners(): void {\n document.removeEventListener('pointermove', this.onPointerMove);\n document.removeEventListener('pointerup', this.onPointerUp);\n }\n\n // ---------------------------------------------------------------- action menus\n openActionMenu = (event: MouseEvent, item: any): void => {\n this.selectedItem = item;\n this.openMenu = true;\n _.delay(() => {\n const height = this.contextMenu?.nativeElement?.offsetHeight || 120;\n const windowOffset = window.innerHeight - event.clientY;\n const menuOffset = windowOffset <= height ? height - windowOffset : 0;\n this.menuLeft = event.clientX - 100;\n this.menuTop = event.clientY + 5 - menuOffset;\n }, 10);\n };\n\n closeActionMenu = (): void => {\n this.selectedItem = {actionList: []};\n this.openMenu = false;\n this.openHeaderMenu = false;\n };\n\n openHeaderActionMenu(event: MouseEvent): void {\n this.menuLeft = event.clientX - 150;\n this.menuTop = event.clientY + 5;\n _.delay(() => {\n this.openHeaderMenu = true;\n }, 100);\n }\n\n hideMenuItem(menuItem: any, selectedItem: any): boolean {\n if (_.isFunction(menuItem.hidden)) {\n return menuItem.hidden(selectedItem);\n } else if (_.isBoolean(menuItem.hidden)) {\n return menuItem.hidden;\n }\n return !selectedItem.actionList?.includes(menuItem.action);\n }\n\n closeHeaderActionMenu = (): void => {\n this.openHeaderMenu = false;\n };\n\n /** Restore-default (rotate) icon for the built-in header action. */\n private readonly RESET_TABLE_ICON = '<svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" d=\"M3.2 8a4.8 4.8 0 1 0 1.3-3.3\"/><path fill=\"currentColor\" d=\"M2.8 2.8l-.3 2.9 2.8-.4z\"/></svg>';\n\n /** Header action menu rows: the reset action followed by host-provided header actions.\n * A host action's `icon` (SVG markup) is rendered before its label, like the row menu. */\n get headerMenuItems(): ListMenuItem[] {\n const items: ListMenuItem[] = [\n {label: 'Restore Default Table', action: '__reset_table__', id: 'ResetTableButton', iconSvg: this.safeIcon(this.RESET_TABLE_ICON)},\n ];\n _.forEach(this.headerActions, (ha) => {\n items.push({\n label: ha.name || ha.label,\n action: ha.action,\n id: 'HeaderAction_' + ha.action,\n iconSvg: ha.icon ? this.safeIcon(ha.icon) : undefined,\n data: ha,\n });\n });\n return items;\n }\n\n onHeaderMenuClick(evt: {item: ListMenuItem; event: MouseEvent}): void {\n if (evt.item.action === '__reset_table__') {\n this.resetTableColumns();\n } else {\n this.actionRequested.emit({action: evt.item.action});\n }\n this.closeHeaderActionMenu();\n }\n\n /** Row action menu rows, built from `menuItems` against the currently selected row.\n * A menu item's `icon` (SVG markup) is rendered before its label in the menu. */\n get rowMenuItems(): ListMenuItem[] {\n return _.map(this.menuItems, (mi) => ({\n label: mi.name || mi.label,\n action: mi.action,\n id: 'TableActionButton_' + mi.action,\n hidden: this.hideMenuItem(mi, this.selectedItem),\n iconSvg: mi.icon ? this.safeIcon(mi.icon) : undefined,\n data: mi,\n }));\n }\n\n onRowMenuClick(evt: {item: ListMenuItem; event: MouseEvent}): void {\n this.actionRequested.emit({action: evt.item.action, item: this.selectedItem});\n this.closeActionMenu();\n }\n\n openCreate(): void {\n this.actionRequested.emit({action: 'create'});\n }\n\n /** Clear the search box and every active filter, which drives the host to refetch\n * unfiltered (used by the \"no results\" empty state's Clear filters action). */\n clearTableFilters(): void {\n this.searchString = '';\n this.tableFilterService.clearAllFilters();\n }\n\n // ---------------------------------------------------------------- toolbar search + pagination\n onSearchInput(): void {\n this.inputChangedDebounced();\n }\n\n private applySearch(): void {\n this.tableFilterService.currentPage = 1;\n this.tableFilterService.updateFilter({\n filterName: this.filterName,\n columnId: this.filterColumn,\n value: this.searchString,\n label: this.searchString,\n });\n }\n\n nextPage(): void {\n if (this.nextDisabled) {\n return;\n }\n this.tableFilterService.changePage((this.tableFilterService.currentPage || 1) + 1);\n }\n\n prevPage(): void {\n if (this.prevDisabled) {\n return;\n }\n this.tableFilterService.changePage((this.tableFilterService.currentPage || 1) - 1);\n }\n\n get cursorPager(): boolean {\n return this.options?.pager === 'cursor';\n }\n\n get nextDisabled(): boolean {\n if (this.filtering) {\n return true;\n }\n if (this.cursorPager) {\n return !this.hasNext;\n }\n if (!_.isNumber(this.totalCount) || !_.isNumber(this.endCount)) {\n return true;\n }\n return Number(this.endCount) >= Number(this.totalCount);\n }\n\n get prevDisabled(): boolean {\n if (this.filtering) {\n return true;\n }\n if (this.cursorPager) {\n return !this.hasPrev;\n }\n if (!_.isNumber(this.startCount) || !_.isNumber(this.totalCount)) {\n return true;\n }\n return Number(this.startCount) <= 1;\n }\n\n // ---- rows-per-page + numbered pagination (the skin footer) ----\n pageSizeOptions = [25, 50, 100];\n\n /** Default rows-per-page when nothing is remembered (the persisted choice wins). */\n @Input() initialPageSize = 50;\n\n /** Auto-refresh interval in seconds a page starts the table at (0 = off). This is the\n * hook for a page to default the control on; left at 0, the table behaves as before\n * (off until the user picks an interval). The user's in-session choice is not persisted. */\n @Input() autoRefreshSeconds = 0;\n\n get pageSize(): number {\n return this.tableFilterService.pageSize;\n }\n\n get currentPageNum(): number {\n return this.tableFilterService.currentPage || 1;\n }\n\n get totalPages(): number {\n if (!_.isNumber(this.totalCount) || Number(this.totalCount) <= 0) {\n return 1;\n }\n return Math.max(1, Math.ceil(Number(this.totalCount) / this.pageSize));\n }\n\n /** Page numbers to render, with `0` marking a gap (\"...\"). Shows the first and\n * last page plus a window around the current page so long lists stay compact. */\n get pageWindow(): number[] {\n const total = this.totalPages;\n const cur = this.currentPageNum;\n if (total <= 7) {\n return Array.from({length: total}, (_v, i) => i + 1);\n }\n const pages = new Set<number>([1, total, cur, cur - 1, cur + 1]);\n const sorted = [...pages].filter((p) => p >= 1 && p <= total).sort((a, b) => a - b);\n const out: number[] = [];\n let prev = 0;\n for (const p of sorted) {\n if (prev && p - prev > 1) {\n out.push(0); // gap sentinel\n }\n out.push(p);\n prev = p;\n }\n return out;\n }\n\n goToPage(page: number): void {\n if (page < 1 || page > this.totalPages || page === this.currentPageNum || this.filtering) {\n return;\n }\n this.tableFilterService.changePage(page);\n }\n\n onPageSizeChange(size: number): void {\n if (!size || size === this.pageSize) {\n return;\n }\n this.svc.savePageSize(size);\n this.tableFilterService.changePageSize(size);\n }\n\n /** Re-fetch the current page (re-emits the page so the host reloads its data). */\n refresh(): void {\n if (this.filtering) {\n return;\n }\n this.tableFilterService.changePage(this.currentPageNum);\n }\n\n // ---- row action icons ----\n // A menu item's host-supplied `icon` (SVG markup) is rendered before its label in\n // the row's kebab menu. Sanitized once per unique SVG and cached.\n private iconCache = new Map<string, SafeHtml>();\n\n private safeIcon(svg: string): SafeHtml {\n let safe = this.iconCache.get(svg);\n if (!safe) {\n safe = this.sanitizer.bypassSecurityTrustHtml(svg);\n this.iconCache.set(svg, safe);\n }\n return safe;\n }\n\n private updateEntityTypeLabel(): void {\n const map: Record<string, string> = {\n 'api-sessions': 'API Sessions',\n 'auth-policies': 'Auth Policies',\n 'certificate-authorities': 'Certificate Authorities',\n 'ext-jwt-signers': 'External JWT Signers',\n identities: 'Identities',\n 'posture-checks': 'Posture Checks',\n 'edge-routers': 'Edge Routers',\n services: 'Services',\n configurations: 'Configs',\n 'config-types': 'Config Types',\n 'service-policies': 'Service Policies',\n 'edge-router-policies': 'Edge Router Policies',\n 'service-edge-router-policies': 'Service Edge Router Policies',\n sessions: 'Sessions',\n terminators: 'Terminators',\n 'transit-routers': 'Transit Routers',\n };\n this.entityTypeLabel = map[this._tableId] || this.entityTypeName || '';\n }\n}\n","@if (showTable && !accessDenied) {\n <div class=\"lt-container\">\n <div class=\"lt-toolbar\">\n <div class=\"lt-toolbar-left\">\n @if (toolbarControls.search.show) {\n <div class=\"lt-search\" [class.lt-ctl-disabled]=\"toolbarControls.search.disabled\">\n <svg class=\"lt-search-icon\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"4.3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <line x1=\"10.4\" y1=\"10.4\" x2=\"14.6\" y2=\"14.6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"lt-search-input\"\n id=\"SearchFilter\"\n type=\"text\"\n [placeholder]=\"'Search ' + (entityTypeLabel || 'items')\"\n [(ngModel)]=\"searchString\"\n [disabled]=\"toolbarControls.search.disabled\"\n (keyup)=\"onSearchInput()\"\n />\n </div>\n }\n @if (toolbarControls.filters.show && filterableColumns.length) {\n <div class=\"lt-filter-zone\" [class.lt-ctl-disabled]=\"toolbarControls.filters.disabled\" #filterZone>\n <div class=\"lt-filters\" #filtersRow>\n @for (col of visibleFilterColumns; track col.key) {\n <span class=\"lt-filter-item\" [attr.data-filter-key]=\"col.key\">\n <lib-list-filter-cell [column]=\"col\"></lib-list-filter-cell>\n </span>\n }\n </div>\n @if (overflowFilterColumns.length) {\n <div class=\"lt-filter-more\">\n <button\n type=\"button\"\n class=\"lt-filter-more-btn\"\n [class.is-on]=\"hiddenActiveCount > 0\"\n [class.is-open]=\"showFilterOverflow\"\n (click)=\"toggleFilterOverflow($event)\"\n aria-haspopup=\"true\"\n [attr.aria-expanded]=\"showFilterOverflow\"\n [attr.aria-label]=\"overflowFilterColumns.length + ' more filters'\"\n id=\"FilterOverflowButton\"\n >\n <span class=\"lt-filter-more-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\"><path fill=\"currentColor\" d=\"M2 3h12l-4.6 5.6v4l-2.8 1.4v-5.4z\"/></svg>\n </span>\n <span class=\"lt-filter-more-label\">More</span>\n <span class=\"lt-filter-more-count\">{{ overflowFilterColumns.length }}</span>\n </button>\n @if (showFilterOverflow) {\n <div class=\"lt-filter-overflow\" (clickOutside)=\"closeFilterOverflow($event)\">\n <div class=\"lt-filter-overflow-title\">Filters</div>\n @for (col of overflowFilterColumns; track col.key) {\n <div class=\"lt-filter-overflow-row\" [class.is-active]=\"isFilterActive(col)\">\n <lib-list-filter-cell [column]=\"col\"></lib-list-filter-cell>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- Consumer-supplied toolbar controls (e.g. page-specific filters), rendered inline beside search. -->\n <ng-content select=\"[toolbar-filters]\"></ng-content>\n </div>\n <div class=\"lt-toolbar-right\">\n <ng-template #refreshIcon>\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\">\n <path fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" d=\"M13.4 8a5.4 5.4 0 1 1-1.5-3.8\"/>\n <path fill=\"currentColor\" d=\"M13.9 2.1l.5 3.2-3.2-.5z\"/>\n </svg>\n </ng-template>\n @if (toolbarControls.refresh.show) {\n <button\n type=\"button\"\n class=\"lt-refresh-btn\"\n (click)=\"refresh()\"\n [disabled]=\"filtering || toolbarControls.refresh.disabled\"\n aria-label=\"Refresh\"\n title=\"Refresh\"\n id=\"RefreshTableButton\"\n >\n <ng-container [ngTemplateOutlet]=\"refreshIcon\"></ng-container>\n </button>\n }\n @if (toolbarControls.autoRefresh.show) {\n <span class=\"lt-autorefresh-wrap\" [class.lt-ctl-disabled]=\"toolbarControls.autoRefresh.disabled\">\n <lib-list-table-auto-refresh [seconds]=\"autoRefreshSeconds\" [loading]=\"filtering\" (refresh)=\"refresh()\"></lib-list-table-auto-refresh>\n </span>\n }\n @if (toolbarControls.columns.show) {\n <div class=\"lt-columns\">\n <button\n type=\"button\"\n class=\"lt-columns-btn\"\n [class.is-on]=\"hiddenColumnCount > 0\"\n [class.is-open]=\"showColumnChooser\"\n (click)=\"toggleColumnChooser($event)\"\n [disabled]=\"toolbarControls.columns.disabled\"\n aria-haspopup=\"true\"\n [attr.aria-expanded]=\"showColumnChooser\"\n id=\"ColumnChooserButton\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\">\n <path fill=\"currentColor\" d=\"M2 3.5h9v1.4H2zM2 7.3h6v1.4H2zM2 11.1h11v1.4H2z\"/>\n <circle cx=\"13\" cy=\"4.2\" r=\"1.7\" fill=\"currentColor\"/>\n <circle cx=\"10\" cy=\"8\" r=\"1.7\" fill=\"currentColor\"/>\n <circle cx=\"14.4\" cy=\"11.8\" r=\"1.7\" fill=\"currentColor\"/>\n </svg>\n <span>Columns</span>\n @if (hiddenColumnCount > 0) {\n <span class=\"lt-columns-count\">{{ hiddenColumnCount }}</span>\n }\n </button>\n @if (showColumnChooser) {\n <div class=\"lt-column-chooser\" (clickOutside)=\"closeColumnChooser()\">\n <div class=\"lt-chooser-header\">\n <span class=\"lt-chooser-title\">Columns</span>\n <span class=\"lt-chooser-subtitle\">Customize order and visibility</span>\n </div>\n @if (canSwitchTreeVariant && showTreeVariantToggle) {\n <div class=\"lt-chooser-view\" role=\"group\" aria-label=\"Expanded row layout\">\n <span class=\"lt-chooser-view-label\">Expanded rows</span>\n <div class=\"lt-chooser-view-toggle\">\n <button type=\"button\" class=\"lt-chooser-view-opt\" [class.active]=\"treeVariant === 'flat'\" (click)=\"setTreeVariant('flat')\">Flat</button>\n <button type=\"button\" class=\"lt-chooser-view-opt\" [class.active]=\"treeVariant === 'card'\" (click)=\"setTreeVariant('card')\">Nested</button>\n </div>\n </div>\n }\n <div class=\"lt-chooser-scroll\">\n <ul class=\"lt-chooser-list\" cdkDropList cdkDropListLockAxis=\"y\" (cdkDropListDropped)=\"chooserReorder($event)\">\n @for (col of chooserColumns; track col.key) {\n <li class=\"lt-chooser-row\" cdkDrag cdkDragLockAxis=\"y\" [cdkDragDisabled]=\"col.reorderable === false\"\n (cdkDragStarted)=\"onChooserDragStarted()\" (cdkDragEnded)=\"onChooserDragEnded()\">\n <ng-container *ngTemplateOutlet=\"chooserRowBody; context: { col: col }\"></ng-container>\n </li>\n }\n </ul>\n @if (canSwitchTreeVariant && childLevels.length) {\n <div class=\"lt-chooser-nested\">\n <button\n type=\"button\"\n class=\"lt-chooser-group\"\n (click)=\"toggleNestedGroup('__root')\"\n [attr.aria-expanded]=\"isNestedGroupOpen('__root')\"\n >\n <span class=\"lt-chooser-chevron\" [class.open]=\"isNestedGroupOpen('__root')\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\" width=\"11\" height=\"11\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 4l4 4-4 4\"/></svg>\n </span>\n <span class=\"lt-chooser-group-label\">Nested rows</span>\n </button>\n @if (isNestedGroupOpen('__root')) {\n @for (level of childLevels; track level) {\n <button\n type=\"button\"\n class=\"lt-chooser-group lt-chooser-group-sub\"\n (click)=\"toggleNestedGroup('lvl' + level)\"\n [attr.aria-expanded]=\"isNestedGroupOpen('lvl' + level)\"\n >\n <span class=\"lt-chooser-chevron\" [class.open]=\"isNestedGroupOpen('lvl' + level)\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\" width=\"11\" height=\"11\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 4l4 4-4 4\"/></svg>\n </span>\n <span class=\"lt-chooser-group-label\">Level {{ level }}</span>\n <span class=\"lt-chooser-group-hint\">{{ childLevelLabel(level) }}</span>\n </button>\n @if (isNestedGroupOpen('lvl' + level)) {\n <ul class=\"lt-chooser-list lt-chooser-sublist\" cdkDropList cdkDropListLockAxis=\"y\" (cdkDropListDropped)=\"chooserReorder($event, level)\">\n @for (col of allColumnsForLevel(level); track col.key) {\n <li class=\"lt-chooser-row\" cdkDrag cdkDragLockAxis=\"y\" [cdkDragDisabled]=\"col.reorderable === false\"\n (cdkDragStarted)=\"onChooserDragStarted()\" (cdkDragEnded)=\"onChooserDragEnded()\">\n <ng-container *ngTemplateOutlet=\"chooserRowBody; context: { col: col, level: level }\"></ng-container>\n </li>\n }\n </ul>\n }\n }\n }\n </div>\n }\n </div>\n <div class=\"lt-chooser-footer\">\n <button\n type=\"button\"\n class=\"lt-chooser-reset\"\n [disabled]=\"columnsAtDefault\"\n (click)=\"resetTableColumns()\"\n id=\"ResetColumnsButton\"\n >\n Reset to default\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- reload with rows already on screen: a thin indeterminate bar under the toolbar,\n rows stay visible (dimmed) and usable. role=progressbar (indeterminate). -->\n @if (showRefreshBar) {\n <div class=\"lt-refresh-bar\" role=\"progressbar\" aria-label=\"Refreshing\" aria-busy=\"true\">\n <span class=\"lt-refresh-bar-fill\"></span>\n </div>\n }\n\n <!-- inner content of a Columns-chooser row, shared by the top-level and nested lists.\n The <li cdkDrag> wrapper stays inline in each list (above) so cdkDropList's content\n query still registers it as a draggable; only the body is shared here.\n `level` undefined targets the top-level columns, a number targets that nested depth. -->\n <ng-template #chooserRowBody let-col=\"col\" let-level=\"level\">\n <button\n type=\"button\"\n class=\"lt-chooser-toggle\"\n [class.checked]=\"!col.hidden\"\n [disabled]=\"col.hideable === false || isLastVisibleColumn(col, level)\"\n [attr.title]=\"isLastVisibleColumn(col, level) ? 'At least one column must stay visible' : null\"\n (click)=\"toggleColumnVisible(col, level)\"\n [attr.aria-pressed]=\"!col.hidden\"\n >\n <span class=\"lt-chooser-box\" aria-hidden=\"true\">\n <!-- always rendered: the check is white, so it stays invisible until the box\n turns blue when checked. Keeping it in the DOM means clicking to hide a\n column never detaches the click target, which would otherwise make the\n click-outside handler think the click was outside and close the menu. -->\n <svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\">\n <path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2 6.3 4.6 9 10 3\"/>\n </svg>\n </span>\n <span class=\"lt-chooser-text\">{{ col.label }}</span>\n @if (level == null && isDefaultHidden(col)) {\n <span class=\"lt-chooser-default-tag\">hidden by default</span>\n }\n </button>\n @if (col.reorderable !== false) {\n <!-- the whole row is the drag target (cdkDrag on the <li>); this is just the grip affordance -->\n <span class=\"lt-chooser-handle\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 10 16\" width=\"10\" height=\"15\" fill=\"currentColor\">\n <circle cx=\"3\" cy=\"3\" r=\"1.25\"/><circle cx=\"7\" cy=\"3\" r=\"1.25\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.25\"/><circle cx=\"7\" cy=\"8\" r=\"1.25\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.25\"/><circle cx=\"7\" cy=\"13\" r=\"1.25\"/>\n </svg>\n </span>\n }\n </ng-template>\n\n <div class=\"lt-scroll\" id=\"ItemTable\" [class.lt-is-refreshing]=\"showRefreshBar\" [class.lt-is-empty]=\"!isLoading && !rowData?.length\" [attr.aria-busy]=\"isLoading ? 'true' : null\">\n <!-- expand/collapse control, reused by root rows and nested child rows -->\n <ng-template #treeToggle let-row=\"row\">\n @if (canExpand(row)) {\n <button\n type=\"button\"\n class=\"lt-tree-toggle\"\n [class.is-expanded]=\"row.__treeExpanded\"\n [class.is-loading]=\"row.__treeLoading\"\n [class.is-error]=\"row.__treeLoadError\"\n (click)=\"$event.stopPropagation(); toggleNode(row)\"\n [attr.aria-expanded]=\"!!row.__treeExpanded\"\n [attr.aria-busy]=\"!!row.__treeLoading\"\n [attr.title]=\"row.__treeLoadError ? 'Could not load children - click to retry' : null\"\n [attr.aria-label]=\"row.__treeExpanded ? 'Collapse row' : 'Expand row'\"\n >\n <svg class=\"lt-tree-chevron\" viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" aria-hidden=\"true\">\n <path fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 4l4 4-4 4\"/>\n </svg>\n @if (row.__treeLoading) {\n <span class=\"lt-tree-spinner\" aria-hidden=\"true\"></span>\n }\n </button>\n } @else {\n <span class=\"lt-tree-spacer\" aria-hidden=\"true\"></span>\n }\n </ng-template>\n\n <!-- a single cell's content, reused across the fixed grid and the nested grid -->\n <ng-template #cellBody let-col=\"col\" let-row=\"row\" let-i=\"i\">\n @switch (renderMode(col)) {\n @case ('component') {\n <ng-container *ngComponentOutlet=\"col.cell; inputs: cellInputs(col, row, i)\"></ng-container>\n }\n @case ('html') {\n <span class=\"lt-cell-html\" [innerHTML]=\"cellHtml(col, row, i)\"></span>\n }\n @default {\n <span class=\"lt-cell-text\">{{ cellText(col, row, i) }}</span>\n }\n }\n </ng-template>\n\n <table class=\"lt-table\">\n <colgroup>\n @if (!options.noSelect) { <col class=\"lt-col-select\" /> }\n @for (col of visibleColumns; track trackCol($index, col)) {\n <col [style.width]=\"colWidth(col)\" />\n }\n @if (!options.noMenu) { <col class=\"lt-col-menu\" /> }\n </colgroup>\n <thead class=\"lt-head\">\n <tr cdkDropList cdkDropListOrientation=\"horizontal\" (cdkDropListDropped)=\"onReorder($event)\">\n @if (!options.noSelect) {\n <th class=\"lt-select-cell\">\n <div\n class=\"lt-select-all\"\n [class.checked]=\"allToggled\"\n [class.indeterminate]=\"someSelected\"\n (click)=\"toggleAll()\"\n id=\"SelectAllRows\"\n ></div>\n </th>\n }\n @for (col of visibleColumns; track trackCol($index, col)) {\n <th\n cdkDrag\n [cdkDragDisabled]=\"col.reorderable === false\"\n class=\"lt-th\"\n [class.lt-th-tree]=\"isTreeCell(col)\"\n [ngClass]=\"col.cellClass\"\n id=\"Header_{{ col.key }}\"\n >\n <lib-list-header-cell\n [column]=\"col\"\n [sortDir]=\"col.sortDir\"\n (sortChanged)=\"onHeaderSort($event)\"\n ></lib-list-header-cell>\n @if (col.resizable !== false) {\n <span class=\"lt-resize\" (pointerdown)=\"startResize(col, $event)\"></span>\n }\n </th>\n }\n @if (!options.noMenu) {\n <th class=\"lt-menu-cell\">\n <div class=\"lt-header-menu-trigger\" (click)=\"openHeaderActionMenu($event)\" id=\"ColumnMenuHeader\">\n &#8942;\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (showSkeleton) {\n <!-- first load, no data yet: placeholder rows matching the real column layout.\n aria-hidden so screen readers get the region's aria-busy, not fake rows. -->\n @for (sk of skeletonRows; track sk; let r = $index) {\n <tr class=\"lt-row lt-skeleton-row\" aria-hidden=\"true\">\n @if (!options.noSelect) {\n <td class=\"lt-select-cell\"><span class=\"lt-sk lt-sk-check\"></span></td>\n }\n @for (col of visibleColumns; track trackCol($index, col); let c = $index) {\n <td class=\"lt-cell\" [class.lt-tree-cell]=\"isTreeCell(col)\">\n @if (isTreeCell(col)) {\n <span class=\"lt-sk lt-sk-dot\"></span>\n }\n <span class=\"lt-sk lt-sk-bar\" [style.width.%]=\"skeletonBarWidth(c, r)\"></span>\n </td>\n }\n @if (!options.noMenu) {\n <td class=\"lt-menu-cell\"></td>\n }\n </tr>\n }\n } @else {\n @for (row of flatRows; track trackRow($index, row); let i = $index) {\n @if (isTreeMode && row.__treeLevel > 0 && hasChildColumns) {\n <!-- nested rows with their own per-level columns, laid out in a grid\n that spans the full table width (so they need not match the parent) -->\n @if (row.__treeFirstChild) {\n <tr class=\"lt-tree-subhead-row\">\n <td\n [attr.colspan]=\"treeSpanCount\"\n [style.--lt-tree-indent.rem]=\"treeIndentFor(row.__treeLevel)\"\n [style.--lt-tree-first-indent.rem]=\"treeFlatFirstIndentRem(row.__treeLevel)\"\n [style.--lt-tree-lead-offset]=\"treeLeadOffset(row.__treeLevel)\"\n [style.background-image]=\"treeAncestorRails(row.__treeLevel)\"\n >\n <div\n class=\"lt-tree-grid\"\n [style.grid-template-columns]=\"gridTemplate(row.__treeLevel)\"\n >\n @if (childSelectEnabled) {\n <span class=\"lt-tree-subhead-cell lt-tree-select-cell\"></span>\n }\n @for (col of columnsForLevel(row.__treeLevel); track col.key; let last = $last) {\n <span class=\"lt-tree-subhead-cell\" [class.lt-tree-indent-col]=\"isTreeColumn(col, row.__treeLevel)\" [ngClass]=\"cellClass(col)\">\n {{ col.label }}\n @if (!last && col.resizable !== false) {\n <span class=\"lt-resize lt-tree-resize\" (pointerdown)=\"startChildResize(col, row.__treeLevel, $event)\"></span>\n }\n </span>\n }\n </div>\n </td>\n </tr>\n }\n <tr\n class=\"lt-row lt-tree-child-row\"\n [class.lt-tree-last-child]=\"row.__treeLastChild\"\n [class.lt-row-selected]=\"row.selected || row.open\"\n [class.lt-row-expanded]=\"row.__treeExpanded\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowLeave(row)\"\n >\n <td\n [attr.colspan]=\"treeSpanCount\"\n [style.--lt-tree-indent.rem]=\"treeIndentFor(row.__treeLevel)\"\n [style.--lt-tree-first-indent.rem]=\"treeFlatFirstIndentRem(row.__treeLevel)\"\n [style.--lt-tree-lead-offset]=\"treeLeadOffset(row.__treeLevel)\"\n [style.background-image]=\"treeAncestorRails(row.__treeLevel)\"\n >\n <div\n class=\"lt-tree-grid\"\n [style.grid-template-columns]=\"gridTemplate(row.__treeLevel)\"\n >\n @if (childSelectEnabled) {\n <div class=\"lt-tree-cellbox lt-tree-select-cell\">\n <lib-select-cell [row]=\"row\" [toggleItem]=\"toggleItem\"></lib-select-cell>\n </div>\n }\n @for (col of columnsForLevel(row.__treeLevel); track col.key) {\n <div\n class=\"lt-tree-cellbox\"\n [class.lt-tree-indent-col]=\"isTreeColumn(col, row.__treeLevel)\"\n [ngClass]=\"cellClass(col)\"\n (click)=\"onCellClick(col, row, i)\"\n (mouseenter)=\"onCellHover(col, row, i, $event)\"\n (mouseleave)=\"onCellLeave()\"\n >\n @if (isTreeColumn(col, row.__treeLevel) && showTreeLead(row)) {\n <span class=\"lt-tree-lead\">\n <ng-container *ngTemplateOutlet=\"treeToggle; context: {row: row}\"></ng-container>\n </span>\n }\n <ng-container *ngTemplateOutlet=\"cellBody; context: {col: col, row: row, i: i}\"></ng-container>\n </div>\n }\n </div>\n </td>\n </tr>\n } @else {\n <tr\n class=\"lt-row\"\n [class.lt-row-odd]=\"i % 2 === 1\"\n [class.lt-row-selected]=\"row.selected || row.open\"\n [class.lt-row-expanded]=\"row.__treeExpanded\"\n [class.row-invalid]=\"row.invalid\"\n [class.row-copied]=\"row.copied\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowLeave(row)\"\n >\n @if (!options.noSelect) {\n <td class=\"lt-select-cell\">\n <lib-select-cell [row]=\"row\" [toggleItem]=\"toggleItem\"></lib-select-cell>\n </td>\n }\n @for (col of visibleColumns; track trackCol($index, col)) {\n <td\n class=\"lt-cell\"\n [class.lt-tree-cell]=\"isTreeCell(col)\"\n [ngClass]=\"cellClass(col)\"\n (click)=\"onCellClick(col, row, i)\"\n (mouseenter)=\"onCellHover(col, row, i, $event)\"\n (mouseleave)=\"onCellLeave()\"\n >\n @if (isTreeCell(col)) {\n <span class=\"lt-tree-cell-inner\">\n <span class=\"lt-tree-lead\" [style.margin-left.rem]=\"(row.__treeLevel || 0) * treeIndentRem\">\n <ng-container *ngTemplateOutlet=\"treeToggle; context: {row: row}\"></ng-container>\n </span>\n <ng-container *ngTemplateOutlet=\"cellBody; context: {col: col, row: row, i: i}\"></ng-container>\n </span>\n } @else {\n <ng-container *ngTemplateOutlet=\"cellBody; context: {col: col, row: row, i: i}\"></ng-container>\n }\n </td>\n }\n @if (!options.noMenu) {\n <td class=\"lt-menu-cell\">\n @if (row.actionList?.length) {\n <button\n type=\"button\"\n class=\"lt-row-menu-trigger\"\n (click)=\"$event.stopPropagation(); openActionMenu($event, row)\"\n attr.id=\"RowMenu_{{ row.id }}\"\n aria-label=\"Row actions\"\n >&#8942;</button>\n }\n </td>\n }\n </tr>\n }\n }\n }\n </tbody>\n </table>\n @if (!isLoading && (!rowData || rowData.length === 0)) {\n <lib-list-empty\n [variant]=\"filterApplied ? 'no-results' : 'empty'\"\n [entityKey]=\"tableId\"\n [entityLabel]=\"entityTypeLabel\"\n [scope]=\"emptyScope\"\n [createLabel]=\"createLabel\"\n [hasAdd]=\"showNoItemsAdd\"\n [readonly]=\"noItemsReadonly\"\n [framed]=\"false\"\n (create)=\"openCreate()\"\n (clearFilters)=\"clearTableFilters()\"\n >\n <ng-content select=\"[empty-state]\" ngProjectAs=\"[empty-state]\"></ng-content>\n </lib-list-empty>\n }\n </div>\n\n <div class=\"lt-footer\">\n <div class=\"lt-footer-count\">\n Showing <span id=\"Start\">{{ startCount }}</span>&#8211;<span id=\"End\">{{ endCount }}</span>\n of <span id=\"Total\">{{ totalCount }}</span>\n </div>\n <div class=\"lt-footer-controls\">\n @if (toolbarControls.pageSize.show) {\n <div class=\"lt-rpp\" [class.lt-ctl-disabled]=\"toolbarControls.pageSize.disabled\">\n <span class=\"lt-rpp-label\">Rows per page</span>\n <select\n class=\"lt-rpp-select\"\n [disabled]=\"filtering || toolbarControls.pageSize.disabled\"\n [value]=\"pageSize\"\n (change)=\"onPageSizeChange(+$any($event.target).value)\"\n aria-label=\"Rows per page\"\n >\n @for (opt of pageSizeOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n </div>\n }\n @if (toolbarControls.pagination.show) {\n <div class=\"lt-pager\" [class.lt-ctl-disabled]=\"toolbarControls.pagination.disabled\">\n <button type=\"button\" class=\"lt-page-btn icon-prev\" [disabled]=\"prevDisabled\" (click)=\"prevPage()\" aria-label=\"Previous page\"></button>\n @if (!cursorPager) {\n @for (p of pageWindow; track $index) {\n @if (p === 0) {\n <span class=\"lt-page-gap\">&#8230;</span>\n } @else {\n <button\n type=\"button\"\n class=\"lt-page-num\"\n [class.is-current]=\"p === currentPageNum\"\n (click)=\"goToPage(p)\"\n >{{ p }}</button>\n }\n }\n }\n <button type=\"button\" class=\"lt-page-btn icon-next\" [disabled]=\"nextDisabled\" (click)=\"nextPage()\" aria-label=\"Next page\"></button>\n </div>\n }\n </div>\n </div>\n\n <!-- header action menu -->\n <lib-list-menu\n menuId=\"HeaderActionMenu\"\n [open]=\"openHeaderMenu\"\n [items]=\"headerMenuItems\"\n [left]=\"menuLeft\"\n [top]=\"menuTop\"\n (itemClick)=\"onHeaderMenuClick($event)\"\n (closed)=\"closeHeaderActionMenu()\"\n ></lib-list-menu>\n\n <!-- row action menu -->\n <lib-list-menu\n menuId=\"RowActionMenu\"\n [open]=\"openMenu\"\n [items]=\"rowMenuItems\"\n [left]=\"menuLeft\"\n [top]=\"menuTop\"\n (itemClick)=\"onRowMenuClick($event)\"\n (closed)=\"closeActionMenu()\"\n ></lib-list-menu>\n </div>\n} @else {\n <!-- access denied: a full-page wall (no table chrome to show without permission) -->\n <lib-list-empty\n variant=\"access-denied\"\n [entityKey]=\"tableId\"\n [entityLabel]=\"entityTypeLabel\"\n [scope]=\"emptyScope\"\n ></lib-list-empty>\n}\n\n@if (hoverTooltip) {\n <div class=\"lt-tooltip\" [ngStyle]=\"{ left: hoverTooltip.left + 'px', top: hoverTooltip.top + 'px' }\">\n <ng-container *ngComponentOutlet=\"hoverTooltip.component; inputs: hoverTooltip.inputs\"></ng-container>\n </div>\n}\n","import {Component, EventEmitter, Input, OnChanges, Output} from '@angular/core';\nimport {CommonModule} from '@angular/common';\n\n@Component({\n selector: 'lib-no-items',\n templateUrl: './no-items.component.html',\n styleUrls: ['./no-items.component.scss'],\n standalone: true,\n imports: [CommonModule]\n})\n\nexport class NoItemsComponent implements OnChanges {\n @Input() image = 'No_Gateways';\n @Input() typeName = '';\n @Input() isEmpty = false;\n @Input() hasAdd = true;\n @Input() hiddenResults = false;\n @Input() isLoading = false;\n @Input() readonly = false;\n @Input() accessDenied = false;\n background;\n @Output() clickEmit = new EventEmitter<any>();\n @Output() refresh = new EventEmitter<any>();\n\n constructor() {}\n\n ngOnChanges() {\n this.background = {\n 'background-image': 'url(assets/svgs/' + this.image + '.svg)',\n };\n }\n\n iconClick() {\n this.clickEmit.emit();\n }\n}\n","<div [hidden]=\"!isEmpty || isLoading\" class=\"noarea\" id=\"NoArea\">\n <div (click)=\"iconClick()\">\n <div [ngStyle]=\"background\" class=\"icon\"></div>\n <div class=\"title\">\n @if (accessDenied) {\n You do not have permission to view {{ typeName }}.\n } @else {\n This network currently has no {{ typeName }} to display.<br/>\n <span [hidden]=\"!hasAdd || readonly\"\n >Tap on the <span class=\"addExample\"></span> to add one.</span\n >\n }\n </div>\n </div>\n</div>\n","/*\n Copyright NetFoundry Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\n/*\n * Secondary entry point: `@openziti/ziti-console-lib/table-core`.\n *\n * The standalone list-table and the self-contained set of pieces it is built from. This entry's\n * compiled bundle and type declarations never include the library's main NgModule, so none of\n * that module's heavy, optional peers (ag-grid, primeng, lottie, oauth, json-editor, qrcode, csv,\n * yaml, json-ref-resolver) are reachable - not even as a build-time import edge. A consumer that\n * imports the table from this subpath builds with only the lean peers it genuinely needs\n * (@angular/*, @angular/cdk, @angular/material, rxjs, lodash, moment).\n */\n\nexport * from './lib/features/data-table/data-table-filter.service';\nexport * from './lib/features/list-table/list-column';\nexport * from './lib/features/list-table/list-table.service';\nexport * from './lib/features/list-table/click-outside.directive';\nexport * from './lib/features/list-table/list-table.component';\nexport * from './lib/features/list-table/list-menu/list-menu.component';\nexport * from './lib/features/list-table/select-cell/select-cell.component';\nexport * from './lib/features/list-table/list-header-cell/list-header-cell.component';\nexport * from './lib/features/list-table/list-filter-cell/list-filter-cell.component';\nexport * from './lib/features/list-table/list-table-auto-refresh/list-table-auto-refresh.component';\nexport * from './lib/features/list-table/list-empty/list-empty.component';\nexport * from './lib/features/no-items/no-items.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DataTableFilterService","i2.ListTableService","i3","i4","i5","i2","i1.ListTableService","i2.DataTableFilterService"],"mappings":"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"}