@testgorilla/tgo-ui 7.0.3 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-table.mjs","sources":["../../../components/table/table.model.ts","../../../components/table/table.utils.ts","../../../components/table/sentence-case.pipe.ts","../../../components/table/table.component.ts","../../../components/table/table.component.html","../../../components/table/table.component.module.ts","../../../components/table/testgorilla-tgo-ui-components-table.ts"],"sourcesContent":["import { TemplateRef, Type } from '@angular/core';\n\nexport interface TableConfig<T = any> {\n columns: TableColumn<T>[];\n pagination?: Pagination;\n title?: string;\n width?: number;\n sort?: Sort;\n hidePagination?: boolean;\n noDataRowTpl?: TemplateRef<any>;\n sortable?: boolean;\n}\n\nexport interface TableConfigWithPagination<T> extends TableConfig<T> {\n pagination?: Pagination;\n}\n\nexport interface TableColumn<T = any> {\n title?: string;\n key: string;\n allowMultiline?: boolean;\n bold?: boolean;\n showTooltip?: boolean;\n tooltip?: string;\n allowSort?: boolean;\n isSticky?: boolean;\n headerCellTemplate?: TemplateRef<any>;\n rowCellTemplate?: TemplateRef<any>;\n rowCellTemplateClick?: () => any;\n sortHeader?: string;\n hidden?: boolean;\n order?: number;\n fontSize?: '12px' | '14px';\n field?: string;\n type?: ColumnType;\n function?: (v: T) => string;\n renderer?: (v: T) => ComponentRenderer | string;\n styles?: ColumnStyles;\n sortStart?: SortDirection;\n uniqueId?: string;\n}\n\nexport interface Pagination {\n itemsPerPageOptions: number[];\n itemsPerPage: number;\n currentPage: number;\n totalItems: number;\n}\n\nexport type TableData = Record<string, any>[];\n\nexport interface ColumnEllipse {\n index: number;\n showTooltip: boolean;\n}\n\nexport interface Sort {\n active: string;\n direction: SortDirection;\n defaultSortStart?: SortDirection;\n}\n\nexport type SortDirection = 'asc' | 'desc' | '';\n\nexport interface TableDetailColumn<T, TDetail> {\n columnDefs: TableColumn<TDetail>[];\n setDetailRowData: (params: DetailRowDataParams<T, TDetail>) => void;\n}\n\nexport interface DetailRowDataParams<T, TDetail> {\n data: T;\n\n setDetailDataSource(rowData: TDetail[]): void;\n}\n\nexport enum ColumnType {\n FIELD = 'field',\n FUNCTION = 'function',\n RENDERER = 'renderer',\n}\n\nexport interface ComponentRenderer {\n component: Type<any>;\n inputs?: any;\n outputs?: { [key: string]: any };\n}\n\nexport interface ColumnStyles {\n alignment?: ColumnAlignment;\n width?: string;\n 'min-width'?: string;\n padding?: string;\n}\n\nexport enum ColumnAlignment {\n LEFT = 'left',\n RIGHT = 'right',\n CENTER = 'center',\n}\n\nexport enum ColumnTypeEnum {\n FIELD = 'field',\n FUNCTION = 'function',\n RENDERER = 'renderer',\n}\n\nexport enum ColumnAlignmentEnum {\n LEFT = 'left',\n RIGHT = 'right',\n CENTER = 'center',\n}\n\nexport type DataSource = {\n [key: string]: any;\n};\n\nexport type ScrollSettings = { scrollEnd: boolean; horizontalScroll: boolean; scrollStart: boolean };\n","import { TableColumn } from './table.model';\n\n/**\n * Sorting table columns by order value if set.\n * The rest columns keep the same ordering and displayed after the sorted ones.\n */\nexport const sortByOrder = <T>(columns: TableColumn<T>[]): TableColumn<T>[] => {\n const withOrderColumns = columns.filter(v => v.order);\n const withoutOrderColumns = columns.filter(v => !v.order);\n\n if (!withOrderColumns.length) {\n return columns;\n }\n\n if (withoutOrderColumns.length) {\n const sortedColumns = Array(columns.length);\n withOrderColumns.forEach(column => (sortedColumns[(column.order ?? 1) - 1] = column));\n withoutOrderColumns.forEach(column => {\n const emptyIndex = sortedColumns.findIndex(v => !v);\n sortedColumns[emptyIndex] = column;\n });\n return sortedColumns;\n } else {\n const sortedOrderedColumns = withOrderColumns.sort((a, b) => (a.order || 0) - (b.order || 0));\n\n return [...sortedOrderedColumns, ...withoutOrderColumns];\n }\n};\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'sentencecase',\n standalone: false,\n})\nexport class SentenceCasePipe implements PipeTransform {\n transform(value: string | undefined): string {\n if (!value) {\n return '';\n }\n return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnChanges,\n Optional,\n Output,\n SimpleChanges,\n ViewChild,\n OnInit,\n} from '@angular/core';\nimport {\n ColumnEllipse,\n ColumnType,\n ComponentRenderer,\n DataSource,\n Pagination,\n ScrollSettings,\n TableColumn,\n TableConfig,\n TableConfigWithPagination,\n TableData,\n TableDetailColumn,\n} from './table.model';\nimport { PageEvent } from '@angular/material/paginator';\nimport { ApplicationTheme, IS_MOBILE_TOKEN } from '@testgorilla/tgo-ui/components/core';\nimport { sortByOrder } from './table.utils';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { animate, state, style, transition, trigger } from '@angular/animations';\nimport { Sort } from '@angular/material/sort';\nimport { BehaviorSubject, fromEvent, Observable } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'ui-table',\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('expandDetail', [\n state('collapsed, void', style({ height: '0px' })),\n state('expanded', style({ height: '*' })),\n transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),\n transition('expanded <=> void', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),\n ]),\n ],\n standalone: false,\n})\nexport class TableComponent<T extends DataSource, TDetail extends DataSource>\n implements OnChanges, AfterViewInit, OnInit\n{\n /**\n * Table configuration\n *\n * @type {TableConfig}\n * @memberof TableComponent\n */\n @Input({ required: true }) config: TableConfigWithPagination<T>;\n\n /**\n * Input property for providing the table data.\n *\n * @type {TableData}\n * @memberof TableComponent\n */\n @Input() data: TableData;\n\n /**\n * Input property indicating whether the table is in a loading state.\n *\n * @type {boolean}\n * @memberof TableComponent\n * @default false\n */\n @Input() loading = false;\n\n /**\n *\n * Defines the application theme\n * @type {ApplicationTheme}\n * @memberof TableComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * Data structure to select which columns should be rendered and their capabilities\n *\n * @type {TableDetailColumn}\n * @memberof TableComponent\n */\n @Input() tableDetailColumns: TableDetailColumn<T, TDetail>;\n @Input() tableDetails = false;\n\n /**\n * Disable border radius for table\n *\n * @type {boolean}\n * @memberof TableComponent\n */\n @Input() disableBorderRadius = false;\n\n /**\n * Condensed table\n *\n * @type {boolean}\n * @memberof TableComponent\n */\n @Input() isCondensed = false;\n\n /**\n * Sticky header\n *\n * @type {boolean}\n * @memberof TableComponent\n */\n @Input() stickyHeader = false;\n\n /**\n * Max height\n *\n * @type {string}\n * @memberof TableComponent\n */\n @Input() maxHeight = '576px';\n\n @Output() onRowClickEvent: EventEmitter<any> = new EventEmitter<any>();\n @Output() onDetailRowClickEvent: EventEmitter<any> = new EventEmitter<any>();\n @Output() paginatorChange = new EventEmitter<PageEvent>();\n @Output() sortChange = new EventEmitter<Sort>();\n\n @ViewChild('table') table: ElementRef;\n\n protected tableData: TableData;\n protected sourceData: TableData;\n protected columnsTooltipState: ColumnEllipse[] = [];\n protected tableConfig: TableConfigWithPagination<T>;\n protected displayedColumns: string[] = [];\n protected columnsDetailToDisplay: string[] = [];\n protected skeletonStyleConfig = {\n background: '#F6F6F6',\n 'border-radius': '4px',\n height: '24px',\n };\n protected dataSourceDetail = new MatTableDataSource<any>([]);\n protected elementDetail: any;\n protected readonly DataType = ColumnType;\n protected scrollSettings$ = new BehaviorSubject<ScrollSettings>({\n scrollEnd: false,\n horizontalScroll: false,\n scrollStart: false,\n });\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme,\n private destroyRef: DestroyRef,\n @Inject(IS_MOBILE_TOKEN) protected readonly isMobile$: Observable<boolean>\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n ngOnInit() {\n this.setTableConfig(this.config);\n this.setTableData(this.data);\n\n if (this.applicationTheme !== 'classic') {\n this.skeletonStyleConfig.background = '#F4F4F4';\n }\n document.body.setAttribute('theme', this.applicationTheme);\n\n if (this.tableDetailColumns) {\n const filteredColumns = this.tableDetailColumns.columnDefs.filter(column => !column.hidden);\n this.columnsDetailToDisplay = filteredColumns.length\n ? filteredColumns.map((tableColumn: TableColumn<TDetail>) => tableColumn.title ?? '')\n : [];\n }\n\n if (this.tableConfig?.sortable && this.tableConfig?.sort) {\n this.onSortChange(this.tableConfig.sort as Sort, false);\n }\n }\n\n ngAfterViewInit() {\n this.hasTableScroll();\n fromEvent(this.table.nativeElement, 'scroll')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.hasTableScroll());\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && changes['config'].currentValue) {\n const config = changes['config'].currentValue as TableConfig<T>;\n this.setTableConfig(config);\n }\n if (changes['data']?.currentValue) {\n this.setTableData(changes['data'].currentValue as TableData);\n }\n }\n\n hasTableScroll(): void {\n const table = this.table.nativeElement;\n const horizontalScroll = table.scrollWidth > table.clientWidth;\n const scrollEnd = table.scrollLeft + table.clientWidth >= table.scrollWidth;\n this.scrollSettings$.next({\n scrollStart: !table.scrollLeft,\n scrollEnd,\n horizontalScroll,\n });\n }\n\n callRenderer([rendererFn, element]: [(v: T) => ComponentRenderer | string, T]): any {\n if (rendererFn) {\n return rendererFn(element);\n }\n }\n\n protected onPaginatorChange(event: PageEvent): void {\n this.paginatorChange.emit(event);\n }\n\n protected onChangeColumnSize(columnIndex: number, showTooltip: boolean): void {\n this.columnsTooltipState = this.columnsTooltipState.map(column => {\n if (column.index === columnIndex) {\n column.showTooltip = showTooltip;\n }\n return column;\n });\n }\n\n protected onSortChange(sortState: Sort, emitEvent = true): void {\n if (emitEvent) {\n this.sortChange.emit(sortState);\n }\n\n if (this.tableConfig?.sortable) {\n this.tableData = [\n ...this.tableData.sort((a, b) => {\n const isAsc = sortState.direction === 'asc';\n const aVal = a[sortState.active];\n const bVal = b[sortState.active];\n return (aVal < bVal ? -1 : 1) * (isAsc ? 1 : -1);\n }),\n ];\n\n if (!sortState.direction) {\n this.tableData = [...this.sourceData];\n }\n }\n }\n\n protected onRowClick(rowParams: any, rowIndex: number): void {\n this.onRowClickEvent.emit({ ...rowParams, index: rowIndex });\n }\n\n protected onDetailRowClick(rowParams: any): void {\n this.onDetailRowClickEvent.emit(rowParams);\n }\n\n protected toggleRow(element: T): void {\n if (this.tableDetails) {\n this.elementDetail = this.elementDetail === element ? null : element;\n if (this.elementDetail) {\n this.tableDetailColumns.setDetailRowData({\n data: element,\n setDetailDataSource: this.setTableDetailDataSource.bind(this),\n });\n }\n }\n }\n\n private setTableDetailDataSource(rowData: TDetail[]): void {\n this.dataSourceDetail = new MatTableDataSource<any>(rowData);\n }\n\n private setTableConfig(config: TableConfig<T>): void {\n config.pagination = config?.pagination ?? this.defaultPaginationConfig;\n\n this.tableConfig = config as TableConfigWithPagination<T>;\n\n this.columnsTooltipState = config.columns.map((column, index) => ({\n index,\n showTooltip: column.showTooltip ?? false,\n }));\n this.displayedColumns = sortByOrder<T>(config.columns.filter(column => !column.hidden)).map(\n column => column.uniqueId ?? column.key\n );\n }\n\n private setTableData(data: TableData): void {\n this.sourceData = data;\n this.tableData = data;\n }\n\n private defaultPaginationConfig: Pagination = {\n currentPage: 0,\n itemsPerPage: 10,\n itemsPerPageOptions: [10, 25, 50],\n totalItems: 20,\n };\n\n trackColumnUniqueId = (index: number, column: TableColumn<T>): string => column.uniqueId ?? column.key;\n}\n","<div\n #tableContainer\n class=\"table-container\"\n [ngClass]=\"{ 'without-title': !tableConfig?.title, 'disable-border-radius': disableBorderRadius }\"\n [attr.theme]=\"applicationTheme\"\n>\n <div *ngIf=\"tableConfig?.title\" class=\"table-header\">\n {{ tableConfig.title | sentencecase }}\n <ng-content select=\"[title-actions]\"></ng-content>\n </div>\n <div\n #table\n *ngIf=\"scrollSettings$ | async as scrollSettings\"\n class=\"table-wrapper\"\n [class.sticky-header]=\"stickyHeader\"\n [style.--table-max-height]=\"maxHeight\"\n >\n <table\n [tabIndex]=\"0\"\n class=\"main-table\"\n [class.condensed]=\"isCondensed\"\n mat-table\n [dataSource]=\"tableData\"\n matSort\n [matSortStart]=\"tableConfig?.sort?.defaultSortStart ?? 'asc'\"\n [matSortActive]=\"tableConfig?.sort?.active ?? ''\"\n [matSortDirection]=\"tableConfig?.sort?.direction ?? ''\"\n (matSortChange)=\"onSortChange($event)\"\n multiTemplateDataRows\n >\n <ng-container\n *ngFor=\"let column of tableConfig.columns; index as i; last as isLast; trackBy: trackColumnUniqueId\"\n >\n <ng-container *ngIf=\"isLast && column.isSticky && column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\" [stickyEnd]=\"!scrollSettings?.scrollEnd\">\n <th\n mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [ngStyle]=\"{ width: column.styles?.width, minWidth: column.styles?.['min-width'] }\"\n [ngClass]=\"column.styles?.alignment ? 'th-' + column.styles?.alignment : ''\"\n [style.font-weight]=\"'bold'\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"\n column.headerCellTemplate;\n context: { $implicit: column.title, column, colIndex: i }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #configValue>\n <ng-container\n [ngTemplateOutlet]=\"columnHeader\"\n [ngTemplateOutletContext]=\"{ i, column }\"\n ></ng-container>\n </ng-template>\n </th>\n\n <td\n mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [align]=\"column.styles?.alignment\"\n [ngClass]=\"[column.styles?.alignment ? 'td-' + column.styles?.alignment : '']\"\n (click)=\"\n onRowClick(element, rowIndex); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\n \"\n >\n <ui-skeleton\n class=\"table-skeleton-loader\"\n [count]=\"1\"\n [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"\n ></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ng-container\n [ngTemplateOutlet]=\"expandButton\"\n [ngTemplateOutletContext]=\"{ index: i, element }\"\n ></ng-container>\n\n @if (column?.type) {\n <ng-container\n *ngTemplateOutlet=\"tableDataTpl; context: { element, tableColumn: column }\"\n ></ng-container>\n } @else {\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"\n ></ng-container>\n </ng-container>\n <ng-template #configData>\n <span\n [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\"\n >{{ element | dataPropertyGetter: column.key }}</span\n >\n </ng-template>\n }\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"isLast && column.isSticky && !column.allowSort\">\n <ng-container\n [matColumnDef]=\"column.uniqueId ?? column.key\"\n [stickyEnd]=\"scrollSettings.horizontalScroll ? !scrollSettings.scrollEnd : true\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [ngStyle]=\"{ width: column.styles?.width, minWidth: column.styles?.['min-width'] }\"\n [ngClass]=\"column.styles?.alignment ? 'th-' + column.styles?.alignment : ''\"\n [style.font-weight]=\"'bold'\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"\n column.headerCellTemplate;\n context: { $implicit: column.title, column, colIndex: i }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #configValue>\n <ng-container\n [ngTemplateOutlet]=\"columnHeader\"\n [ngTemplateOutletContext]=\"{ i, column }\"\n ></ng-container>\n </ng-template>\n </th>\n\n <td\n mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [align]=\"column.styles?.alignment\"\n [ngClass]=\"[column.styles?.alignment ? 'td-' + column.styles?.alignment : '']\"\n (click)=\"\n onRowClick(element, rowIndex); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\n \"\n >\n <ui-skeleton\n class=\"table-skeleton-loader\"\n [count]=\"1\"\n [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"\n ></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ng-container\n [ngTemplateOutlet]=\"expandButton\"\n [ngTemplateOutletContext]=\"{ index: i, element }\"\n ></ng-container>\n\n @if (column?.type) {\n <ng-container\n *ngTemplateOutlet=\"tableDataTpl; context: { element, tableColumn: column }\"\n ></ng-container>\n } @else {\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"\n ></ng-container>\n </ng-container>\n <ng-template #configData>\n <span\n [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\"\n >{{ element | dataPropertyGetter: column.key }}</span\n >\n </ng-template>\n }\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!(isLast && column.isSticky) && column.allowSort\">\n <ng-container\n [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\"\n >\n <th\n mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [ngStyle]=\"{ width: column.styles?.width, minWidth: column.styles?.['min-width'] }\"\n [ngClass]=\"column.styles?.alignment ? 'th-' + column.styles?.alignment : ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"\n column.headerCellTemplate;\n context: { $implicit: column.title, column, colIndex: i }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #configValue>\n <ng-container\n [ngTemplateOutlet]=\"columnHeader\"\n [ngTemplateOutletContext]=\"{ i, column }\"\n ></ng-container>\n </ng-template>\n </th>\n\n <td\n mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [align]=\"column.styles?.alignment\"\n [ngClass]=\"[column.styles?.alignment ? 'td-' + column.styles?.alignment : '']\"\n (click)=\"\n onRowClick(element, rowIndex); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\n \"\n >\n <ui-skeleton\n class=\"table-skeleton-loader\"\n [count]=\"1\"\n [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"\n ></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ng-container\n [ngTemplateOutlet]=\"expandButton\"\n [ngTemplateOutletContext]=\"{ index: i, element }\"\n ></ng-container>\n\n @if (column?.type) {\n <ng-container\n *ngTemplateOutlet=\"tableDataTpl; context: { element, tableColumn: column }\"\n ></ng-container>\n } @else {\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"\n ></ng-container>\n </ng-container>\n <ng-template #configData>\n <span\n [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\"\n >{{ element | dataPropertyGetter: column.key }}</span\n >\n </ng-template>\n }\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!(isLast && column.isSticky) && !column.allowSort\">\n <ng-container\n [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\"\n >\n <th\n mat-header-cell\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [ngStyle]=\"{ width: column.styles?.width, minWidth: column.styles?.['min-width'] }\"\n [ngClass]=\"column.styles?.alignment ? 'th-' + column.styles?.alignment : ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"\n column.headerCellTemplate;\n context: { $implicit: column.title, column, colIndex: i }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #configValue>\n <ng-container\n [ngTemplateOutlet]=\"columnHeader\"\n [ngTemplateOutletContext]=\"{ i, column }\"\n ></ng-container>\n </ng-template>\n </th>\n\n <td\n mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [align]=\"column.styles?.alignment\"\n [ngClass]=\"[column.styles?.alignment ? 'td-' + column.styles?.alignment : '']\"\n (click)=\"\n onRowClick(element, rowIndex); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\n \"\n >\n <ui-skeleton\n class=\"table-skeleton-loader\"\n [count]=\"1\"\n [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"\n ></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ng-container\n [ngTemplateOutlet]=\"expandButton\"\n [ngTemplateOutletContext]=\"{ index: i, element }\"\n ></ng-container>\n\n @if (column?.type) {\n <ng-container\n *ngTemplateOutlet=\"tableDataTpl; context: { element, tableColumn: column }\"\n ></ng-container>\n } @else {\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"\n ></ng-container>\n </ng-container>\n <ng-template #configData>\n <span\n [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\"\n >{{ element | dataPropertyGetter: column.key }}</span\n >\n </ng-template>\n }\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"displayedColumns.length\">\n <div\n class=\"element-detail\"\n *ngIf=\"dataSourceDetail.data.length\"\n [@expandDetail]=\"element === elementDetail ? 'expanded' : 'collapsed'\"\n >\n <table\n mat-table\n [dataSource]=\"dataSourceDetail\"\n [ngClass]=\"{ 'hide-borders': element === tableData[tableData.length - 1] }\"\n >\n <ng-container\n *ngFor=\"let tableColumn of tableDetailColumns.columnDefs\"\n [matColumnDef]=\"tableColumn.title ?? ''\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef=\"let element\"\n arrowPosition=\"after\"\n [ngStyle]=\"{ width: tableColumn.styles?.width }\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'th-' + tableColumn.styles?.alignment : ''\"\n >\n {{ tableColumn.title | uppercase }}\n </th>\n\n <td\n mat-cell\n *matCellDef=\"let element\"\n (click)=\"onDetailRowClick(element)\"\n [align]=\"tableColumn.styles?.alignment\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'td-' + tableColumn.styles?.alignment : ''\"\n [ngStyle]=\"{ width: tableColumn.styles?.width }\"\n >\n <ng-container *ngTemplateOutlet=\"tableDataTpl; context: { element, tableColumn }\"></ng-container>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnsDetailToDisplay\"></tr>\n <tr mat-row *matRowDef=\"let rowDetail; columns: columnsDetailToDisplay\"></tr>\n </table>\n </div>\n </td>\n </ng-container>\n\n <ng-template #tableDataTpl let-element=\"element\" let-tableColumn=\"tableColumn\">\n <div class=\"align-wrapper\">\n <ng-container [ngSwitch]=\"tableColumn.type\">\n <ng-container *ngSwitchCase=\"DataType.FIELD\">\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.FUNCTION\">\n {{ tableColumn.function?.(element) }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.RENDERER\">\n <ng-template [dynamicComponent]=\"[tableColumn.renderer, element] | memoizeFunc: callRenderer\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchDefault>\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n\n <tr\n mat-header-row\n *matHeaderRowDef=\"displayedColumns; sticky: stickyHeader\"\n [class.is-title-present]=\"tableConfig.title\"\n ></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [ngClass]=\"{\n 'expanded-row': elementDetail === row,\n 'row-clickable': tableDetails,\n selected: row?.selected,\n 'last-row': row === tableData[tableData.length - 1] && !elementDetail,\n }\"\n (click)=\"toggleRow(row)\"\n ></tr>\n <ng-container *ngIf=\"tableDetails && tableDetailColumns?.columnDefs?.length\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"tableConfig.noDataRowTpl\">\n <tr *matNoDataRow>\n <ng-container *ngTemplateOutlet=\"tableConfig.noDataRowTpl\"></ng-container>\n </tr>\n </ng-container>\n </table>\n </div>\n\n <ui-paginator\n *ngIf=\"!tableConfig?.hidePagination && tableConfig?.pagination\"\n [disabled]=\"loading\"\n [applicationTheme]=\"applicationTheme !== 'classic' ? 'light' : 'classic'\"\n [pageSize]=\"tableConfig.pagination?.itemsPerPage ?? 25\"\n [length]=\"tableConfig.pagination?.totalItems ?? 0\"\n [currentPage]=\"tableConfig.pagination?.currentPage ?? 0\"\n [pageSizeOptions]=\"tableConfig.pagination?.itemsPerPageOptions ?? [10, 25, 50]\"\n (paginatorChange)=\"onPaginatorChange($event)\"\n ></ui-paginator>\n</div>\n\n<ng-template #expandButton let-i=\"index\" let-element=\"element\">\n <ui-button\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n variant=\"icon-button\"\n [ngClass]=\"{ opened: elementDetail && element === elementDetail }\"\n [iconName]=\"elementDetail && element === elementDetail ? 'Arrow-chevron-up-in-line' : 'Arrow-chevron-down-in-line'\"\n ></ui-button>\n</ng-template>\n\n<ng-template #columnHeader let-column=\"column\" let-i=\"i\">\n <div class=\"header-section\">\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\" class=\"column-title\"\n >{{ column.title | sentencecase }}\n </span>\n <ui-icon\n *ngIf=\"column?.showTooltip\"\n [name]=\"'Help-in-line'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title) : '') || ''\"\n ></ui-icon>\n </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TableComponent } from './table.component';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\nimport { PaginatorComponentModule } from '@testgorilla/tgo-ui/components/paginator';\nimport {\n EllipseTextDirective,\n MemoizeFuncPipe,\n DataPropertyGetterPipe,\n DynamicComponentDirective,\n} from '@testgorilla/tgo-ui/components/core';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { MatSortModule } from '@angular/material/sort';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { SentenceCasePipe } from './sentence-case.pipe';\n\n@NgModule({\n declarations: [TableComponent, SentenceCasePipe],\n imports: [\n CommonModule,\n MatTableModule,\n MatTooltipModule,\n SkeletonComponent,\n PaginatorComponentModule,\n ButtonComponentModule,\n MatSortModule,\n IconComponentModule,\n EllipseTextDirective,\n DynamicComponentDirective,\n DataPropertyGetterPipe,\n MemoizeFuncPipe,\n ],\n exports: [TableComponent],\n})\nexport class TableComponentModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i10.SentenceCasePipe"],"mappings":"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"}
1
+ {"version":3,"file":"testgorilla-tgo-ui-components-table.mjs","sources":["../../../components/table/table.model.ts","../../../components/table/table.utils.ts","../../../components/table/sentence-case.pipe.ts","../../../components/table/table.component.ts","../../../components/table/table.component.html","../../../components/table/table.component.module.ts","../../../components/table/testgorilla-tgo-ui-components-table.ts"],"sourcesContent":["import { TemplateRef, Type } from '@angular/core';\n\nexport interface TableConfig<T = any> {\n columns: TableColumn<T>[];\n pagination?: Pagination;\n title?: string;\n width?: number;\n sort?: Sort;\n hidePagination?: boolean;\n noDataRowTpl?: TemplateRef<any>;\n sortable?: boolean;\n}\n\nexport interface TableConfigWithPagination<T> extends TableConfig<T> {\n pagination?: Pagination;\n}\n\nexport interface TableColumn<T = any> {\n title?: string;\n key: string;\n allowMultiline?: boolean;\n bold?: boolean;\n showTooltip?: boolean;\n tooltip?: string;\n allowSort?: boolean;\n isSticky?: boolean;\n headerCellTemplate?: TemplateRef<any>;\n rowCellTemplate?: TemplateRef<any>;\n rowCellTemplateClick?: () => any;\n sortHeader?: string;\n hidden?: boolean;\n order?: number;\n fontSize?: '12px' | '14px';\n field?: string;\n type?: ColumnType;\n function?: (v: T) => string;\n renderer?: (v: T) => ComponentRenderer | string;\n styles?: ColumnStyles;\n sortStart?: SortDirection;\n uniqueId?: string;\n}\n\nexport interface Pagination {\n itemsPerPageOptions: number[];\n itemsPerPage: number;\n currentPage: number;\n totalItems: number;\n}\n\nexport type TableData = Record<string, any>[];\n\nexport interface ColumnEllipse {\n index: number;\n showTooltip: boolean;\n}\n\nexport interface Sort {\n active: string;\n direction: SortDirection;\n defaultSortStart?: SortDirection;\n}\n\nexport type SortDirection = 'asc' | 'desc' | '';\n\nexport interface TableDetailColumn<T, TDetail> {\n columnDefs: TableColumn<TDetail>[];\n setDetailRowData: (params: DetailRowDataParams<T, TDetail>) => void;\n}\n\nexport interface DetailRowDataParams<T, TDetail> {\n data: T;\n\n setDetailDataSource(rowData: TDetail[]): void;\n}\n\nexport enum ColumnType {\n FIELD = 'field',\n FUNCTION = 'function',\n RENDERER = 'renderer',\n}\n\nexport interface ComponentRenderer {\n component: Type<any>;\n inputs?: any;\n outputs?: { [key: string]: any };\n}\n\nexport interface ColumnStyles {\n alignment?: ColumnAlignment;\n width?: string;\n 'min-width'?: string;\n padding?: string;\n}\n\nexport enum ColumnAlignment {\n LEFT = 'left',\n RIGHT = 'right',\n CENTER = 'center',\n}\n\nexport enum ColumnTypeEnum {\n FIELD = 'field',\n FUNCTION = 'function',\n RENDERER = 'renderer',\n}\n\nexport enum ColumnAlignmentEnum {\n LEFT = 'left',\n RIGHT = 'right',\n CENTER = 'center',\n}\n\nexport type DataSource = {\n [key: string]: any;\n};\n\nexport type ScrollSettings = { scrollEnd: boolean; horizontalScroll: boolean; scrollStart: boolean };\n","import { TableColumn } from './table.model';\n\n/**\n * Sorting table columns by order value if set.\n * The rest columns keep the same ordering and displayed after the sorted ones.\n */\nexport const sortByOrder = <T>(columns: TableColumn<T>[]): TableColumn<T>[] => {\n const withOrderColumns = columns.filter(v => v.order);\n const withoutOrderColumns = columns.filter(v => !v.order);\n\n if (!withOrderColumns.length) {\n return columns;\n }\n\n if (withoutOrderColumns.length) {\n const sortedColumns = Array(columns.length);\n withOrderColumns.forEach(column => (sortedColumns[(column.order ?? 1) - 1] = column));\n withoutOrderColumns.forEach(column => {\n const emptyIndex = sortedColumns.findIndex(v => !v);\n sortedColumns[emptyIndex] = column;\n });\n return sortedColumns;\n } else {\n const sortedOrderedColumns = withOrderColumns.sort((a, b) => (a.order || 0) - (b.order || 0));\n\n return [...sortedOrderedColumns, ...withoutOrderColumns];\n }\n};\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'sentencecase',\n standalone: false,\n})\nexport class SentenceCasePipe implements PipeTransform {\n transform(value: string | undefined): string {\n if (!value) {\n return '';\n }\n return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnChanges,\n Optional,\n Output,\n SimpleChanges,\n ViewChild,\n OnInit,\n} from '@angular/core';\nimport {\n ColumnEllipse,\n ColumnType,\n ComponentRenderer,\n DataSource,\n Pagination,\n ScrollSettings,\n TableColumn,\n TableConfig,\n TableConfigWithPagination,\n TableData,\n TableDetailColumn,\n} from './table.model';\nimport { PageEvent } from '@angular/material/paginator';\nimport { ApplicationTheme, IS_MOBILE_TOKEN } from '@testgorilla/tgo-ui/components/core';\nimport { sortByOrder } from './table.utils';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { animate, state, style, transition, trigger } from '@angular/animations';\nimport { Sort } from '@angular/material/sort';\nimport { BehaviorSubject, fromEvent, Observable } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'ui-table',\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('expandDetail', [\n state('collapsed, void', style({ height: '0px' })),\n state('expanded', style({ height: '*' })),\n transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),\n transition('expanded <=> void', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),\n ]),\n ],\n standalone: false,\n})\nexport class TableComponent<T extends DataSource, TDetail extends DataSource>\n implements OnChanges, AfterViewInit, OnInit\n{\n /**\n * Table configuration\n *\n * @type {TableConfig}\n * @memberof TableComponent\n */\n @Input({ required: true }) config: TableConfigWithPagination<T>;\n\n /**\n * Input property for providing the table data.\n *\n * @type {TableData}\n * @memberof TableComponent\n */\n @Input() data: TableData;\n\n /**\n * Input property indicating whether the table is in a loading state.\n *\n * @type {boolean}\n * @memberof TableComponent\n * @default false\n */\n @Input() loading = false;\n\n /**\n *\n * Defines the application theme\n * @type {ApplicationTheme}\n * @memberof TableComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * Data structure to select which columns should be rendered and their capabilities\n *\n * @type {TableDetailColumn}\n * @memberof TableComponent\n */\n @Input() tableDetailColumns: TableDetailColumn<T, TDetail>;\n @Input() tableDetails = false;\n\n /**\n * Disable border radius for table\n *\n * @type {boolean}\n * @memberof TableComponent\n */\n @Input() disableBorderRadius = false;\n\n /**\n * Condensed table\n *\n * @type {boolean}\n * @memberof TableComponent\n */\n @Input() isCondensed = false;\n\n /**\n * Sticky header\n *\n * @type {boolean}\n * @memberof TableComponent\n */\n @Input() stickyHeader = false;\n\n /**\n * Max height\n *\n * @type {string}\n * @memberof TableComponent\n */\n @Input() maxHeight = '576px';\n\n @Output() onRowClickEvent: EventEmitter<any> = new EventEmitter<any>();\n @Output() onDetailRowClickEvent: EventEmitter<any> = new EventEmitter<any>();\n @Output() paginatorChange = new EventEmitter<PageEvent>();\n @Output() sortChange = new EventEmitter<Sort>();\n\n @ViewChild('table') table: ElementRef;\n\n protected tableData: TableData;\n protected sourceData: TableData;\n protected columnsTooltipState: ColumnEllipse[] = [];\n protected tableConfig: TableConfigWithPagination<T>;\n protected displayedColumns: string[] = [];\n protected columnsDetailToDisplay: string[] = [];\n protected skeletonStyleConfig = {\n background: '#F6F6F6',\n 'border-radius': '4px',\n height: '24px',\n };\n protected dataSourceDetail = new MatTableDataSource<any>([]);\n protected elementDetail: any;\n protected readonly DataType = ColumnType;\n protected scrollSettings$ = new BehaviorSubject<ScrollSettings>({\n scrollEnd: false,\n horizontalScroll: false,\n scrollStart: false,\n });\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme,\n private destroyRef: DestroyRef,\n @Inject(IS_MOBILE_TOKEN) protected readonly isMobile$: Observable<boolean>\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n ngOnInit() {\n this.setTableConfig(this.config);\n this.setTableData(this.data);\n\n if (this.applicationTheme !== 'classic') {\n this.skeletonStyleConfig.background = '#F4F4F4';\n }\n document.body.setAttribute('theme', this.applicationTheme);\n\n if (this.tableDetailColumns) {\n const filteredColumns = this.tableDetailColumns.columnDefs.filter(column => !column.hidden);\n this.columnsDetailToDisplay = filteredColumns.length\n ? filteredColumns.map((tableColumn: TableColumn<TDetail>) => tableColumn.title ?? '')\n : [];\n }\n\n if (this.tableConfig?.sortable && this.tableConfig?.sort) {\n this.onSortChange(this.tableConfig.sort as Sort, false);\n }\n }\n\n ngAfterViewInit() {\n this.hasTableScroll();\n fromEvent(this.table.nativeElement, 'scroll')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.hasTableScroll());\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && changes['config'].currentValue) {\n const config = changes['config'].currentValue as TableConfig<T>;\n this.setTableConfig(config);\n }\n if (changes['data']?.currentValue) {\n this.setTableData(changes['data'].currentValue as TableData);\n }\n }\n\n hasTableScroll(): void {\n const table = this.table.nativeElement;\n const horizontalScroll = table.scrollWidth > table.clientWidth;\n const scrollEnd = table.scrollLeft + table.clientWidth >= table.scrollWidth;\n this.scrollSettings$.next({\n scrollStart: !table.scrollLeft,\n scrollEnd,\n horizontalScroll,\n });\n }\n\n callRenderer([rendererFn, element]: [(v: T) => ComponentRenderer | string, T]): any {\n if (rendererFn) {\n return rendererFn(element);\n }\n }\n\n protected onPaginatorChange(event: PageEvent): void {\n this.paginatorChange.emit(event);\n }\n\n protected onChangeColumnSize(columnIndex: number, showTooltip: boolean): void {\n this.columnsTooltipState = this.columnsTooltipState.map(column => {\n if (column.index === columnIndex) {\n column.showTooltip = showTooltip;\n }\n return column;\n });\n }\n\n protected onSortChange(sortState: Sort, emitEvent = true): void {\n if (this.loading) {\n return;\n }\n\n if (emitEvent) {\n this.sortChange.emit(sortState);\n }\n\n if (this.tableConfig?.sortable) {\n this.tableData = [\n ...this.tableData.sort((a, b) => {\n const isAsc = sortState.direction === 'asc';\n const aVal = a[sortState.active];\n const bVal = b[sortState.active];\n return (aVal < bVal ? -1 : 1) * (isAsc ? 1 : -1);\n }),\n ];\n\n if (!sortState.direction) {\n this.tableData = [...this.sourceData];\n }\n }\n }\n\n protected onRowClick(rowParams: any, rowIndex: number): void {\n this.onRowClickEvent.emit({ ...rowParams, index: rowIndex });\n }\n\n protected onDetailRowClick(rowParams: any): void {\n this.onDetailRowClickEvent.emit(rowParams);\n }\n\n protected toggleRow(element: T): void {\n if (this.tableDetails) {\n this.elementDetail = this.elementDetail === element ? null : element;\n if (this.elementDetail) {\n this.tableDetailColumns.setDetailRowData({\n data: element,\n setDetailDataSource: this.setTableDetailDataSource.bind(this),\n });\n }\n }\n }\n\n private setTableDetailDataSource(rowData: TDetail[]): void {\n this.dataSourceDetail = new MatTableDataSource<any>(rowData);\n }\n\n private setTableConfig(config: TableConfig<T>): void {\n config.pagination = config?.pagination ?? this.defaultPaginationConfig;\n\n this.tableConfig = config as TableConfigWithPagination<T>;\n\n this.columnsTooltipState = config.columns.map((column, index) => ({\n index,\n showTooltip: column.showTooltip ?? false,\n }));\n this.displayedColumns = sortByOrder<T>(config.columns.filter(column => !column.hidden)).map(\n column => column.uniqueId ?? column.key\n );\n }\n\n private setTableData(data: TableData): void {\n this.sourceData = data;\n this.tableData = data;\n }\n\n private defaultPaginationConfig: Pagination = {\n currentPage: 0,\n itemsPerPage: 10,\n itemsPerPageOptions: [10, 25, 50],\n totalItems: 20,\n };\n\n trackColumnUniqueId = (index: number, column: TableColumn<T>): string => column.uniqueId ?? column.key;\n}\n","<div\n #tableContainer\n class=\"table-container\"\n [ngClass]=\"{ 'without-title': !tableConfig?.title, 'disable-border-radius': disableBorderRadius }\"\n [attr.theme]=\"applicationTheme\"\n>\n <div *ngIf=\"tableConfig?.title\" class=\"table-header\">\n {{ tableConfig.title | sentencecase }}\n <ng-content select=\"[title-actions]\"></ng-content>\n </div>\n <div\n #table\n *ngIf=\"scrollSettings$ | async as scrollSettings\"\n class=\"table-wrapper\"\n [class.sticky-header]=\"stickyHeader\"\n [style.--table-max-height]=\"maxHeight\"\n >\n <table\n [tabIndex]=\"0\"\n class=\"main-table\"\n [class.condensed]=\"isCondensed\"\n mat-table\n [dataSource]=\"tableData\"\n matSort\n [matSortDisabled]=\"loading\"\n [matSortStart]=\"tableConfig?.sort?.defaultSortStart ?? 'asc'\"\n [matSortActive]=\"tableConfig?.sort?.active ?? ''\"\n [matSortDirection]=\"tableConfig?.sort?.direction ?? ''\"\n (matSortChange)=\"onSortChange($event)\"\n multiTemplateDataRows\n >\n <ng-container\n *ngFor=\"let column of tableConfig.columns; index as i; last as isLast; trackBy: trackColumnUniqueId\"\n >\n <ng-container *ngIf=\"isLast && column.isSticky && column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\" [stickyEnd]=\"!scrollSettings?.scrollEnd\">\n <th\n mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [ngStyle]=\"{ width: column.styles?.width, minWidth: column.styles?.['min-width'] }\"\n [ngClass]=\"column.styles?.alignment ? 'th-' + column.styles?.alignment : ''\"\n [style.font-weight]=\"'bold'\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"\n column.headerCellTemplate;\n context: { $implicit: column.title, column, colIndex: i }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #configValue>\n <ng-container\n [ngTemplateOutlet]=\"columnHeader\"\n [ngTemplateOutletContext]=\"{ i, column }\"\n ></ng-container>\n </ng-template>\n </th>\n\n <td\n mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [align]=\"column.styles?.alignment\"\n [ngClass]=\"[column.styles?.alignment ? 'td-' + column.styles?.alignment : '']\"\n (click)=\"\n onRowClick(element, rowIndex); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\n \"\n >\n <ui-skeleton\n class=\"table-skeleton-loader\"\n [count]=\"1\"\n [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"\n ></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ng-container\n [ngTemplateOutlet]=\"expandButton\"\n [ngTemplateOutletContext]=\"{ index: i, element }\"\n ></ng-container>\n\n @if (column?.type) {\n <ng-container\n *ngTemplateOutlet=\"tableDataTpl; context: { element, tableColumn: column }\"\n ></ng-container>\n } @else {\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"\n ></ng-container>\n </ng-container>\n <ng-template #configData>\n <span\n [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\"\n >{{ element | dataPropertyGetter: column.key }}</span\n >\n </ng-template>\n }\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"isLast && column.isSticky && !column.allowSort\">\n <ng-container\n [matColumnDef]=\"column.uniqueId ?? column.key\"\n [stickyEnd]=\"scrollSettings.horizontalScroll ? !scrollSettings.scrollEnd : true\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [ngStyle]=\"{ width: column.styles?.width, minWidth: column.styles?.['min-width'] }\"\n [ngClass]=\"column.styles?.alignment ? 'th-' + column.styles?.alignment : ''\"\n [style.font-weight]=\"'bold'\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"\n column.headerCellTemplate;\n context: { $implicit: column.title, column, colIndex: i }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #configValue>\n <ng-container\n [ngTemplateOutlet]=\"columnHeader\"\n [ngTemplateOutletContext]=\"{ i, column }\"\n ></ng-container>\n </ng-template>\n </th>\n\n <td\n mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [align]=\"column.styles?.alignment\"\n [ngClass]=\"[column.styles?.alignment ? 'td-' + column.styles?.alignment : '']\"\n (click)=\"\n onRowClick(element, rowIndex); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\n \"\n >\n <ui-skeleton\n class=\"table-skeleton-loader\"\n [count]=\"1\"\n [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"\n ></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ng-container\n [ngTemplateOutlet]=\"expandButton\"\n [ngTemplateOutletContext]=\"{ index: i, element }\"\n ></ng-container>\n\n @if (column?.type) {\n <ng-container\n *ngTemplateOutlet=\"tableDataTpl; context: { element, tableColumn: column }\"\n ></ng-container>\n } @else {\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"\n ></ng-container>\n </ng-container>\n <ng-template #configData>\n <span\n [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\"\n >{{ element | dataPropertyGetter: column.key }}</span\n >\n </ng-template>\n }\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!(isLast && column.isSticky) && column.allowSort\">\n <ng-container\n [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\"\n >\n <th\n mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [ngStyle]=\"{ width: column.styles?.width, minWidth: column.styles?.['min-width'] }\"\n [ngClass]=\"column.styles?.alignment ? 'th-' + column.styles?.alignment : ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"\n column.headerCellTemplate;\n context: { $implicit: column.title, column, colIndex: i }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #configValue>\n <ng-container\n [ngTemplateOutlet]=\"columnHeader\"\n [ngTemplateOutletContext]=\"{ i, column }\"\n ></ng-container>\n </ng-template>\n </th>\n\n <td\n mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [align]=\"column.styles?.alignment\"\n [ngClass]=\"[column.styles?.alignment ? 'td-' + column.styles?.alignment : '']\"\n (click)=\"\n onRowClick(element, rowIndex); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\n \"\n >\n <ui-skeleton\n class=\"table-skeleton-loader\"\n [count]=\"1\"\n [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"\n ></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ng-container\n [ngTemplateOutlet]=\"expandButton\"\n [ngTemplateOutletContext]=\"{ index: i, element }\"\n ></ng-container>\n\n @if (column?.type) {\n <ng-container\n *ngTemplateOutlet=\"tableDataTpl; context: { element, tableColumn: column }\"\n ></ng-container>\n } @else {\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"\n ></ng-container>\n </ng-container>\n <ng-template #configData>\n <span\n [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\"\n >{{ element | dataPropertyGetter: column.key }}</span\n >\n </ng-template>\n }\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!(isLast && column.isSticky) && !column.allowSort\">\n <ng-container\n [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\"\n >\n <th\n mat-header-cell\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [ngStyle]=\"{ width: column.styles?.width, minWidth: column.styles?.['min-width'] }\"\n [ngClass]=\"column.styles?.alignment ? 'th-' + column.styles?.alignment : ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"\n column.headerCellTemplate;\n context: { $implicit: column.title, column, colIndex: i }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #configValue>\n <ng-container\n [ngTemplateOutlet]=\"columnHeader\"\n [ngTemplateOutletContext]=\"{ i, column }\"\n ></ng-container>\n </ng-template>\n </th>\n\n <td\n mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [align]=\"column.styles?.alignment\"\n [ngClass]=\"[column.styles?.alignment ? 'td-' + column.styles?.alignment : '']\"\n (click)=\"\n onRowClick(element, rowIndex); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\n \"\n >\n <ui-skeleton\n class=\"table-skeleton-loader\"\n [count]=\"1\"\n [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"\n ></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ng-container\n [ngTemplateOutlet]=\"expandButton\"\n [ngTemplateOutletContext]=\"{ index: i, element }\"\n ></ng-container>\n\n @if (column?.type) {\n <ng-container\n *ngTemplateOutlet=\"tableDataTpl; context: { element, tableColumn: column }\"\n ></ng-container>\n } @else {\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"\n ></ng-container>\n </ng-container>\n <ng-template #configData>\n <span\n [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\"\n >{{ element | dataPropertyGetter: column.key }}</span\n >\n </ng-template>\n }\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"displayedColumns.length\">\n <div\n class=\"element-detail\"\n *ngIf=\"dataSourceDetail.data.length\"\n [@expandDetail]=\"element === elementDetail ? 'expanded' : 'collapsed'\"\n >\n <table\n mat-table\n [dataSource]=\"dataSourceDetail\"\n [ngClass]=\"{ 'hide-borders': element === tableData[tableData.length - 1] }\"\n >\n <ng-container\n *ngFor=\"let tableColumn of tableDetailColumns.columnDefs\"\n [matColumnDef]=\"tableColumn.title ?? ''\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef=\"let element\"\n arrowPosition=\"after\"\n [ngStyle]=\"{ width: tableColumn.styles?.width }\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'th-' + tableColumn.styles?.alignment : ''\"\n >\n {{ tableColumn.title | uppercase }}\n </th>\n\n <td\n mat-cell\n *matCellDef=\"let element\"\n (click)=\"onDetailRowClick(element)\"\n [align]=\"tableColumn.styles?.alignment\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'td-' + tableColumn.styles?.alignment : ''\"\n [ngStyle]=\"{ width: tableColumn.styles?.width }\"\n >\n <ng-container *ngTemplateOutlet=\"tableDataTpl; context: { element, tableColumn }\"></ng-container>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnsDetailToDisplay\"></tr>\n <tr mat-row *matRowDef=\"let rowDetail; columns: columnsDetailToDisplay\"></tr>\n </table>\n </div>\n </td>\n </ng-container>\n\n <ng-template #tableDataTpl let-element=\"element\" let-tableColumn=\"tableColumn\">\n <div class=\"align-wrapper\">\n <ng-container [ngSwitch]=\"tableColumn.type\">\n <ng-container *ngSwitchCase=\"DataType.FIELD\">\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.FUNCTION\">\n {{ tableColumn.function?.(element) }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.RENDERER\">\n <ng-template [dynamicComponent]=\"[tableColumn.renderer, element] | memoizeFunc: callRenderer\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchDefault>\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n\n <tr\n mat-header-row\n *matHeaderRowDef=\"displayedColumns; sticky: stickyHeader\"\n [class.is-title-present]=\"tableConfig.title\"\n ></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [ngClass]=\"{\n 'expanded-row': elementDetail === row,\n 'row-clickable': tableDetails,\n selected: row?.selected,\n 'last-row': row === tableData[tableData.length - 1] && !elementDetail,\n }\"\n (click)=\"toggleRow(row)\"\n ></tr>\n <ng-container *ngIf=\"tableDetails && tableDetailColumns?.columnDefs?.length\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"tableConfig.noDataRowTpl\">\n <tr *matNoDataRow>\n <ng-container *ngTemplateOutlet=\"tableConfig.noDataRowTpl\"></ng-container>\n </tr>\n </ng-container>\n </table>\n </div>\n\n <ui-paginator\n *ngIf=\"!tableConfig?.hidePagination && tableConfig?.pagination\"\n [disabled]=\"loading\"\n [applicationTheme]=\"applicationTheme !== 'classic' ? 'light' : 'classic'\"\n [pageSize]=\"tableConfig.pagination?.itemsPerPage ?? 25\"\n [length]=\"tableConfig.pagination?.totalItems ?? 0\"\n [currentPage]=\"tableConfig.pagination?.currentPage ?? 0\"\n [pageSizeOptions]=\"tableConfig.pagination?.itemsPerPageOptions ?? [10, 25, 50]\"\n (paginatorChange)=\"onPaginatorChange($event)\"\n ></ui-paginator>\n</div>\n\n<ng-template #expandButton let-i=\"index\" let-element=\"element\">\n <ui-button\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n variant=\"icon-button\"\n [ngClass]=\"{ opened: elementDetail && element === elementDetail }\"\n [iconName]=\"elementDetail && element === elementDetail ? 'Arrow-chevron-up-in-line' : 'Arrow-chevron-down-in-line'\"\n ></ui-button>\n</ng-template>\n\n<ng-template #columnHeader let-column=\"column\" let-i=\"i\">\n <div class=\"header-section\">\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\" class=\"column-title\"\n >{{ column.title | sentencecase }}\n </span>\n <ui-icon\n *ngIf=\"column?.showTooltip\"\n [name]=\"'Help-in-line'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title) : '') || ''\"\n ></ui-icon>\n </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TableComponent } from './table.component';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\nimport { PaginatorComponentModule } from '@testgorilla/tgo-ui/components/paginator';\nimport {\n EllipseTextDirective,\n MemoizeFuncPipe,\n DataPropertyGetterPipe,\n DynamicComponentDirective,\n} from '@testgorilla/tgo-ui/components/core';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { MatSortModule } from '@angular/material/sort';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { SentenceCasePipe } from './sentence-case.pipe';\n\n@NgModule({\n declarations: [TableComponent, SentenceCasePipe],\n imports: [\n CommonModule,\n MatTableModule,\n MatTooltipModule,\n SkeletonComponent,\n PaginatorComponentModule,\n ButtonComponentModule,\n MatSortModule,\n IconComponentModule,\n EllipseTextDirective,\n DynamicComponentDirective,\n DataPropertyGetterPipe,\n MemoizeFuncPipe,\n ],\n exports: [TableComponent],\n})\nexport class TableComponentModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i10.SentenceCasePipe"],"mappings":"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"}