@angular-generic-table/core 5.0.0-rc.9 → 5.0.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.
Files changed (49) hide show
  1. package/fesm2022/angular-generic-table-core.mjs +1065 -0
  2. package/fesm2022/angular-generic-table-core.mjs.map +1 -0
  3. package/package.json +10 -16
  4. package/scss/index.scss +231 -14
  5. package/types/angular-generic-table-core.d.ts +396 -0
  6. package/angular-generic-table-core.d.ts +0 -5
  7. package/esm2020/angular-generic-table-core.mjs +0 -5
  8. package/esm2020/lib/core.component.mjs +0 -122
  9. package/esm2020/lib/core.module.mjs +0 -23
  10. package/esm2020/lib/core.service.mjs +0 -14
  11. package/esm2020/lib/enums/order.enum.mjs +0 -6
  12. package/esm2020/lib/models/table-column.interface.mjs +0 -2
  13. package/esm2020/lib/models/table-config.interface.mjs +0 -2
  14. package/esm2020/lib/models/table-info.interface.mjs +0 -2
  15. package/esm2020/lib/models/table-meta.interface.mjs +0 -2
  16. package/esm2020/lib/models/table-row.interface.mjs +0 -2
  17. package/esm2020/lib/models/table-sort.interface.mjs +0 -2
  18. package/esm2020/lib/pagination/pagination.component.mjs +0 -63
  19. package/esm2020/lib/pagination/pagination.module.mjs +0 -18
  20. package/esm2020/lib/pipes/capital-case.pipe.mjs +0 -17
  21. package/esm2020/lib/pipes/dash-case.pipe.mjs +0 -17
  22. package/esm2020/lib/pipes/dynamic.pipe.mjs +0 -25
  23. package/esm2020/lib/pipes/highlight.pipe.mjs +0 -48
  24. package/esm2020/lib/pipes/sort-class.pipe.mjs +0 -16
  25. package/esm2020/lib/utilities/utilities.mjs +0 -39
  26. package/esm2020/public-api.mjs +0 -15
  27. package/fesm2015/angular-generic-table-core.mjs +0 -384
  28. package/fesm2015/angular-generic-table-core.mjs.map +0 -1
  29. package/fesm2020/angular-generic-table-core.mjs +0 -381
  30. package/fesm2020/angular-generic-table-core.mjs.map +0 -1
  31. package/lib/core.component.d.ts +0 -33
  32. package/lib/core.module.d.ts +0 -13
  33. package/lib/core.service.d.ts +0 -6
  34. package/lib/enums/order.enum.d.ts +0 -4
  35. package/lib/models/table-column.interface.d.ts +0 -15
  36. package/lib/models/table-config.interface.d.ts +0 -15
  37. package/lib/models/table-info.interface.d.ts +0 -4
  38. package/lib/models/table-meta.interface.d.ts +0 -8
  39. package/lib/models/table-row.interface.d.ts +0 -4
  40. package/lib/models/table-sort.interface.d.ts +0 -5
  41. package/lib/pagination/pagination.component.d.ts +0 -14
  42. package/lib/pagination/pagination.module.d.ts +0 -8
  43. package/lib/pipes/capital-case.pipe.d.ts +0 -7
  44. package/lib/pipes/dash-case.pipe.d.ts +0 -7
  45. package/lib/pipes/dynamic.pipe.d.ts +0 -9
  46. package/lib/pipes/highlight.pipe.d.ts +0 -7
  47. package/lib/pipes/sort-class.pipe.d.ts +0 -11
  48. package/lib/utilities/utilities.d.ts +0 -6
  49. package/public-api.d.ts +0 -11
@@ -0,0 +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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular-generic-table/core",
3
- "version": "5.0.0-rc.9",
3
+ "version": "5.0.0",
4
4
  "author": "Robert Hjalmers <opensource@rhj.se> (http://www.linkedin.com/in/robert-hjalmers/)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -8,30 +8,24 @@
8
8
  "url": "https://github.com/hjalmers/angular-generic-table.git"
9
9
  },
10
10
  "peerDependencies": {
11
- "@angular/common": "^12.0.0 || ^13.0.0",
12
- "@angular/core": "^12.0.0 || ^13.0.0"
11
+ "@angular/common": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
12
+ "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
13
+ "rxjs": "^7.0.0"
13
14
  },
14
15
  "dependencies": {
15
16
  "tslib": "^2.0.0"
16
17
  },
