{"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 (\n                column.value?.headerReplaceFull && (column.value?.headerComponent || column.value?.headerTemplateRef)\n              ) {\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 }} {{\n              (headerRow.key | dashCase) + '-column'\n            }}\"\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 (\n            row of tableData.data[tableData.info.lazyLoaded ? 0 : paginationIdx];\n            track trackRowByFn($index, row);\n            let i = $index\n          ) {\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 [colSpan]=\"(colspanValue || 0) - (footerColspanValue || 0)\" scope=\"row\">\n              @if (configValue?.footer?.headers?.[calculation]) {\n                {{\n                  configValue.footer!.headers![calculation] === true\n                    ? (calculation | capitalCase)\n                    : configValue.footer!.headers![calculation]\n                }}\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\n                      ? (calculation | capitalCase)\n                      : 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 #highlighted let-row=\"row\" let-column=\"column\" let-search=\"search\" let-transform=\"transform\">\n  @if (!transform) {\n    <div [innerHTML]=\"row[column.key] | highlight: search\"></div>\n  } @else {\n    <div\n      [innerHTML]=\"\n        row[column.key] | dynamicPipe: transform.pipe : transform.args | highlight: search\n      \"\n    ></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 #transformData let-row=\"row\" let-column=\"column\" let-transform=\"transform\" let-data=\"data\">\n  {{ row[column.key] | dynamicPipe: transform.pipe : transform.args }}\n</ng-template>\n<ng-template #transformFooter let-value=\"value\" let-transform=\"transform\">\n  {{\n    (value | dynamicPipe: transform.pipe : transform.args) || config()?.footer?.emptyContent\n  }}\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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"}