@ng-dominus/dm-table
Version:
Dominus angular material table extension
388 lines • 72.9 kB
JavaScript
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\"> </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\"> </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