17
- "module": "fesm2015/angular-generic-table-core.mjs",
18
- "es2020": "fesm2020/angular-generic-table-core.mjs",
19
- "esm2020": "esm2020/angular-generic-table-core.mjs",
20
- "fesm2020": "fesm2020/angular-generic-table-core.mjs",
21
- "fesm2015": "fesm2015/angular-generic-table-core.mjs",
22
- "typings": "angular-generic-table-core.d.ts",
18
+ "module": "fesm2022/angular-generic-table-core.mjs",
19
+ "typings": "types/angular-generic-table-core.d.ts",
23
20
  "exports": {
24
21
  "./package.json": {
25
22
  "default": "./package.json"
26
23
  },
27
24
  ".": {
28
- "types": "./angular-generic-table-core.d.ts",
29
- "esm2020": "./esm2020/angular-generic-table-core.mjs",
30
- "es2020": "./fesm2020/angular-generic-table-core.mjs",
31
- "es2015": "./fesm2015/angular-generic-table-core.mjs",
32
- "node": "./fesm2015/angular-generic-table-core.mjs",
33
- "default": "./fesm2020/angular-generic-table-core.mjs"
25
+ "types": "./types/angular-generic-table-core.d.ts",
26
+ "default": "./fesm2022/angular-generic-table-core.mjs"
34
27
  }
35
28
  },
36
- "sideEffects": false
29
+ "sideEffects": false,
30
+ "type": "module"
37
31
  }
package/scss/index.scss CHANGED
@@ -1,32 +1,172 @@
1
1
  $highlight-background-color: #ffdd00 !default;
