UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

346 lines 63.3 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Directionality } from "@angular/cdk/bidi"; import { _DisposeViewRepeaterStrategy, _VIEW_REPEATER_STRATEGY, } from "@angular/cdk/collections"; import { Platform } from "@angular/cdk/platform"; import { CdkVirtualForOf, ViewportRuler } from "@angular/cdk/scrolling"; import { _COALESCED_STYLE_SCHEDULER, _CoalescedStyleScheduler, CDK_TABLE, CDK_TABLE_TEMPLATE, CdkTable, STICKY_POSITIONING_LISTENER, } from "@angular/cdk/table"; import { DOCUMENT } from "@angular/common"; import { Attribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, HostBinding, Inject, Input, IterableDiffers, Optional, Output, SkipSelf, ViewEncapsulation, } from "@angular/core"; import _isEqual from "lodash/isEqual"; import _keys from "lodash/keys"; import { TableStateHandlerService } from "./table-state-handler.service"; import { TableSelectionMode } from "./types"; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/bidi"; import * as i2 from "./table-state-handler.service"; import * as i3 from "@angular/cdk/platform"; import * as i4 from "@angular/cdk/scrolling"; import * as i5 from "@angular/cdk/table"; // <example-url>./../examples/index.html#/table</example-url> /** @dynamic */ export class TableComponent extends CdkTable { get dataSource() { return super.dataSource; } set dataSource(value) { super.dataSource = value; } constructor(_differs, _changeDetectorRef, _elementRef, role, _dir, tableStateHandlerService, document, platform, viewRepeater, coalescedStyleScheduler, viewportRuler, stickyPositioningListener) { // The _ViewRepeater and _CoalescedStyleScheduler parameters were optional before Angular v12. // They're included here for compatibility with Angular v12 and later. super(_differs, _changeDetectorRef, _elementRef, role, _dir, document, platform, viewRepeater, coalescedStyleScheduler, viewportRuler, stickyPositioningListener); this._differs = _differs; this._changeDetectorRef = _changeDetectorRef; this._elementRef = _elementRef; this._dir = _dir; this.tableStateHandlerService = tableStateHandlerService; this.document = document; this.platform = platform; this.reorderable = false; this.sortable = false; this.resizable = false; /** * @deprecated Use selectionConfig instead. */ this.selectable = false; this.selectionConfig = { enabled: false, selectionMode: TableSelectionMode.None, }; this.paginatorUsed = false; this.columnsOrderChange = new EventEmitter(); this.sortOrderChanged = new EventEmitter(); this.selectionChange = new EventEmitter(); this.columnsWidthChange = new EventEmitter(); this.layoutFixed = false; } getFilterComponents() { return !this.sortable ? {} : { sorter: { componentInstance: { // mark this filter to be monitored by our datasource for any changes in order reset other filters(eg: pagination) // before any new search is performed detectFilterChanges: true, getFilters: () => ({ type: "sorter", value: { sortBy: this.sortBy, direction: this.sortDirection, }, }), }, }, }; } // using on changes hook for datasource because if we use pagination, // datasource changes when we change page and rows should know about this ngOnChanges(changes) { if (changes.resizable) { this.tableStateHandlerService.resizable = changes.resizable.currentValue; this.layoutFixed = changes.resizable.currentValue; } if (changes.reorderable) { this.tableStateHandlerService.reorderable = changes.reorderable.currentValue; } if (changes.sortable) { this.tableStateHandlerService.sortable = changes.sortable.currentValue; } if (changes.dataSource) { this.onDataSourceChange(changes.dataSource.currentValue); } if (changes.selectable) { this.changeSelectionMode(changes.selectable.currentValue); } if (changes.selectionConfig) { this.tableStateHandlerService.selectionMode = changes.selectionConfig.currentValue?.selectionMode; } if (changes.selection && !changes.selection.isFirstChange()) { this.changeSelection(changes.selection.currentValue); } if (changes.sortedColumn && !changes.sortedColumn.isFirstChange()) { this.handleSortedColumn(changes.sortedColumn.currentValue); } if (changes.trackBy) { this.tableStateHandlerService.trackBy = changes.trackBy.currentValue; } } ngOnInit() { super.ngOnInit(); const dataSet = this.dataSource; const firstRow = dataSet && dataSet[0]; const columns = _keys(firstRow); this.tableStateHandlerService.tableColumns = columns; columns.forEach((column) => { const alignment = this.tableStateHandlerService.defineAlignment(firstRow[column]); this.tableStateHandlerService.setAlignment(column, alignment); }); if (this.resizable) { this.tableColumnsWidthSubscription = this.tableStateHandlerService.columnWidthSubject.subscribe(() => { this.columnsWidthChange.emit(); }); const parentWidth = this._elementRef.nativeElement.parentElement.getBoundingClientRect().width ? this._elementRef.nativeElement.parentElement.getBoundingClientRect() .width : this._elementRef.nativeElement.parentElement.parentElement.getBoundingClientRect() .width; this.layoutFixed = true; this.tableStateHandlerService.tableParentWidth = parentWidth; } if (this.sortable) { this.tableSortingSubscription = this.tableStateHandlerService.sortingState.subscribe((sortedColumn) => { this.sortDirection = sortedColumn.direction; this.sortBy = sortedColumn.sortBy; // emit only if the data is really changed if (!_isEqual(sortedColumn, this.sortedColumn)) { this.sortOrderChanged.emit(sortedColumn); } }); if (this.sortedColumn) { this.handleSortedColumn(this.sortedColumn); } } if (this.reorderable) { this.tableColumnsSubscription = this.tableStateHandlerService.columnsState.subscribe((tableColumns) => { this.columnsOrderChange.emit(tableColumns); }); } if (this.selectable || this.selectionConfig?.enabled) { this.stickyChangedSubscription = this.tableStateHandlerService.stickyHeaderChangedSubject.subscribe(() => { // calling cdk method to update sticky styles this.updateStickyHeaderRowStyles(); }); } } ngAfterViewInit() { // moved this from ngOnInit since we might emit the selectionChange event // before our component is actually ready and it might cause problems // if we try to manually trigger change detection in a parent component if (this.selectable || this.selectionConfig?.enabled) { this.selectionChangedSubscription = this.tableStateHandlerService.selectionChanged.subscribe((selection) => { this.selectionChange.emit(selection); }); if (this.selection) { this.changeSelection(this.selection); } } } changeSelection(selectedItems) { this.tableStateHandlerService.selection = selectedItems; this.tableStateHandlerService.selectionChanged.next(this.tableStateHandlerService.selection); } // used for backwards compatibility // default behavior was multi selection changeSelectionMode(selectable) { this.tableStateHandlerService.selectable = selectable; if (selectable) { this.tableStateHandlerService.selectionMode = TableSelectionMode.Multi; this.selectionConfig = { ...this.selectionConfig, enabled: true, selectionMode: TableSelectionMode.Multi, }; } else { this.tableStateHandlerService.selectionMode = TableSelectionMode.None; this.selectionConfig = { enabled: false, selectionMode: TableSelectionMode.None, }; } } handleSortedColumn(sortedColumn) { this.tableStateHandlerService.sortedColumn = sortedColumn; this.tableStateHandlerService.sortingState.next(sortedColumn); } onDataSourceChange(ds) { if (!ds) { this.dataSource = []; } const changedDataSource = ds ? ds : []; // if no totalItems specified, we assume that there is only one page this.tableStateHandlerService.totalItems = this.totalItems || changedDataSource.length; this.tableStateHandlerService.changeDataSource(changedDataSource); } ngOnDestroy() { if (this.tableSortingSubscription) { this.tableSortingSubscription.unsubscribe(); } if (this.tableColumnsSubscription) { this.tableColumnsSubscription.unsubscribe(); } if (this.selectionChangedSubscription) { this.selectionChangedSubscription.unsubscribe(); } if (this.stickyChangedSubscription) { this.stickyChangedSubscription.unsubscribe(); } if (this.tableColumnsWidthSubscription) { this.tableColumnsWidthSubscription.unsubscribe(); } super.ngOnDestroy(); } ngAfterContentInit() { // @ts-ignore: Call parent method in case cdk adds it later super.ngAfterContentInit?.(); // Note: Identifying if table is using virtual scroll. this.tableStateHandlerService.hasVirtualScroll = !!this.virtualFor && !this.paginatorUsed; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableComponent, deps: [{ token: i0.IterableDiffers }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: "role", attribute: true }, { token: i1.Directionality }, { token: i2.TableStateHandlerService }, { token: DOCUMENT }, { token: i3.Platform }, { token: _VIEW_REPEATER_STRATEGY }, { token: _COALESCED_STYLE_SCHEDULER }, { token: i4.ViewportRuler }, { token: STICKY_POSITIONING_LISTENER, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TableComponent, selector: "nui-table, table[nui-table]", inputs: { reorderable: "reorderable", sortable: "sortable", resizable: "resizable", selectable: "selectable", selectionConfig: "selectionConfig", totalItems: "totalItems", dataSource: "dataSource", selection: "selection", sortedColumn: "sortedColumn", paginatorUsed: "paginatorUsed" }, outputs: { columnsOrderChange: "columnsOrderChange", sortOrderChanged: "sortOrderChanged", selectionChange: "selectionChange", columnsWidthChange: "columnsWidthChange" }, host: { properties: { "class.nui-table__table-fixed": "this.layoutFixed" }, classAttribute: "nui-table__table" }, providers: [ TableStateHandlerService, { provide: _VIEW_REPEATER_STRATEGY, useClass: _DisposeViewRepeaterStrategy, }, { provide: _COALESCED_STYLE_SCHEDULER, useClass: _CoalescedStyleScheduler, }, { provide: CdkTable, useExisting: TableComponent }, { provide: CDK_TABLE, useExisting: TableComponent }, ], queries: [{ propertyName: "virtualFor", first: true, predicate: CdkVirtualForOf, descendants: true }], exportAs: ["nuiTable"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "\n <ng-content select=\"caption\"/>\n <ng-content select=\"colgroup, col\"/>\n\n <!--\n Unprojected content throws a hydration error so we need this to capture it.\n It gets removed on the client so it doesn't affect the layout.\n -->\n @if (_isServer) {\n <ng-content/>\n }\n\n @if (_isNativeHtmlTable) {\n <thead role=\"rowgroup\">\n <ng-container headerRowOutlet/>\n </thead>\n <tbody role=\"rowgroup\">\n <ng-container rowOutlet/>\n <ng-container noDataRowOutlet/>\n </tbody>\n <tfoot role=\"rowgroup\">\n <ng-container footerRowOutlet/>\n </tfoot>\n } @else {\n <ng-container headerRowOutlet/>\n <ng-container rowOutlet/>\n <ng-container noDataRowOutlet/>\n <ng-container footerRowOutlet/>\n }\n", isInline: true, styles: [".nui .nui-table__table{display:table;width:100%;font-size:13px;border-collapse:collapse}.nui .nui-table__table .align-right{text-align:right}.nui .nui-table__table .align-center{text-align:center}.nui .nui-table__table-fixed{table-layout:fixed;width:1px}.nui .nui-table__table-fixed .nui-table__table-header-cell,.nui .nui-table__table-fixed .nui-table__table-cell{max-width:none}@media print{.nui .nui-table__table{break-inside:avoid}}.nui .nui-table__container{overflow:auto}.nui .nui-table__table-header-cell{position:relative;display:table-cell;color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));font-weight:600;padding:0 10px;background:inherit;border:1px solid #d9d9d9;border:1px solid var(--nui-color-line-default, #d9d9d9);min-width:46px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;user-select:none;background-clip:padding-box}.nui .nui-table__table-header-cell--sortable{cursor:pointer}.nui .nui-table__table-header-cell--sortable:hover{background-color:var(--nui-color-bg-table_header-hover,#e3e3e3)}.nui .nui-table__table-header-cell--sortable--text-black{color:var(--nui-color-text-default,#111)}.nui .nui-table__table-header-cell--sortable--dark{background-color:var(--nui-color-bg-table_header-hover,#e3e3e3)}.nui .nui-table__table-header-cell--reorderable{cursor:move}.nui .nui-table__table-header-cell--reorderable:hover,.nui .nui-table__table-header-cell--reorderable--dark{background-color:var(--nui-color-bg-table_header-hover,#e3e3e3)}.nui .nui-table__table-header-cell.cdk-table-sticky{border:0}.nui .nui-table__table-header-cell.cdk-table-sticky:before{content:\"\";position:absolute;top:0;left:0;bottom:0;width:100%;border-top:1px solid #d9d9d9;border-top:1px solid var(--nui-color-line-default, #d9d9d9);border-bottom:1px solid #d9d9d9;border-bottom:1px solid var(--nui-color-line-default, #d9d9d9);border-left:1px solid #d9d9d9;border-left:1px solid var(--nui-color-line-default, #d9d9d9)}.nui .nui-table__table-header-cell.cdk-table-sticky:last-of-type:before{border-right:1px solid #d9d9d9;border-right:1px solid var(--nui-color-line-default, #d9d9d9)}.nui .nui-table__table-header-cell.cdk-table-sticky.nui-table__table-cell--left-edge-action:before{border-left:2px solid;border-left-color:var(--nui-color-line-selected-contrast,#00c4d2)}.nui .nui-table__table-header-cell.cdk-table-sticky.nui-table__table-cell--right-edge-action:before{border-right:2px solid;border-right-color:var(--nui-color-line-selected-contrast,#00c4d2)}.nui .nui-table__table-header-cell.virtual-sticky{transition-property:width;transition-duration:.2s}.nui .nui-table__table-header-cell--selectable{min-width:75px;width:75px;overflow:visible;padding:0 5px}.nui .nui-table__table-header-cell--selectable.no-options{min-width:auto;width:35px!important}.nui .nui-table__table-header-cell__selector{display:flex}.nui .nui-table__table-header-cell__selector.no-options{min-width:auto}.nui .nui-table__table-header-row{background-color:var(--nui-color-bg-table_header,#f0f0f0);display:table-row;height:40px}.nui .nui-table__table-header-row_height_default{height:40px}.nui .nui-table__table-header-row_height_compact{height:30px}.nui .nui-table__table-header-row_height_compact .nui-table__table-header-cell--selectable{padding:0 3px 0 7px}.nui .nui-table__table-header-row_height_compact .nui-selector__checkbox-button{border:none;border-right:1px solid #d9d9d9;padding:0 4px}.nui .nui-table__table-header-row_height_compact .nui-selector__toggle{border:none;border-left:1px solid #d9d9d9}.nui .nui-table__table-header-row_height_compact .nui-selector__checkbox-container{margin:0}.nui .nui-table__table-header-row_height_compact .nui-selector__checkbox-container .nui-checkbox__label:hover{background:transparent}.nui .nui-table__table-header-row_height_tiny{height:24px}.nui .nui-table__table-header-row_height_tiny .nui-table__table-header-cell--selectable{padding:0 3px 0 7px}.nui .nui-table__table-header-row_height_tiny .nui-selector__checkbox-button{border:none;border-right:1px solid #d9d9d9;padding:0 4px}.nui .nui-table__table-header-row_height_tiny .nui-selector__toggle{border:none;border-left:1px solid #d9d9d9}.nui .nui-table__table-header-row_height_tiny .nui-selector__checkbox-container{margin:0}.nui .nui-table__table-header-row_height_tiny .nui-selector__checkbox-container .nui-checkbox__label:hover{background:transparent}.nui .nui-table__table-row{border-bottom:1px solid #d9d9d9;border-bottom:1px solid var(--nui-color-line-default, #d9d9d9);display:table-row}.nui .nui-table__table-row:hover{background-color:var(--nui-color-bg-transparent-hover,rgba(17, 17, 17, .05))}.nui .nui-table__table-row_height_default{height:40px}.nui .nui-table__table-row_height_compact{height:30px}.nui .nui-table__table-row_height_tiny{height:24px}.nui .nui-table__table-row td:first-of-type.nui-table__table-cell--drop-left{overflow-x:visible}.nui .nui-table__table-row--selected{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111)}.nui .nui-table__table-row--selected:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui .nui-table__table-row--clickable{cursor:pointer}.nui .nui-table__table-cell{display:table-cell;color:var(--nui-color-text-default,#111);padding:0 10px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nui .nui-table__table-cell--selectable{padding:0 0 0 10px}.nui .nui-table__table-cell--left-edge-action{border-left:2px solid;border-left-color:var(--nui-color-line-selected-contrast,#00c4d2)}.nui .nui-table__table-cell--right-edge-action{border-right:2px solid;border-right-color:var(--nui-color-line-selected-contrast,#00c4d2)}.nui .nui-table__table-cell__checkbox .nui-checkbox__label:hover{background-color:transparent}.nui .nui-table__icon-cell{min-width:40px;width:40px}.nui .nui-table__sorting-icon{vertical-align:middle}.nui .nui-table__resizer{width:5px;height:40px;right:0;top:0;position:absolute}.nui .nui-table__resizer:hover{cursor:col-resize}cdk-virtual-scroll-viewport .sticky-header-placeholder th{border-bottom:none!important}\n"], dependencies: [{ kind: "directive", type: i5.DataRowOutlet, selector: "[rowOutlet]" }, { kind: "directive", type: i5.HeaderRowOutlet, selector: "[headerRowOutlet]" }, { kind: "directive", type: i5.FooterRowOutlet, selector: "[footerRowOutlet]" }, { kind: "directive", type: i5.NoDataRowOutlet, selector: "[noDataRowOutlet]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableComponent, decorators: [{ type: Component, args: [{ selector: "nui-table, table[nui-table]", template: CDK_TABLE_TEMPLATE, exportAs: "nuiTable", host: { class: "nui-table__table", }, changeDetection: ChangeDetectionStrategy.OnPush, providers: [ TableStateHandlerService, { provide: _VIEW_REPEATER_STRATEGY, useClass: _DisposeViewRepeaterStrategy, }, { provide: _COALESCED_STYLE_SCHEDULER, useClass: _CoalescedStyleScheduler, }, { provide: CdkTable, useExisting: TableComponent }, { provide: CDK_TABLE, useExisting: TableComponent }, ], encapsulation: ViewEncapsulation.None, styles: [".nui .nui-table__table{display:table;width:100%;font-size:13px;border-collapse:collapse}.nui .nui-table__table .align-right{text-align:right}.nui .nui-table__table .align-center{text-align:center}.nui .nui-table__table-fixed{table-layout:fixed;width:1px}.nui .nui-table__table-fixed .nui-table__table-header-cell,.nui .nui-table__table-fixed .nui-table__table-cell{max-width:none}@media print{.nui .nui-table__table{break-inside:avoid}}.nui .nui-table__container{overflow:auto}.nui .nui-table__table-header-cell{position:relative;display:table-cell;color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));font-weight:600;padding:0 10px;background:inherit;border:1px solid #d9d9d9;border:1px solid var(--nui-color-line-default, #d9d9d9);min-width:46px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;user-select:none;background-clip:padding-box}.nui .nui-table__table-header-cell--sortable{cursor:pointer}.nui .nui-table__table-header-cell--sortable:hover{background-color:var(--nui-color-bg-table_header-hover,#e3e3e3)}.nui .nui-table__table-header-cell--sortable--text-black{color:var(--nui-color-text-default,#111)}.nui .nui-table__table-header-cell--sortable--dark{background-color:var(--nui-color-bg-table_header-hover,#e3e3e3)}.nui .nui-table__table-header-cell--reorderable{cursor:move}.nui .nui-table__table-header-cell--reorderable:hover,.nui .nui-table__table-header-cell--reorderable--dark{background-color:var(--nui-color-bg-table_header-hover,#e3e3e3)}.nui .nui-table__table-header-cell.cdk-table-sticky{border:0}.nui .nui-table__table-header-cell.cdk-table-sticky:before{content:\"\";position:absolute;top:0;left:0;bottom:0;width:100%;border-top:1px solid #d9d9d9;border-top:1px solid var(--nui-color-line-default, #d9d9d9);border-bottom:1px solid #d9d9d9;border-bottom:1px solid var(--nui-color-line-default, #d9d9d9);border-left:1px solid #d9d9d9;border-left:1px solid var(--nui-color-line-default, #d9d9d9)}.nui .nui-table__table-header-cell.cdk-table-sticky:last-of-type:before{border-right:1px solid #d9d9d9;border-right:1px solid var(--nui-color-line-default, #d9d9d9)}.nui .nui-table__table-header-cell.cdk-table-sticky.nui-table__table-cell--left-edge-action:before{border-left:2px solid;border-left-color:var(--nui-color-line-selected-contrast,#00c4d2)}.nui .nui-table__table-header-cell.cdk-table-sticky.nui-table__table-cell--right-edge-action:before{border-right:2px solid;border-right-color:var(--nui-color-line-selected-contrast,#00c4d2)}.nui .nui-table__table-header-cell.virtual-sticky{transition-property:width;transition-duration:.2s}.nui .nui-table__table-header-cell--selectable{min-width:75px;width:75px;overflow:visible;padding:0 5px}.nui .nui-table__table-header-cell--selectable.no-options{min-width:auto;width:35px!important}.nui .nui-table__table-header-cell__selector{display:flex}.nui .nui-table__table-header-cell__selector.no-options{min-width:auto}.nui .nui-table__table-header-row{background-color:var(--nui-color-bg-table_header,#f0f0f0);display:table-row;height:40px}.nui .nui-table__table-header-row_height_default{height:40px}.nui .nui-table__table-header-row_height_compact{height:30px}.nui .nui-table__table-header-row_height_compact .nui-table__table-header-cell--selectable{padding:0 3px 0 7px}.nui .nui-table__table-header-row_height_compact .nui-selector__checkbox-button{border:none;border-right:1px solid #d9d9d9;padding:0 4px}.nui .nui-table__table-header-row_height_compact .nui-selector__toggle{border:none;border-left:1px solid #d9d9d9}.nui .nui-table__table-header-row_height_compact .nui-selector__checkbox-container{margin:0}.nui .nui-table__table-header-row_height_compact .nui-selector__checkbox-container .nui-checkbox__label:hover{background:transparent}.nui .nui-table__table-header-row_height_tiny{height:24px}.nui .nui-table__table-header-row_height_tiny .nui-table__table-header-cell--selectable{padding:0 3px 0 7px}.nui .nui-table__table-header-row_height_tiny .nui-selector__checkbox-button{border:none;border-right:1px solid #d9d9d9;padding:0 4px}.nui .nui-table__table-header-row_height_tiny .nui-selector__toggle{border:none;border-left:1px solid #d9d9d9}.nui .nui-table__table-header-row_height_tiny .nui-selector__checkbox-container{margin:0}.nui .nui-table__table-header-row_height_tiny .nui-selector__checkbox-container .nui-checkbox__label:hover{background:transparent}.nui .nui-table__table-row{border-bottom:1px solid #d9d9d9;border-bottom:1px solid var(--nui-color-line-default, #d9d9d9);display:table-row}.nui .nui-table__table-row:hover{background-color:var(--nui-color-bg-transparent-hover,rgba(17, 17, 17, .05))}.nui .nui-table__table-row_height_default{height:40px}.nui .nui-table__table-row_height_compact{height:30px}.nui .nui-table__table-row_height_tiny{height:24px}.nui .nui-table__table-row td:first-of-type.nui-table__table-cell--drop-left{overflow-x:visible}.nui .nui-table__table-row--selected{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111)}.nui .nui-table__table-row--selected:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui .nui-table__table-row--clickable{cursor:pointer}.nui .nui-table__table-cell{display:table-cell;color:var(--nui-color-text-default,#111);padding:0 10px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nui .nui-table__table-cell--selectable{padding:0 0 0 10px}.nui .nui-table__table-cell--left-edge-action{border-left:2px solid;border-left-color:var(--nui-color-line-selected-contrast,#00c4d2)}.nui .nui-table__table-cell--right-edge-action{border-right:2px solid;border-right-color:var(--nui-color-line-selected-contrast,#00c4d2)}.nui .nui-table__table-cell__checkbox .nui-checkbox__label:hover{background-color:transparent}.nui .nui-table__icon-cell{min-width:40px;width:40px}.nui .nui-table__sorting-icon{vertical-align:middle}.nui .nui-table__resizer{width:5px;height:40px;right:0;top:0;position:absolute}.nui .nui-table__resizer:hover{cursor:col-resize}cdk-virtual-scroll-viewport .sticky-header-placeholder th{border-bottom:none!important}\n"] }] }], ctorParameters: () => [{ type: i0.IterableDiffers }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: undefined, decorators: [{ type: Attribute, args: ["role"] }] }, { type: i1.Directionality }, { type: i2.TableStateHandlerService }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i3.Platform }, { type: undefined, decorators: [{ type: Inject, args: [_VIEW_REPEATER_STRATEGY] }] }, { type: i5._CoalescedStyleScheduler, decorators: [{ type: Inject, args: [_COALESCED_STYLE_SCHEDULER] }] }, { type: i4.ViewportRuler }, { type: undefined, decorators: [{ type: Optional }, { type: SkipSelf }, { type: Inject, args: [STICKY_POSITIONING_LISTENER] }] }], propDecorators: { reorderable: [{ type: Input }], sortable: [{ type: Input }], resizable: [{ type: Input }], selectable: [{ type: Input }], selectionConfig: [{ type: Input }], totalItems: [{ type: Input }], dataSource: [{ type: Input }], selection: [{ type: Input }], sortedColumn: [{ type: Input }], paginatorUsed: [{ type: Input }], columnsOrderChange: [{ type: Output }], sortOrderChanged: [{ type: Output }], selectionChange: [{ type: Output }], columnsWidthChange: [{ type: Output }], layoutFixed: [{ type: HostBinding, args: ["class.nui-table__table-fixed"] }], virtualFor: [{ type: ContentChild, args: [CdkVirtualForOf] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0gsNEJBQTRCLEVBQzVCLHVCQUF1QixHQUUxQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hFLE9BQU8sRUFDSCwwQkFBMEIsRUFDMUIsd0JBQXdCLEVBQ3hCLFNBQVMsRUFDVCxrQkFBa0IsRUFDbEIsUUFBUSxFQUdSLDJCQUEyQixHQUU5QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBR0gsU0FBUyxFQUNULHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLGVBQWUsRUFJZixRQUFRLEVBQ1IsTUFBTSxFQUNOLFFBQVEsRUFDUixpQkFBaUIsR0FDcEIsTUFB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b2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IERpcmVjdGlvbmFsaXR5IH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9iaWRpXCI7XG5pbXBvcnQge1xuICAgIF9EaXNwb3NlVmlld1JlcGVhdGVyU3RyYXRlZ3ksXG4gICAgX1ZJRVdfUkVQRUFURVJfU1RSQVRFR1ksXG4gICAgX1ZpZXdSZXBlYXRlcixcbn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9jb2xsZWN0aW9uc1wiO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3BsYXRmb3JtXCI7XG5pbXBvcnQgeyBDZGtWaXJ0dWFsRm9yT2YsIFZpZXdwb3J0UnVsZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xuaW1wb3J0IHtcbiAgICBfQ09BTEVTQ0VEX1NUWUxFX1NDSEVEVUxFUixcbiAgICBfQ29hbGVzY2VkU3R5bGVTY2hlZHVsZXIsXG4gICAgQ0RLX1RBQkxFLFxuICAgIENES19UQUJMRV9URU1QTEFURSxcbiAgICBDZGtUYWJsZSxcbiAgICBSZW5kZXJSb3csXG4gICAgUm93Q29udGV4dCxcbiAgICBTVElDS1lfUE9TSVRJT05JTkdfTElTVEVORVIsXG4gICAgU3RpY2t5UG9zaXRpb25pbmdMaXN0ZW5lcixcbn0gZnJvbSBcIkBhbmd1bGFyL2Nkay90YWJsZVwiO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBdHRyaWJ1dGUsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgSXRlcmFibGVEaWZmZXJzLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBTa2lwU2VsZixcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBfaXNFcXVhbCBmcm9tIFwibG9kYXNoL2lzRXF1YWxcIjtcbmltcG9ydCBfa2V5cyBmcm9tIFwibG9kYXNoL2tleXNcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB7IFRhYmxlU3RhdGVIYW5kbGVyU2VydmljZSB9IGZyb20gXCIuL3RhYmxlLXN0YXRlLWhhbmRsZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgVGFibGVTZWxlY3Rpb25Db25maWcsIFRhYmxlU2VsZWN0aW9uTW9kZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBJRmlsdGVyaW5nUGFydGljaXBhbnRzLCBJU2VsZWN0aW9uIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3B1YmxpYy1hcGlcIjtcbmltcG9ydCB7IENvbXBvbmVudENoYW5nZXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IElTb3J0ZWRJdGVtLCBTb3J0ZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi4vc29ydGVyL3B1YmxpYy1hcGlcIjtcblxuLy8gPGV4YW1wbGUtdXJsPi4vLi4vZXhhbXBsZXMvaW5kZXguaHRtbCMvdGFibGU8L2V4YW1wbGUtdXJsPlxuXG4vKiogQGR5bmFtaWMgKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51aS10YWJsZSwgdGFibGVbbnVpLXRhYmxlXVwiLFxuICAgIC8vIFdlIHVzZWQgdG8gaGF2ZSBvdXIgb3duIHRlbXBsYXRlIGZvciB0aGUgdGFibGUgYnV0IGl0IGJyb2tlIHdpdGggQW5ndWxhciByZWxlYXNlIDEwIHNvIHdlIGFyZSBub3cgdXNpbmcgdGhpcyBldmVuIHRob3VnaCBpdCBpcyBpbnRlbmRlZCB0byBiZSBwcml2YXRlXG4gICAgLy8gc28gd2UgY2FuIGJlIHVwIHRvIGRhdGUgd2l0aCB0aGUgQ0RLIHRhYmxlIHRlbXBsYXRlLlxuICAgIHRlbXBsYXRlOiBDREtfVEFCTEVfVEVNUExBVEUsXG4gICAgZXhwb3J0QXM6IFwibnVpVGFibGVcIixcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiBcIm51aS10YWJsZV9fdGFibGVcIixcbiAgICB9LFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBUYWJsZVN0YXRlSGFuZGxlclNlcnZpY2UsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IF9WSUVXX1JFUEVBVEVSX1NUUkFURUdZLFxuICAgICAgICAgICAgdXNlQ2xhc3M6IF9EaXNwb3NlVmlld1JlcGVhdGVyU3RyYXRlZ3ksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IF9DT0FMRVNDRURfU1RZTEVfU0NIRURVTEVSLFxuICAgICAgICAgICAgdXNlQ2xhc3M6IF9Db2FsZXNjZWRTdHlsZVNjaGVkdWxlcixcbiAgICAgICAgfSxcbiAgICAgICAgeyBwcm92aWRlOiBDZGtUYWJsZSwgdXNlRXhpc3Rpbmc6IFRhYmxlQ29tcG9uZW50IH0sXG4gICAgICAgIHsgcHJvdmlkZTogQ0RLX1RBQkxFLCB1c2VFeGlzdGluZzogVGFibGVDb21wb25lbnQgfSxcbiAgICBdLFxuICAgIHN0eWxlVXJsczogW1wiLi90YWJsZS5jb21wb25lbnQubGVzc1wiXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudDxUPlxuICAgIGV4dGVuZHMgQ2RrVGFibGU8VD5cbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXNcbntcbiAgICBASW5wdXQoKSByZW9yZGVyYWJsZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHNvcnRhYmxlID0gZmFsc2U7XG4gICAgQElucHV0KCkgcmVzaXphYmxlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHNlbGVjdGlvbkNvbmZpZyBpbnN0ZWFkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBzZWxlY3Rpb25Db25maWc6IFRhYmxlU2VsZWN0aW9uQ29uZmlnID0ge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc2VsZWN0aW9uTW9kZTogVGFibGVTZWxlY3Rpb25Nb2RlLk5vbmUsXG4gICAgfTtcbiAgICBASW5wdXQoKSB0b3RhbEl0ZW1zOiBudW1iZXI7XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCBkYXRhU291cmNlKCk6IFRbXSB7XG4gICAgICAgIHJldHVybiBzdXBlci5kYXRhU291cmNlIGFzIGFueTtcbiAgICB9XG5cbiAgICBzZXQgZGF0YVNvdXJjZSh2YWx1ZTogVFtdKSB7XG4gICAgICAgIHN1cGVyLmRhdGFTb3VyY2UgPSB2YWx1ZSBhcyBhbnk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2VsZWN0aW9uOiBJU2VsZWN0aW9uO1xuICAgIEBJbnB1dCgpIHNvcnRlZENvbHVtbjogSVNvcnRlZEl0ZW07XG4gICAgQElucHV0KCkgcGFnaW5hdG9yVXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgpIGNvbHVtbnNPcmRlckNoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBzb3J0T3JkZXJDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8SVNvcnRlZEl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgY29sdW1uc1dpZHRoQ2hhbmdlOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBwdWJsaWMgc29ydERpcmVjdGlvbjogU29ydGVyRGlyZWN0aW9uO1xuICAgIHB1YmxpYyBzb3J0Qnk6IHN0cmluZztcbiAgICBwcml2YXRlIHRhYmxlQ29sdW1uc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgdGFibGVTb3J0aW5nU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25DaGFuZ2VkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBzdGlja3lDaGFuZ2VkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSB0YWJsZUNvbHVtbnNXaWR0aFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgIEBIb3N0QmluZGluZyhcImNsYXNzLm51aS10YWJsZV9fdGFibGUtZml4ZWRcIikgbGF5b3V0Rml4ZWQgPSBmYWxzZTtcbiAgICBAQ29udGVudENoaWxkKENka1ZpcnR1YWxGb3JPZikgcHVibGljIHZpcnR1YWxGb3I/OiBDZGtWaXJ0dWFsRm9yT2Y8dW5rbm93bj47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIF9kaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXG4gICAgICAgIHByb3RlY3RlZCBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAg