UNPKG

@ng-dominus/dm-table

Version:
388 lines 72.9 kB
import { booleanAttribute, ChangeDetectionStrategy, Component, Inject, Injector, Input, Optional, Output, ViewChild } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatPaginator, MatPaginatorModule } from "@angular/material/paginator"; import { MatSort, MatSortModule } from "@angular/material/sort"; import { DM_TABLE_INTL, DM_TABLE_RENDER_COMPONENT_DATA, DmTableDataSourceAdapter, DmTableIntl, } from "./dm-table"; import { Subject } from "rxjs"; import { MatMenuModule } from "@angular/material/menu"; import { MatTableModule } from "@angular/material/table"; import { MatButtonModule } from "@angular/material/button"; import { MatIconModule } from "@angular/material/icon"; import { MatCheckboxModule } from "@angular/material/checkbox"; import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; import { MatProgressBarModule } from "@angular/material/progress-bar"; import { DmTableRenderPipe } from "./dm-table-render.pipe"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; import * as i2 from "@angular/common"; import * as i3 from "@angular/material/table"; import * as i4 from "@angular/material/button"; import * as i5 from "@angular/material/icon"; import * as i6 from "@angular/material/paginator"; import * as i7 from "@angular/material/sort"; import * as i8 from "@angular/material/menu"; import * as i9 from "@angular/material/checkbox"; import * as i10 from "@angular/material/progress-bar"; export class DmTableComponent { constructor(changeDetector, http, injector, intl) { this.changeDetector = changeDetector; this.http = http; this.injector = injector; /** * The request method used when calling the server side data source(GET, POST, etc.). */ this.dataSourceRequestMethod = 'GET'; /** * Adds a contextual menu on each row in a special column added at the end of the table. * Use the [rowContextMenuDisplayCondition] @Input to control when this menu is displayed. */ this.rowContextMenu = null; /** * Function which determines when the contextual menu is displayed */ this.rowContextMenuIsVisibleFn = () => true; /** * Tracking function that will be used to check the differences in data changes. * Used similarly to ngFor trackBy function. * Optimize row operations by identifying a row based on its data relative to the function to know if a row should be added/removed/moved. * Accepts a function that takes two parameters, index and item. */ this.trackBy = (index, item) => item; /** * Weather a highlight effect will be rendered when the user hovers the cursor over a row. */ this.rowHoverEffectEnabled = false; /** * Highlights even rows */ this.stripedRows = false; /** * Adds a border to the table */ this.outline = true; /** * Whether to display a loading animation when loading data from a server. * The animation can also manually be triggered. */ this.loadingAnimationEnabled = true; /** * Whether pagination will be enabled. */ this.paginate = true; /** * Shows paginator first/last buttons */ this.showFirstLastButtons = true; /** * Hides paginator page size info */ this.hidePageSize = false; /** * The default page size. */ this.pageSize = 10; /** * The page sizes available to the user. */ this.pageSizeOptions = [5, 10, 20, 30, 40, 50]; /** * The position of the sorting arrow */ this.sortingArrowPosition = 'after'; /** * Sets the header row as sticky. * This only works if you set a max height for the table using the [maxHeight] input. */ this.freezeHeaderRow = true; /** * Event triggered when a row has been clicked. * The event contains the row data. */ this.rowClicked$ = new Subject(); this.displayedColumns = []; this._isLoading = false; this.masterCheckboxChecked = false; this.masterCheckboxIndeterminate = false; this.DominusTableIntl = DmTableIntl; this.containerClasses = {}; this.intl = Object.assign({ [DmTableIntl.NO_DATA]: 'No data', [DmTableIntl.LOADING]: 'Loading...' }, intl || {}); } ngOnInit() { this.prepareDisplayedColumns(); this.updateContainerClasses(); } ngAfterViewInit() { this.setDataSrcAdapter(true); } ngOnChanges(changes) { if ((changes['dataSource'] && !changes['dataSource'].firstChange) || (changes['filters'] && !changes['filters'].firstChange)) { this.setDataSrcAdapter(); } const headerNeedsUpdate = (changes['columns'] && !changes['columns'].firstChange) || (changes['rowSelectionModel'] && !changes['rowSelectionModel'].firstChange); const updateContainerClasses = (changes['outline'] && !changes['outline'].firstChange) || (changes['stripedRows'] && !changes['stripedRows'].firstChange); if (headerNeedsUpdate || updateContainerClasses || (changes['rowHoverEffectEnabled'] && !changes['rowHoverEffectEnabled'].firstChange) || (changes['pageSizeOptions'] && !changes['pageSizeOptions'].firstChange) || (changes['paginate'] && !changes['paginate'].firstChange) || (changes['loadingDataOverlay'] && !changes['loadingDataOverlay'].firstChange) || (changes['sortingArrowPosition'] && !changes['sortingArrowPosition'].firstChange) || (changes['rowContextMenu'] && !changes['rowContextMenu'].firstChange) || (changes['intl'] && !changes['intl'].firstChange) || (changes['maxHeight'] && !changes['maxHeight'].firstChange)) { headerNeedsUpdate && this.prepareDisplayedColumns(); updateContainerClasses && this.updateContainerClasses(); this.changeDetector.markForCheck(); } } /** * Refreshes the table data * @param resetPage whether the page will be reset as well */ refresh(resetPage = true) { this.dataSourceAdapter.refresh(resetPage); } /** * Hides/shows or toggles the specified table column's visibility * @param columnId * @param visible If not specified, the visibility will be toggled */ changeColumnVisibility(columnId, visible) { const column = this.getColumn(columnId); if (!column) { return; } column.visible = typeof visible === 'undefined' ? !column.visible : visible; this.prepareDisplayedColumns(); this.changeDetector.markForCheck(); } /** * Changes the visibility of multiple columns * @param columns The columns and their visibility. Example: [{columnId: 'myColumn1', visible: true}, {columnId: 'myOtherColumn', visible: false}] -- sets myColumn1 to visible and hides myOtherColumn */ changeColumnsVisibility(columns) { for (let i = columns.length; i--;) { const colVisibilityConfig = columns[i]; const column = this.getColumn(colVisibilityConfig.columnId); if (!column) { continue; } column.visible = typeof colVisibilityConfig.visible !== "undefined" ? colVisibilityConfig.visible : !column.visible; } this.prepareDisplayedColumns(); this.changeDetector.markForCheck(); } /** * Returns the table current loading state */ get isLoading() { return this._isLoading; } /** * Activates or deactivates the table's loading state * @param state */ set isLoading(state) { if (this._isLoading !== state) { this._isLoading = state; this.changeDetector.detectChanges(); } } identifyColumn(index, column) { return column.id; } toggleAllRowsSelection($event) { const rowSelectionModel = this.rowSelectionModel; if (!rowSelectionModel) { return; } const rows = this.dataSourceAdapter.data; if ($event.checked) { for (let i = rows.length; i--;) { rowSelectionModel.select(rows[i]); } this.masterCheckboxChecked = true; this.masterCheckboxIndeterminate = rowSelectionModel.selected.length !== this.dataSourceAdapter.getTotalResults(); } else { rowSelectionModel.clear(); this.masterCheckboxChecked = false; this.masterCheckboxIndeterminate = false; } } toggleRowSelection(row) { const rowSelectionModel = this.rowSelectionModel; if (!rowSelectionModel) { return; } rowSelectionModel.toggle(row); if (rowSelectionModel.isEmpty()) { this.masterCheckboxChecked = false; this.masterCheckboxIndeterminate = false; } else { this.masterCheckboxChecked = true; this.masterCheckboxIndeterminate = rowSelectionModel.selected.length !== this.dataSourceAdapter.getTotalResults(); } } createRenderComponentInjector(column, columnData) { return Injector.create({ providers: [{ provide: DM_TABLE_RENDER_COMPONENT_DATA, useValue: { columnId: column.id, columnData, arguments: column.renderUsing?.arguments } }], parent: this.injector }); } updateContainerClasses() { this.containerClasses = { 'outline': this.outline, 'striped': this.stripedRows }; } getColumn(columnId) { const columns = this.columns; let foundColumn; for (let i = columns.length; i--;) { const col = columns[i]; if (col.id === columnId) { foundColumn = col; break; } } return foundColumn; } prepareDisplayedColumns() { const columns = this.columns; const colLen = columns.length; const _displayedColumns = []; if (this.rowSelectionModel) { _displayedColumns.push('dm_table_row_selection_column'); } for (let colIndex = 0; colIndex < colLen; ++colIndex) { const column = columns[colIndex]; if (column.visible === undefined || column.visible) { _displayedColumns.push(column.id); } } if (this.rowContextMenu) { _displayedColumns.push('dm_table_row_contextual_menu_column'); } this.displayedColumns = _displayedColumns; } setDataSrcAdapter(initialSet = false) { if (!initialSet) { this.loadingDataSub?.unsubscribe(); if (this.sort.active !== '') { this.sort.active = ''; this.sort.direction = ''; this.sort._stateChanges.next(); } if (this.paginator) { this.paginator.length = 0; this.paginator.pageIndex = 0; } } const dataSourceAdapter = new DmTableDataSourceAdapter(this.dataSourceRequestMethod, this.http, this.dataSource, this.sort, this.onBeforeServerRequestFn || ((requestOptions) => new Promise((resolve) => { resolve(requestOptions); })), this.paginator, this.mapRowsFn, this.filters); if (this.loadingAnimationEnabled) { this.loadingDataSub = dataSourceAdapter.onDataLoading().subscribe(loading => this.isLoading = loading); } this.dataSourceAdapter = dataSourceAdapter; } ngOnDestroy() { this.rowClicked$.complete(); this.loadingDataSub?.unsubscribe(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DmTableComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.HttpClient }, { token: i0.Injector }, { token: DM_TABLE_INTL, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.0.4", type: DmTableComponent, isStandalone: true, selector: "dm-table", inputs: { columns: "columns", dataSource: "dataSource", intl: "intl", dataSourceRequestMethod: "dataSourceRequestMethod", filters: "filters", onBeforeServerRequestFn: "onBeforeServerRequestFn", rowContextMenu: "rowContextMenu", rowContextMenuIsVisibleFn: "rowContextMenuIsVisibleFn", rowSelectionModel: "rowSelectionModel", mapRowsFn: "mapRowsFn", trackBy: "trackBy", rowHoverEffectEnabled: "rowHoverEffectEnabled", stripedRows: "stripedRows", outline: "outline", loadingAnimationEnabled: "loadingAnimationEnabled", paginate: "paginate", showFirstLastButtons: "showFirstLastButtons", hidePageSize: "hidePageSize", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", sortingArrowPosition: "sortingArrowPosition", freezeHeaderRow: "freezeHeaderRow", maxHeight: "maxHeight", isLoading: ["isLoading", "isLoading", booleanAttribute] }, outputs: { rowClicked$: "rowClicked" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"dm-table-container\" [ngClass]=\"containerClasses\">\n <div *ngIf=\"_isLoading\" class=\"loading-overlay\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n <div class=\"dm-table-overflow\" [ngStyle]=\"{'max-height': maxHeight}\">\n <table mat-table matSort [dataSource]=\"dataSourceAdapter\" class=\"dm-table\" [trackBy]=\"trackBy\">\n <!-- ROW SELECTION COLUMN -->\n <ng-container *ngIf=\"rowSelectionModel\" matColumnDef=\"dm_table_row_selection_column\">\n <th mat-header-cell *matHeaderCellDef>\n <mat-checkbox *ngIf=\"rowSelectionModel.isMultipleSelection()\" color=\"primary\"\n [disabled]=\"_isLoading\"\n (change)=\"toggleAllRowsSelection($event)\"\n [checked]=\"masterCheckboxChecked\"\n [indeterminate]=\"masterCheckboxIndeterminate\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox color=\"primary\"\n [disabled]=\"_isLoading\"\n (change)=\"toggleRowSelection(row)\"\n [checked]=\"rowSelectionModel.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- NORMAL DATA COLUMN -->\n <ng-container *ngFor=\"let column of columns; trackBy: identifyColumn\" [matColumnDef]=\"column.id\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header [ngClass]=\"column.classes\" [arrowPosition]=\"sortingArrowPosition\" [disabled]=\"_isLoading || column.sortable === false\">\n {{ column.name }}\n </th>\n <td mat-cell *matCellDef=\"let row\" [ngClass]=\"column.classes\">\n <ng-container\n [ngTemplateOutlet]=\"!column.renderUsing ? renderDefault : (column.renderUsing.component ? renderComponent : renderPipe)\"\n [ngTemplateOutletContext]=\"{column, row}\">\n </ng-container>\n </td>\n </ng-container>\n\n <!-- ROW CONTEXTUAL MENU COLUMN -->\n <ng-container *ngIf=\"rowContextMenu\" matColumnDef=\"dm_table_row_contextual_menu_column\">\n <th mat-header-cell *matHeaderCellDef class=\"dm-table-row-contextual-menu-column\">&nbsp;</th>\n <td mat-cell *matCellDef=\"let row\">\n <button *ngIf=\"rowContextMenuIsVisibleFn(row)\" [disabled]=\"_isLoading\" (click)=\"$event.stopPropagation()\"\n mat-icon-button [matMenuTriggerFor]=\"rowContextMenu\" [matMenuTriggerData]=\"{row: row}\">\n <mat-icon>menu</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: freezeHeaderRow\" class=\"dm-table-header-row\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n class=\"dm-table-row\" [ngClass]=\"{'dm-table-row-hover-effect': rowHoverEffectEnabled, 'dm-table-row-hover-pointer': rowClicked$.observed}\" (click)=\"!_isLoading && rowClicked$.next(row)\"></tr>\n\n <tr *matNoDataRow class=\"dm-table-row\">\n <td class=\"dm-no-data-cell\" [attr.colspan]=\"columns.length + (rowContextMenu ? 1 : 0) + (rowSelectionModel ? 1 : 0)\">{{ intl[_isLoading ? DominusTableIntl.LOADING : DominusTableIntl.NO_DATA] }}</td>\n </tr>\n </table>\n </div>\n <mat-paginator *ngIf=\"paginate\" class=\"paginator\" [disabled]=\"_isLoading\" [pageSizeOptions]=\"pageSizeOptions\" [pageSize]=\"pageSize\" [showFirstLastButtons]=\"showFirstLastButtons\" [hidePageSize]=\"hidePageSize\" aria-label=\"Select page\"></mat-paginator>\n</div>\n<ng-template #renderDefault let-column=\"column\" let-row=\"row\">\n {{ row[column.id] }}\n</ng-template>\n\n<ng-template #renderComponent let-column=\"column\" let-row=\"row\">\n <ng-container\n [ngComponentOutlet]=\"column.renderUsing.component\"\n [ngComponentOutletInjector]=\"createRenderComponentInjector(column, row[column.id])\"></ng-container>\n</ng-template>\n\n<ng-template #renderPipe let-column=\"column\" let-row=\"row\">\n {{ row[column.id] | dmTableRender: column.renderUsing.pipe : column.renderUsing.pipeArguments || [] }}\n</ng-template>\n", styles: [".dm-table-container{position:relative}.dm-table-container.outline{border:1px solid var(--dm-table-border-color, rgba(0, 0, 0, .2))}.dm-table-container.striped .dm-table .dm-table-row:nth-child(2n){background:var(--dm-table-striped-row-background, rgba(0, 0, 0, .02))}.dm-table-container .loading-overlay{width:100%;position:absolute;left:0;top:0;z-index:1}.dm-table-container .dm-table-overflow{overflow:auto}.dm-table-container .dm-table{width:100%}.dm-table-container .dm-table .dm-table-header-row .dm-table-row-contextual-menu-column{width:90px}.dm-table-container .dm-table .dm-table-row.dm-table-row-hover-effect:hover{background:var(--dm-table-hover-background, rgba(0, 0, 0, .04))}.dm-table-container .dm-table .dm-table-row.dm-table-row-hover-effect:hover.dm-table-row-hover-pointer{cursor:pointer}.dm-table-container .dm-table .dm-table-row .dm-no-data-cell{padding:15px 0;text-align:center;font-size:1rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i3.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i6.MatPaginator, selector: "mat-paginator", inputs: ["disabled", "color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i7.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i10.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "pipe", type: DmTableRenderPipe, name: "dmTableRender" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DmTableComponent, decorators: [{ type: Component, args: [{ selector: 'dm-table', standalone: true, imports: [ CommonModule, MatTableModule, MatButtonModule, MatIconModule, MatPaginatorModule, MatSortModule, MatMenuModule, MatCheckboxModule, MatProgressSpinnerModule, MatProgressBarModule, DmTableRenderPipe ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"dm-table-container\" [ngClass]=\"containerClasses\">\n <div *ngIf=\"_isLoading\" class=\"loading-overlay\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n <div class=\"dm-table-overflow\" [ngStyle]=\"{'max-height': maxHeight}\">\n <table mat-table matSort [dataSource]=\"dataSourceAdapter\" class=\"dm-table\" [trackBy]=\"trackBy\">\n <!-- ROW SELECTION COLUMN -->\n <ng-container *ngIf=\"rowSelectionModel\" matColumnDef=\"dm_table_row_selection_column\">\n <th mat-header-cell *matHeaderCellDef>\n <mat-checkbox *ngIf=\"rowSelectionModel.isMultipleSelection()\" color=\"primary\"\n [disabled]=\"_isLoading\"\n (change)=\"toggleAllRowsSelection($event)\"\n [checked]=\"masterCheckboxChecked\"\n [indeterminate]=\"masterCheckboxIndeterminate\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox color=\"primary\"\n [disabled]=\"_isLoading\"\n (change)=\"toggleRowSelection(row)\"\n [checked]=\"rowSelectionModel.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- NORMAL DATA COLUMN -->\n <ng-container *ngFor=\"let column of columns; trackBy: identifyColumn\" [matColumnDef]=\"column.id\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header [ngClass]=\"column.classes\" [arrowPosition]=\"sortingArrowPosition\" [disabled]=\"_isLoading || column.sortable === false\">\n {{ column.name }}\n </th>\n <td mat-cell *matCellDef=\"let row\" [ngClass]=\"column.classes\">\n <ng-container\n [ngTemplateOutlet]=\"!column.renderUsing ? renderDefault : (column.renderUsing.component ? renderComponent : renderPipe)\"\n [ngTemplateOutletContext]=\"{column, row}\">\n </ng-container>\n </td>\n </ng-container>\n\n <!-- ROW CONTEXTUAL MENU COLUMN -->\n <ng-container *ngIf=\"rowContextMenu\" matColumnDef=\"dm_table_row_contextual_menu_column\">\n <th mat-header-cell *matHeaderCellDef class=\"dm-table-row-contextual-menu-column\">&nbsp;</th>\n <td mat-cell *matCellDef=\"let row\">\n <button *ngIf=\"rowContextMenuIsVisibleFn(row)\" [disabled]=\"_isLoading\" (click)=\"$event.stopPropagation()\"\n mat-icon-button [matMenuTriggerFor]=\"rowContextMenu\" [matMenuTriggerData]=\"{row: row}\">\n <mat-icon>menu</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: freezeHeaderRow\" class=\"dm-table-header-row\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n class=\"dm-table-row\" [ngClass]=\"{'dm-table-row-hover-effect': rowHoverEffectEnabled, 'dm-table-row-hover-pointer': rowClicked$.observed}\" (click)=\"!_isLoading && rowClicked$.next(row)\"></tr>\n\n <tr *matNoDataRow class=\"dm-table-row\">\n <td class=\"dm-no-data-cell\" [attr.colspan]=\"columns.length + (rowContextMenu ? 1 : 0) + (rowSelectionModel ? 1 : 0)\">{{ intl[_isLoading ? DominusTableIntl.LOADING : DominusTableIntl.NO_DATA] }}</td>\n </tr>\n </table>\n </div>\n <mat-paginator *ngIf=\"paginate\" class=\"paginator\" [disabled]=\"_isLoading\" [pageSizeOptions]=\"pageSizeOptions\" [pageSize]=\"pageSize\" [showFirstLastButtons]=\"showFirstLastButtons\" [hidePageSize]=\"hidePageSize\" aria-label=\"Select page\"></mat-paginator>\n</div>\n<ng-template #renderDefault let-column=\"column\" let-row=\"row\">\n {{ row[column.id] }}\n</ng-template>\n\n<ng-template #renderComponent let-column=\"column\" let-row=\"row\">\n <ng-container\n [ngComponentOutlet]=\"column.renderUsing.component\"\n [ngComponentOutletInjector]=\"createRenderComponentInjector(column, row[column.id])\"></ng-container>\n</ng-template>\n\n<ng-template #renderPipe let-column=\"column\" let-row=\"row\">\n {{ row[column.id] | dmTableRender: column.renderUsing.pipe : column.renderUsing.pipeArguments || [] }}\n</ng-template>\n", styles: [".dm-table-container{position:relative}.dm-table-container.outline{border:1px solid var(--dm-table-border-color, rgba(0, 0, 0, .2))}.dm-table-container.striped .dm-table .dm-table-row:nth-child(2n){background:var(--dm-table-striped-row-background, rgba(0, 0, 0, .02))}.dm-table-container .loading-overlay{width:100%;position:absolute;left:0;top:0;z-index:1}.dm-table-container .dm-table-overflow{overflow:auto}.dm-table-container .dm-table{width:100%}.dm-table-container .dm-table .dm-table-header-row .dm-table-row-contextual-menu-column{width:90px}.dm-table-container .dm-table .dm-table-row.dm-table-row-hover-effect:hover{background:var(--dm-table-hover-background, rgba(0, 0, 0, .04))}.dm-table-container .dm-table .dm-table-row.dm-table-row-hover-effect:hover.dm-table-row-hover-pointer{cursor:pointer}.dm-table-container .dm-table .dm-table-row .dm-no-data-cell{padding:15px 0;text-align:center;font-size:1rem}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.HttpClient }, { type: i0.Injector }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DM_TABLE_INTL] }] }], propDecorators: { columns: [{ type: Input, args: [{ required: true }] }], dataSource: [{ type: Input, args: [{ required: true }] }], intl: [{ type: Input }], dataSourceRequestMethod: [{ type: Input }], filters: [{ type: Input }], onBeforeServerRequestFn: [{ type: Input }], rowContextMenu: [{ type: Input }], rowContextMenuIsVisibleFn: [{ type: Input }], rowSelectionModel: [{ type: Input }], mapRowsFn: [{ type: Input }], trackBy: [{ type: Input }], rowHoverEffectEnabled: [{ type: Input }], stripedRows: [{ type: Input }], outline: [{ type: Input }], loadingAnimationEnabled: [{ type: Input }], paginate: [{ type: Input }], showFirstLastButtons: [{ type: Input }], hidePageSize: [{ type: Input }], pageSize: [{ type: Input }], pageSizeOptions: [{ type: Input }], sortingArrowPosition: [{ type: Input }], freezeHeaderRow: [{ type: Input }], maxHeight: [{ type: Input }], rowClicked$: [{ type: Output, args: ['rowClicked'] }], paginator: [{ type: ViewChild, args: [MatPaginator] }], sort: [{ type: ViewChild, args: [MatSort] }], isLoading: [{ type: Input, args: [{ transform: booleanAttribute }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG0tdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZG0tdGFibGUvc3JjL2xpYi9kbS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbS10YWJsZS9zcmMvbGliL2RtLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDWSxnQkFBZ0IsRUFDL0IsdUJBQXVCLEVBRXZCLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUMzQixLQUFLLEVBRWMsUUFBUSxFQUMzQixNQUFNLEVBRU4sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsWUFBWSxFQUFFLGtCQUFrQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDN0UsT0FBTyxFQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQ0gsYUFBYSxFQUNiLDhCQUE4QixFQUc5Qix3QkFBd0IsRUFBa0IsV0FBVyxHQUV4RCxNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBVSxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRCxPQUFPLEVBQW9CLGlCQUFpQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDaEYsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUFDLG9C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LHVCQUF1QjtzQkFBL0IsS0FBSztnQkFJRyxPQUFPO3NCQUFmLEtBQUs7Z0JBTUcsdUJBQXVCO3NCQUEvQixLQUFLO2dCQUtHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBSUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQU1HLGlCQUFpQjtzQkFBekIsS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLO2dCQVFHLE9BQU87c0JBQWYsS0FBSztnQkFLRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFJRyxPQUFPO3NCQUFmLEtBQUs7Z0JBS0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUlHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxlQUFlO3NCQUF2QixLQUFLO2dCQUlHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFNRyxlQUFlO3NCQUF2QixLQUFLO2dCQU1HLFNBQVM7c0JBQWpCLEtBQUs7Z0JBTWdCLFdBQVc7c0JBQWhDLE1BQU07dUJBQUMsWUFBWTtnQkFhYSxTQUFTO3NCQUF6QyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ0ssSUFBSTtzQkFBL0IsU0FBUzt1QkFBQyxPQUFPO2dCQTBHd0IsU0FBUztzQkFBbEQsS0FBSzt1QkFBQyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCwgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcywgVHJhY2tCeUZ1bmN0aW9uLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtNYXRQYWdpbmF0b3IsIE1hdFBhZ2luYXRvck1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvclwiO1xuaW1wb3J0IHtNYXRTb3J0LCBNYXRTb3J0TW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydFwiO1xuaW1wb3J0IHtcbiAgICBETV9UQUJMRV9JTlRMLFxuICAgIERNX1RBQkxFX1JFTkRFUl9DT01QT05FTlRfREFUQSxcbiAgICBEbVRhYmxlQ29sdW1uRGVmaW5pdGlvbiwgRG1UYWJsZUNvbHVtblZpc2liaWxpdHksXG4gICAgRG1UYWJsZURhdGFTb3VyY2UsXG4gICAgRG1UYWJsZURhdGFTb3VyY2VBZGFwdGVyLCBEbVRhYmxlRmlsdGVycywgRG1UYWJsZUludGwsIERtVGFibGVSZW5kZXJDb21wb25lbnREYXRhLFxuICAgIERtVGFibGVSZXF1ZXN0T3B0aW9ucyxcbn0gZnJvbSBcIi4vZG0tdGFibGVcIjtcbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtNYXRNZW51LCBNYXRNZW51TW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudVwiO1xuaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7TWF0VGFibGVNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90YWJsZVwiO1xuaW1wb3J0IHtNYXRCdXR0b25Nb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcbmltcG9ydCB7TWF0SWNvbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcbmltcG9ydCB7U2VsZWN0aW9uTW9kZWx9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcbmltcG9ydCB7TWF0Q2hlY2tib3hDaGFuZ2UsIE1hdENoZWNrYm94TW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3hcIjtcbmltcG9ydCB7TWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lclwiO1xuaW1wb3J0IHtNYXRQcm9ncmVzc0Jhck1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhclwiO1xuaW1wb3J0IHtEbVRhYmxlUmVuZGVyUGlwZX0gZnJvbSBcIi4vZG0tdGFibGUtcmVuZGVyLnBpcGVcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdkbS10YWJsZScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgTWF0VGFibGVNb2R1bGUsXG4gICAgICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcbiAgICAgICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxuICAgICAgICBNYXRTb3J0TW9kdWxlLFxuICAgICAgICBNYXRNZW51TW9kdWxlLFxuICAgICAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxuICAgICAgICBNYXRQcm9ncmVzc0Jhck1vZHVsZSxcbiAgICAgICAgRG1UYWJsZVJlbmRlclBpcGVcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kbS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2RtLXRhYmxlLmNvbXBvbmVudC5zY3NzJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEbVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqXG4gICAgICogVGFibGUgY29sdW1uIGRlZmluaXRpb25zLlxuICAgICAqL1xuICAgIEBJbnB1dCh7cmVxdWlyZWQ6IHRydWV9KSBjb2x1bW5zITogRG1UYWJsZUNvbHVtbkRlZmluaXRpb25bXTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YSBzb3VyY2UgZnJvbSB3aGljaCByb3dzIGFyZSBmZXRjaGVkLlxuICAgICAqIENhbiBiZSBhIHN0YXRpYyBhcnJheSBvZiByb3dzIG9yIGFuIHVybCB0byBhIHNlcnZlciBzaWRlIHNvdXJjZS5cbiAgICAgKiBOb3RlOiBXaGVuIHVzaW5nIHNlcnZlciBzaWRlIGRhdGEgc291cmNlLCBpdCBpcyBhc3N1bWVkIHRoYXQgc29ydGluZyBhbmQgcGFnaW5hdGlvbiBpcyBhbHNvIGhhbmRsZWQgb24gdGhlIHNlcnZlci5cbiAgICAgKi9cbiAgICBASW5wdXQoe3JlcXVpcmVkOiB0cnVlfSkgZGF0YVNvdXJjZSE6IERtVGFibGVEYXRhU291cmNlO1xuXG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGVzIHRoZSBpMThuIGRlZmF1bHQgc3RyaW5ncyBBTkQgdGhlIHN0cmluZyBpbmplY3RlZCBieSB0aGUgRE1fVEFCTEVfSU5UTCB0b2tlbi5cbiAgICAgKiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgd2hlbiBkeW5hbWljIGkxOG4gc3RyaW5ncyBhcmUgcmVxdWlyZWQsIG9yIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHRhYmxlcyBvbiB0aGUgc2FtZSBwYWdlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGludGw6IFJlY29yZDxEbVRhYmxlSW50bCwgc3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBtZXRob2QgdXNlZCB3aGVuIGNhbGxpbmcgdGhlIHNlcnZlciBzaWRlIGRhdGEgc291cmNlKEdFVCwgUE9TVCwgZXRjLikuXG4gICAgICovXG4gICAgQElucHV0KCkgZGF0YVNvdXJjZVJlcXVlc3RNZXRob2Q6IHN0cmluZyA9ICdHRVQnO1xuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlciBzaWRlIGRhdGEgc291cmNlIGFsb25nIHdpdGggdGhlIGRlZmF1bHQgcGFyYW1ldGVycyAocGFnaW5nLCBzb3J0aW5nLCBldGMuKS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBmaWx0ZXJzPzogRG1UYWJsZUZpbHRlcnM7XG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBjdXJyZW50IHJlcXVlc3Qgb3B0aW9ucyBhbmQgcmV0dXJucyBhIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdGhlIGZpbmFsIHJlcXVlc3Qgb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gdGhlIGFuZ3VsYXIgSHR0cENsaWVudC5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgbmVlZCB0byBwYXNzIGFkZGl0aW9uYWwgaGVhZGVycyAoZS5nLiBBdXRob3JpemF0aW9uKSBvciBtb2RpZnkgdGhlIGRhdGEgYmVmb3JlIHNlbmRpbmcgdGhlIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQuXG4gICAgICogVGhlIHNhbWUgZWZmZWN0IGNhbiBiZSBhY2hpZXZlZCB1c2luZyBhbiBpbnRlcmNlcHRvci5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBvbkJlZm9yZVNlcnZlclJlcXVlc3RGbj86IChyZXF1ZXN0T3B0