2
- $mobile-style-selector: 'table.table-mobile' !default;
2
+ $style-selector: '.table' !default;
3
+ $footer-header-font-weight: 400 !default;
4
+ $footer-cell-font-weight: 500 !default;
5
+ $footer-header-text-align: end !default;
6
+ $footer-border-top: solid 2px var(--bs-table-color, #000) !default;
7
+ $mobile-style-selector: 'table.table-mobile:not(.table-horizontal)' !default;
3
8
  $mobile-style-max-width: 576px !default;
4
9
  $mobile-style-header-font-weight: 500 !default;
5
- $mobile-style-header-background-color: #fff !default;
10
+ $mobile-style-header-background-color: var(--bs-body-bg, #fff) !default;
6
11
  $mobile-style-button-selector: '.btn-sm' !default;
7
- $mobile-style-border-bottom: solid 1px #dedede !default;
12
+ $mobile-style-border-bottom: var(--bs-border-style, solid) var(--bs-border-width, 1px) var(--bs-border-color, #dedede) !default;
8
13
  $mobile-style-button-font-size: 1rem !default;
9
- $mobile-style-button-padding: 0.5625rem 1rem !default;
14
+ $mobile-style-button-padding: 0.375rem 0.75rem !default;
10
15
  $pagination-ellipsis-content: '...' !default;
11
- $pagination-active-color: #000 !default;
16
+ $pagination-active-color: var(--bs-light, #000) !default;
12
17
  $pagination-justify-content: center !default;
18
+ $cell-padding-y: 0.5rem !default;
19
+ $cell-padding-x: 0.5rem !default;
20
+ $sort-selector: '.gt-sort' !default;
13
21
 
22
+ $table-column-header-bg: var(--bs-body-bg);
23
+ $table-row-header-bg: var(--bs-body-bg);
24
+
25
+ $delta-positive-prefix: '+' !default;
26
+
27
+ $sort-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 448 644'%3E%3Cpath transform='translate(0 240)' d='M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z'/%3E%3Cpath transform='translate(0 -100)' d='M240.971 130.524l194.343 194.343c9.373 9.373 9.373 24.569 0 33.941l-22.667 22.667c-9.357 9.357-24.522 9.375-33.901.04L224 227.495 69.255 381.516c-9.379 9.335-24.544 9.317-33.901-.04l-22.667-22.667c-9.373-9.373-9.373-24.569 0-33.941L207.03 130.525c9.372-9.373 24.568-9.373 33.941-.001z'/%3E%3C/svg%3E") !default;
28
+ //$sort-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-arrows-sort' width='24' height='24' viewBox='0 0 24 24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M3 9l4 -4l4 4m-4 -4v14'%3E%3C/path%3E%3Cpath d='M21 15l-4 4l-4 -4m4 4v-14'%3E%3C/path%3E%3C/svg%3E") !default;
29
+ $sort-icon-size: 1rem;
30
+ $sort-icon-color: rgba(var(--bs-secondary-rgb, #000),0.25) !default;
31
+ $sort-icon-color-active: var(--bs-primary, #000) !default;
32
+ $ascending-sort-gradient: linear-gradient(1turn,
33
+ $sort-icon-color 50%,
34
+ $sort-icon-color-active 50%
35
+ ) !default;
36
+ $descending-sort-gradient: linear-gradient(
37
+ $sort-icon-color 50%,
38
+ $sort-icon-color-active 50%
39
+ ) !default;
40
+ /*$ascending-sort-gradient: linear-gradient(0.25turn,
41
+ $sort-icon-color 50%,
42
+ $sort-icon-color-active 50%
43
+ ) !default;
44
+ $descending-sort-gradient: linear-gradient(0.75turn,
45
+ $sort-icon-color 50%,
46
+ $sort-icon-color-active 50%
47
+ ) !default;
48
+ */
49
+
50
+ $skeleton-loader-highlight-color: var(--bs-gray-300, rgb(200,200,200)) !default;
51
+ $skeleton-loader-background-color: var(--bs-gray-200, rgb(240,240,240)) !default;
52
+ $skeleton-loader-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' id='a' viewBox='0 0 768 135'%3E%3Cdefs/%3E%3Cpath fill='%23FFF' d='M114 10h100v24H114V10ZM114 55h120v24H114V55ZM114 100h130v24H114v-24ZM268 10h100v24H268V10ZM268 55h80v24h-80V55ZM268 100h100v24H268v-24ZM402 10h90v24h-90V10ZM402 55h70v24h-70V55ZM402 100h80v24h-80v-24ZM516 10h90v24h-90V10ZM516 55h110v24H516V55ZM516 100h120v24H516v-24ZM660 100h74v24h-74v-24ZM660 55h64v24h-64V55ZM660 10h84v24h-84V10ZM0 100h80v24H0v-24ZM0 55h70v24H0V55ZM0 10h90v24H0V10ZM0 134h768v1H0v-1ZM0 89h768v1H0v-1ZM0 44h768v1H0v-1Z' class='b'/%3E%3C/svg%3E") !default;
53
+ $skeleton-loader-mask-size: 768px 135px !default;
54
+
55
+ $skeleton-height: var(--gt-skeleton-height, 169px) !default;
14
56
  @mixin styles() {
57
+ @include default-style;
58
+ @include footer-style;
15
59
  @include search-style;
16
60
  @include mobile-style;
17
61
  @include pagination-style;
62
+ @include delta-style;
63
+ @include sticky-style;
64
+ @include skeleton-loader-styles;
65
+ }
66
+
67
+ @mixin default-style {
68
+ #{$style-selector} {
69
+ thead tr th {
70
+ // sort button
71
+ &[aria-sort],
72
+ &.gt-sortable {
73
+ > #{$sort-selector} {
74
+ appearance: none;
75
+ font: inherit;
76
+ margin: 0;
77
+ padding: $cell-padding-y $cell-padding-x;
78
+ margin: -#{$cell-padding-y} -#{$cell-padding-x};
79
+ border: none;
80
+ background: none;
81
+ color: inherit;
82
+ width: 100%;
83
+ text-align: left;
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: inherit;
87
+ transition: box-shadow 0.25s ease-in-out;
88
+ &[data-sort-order]::before {
89
+ content: attr(data-sort-order);
90
+ order: 2;
91
+ font-variant: diagonal-fractions;
92
+ font-weight: normal;
93
+ align-self: flex-start;
94
+ line-height: initial;
95
+ }
96
+ &::after {
97
+ content: '';
98
+ background: $sort-icon-color;
99
+ width: $sort-icon-size;
100
+ height: $sort-icon-size;
101
+ margin-left: 0.25rem;
102
+ mask-image: $sort-icon;
103
+ mask-repeat: no-repeat;
104
+ mask-size: cover;
105
+ mask-position: right;
106
+ display: block;
107
+ flex-shrink: 0;
108
+ }
109
+ &:focus-visible {
110
+ box-shadow: inset rgba(var(--bs-primary-rgb, (0,0,0)),0.35) 0 0 0 4px;
111
+ outline: none;
112
+ border-radius: 4px;
113
+ }
114
+ }
115
+ }
116
+ &[aria-sort='ascending'] {
117
+ #{$sort-selector}::after {
118
+ background: $ascending-sort-gradient;
119
+ }
120
+ }
121
+ &[aria-sort='descending'] {
122
+ #{$sort-selector}::after {
123
+ background: $descending-sort-gradient;
124
+ }
125
+ }
126
+ }
127
+ tr {
128
+ th, td {
129
+ padding: $cell-padding-y $cell-padding-x;
130
+ }
131
+ }
132
+ tfoot {
133
+ th {
134
+ font-weight: $footer-header-font-weight;
135
+ text-align: $footer-header-text-align;
136
+ }
137
+ td[data-header]:first-child {
138
+ display: flex;
139
+ justify-content: space-between;
140
+ align-items: center;
141
+ border-top: none !important;
142
+ &::before {
143
+ content: attr(data-header);
144
+ display: block;
145
+ font-weight: $footer-header-font-weight;
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+
152
+ @mixin footer-style {
153
+ tfoot tr:first-child {
154
+ border-top: $footer-border-top;
155
+ }
156
+ tfoot tr th {
157
+ font-weight: $footer-header-font-weight;
158
+ }
159
+ tfoot tr td {
160
+ font-weight: $footer-cell-font-weight;
161
+ }
18
162
  }
163
+
19
164
  @mixin search-style {
20
165
  .gt-highlight-search {
21
166
  background: $highlight-background-color;
22
167
  }
23
168
  }
24
169
  @mixin mobile-style($selector: $mobile-style-selector) {
25
- #{$selector} {
26
- .mobile-header {
27
- display: none;
28
- }
29
- }
30
170
  @media (max-width: $mobile-style-max-width) {
31
171
  #{$selector} {
32
172
  table-layout: fixed;
@@ -52,7 +192,7 @@ $pagination-justify-content: center !default;
52
192
  }
53
193
  }
54
194
  }
55
- tbody {
195
+ tbody, tfoot {
56
196
  tr {
57
197
  display: flex;
58
198
  flex-direction: column;
@@ -63,10 +203,12 @@ $pagination-justify-content: center !default;
63
203
  justify-content: space-between;
64
204
  align-items: center;
65
205
  border-top: none !important;
66
- & > .mobile-header {
67
- font-weight: $mobile-style-header-font-weight;
206
+ &::before {
207
+ content: attr(data-label);
68
208
  display: block;
209
+ font-weight: $mobile-style-header-font-weight;
69
210
  }
211
+
70
212
  #{$mobile-style-button-selector} {
71
213
  width: 100%;
72
214
  font-size: $mobile-style-button-font-size;
@@ -74,6 +216,17 @@ $pagination-justify-content: center !default;
74
216
  }
75
217
  }
76
218
  }
219
+ tfoot {
220
+ td:first-child::before {
221
+ font-weight: $mobile-style-header-font-weight;
222
+ }
223
+ td::before {
224
+ font-weight: normal;
225
+ }
226
+ td:not(:first-child).gt-no-content {
227
+ display: none;
228
+ }
229
+ }
77
230
  }
78
231
  }
79
232
  }
@@ -87,7 +240,7 @@ $pagination-justify-content: center !default;
87
240
  margin: 0;
88
241
  padding: 0;
89
242
  li {
90
- &.ellipsis::after {
243
+ &.gt-ellipsis > button::after {
91
244
  content: $pagination-ellipsis-content;
92
245
  display: inline-flex;
93
246
  }
@@ -99,4 +252,68 @@ $pagination-justify-content: center !default;
99
252
  }
100
253
  }
101
254
 
255
+ @mixin delta-style() {
256
+ .gt-delta {
257
+ display: flex;
258
+ &.gt-delta-positive > span {
259
+ display: inline-flex;
260
+ &::before {
261
+ display: block;
262
+ content: $delta-positive-prefix;
263
+ }
264
+ }
265
+ }
266
+ }
267
+ @mixin sticky-style() {
268
+ .gt-sticky-column-header thead tr th {
269
+ position: sticky;
270
+ top: 0;
271
+ background: $table-column-header-bg;
272
+ z-index: 2;
273
+ white-space: nowrap;
274
+ }
275
+
276
+ .gt-sticky-row-header {
277
+ tbody tr th.row-header, thead tr th:first-child {
278
+ position: sticky;
279
+ left: 0;
280
+ background: $table-row-header-bg;
281
+ z-index: 1;
282
+ white-space: nowrap;
283
+ }
284
+ thead tr th:first-child {
285
+ z-index: 3;
286
+ }
287
+ }
288
+ }
289
+
290
+ @mixin skeleton-loader-styles() {
291
+ .gt-skeleton-loader {
292
+ margin:0 0 0.625rem 0;
293
+ --gt-skeleton-loader-mask: #{$skeleton-loader-mask};
294
+ --gt-skeleton-loader-highlight-color: #{$skeleton-loader-highlight-color};
295
+ --gt-skeleton-loader-bg-color: #{$skeleton-loader-background-color};
296
+ @keyframes skeleton-loader {
297
+ 0% {
298
+ background-position: 0 0;
299
+ }
300
+ 25%,
301
+ 100% {
302
+ background-position: 200vw 0;
303
+ }
304
+ }
305
+ height: $skeleton-height;
306
+ mask-image: var(--gt-skeleton-loader-mask);
307
+ mask-size: $skeleton-loader-mask-size;
308
+ background: linear-gradient(
309
+ 280deg,
310
+ $skeleton-loader-background-color 12.5%,
311
+ $skeleton-loader-highlight-color 17.5%,
312
+ $skeleton-loader-background-color 37.5%
313
+ );
314
+ background-size: 200vw 100vw;
315
+ background-position: 0 0;
316
+ animation: skeleton-loader 3000ms linear infinite;
317
+ }
318
+ }
102
319