@lordkriegan/mat-data-table
Version:
[](https://badge.fury.io/js/%40lordkriegan%2Fmat-data-table) [](https://www.npmjs.com/package/@lordkri
1 lines • 22.5 kB
Source Map (JSON)
{"version":3,"file":"lordkriegan-mat-data-table.mjs","sources":["../../../projects/material-data-table/src/lib/material-data-table.component.ts","../../../projects/material-data-table/src/lib/material-data-table.component.html","../../../projects/material-data-table/src/public-api.ts","../../../projects/material-data-table/src/lordkriegan-mat-data-table.ts"],"sourcesContent":["import { NgComponentOutlet, NgStyle } from '@angular/common';\r\nimport { AfterViewInit, Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatSort, MatSortModule } from '@angular/material/sort';\r\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { IColumnMap, ITableOptions } from './material-data-table.interfaces';\r\n\r\n@Component({\r\n selector: 'mat-data-table',\r\n imports: [\r\n NgStyle,\r\n NgComponentOutlet,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatTableModule,\r\n MatSortModule,\r\n MatPaginatorModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatMenuModule,\r\n MatDividerModule,\r\n MatTooltipModule\r\n ],\r\n standalone: true,\r\n templateUrl: './material-data-table.component.html',\r\n styleUrl: './material-data-table.component.scss',\r\n})\r\nexport class MaterialDataTableComponent<T> implements AfterViewInit, OnChanges, OnDestroy, OnInit {\r\n /**\r\n * The data to be displayed in the table.\r\n * Can be provided as a static array of objects (`T[]`) or an `Observable<T[]>`.\r\n * If an Observable is provided, the table will update automatically when the Observable emits new data.\r\n */\r\n @Input({ required: true }) tableData: Observable<T[]> | T[] | null = null;\r\n /**\r\n * An array of column definitions that map data properties to table columns.\r\n * Each object in the array must conform to the `IColumnMap<T>` type.\r\n * @see IColumnMap\r\n */\r\n @Input({ required: true }) columnMappings: IColumnMap<T>[] = [];\r\n /**\r\n * Optional configuration object to customize the table's features and behavior.\r\n * If not provided, default options will be used.\r\n * @see ITableOptions\r\n */\r\n @Input() tableOptions: ITableOptions<T> = {};\r\n\r\n public mergedOptions: ITableOptions<T> = {};\r\n\r\n @ViewChild(MatPaginator) paginator!: MatPaginator;\r\n @ViewChild(MatSort) sort!: MatSort;\r\n\r\n private _defaultTableOptions: ITableOptions<T> = {\r\n showFilter: true,\r\n filterOptions: { label: 'Filter' },\r\n showPaginator: true,\r\n paginatorOptions: { pageSizeOptions: [5, 10, 25, 100] },\r\n showSorter: true,\r\n sorterOptions: { defaultSortDirection: 'asc' },\r\n showActions: false,\r\n actionOptions: {},\r\n showTableActions: false,\r\n tableActionOptions: {},\r\n };\r\n\r\n dataSource: MatTableDataSource<T> = new MatTableDataSource<T>([]);\r\n private dataSubscription: Subscription | null = null;\r\n private isViewInitialized = false;\r\n\r\n constructor() {\r\n //empty constructor\r\n }\r\n\r\n ngOnInit(): void {\r\n this._mergeOptions();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['tableOptions']) {\r\n this._mergeOptions();\r\n }\r\n // When a new Observable is passed in...\r\n if (changes['tableData'] && this.isViewInitialized) {\r\n // If the view is ready, we can safely re-subscribe to the new observable.\r\n this.subscribeToData();\r\n }\r\n }\r\n\r\n private _mergeOptions(): void {\r\n const defaults = this._defaultTableOptions;\r\n const user = this.tableOptions || {};\r\n\r\n // Deep merge the options, with user options taking precedence.\r\n this.mergedOptions = {\r\n ...defaults, ...user,\r\n filterOptions: { ...defaults.filterOptions, ...user.filterOptions },\r\n paginatorOptions: { ...defaults.paginatorOptions, ...user.paginatorOptions },\r\n sorterOptions: { ...defaults.sorterOptions, ...user.sorterOptions },\r\n actionOptions: { ...defaults.actionOptions, ...user.actionOptions },\r\n tableActionOptions: { ...defaults.tableActionOptions, ...user.tableActionOptions },\r\n };\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.isViewInitialized = true;\r\n\r\n // Connect the paginator and filter to the data source ONCE.\r\n // The MatTableDataSource will handle updates automatically from here.\r\n if (this.mergedOptions.showPaginator) {\r\n this.dataSource.paginator = this.paginator;\r\n }\r\n if (this.mergedOptions.showFilter && this.mergedOptions.filterOptions?.filterPredicate) {\r\n this.dataSource.filterPredicate = this.mergedOptions.filterOptions.filterPredicate;\r\n }\r\n\r\n this.subscribeToData(); // Now subscribe to data changes.\r\n }\r\n\r\n private subscribeToData(): void {\r\n this.dataSubscription?.unsubscribe();\r\n if (this.tableData) {\r\n if (this.tableData instanceof Observable) {\r\n\r\n this.dataSubscription = this.tableData.subscribe(data => {\r\n // Only update the data. The paginator and filter are already connected.\r\n this.dataSource.data = data ?? [];\r\n this.connectSort();\r\n });\r\n } else {\r\n this.dataSource.data = this.tableData ?? [];\r\n this.connectSort();\r\n }\r\n }\r\n }\r\n\r\n private connectSort(): void {\r\n // Connect sort only once, after the first data load, to avoid race conditions.\r\n if (this.mergedOptions.showSorter && this.sort && !this.dataSource.sort) {\r\n this.dataSource.sort = this.sort;\r\n if (this.mergedOptions.sorterOptions?.sortData) {\r\n this.dataSource.sortData = this.mergedOptions.sorterOptions.sortData;\r\n }\r\n if (this.mergedOptions.sorterOptions?.sortingDataAccessor) {\r\n this.dataSource.sortingDataAccessor = this.mergedOptions.sorterOptions?.sortingDataAccessor;\r\n }\r\n }\r\n }\r\n\r\n generateDisplayColumns(): string[] {\r\n const displayColumns = this.columnMappings.map(col => col.key as string);\r\n if (this.mergedOptions.showActions || this.mergedOptions.showTableActions) {\r\n displayColumns.push('actions');\r\n }\r\n return displayColumns;\r\n }\r\n\r\n /**\r\n * Returns the tooltip text for a cell.\r\n * It handles both static string tooltips and function-based tooltips.\r\n * @param column The column definition, which may contain the tooltip.\r\n * @param row The data for the current row.\r\n * @returns The tooltip string, or an empty string if no tooltip is defined.\r\n */\r\n public getTooltipText(column: IColumnMap<T>, row: T): string {\r\n if (column.tooltip === undefined) {\r\n return '';\r\n }\r\n \r\n if (typeof column.tooltip === 'function') {\r\n return (column.tooltip)(row[column.key as never]);\r\n }\r\n \r\n return column.tooltip;\r\n }\r\n \r\n public getComponentInputs(column: IColumnMap<T>, row: T): { [key: string]: unknown } {\r\n return {\r\n data: row[column.key as keyof T],\r\n ...column.componentInputs\r\n };\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Clean up the subscription to prevent memory leaks when the component is destroyed.\r\n this.dataSubscription?.unsubscribe();\r\n }\r\n\r\n applyFilter(event: Event) {\r\n const filterValue = (event.target as HTMLInputElement).value;\r\n this.dataSource.filter = filterValue.trim().toLowerCase();\r\n\r\n if (this.dataSource.paginator) {\r\n this.dataSource.paginator.firstPage();\r\n }\r\n }\r\n}\r\n","@if (mergedOptions.showFilter) {\r\n <mat-form-field>\r\n <mat-label>{{mergedOptions.filterOptions?.label || 'Filter'}}</mat-label>\r\n <input matInput (keyup)=\"applyFilter($event)\" [placeholder]=\"mergedOptions.filterOptions?.placeholder || ''\" #input>\r\n </mat-form-field>\r\n }\r\n \r\n \r\n <div class=\"mat-elevation-z8\">\r\n <table mat-table \r\n [dataSource]=\"dataSource\" matSort \r\n [matSortActive]=\"mergedOptions.sorterOptions?.defaultSortColumn || ''\" \r\n [matSortDirection]=\"mergedOptions.sorterOptions?.defaultSortDirection || 'asc'\" \r\n [matSortDisabled]=\"!mergedOptions.showSorter\"\r\n [ngStyle]=\"mergedOptions.tableStyles || {}\"\r\n >\r\n \r\n @for (column of columnMappings; track $index) {\r\n <ng-container [matColumnDef]=\"column.key\">\r\n <th [ngStyle]=\"column?.headerCellStyles || {}\" mat-header-cell *matHeaderCellDef mat-sort-header>{{column.label}}</th>\r\n <td [ngStyle]=\"column?.dataCellStyles || {}\" mat-cell *matCellDef=\"let row\" \r\n [matTooltip]=\"getTooltipText(column, row)\"\r\n [matTooltipDisabled]=\"getTooltipText(column, row) === ''\"\r\n >\r\n @if (column?.component; as component) {\r\n <ng-container *ngComponentOutlet=\"component; inputs: getComponentInputs(column, row)\"></ng-container>\r\n } @else if (column?.transformer) {\r\n {{column.transformer!(row[column.key])}}\r\n } @else {\r\n {{row[column.key]}}\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n @if (mergedOptions.showActions || mergedOptions.showTableActions) {\r\n <ng-container matColumnDef=\"actions\">\r\n <th mat-header-cell *matHeaderCellDef class=\"action-column\">\r\n @if (mergedOptions.showTableActions) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"tableMenu\" [ngStyle]=\"mergedOptions.tableActionOptions?.buttonStyles || {}\"><mat-icon>more_vert</mat-icon></button>\r\n <mat-menu #tableMenu=\"matMenu\">\r\n @for (action of mergedOptions.tableActionOptions?.actions; track $index) {\r\n @if (action.divider) {\r\n <mat-divider></mat-divider>\r\n } @else {\r\n <button mat-menu-item (click)=\"action.fxn!()\">\r\n @if (action.icon) {\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n }\r\n <span>{{action.label}}</span>\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n }\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" class=\"action-column\">\r\n @if (mergedOptions.showActions) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" [ngStyle]=\"mergedOptions.actionOptions?.buttonStyles || {}\"><mat-icon>more_vert</mat-icon></button>\r\n <mat-menu #menu=\"matMenu\">\r\n @for (action of mergedOptions.actionOptions?.actions; track $index) {\r\n @if (action.divider) {\r\n <mat-divider></mat-divider>\r\n } @else {\r\n <button mat-menu-item (click)=\"action.fxn!(row)\">\r\n @if (action.icon) {\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n }\r\n <span>{{action.label}}</span>\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"generateDisplayColumns()\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: generateDisplayColumns();\"></tr>\r\n \r\n <!-- Row shown when there is no matching data. -->\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"mat-cell\" [attr.colspan]=\"generateDisplayColumns().length\">\r\n @if (mergedOptions.noTableRow && !dataSource.filter) {\r\n <ng-container *ngComponentOutlet=\"mergedOptions.noTableRow\"></ng-container>\r\n } @else if (mergedOptions.showFilter) {\r\n <p style=\"text-align: center;\">No data matching the filter {{dataSource.filter ? '\"' + dataSource.filter+ '\"' : ''}}</p>\r\n } @else {\r\n <p style=\"text-align: center;\">No data found</p>\r\n }\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n @if (mergedOptions.showPaginator) {\r\n <mat-paginator [pageSizeOptions]=\"mergedOptions.paginatorOptions?.pageSizeOptions || [5, 10, 25, 100]\" aria-label=\"Select page of users\"></mat-paginator>\r\n }","/*\r\n * Public API Surface of material-data-table\r\n */\r\n\r\nexport * from './lib/material-data-table.interfaces';\r\nexport * from './lib/material-data-table.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}