@angular-generic-table/core 5.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Pipe, Injector, inject, DestroyRef, input, output, linkedSignal, computed, signal, effect, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
2
+ import { Pipe, Injector, inject, DestroyRef, ElementRef, input, output, linkedSignal, signal, computed, effect, afterNextRender, afterRenderEffect, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
3
3
  import { Subject, fromEvent } from 'rxjs';
4
4
  import { filter, takeUntil } from 'rxjs/operators';
5
5
  import { toObservable } from '@angular/core/rxjs-interop';
@@ -363,6 +363,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
363
363
  class CoreComponent {
364
364
  constructor() {
365
365
  this._destroyRef = inject(DestroyRef);
366
+ this._host = inject((ElementRef));
366
367
  this._unsubscribe$ = new Subject();
367
368
  // ─── Inputs ───
368
369
  this.navigationKeys = input([
@@ -397,7 +398,11 @@ class CoreComponent {
397
398
  // ─── Linked Signals (two-way state) ───
398
399
  this.sortOrder = linkedSignal(() => this.sortOrderInput(), ...(ngDevMode ? [{ debugName: "sortOrder" }] : /* istanbul ignore next */ []));
399
400
  this.currentPaginationIndex = linkedSignal(() => this.paginationIndexInput(), ...(ngDevMode ? [{ debugName: "currentPaginationIndex" }] : /* istanbul ignore next */ []));
401
+ /** Page size measured from the container height, used when `length: 'auto'` */
402
+ this.autoPageSize = signal(null, ...(ngDevMode ? [{ debugName: "autoPageSize" }] : /* istanbul ignore next */ []));
400
403
  // ─── Computed Signals ───
404
+ /** Whether pagination is in auto (fit-to-container) mode */
405
+ this.isAutoPagination = computed(() => this.config().pagination?.length === 'auto', ...(ngDevMode ? [{ debugName: "isAutoPagination" }] : /* istanbul ignore next */ []));
401
406
  this.customClasses = computed(() => ({
402
407
  selectedRow: 'gt-selected',
403
408
  activeRow: 'gt-active',
@@ -482,20 +487,24 @@ class CoreComponent {
482
487
  },
483
488
  };
484
489
  }
485
- if (!config.pagination || config.pagination.length === 0) {
490
+ const pag = config.pagination;
491
+ if (!pag || pag.length === 0) {
486
492
  return {
487
493
  data: [sorted],
488
494
  config,
489
495
  info: { numberOfRecords: sorted.length, pageTotal: 1 },
490
496
  };
491
497
  }
498
+ const pageSize = pag.length === 'auto'
499
+ ? (this.autoPageSize() ?? CoreComponent.DEFAULT_AUTO_ROWS)
500
+ : +(pag.length || 0);
492
501
  return {
493
- data: chunk(sorted, +(config.pagination.length || 0)),
502
+ data: chunk(sorted, pageSize),
494
503
  config,
495
504
  info: {
496
505
  numberOfRecords: sorted.length,
497
- pageSize: +(config.pagination.length || 0),
498
- pageTotal: Math.ceil(sorted.length / +(config.pagination.length || 0)),
506
+ pageSize,
507
+ pageTotal: Math.ceil(sorted.length / pageSize),
499
508
  },
500
509
  };
501
510
  }, ...(ngDevMode ? [{ debugName: "table" }] : /* istanbul ignore next */ []));
@@ -507,7 +516,10 @@ class CoreComponent {
507
516
  this.boundedPaginationIndex = computed(() => {
508
517
  const page = this.currentPaginationIndex();
509
518
  const info = this.tableInfoSignal();
510
- const pageSize = info.pageSize ?? this.config()?.pagination?.length ?? info.numberOfRecords;
519
+ const configLength = this.config()?.pagination?.length;
520
+ const pageSize = info.pageSize ??
521
+ (typeof configLength === 'number' ? configLength : undefined) ??
522
+ info.numberOfRecords;
511
523
  const lastPage = Math.ceil(info.numberOfRecords / pageSize) - 1;
512
524
  return +page < 0 ? 0 : +page > lastPage ? lastPage : +page;
513
525
  }, ...(ngDevMode ? [{ debugName: "boundedPaginationIndex" }] : /* istanbul ignore next */ []));
@@ -543,6 +555,31 @@ class CoreComponent {
543
555
  this.activeRowIndex = event.index;
544
556
  this.rowActiveOutput.emit(event);
545
557
  }, ...(ngDevMode ? [{ debugName: "_rowActiveEffect" }] : /* istanbul ignore next */ []));
558
+ // Observe container/table size changes to recompute the auto page size
559
+ this._setupAutoPagination = afterNextRender(() => {
560
+ if (typeof ResizeObserver === 'undefined') {
561
+ return;
562
+ }
563
+ const host = this._host.nativeElement;
564
+ this._resizeObserver = new ResizeObserver(() => {
565
+ if (this.isAutoPagination()) {
566
+ this._measureAutoPageSize();
567
+ }
568
+ });
569
+ this._resizeObserver.observe(host);
570
+ const table = host.querySelector('table');
571
+ if (table) {
572
+ this._resizeObserver.observe(table);
573
+ }
574
+ this._destroyRef.onDestroy(() => this._resizeObserver?.disconnect());
575
+ });
576
+ // Re-measure after render when data/config changes (e.g. async data load)
577
+ this._autoPaginationEffect = afterRenderEffect(() => {
578
+ this.processedData();
579
+ if (this.isAutoPagination()) {
580
+ this._measureAutoPageSize();
581
+ }
582
+ });
546
583
  this._columnOrder = (a, b) => {
547
584
  return (a.value.order || 0) - (b.value.order || 0);
548
585
  };
@@ -566,10 +603,34 @@ class CoreComponent {
566
603
  this._unsubscribeFromKeyboardEvents$ = new Subject();
567
604
  this._keyboardArrowEvent$ = fromEvent(document, 'keydown').pipe(filter((event) => [...this.navigationKeys(), ...this.selectKeys()].indexOf(event.key) > -1));
568
605
  }
606
+ /** Initial page size used by `length: 'auto'` before the container is measured */
607
+ static { this.DEFAULT_AUTO_ROWS = 10; }
569
608
  /** Get tableInfo synchronously */
570
609
  get tableInfo() {
571
610
  return this.tableInfoSignal();
572
611
  }
612
+ /** Measure available height and derive how many rows fit (auto pagination) */
613
+ _measureAutoPageSize() {
614
+ const host = this._host.nativeElement;
615
+ const table = host.querySelector('table');
616
+ if (!table) {
617
+ return;
618
+ }
619
+ const sampleRow = table.querySelector('tbody tr');
620
+ if (!sampleRow) {
621
+ return;
622
+ }
623
+ const rowH = sampleRow.offsetHeight;
624
+ const available = host.clientHeight;
625
+ // Skip when not measurable (SSR/jsdom, hidden, or unconstrained container)
626
+ if (rowH <= 0 || available <= 0) {
627
+ return;
628
+ }
629
+ const headH = table.tHead?.offsetHeight ?? 0;
630
+ const footH = table.tFoot?.offsetHeight ?? 0;
631
+ const fit = Math.max(1, Math.floor((available - headH - footH) / rowH));
632
+ this.autoPageSize.set(fit);
633
+ }
573
634
  get sortOrder$() {
574
635
  return (this._sortOrder$ ??= toObservable(this.sortOrder));
575
636
  }
@@ -1 +1 @@
1
- {"version":3,"file":"angular-generic-table-core.mjs","sources":["../../../projects/core/src/lib/utilities/utilities.ts","../../../projects/core/src/lib/pipes/capital-case.pipe.ts","../../../projects/core/src/lib/pipes/sort-class.pipe.ts","../../../projects/core/src/lib/pipes/dash-case.pipe.ts","../../../projects/core/src/lib/pipes/dynamic.pipe.ts","../../../projects/core/src/lib/pipes/highlight.pipe.ts","../../../projects/core/src/lib/pipes/row-selection.pipe.ts","../../../projects/core/src/lib/core.component.ts","../../../projects/core/src/lib/core.component.html","../../../projects/core/src/lib/gt-delta/gt-delta.component.ts","../../../projects/core/src/lib/core.module.ts","../../../projects/core/src/lib/pagination/pagination.component.ts","../../../projects/core/src/lib/pagination/pagination.component.html","../../../projects/core/src/lib/pagination/pagination.module.ts","../../../projects/core/src/public-api.ts","../../../projects/core/src/angular-generic-table-core.ts"],"sourcesContent":["import { TableRow } from '../models/table-row.interface';\nimport { TableConfig } from '../models/table-config.interface';\nimport { GtSortConfig, GtSortOrder } from '../models/table-sort.interface';\nimport { GtSortEvent } from '../models/table-events.interface';\nexport let dashed: (s: string) => string;\ndashed = (s: string) => s.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n\nexport let capitalize: (s: string) => string;\ncapitalize = (s) =>\n (s.charAt(0).toUpperCase() + s.slice(1))\n .replace(/_/g, ' ')\n .replace(/([A-Z][a-z]+)/g, ' $1')\n .replace(/([A-Z]{2,})/g, ' $1')\n .replace(/\\s{2,}/g, ' ')\n .trim();\n\nexport let chunk: (\n array: Array<any>,\n chunkSize: number\n) => Array<Array<TableRow>>;\nchunk = (array, chunkSize) => {\n if (chunkSize < 0) {\n throw new Error('Invalid chunk size');\n }\n if (chunkSize === 0 && !chunkSize) {\n return [array];\n }\n const CHUNK = [];\n for (let i = 0, len = array.length; i < len; i += chunkSize) {\n CHUNK.push(array.slice(i, i + chunkSize));\n }\n return CHUNK;\n};\n\nexport let search: (\n text: string,\n caseSensitive: boolean,\n data: Array<TableRow>,\n config: TableConfig\n) => TableRow[];\nsearch = (\n text: string,\n caseSensitive: boolean,\n data: Array<TableRow>,\n config: TableConfig\n) => {\n if (config.columns) {\n const searchColumns = Object.keys(config.columns).filter(\n // @ts-ignore\n (key) =>\n config.columns &&\n !config.columns[key]?.hidden &&\n config.columns[key]?.search !== false\n );\n\n const FILTERED = [];\n for (let i = 0; i < data.length; i++) {\n const row = data[i];\n const match =\n Object.entries(row)\n .filter(([key, value]) => searchColumns.indexOf(key) !== -1)\n .reduce((acc, [key, value], index): string => {\n const search = config?.columns![key]?.search;\n // if search is a function...\n if (typeof search === 'function') {\n // ...use search function to return value to search\n value = search(row, key, value);\n }\n return (\n acc +\n (index === 0 ? '' : ' ? ') +\n (caseSensitive ? value + '' : (value + '').toLowerCase())\n );\n }, '')\n .indexOf(caseSensitive ? text : text.toLowerCase()) !== -1;\n if (match) {\n FILTERED[FILTERED.length] = row;\n }\n }\n return FILTERED;\n } else {\n return data;\n }\n};\n\nexport let calculate = (data: Array<TableRow>, config: TableConfig) => {\n const CALCULATIONS: { [key: string]: boolean } = {};\n const COLUMN_CALCULATIONS: { [key: string]: Array<string> } = {};\n let CALCULATED = Object.entries(config.footer?.columns || {})\n .filter(\n ([columnName, calculations]) =>\n Object.values(calculations || {}).filter((value) => value !== false)\n .length >= 0\n )\n .reduce((acc: any, [columnName, calculations], index) => {\n acc[columnName] = Object.entries(calculations || {})\n .filter(([calculation, value]) => value !== false)\n .reduce((acc: any, [calculation, value]) => {\n if (COLUMN_CALCULATIONS[columnName]) {\n COLUMN_CALCULATIONS[columnName].push(calculation);\n } else if (value === true) {\n COLUMN_CALCULATIONS[columnName] = [calculation];\n }\n CALCULATIONS[calculation] = true;\n if (typeof value === 'function') {\n value = value(data, columnName);\n }\n acc[calculation] = value === true ? 0 : value;\n return acc;\n }, {});\n return acc;\n }, {});\n if (Object.keys(CALCULATED).length > 0) {\n for (let i = 0; i < data.length; i++) {\n Object.entries(COLUMN_CALCULATIONS).forEach(([column, calculations]) => {\n if (calculations.indexOf('sum') > -1) {\n CALCULATED[column].sum += data[i][column];\n }\n if (\n calculations.indexOf('avg') > -1 &&\n calculations.indexOf('sum') === -1\n ) {\n if (CALCULATED[column].sum === undefined) {\n CALCULATED[column].sum = 0;\n }\n CALCULATED[column].sum += data[i][column];\n }\n if (\n calculations.indexOf('max') > -1 &&\n (!CALCULATED[column].max || +data[i][column] > CALCULATED[column].max)\n ) {\n CALCULATED[column].max = +data[i][column];\n }\n if (\n calculations.indexOf('min') > -1 &&\n (!CALCULATED[column].min || +data[i][column] < CALCULATED[column].min)\n ) {\n CALCULATED[column].min = +data[i][column];\n }\n });\n }\n Object.entries(COLUMN_CALCULATIONS).forEach(([column, calculations]) => {\n if (calculations.indexOf('avg') !== -1) {\n CALCULATED[column].avg = CALCULATED[column]?.sum / data.length;\n // if sum is not part of calculations config...\n if (calculations.indexOf('sum') === -1 && CALCULATED[column].sum) {\n // ...remove it\n delete CALCULATED[column].sum;\n }\n }\n if (calculations.indexOf('count') !== -1) {\n CALCULATED[column].count = data.length;\n }\n });\n }\n return {\n calculated: CALCULATED,\n calculations: Object.keys(CALCULATIONS).sort(\n (a, b) =>\n (config.footer?.rowOrder?.indexOf(a) || 0) -\n (config.footer?.rowOrder?.indexOf(b) || 0)\n ),\n calculatedColumnsCount: Object.keys(CALCULATED).length || 0,\n };\n};\n\n/** sortOnMultipleKeys\n * @description Sort data on multiple keys with locale-aware alphanumeric comparison\n * @param {GtSortOrder} keys - array with sort config objects to sort on, data will be sorted according to array order\n * @returns sort function\n */\nexport const sortOnMultipleKeys = (\n keys: GtSortOrder\n): ((a: TableRow, b: TableRow) => number) => {\n const order = keys.map((key) => (key.order === 'desc' ? -1 : 1));\n return (a, b) => {\n for (let i = 0; i < keys.length; i++) {\n const o = keys[i].key;\n const aVal = a[o];\n const bVal = b[o];\n if (aVal === bVal) continue;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n const cmp = aVal.localeCompare(bVal, undefined, { numeric: true, sensitivity: 'base' });\n if (cmp !== 0) return cmp * order[i];\n continue;\n }\n if (aVal > bVal) return order[i];\n if (aVal < bVal) return -order[i];\n }\n return 0;\n };\n};\n\n/** parseSortOrderParams\n * @description Convert sort order query param to array with sort config objects\n * @param sortParams - Query param string where each sort config object is separated by comma and order is indicated by + (ascending) or - (descending), e.g. _'name,-age'_\n * @returns GtSortOrder - Array with sort config objects\n */\nexport const parseSortOrderParams = (sortParams: string): GtSortOrder => {\n const sortParamsArray = sortParams.split(',');\n return sortParamsArray.map((sortParam) => {\n const [key, order] = sortParam.split(':');\n return {\n key: key.replace(/^[+-]/, ''),\n order: order === 'desc' ? 'desc' : 'asc',\n };\n });\n};\n\n/** sortOrderConfigToParam\n * @description Convert sort config object to string that can be used as query param when sorting is implemented server side\n * @param sortConfig - Sort config object\n * @returns string - Query param string where order is indicated by + (ascending) or - (descending), e.g. _'-name'_\n */\nexport const sortOrderConfigToParam = (\n sortConfig: GtSortEvent | GtSortConfig\n): string => {\n const order = sortConfig.order === 'desc' ? '-' : '+';\n return `${order}${sortConfig.key}`;\n};\n\n/** sortOrderToParams\n * @description Convert sort order array to string that can be used as query param when sorting is implemented server side\n * @param sortOrder - Array with sort config objects\n * @returns string - Query param string where each sort config object is separated by comma and order is indicated by + (ascending) or - (descending), e.g. _'name,-age'_\n */\nexport const sortOrderToParams = (sortOrder: GtSortOrder): string => {\n return sortOrder\n .map((sortConfig) => sortOrderConfigToParam(sortConfig))\n .join(',');\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { capitalize } from '../utilities/utilities';\n\n@Pipe({\n name: 'capitalCase',\n standalone: true,\n})\nexport class CapitalCasePipe implements PipeTransform {\n transform(s: string): any {\n return capitalize(s);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { GtSortOrder } from '../models/table-sort.interface';\n\n@Pipe({\n name: 'sortClass',\n standalone: true,\n})\nexport class SortClassPipe implements PipeTransform {\n transform(\n sortOrder: GtSortOrder | null,\n key: string,\n context: 'class' | 'aria' | 'order' = 'class'\n ): string | null {\n const sortIndex = sortOrder\n ? sortOrder.findIndex((s) => s.key === key)\n : -1;\n if (context === 'aria') {\n if (sortIndex === -1 || !sortOrder) {\n return null;\n } else {\n return `${sortOrder[sortIndex].order}ending`;\n }\n } else if (context === 'class') {\n if (sortIndex === -1 || !sortOrder) {\n return '';\n } else {\n return `gt-sort-${sortOrder[sortIndex].order}`;\n }\n } else {\n return (sortOrder && sortOrder?.length === 1) || sortIndex < 0\n ? null\n : sortIndex + 1 + '';\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { dashed } from '../utilities/utilities';\n\n@Pipe({\n name: 'dashCase',\n standalone: true,\n})\nexport class DashCasePipe implements PipeTransform {\n transform(s: string): any {\n return dashed(s);\n }\n}\n","import { Injector, Pipe, PipeTransform, Type } from '@angular/core';\n\n@Pipe({\n name: 'dynamicPipe',\n standalone: true,\n})\nexport class DynamicPipe implements PipeTransform {\n private _cache = new Map<Type<any>, PipeTransform>();\n\n constructor(private injector: Injector) {}\n\n transform(value: any, requiredPipe: Type<any>, pipeArgs: any[]): any {\n const cached = this._cache.get(requiredPipe);\n if (cached) {\n return cached.transform(value, ...(pipeArgs || []));\n }\n const childInjector = Injector.create({\n name: 'DynamicPipe',\n parent: this.injector,\n providers: [{ provide: requiredPipe }],\n });\n const pipe = childInjector.get(requiredPipe) as PipeTransform;\n this._cache.set(requiredPipe, pipe);\n return pipe.transform(value, ...(pipeArgs || []));\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'highlight',\n standalone: true,\n})\nexport class HighlightPipe implements PipeTransform {\n private _cachedTerm: string | null = null;\n private _cachedRegex: RegExp | null = null;\n\n transform(text: any, searchTerm: string | null): string {\n if (!searchTerm) {\n return text;\n }\n const haystackAlwaysString = text + '';\n\n if (searchTerm !== this._cachedTerm) {\n this._cachedTerm = searchTerm;\n try {\n this._cachedRegex = new RegExp(\n '(' +\n searchTerm\n .toLowerCase()\n .match(/\".*?\"|[^ ]+/g)!\n .map((needle) => needle.replace(/\"(.*?)\"/, '$1'))\n .join('|') +\n ')',\n 'ig'\n );\n } catch {\n this._cachedRegex = null;\n }\n }\n\n if (!this._cachedRegex) {\n return haystackAlwaysString;\n }\n\n const containsTagPattern = /(<.*?>)(.*)(<\\/.*?>)/gi;\n const containsTagMatches = containsTagPattern.exec(haystackAlwaysString);\n\n if (containsTagMatches) {\n return (\n containsTagMatches[1] +\n containsTagMatches[2].replace(\n this._cachedRegex,\n '<span class=\"gt-highlight-search\">$1</span>'\n ) +\n containsTagMatches[3]\n );\n }\n return haystackAlwaysString.replace(\n this._cachedRegex,\n '<span class=\"gt-highlight-search\">$1</span>'\n );\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { TableRow } from '../models/table-row.interface';\n\n@Pipe({\n name: 'rowSelection',\n standalone: true,\n})\nexport class RowSelectionPipe implements PipeTransform {\n transform(\n row: TableRow,\n selection: any,\n comparator: (row: TableRow, selection: any) => boolean,\n className?: string\n ): string {\n return className && comparator(row, selection) ? className : '';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n linkedSignal,\n OnDestroy,\n output,\n signal,\n TrackByFunction,\n} from '@angular/core';\nimport {\n fromEvent,\n Observable,\n Subject,\n} from 'rxjs';\nimport {\n filter,\n takeUntil,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { TableConfig } from './models/table-config.interface';\nimport {\n KeyValue,\n NgComponentOutlet,\n NgTemplateOutlet,\n SlicePipe,\n} from '@angular/common';\nimport { TableColumn } from './models/table-column.interface';\nimport {\n calculate,\n chunk,\n search,\n sortOnMultipleKeys,\n} from './utilities/utilities';\nimport { TableRow } from './models/table-row.interface';\nimport { GtOrder, GtSortOrder } from './models/table-sort.interface';\nimport {\n GtPageChangeEvent,\n GtRowSelectEvent,\n GtRowClickEvent,\n GtRowActiveEvent,\n GtSortEvent,\n} from './models/table-events.interface';\nimport { CapitalCasePipe } from './pipes/capital-case.pipe';\nimport { SortClassPipe } from './pipes/sort-class.pipe';\nimport { DashCasePipe } from './pipes/dash-case.pipe';\nimport { DynamicPipe } from './pipes/dynamic.pipe';\nimport { HighlightPipe } from './pipes/highlight.pipe';\nimport { RowSelectionPipe } from './pipes/row-selection.pipe';\nimport { GtPaginationInfo } from './models/gt-pagination';\nimport { TableInfo } from './models/table-info.interface';\nimport { TableMeta } from './models/table-meta.interface';\n\n@Component({\n selector: 'angular-generic-table',\n templateUrl: './core.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CapitalCasePipe,\n SortClassPipe,\n DashCasePipe,\n RowSelectionPipe,\n NgComponentOutlet,\n NgTemplateOutlet,\n SlicePipe,\n DynamicPipe,\n HighlightPipe,\n ],\n})\nexport class CoreComponent implements OnDestroy {\n private _destroyRef = inject(DestroyRef);\n private _unsubscribe$ = new Subject<void>();\n\n // ─── Inputs ───\n\n readonly navigationKeys = input([\n 'ArrowDown',\n 'ArrowUp',\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n ]);\n readonly selectKeys = input(['Enter', ' ']);\n readonly config = input<TableConfig<any>>({});\n readonly data = input<Array<TableRow>>([]);\n readonly searchTerm = input<string | null>(null, { alias: 'search' });\n readonly loading = input(false);\n readonly sortOrderInput = input<GtSortOrder<any>>([], { alias: 'sortOrder' });\n readonly paginationIndexInput = input(0, { alias: 'paginationIndex' });\n readonly pagingInfo = input<GtPaginationInfo | null>(null);\n readonly selection = input<any>({});\n readonly rowIdKey = input<string | undefined>(undefined);\n readonly generateRowId = input(true);\n readonly trackRowByFnInput = input<TrackByFunction<TableRow> | undefined>(\n undefined,\n { alias: 'trackRowByFn' }\n );\n readonly isRowSelectedFn = input<\n ((row: TableRow | any, selection?: any) => boolean) | undefined\n >(undefined);\n readonly customClassesInput = input<\n Partial<{ selectedRow: string; activeRow: string }>\n >({}, { alias: 'customClasses' });\n\n // ─── Outputs ───\n\n readonly rowClick = output<GtRowClickEvent>();\n readonly rowSelect = output<GtRowSelectEvent>();\n readonly sortOrderChange = output<GtSortOrder<TableRow>>();\n readonly rowActiveOutput = output<GtRowActiveEvent>({ alias: 'rowActive' });\n readonly columnSort = output<GtSortEvent>();\n readonly pageChange = output<GtPageChangeEvent>();\n\n // ─── Linked Signals (two-way state) ───\n\n protected sortOrder = linkedSignal(() => this.sortOrderInput());\n protected currentPaginationIndex = linkedSignal(() =>\n this.paginationIndexInput()\n );\n\n // ─── Computed Signals ───\n\n protected customClasses = computed(() => ({\n selectedRow: 'gt-selected',\n activeRow: 'gt-active',\n ...this.customClassesInput(),\n }));\n\n trackRowByFn: TrackByFunction<TableRow> = (\n index: number,\n row: TableRow\n ) => {\n const customFn = this.trackRowByFnInput();\n if (customFn) return customFn(index, row);\n const idKey = this.rowIdKey();\n return idKey ? row[idKey] : row?._id;\n };\n\n /** Data with mapTo expansions and row IDs applied */\n private expandedData = computed(() => {\n let data = [...this.data()];\n const config = this.config();\n\n // mapTo expansion\n if (\n (config.columns &&\n !!Object.values(config.columns).find((column) => !!column.mapTo)) ||\n (config.rows &&\n !!Object.values(config.rows).find((column) => !!column.mapTo))\n ) {\n const newData: TableRow[] = [];\n for (let i = 0; i < data.length; i++) {\n const row = data[i];\n const newKeys = Object.entries(config.columns || config.rows || [])\n .filter(([key, value]) => !!value.mapTo)\n .reduce(\n (previousValue, [key, value]) => ({\n ...previousValue,\n [key]: this.nestedValue(\n row,\n value.mapTo!.path,\n value.mapTo?.missingValue\n ),\n }),\n {}\n );\n newData[i] = { ...row, ...newKeys };\n }\n data = newData;\n }\n\n // Generate row IDs\n if (this.generateRowId() && !this.rowIdKey() && data.length > 0) {\n const dataWithId = [];\n for (let i = 0; i < data.length; i++) {\n dataWithId[i] = { ...data[i], _id: i };\n }\n data = dataWithId;\n }\n\n return data;\n });\n\n /** Filtered data (search applied, no sort) */\n private searchedData = computed(() => {\n const data = [...this.expandedData()];\n const searchBy = this.searchTerm();\n const config = this.config();\n const lazyLoaded = this.pagingInfo() !== null;\n\n return searchBy && !lazyLoaded\n ? search(searchBy, false, data, config)\n : data;\n });\n\n /** Sorted (and already searched) data */\n private processedData = computed(() => {\n const data = this.searchedData();\n const sortBy = this.sortOrder();\n const config = this.config();\n\n if (!sortBy?.length || config?.disableTableSort) {\n return data;\n }\n return [...data].sort(sortOnMultipleKeys(sortBy));\n });\n\n /** Table meta: chunked data + config + pagination info */\n protected table = computed<TableMeta>(() => {\n const sorted = this.processedData();\n const config = this.config();\n const pi = this.pagingInfo();\n\n if (\n pi !== null &&\n pi.pageCurrent !== null &&\n pi.numberOfRecords !== null &&\n pi.pageSize !== null\n ) {\n return {\n data: [sorted],\n config,\n info: {\n lazyLoaded: true,\n numberOfRecords: pi.numberOfRecords,\n pageSize: pi.pageSize,\n pageTotal:\n pi.pageTotal ?? Math.ceil(pi.numberOfRecords / pi.pageSize),\n },\n };\n }\n\n if (!config.pagination || config.pagination.length === 0) {\n return {\n data: [sorted],\n config,\n info: { numberOfRecords: sorted.length, pageTotal: 1 },\n };\n }\n\n return {\n data: chunk(sorted, +(config.pagination.length || 0)),\n config,\n info: {\n numberOfRecords: sorted.length,\n pageSize: +(config.pagination.length || 0),\n pageTotal: Math.ceil(\n sorted.length / +(config.pagination.length || 0)\n ),\n },\n };\n });\n\n /** Current table info */\n readonly tableInfoSignal = computed<TableInfo>(() => this.table().info);\n\n /** Get tableInfo synchronously */\n get tableInfo(): TableInfo | undefined {\n return this.tableInfoSignal();\n }\n\n /** Calculations for footer */\n protected calculations = computed(() =>\n calculate(this.processedData(), this.config())\n );\n\n /** Bounded pagination index (clamped to valid range) */\n readonly boundedPaginationIndex = computed(() => {\n const page = this.currentPaginationIndex();\n const info = this.tableInfoSignal();\n const pageSize =\n info.pageSize ?? this.config()?.pagination?.length ?? info.numberOfRecords;\n const lastPage = Math.ceil(info.numberOfRecords / pageSize) - 1;\n return +page < 0 ? 0 : +page > lastPage ? lastPage : +page;\n });\n\n /** Number of visible columns */\n protected colspan = computed(() => {\n const config = this.config();\n if (config.columns) {\n return Object.values(config.columns || config.rows || {}).filter(\n (value) => value.hidden !== true\n ).length;\n }\n return this.processedData().length + 1;\n });\n\n /** Number of footer columns */\n protected footerColspan = computed(() => {\n const config = this.config();\n let colspan = 0;\n Object.values(config?.footer?.columns || {}).forEach((calculations) => {\n if (\n Object.values(calculations).filter((value) => value !== false).length >=\n 0\n ) {\n colspan += 1;\n }\n });\n return colspan;\n });\n\n // ─── Row Active State ───\n\n protected rowActiveState = signal<GtRowActiveEvent>({\n row: null,\n index: null,\n });\n activeRowIndex: number | null = null;\n\n // Emit rowActive output and track index\n private _rowActiveEffect = effect(() => {\n const event = this.rowActiveState();\n this.activeRowIndex = event.index;\n this.rowActiveOutput.emit(event);\n });\n\n\n // ─── Public Observable Getters (backward compat, lazy-cached) ───\n\n private _sortOrder$?: Observable<GtSortOrder>;\n get sortOrder$(): Observable<GtSortOrder> {\n return (this._sortOrder$ ??= toObservable(this.sortOrder));\n }\n\n private _loading$?: Observable<boolean>;\n get loading$(): Observable<boolean> {\n return (this._loading$ ??= toObservable(this.loading));\n }\n\n private _searchBy$?: Observable<string | null>;\n get searchBy$(): Observable<string | null> {\n return (this._searchBy$ ??= toObservable(this.searchTerm));\n }\n\n private _tableConfig$?: Observable<TableConfig>;\n get tableConfig$(): Observable<TableConfig> {\n return (this._tableConfig$ ??= toObservable(this.config));\n }\n\n private _data$?: Observable<Array<TableRow>>;\n get data$(): Observable<Array<TableRow>> {\n return (this._data$ ??= toObservable(this.processedData));\n }\n\n private _table$?: Observable<TableMeta>;\n get table$(): Observable<TableMeta> {\n return (this._table$ ??= toObservable(this.table));\n }\n\n private _tableInfo$?: Observable<TableInfo>;\n get tableInfo$(): Observable<TableInfo> {\n return (this._tableInfo$ ??= toObservable(this.tableInfoSignal));\n }\n\n private _currentPaginationIndex$?: Observable<number>;\n get currentPaginationIndex$(): Observable<number> {\n return (this._currentPaginationIndex$ ??= toObservable(this.boundedPaginationIndex));\n }\n\n private _calculations$?: Observable<ReturnType<typeof calculate>>;\n get calculations$(): Observable<ReturnType<typeof calculate>> {\n return (this._calculations$ ??= toObservable(this.calculations));\n }\n\n private _rowActive$?: Observable<GtRowActiveEvent>;\n get rowActive$(): Observable<GtRowActiveEvent> {\n return (this._rowActive$ ??= toObservable(this.rowActiveState));\n }\n\n private _colspan$?: Observable<number>;\n get colspan$(): Observable<number> {\n return (this._colspan$ ??= toObservable(this.colspan));\n }\n\n // ─── Pagination ───\n\n get paginationIndex(): number {\n return this.currentPaginationIndex();\n }\n set paginationIndex(value: number) {\n this.currentPaginationIndex.set(value);\n this.pageChange.emit({ index: this.boundedPaginationIndex() });\n }\n\n // ─── Methods ───\n\n protected headerSortFn(key: string): (event: MouseEvent) => void {\n return (event: MouseEvent) => this.sortByKey(key, event);\n }\n\n _rowClick(row: TableRow, index: number, event: MouseEvent): void {\n this.rowClick.emit({ row, index, event });\n }\n\n _rowSelect(row: TableRow, index: number, event: KeyboardEvent): void {\n this.rowSelect.emit({ row, index, event });\n }\n\n activateRow(id: string, event?: MouseEvent | KeyboardEvent): void;\n activateRow(index: number, event?: MouseEvent | KeyboardEvent): void;\n activateRow(none: null, event?: MouseEvent | KeyboardEvent): void;\n activateRow(\n arg: string | number | null,\n event?: MouseEvent | KeyboardEvent\n ): void {\n if (typeof arg === 'number') {\n const tableData = this.table();\n const pageData = tableData.data[this.paginationIndex];\n if (pageData && pageData[arg]) {\n this._activateRow(pageData[arg], arg, event);\n }\n } else if (typeof arg === 'string') {\n // TODO: implement hover by id\n } else {\n this._activateRow(null, null);\n }\n }\n\n protected _activateRow(\n row: TableRow | null,\n index: number | null,\n event?: MouseEvent | KeyboardEvent\n ): void {\n const current = this.rowActiveState();\n const idKey = this.rowIdKey();\n\n // distinctUntilChanged equivalent\n if (current.row && row) {\n if (idKey && current.row[idKey] === row[idKey]) return;\n if (\n !idKey &&\n this.generateRowId() &&\n current.row._id === row._id\n )\n return;\n }\n if (!current.row && !row && current.index === index) return;\n\n this.rowActiveState.set({ row, index, event });\n }\n\n /** sortByKey - Sort by key in table row */\n sortByKey(key: keyof TableRow, $event?: MouseEvent): void {\n const shiftKey = $event?.shiftKey === true;\n const currentOrder = this.sortOrder();\n let sortOrderVal: GtOrder = 'asc';\n let newOrder: GtSortOrder = [];\n\n if (shiftKey) {\n const existingSortPosition = currentOrder.findIndex(\n (value) => value.key === key\n );\n if (existingSortPosition === -1) {\n newOrder = [...currentOrder, { key, order: 'asc' }];\n } else {\n sortOrderVal = currentOrder[existingSortPosition].order;\n const newSortOrder = sortOrderVal === 'asc' ? 'desc' : 'asc';\n newOrder = [...currentOrder];\n newOrder[existingSortPosition] = {\n ...newOrder[existingSortPosition],\n order: newSortOrder,\n };\n }\n } else {\n if (currentOrder.length > 0) {\n const existingSortPosition = currentOrder.findIndex(\n (value) => value.key === key\n );\n if (existingSortPosition === -1) {\n newOrder = [{ key, order: 'asc' }];\n } else {\n sortOrderVal = currentOrder[existingSortPosition].order;\n const newSortOrder = sortOrderVal === 'asc' ? 'desc' : 'asc';\n newOrder = [{ key, order: newSortOrder }];\n }\n } else {\n newOrder = [{ key, order: sortOrderVal }];\n }\n }\n\n const sortEvent: GtSortEvent = {\n key,\n order: sortOrderVal,\n currentSortOrder: newOrder,\n addSortKey: shiftKey,\n };\n\n if ($event) {\n sortEvent.event = $event;\n }\n this.columnSort.emit(sortEvent);\n\n if (!this.tableInfo?.lazyLoaded) {\n this.sortOrder.set(newOrder);\n this.sortOrderChange.emit(newOrder);\n }\n }\n\n private _columnOrder = (\n a: KeyValue<string, TableColumn>,\n b: KeyValue<string, TableColumn>\n ): number => {\n return (a.value.order || 0) - (b.value.order || 0);\n };\n\n protected orderedColumns = computed(() => {\n const config = this.config();\n if (!config.columns) return [];\n return Object.entries(config.columns)\n .map(([key, value]) => ({ key, value }) as KeyValue<string, TableColumn>)\n .sort(this._columnOrder);\n });\n\n protected orderedRows = computed(() => {\n const config = this.config();\n if (!config.rows) return [];\n return Object.entries(config.rows)\n .map(([key, value]) => ({ key, value }) as KeyValue<string, TableColumn>)\n .sort(this._columnOrder);\n });\n\n nestedValue(\n object: any,\n mapTo: string,\n missingValue: string | number | null = null\n ): unknown {\n const levels = mapTo.split('.');\n return levels.reduce(\n (previousValue, currentValue, index) =>\n previousValue[currentValue] ||\n (index === levels.length - 1 ? missingValue : {}),\n object\n );\n }\n\n // ─── Keyboard Navigation ───\n\n private _unsubscribeFromKeyboardEvents$ = new Subject<void>();\n private _keyboardArrowEvent$ = fromEvent<KeyboardEvent>(\n document,\n 'keydown'\n ).pipe(\n filter(\n (event) =>\n [...this.navigationKeys(), ...this.selectKeys()].indexOf(event.key) > -1\n )\n );\n\n protected listenToKeyboardEvents(): void {\n if (!this.config()?.activateRowOnKeyboardNavigation) {\n return;\n }\n\n this._unsubscribeFromKeyboardEvents$.next();\n this._keyboardArrowEvent$\n .pipe(\n takeUntil(this._unsubscribeFromKeyboardEvents$),\n takeUntil(this._unsubscribe$)\n )\n .subscribe((event) => {\n const rows = this.processedData();\n const currentPage = this.boundedPaginationIndex();\n const tableInfo = this.tableInfo;\n\n const selectEvent = this.selectKeys().includes(event.key);\n if (selectEvent && this.activeRowIndex !== null) {\n const rowIndex =\n this.activeRowIndex + currentPage * (tableInfo?.pageSize ?? 0);\n this._rowSelect(rows[rowIndex], rowIndex, event);\n return;\n }\n\n const navigationEvent = this.navigationKeys().includes(event.key);\n if (navigationEvent) {\n this._handleNavigationEvent(event, rows, currentPage, tableInfo);\n }\n });\n }\n\n unsubscribeFromKeyboardEvents(tableRef: HTMLTableElement): void {\n if (!this.config()?.activateRowOnKeyboardNavigation) {\n return;\n }\n if (tableRef !== document.activeElement) {\n if (this.config()?.activateRowOnHover) {\n this.activateRow(null);\n }\n this._unsubscribeFromKeyboardEvents$.next();\n }\n }\n\n private _handleNavigationEvent(\n event: KeyboardEvent,\n rows: any[],\n currentPage: number,\n tableInfo: any\n ): void {\n const hasPagination = (tableInfo?.pageTotal || 0) > 1 && tableInfo;\n const lastRowIndex = rows.length - 1;\n let newIndex = this.activeRowIndex;\n let indexModifier = 0;\n\n if (event.key === 'Home') {\n this.paginationIndex = 0;\n this.activateRow(0, event);\n return;\n }\n\n if (event.key === 'End') {\n const indexOfLastRecord = hasPagination\n ? rows.length - (tableInfo.pageTotal - 1) * tableInfo.pageSize - 1\n : lastRowIndex;\n if (tableInfo?.pageTotal) {\n this.paginationIndex = tableInfo.pageTotal - 1;\n }\n this.activateRow(indexOfLastRecord, event);\n return;\n }\n\n if (event.key === 'ArrowDown') {\n indexModifier = 1;\n } else if (event.key === 'ArrowUp') {\n indexModifier = -1;\n }\n\n if (newIndex === null) {\n newIndex = 0;\n } else if (\n newIndex + indexModifier >= 0 &&\n newIndex + indexModifier <= lastRowIndex\n ) {\n newIndex = newIndex + indexModifier;\n }\n\n if (hasPagination && tableInfo?.pageSize) {\n const isNotLastPage = currentPage + 1 < tableInfo.pageTotal;\n const recordsOnLastPage =\n rows.length - (tableInfo.pageTotal - 1) * tableInfo.pageSize - 1;\n const maxIndex = isNotLastPage\n ? tableInfo?.pageSize - 1\n : recordsOnLastPage;\n\n if (event.key === 'ArrowLeft' && currentPage > 0) {\n this.paginationIndex = currentPage - 1;\n this.activateRow(newIndex, event);\n return;\n } else if (event.key === 'ArrowRight' && isNotLastPage) {\n if (\n currentPage + 1 === tableInfo.pageTotal - 1 &&\n newIndex > recordsOnLastPage\n ) {\n this.activateRow(recordsOnLastPage, event);\n }\n this.paginationIndex = currentPage + 1;\n this.activateRow(newIndex, event);\n return;\n }\n\n if (\n currentPage > 0 &&\n indexModifier < 0 &&\n newIndex + indexModifier <= lastRowIndex &&\n (this.activeRowIndex || 0) + indexModifier < 0\n ) {\n this.activateRow(tableInfo?.pageSize - 1, event);\n this.paginationIndex = currentPage - 1;\n return;\n }\n\n const pageIndex = newIndex % tableInfo?.pageSize;\n\n if (newIndex > maxIndex && currentPage + 1 < tableInfo.pageTotal) {\n this.paginationIndex = currentPage + 1;\n }\n this.activateRow(pageIndex > maxIndex ? maxIndex : pageIndex, event);\n return;\n }\n\n this.activateRow(newIndex, event);\n }\n\n ngOnDestroy() {\n this._unsubscribe$.next();\n this._unsubscribe$.complete();\n this._unsubscribeFromKeyboardEvents$.next();\n this._unsubscribeFromKeyboardEvents$.complete();\n }\n}\n","@let tableData = table();\n@let configValue = config();\n@let isLoading = loading();\n@let sortOrderValue = sortOrder();\n@let searchValue = searchTerm();\n@let rowActiveValue = rowActiveState();\n@let calculationsValue = calculations();\n@let colspanValue = colspan();\n@let footerColspanValue = footerColspan();\n@let paginationIdx = boundedPaginationIndex();\n\n<table\n [class]=\"configValue?.class || 'table'\"\n [class.table-mobile]=\"configValue?.mobileLayout\"\n [class.table-horizontal]=\"configValue?.rows\"\n [class.table-loading]=\"isLoading\"\n [class.gt-sticky-row-header]=\"configValue?.stickyHeaders?.row && configValue?.rows\"\n [class.gt-sticky-column-header]=\"configValue?.stickyHeaders?.column\"\n [attr.aria-busy]=\"isLoading === true ? true : null\"\n [tabindex]=\"configValue?.activateRowOnKeyboardNavigation ? 0 : -1\"\n #tableRef\n (focus)=\"listenToKeyboardEvents()\"\n (focusout)=\"unsubscribeFromKeyboardEvents(tableRef)\"\n (mouseenter)=\"listenToKeyboardEvents()\"\n (mouseleave)=\"unsubscribeFromKeyboardEvents(tableRef)\"\n>\n <thead>\n <tr>\n @if (configValue?.columns) {\n @for (column of orderedColumns(); track column.key) {\n @if (!column.value?.hidden) {\n <th\n class=\"{{ (column.key | dashCase) + '-column' }} {{ column.value.class }}\"\n [class.disabled]=\"isLoading\"\n [attr.aria-sort]=\"sortOrderValue | sortClass: column.key:'aria'\"\n [class.gt-sortable]=\"true\"\n scope=\"col\"\n >\n @if (column.value?.headerReplaceFull && (column.value?.headerComponent || column.value?.headerTemplateRef)) {\n @if (column.value.headerComponent) {\n <ng-container\n [ngComponentOutlet]=\"column.value.headerComponent!\"\n [ngComponentOutletInputs]=\"{\n column: column,\n sortable: !!column.value.sortable,\n sortOrder: sortOrderValue,\n search: searchValue,\n sort: headerSortFn(column.key),\n ...(column.value.headerComponentInputs || {})\n }\"\n ></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"column.value.headerTemplateRef!\"\n [ngTemplateOutletContext]=\"{\n column: column,\n sortable: !!column.value.sortable,\n sortOrder: sortOrderValue,\n search: searchValue,\n sort: headerSortFn(column.key)\n }\"\n ></ng-container>\n }\n } @else if (column.value?.sortable) {\n <button\n [attr.data-sort-order]=\"sortOrderValue | sortClass: column.key:'order'\"\n class=\"gt-sort\"\n (click)=\"isLoading || !column.value.sortable || sortByKey(column.key, $event)\"\n >\n @if (column.value?.headerComponent) {\n <ng-container\n [ngComponentOutlet]=\"column.value.headerComponent!\"\n [ngComponentOutletInputs]=\"{\n column: column,\n sortable: true,\n sortOrder: sortOrderValue,\n search: searchValue,\n ...(column.value.headerComponentInputs || {})\n }\"\n ></ng-container>\n } @else if (column.value?.headerTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"column.value.headerTemplateRef\"\n [ngTemplateOutletContext]=\"{\n column: column,\n sortable: true,\n sortOrder: sortOrderValue,\n search: searchValue\n }\"\n ></ng-container>\n } @else if (column.value?.header !== false) {\n <span>{{ column.value.header || column.key | capitalCase }}</span>\n }\n </button>\n } @else {\n @if (column.value?.headerComponent) {\n <ng-container\n [ngComponentOutlet]=\"column.value.headerComponent!\"\n [ngComponentOutletInputs]=\"{\n column: column,\n sortable: false,\n sortOrder: sortOrderValue,\n search: searchValue,\n ...(column.value.headerComponentInputs || {})\n }\"\n ></ng-container>\n } @else if (column.value?.headerTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"column.value.headerTemplateRef\"\n [ngTemplateOutletContext]=\"{\n column: column,\n sortable: false,\n sortOrder: sortOrderValue,\n search: searchValue\n }\"\n ></ng-container>\n } @else if (column.value?.header !== false) {\n <span>{{ column.value.header || column.key | capitalCase }}</span>\n }\n }\n </th>\n }\n }\n }\n @if (configValue?.rows) {\n @let headerRow = orderedRows()[0];\n @if (headerRow) {\n <th\n class=\"row-header\"\n [attr.aria-sort]=\"sortOrderValue | sortClass: headerRow.key:'aria'\"\n class=\"{{ headerRow.value.sortable ? 'sort ' : '' }} {{ sortOrderValue | sortClass: headerRow.key }} {{ (headerRow.key | dashCase) + '-column' }}\"\n (click)=\"isLoading || !headerRow.value.sortable || sortByKey(headerRow.key, $event)\"\n scope=\"col\"\n >\n @if (headerRow.value?.headerComponent) {\n <ng-container\n [ngComponentOutlet]=\"headerRow.value.headerComponent!\"\n [ngComponentOutletInputs]=\"{\n column: headerRow,\n sortable: !!headerRow.value.sortable,\n sortOrder: sortOrderValue,\n search: searchValue,\n sort: headerSortFn(headerRow.key),\n ...(headerRow.value.headerComponentInputs || {})\n }\"\n ></ng-container>\n } @else if (headerRow.value?.headerTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"headerRow.value.headerTemplateRef\"\n [ngTemplateOutletContext]=\"{\n column: headerRow,\n sortable: !!headerRow.value.sortable,\n sortOrder: sortOrderValue,\n search: searchValue,\n sort: headerSortFn(headerRow.key)\n }\"\n ></ng-container>\n } @else if (headerRow?.value?.header !== false) {\n {{ headerRow?.value?.header || headerRow.key | capitalCase }}\n }\n </th>\n @for (column of (tableData?.data || [])[0]; track $index) {\n <th class=\"{{ headerRow.value.class }}\">\n @if ((configValue.rows || {})[headerRow.key].component) {\n <ng-container\n [ngComponentOutlet]=\"(configValue.rows || {})[headerRow.key].component!\"\n [ngComponentOutletInputs]=\"{\n row: column,\n col: headerRow,\n index: 0,\n data: (tableData?.data || [])[0],\n search: searchValue,\n ...((configValue.rows || {})[headerRow.key].componentInputs || {})\n }\"\n ></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"\n (configValue.rows || {})[headerRow.key].templateRef\n ? templateRef\n : (configValue.rows || {})[headerRow.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: headerRow,\n transform: (configValue.rows || {})[headerRow.key].transform,\n templateRef: (configValue.rows || {})[headerRow.key].templateRef,\n index: 0\n }\"\n ></ng-container>\n }\n </th>\n }\n }\n }\n </tr>\n </thead>\n @if (isLoading) {\n <tbody>\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspanValue\">\n <ng-content select=\".table-loading\"></ng-content>\n </td>\n </tr>\n </tbody>\n } @else {\n @if (tableData && (tableData.data[0] || tableData.data).length > 0) {\n <tbody>\n @if (configValue?.columns) {\n @for (row of tableData.data[tableData.info.lazyLoaded ? 0 : paginationIdx]; track trackRowByFn($index, row); let i = $index) {\n <tr\n [attr.id]=\"'tableRow_' + i\"\n (click)=\"configValue?.rowClick && _rowClick(row, i, $event)\"\n (mouseenter)=\"configValue?.activateRowOnHover && _activateRow(row, i, $event)\"\n (mouseleave)=\"configValue?.activateRowOnHover && _activateRow(null, null, $event)\"\n [class]=\"[\n !!isRowSelectedFn()\n ? (row | rowSelection: selection(): isRowSelectedFn()!: customClasses().selectedRow)\n : '',\n rowActiveValue?.index === i ? customClasses().activeRow : ''\n ]\"\n >\n @for (column of orderedColumns(); track column.key) {\n @if (!column.value?.hidden) {\n <td\n class=\"{{ (column.key | dashCase) + '-column' }} {{ column.value.class }}\"\n [attr.data-label]=\"\n configValue.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n >\n @if ((configValue.columns || {})[column.key].component) {\n <ng-container\n [ngComponentOutlet]=\"(configValue.columns || {})[column.key].component!\"\n [ngComponentOutletInputs]=\"{\n row: row,\n col: column,\n index: i,\n data: tableData.data[tableData.info.lazyLoaded ? 0 : paginationIdx],\n search: searchValue,\n ...((configValue.columns || {})[column.key].componentInputs || {})\n }\"\n ></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"\n searchValue && !(configValue.columns || {})[column.key].templateRef\n ? highlighted\n : (configValue.columns || {})[column.key].templateRef\n ? templateRef\n : (configValue.columns || {})[column.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: row,\n column: column,\n search: searchValue,\n transform: (configValue.columns || {})[column.key].transform,\n templateRef: (configValue.columns || {})[column.key].templateRef,\n index: i,\n data: tableData.data[tableData.info.lazyLoaded ? 0 : paginationIdx]\n }\"\n ></ng-container>\n }\n </td>\n }\n }\n </tr>\n }\n }\n @if (configValue?.rows) {\n @for (row of orderedRows() | slice: 1; track row.key; let i = $index) {\n @if (!row.value?.hidden) {\n <tr\n [attr.id]=\"'tableRow_' + i\"\n class=\"{{ (row.key | dashCase) + '-row' }}\"\n (click)=\"configValue?.rowClick && _rowClick(row, i, $event)\"\n (mouseenter)=\"configValue?.activateRowOnHover && _activateRow(row, i, $event)\"\n (mouseleave)=\"configValue?.activateRowOnHover && _activateRow(null, null, $event)\"\n [class]=\"[\n !!isRowSelectedFn()\n ? (row | rowSelection: selection(): isRowSelectedFn()!: customClasses().selectedRow)\n : '',\n rowActiveValue?.index === i ? customClasses().activeRow : ''\n ]\"\n >\n <th class=\"row-header\" scope=\"row\">\n @if (row.value?.headerComponent) {\n <ng-container\n [ngComponentOutlet]=\"row.value.headerComponent!\"\n [ngComponentOutletInputs]=\"{\n column: row,\n sortable: false,\n sortOrder: sortOrderValue,\n search: searchValue,\n ...(row.value.headerComponentInputs || {})\n }\"\n ></ng-container>\n } @else if (row.value?.headerTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"row.value.headerTemplateRef\"\n [ngTemplateOutletContext]=\"{\n column: row,\n sortable: false,\n sortOrder: sortOrderValue,\n search: searchValue\n }\"\n ></ng-container>\n } @else {\n {{ row.value.header || row.key | capitalCase }}\n }\n </th>\n @for (column of (tableData?.data || [])[0]; track $index; let y = $index) {\n <td class=\"{{ row.value.class }}\">\n @if ((configValue.rows || {})[row.key].component) {\n <ng-container\n [ngComponentOutlet]=\"(configValue.rows || {})[row.key].component!\"\n [ngComponentOutletInputs]=\"{\n row: column,\n col: row,\n index: configValue.rows ? y : i,\n data: tableData.data[tableData.info.lazyLoaded ? 0 : paginationIdx],\n search: searchValue,\n ...((configValue.rows || {})[row.key].componentInputs || {})\n }\"\n ></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"\n (configValue.rows || {})[row.key].templateRef\n ? templateRef\n : (configValue.rows || {})[row.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: row,\n transform: (configValue.rows || {})[row.key].transform,\n templateRef: (configValue.rows || {})[row.key].templateRef,\n index: configValue.rows ? y : i,\n data: tableData.data[tableData.info.lazyLoaded ? 0 : paginationIdx]\n }\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n }\n }\n }\n </tbody>\n } @else {\n <tbody>\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspanValue\">\n <ng-content select=\".table-no-data\"></ng-content>\n </td>\n </tr>\n </tbody>\n }\n }\n @if (tableData && tableData.data.length > 0 && !isLoading) {\n <tfoot>\n @for (calculation of calculationsValue.calculations; track calculation; let i = $index) {\n @let showHeader = colspanValue !== footerColspanValue;\n <tr>\n @if (showHeader) {\n <th\n [colSpan]=\"(colspanValue || 0) - (footerColspanValue || 0)\"\n scope=\"row\"\n >\n @if (configValue?.footer?.headers?.[calculation]) {\n {{ configValue.footer!.headers![calculation] === true ? (calculation | capitalCase) : configValue.footer!.headers![calculation] }}\n }\n </th>\n }\n @for (column of orderedColumns(); track column.key) {\n @if (!column.value?.hidden && calculationsValue.calculated[column.key]) {\n <td\n class=\"{{ (column.key | dashCase) + '-column' }} {{ column.value.class }}\"\n [attr.data-header]=\"\n !showHeader && configValue?.footer?.headers?.[calculation]\n ? configValue.footer!.headers![calculation] === true ? (calculation | capitalCase) : configValue.footer!.headers![calculation]\n : null\n \"\n [attr.data-label]=\"\n configValue?.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n [class.gt-no-content]=\"!calculationsValue.calculated[column.key][calculation]\"\n >\n @if ((configValue?.columns || {})[column.key].component) {\n <ng-container\n [ngComponentOutlet]=\"(configValue?.columns || {})[column.key].component!\"\n [ngComponentOutletInputs]=\"{\n value: calculationsValue.calculated[column.key][calculation],\n row: calculationsValue.calculated[column.key],\n col: column,\n column: calculation,\n index: i,\n search: searchValue,\n ...((configValue?.columns || {})[column.key].componentInputs || {})\n }\"\n ></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"\n (configValue?.columns || {})[column.key].templateRef\n ? templateRef\n : (configValue?.columns || {})[column.key].transform\n ? transformFooter\n : rawFooter\n \"\n [ngTemplateOutletContext]=\"{\n value: calculationsValue.calculated[column.key][calculation],\n row: calculationsValue.calculated[column.key],\n column: calculation,\n templateRef: (configValue?.columns || {})[column.key].templateRef,\n transform: (configValue?.columns || {})[column.key].transform\n }\"\n ></ng-container>\n }\n </td>\n }\n }\n </tr>\n }\n </tfoot>\n }\n</table>\n<ng-template\n #highlighted\n let-row=\"row\"\n let-column=\"column\"\n let-search=\"search\"\n let-transform=\"transform\"\n>\n @if (!transform) {\n <div [innerHTML]=\"row[column.key] | highlight: search\"></div>\n } @else {\n <div [innerHTML]=\"row[column.key] | dynamicPipe: transform.pipe:transform?.args | highlight: search\"></div>\n }\n</ng-template>\n<ng-template #rawData let-row=\"row\" let-column=\"column\">\n {{ row[column.key] }}\n</ng-template>\n<ng-template\n #transformData\n let-row=\"row\"\n let-column=\"column\"\n let-transform=\"transform\"\n let-data=\"data\"\n>\n {{ row[column.key] | dynamicPipe: transform.pipe:transform?.args }}\n</ng-template>\n<ng-template #transformFooter let-value=\"value\" let-transform=\"transform\">\n {{ (value | dynamicPipe: transform.pipe:transform?.args) || config()?.footer?.emptyContent }}\n</ng-template>\n<ng-template #rawFooter let-value=\"value\">\n {{ value || config()?.footer?.emptyContent }}\n</ng-template>\n<ng-template\n #templateRef\n let-row=\"row\"\n let-column=\"column\"\n let-index=\"index\"\n let-templateRef=\"templateRef\"\n let-data=\"data\"\n>\n <ng-container\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{\n row: row,\n col: column,\n index: index,\n data: data\n }\"\n ></ng-container>\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n TemplateRef,\n} from '@angular/core';\nimport { TableRow } from '../models/table-row.interface';\nimport { NgTemplateOutlet, PercentPipe } from '@angular/common';\n\nexport interface GtDelta {\n relative: number | string;\n absolute: number;\n}\n\n@Component({\n selector: 'gt-delta',\n template: `\n @let delta = value();\n @if (delta) {\n <span\n [class]=\"[\n classes().span,\n delta.absolute > 0\n ? classes().positive\n : delta.absolute < 0\n ? classes().negative\n : null\n ]\"\n [class.gt-delta-positive]=\"delta.absolute > 0\"\n [class.gt-delta-negative]=\"delta.absolute < 0\"\n >\n <ng-container\n [ngTemplateOutlet]=\"deltaTemplate() || defaultTemplate\"\n [ngTemplateOutletContext]=\"{ delta }\"\n ></ng-container>\n </span>\n <ng-template #defaultTemplate let-delta=\"delta\">\n @if (delta.relative !== null && delta.relative !== undefined) {\n @if (typeof delta.relative === 'number') {\n <span>{{ delta.relative | percent: '1.0-2' }}</span>\n } @else {\n <span>{{ delta.relative }}</span>\n }\n }\n </ng-template>\n }\n `,\n styles: [\n `\n :host {\n display: inline-block;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [PercentPipe, NgTemplateOutlet],\n})\nexport class GtDeltaComponent {\n readonly data = input<Array<TableRow>>([]);\n readonly index = input(0);\n readonly baseIndex = input<number | undefined>(undefined);\n readonly classes = input({\n span: 'gt-delta',\n positive: 'text-success',\n negative: 'text-danger',\n });\n readonly key = input('value');\n readonly notApplicableValue = input<string | null>(null);\n readonly initialValue = input<string | number | null>(null);\n readonly deltaTemplate = input<TemplateRef<any> | undefined>(undefined);\n\n readonly value = computed<GtDelta | undefined>(() => {\n const data = this.data();\n if (!data || data.length === 0) return undefined;\n\n const index = this.index();\n const baseIndex = this.baseIndex();\n const key = this.key();\n const initialValue = this.initialValue();\n\n const deltaValue =\n index === 0\n ? initialValue\n : (data[index][key] as number) -\n (baseIndex === undefined\n ? (data[index - 1][key] as number)\n : (data[baseIndex][key] as number));\n const baseValue =\n index === 0\n ? 1\n : baseIndex === undefined\n ? (data[index - 1][key] as number)\n : (data[baseIndex][key] as number);\n\n const relative =\n index === 0\n ? initialValue\n : Math.sign(deltaValue as number) *\n Math.abs((deltaValue as number) / baseValue);\n\n return {\n relative: Number.isFinite(relative)\n ? (relative as number)\n : index === 0\n ? (initialValue as number | string)\n : (this.notApplicableValue() as string),\n absolute: deltaValue as number,\n };\n });\n}\n","import { NgModule } from '@angular/core';\nimport { CoreComponent } from './core.component';\nimport { GtDeltaComponent } from './gt-delta/gt-delta.component';\n\n@NgModule({\n imports: [CoreComponent, GtDeltaComponent],\n exports: [CoreComponent, GtDeltaComponent],\n})\nexport class GenericTableCoreModule {}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { CoreComponent } from '../core.component';\nimport {\n GtPaginationAriaLabels,\n GtPaginationClasses,\n GtPaginationInfo,\n} from '../models/gt-pagination';\n\n@Component({\n selector: 'angular-generic-table-pagination',\n templateUrl: './pagination.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PaginationComponent {\n readonly table = input.required<CoreComponent>();\n\n readonly pagingInfo = input<GtPaginationInfo | undefined>(undefined);\n readonly paginationLength = input(5);\n readonly classes = input<GtPaginationClasses>({\n ul: 'pagination',\n li: 'page-item',\n button: 'page-link',\n });\n readonly ariaLabels = input<GtPaginationAriaLabels>({\n nav: 'Table pagination',\n button: 'Go to page ',\n });\n\n /** Page numbers to display in the pagination component */\n protected paginationListItems = computed(() => {\n const tbl = this.table();\n const info = tbl.tableInfoSignal();\n const currentPage = tbl.boundedPaginationIndex();\n return this._generateList(info.pageTotal, currentPage);\n });\n\n /** Current page from the table */\n protected currentPosition = computed(() => {\n return this.table().boundedPaginationIndex();\n });\n\n private _generateList(\n numberOfPages: number,\n currentPosition: number\n ): Array<number> {\n const paginationLen = this.paginationLength();\n const middle = Math.floor(paginationLen / 2);\n const length =\n numberOfPages < paginationLen ? numberOfPages : paginationLen;\n\n return Array.from({ length }, (_, i) => {\n if (i === 0) {\n return 1;\n } else if (numberOfPages < paginationLen) {\n return i + 1;\n } else if (i + 1 === length) {\n return numberOfPages;\n } else if (\n currentPosition > middle &&\n currentPosition < numberOfPages - middle\n ) {\n return i + currentPosition - (middle - 1);\n } else if (\n currentPosition > middle &&\n currentPosition < numberOfPages - (middle - 1)\n ) {\n return i + currentPosition - middle;\n } else if (\n currentPosition > middle &&\n currentPosition === numberOfPages - (middle - 1)\n ) {\n return i + currentPosition - (middle + 1);\n } else if (\n currentPosition > middle &&\n currentPosition === numberOfPages - 1\n ) {\n return i + currentPosition - (middle + 2);\n } else {\n return i + 1;\n }\n });\n }\n\n goToPage(index: number): void {\n const tbl = this.table();\n if (tbl) {\n tbl.paginationIndex = index - 1;\n }\n }\n}\n","@let links = paginationListItems();\n@let currentPos = currentPosition();\n@let classesValue = classes();\n@let ariaLabelsValue = ariaLabels();\n\n@if (links && links.length > 1) {\n <nav\n role=\"navigation\"\n [attr.aria-label]=\"ariaLabelsValue.nav\"\n class=\"gt-pagination\"\n [class]=\"classesValue.nav\"\n >\n <ul [class]=\"classesValue.ul\">\n @for (position of links; track position; let i = $index; let last = $last) {\n <li\n [class]=\"classesValue.li\"\n [class.active]=\"position === (currentPos || 0) + 1\"\n >\n <button\n [class]=\"classesValue.button\"\n [attr.aria-label]=\"ariaLabelsValue.button + position\"\n (click)=\"goToPage(position)\"\n >\n {{ position }}\n </button>\n </li>\n @if (position + 1 !== links[i + 1] && !last) {\n <li [class]=\"classesValue.li\" class=\"gt-ellipsis\">\n <button [class]=\"classesValue.button\" disabled tabindex=\"-1\"></button>\n </li>\n }\n }\n </ul>\n </nav>\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PaginationComponent } from './pagination.component';\n\n@NgModule({\n imports: [CommonModule, PaginationComponent],\n exports: [PaginationComponent],\n})\nexport class GenericTablePaginationModule {}\n","/*\n * Public API Surface of core\n */\n\nexport * from './lib/core.component';\nexport * from './lib/core.module';\nexport * from './lib/gt-delta/gt-delta.component';\nexport * from './lib/pagination/pagination.component';\nexport * from './lib/pagination/pagination.module';\nexport * from './lib/models/table-config.interface';\nexport * from './lib/models/table-column.interface';\nexport * from './lib/models/table-info.interface';\nexport * from './lib/models/table-row.interface';\nexport * from './lib/models/table-sort.interface';\nexport * from './lib/models/table-meta.interface';\nexport * from './lib/models/table-events.interface';\nexport * from './lib/models/gt-pagination';\nexport * from './lib/utilities/utilities';\nexport * from './lib/pipes/capital-case.pipe';\nexport * from './lib/pipes/dash-case.pipe';\nexport * from './lib/pipes/dynamic.pipe';\nexport * from './lib/pipes/highlight.pipe';\nexport * from './lib/pipes/sort-class.pipe';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"angular-generic-table-core.mjs","sources":["../../../projects/core/src/lib/utilities/utilities.ts","../../../projects/core/src/lib/pipes/capital-case.pipe.ts","../../../projects/core/src/lib/pipes/sort-class.pipe.ts","../../../projects/core/src/lib/pipes/dash-case.pipe.ts","../../../projects/core/src/lib/pipes/dynamic.pipe.ts","../../../projects/core/src/lib/pipes/highlight.pipe.ts","../../../projects/core/src/lib/pipes/row-selection.pipe.ts","../../../projects/core/src/lib/core.component.ts","../../../projects/core/src/lib/core.component.html","../../../projects/core/src/lib/gt-delta/gt-delta.component.ts","../../../projects/core/src/lib/core.module.ts","../../../projects/core/src/lib/pagination/pagination.component.ts","../../../projects/core/src/lib/pagination/pagination.component.html","../../../projects/core/src/lib/pagination/pagination.module.ts","../../../projects/core/src/public-api.ts","../../../projects/core/src/angular-generic-table-core.ts"],"sourcesContent":["import { TableRow } from '../models/table-row.interface';\nimport { TableConfig } from '../models/table-config.interface';\nimport { GtSortConfig, GtSortOrder } from '../models/table-sort.interface';\nimport { GtSortEvent } from '../models/table-events.interface';\nexport let dashed: (s: string) => string;\ndashed = (s: string) => s.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n\nexport let capitalize: (s: string) => string;\ncapitalize = (s) =>\n (s.charAt(0).toUpperCase() + s.slice(1))\n .replace(/_/g, ' ')\n .replace(/([A-Z][a-z]+)/g, ' $1')\n .replace(/([A-Z]{2,})/g, ' $1')\n .replace(/\\s{2,}/g, ' ')\n .trim();\n\nexport let chunk: (\n array: Array<any>,\n chunkSize: number\n) => Array<Array<TableRow>>;\nchunk = (array, chunkSize) => {\n if (chunkSize < 0) {\n throw new Error('Invalid chunk size');\n }\n if (chunkSize === 0 && !chunkSize) {\n return [array];\n }\n const CHUNK = [];\n for (let i = 0, len = array.length; i < len; i += chunkSize) {\n CHUNK.push(array.slice(i, i + chunkSize));\n }\n return CHUNK;\n};\n\nexport let search: (\n text: string,\n caseSensitive: boolean,\n data: Array<TableRow>,\n config: TableConfig\n) => TableRow[];\nsearch = (\n text: string,\n caseSensitive: boolean,\n data: Array<TableRow>,\n config: TableConfig\n) => {\n if (config.columns) {\n const searchColumns = Object.keys(config.columns).filter(\n // @ts-ignore\n (key) =>\n config.columns &&\n !config.columns[key]?.hidden &&\n config.columns[key]?.search !== false\n );\n\n const FILTERED = [];\n for (let i = 0; i < data.length; i++) {\n const row = data[i];\n const match =\n Object.entries(row)\n .filter(([key, value]) => searchColumns.indexOf(key) !== -1)\n .reduce((acc, [key, value], index): string => {\n const search = config?.columns![key]?.search;\n // if search is a function...\n if (typeof search === 'function') {\n // ...use search function to return value to search\n value = search(row, key, value);\n }\n return (\n acc +\n (index === 0 ? '' : ' ? ') +\n (caseSensitive ? value + '' : (value + '').toLowerCase())\n );\n }, '')\n .indexOf(caseSensitive ? text : text.toLowerCase()) !== -1;\n if (match) {\n FILTERED[FILTERED.length] = row;\n }\n }\n return FILTERED;\n } else {\n return data;\n }\n};\n\nexport let calculate = (data: Array<TableRow>, config: TableConfig) => {\n const CALCULATIONS: { [key: string]: boolean } = {};\n const COLUMN_CALCULATIONS: { [key: string]: Array<string> } = {};\n let CALCULATED = Object.entries(config.footer?.columns || {})\n .filter(\n ([columnName, calculations]) =>\n Object.values(calculations || {}).filter((value) => value !== false)\n .length >= 0\n )\n .reduce((acc: any, [columnName, calculations], index) => {\n acc[columnName] = Object.entries(calculations || {})\n .filter(([calculation, value]) => value !== false)\n .reduce((acc: any, [calculation, value]) => {\n if (COLUMN_CALCULATIONS[columnName]) {\n COLUMN_CALCULATIONS[columnName].push(calculation);\n } else if (value === true) {\n COLUMN_CALCULATIONS[columnName] = [calculation];\n }\n CALCULATIONS[calculation] = true;\n if (typeof value === 'function') {\n value = value(data, columnName);\n }\n acc[calculation] = value === true ? 0 : value;\n return acc;\n }, {});\n return acc;\n }, {});\n if (Object.keys(CALCULATED).length > 0) {\n for (let i = 0; i < data.length; i++) {\n Object.entries(COLUMN_CALCULATIONS).forEach(([column, calculations]) => {\n if (calculations.indexOf('sum') > -1) {\n CALCULATED[column].sum += data[i][column];\n }\n if (\n calculations.indexOf('avg') > -1 &&\n calculations.indexOf('sum') === -1\n ) {\n if (CALCULATED[column].sum === undefined) {\n CALCULATED[column].sum = 0;\n }\n CALCULATED[column].sum += data[i][column];\n }\n if (\n calculations.indexOf('max') > -1 &&\n (!CALCULATED[column].max || +data[i][column] > CALCULATED[column].max)\n ) {\n CALCULATED[column].max = +data[i][column];\n }\n if (\n calculations.indexOf('min') > -1 &&\n (!CALCULATED[column].min || +data[i][column] < CALCULATED[column].min)\n ) {\n CALCULATED[column].min = +data[i][column];\n }\n });\n }\n Object.entries(COLUMN_CALCULATIONS).forEach(([column, calculations]) => {\n if (calculations.indexOf('avg') !== -1) {\n CALCULATED[column].avg = CALCULATED[column]?.sum / data.length;\n // if sum is not part of calculations config...\n if (calculations.indexOf('sum') === -1 && CALCULATED[column].sum) {\n // ...remove it\n delete CALCULATED[column].sum;\n }\n }\n if (calculations.indexOf('count') !== -1) {\n CALCULATED[column].count = data.length;\n }\n });\n }\n return {\n calculated: CALCULATED,\n calculations: Object.keys(CALCULATIONS).sort(\n (a, b) =>\n (config.footer?.rowOrder?.indexOf(a) || 0) -\n (config.footer?.rowOrder?.indexOf(b) || 0)\n ),\n calculatedColumnsCount: Object.keys(CALCULATED).length || 0,\n };\n};\n\n/** sortOnMultipleKeys\n * @description Sort data on multiple keys with locale-aware alphanumeric comparison\n * @param {GtSortOrder} keys - array with sort config objects to sort on, data will be sorted according to array order\n * @returns sort function\n */\nexport const sortOnMultipleKeys = (\n keys: GtSortOrder\n): ((a: TableRow, b: TableRow) => number) => {\n const order = keys.map((key) => (key.order === 'desc' ? -1 : 1));\n return (a, b) => {\n for (let i = 0; i < keys.length; i++) {\n const o = keys[i].key;\n const aVal = a[o];\n const bVal = b[o];\n if (aVal === bVal) continue;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n const cmp = aVal.localeCompare(bVal, undefined, { numeric: true, sensitivity: 'base' });\n if (cmp !== 0) return cmp * order[i];\n continue;\n }\n if (aVal > bVal) return order[i];\n if (aVal < bVal) return -order[i];\n }\n return 0;\n };\n};\n\n/** parseSortOrderParams\n * @description Convert sort order query param to array with sort config objects\n * @param sortParams - Query param string where each sort config object is separated by comma and order is indicated by + (ascending) or - (descending), e.g. _'name,-age'_\n * @returns GtSortOrder - Array with sort config objects\n */\nexport const parseSortOrderParams = (sortParams: string): GtSortOrder => {\n const sortParamsArray = sortParams.split(',');\n return sortParamsArray.map((sortParam) => {\n const [key, order] = sortParam.split(':');\n return {\n key: key.replace(/^[+-]/, ''),\n order: order === 'desc' ? 'desc' : 'asc',\n };\n });\n};\n\n/** sortOrderConfigToParam\n * @description Convert sort config object to string that can be used as query param when sorting is implemented server side\n * @param sortConfig - Sort config object\n * @returns string - Query param string where order is indicated by + (ascending) or - (descending), e.g. _'-name'_\n */\nexport const sortOrderConfigToParam = (\n sortConfig: GtSortEvent | GtSortConfig\n): string => {\n const order = sortConfig.order === 'desc' ? '-' : '+';\n return `${order}${sortConfig.key}`;\n};\n\n/** sortOrderToParams\n * @description Convert sort order array to string that can be used as query param when sorting is implemented server side\n * @param sortOrder - Array with sort config objects\n * @returns string - Query param string where each sort config object is separated by comma and order is indicated by + (ascending) or - (descending), e.g. _'name,-age'_\n */\nexport const sortOrderToParams = (sortOrder: GtSortOrder): string => {\n return sortOrder\n .map((sortConfig) => sortOrderConfigToParam(sortConfig))\n .join(',');\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { capitalize } from '../utilities/utilities';\n\n@Pipe({\n name: 'capitalCase',\n standalone: true,\n})\nexport class CapitalCasePipe implements PipeTransform {\n transform(s: string): any {\n return capitalize(s);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { GtSortOrder } from '../models/table-sort.interface';\n\n@Pipe({\n name: 'sortClass',\n standalone: true,\n})\nexport class SortClassPipe implements PipeTransform {\n transform(\n sortOrder: GtSortOrder | null,\n key: string,\n context: 'class' | 'aria' | 'order' = 'class'\n ): string | null {\n const sortIndex = sortOrder\n ? sortOrder.findIndex((s) => s.key === key)\n : -1;\n if (context === 'aria') {\n if (sortIndex === -1 || !sortOrder) {\n return null;\n } else {\n return `${sortOrder[sortIndex].order}ending`;\n }\n } else if (context === 'class') {\n if (sortIndex === -1 || !sortOrder) {\n return '';\n } else {\n return `gt-sort-${sortOrder[sortIndex].order}`;\n }\n } else {\n return (sortOrder && sortOrder?.length === 1) || sortIndex < 0\n ? null\n : sortIndex + 1 + '';\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { dashed } from '../utilities/utilities';\n\n@Pipe({\n name: 'dashCase',\n standalone: true,\n})\nexport class DashCasePipe implements PipeTransform {\n transform(s: string): any {\n return dashed(s);\n }\n}\n","import { Injector, Pipe, PipeTransform, Type } from '@angular/core';\n\n@Pipe({\n name: 'dynamicPipe',\n standalone: true,\n})\nexport class DynamicPipe implements PipeTransform {\n private _cache = new Map<Type<any>, PipeTransform>();\n\n constructor(private injector: Injector) {}\n\n transform(value: any, requiredPipe: Type<any>, pipeArgs: any[]): any {\n const cached = this._cache.get(requiredPipe);\n if (cached) {\n return cached.transform(value, ...(pipeArgs || []));\n }\n const childInjector = Injector.create({\n name: 'DynamicPipe',\n parent: this.injector,\n providers: [{ provide: requiredPipe }],\n });\n const pipe = childInjector.get(requiredPipe) as PipeTransform;\n this._cache.set(requiredPipe, pipe);\n return pipe.transform(value, ...(pipeArgs || []));\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'highlight',\n standalone: true,\n})\nexport class HighlightPipe implements PipeTransform {\n private _cachedTerm: string | null = null;\n private _cachedRegex: RegExp | null = null;\n\n transform(text: any, searchTerm: string | null): string {\n if (!searchTerm) {\n return text;\n }\n const haystackAlwaysString = text + '';\n\n if (searchTerm !== this._cachedTerm) {\n this._cachedTerm = searchTerm;\n try {\n this._cachedRegex = new RegExp(\n '(' +\n searchTerm\n .toLowerCase()\n .match(/\".*?\"|[^ ]+/g)!\n .map((needle) => needle.replace(/\"(.*?)\"/, '$1'))\n .join('|') +\n ')',\n 'ig'\n );\n } catch {\n this._cachedRegex = null;\n }\n }\n\n if (!this._cachedRegex) {\n return haystackAlwaysString;\n }\n\n const containsTagPattern = /(<.*?>)(.*)(<\\/.*?>)/gi;\n const containsTagMatches = containsTagPattern.exec(haystackAlwaysString);\n\n if (containsTagMatches) {\n return (\n containsTagMatches[1] +\n containsTagMatches[2].replace(\n this._cachedRegex,\n '<span class=\"gt-highlight-search\">$1</span>'\n ) +\n containsTagMatches[3]\n );\n }\n return haystackAlwaysString.replace(\n this._cachedRegex,\n '<span class=\"gt-highlight-search\">$1</span>'\n );\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { TableRow } from '../models/table-row.interface';\n\n@Pipe({\n name: 'rowSelection',\n standalone: true,\n})\nexport class RowSelectionPipe implements PipeTransform {\n transform(\n row: TableRow,\n selection: any,\n comparator: (row: TableRow, selection: any) => boolean,\n className?: string\n ): string {\n return className && comparator(row, selection) ? className : '';\n }\n}\n","import {\n afterNextRender,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n OnDestroy,\n output,\n signal,\n TrackByFunction,\n} from '@angular/core';\nimport {\n fromEvent,\n Observable,\n Subject,\n} from 'rxjs';\nimport {\n filter,\n takeUntil,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { TableConfig } from './models/table-config.interface';\nimport {\n KeyValue,\n NgComponentOutlet,\n NgTemplateOutlet,\n SlicePipe,\n} from '@angular/common';\nimport { TableColumn } from './models/table-column.interface';\nimport {\n calculate,\n chunk,\n search,\n sortOnMultipleKeys,\n} from './utilities/utilities';\nimport { TableRow } from './models/table-row.interface';\nimport { GtOrder, GtSortOrder } from './models/table-sort.interface';\nimport {\n GtPageChangeEvent,\n GtRowSelectEvent,\n GtRowClickEvent,\n GtRowActiveEvent,\n GtSortEvent,\n} from './models/table-events.interface';\nimport { CapitalCasePipe } from './pipes/capital-case.pipe';\nimport { SortClassPipe } from './pipes/sort-class.pipe';\nimport { DashCasePipe } from './pipes/dash-case.pipe';\nimport { DynamicPipe } from './pipes/dynamic.pipe';\nimport { HighlightPipe } from './pipes/highlight.pipe';\nimport { RowSelectionPipe } from './pipes/row-selection.pipe';\nimport { GtPaginationInfo } from './models/gt-pagination';\nimport { TableInfo } from './models/table-info.interface';\nimport { TableMeta } from './models/table-meta.interface';\n\n@Component({\n selector: 'angular-generic-table',\n templateUrl: './core.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CapitalCasePipe,\n SortClassPipe,\n DashCasePipe,\n RowSelectionPipe,\n NgComponentOutlet,\n NgTemplateOutlet,\n SlicePipe,\n DynamicPipe,\n HighlightPipe,\n ],\n})\nexport class CoreComponent implements OnDestroy {\n private _destroyRef = inject(DestroyRef);\n private _host = inject(ElementRef<HTMLElement>);\n private _unsubscribe$ = new Subject<void>();\n\n /** Initial page size used by `length: 'auto'` before the container is measured */\n private static readonly DEFAULT_AUTO_ROWS = 10;\n\n // ─── Inputs ───\n\n readonly navigationKeys = input([\n 'ArrowDown',\n 'ArrowUp',\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n ]);\n readonly selectKeys = input(['Enter', ' ']);\n readonly config = input<TableConfig<any>>({});\n readonly data = input<Array<TableRow>>([]);\n readonly searchTerm = input<string | null>(null, { alias: 'search' });\n readonly loading = input(false);\n readonly sortOrderInput = input<GtSortOrder<any>>([], { alias: 'sortOrder' });\n readonly paginationIndexInput = input(0, { alias: 'paginationIndex' });\n readonly pagingInfo = input<GtPaginationInfo | null>(null);\n readonly selection = input<any>({});\n readonly rowIdKey = input<string | undefined>(undefined);\n readonly generateRowId = input(true);\n readonly trackRowByFnInput = input<TrackByFunction<TableRow> | undefined>(\n undefined,\n { alias: 'trackRowByFn' }\n );\n readonly isRowSelectedFn = input<\n ((row: TableRow | any, selection?: any) => boolean) | undefined\n >(undefined);\n readonly customClassesInput = input<\n Partial<{ selectedRow: string; activeRow: string }>\n >({}, { alias: 'customClasses' });\n\n // ─── Outputs ───\n\n readonly rowClick = output<GtRowClickEvent>();\n readonly rowSelect = output<GtRowSelectEvent>();\n readonly sortOrderChange = output<GtSortOrder<TableRow>>();\n readonly rowActiveOutput = output<GtRowActiveEvent>({ alias: 'rowActive' });\n readonly columnSort = output<GtSortEvent>();\n readonly pageChange = output<GtPageChangeEvent>();\n\n // ─── Linked Signals (two-way state) ───\n\n protected sortOrder = linkedSignal(() => this.sortOrderInput());\n protected currentPaginationIndex = linkedSignal(() =>\n this.paginationIndexInput()\n );\n\n /** Page size measured from the container height, used when `length: 'auto'` */\n private autoPageSize = signal<number | null>(null);\n\n // ─── Computed Signals ───\n\n /** Whether pagination is in auto (fit-to-container) mode */\n protected isAutoPagination = computed(\n () => this.config().pagination?.length === 'auto'\n );\n\n protected customClasses = computed(() => ({\n selectedRow: 'gt-selected',\n activeRow: 'gt-active',\n ...this.customClassesInput(),\n }));\n\n trackRowByFn: TrackByFunction<TableRow> = (\n index: number,\n row: TableRow\n ) => {\n const customFn = this.trackRowByFnInput();\n if (customFn) return customFn(index, row);\n const idKey = this.rowIdKey();\n return idKey ? row[idKey] : row?._id;\n };\n\n /** Data with mapTo expansions and row IDs applied */\n private expandedData = computed(() => {\n let data = [...this.data()];\n const config = this.config();\n\n // mapTo expansion\n if (\n (config.columns &&\n !!Object.values(config.columns).find((column) => !!column.mapTo)) ||\n (config.rows &&\n !!Object.values(config.rows).find((column) => !!column.mapTo))\n ) {\n const newData: TableRow[] = [];\n for (let i = 0; i < data.length; i++) {\n const row = data[i];\n const newKeys = Object.entries(config.columns || config.rows || [])\n .filter(([key, value]) => !!value.mapTo)\n .reduce(\n (previousValue, [key, value]) => ({\n ...previousValue,\n [key]: this.nestedValue(\n row,\n value.mapTo!.path,\n value.mapTo?.missingValue\n ),\n }),\n {}\n );\n newData[i] = { ...row, ...newKeys };\n }\n data = newData;\n }\n\n // Generate row IDs\n if (this.generateRowId() && !this.rowIdKey() && data.length > 0) {\n const dataWithId = [];\n for (let i = 0; i < data.length; i++) {\n dataWithId[i] = { ...data[i], _id: i };\n }\n data = dataWithId;\n }\n\n return data;\n });\n\n /** Filtered data (search applied, no sort) */\n private searchedData = computed(() => {\n const data = [...this.expandedData()];\n const searchBy = this.searchTerm();\n const config = this.config();\n const lazyLoaded = this.pagingInfo() !== null;\n\n return searchBy && !lazyLoaded\n ? search(searchBy, false, data, config)\n : data;\n });\n\n /** Sorted (and already searched) data */\n private processedData = computed(() => {\n const data = this.searchedData();\n const sortBy = this.sortOrder();\n const config = this.config();\n\n if (!sortBy?.length || config?.disableTableSort) {\n return data;\n }\n return [...data].sort(sortOnMultipleKeys(sortBy));\n });\n\n /** Table meta: chunked data + config + pagination info */\n protected table = computed<TableMeta>(() => {\n const sorted = this.processedData();\n const config = this.config();\n const pi = this.pagingInfo();\n\n if (\n pi !== null &&\n pi.pageCurrent !== null &&\n pi.numberOfRecords !== null &&\n pi.pageSize !== null\n ) {\n return {\n data: [sorted],\n config,\n info: {\n lazyLoaded: true,\n numberOfRecords: pi.numberOfRecords,\n pageSize: pi.pageSize,\n pageTotal:\n pi.pageTotal ?? Math.ceil(pi.numberOfRecords / pi.pageSize),\n },\n };\n }\n\n const pag = config.pagination;\n if (!pag || pag.length === 0) {\n return {\n data: [sorted],\n config,\n info: { numberOfRecords: sorted.length, pageTotal: 1 },\n };\n }\n\n const pageSize =\n pag.length === 'auto'\n ? (this.autoPageSize() ?? CoreComponent.DEFAULT_AUTO_ROWS)\n : +(pag.length || 0);\n\n return {\n data: chunk(sorted, pageSize),\n config,\n info: {\n numberOfRecords: sorted.length,\n pageSize,\n pageTotal: Math.ceil(sorted.length / pageSize),\n },\n };\n });\n\n /** Current table info */\n readonly tableInfoSignal = computed<TableInfo>(() => this.table().info);\n\n /** Get tableInfo synchronously */\n get tableInfo(): TableInfo | undefined {\n return this.tableInfoSignal();\n }\n\n /** Calculations for footer */\n protected calculations = computed(() =>\n calculate(this.processedData(), this.config())\n );\n\n /** Bounded pagination index (clamped to valid range) */\n readonly boundedPaginationIndex = computed(() => {\n const page = this.currentPaginationIndex();\n const info = this.tableInfoSignal();\n const configLength = this.config()?.pagination?.length;\n const pageSize =\n info.pageSize ??\n (typeof configLength === 'number' ? configLength : undefined) ??\n info.numberOfRecords;\n const lastPage = Math.ceil(info.numberOfRecords / pageSize) - 1;\n return +page < 0 ? 0 : +page > lastPage ? lastPage : +page;\n });\n\n /** Number of visible columns */\n protected colspan = computed(() => {\n const config = this.config();\n if (config.columns) {\n return Object.values(config.columns || config.rows || {}).filter(\n (value) => value.hidden !== true\n ).length;\n }\n return this.processedData().length + 1;\n });\n\n /** Number of footer columns */\n protected footerColspan = computed(() => {\n const config = this.config();\n let colspan = 0;\n Object.values(config?.footer?.columns || {}).forEach((calculations) => {\n if (\n Object.values(calculations).filter((value) => value !== false).length >=\n 0\n ) {\n colspan += 1;\n }\n });\n return colspan;\n });\n\n // ─── Row Active State ───\n\n protected rowActiveState = signal<GtRowActiveEvent>({\n row: null,\n index: null,\n });\n activeRowIndex: number | null = null;\n\n // Emit rowActive output and track index\n private _rowActiveEffect = effect(() => {\n const event = this.rowActiveState();\n this.activeRowIndex = event.index;\n this.rowActiveOutput.emit(event);\n });\n\n // ─── Auto pagination (fit rows to container height) ───\n\n private _resizeObserver?: ResizeObserver;\n\n // Observe container/table size changes to recompute the auto page size\n private _setupAutoPagination = afterNextRender(() => {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n const host = this._host.nativeElement;\n this._resizeObserver = new ResizeObserver(() => {\n if (this.isAutoPagination()) {\n this._measureAutoPageSize();\n }\n });\n this._resizeObserver.observe(host);\n const table = host.querySelector('table');\n if (table) {\n this._resizeObserver.observe(table);\n }\n this._destroyRef.onDestroy(() => this._resizeObserver?.disconnect());\n });\n\n // Re-measure after render when data/config changes (e.g. async data load)\n private _autoPaginationEffect = afterRenderEffect(() => {\n this.processedData();\n if (this.isAutoPagination()) {\n this._measureAutoPageSize();\n }\n });\n\n /** Measure available height and derive how many rows fit (auto pagination) */\n private _measureAutoPageSize(): void {\n const host = this._host.nativeElement;\n const table = host.querySelector('table');\n if (!table) {\n return;\n }\n const sampleRow = table.querySelector('tbody tr') as HTMLElement | null;\n if (!sampleRow) {\n return;\n }\n const rowH = sampleRow.offsetHeight;\n const available = host.clientHeight;\n // Skip when not measurable (SSR/jsdom, hidden, or unconstrained container)\n if (rowH <= 0 || available <= 0) {\n return;\n }\n const headH = table.tHead?.offsetHeight ?? 0;\n const footH = table.tFoot?.offsetHeight ?? 0;\n const fit = Math.max(1, Math.floor((available - headH - footH) / rowH));\n this.autoPageSize.set(fit);\n }\n\n\n // ─── Public Observable Getters (backward compat, lazy-cached) ───\n\n private _sortOrder$?: Observable<GtSortOrder>;\n get sortOrder$(): Observable<GtSortOrder> {\n return (this._sortOrder$ ??= toObservable(this.sortOrder));\n }\n\n private _loading$?: Observable<boolean>;\n get loading$(): Observable<boolean> {\n return (this._loading$ ??= toObservable(this.loading));\n }\n\n private _searchBy$?: Observable<string | null>;\n get searchBy$(): Observable<string | null> {\n return (this._searchBy$ ??= toObservable(this.searchTerm));\n }\n\n private _tableConfig$?: Observable<TableConfig>;\n get tableConfig$(): Observable<TableConfig> {\n return (this._tableConfig$ ??= toObservable(this.config));\n }\n\n private _data$?: Observable<Array<TableRow>>;\n get data$(): Observable<Array<TableRow>> {\n return (this._data$ ??= toObservable(this.processedData));\n }\n\n private _table$?: Observable<TableMeta>;\n get table$(): Observable<TableMeta> {\n return (this._table$ ??= toObservable(this.table));\n }\n\n private _tableInfo$?: Observable<TableInfo>;\n get tableInfo$(): Observable<TableInfo> {\n return (this._tableInfo$ ??= toObservable(this.tableInfoSignal));\n }\n\n private _currentPaginationIndex$?: Observable<number>;\n get currentPaginationIndex$(): Observable<number> {\n return (this._currentPaginationIndex$ ??= toObservable(this.boundedPaginationIndex));\n }\n\n private _calculations$?: Observable<ReturnType<typeof calculate>>;\n get calculations$(): Observable<ReturnType<typeof calculate>> {\n return (this._calculations$ ??= toObservable(this.calculations));\n }\n\n private _rowActive$?: Observable<GtRowActiveEvent>;\n get rowActive$(): Observable<GtRowActiveEvent> {\n return (this._rowActive$ ??= toObservable(this.rowActiveState));\n }\n\n private _colspan$?: Observable<number>;\n get colspan$(): Observable<number> {\n return (this._colspan$ ??= toObservable(this.colspan));\n }\n\n // ─── Pagination ───\n\n get paginationIndex(): number {\n return this.currentPaginationIndex();\n }\n set paginationIndex(value: number) {\n this.currentPaginationIndex.set(value);\n this.pageChange.emit({ index: this.boundedPaginationIndex() });\n }\n\n // ─── Methods ───\n\n protected headerSortFn(key: string): (event: MouseEvent) => void {\n return (event: MouseEvent) => this.sortByKey(key, event);\n }\n\n _rowClick(row: TableRow, index: number, event: MouseEvent): void {\n this.rowClick.emit({ row, index, event });\n }\n\n _rowSelect(row: TableRow, index: number, event: KeyboardEvent): void {\n this.rowSelect.emit({ row, index, event });\n }\n\n activateRow(id: string, event?: MouseEvent | KeyboardEvent): void;\n activateRow(index: number, event?: MouseEvent | KeyboardEvent): void;\n activateRow(none: null, event?: MouseEvent | KeyboardEvent): void;\n activateRow(\n arg: string | number | null,\n event?: MouseEvent | KeyboardEvent\n ): void {\n if (typeof arg === 'number') {\n const tableData = this.table();\n const pageData = tableData.data[this.paginationIndex];\n if (pageData && pageData[arg]) {\n this._activateRow(pageData[arg], arg, event);\n }\n } else if (typeof arg === 'string') {\n // TODO: implement hover by id\n } else {\n this._activateRow(null, null);\n }\n }\n\n protected _activateRow(\n row: TableRow | null,\n index: number | null,\n event?: MouseEvent | KeyboardEvent\n ): void {\n const current = this.rowActiveState();\n const idKey = this.rowIdKey();\n\n // distinctUntilChanged equivalent\n if (current.row && row) {\n if (idKey && current.row[idKey] === row[idKey]) return;\n if (\n !idKey &&\n this.generateRowId() &&\n current.row._id === row._id\n )\n return;\n }\n if (!current.row && !row && current.index === index) return;\n\n this.rowActiveState.set({ row, index, event });\n }\n\n /** sortByKey - Sort by key in table row */\n sortByKey(key: keyof TableRow, $event?: MouseEvent): void {\n const shiftKey = $event?.shiftKey === true;\n const currentOrder = this.sortOrder();\n let sortOrderVal: GtOrder = 'asc';\n let newOrder: GtSortOrder = [];\n\n if (shiftKey) {\n const existingSortPosition = currentOrder.findIndex(\n (value) => value.key === key\n );\n if (existingSortPosition === -1) {\n newOrder = [...currentOrder, { key, order: 'asc' }];\n } else {\n sortOrderVal = currentOrder[existingSortPosition].order;\n const newSortOrder = sortOrderVal === 'asc' ? 'desc' : 'asc';\n newOrder = [...currentOrder];\n newOrder[existingSortPosition] = {\n ...newOrder[existingSortPosition],\n order: newSortOrder,\n };\n }\n } else {\n if (currentOrder.length > 0) {\n const existingSortPosition = currentOrder.findIndex(\n (value) => value.key === key\n );\n if (existingSortPosition === -1) {\n newOrder = [{ key, order: 'asc' }];\n } else {\n sortOrderVal = currentOrder[existingSortPosition].order;\n const newSortOrder = sortOrderVal === 'asc' ? 'desc' : 'asc';\n newOrder = [{ key, order: newSortOrder }];\n }\n } else {\n newOrder = [{ key, order: sortOrderVal }];\n }\n }\n\n const sortEvent: GtSortEvent = {\n key,\n order: sortOrderVal,\n currentSortOrder: newOrder,\n addSortKey: shiftKey,\n };\n\n if ($event) {\n sortEvent.event = $event;\n }\n this.columnSort.emit(sortEvent);\n\n if (!this.tableInfo?.lazyLoaded) {\n this.sortOrder.set(newOrder);\n this.sortOrderChange.emit(newOrder);\n }\n }\n\n private _columnOrder = (\n a: KeyValue<string, TableColumn>,\n b: KeyValue<string, TableColumn>\n ): number => {\n return (a.value.order || 0) - (b.value.order || 0);\n };\n\n protected orderedColumns = computed(() => {\n const config = this.config();\n if (!config.columns) return [];\n return Object.entries(config.columns)\n .map(([key, value]) => ({ key, value }) as KeyValue<string, TableColumn>)\n .sort(this._columnOrder);\n });\n\n protected orderedRows = computed(() => {\n const config = this.config();\n if (!config.rows) return [];\n return Object.entries(config.rows)\n .map(([key, value]) => ({ key, value }) as KeyValue<string, TableColumn>)\n .sort(this._columnOrder);\n });\n\n nestedValue(\n object: any,\n mapTo: string,\n missingValue: string | number | null = null\n ): unknown {\n const levels = mapTo.split('.');\n return levels.reduce(\n (previousValue, currentValue, index) =>\n previousValue[currentValue] ||\n (index === levels.length - 1 ? missingValue : {}),\n object\n );\n }\n\n // ─── Keyboard Navigation ───\n\n private _unsubscribeFromKeyboardEvents$ = new Subject<void>();\n private _keyboardArrowEvent$ = fromEvent<KeyboardEvent>(\n document,\n 'keydown'\n ).pipe(\n filter(\n (event) =>\n [...this.navigationKeys(), ...this.selectKeys()].indexOf(event.key) > -1\n )\n );\n\n protected listenToKeyboardEvents(): void {\n if (!this.config()?.activateRowOnKeyboardNavigation) {\n return;\n }\n\n this._unsubscribeFromKeyboardEvents$.next();\n this._keyboardArrowEvent$\n .pipe(\n takeUntil(this._unsubscribeFromKeyboardEvents$),\n takeUntil(this._unsubscribe$)\n )\n .subscribe((event) => {\n const rows = this.processedData();\n const currentPage = this.boundedPaginationIndex();\n const tableInfo = this.tableInfo;\n\n const selectEvent = this.selectKeys().includes(event.key);\n if (selectEvent && this.activeRowIndex !== null) {\n const rowIndex =\n this.activeRowIndex + currentPage * (tableInfo?.pageSize ?? 0);\n this._rowSelect(rows[rowIndex], rowIndex, event);\n return;\n }\n\n const navigationEvent = this.navigationKeys().includes(event.key);\n if (navigationEvent) {\n this._handleNavigationEvent(event, rows, currentPage, tableInfo);\n }\n });\n }\n\n unsubscribeFromKeyboardEvents(tableRef: HTMLTableElement): void {\n if (!this.config()?.activateRowOnKeyboardNavigation) {\n return;\n }\n if (tableRef !== document.activeElement) {\n if (this.config()?.activateRowOnHover) {\n this.activateRow(null);\n }\n this._unsubscribeFromKeyboardEvents$.next();\n }\n }\n\n private _handleNavigationEvent(\n event: KeyboardEvent,\n rows: any[],\n currentPage: number,\n tableInfo: any\n ): void {\n const hasPagination = (tableInfo?.pageTotal || 0) > 1 && tableInfo;\n const lastRowIndex = rows.length - 1;\n let newIndex = this.activeRowIndex;\n let indexModifier = 0;\n\n if (event.key === 'Home') {\n this.paginationIndex = 0;\n this.activateRow(0, event);\n return;\n }\n\n if (event.key === 'End') {\n const indexOfLastRecord = hasPagination\n ? rows.length - (tableInfo.pageTotal - 1) * tableInfo.pageSize - 1\n : lastRowIndex;\n if (tableInfo?.pageTotal) {\n this.paginationIndex = tableInfo.pageTotal - 1;\n }\n this.activateRow(indexOfLastRecord, event);\n return;\n }\n\n if (event.key === 'ArrowDown') {\n indexModifier = 1;\n } else if (event.key === 'ArrowUp') {\n indexModifier = -1;\n }\n\n if (newIndex === null) {\n newIndex = 0;\n } else if (\n newIndex + indexModifier >= 0 &&\n newIndex + indexModifier <= lastRowIndex\n ) {\n newIndex = newIndex + indexModifier;\n }\n\n if (hasPagination && tableInfo?.pageSize) {\n const isNotLastPage = currentPage + 1 < tableInfo.pageTotal;\n const recordsOnLastPage =\n rows.length - (tableInfo.pageTotal - 1) * tableInfo.pageSize - 1;\n const maxIndex = isNotLastPage\n ? tableInfo?.pageSize - 1\n : recordsOnLastPage;\n\n if (event.key === 'ArrowLeft' && currentPage > 0) {\n this.paginationIndex = currentPage - 1;\n this.activateRow(newIndex, event);\n return;\n } else if (event.key === 'ArrowRight' && isNotLastPage) {\n if (\n currentPage + 1 === tableInfo.pageTotal - 1 &&\n newIndex > recordsOnLastPage\n ) {\n this.activateRow(recordsOnLastPage, event);\n }\n this.paginationIndex = currentPage + 1;\n this.activateRow(newIndex, event);\n return;\n }\n\n if (\n currentPage > 0 &&\n indexModifier < 0 &&\n newIndex + indexModifier <= lastRowIndex &&\n (this.activeRowIndex || 0) + indexModifier < 0\n ) {\n this.activateRow(tableInfo?.pageSize - 1, event);\n this.paginationIndex = currentPage - 1;\n return;\n }\n\n const pageIndex = newIndex % tableInfo?.pageSize;\n\n if (newIndex > maxIndex && currentPage + 1 < tableInfo.pageTotal) {\n this.paginationIndex = currentPage + 1;\n }\n this.activateRow(pageIndex > maxIndex ? maxIndex : pageIndex, event);\n return;\n }\n\n this.activateRow(newIndex, event);\n }\n\n ngOnDestroy() {\n this._unsubscribe$.next();\n this._unsubscribe$.complete();\n this._unsubscribeFromKeyboardEvents$.next();\n this._unsubscribeFromKeyboardEvents$.complete();\n }\n}\n","@let tableData = table();\n@let configValue = config();\n@let isLoading = loading();\n@let sortOrderValue = sortOrder();\n@let searchValue = searchTerm();\n@let rowActiveValue = rowActiveState();\n@let calculationsValue = calculations();\n@let colspanValue = colspan();\n@let footerColspanValue = footerColspan();\n@let paginationIdx = boundedPaginationIndex();\n\n<table\n [class]=\"configValue?.class || 'table'\"\n [class.table-mobile]=\"configValue?.mobileLayout\"\n [class.table-horizontal]=\"configValue?.rows\"\n [class.table-loading]=\"isLoading\"\n [class.gt-sticky-row-header]=\"configValue?.stickyHeaders?.row && configValue?.rows\"\n [class.gt-sticky-column-header]=\"configValue?.stickyHeaders?.column\"\n [attr.aria-busy]=\"isLoading === true ? true : null\"\n [tabindex]=\"configValue?.activateRowOnKeyboardNavigation ? 0 : -1\"\n #tableRef\n (focus)=\"listenToKeyboardEvents()\"\n (focusout)=\"unsubscribeFromKeyboardEvents(tableRef)\"\n (mouseenter)=\"listenToKeyboardEvents()\"\n (mouseleave)=\"unsubscribeFromKeyboardEvents(tableRef)\"\n>\n <thead>\n <tr>\n @if (configValue?.columns) {\n @for (column of orderedColumns(); track column.key) {\n @if (!column.value?.hidden) {\n <th\n class=\"{{ (column.key | dashCase) + '-column' }} {{ column.value.class }}\"\n [class.disabled]=\"isLoading\"\n [attr.aria-sort]=\"sortOrderValue | sortClass: column.key:'aria'\"\n [class.gt-sortable]=\"true\"\n scope=\"col\"\n >\n @if (column.value?.headerReplaceFull && (column.value?.headerComponent || column.value?.headerTemplateRef)) {\n @if (column.value.headerComponent) {\n <ng-container\n [ngComponentOutlet]=\"column.value.headerComponent!\"\n [ngComponentOutletInputs]=\"{\n column: column,\n sortable: !!column.value.sortable,\n sortOrder: sortOrderValue,\n search: searchValue,\n sort: headerSortFn(column.key),\n ...(column.value.headerComponentInputs || {})\n }\"\n ></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"column.value.headerTemplateRef!\"\n [ngTemplateOutletContext]=\"{\n column: column,\n sortable: !!column.value.sortable,\n sortOrder: sortOrderValue,\n search: searchValue,\n sort: headerSortFn(column.key)\n }\"\n ></ng-container>\n }\n } @else if (column.value?.sortable) {\n <button\n [attr.data-sort-order]=\"sortOrderValue | sortClass: column.key:'order'\"\n class=\"gt-sort\"\n (click)=\"isLoading || !column.value.sortable || sortByKey(column.key, $event)\"\n >\n @if (column.value?.headerComponent) {\n <ng-container\n [ngComponentOutlet]=\"column.value.headerComponent!\"\n [ngComponentOutletInputs]=\"{\n column: column,\n sortable: true,\n sortOrder: sortOrderValue,\n search: searchValue,\n ...(column.value.headerComponentInputs || {})\n }\"\n ></ng-container>\n } @else if (column.value?.headerTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"column.value.headerTemplateRef\"\n [ngTemplateOutletContext]=\"{\n column: column,\n sortable: true,\n sortOrder: sortOrderValue,\n search: searchValue\n }\"\n ></ng-container>\n } @else if (column.value?.header !== false) {\n <span>{{ column.value.header || column.key | capitalCase }}</span>\n }\n </button>\n } @else {\n @if (column.value?.headerComponent) {\n <ng-container\n [ngComponentOutlet]=\"column.value.headerComponent!\"\n [ngComponentOutletInputs]=\"{\n column: column,\n sortable: false,\n sortOrder: sortOrderValue,\n search: searchValue,\n ...(column.value.headerComponentInputs || {})\n }\"\n ></ng-container>\n } @else if (column.value?.headerTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"column.value.headerTemplateRef\"\n [ngTemplateOutletContext]=\"{\n column: column,\n sortable: false,\n sortOrder: sortOrderValue,\n search: searchValue\n }\"\n ></ng-container>\n } @else if (column.value?.header !== false) {\n <span>{{ column.value.header || column.key | capitalCase }}</span>\n }\n }\n </th>\n }\n }\n }\n @if (configValue?.rows) {\n @let headerRow = orderedRows()[0];\n @if (headerRow) {\n <th\n class=\"row-header\"\n [attr.aria-sort]=\"sortOrderValue | sortClass: headerRow.key:'aria'\"\n class=\"{{ headerRow.value.sortable ? 'sort ' : '' }} {{ sortOrderValue | sortClass: headerRow.key }} {{ (headerRow.key | dashCase) + '-column' }}\"\n (click)=\"isLoading || !headerRow.value.sortable || sortByKey(headerRow.key, $event)\"\n scope=\"col\"\n >\n @if (headerRow.value?.headerComponent) {\n <ng-container\n [ngComponentOutlet]=\"headerRow.value.headerComponent!\"\n [ngComponentOutletInputs]=\"{\n column: headerRow,\n sortable: !!headerRow.value.sortable,\n sortOrder: sortOrderValue,\n search: searchValue,\n sort: headerSortFn(headerRow.key),\n ...(headerRow.value.headerComponentInputs || {})\n }\"\n ></ng-container>\n } @else if (headerRow.value?.headerTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"headerRow.value.headerTemplateRef\"\n [ngTemplateOutletContext]=\"{\n column: headerRow,\n sortable: !!headerRow.value.sortable,\n sortOrder: sortOrderValue,\n search: searchValue,\n sort: headerSortFn(headerRow.key)\n }\"\n ></ng-container>\n } @else if (headerRow?.value?.header !== false) {\n {{ headerRow?.value?.header || headerRow.key | capitalCase }}\n }\n </th>\n @for (column of (tableData?.data || [])[0]; track $index) {\n <th class=\"{{ headerRow.value.class }}\">\n @if ((configValue.rows || {})[headerRow.key].component) {\n <ng-container\n [ngComponentOutlet]=\"(configValue.rows || {})[headerRow.key].component!\"\n [ngComponentOutletInputs]=\"{\n row: column,\n col: headerRow,\n index: 0,\n data: (tableData?.data || [])[0],\n search: searchValue,\n ...((configValue.rows || {})[headerRow.key].componentInputs || {})\n }\"\n ></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"\n (configValue.rows || {})[headerRow.key].templateRef\n ? templateRef\n : (configValue.rows || {})[headerRow.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: headerRow,\n transform: (configValue.rows || {})[headerRow.key].transform,\n templateRef: (configValue.rows || {})[headerRow.key].templateRef,\n index: 0\n }\"\n ></ng-container>\n }\n </th>\n }\n }\n }\n </tr>\n </thead>\n @if (isLoading) {\n <tbody>\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspanValue\">\n <ng-content select=\".table-loading\"></ng-content>\n </td>\n </tr>\n </tbody>\n } @else {\n @if (tableData && (tableData.data[0] || tableData.data).length > 0) {\n <tbody>\n @if (configValue?.columns) {\n @for (row of tableData.data[tableData.info.lazyLoaded ? 0 : paginationIdx]; track trackRowByFn($index, row); let i = $index) {\n <tr\n [attr.id]=\"'tableRow_' + i\"\n (click)=\"configValue?.rowClick && _rowClick(row, i, $event)\"\n (mouseenter)=\"configValue?.activateRowOnHover && _activateRow(row, i, $event)\"\n (mouseleave)=\"configValue?.activateRowOnHover && _activateRow(null, null, $event)\"\n [class]=\"[\n !!isRowSelectedFn()\n ? (row | rowSelection: selection(): isRowSelectedFn()!: customClasses().selectedRow)\n : '',\n rowActiveValue?.index === i ? customClasses().activeRow : ''\n ]\"\n >\n @for (column of orderedColumns(); track column.key) {\n @if (!column.value?.hidden) {\n <td\n class=\"{{ (column.key | dashCase) + '-column' }} {{ column.value.class }}\"\n [attr.data-label]=\"\n configValue.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n >\n @if ((configValue.columns || {})[column.key].component) {\n <ng-container\n [ngComponentOutlet]=\"(configValue.columns || {})[column.key].component!\"\n [ngComponentOutletInputs]=\"{\n row: row,\n col: column,\n index: i,\n data: tableData.data[tableData.info.lazyLoaded ? 0 : paginationIdx],\n search: searchValue,\n ...((configValue.columns || {})[column.key].componentInputs || {})\n }\"\n ></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"\n searchValue && !(configValue.columns || {})[column.key].templateRef\n ? highlighted\n : (configValue.columns || {})[column.key].templateRef\n ? templateRef\n : (configValue.columns || {})[column.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: row,\n column: column,\n search: searchValue,\n transform: (configValue.columns || {})[column.key].transform,\n templateRef: (configValue.columns || {})[column.key].templateRef,\n index: i,\n data: tableData.data[tableData.info.lazyLoaded ? 0 : paginationIdx]\n }\"\n ></ng-container>\n }\n </td>\n }\n }\n </tr>\n }\n }\n @if (configValue?.rows) {\n @for (row of orderedRows() | slice: 1; track row.key; let i = $index) {\n @if (!row.value?.hidden) {\n <tr\n [attr.id]=\"'tableRow_' + i\"\n class=\"{{ (row.key | dashCase) + '-row' }}\"\n (click)=\"configValue?.rowClick && _rowClick(row, i, $event)\"\n (mouseenter)=\"configValue?.activateRowOnHover && _activateRow(row, i, $event)\"\n (mouseleave)=\"configValue?.activateRowOnHover && _activateRow(null, null, $event)\"\n [class]=\"[\n !!isRowSelectedFn()\n ? (row | rowSelection: selection(): isRowSelectedFn()!: customClasses().selectedRow)\n : '',\n rowActiveValue?.index === i ? customClasses().activeRow : ''\n ]\"\n >\n <th class=\"row-header\" scope=\"row\">\n @if (row.value?.headerComponent) {\n <ng-container\n [ngComponentOutlet]=\"row.value.headerComponent!\"\n [ngComponentOutletInputs]=\"{\n column: row,\n sortable: false,\n sortOrder: sortOrderValue,\n search: searchValue,\n ...(row.value.headerComponentInputs || {})\n }\"\n ></ng-container>\n } @else if (row.value?.headerTemplateRef) {\n <ng-container\n [ngTemplateOutlet]=\"row.value.headerTemplateRef\"\n [ngTemplateOutletContext]=\"{\n column: row,\n sortable: false,\n sortOrder: sortOrderValue,\n search: searchValue\n }\"\n ></ng-container>\n } @else {\n {{ row.value.header || row.key | capitalCase }}\n }\n </th>\n @for (column of (tableData?.data || [])[0]; track $index; let y = $index) {\n <td class=\"{{ row.value.class }}\">\n @if ((configValue.rows || {})[row.key].component) {\n <ng-container\n [ngComponentOutlet]=\"(configValue.rows || {})[row.key].component!\"\n [ngComponentOutletInputs]=\"{\n row: column,\n col: row,\n index: configValue.rows ? y : i,\n data: tableData.data[tableData.info.lazyLoaded ? 0 : paginationIdx],\n search: searchValue,\n ...((configValue.rows || {})[row.key].componentInputs || {})\n }\"\n ></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"\n (configValue.rows || {})[row.key].templateRef\n ? templateRef\n : (configValue.rows || {})[row.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: row,\n transform: (configValue.rows || {})[row.key].transform,\n templateRef: (configValue.rows || {})[row.key].templateRef,\n index: configValue.rows ? y : i,\n data: tableData.data[tableData.info.lazyLoaded ? 0 : paginationIdx]\n }\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n }\n }\n }\n </tbody>\n } @else {\n <tbody>\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspanValue\">\n <ng-content select=\".table-no-data\"></ng-content>\n </td>\n </tr>\n </tbody>\n }\n }\n @if (tableData && tableData.data.length > 0 && !isLoading) {\n <tfoot>\n @for (calculation of calculationsValue.calculations; track calculation; let i = $index) {\n @let showHeader = colspanValue !== footerColspanValue;\n <tr>\n @if (showHeader) {\n <th\n [colSpan]=\"(colspanValue || 0) - (footerColspanValue || 0)\"\n scope=\"row\"\n >\n @if (configValue?.footer?.headers?.[calculation]) {\n {{ configValue.footer!.headers![calculation] === true ? (calculation | capitalCase) : configValue.footer!.headers![calculation] }}\n }\n </th>\n }\n @for (column of orderedColumns(); track column.key) {\n @if (!column.value?.hidden && calculationsValue.calculated[column.key]) {\n <td\n class=\"{{ (column.key | dashCase) + '-column' }} {{ column.value.class }}\"\n [attr.data-header]=\"\n !showHeader && configValue?.footer?.headers?.[calculation]\n ? configValue.footer!.headers![calculation] === true ? (calculation | capitalCase) : configValue.footer!.headers![calculation]\n : null\n \"\n [attr.data-label]=\"\n configValue?.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n [class.gt-no-content]=\"!calculationsValue.calculated[column.key][calculation]\"\n >\n @if ((configValue?.columns || {})[column.key].component) {\n <ng-container\n [ngComponentOutlet]=\"(configValue?.columns || {})[column.key].component!\"\n [ngComponentOutletInputs]=\"{\n value: calculationsValue.calculated[column.key][calculation],\n row: calculationsValue.calculated[column.key],\n col: column,\n column: calculation,\n index: i,\n search: searchValue,\n ...((configValue?.columns || {})[column.key].componentInputs || {})\n }\"\n ></ng-container>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"\n (configValue?.columns || {})[column.key].templateRef\n ? templateRef\n : (configValue?.columns || {})[column.key].transform\n ? transformFooter\n : rawFooter\n \"\n [ngTemplateOutletContext]=\"{\n value: calculationsValue.calculated[column.key][calculation],\n row: calculationsValue.calculated[column.key],\n column: calculation,\n templateRef: (configValue?.columns || {})[column.key].templateRef,\n transform: (configValue?.columns || {})[column.key].transform\n }\"\n ></ng-container>\n }\n </td>\n }\n }\n </tr>\n }\n </tfoot>\n }\n</table>\n<ng-template\n #highlighted\n let-row=\"row\"\n let-column=\"column\"\n let-search=\"search\"\n let-transform=\"transform\"\n>\n @if (!transform) {\n <div [innerHTML]=\"row[column.key] | highlight: search\"></div>\n } @else {\n <div [innerHTML]=\"row[column.key] | dynamicPipe: transform.pipe:transform?.args | highlight: search\"></div>\n }\n</ng-template>\n<ng-template #rawData let-row=\"row\" let-column=\"column\">\n {{ row[column.key] }}\n</ng-template>\n<ng-template\n #transformData\n let-row=\"row\"\n let-column=\"column\"\n let-transform=\"transform\"\n let-data=\"data\"\n>\n {{ row[column.key] | dynamicPipe: transform.pipe:transform?.args }}\n</ng-template>\n<ng-template #transformFooter let-value=\"value\" let-transform=\"transform\">\n {{ (value | dynamicPipe: transform.pipe:transform?.args) || config()?.footer?.emptyContent }}\n</ng-template>\n<ng-template #rawFooter let-value=\"value\">\n {{ value || config()?.footer?.emptyContent }}\n</ng-template>\n<ng-template\n #templateRef\n let-row=\"row\"\n let-column=\"column\"\n let-index=\"index\"\n let-templateRef=\"templateRef\"\n let-data=\"data\"\n>\n <ng-container\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{\n row: row,\n col: column,\n index: index,\n data: data\n }\"\n ></ng-container>\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n TemplateRef,\n} from '@angular/core';\nimport { TableRow } from '../models/table-row.interface';\nimport { NgTemplateOutlet, PercentPipe } from '@angular/common';\n\nexport interface GtDelta {\n relative: number | string;\n absolute: number;\n}\n\n@Component({\n selector: 'gt-delta',\n template: `\n @let delta = value();\n @if (delta) {\n <span\n [class]=\"[\n classes().span,\n delta.absolute > 0\n ? classes().positive\n : delta.absolute < 0\n ? classes().negative\n : null\n ]\"\n [class.gt-delta-positive]=\"delta.absolute > 0\"\n [class.gt-delta-negative]=\"delta.absolute < 0\"\n >\n <ng-container\n [ngTemplateOutlet]=\"deltaTemplate() || defaultTemplate\"\n [ngTemplateOutletContext]=\"{ delta }\"\n ></ng-container>\n </span>\n <ng-template #defaultTemplate let-delta=\"delta\">\n @if (delta.relative !== null && delta.relative !== undefined) {\n @if (typeof delta.relative === 'number') {\n <span>{{ delta.relative | percent: '1.0-2' }}</span>\n } @else {\n <span>{{ delta.relative }}</span>\n }\n }\n </ng-template>\n }\n `,\n styles: [\n `\n :host {\n display: inline-block;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [PercentPipe, NgTemplateOutlet],\n})\nexport class GtDeltaComponent {\n readonly data = input<Array<TableRow>>([]);\n readonly index = input(0);\n readonly baseIndex = input<number | undefined>(undefined);\n readonly classes = input({\n span: 'gt-delta',\n positive: 'text-success',\n negative: 'text-danger',\n });\n readonly key = input('value');\n readonly notApplicableValue = input<string | null>(null);\n readonly initialValue = input<string | number | null>(null);\n readonly deltaTemplate = input<TemplateRef<any> | undefined>(undefined);\n\n readonly value = computed<GtDelta | undefined>(() => {\n const data = this.data();\n if (!data || data.length === 0) return undefined;\n\n const index = this.index();\n const baseIndex = this.baseIndex();\n const key = this.key();\n const initialValue = this.initialValue();\n\n const deltaValue =\n index === 0\n ? initialValue\n : (data[index][key] as number) -\n (baseIndex === undefined\n ? (data[index - 1][key] as number)\n : (data[baseIndex][key] as number));\n const baseValue =\n index === 0\n ? 1\n : baseIndex === undefined\n ? (data[index - 1][key] as number)\n : (data[baseIndex][key] as number);\n\n const relative =\n index === 0\n ? initialValue\n : Math.sign(deltaValue as number) *\n Math.abs((deltaValue as number) / baseValue);\n\n return {\n relative: Number.isFinite(relative)\n ? (relative as number)\n : index === 0\n ? (initialValue as number | string)\n : (this.notApplicableValue() as string),\n absolute: deltaValue as number,\n };\n });\n}\n","import { NgModule } from '@angular/core';\nimport { CoreComponent } from './core.component';\nimport { GtDeltaComponent } from './gt-delta/gt-delta.component';\n\n@NgModule({\n imports: [CoreComponent, GtDeltaComponent],\n exports: [CoreComponent, GtDeltaComponent],\n})\nexport class GenericTableCoreModule {}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { CoreComponent } from '../core.component';\nimport {\n GtPaginationAriaLabels,\n GtPaginationClasses,\n GtPaginationInfo,\n} from '../models/gt-pagination';\n\n@Component({\n selector: 'angular-generic-table-pagination',\n templateUrl: './pagination.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PaginationComponent {\n readonly table = input.required<CoreComponent>();\n\n readonly pagingInfo = input<GtPaginationInfo | undefined>(undefined);\n readonly paginationLength = input(5);\n readonly classes = input<GtPaginationClasses>({\n ul: 'pagination',\n li: 'page-item',\n button: 'page-link',\n });\n readonly ariaLabels = input<GtPaginationAriaLabels>({\n nav: 'Table pagination',\n button: 'Go to page ',\n });\n\n /** Page numbers to display in the pagination component */\n protected paginationListItems = computed(() => {\n const tbl = this.table();\n const info = tbl.tableInfoSignal();\n const currentPage = tbl.boundedPaginationIndex();\n return this._generateList(info.pageTotal, currentPage);\n });\n\n /** Current page from the table */\n protected currentPosition = computed(() => {\n return this.table().boundedPaginationIndex();\n });\n\n private _generateList(\n numberOfPages: number,\n currentPosition: number\n ): Array<number> {\n const paginationLen = this.paginationLength();\n const middle = Math.floor(paginationLen / 2);\n const length =\n numberOfPages < paginationLen ? numberOfPages : paginationLen;\n\n return Array.from({ length }, (_, i) => {\n if (i === 0) {\n return 1;\n } else if (numberOfPages < paginationLen) {\n return i + 1;\n } else if (i + 1 === length) {\n return numberOfPages;\n } else if (\n currentPosition > middle &&\n currentPosition < numberOfPages - middle\n ) {\n return i + currentPosition - (middle - 1);\n } else if (\n currentPosition > middle &&\n currentPosition < numberOfPages - (middle - 1)\n ) {\n return i + currentPosition - middle;\n } else if (\n currentPosition > middle &&\n currentPosition === numberOfPages - (middle - 1)\n ) {\n return i + currentPosition - (middle + 1);\n } else if (\n currentPosition > middle &&\n currentPosition === numberOfPages - 1\n ) {\n return i + currentPosition - (middle + 2);\n } else {\n return i + 1;\n }\n });\n }\n\n goToPage(index: number): void {\n const tbl = this.table();\n if (tbl) {\n tbl.paginationIndex = index - 1;\n }\n }\n}\n","@let links = paginationListItems();\n@let currentPos = currentPosition();\n@let classesValue = classes();\n@let ariaLabelsValue = ariaLabels();\n\n@if (links && links.length > 1) {\n <nav\n role=\"navigation\"\n [attr.aria-label]=\"ariaLabelsValue.nav\"\n class=\"gt-pagination\"\n [class]=\"classesValue.nav\"\n >\n <ul [class]=\"classesValue.ul\">\n @for (position of links; track position; let i = $index; let last = $last) {\n <li\n [class]=\"classesValue.li\"\n [class.active]=\"position === (currentPos || 0) + 1\"\n >\n <button\n [class]=\"classesValue.button\"\n [attr.aria-label]=\"ariaLabelsValue.button + position\"\n (click)=\"goToPage(position)\"\n >\n {{ position }}\n </button>\n </li>\n @if (position + 1 !== links[i + 1] && !last) {\n <li [class]=\"classesValue.li\" class=\"gt-ellipsis\">\n <button [class]=\"classesValue.button\" disabled tabindex=\"-1\"></button>\n </li>\n }\n }\n </ul>\n </nav>\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PaginationComponent } from './pagination.component';\n\n@NgModule({\n imports: [CommonModule, PaginationComponent],\n exports: [PaginationComponent],\n})\nexport class GenericTablePaginationModule {}\n","/*\n * Public API Surface of core\n */\n\nexport * from './lib/core.component';\nexport * from './lib/core.module';\nexport * from './lib/gt-delta/gt-delta.component';\nexport * from './lib/pagination/pagination.component';\nexport * from './lib/pagination/pagination.module';\nexport * from './lib/models/table-config.interface';\nexport * from './lib/models/table-column.interface';\nexport * from './lib/models/table-info.interface';\nexport * from './lib/models/table-row.interface';\nexport * from './lib/models/table-sort.interface';\nexport * from './lib/models/table-meta.interface';\nexport * from './lib/models/table-events.interface';\nexport * from './lib/models/gt-pagination';\nexport * from './lib/utilities/utilities';\nexport * from './lib/pipes/capital-case.pipe';\nexport * from './lib/pipes/dash-case.pipe';\nexport * from './lib/pipes/dynamic.pipe';\nexport * from './lib/pipes/highlight.pipe';\nexport * from './lib/pipes/sort-class.pipe';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;AAIO,IAAI;AACX,MAAM,GAAG,CAAC,CAAS,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAElE,IAAI;AACX,UAAU,GAAG,CAAC,CAAC,KACb,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACpC,KAAA,OAAO,CAAC,IAAI,EAAE,GAAG;AACjB,KAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK;AAC/B,KAAA,OAAO,CAAC,cAAc,EAAE,KAAK;AAC7B,KAAA,OAAO,CAAC,SAAS,EAAE,GAAG;AACtB,KAAA,IAAI,EAAE;AAEJ,IAAI;AAIX,KAAK,GAAG,CAAC,KAAK,EAAE,SAAS,KAAI;AAC3B,IAAA,IAAI,SAAS,GAAG,CAAC,EAAE;AACjB,QAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;IACvC;AACA,IAAA,IAAI,SAAS,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE;QACjC,OAAO,CAAC,KAAK,CAAC;IAChB;IACA,MAAM,KAAK,GAAG,EAAE;AAChB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,SAAS,EAAE;AAC3D,QAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;IAC3C;AACA,IAAA,OAAO,KAAK;AACd,CAAC;AAEM,IAAI;AAMX,MAAM,GAAG,CACP,IAAY,EACZ,aAAsB,EACtB,IAAqB,EACrB,MAAmB,KACjB;AACF,IAAA,IAAI,MAAM,CAAC,OAAO,EAAE;QAClB,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM;;AAEtD,QAAA,CAAC,GAAG,KACF,MAAM,CAAC,OAAO;AACd,YAAA,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM;YAC5B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,KAAK,CACxC;QAED,MAAM,QAAQ,GAAG,EAAE;AACnB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,YAAA,MAAM,KAAK,GACT,MAAM,CAAC,OAAO,CAAC,GAAG;AACf,iBAAA,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC1D,iBAAA,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,KAAY;gBAC3C,MAAM,MAAM,GAAG,MAAM,EAAE,OAAQ,CAAC,GAAG,CAAC,EAAE,MAAM;;AAE5C,gBAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;;oBAEhC,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;gBACjC;AACA,gBAAA,QACE,GAAG;qBACF,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;qBACzB,aAAa,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;YAE7D,CAAC,EAAE,EAAE;AACJ,iBAAA,OAAO,CAAC,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC;YAC9D,IAAI,KAAK,EAAE;AACT,gBAAA,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG;YACjC;QACF;AACA,QAAA,OAAO,QAAQ;IACjB;SAAO;AACL,QAAA,OAAO,IAAI;IACb;AACF,CAAC;IAEU,SAAS,GAAG,CAAC,IAAqB,EAAE,MAAmB,KAAI;IACpE,MAAM,YAAY,GAA+B,EAAE;IACnD,MAAM,mBAAmB,GAAqC,EAAE;AAChE,IAAA,IAAI,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE;AACzD,SAAA,MAAM,CACL,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,KACzB,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK;SAChE,MAAM,IAAI,CAAC;AAEjB,SAAA,MAAM,CAAC,CAAC,GAAQ,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,KAAK,KAAI;QACtD,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE;AAChD,aAAA,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,KAAK,KAAK,KAAK;aAChD,MAAM,CAAC,CAAC,GAAQ,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,KAAI;AACzC,YAAA,IAAI,mBAAmB,CAAC,UAAU,CAAC,EAAE;gBACnC,mBAAmB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;YACnD;AAAO,iBAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AACzB,gBAAA,mBAAmB,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC;YACjD;AACA,YAAA,YAAY,CAAC,WAAW,CAAC,GAAG,IAAI;AAChC,YAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AAC/B,gBAAA,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC;YACjC;AACA,YAAA,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK;AAC7C,YAAA,OAAO,GAAG;QACZ,CAAC,EAAE,EAAE,CAAC;AACR,QAAA,OAAO,GAAG;IACZ,CAAC,EAAE,EAAE,CAAC;IACR,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACtC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,KAAI;gBACrE,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;AACpC,oBAAA,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC3C;gBACA,IACE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAChC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAClC;oBACA,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE;AACxC,wBAAA,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;oBAC5B;AACA,oBAAA,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC3C;gBACA,IACE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;qBAC/B,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EACtE;AACA,oBAAA,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC3C;gBACA,IACE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;qBAC/B,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EACtE;AACA,oBAAA,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC3C;AACF,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,KAAI;YACrE,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;AACtC,gBAAA,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM;;AAE9D,gBAAA,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE;;AAEhE,oBAAA,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG;gBAC/B;YACF;YACA,IAAI,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE;gBACxC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM;YACxC;AACF,QAAA,CAAC,CAAC;IACJ;IACA,OAAO;AACL,QAAA,UAAU,EAAE,UAAU;AACtB,QAAA,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,CAAC,KACH,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,aAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAC7C;QACD,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC;KAC5D;AACH;AAEA;;;;AAIG;AACI,MAAM,kBAAkB,GAAG,CAChC,IAAiB,KACyB;AAC1C,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,KAAK,KAAK,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChE,IAAA,OAAO,CAAC,CAAC,EAAE,CAAC,KAAI;AACd,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG;AACrB,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;AACjB,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YACjB,IAAI,IAAI,KAAK,IAAI;gBAAE;AACnB,YAAA,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;AAAE,gBAAA,OAAO,CAAC;AACjD,YAAA,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,CAAC;YAClD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBACxD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;gBACvF,IAAI,GAAG,KAAK,CAAC;AAAE,oBAAA,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;gBACpC;YACF;YACA,IAAI,IAAI,GAAG,IAAI;AAAE,gBAAA,OAAO,KAAK,CAAC,CAAC,CAAC;YAChC,IAAI,IAAI,GAAG,IAAI;AAAE,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC;AACA,QAAA,OAAO,CAAC;AACV,IAAA,CAAC;AACH;AAEA;;;;AAIG;AACI,MAAM,oBAAoB,GAAG,CAAC,UAAkB,KAAiB;IACtE,MAAM,eAAe,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;AAC7C,IAAA,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,SAAS,KAAI;AACvC,QAAA,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;QACzC,OAAO;YACL,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7B,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK;SACzC;AACH,IAAA,CAAC,CAAC;AACJ;AAEA;;;;AAIG;AACI,MAAM,sBAAsB,GAAG,CACpC,UAAsC,KAC5B;AACV,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,GAAG,GAAG;AACrD,IAAA,OAAO,GAAG,KAAK,CAAA,EAAG,UAAU,CAAC,GAAG,EAAE;AACpC;AAEA;;;;AAIG;AACI,MAAM,iBAAiB,GAAG,CAAC,SAAsB,KAAY;AAClE,IAAA,OAAO;SACJ,GAAG,CAAC,CAAC,UAAU,KAAK,sBAAsB,CAAC,UAAU,CAAC;SACtD,IAAI,CAAC,GAAG,CAAC;AACd;;MCjOa,eAAe,CAAA;AAC1B,IAAA,SAAS,CAAC,CAAS,EAAA;AACjB,QAAA,OAAO,UAAU,CAAC,CAAC,CAAC;IACtB;+GAHW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCCY,aAAa,CAAA;AACxB,IAAA,SAAS,CACP,SAA6B,EAC7B,GAAW,EACX,UAAsC,OAAO,EAAA;QAE7C,MAAM,SAAS,GAAG;AAChB,cAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG;cACxC,CAAC,CAAC;AACN,QAAA,IAAI,OAAO,KAAK,MAAM,EAAE;YACtB,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE;AAClC,gBAAA,OAAO,IAAI;YACb;iBAAO;gBACL,OAAO,CAAA,EAAG,SAAS,CAAC,SAAS,CAAC,CAAC,KAAK,QAAQ;YAC9C;QACF;AAAO,aAAA,IAAI,OAAO,KAAK,OAAO,EAAE;YAC9B,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE;AAClC,gBAAA,OAAO,EAAE;YACX;iBAAO;gBACL,OAAO,CAAA,QAAA,EAAW,SAAS,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE;YAChD;QACF;aAAO;AACL,YAAA,OAAO,CAAC,SAAS,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS,GAAG;AAC3D,kBAAE;AACF,kBAAE,SAAS,GAAG,CAAC,GAAG,EAAE;QACxB;IACF;+GA1BW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,CAAA;;4FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBAJzB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,WAAW;AACjB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCCY,YAAY,CAAA;AACvB,IAAA,SAAS,CAAC,CAAS,EAAA;AACjB,QAAA,OAAO,MAAM,CAAC,CAAC,CAAC;IAClB;+GAHW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBAJxB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCAY,WAAW,CAAA;AAGtB,IAAA,WAAA,CAAoB,QAAkB,EAAA;QAAlB,IAAA,CAAA,QAAQ,GAAR,QAAQ;AAFpB,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,GAAG,EAA4B;IAEX;AAEzC,IAAA,SAAS,CAAC,KAAU,EAAE,YAAuB,EAAE,QAAe,EAAA;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;QAC5C,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,QAAQ,IAAI,EAAE,CAAC,CAAC;QACrD;AACA,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;AACpC,YAAA,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,IAAI,CAAC,QAAQ;AACrB,YAAA,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACvC,SAAA,CAAC;QACF,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,CAAkB;QAC7D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC;AACnC,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,QAAQ,IAAI,EAAE,CAAC,CAAC;IACnD;+GAlBW,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,CAAA;;4FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBAJvB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCCY,aAAa,CAAA;AAJ1B,IAAA,WAAA,GAAA;QAKU,IAAA,CAAA,WAAW,GAAkB,IAAI;QACjC,IAAA,CAAA,YAAY,GAAkB,IAAI;AAgD3C,IAAA;IA9CC,SAAS,CAAC,IAAS,EAAE,UAAyB,EAAA;QAC5C,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,IAAI;QACb;AACA,QAAA,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAE;AAEtC,QAAA,IAAI,UAAU,KAAK,IAAI,CAAC,WAAW,EAAE;AACnC,YAAA,IAAI,CAAC,WAAW,GAAG,UAAU;AAC7B,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,MAAM,CAC5B,GAAG;oBACD;AACG,yBAAA,WAAW;yBACX,KAAK,CAAC,cAAc;AACpB,yBAAA,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC;yBAC/C,IAAI,CAAC,GAAG,CAAC;oBACZ,GAAG,EACL,IAAI,CACL;YACH;AAAE,YAAA,MAAM;AACN,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;YAC1B;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,OAAO,oBAAoB;QAC7B;QAEA,MAAM,kBAAkB,GAAG,wBAAwB;QACnD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,CAAC;QAExE,IAAI,kBAAkB,EAAE;AACtB,YAAA,QACE,kBAAkB,CAAC,CAAC,CAAC;gBACrB,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAC3B,IAAI,CAAC,YAAY,EACjB,6CAA6C,CAC9C;AACD,gBAAA,kBAAkB,CAAC,CAAC,CAAC;QAEzB;QACA,OAAO,oBAAoB,CAAC,OAAO,CACjC,IAAI,CAAC,YAAY,EACjB,6CAA6C,CAC9C;IACH;+GAjDW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,CAAA;;4FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBAJzB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,WAAW;AACjB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCEY,gBAAgB,CAAA;AAC3B,IAAA,SAAS,CACP,GAAa,EACb,SAAc,EACd,UAAsD,EACtD,SAAkB,EAAA;AAElB,QAAA,OAAO,SAAS,IAAI,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,SAAS,GAAG,EAAE;IACjE;+GARW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,cAAA,EAAA,CAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAJ5B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCuEY,aAAa,CAAA;AAhB1B,IAAA,WAAA,GAAA;AAiBU,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,EAAC,UAAuB,EAAC;AACvC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAQ;;QAOlC,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC;YAC9B,WAAW;YACX,SAAS;YACT,WAAW;YACX,YAAY;YACZ,MAAM;YACN,KAAK;AACN,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QACO,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAClC,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAmB,EAAE,6EAAC;AACpC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAkB,EAAE,2EAAC;QACjC,IAAA,CAAA,UAAU,GAAG,KAAK,CAAgB,IAAI,kFAAI,KAAK,EAAE,QAAQ,EAAA,CAAG;AAC5D,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,KAAK,8EAAC;QACtB,IAAA,CAAA,cAAc,GAAG,KAAK,CAAmB,EAAE,sFAAI,KAAK,EAAE,WAAW,EAAA,CAAG;QACpE,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAC,CAAC,4FAAI,KAAK,EAAE,iBAAiB,EAAA,CAAG;AAC7D,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAA0B,IAAI,iFAAC;AACjD,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAM,EAAE,gFAAC;AAC1B,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAqB,SAAS,+EAAC;AAC/C,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,IAAI,oFAAC;QAC3B,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAChC,SAAS,yFACP,KAAK,EAAE,cAAc,EAAA,CACxB;AACQ,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAE9B,SAAS,sFAAC;QACH,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAEjC,EAAE,0FAAI,KAAK,EAAE,eAAe,EAAA,CAAG;;QAIxB,IAAA,CAAA,QAAQ,GAAG,MAAM,EAAmB;QACpC,IAAA,CAAA,SAAS,GAAG,MAAM,EAAoB;QACtC,IAAA,CAAA,eAAe,GAAG,MAAM,EAAyB;QACjD,IAAA,CAAA,eAAe,GAAG,MAAM,CAAmB,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAClE,IAAA,CAAA,UAAU,GAAG,MAAM,EAAe;QAClC,IAAA,CAAA,UAAU,GAAG,MAAM,EAAqB;;QAIvC,IAAA,CAAA,SAAS,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QACrD,IAAA,CAAA,sBAAsB,GAAG,YAAY,CAAC,MAC9C,IAAI,CAAC,oBAAoB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC5B;;AAGO,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAgB,IAAI,mFAAC;;;AAKxC,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CACnC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,uFAClD;AAES,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,OAAO;AACxC,YAAA,WAAW,EAAE,aAAa;AAC1B,YAAA,SAAS,EAAE,WAAW;YACtB,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAC7B,SAAA,CAAC,oFAAC;AAEH,QAAA,IAAA,CAAA,YAAY,GAA8B,CACxC,KAAa,EACb,GAAa,KACX;AACF,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACzC,YAAA,IAAI,QAAQ;AAAE,gBAAA,OAAO,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;AACzC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,YAAA,OAAO,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,GAAG;AACtC,QAAA,CAAC;;AAGO,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;YACnC,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAC3B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;;YAG5B,IACE,CAAC,MAAM,CAAC,OAAO;gBACb,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBACjE,MAAM,CAAC,IAAI;oBACV,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAChE;gBACA,MAAM,OAAO,GAAe,EAAE;AAC9B,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,oBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE;AAC/D,yBAAA,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK;AACtC,yBAAA,MAAM,CACL,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM;AAChC,wBAAA,GAAG,aAAa;wBAChB,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CACrB,GAAG,EACH,KAAK,CAAC,KAAM,CAAC,IAAI,EACjB,KAAK,CAAC,KAAK,EAAE,YAAY,CAC1B;qBACF,CAAC,EACF,EAAE,CACH;oBACH,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE;gBACrC;gBACA,IAAI,GAAG,OAAO;YAChB;;AAGA,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/D,MAAM,UAAU,GAAG,EAAE;AACrB,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,oBAAA,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;gBACxC;gBACA,IAAI,GAAG,UAAU;YACnB;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,mFAAC;;AAGM,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;YACnC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AACrC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE;AAClC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI;YAE7C,OAAO,QAAQ,IAAI,CAAC;kBAChB,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM;kBACpC,IAAI;AACV,QAAA,CAAC,mFAAC;;AAGM,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACpC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;AAChC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;AAC/B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAE5B,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,EAAE,gBAAgB,EAAE;AAC/C,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACnD,QAAA,CAAC,oFAAC;;AAGQ,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAY,MAAK;AACzC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;YAE5B,IACE,EAAE,KAAK,IAAI;gBACX,EAAE,CAAC,WAAW,KAAK,IAAI;gBACvB,EAAE,CAAC,eAAe,KAAK,IAAI;AAC3B,gBAAA,EAAE,CAAC,QAAQ,KAAK,IAAI,EACpB;gBACA,OAAO;oBACL,IAAI,EAAE,CAAC,MAAM,CAAC;oBACd,MAAM;AACN,oBAAA,IAAI,EAAE;AACJ,wBAAA,UAAU,EAAE,IAAI;wBAChB,eAAe,EAAE,EAAE,CAAC,eAAe;wBACnC,QAAQ,EAAE,EAAE,CAAC,QAAQ;AACrB,wBAAA,SAAS,EACP,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,GAAG,EAAE,CAAC,QAAQ,CAAC;AAC9D,qBAAA;iBACF;YACH;AAEA,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU;YAC7B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC5B,OAAO;oBACL,IAAI,EAAE,CAAC,MAAM,CAAC;oBACd,MAAM;oBACN,IAAI,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE;iBACvD;YACH;AAEA,YAAA,MAAM,QAAQ,GACZ,GAAG,CAAC,MAAM,KAAK;mBACV,IAAI,CAAC,YAAY,EAAE,IAAI,aAAa,CAAC,iBAAiB;kBACvD,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;YAExB,OAAO;AACL,gBAAA,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;gBAC7B,MAAM;AACN,gBAAA,IAAI,EAAE;oBACJ,eAAe,EAAE,MAAM,CAAC,MAAM;oBAC9B,QAAQ;oBACR,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC;AAC/C,iBAAA;aACF;AACH,QAAA,CAAC,4EAAC;;AAGO,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAY,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,sFAAC;;AAQ7D,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAChC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,mFAC/C;;AAGQ,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;AAC9C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC1C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;YACnC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM;AACtD,YAAA,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ;AACb,iBAAC,OAAO,YAAY,KAAK,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;gBAC7D,IAAI,CAAC,eAAe;AACtB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC;YAC/D,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,IAAI;AAC5D,QAAA,CAAC,6FAAC;;AAGQ,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAChC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,gBAAA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAC9D,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,KAAK,IAAI,CACjC,CAAC,MAAM;YACV;YACA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,CAAC;AACxC,QAAA,CAAC,8EAAC;;AAGQ,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACtC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAC5B,IAAI,OAAO,GAAG,CAAC;AACf,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,KAAI;AACpE,gBAAA,IACE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,CAAC,MAAM;AACrE,oBAAA,CAAC,EACD;oBACA,OAAO,IAAI,CAAC;gBACd;AACF,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,oFAAC;;QAIQ,IAAA,CAAA,cAAc,GAAG,MAAM,CAAmB;AAClD,YAAA,GAAG,EAAE,IAAI;AACT,YAAA,KAAK,EAAE,IAAI;AACZ,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QACF,IAAA,CAAA,cAAc,GAAkB,IAAI;;AAG5B,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,MAAK;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;AACnC,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,KAAK;AACjC,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;AAClC,QAAA,CAAC,uFAAC;;AAOM,QAAA,IAAA,CAAA,oBAAoB,GAAG,eAAe,CAAC,MAAK;AAClD,YAAA,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;gBACzC;YACF;AACA,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa;AACrC,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,cAAc,CAAC,MAAK;AAC7C,gBAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;oBAC3B,IAAI,CAAC,oBAAoB,EAAE;gBAC7B;AACF,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YACzC,IAAI,KAAK,EAAE;AACT,gBAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC;YACrC;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,CAAC;AACtE,QAAA,CAAC,CAAC;;AAGM,QAAA,IAAA,CAAA,qBAAqB,GAAG,iBAAiB,CAAC,MAAK;YACrD,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;gBAC3B,IAAI,CAAC,oBAAoB,EAAE;YAC7B;AACF,QAAA,CAAC,CAAC;AA+MM,QAAA,IAAA,CAAA,YAAY,GAAG,CACrB,CAAgC,EAChC,CAAgC,KACtB;AACV,YAAA,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;AACpD,QAAA,CAAC;AAES,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACvC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAC5B,IAAI,CAAC,MAAM,CAAC,OAAO;AAAE,gBAAA,OAAO,EAAE;AAC9B,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;AACjC,iBAAA,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAkC;AACvE,iBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AAC5B,QAAA,CAAC,qFAAC;AAEQ,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACpC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAC5B,IAAI,CAAC,MAAM,CAAC,IAAI;AAAE,gBAAA,OAAO,EAAE;AAC3B,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;AAC9B,iBAAA,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAkC;AACvE,iBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AAC5B,QAAA,CAAC,kFAAC;;AAkBM,QAAA,IAAA,CAAA,+BAA+B,GAAG,IAAI,OAAO,EAAQ;AACrD,QAAA,IAAA,CAAA,oBAAoB,GAAG,SAAS,CACtC,QAAQ,EACR,SAAS,CACV,CAAC,IAAI,CACJ,MAAM,CACJ,CAAC,KAAK,KACJ,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAC3E,CACF;AA6IF,IAAA;;aA/qByB,IAAA,CAAA,iBAAiB,GAAG,EAAH,CAAM;;AAuM/C,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE;IAC/B;;IA6FQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE;YACV;QACF;QACA,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,UAAU,CAAuB;QACvE,IAAI,CAAC,SAAS,EAAE;YACd;QACF;AACA,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY;AACnC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY;;QAEnC,IAAI,IAAI,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE;YAC/B;QACF;QACA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC;AACvE,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;IAC5B;AAMA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,QAAQ,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;IAC3D;AAGA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,QAAQ,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;IACvD;AAGA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,QAAQ,IAAI,CAAC,UAAU,KAAK,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;IAC3D;AAGA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,QAAQ,IAAI,CAAC,aAAa,KAAK,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1D;AAGA,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,QAAQ,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;IAC1D;AAGA,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,QAAQ,IAAI,CAAC,OAAO,KAAK,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IACnD;AAGA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,QAAQ,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;IACjE;AAGA,IAAA,IAAI,uBAAuB,GAAA;AACzB,QAAA,QAAQ,IAAI,CAAC,wBAAwB,KAAK,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC;IACrF;AAGA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,QAAQ,IAAI,CAAC,cAAc,KAAK,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;IACjE;AAGA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,QAAQ,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;IAChE;AAGA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,QAAQ,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;IACvD;;AAIA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE;IACtC;IACA,IAAI,eAAe,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;IAChE;;AAIU,IAAA,YAAY,CAAC,GAAW,EAAA;AAChC,QAAA,OAAO,CAAC,KAAiB,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC;IAC1D;AAEA,IAAA,SAAS,CAAC,GAAa,EAAE,KAAa,EAAE,KAAiB,EAAA;AACvD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC3C;AAEA,IAAA,UAAU,CAAC,GAAa,EAAE,KAAa,EAAE,KAAoB,EAAA;AAC3D,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC5C;IAKA,WAAW,CACT,GAA2B,EAC3B,KAAkC,EAAA;AAElC,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC3B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE;YAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;AACrD,YAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC7B,gBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC;YAC9C;QACF;AAAO,aAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;;QAEpC;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;QAC/B;IACF;AAEU,IAAA,YAAY,CACpB,GAAoB,EACpB,KAAoB,EACpB,KAAkC,EAAA;AAElC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE;AACrC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;;AAG7B,QAAA,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE;AACtB,YAAA,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;gBAAE;AAChD,YAAA,IACE,CAAC,KAAK;gBACN,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG;gBAE3B;QACJ;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK;YAAE;AAErD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAChD;;IAGA,SAAS,CAAC,GAAmB,EAAE,MAAmB,EAAA;AAChD,QAAA,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,KAAK,IAAI;AAC1C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE;QACrC,IAAI,YAAY,GAAY,KAAK;QACjC,IAAI,QAAQ,GAAgB,EAAE;QAE9B,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,oBAAoB,GAAG,YAAY,CAAC,SAAS,CACjD,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,GAAG,CAC7B;AACD,YAAA,IAAI,oBAAoB,KAAK,CAAC,CAAC,EAAE;AAC/B,gBAAA,QAAQ,GAAG,CAAC,GAAG,YAAY,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACrD;iBAAO;AACL,gBAAA,YAAY,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC,KAAK;AACvD,gBAAA,MAAM,YAAY,GAAG,YAAY,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK;AAC5D,gBAAA,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC;gBAC5B,QAAQ,CAAC,oBAAoB,CAAC,GAAG;oBAC/B,GAAG,QAAQ,CAAC,oBAAoB,CAAC;AACjC,oBAAA,KAAK,EAAE,YAAY;iBACpB;YACH;QACF;aAAO;AACL,YAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,gBAAA,MAAM,oBAAoB,GAAG,YAAY,CAAC,SAAS,CACjD,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,GAAG,CAC7B;AACD,gBAAA,IAAI,oBAAoB,KAAK,CAAC,CAAC,EAAE;oBAC/B,QAAQ,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBACpC;qBAAO;AACL,oBAAA,YAAY,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC,KAAK;AACvD,oBAAA,MAAM,YAAY,GAAG,YAAY,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK;oBAC5D,QAAQ,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;gBAC3C;YACF;iBAAO;gBACL,QAAQ,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;YAC3C;QACF;AAEA,QAAA,MAAM,SAAS,GAAgB;YAC7B,GAAG;AACH,YAAA,KAAK,EAAE,YAAY;AACnB,YAAA,gBAAgB,EAAE,QAAQ;AAC1B,YAAA,UAAU,EAAE,QAAQ;SACrB;QAED,IAAI,MAAM,EAAE;AACV,YAAA,SAAS,CAAC,KAAK,GAAG,MAAM;QAC1B;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;AAE/B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE;AAC/B,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5B,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;QACrC;IACF;AAyBA,IAAA,WAAW,CACT,MAAW,EACX,KAAa,EACb,eAAuC,IAAI,EAAA;QAE3C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAC/B,QAAA,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,KACjC,aAAa,CAAC,YAAY,CAAC;AAC3B,aAAC,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,YAAY,GAAG,EAAE,CAAC,EACnD,MAAM,CACP;IACH;IAeU,sBAAsB,GAAA;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,+BAA+B,EAAE;YACnD;QACF;AAEA,QAAA,IAAI,CAAC,+BAA+B,CAAC,IAAI,EAAE;AAC3C,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CACH,SAAS,CAAC,IAAI,CAAC,+BAA+B,CAAC,EAC/C,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;AAE9B,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AACjC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACjD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS;AAEhC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;YACzD,IAAI,WAAW,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;AAC/C,gBAAA,MAAM,QAAQ,GACZ,IAAI,CAAC,cAAc,GAAG,WAAW,IAAI,SAAS,EAAE,QAAQ,IAAI,CAAC,CAAC;AAChE,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC;gBAChD;YACF;AAEA,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;YACjE,IAAI,eAAe,EAAE;gBACnB,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC;YAClE;AACF,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,6BAA6B,CAAC,QAA0B,EAAA;QACtD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,+BAA+B,EAAE;YACnD;QACF;AACA,QAAA,IAAI,QAAQ,KAAK,QAAQ,CAAC,aAAa,EAAE;AACvC,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,EAAE;AACrC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACxB;AACA,YAAA,IAAI,CAAC,+BAA+B,CAAC,IAAI,EAAE;QAC7C;IACF;AAEQ,IAAA,sBAAsB,CAC5B,KAAoB,EACpB,IAAW,EACX,WAAmB,EACnB,SAAc,EAAA;AAEd,QAAA,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS;AAClE,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;AACpC,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc;QAClC,IAAI,aAAa,GAAG,CAAC;AAErB,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,eAAe,GAAG,CAAC;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC;YAC1B;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;YACvB,MAAM,iBAAiB,GAAG;AACxB,kBAAE,IAAI,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,GAAG;kBAC/D,YAAY;AAChB,YAAA,IAAI,SAAS,EAAE,SAAS,EAAE;gBACxB,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,SAAS,GAAG,CAAC;YAChD;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,KAAK,CAAC;YAC1C;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;YAC7B,aAAa,GAAG,CAAC;QACnB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;YAClC,aAAa,GAAG,CAAC,CAAC;QACpB;AAEA,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;YACrB,QAAQ,GAAG,CAAC;QACd;AAAO,aAAA,IACL,QAAQ,GAAG,aAAa,IAAI,CAAC;AAC7B,YAAA,QAAQ,GAAG,aAAa,IAAI,YAAY,EACxC;AACA,YAAA,QAAQ,GAAG,QAAQ,GAAG,aAAa;QACrC;AAEA,QAAA,IAAI,aAAa,IAAI,SAAS,EAAE,QAAQ,EAAE;YACxC,MAAM,aAAa,GAAG,WAAW,GAAG,CAAC,GAAG,SAAS,CAAC,SAAS;AAC3D,YAAA,MAAM,iBAAiB,GACrB,IAAI,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,GAAG,CAAC;YAClE,MAAM,QAAQ,GAAG;AACf,kBAAE,SAAS,EAAE,QAAQ,GAAG;kBACtB,iBAAiB;YAErB,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,WAAW,GAAG,CAAC,EAAE;AAChD,gBAAA,IAAI,CAAC,eAAe,GAAG,WAAW,GAAG,CAAC;AACtC,gBAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC;gBACjC;YACF;iBAAO,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,aAAa,EAAE;gBACtD,IACE,WAAW,GAAG,CAAC,KAAK,SAAS,CAAC,SAAS,GAAG,CAAC;oBAC3C,QAAQ,GAAG,iBAAiB,EAC5B;AACA,oBAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,KAAK,CAAC;gBAC5C;AACA,gBAAA,IAAI,CAAC,eAAe,GAAG,WAAW,GAAG,CAAC;AACtC,gBAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC;gBACjC;YACF;YAEA,IACE,WAAW,GAAG,CAAC;AACf,gBAAA,aAAa,GAAG,CAAC;gBACjB,QAAQ,GAAG,aAAa,IAAI,YAAY;gBACxC,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,aAAa,GAAG,CAAC,EAC9C;gBACA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,GAAG,CAAC,EAAE,KAAK,CAAC;AAChD,gBAAA,IAAI,CAAC,eAAe,GAAG,WAAW,GAAG,CAAC;gBACtC;YACF;AAEA,YAAA,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,EAAE,QAAQ;AAEhD,YAAA,IAAI,QAAQ,GAAG,QAAQ,IAAI,WAAW,GAAG,CAAC,GAAG,SAAS,CAAC,SAAS,EAAE;AAChE,gBAAA,IAAI,CAAC,eAAe,GAAG,WAAW,GAAG,CAAC;YACxC;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,EAAE,KAAK,CAAC;YACpE;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC;IACnC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC7B,QAAA,IAAI,CAAC,+BAA+B,CAAC,IAAI,EAAE;AAC3C,QAAA,IAAI,CAAC,+BAA+B,CAAC,QAAQ,EAAE;IACjD;+GAprBW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,0yEC7E1B,mqqBAyeA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnaI,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,gBAAgB,+IALhB,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACf,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACb,YAAY,4CACZ,gBAAgB,EAAA,IAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAGhB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,WAAW,+CACX,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGJ,aAAa,EAAA,UAAA,EAAA,CAAA;kBAhBzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,eAAA,EAEhB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,eAAe;wBACf,aAAa;wBACb,YAAY;wBACZ,gBAAgB;wBAChB,iBAAiB;wBACjB,gBAAgB;wBAChB,SAAS;wBACT,WAAW;wBACX,aAAa;AACd,qBAAA,EAAA,QAAA,EAAA,mqqBAAA,EAAA;;;MEjBU,gBAAgB,CAAA;AA3C7B,IAAA,WAAA,GAAA;AA4CW,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAkB,EAAE,2EAAC;AACjC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,CAAC,4EAAC;AAChB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,gFAAC;QAChD,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC;AACvB,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,QAAQ,EAAE,cAAc;AACxB,YAAA,QAAQ,EAAE,aAAa;AACxB,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACO,QAAA,IAAA,CAAA,GAAG,GAAG,KAAK,CAAC,OAAO,0EAAC;AACpB,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAgB,IAAI,yFAAC;AAC/C,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAyB,IAAI,mFAAC;AAClD,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAA+B,SAAS,oFAAC;AAE9D,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAsB,MAAK;AAClD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,SAAS;AAEhD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AAExC,YAAA,MAAM,UAAU,GACd,KAAK,KAAK;AACR,kBAAE;AACF,kBAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAY;qBAC3B,SAAS,KAAK;0BACV,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG;0BACnB,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAY,CAAC;AAC3C,YAAA,MAAM,SAAS,GACb,KAAK,KAAK;AACR,kBAAE;kBACA,SAAS,KAAK;sBACb,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG;sBACnB,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAY;AAEtC,YAAA,MAAM,QAAQ,GACZ,KAAK,KAAK;AACR,kBAAE;AACF,kBAAE,IAAI,CAAC,IAAI,CAAC,UAAoB,CAAC;AAC/B,oBAAA,IAAI,CAAC,GAAG,CAAE,UAAqB,GAAG,SAAS,CAAC;YAElD,OAAO;AACL,gBAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;AAChC,sBAAG;sBACD,KAAK,KAAK;AACZ,0BAAG;AACH,0BAAG,IAAI,CAAC,kBAAkB,EAAa;AACzC,gBAAA,QAAQ,EAAE,UAAoB;aAC/B;AACH,QAAA,CAAC,4EAAC;AACH,IAAA;+GApDY,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAzCjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EASsB,gBAAgB,+IAA7B,WAAW,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAEV,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBA3C5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EAAA,QAAA,EACV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BT,EAAA,eAAA,EAQgB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAAA,MAAA,EAAA,CAAA,+BAAA,CAAA,EAAA;;;MChD7B,sBAAsB,CAAA;+GAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,YAHvB,aAAa,EAAE,gBAAgB,CAAA,EAAA,OAAA,EAAA,CAC/B,aAAa,EAAE,gBAAgB,CAAA,EAAA,CAAA,CAAA;gHAE9B,sBAAsB,EAAA,CAAA,CAAA;;4FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAJlC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,gBAAgB,CAAC;AAC1C,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,gBAAgB,CAAC;AAC3C,iBAAA;;;MCWY,mBAAmB,CAAA;AALhC,IAAA,WAAA,GAAA;AAMW,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAiB;AAEvC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAA+B,SAAS,iFAAC;AAC3D,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAC,CAAC,uFAAC;QAC3B,IAAA,CAAA,OAAO,GAAG,KAAK,CAAsB;AAC5C,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,MAAM,EAAE,WAAW;AACpB,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QACO,IAAA,CAAA,UAAU,GAAG,KAAK,CAAyB;AAClD,YAAA,GAAG,EAAE,kBAAkB;AACvB,YAAA,MAAM,EAAE,aAAa;AACtB,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAGQ,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AAC5C,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;AACxB,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,EAAE;AAClC,YAAA,MAAM,WAAW,GAAG,GAAG,CAAC,sBAAsB,EAAE;YAChD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;AACxD,QAAA,CAAC,0FAAC;;AAGQ,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACxC,YAAA,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,sBAAsB,EAAE;AAC9C,QAAA,CAAC,sFAAC;AAkDH,IAAA;IAhDS,aAAa,CACnB,aAAqB,EACrB,eAAuB,EAAA;AAEvB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;AAC5C,QAAA,MAAM,MAAM,GACV,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa;AAE/D,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAI;AACrC,YAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AACX,gBAAA,OAAO,CAAC;YACV;AAAO,iBAAA,IAAI,aAAa,GAAG,aAAa,EAAE;gBACxC,OAAO,CAAC,GAAG,CAAC;YACd;AAAO,iBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE;AAC3B,gBAAA,OAAO,aAAa;YACtB;iBAAO,IACL,eAAe,GAAG,MAAM;AACxB,gBAAA,eAAe,GAAG,aAAa,GAAG,MAAM,EACxC;gBACA,OAAO,CAAC,GAAG,eAAe,IAAI,MAAM,GAAG,CAAC,CAAC;YAC3C;iBAAO,IACL,eAAe,GAAG,MAAM;gBACxB,eAAe,GAAG,aAAa,IAAI,MAAM,GAAG,CAAC,CAAC,EAC9C;AACA,gBAAA,OAAO,CAAC,GAAG,eAAe,GAAG,MAAM;YACrC;iBAAO,IACL,eAAe,GAAG,MAAM;gBACxB,eAAe,KAAK,aAAa,IAAI,MAAM,GAAG,CAAC,CAAC,EAChD;gBACA,OAAO,CAAC,GAAG,eAAe,IAAI,MAAM,GAAG,CAAC,CAAC;YAC3C;iBAAO,IACL,eAAe,GAAG,MAAM;AACxB,gBAAA,eAAe,KAAK,aAAa,GAAG,CAAC,EACrC;gBACA,OAAO,CAAC,GAAG,eAAe,IAAI,MAAM,GAAG,CAAC,CAAC;YAC3C;iBAAO;gBACL,OAAO,CAAC,GAAG,CAAC;YACd;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;QACxB,IAAI,GAAG,EAAE;AACP,YAAA,GAAG,CAAC,eAAe,GAAG,KAAK,GAAG,CAAC;QACjC;IACF;+GA3EW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,owBClBhC,mlCAmCA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FDjBa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAL/B,SAAS;+BACE,kCAAkC,EAAA,eAAA,EAE3B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,mlCAAA,EAAA;;;MERpC,4BAA4B,CAAA;+GAA5B,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,OAAA,EAAA,CAH7B,YAAY,EAAE,mBAAmB,aACjC,mBAAmB,CAAA,EAAA,CAAA,CAAA;AAElB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4BAA4B,YAH7B,YAAY,CAAA,EAAA,CAAA,CAAA;;4FAGX,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAJxC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,mBAAmB,CAAC;oBAC5C,OAAO,EAAE,CAAC,mBAAmB,CAAC;AAC/B,iBAAA;;;ACPD;;AAEG;;ACFH;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular-generic-table/core",
3
- "version": "5.0.0",
3
+ "version": "5.1.0",
4
4
  "author": "Robert Hjalmers <opensource@rhj.se> (http://www.linkedin.com/in/robert-hjalmers/)",
5
5
  "license": "MIT",
6
6
  "repository": {
package/scss/index.scss CHANGED
@@ -65,6 +65,11 @@ $skeleton-height: var(--gt-skeleton-height, 169px) !default;
65
65
  }
66
66
 
67
67
  @mixin default-style {
68
+ // Custom elements default to inline; make the host a block so its height can
69
+ // be constrained by a wrapper (required for `pagination: { length: 'auto' }`).
70
+ angular-generic-table {
71
+ display: block;
72
+ }
68
73
  #{$style-selector} {
69
74
  thead tr th {
70
75
  // sort button
@@ -80,7 +80,10 @@ interface TableConfig<R = TableRow> {
80
80
  [Property in keyof R]: TableColumn<R>;
81
81
  };
82
82
  pagination?: {
83
- length?: number;
83
+ /** Rows per page. Use a number for a fixed page size, or `'auto'` to display
84
+ * as many rows as fit the available height. For `'auto'` to work the table
85
+ * must be placed inside a height-constrained container/wrapper. <p>**Default:** `undefined`</p>*/
86
+ length?: number | 'auto';
84
87
  };
85
88
  rowClick?: boolean;
86
89
  /** Toggle row active state on mouse enter/leave (hover) <p>**Default:** `false`</p>*/
@@ -201,7 +204,10 @@ interface TableMeta<R = TableRow> {
201
204
 
202
205
  declare class CoreComponent implements OnDestroy {
203
206
  private _destroyRef;
207
+ private _host;
204
208
  private _unsubscribe$;
209
+ /** Initial page size used by `length: 'auto'` before the container is measured */
210
+ private static readonly DEFAULT_AUTO_ROWS;
205
211
  readonly navigationKeys: _angular_core.InputSignal<string[]>;
206
212
  readonly selectKeys: _angular_core.InputSignal<string[]>;
207
213
  readonly config: _angular_core.InputSignal<TableConfig<any>>;
@@ -228,6 +234,10 @@ declare class CoreComponent implements OnDestroy {
228
234
  readonly pageChange: _angular_core.OutputEmitterRef<GtPageChangeEvent>;
229
235
  protected sortOrder: _angular_core.WritableSignal<GtSortOrder<any>>;
230
236
  protected currentPaginationIndex: _angular_core.WritableSignal<number>;
237
+ /** Page size measured from the container height, used when `length: 'auto'` */
238
+ private autoPageSize;
239
+ /** Whether pagination is in auto (fit-to-container) mode */
240
+ protected isAutoPagination: _angular_core.Signal<boolean>;
231
241
  protected customClasses: _angular_core.Signal<{
232
242
  selectedRow: string;
233
243
  activeRow: string;
@@ -260,6 +270,11 @@ declare class CoreComponent implements OnDestroy {
260
270
  protected rowActiveState: _angular_core.WritableSignal<GtRowActiveEvent<TableRow>>;
261
271
  activeRowIndex: number | null;
262
272
  private _rowActiveEffect;
273
+ private _resizeObserver?;
274
+ private _setupAutoPagination;
275
+ private _autoPaginationEffect;
276
+ /** Measure available height and derive how many rows fit (auto pagination) */
277
+ private _measureAutoPageSize;
263
278
  private _sortOrder$?;
264
279
  get sortOrder$(): Observable<GtSortOrder>;
265
280
  private _loading$?;