UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

573 lines 71.5 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 { CdkFooterRow, CdkFooterRowDef, CdkHeaderRow, CdkHeaderRowDef, CdkRow, CdkRowDef, } from "@angular/cdk/table"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Directive, ElementRef, HostBinding, HostListener, Input, IterableDiffers, TemplateRef, ViewChild, ViewEncapsulation, } from "@angular/core"; import _includes from "lodash/includes"; import { Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { DEFAULT_INTERACTIVE_ELEMENTS } from "../../../constants/interaction.constants"; import { CheckboxStatus } from "../../selector/public-api"; import { TableStateHandlerService } from "../table-state-handler.service"; import { TableSelectionMode, } from "../types"; import * as i0 from "@angular/core"; import * as i1 from "../table-state-handler.service"; import * as i2 from "@angular/common"; import * as i3 from "../../../common/directives/click-interceptor/click-interceptor.directive"; import * as i4 from "../../selector/selector.component"; import * as i5 from "@angular/cdk/table"; import * as i6 from "../../radio/radio-group.component"; import * as i7 from "../../checkbox/checkbox.component"; /* eslint-disable */ /** * @ignore */ export class TableHeaderRowDefDirective extends CdkHeaderRowDef { set nuiHeaderRowDef(value) { this.columns = value ?? []; } set nuiHeaderRowDefSticky(value) { this.sticky = value; } constructor(template, _differs, tableStateHandlerService) { super(template, _differs); this.tableStateHandlerService = tableStateHandlerService; } ngOnInit() { this.tableStateHandlerService.tableColumns = Array.from(this.columns); if (this.tableStateHandlerService.reorderable) { // reordering columns when drop is fired on column this.tableColumnsSubscription = this.tableStateHandlerService.columnsState.subscribe((tableColumns) => { this.columns = tableColumns; }); } } ngOnChanges(changes) { super.ngOnChanges(changes); if (changes.nuiHeaderRowDef) { this.tableStateHandlerService.tableColumns = changes.nuiHeaderRowDef.currentValue; } } ngOnDestroy() { if (this.tableColumnsSubscription) { this.tableColumnsSubscription.unsubscribe(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableHeaderRowDefDirective, deps: [{ token: i0.TemplateRef }, { token: i0.IterableDiffers }, { token: i1.TableStateHandlerService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: TableHeaderRowDefDirective, selector: "[nuiHeaderRowDef]", inputs: { nuiHeaderRowDef: "nuiHeaderRowDef", nuiHeaderRowDefSticky: "nuiHeaderRowDefSticky" }, host: { attributes: { "role": "row" } }, providers: [ { provide: CdkHeaderRowDef, useExisting: TableHeaderRowDefDirective }, ], usesInheritance: true, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableHeaderRowDefDirective, decorators: [{ type: Directive, args: [{ selector: "[nuiHeaderRowDef]", providers: [ { provide: CdkHeaderRowDef, useExisting: TableHeaderRowDefDirective }, ], host: { role: "row" }, }] }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.IterableDiffers }, { type: i1.TableStateHandlerService }], propDecorators: { nuiHeaderRowDef: [{ type: Input }], nuiHeaderRowDefSticky: [{ type: Input }] } }); /** * @ignore */ export class TableRowDefDirective extends CdkRowDef { set nuiRowDefColumns(value) { this.columns = value ?? []; } set nuiRowDefWhen(value) { this.when = value; } constructor(template, _differs, tableStateHandlerService) { super(template, _differs); this.tableStateHandlerService = tableStateHandlerService; } ngOnInit() { this.tableStateHandlerService.tableColumns = Array.from(this.columns); if (this.tableStateHandlerService.reorderable) { // reordering columns when drop is fired on column this.tableColumnsSubscription = this.tableStateHandlerService.columnsState.subscribe((tableColumns) => { this.columns = tableColumns; }); } } ngOnDestroy() { if (this.tableColumnsSubscription) { this.tableColumnsSubscription.unsubscribe(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableRowDefDirective, deps: [{ token: i0.TemplateRef }, { token: i0.IterableDiffers }, { token: i1.TableStateHandlerService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: TableRowDefDirective, selector: "[nuiRowDef]", inputs: { nuiRowDefColumns: "nuiRowDefColumns", nuiRowDefWhen: "nuiRowDefWhen" }, providers: [{ provide: CdkRowDef, useExisting: TableRowDefDirective }], usesInheritance: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableRowDefDirective, decorators: [{ type: Directive, args: [{ selector: "[nuiRowDef]", providers: [{ provide: CdkRowDef, useExisting: TableRowDefDirective }], }] }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.IterableDiffers }, { type: i1.TableStateHandlerService }], propDecorators: { nuiRowDefColumns: [{ type: Input }], nuiRowDefWhen: [{ type: Input }] } }); /** * @ignore */ export class TableFooterRowDefDirective extends CdkFooterRowDef { set nuiFooterRowDef(value) { this.columns = value ?? []; } set nuiFooterRowDefSticky(value) { this.sticky = value; } constructor(template, _differs, tableStateHandlerService) { super(template, _differs); this.tableStateHandlerService = tableStateHandlerService; } ngOnInit() { this.tableStateHandlerService.tableColumns = Array.from(this.columns); if (this.tableStateHandlerService.reorderable) { // reordering columns when drop is fired on column this.tableColumnsSubscription = this.tableStateHandlerService.columnsState.subscribe((tableColumns) => { this.columns = tableColumns; }); } } ngOnDestroy() { if (this.tableColumnsSubscription) { this.tableColumnsSubscription.unsubscribe(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableFooterRowDefDirective, deps: [{ token: i0.TemplateRef }, { token: i0.IterableDiffers }, { token: i1.TableStateHandlerService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: TableFooterRowDefDirective, selector: "[nuiFooterRowDef]", inputs: { nuiFooterRowDef: "nuiFooterRowDef", nuiFooterRowDefSticky: "nuiFooterRowDefSticky" }, providers: [ { provide: CdkFooterRowDef, useExisting: TableFooterRowDefDirective }, ], usesInheritance: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableFooterRowDefDirective, decorators: [{ type: Directive, args: [{ selector: "[nuiFooterRowDef]", providers: [ { provide: CdkFooterRowDef, useExisting: TableFooterRowDefDirective }, ], }] }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.IterableDiffers }, { type: i1.TableStateHandlerService }], propDecorators: { nuiFooterRowDef: [{ type: Input }], nuiFooterRowDefSticky: [{ type: Input }] } }); /** * @ignore */ export class TableHeaderRowComponent extends CdkHeaderRow { get isDensityDefault() { return this.density.toLowerCase() === "default"; } get isDensityCompact() { return this.density.toLowerCase() === "compact"; } get isDensityTiny() { return this.density.toLowerCase() === "tiny"; } get hasOptions() { return this.selectorState.selectorItems.length > 0; } constructor(tableStateHandlerService, changeDetectorRef) { super(); this.tableStateHandlerService = tableStateHandlerService; this.changeDetectorRef = changeDetectorRef; this.density = "default"; this.selectorState = { checkboxStatus: CheckboxStatus.Unchecked, selectorItems: [], }; this.onDestroy$ = new Subject(); this.selectable = this.tableStateHandlerService.selectable; this.selectionMode = this.tableStateHandlerService.selectionMode; } ngOnInit() { if (this.tableStateHandlerService.selectionEnabled) { this.selectorState = this.tableStateHandlerService.getSelectorState(); this.updateSelectorState(); } // if dataSource changes we need to update selector state this.dataSourceChangeSubscription = this.tableStateHandlerService.dataSourceChanged .pipe(takeUntil(this.onDestroy$)) .subscribe(() => { this.updateSelectorState(); }); // when single row is selected we need to update selector state // we also need to detect changes for selector state this.selectionChangeSubscription = this.tableStateHandlerService.selectionChanged .pipe(takeUntil(this.onDestroy$)) .subscribe(() => { this.updateSelectorState(); }); this.tableStateHandlerService.selectableChanged .pipe(takeUntil(this.onDestroy$)) .subscribe((selectable) => { this.selectable = selectable; this.changeDetectorRef.markForCheck(); }); this.tableStateHandlerService.selectionModeChanged .pipe(takeUntil(this.onDestroy$)) .subscribe((mode) => { this.selectionMode = mode; this.changeDetectorRef.markForCheck(); }); } ngAfterViewInit() { if (this.tableStateHandlerService.selectionEnabled) { this.tableStateHandlerService.applyStickyStyles(); } } onSelectorChange(selectorValue) { this.tableStateHandlerService.selection = this.tableStateHandlerService.applySelector(selectorValue); this.updateSelectorState(); this.tableStateHandlerService.selectionChanged.next(this.tableStateHandlerService.selection); } updateSelectorState() { this.selectorState = this.tableStateHandlerService.getSelectorState(); this.changeDetectorRef.detectChanges(); } ngOnDestroy() { this.onDestroy$.next(); this.onDestroy$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableHeaderRowComponent, deps: [{ token: i1.TableStateHandlerService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TableHeaderRowComponent, selector: "nui-header-row, tr[nui-header-row]", inputs: { density: "density" }, host: { attributes: { "role": "row" }, properties: { "class.nui-table__table-header-row_height_default": "this.isDensityDefault", "class.nui-table__table-header-row_height_compact": "this.isDensityCompact", "class.nui-table__table-header-row_height_tiny": "this.isDensityTiny" }, classAttribute: "nui-table__table-header-row" }, providers: [ { provide: CdkHeaderRow, useExisting: TableHeaderRowComponent }, ], exportAs: ["nuiHeaderRow"], usesInheritance: true, ngImport: i0, template: ` <th *ngIf=" selectable || selectionMode === 'multi' || selectionMode === 'radio' " nuiClickInterceptor class="nui-table__table-header-cell nui-table__table-header-cell--selectable" [ngClass]="{ 'no-options': !hasOptions }" > <nui-selector class="nui-table__table-header-cell__selector" [ngClass]="{ 'no-options': !hasOptions }" [class.invisible]="selectionMode !== 'multi'" [appendToBody]="true" (selectionChange)="onSelectorChange($event)" [checkboxStatus]="selectorState.checkboxStatus" [items]="selectorState.selectorItems" > </nui-selector> </th> <ng-container cdkCellOutlet></ng-container>`, isInline: true, dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ClickInterceptorDirective, selector: "[nuiClickInterceptor]" }, { kind: "component", type: i4.SelectorComponent, selector: "nui-selector", inputs: ["checkboxStatus", "items", "appendToBody", "ariaLabel"], outputs: ["selectionChange"] }, { kind: "directive", type: i5.CdkCellOutlet, selector: "[cdkCellOutlet]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableHeaderRowComponent, decorators: [{ type: Component, args: [{ template: ` <th *ngIf=" selectable || selectionMode === 'multi' || selectionMode === 'radio' " nuiClickInterceptor class="nui-table__table-header-cell nui-table__table-header-cell--selectable" [ngClass]="{ 'no-options': !hasOptions }" > <nui-selector class="nui-table__table-header-cell__selector" [ngClass]="{ 'no-options': !hasOptions }" [class.invisible]="selectionMode !== 'multi'" [appendToBody]="true" (selectionChange)="onSelectorChange($event)" [checkboxStatus]="selectorState.checkboxStatus" [items]="selectorState.selectorItems" > </nui-selector> </th> <ng-container cdkCellOutlet></ng-container>`, host: { role: "row", class: "nui-table__table-header-row", }, selector: "nui-header-row, tr[nui-header-row]", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: "nuiHeaderRow", providers: [ { provide: CdkHeaderRow, useExisting: TableHeaderRowComponent }, ], }] }], ctorParameters: () => [{ type: i1.TableStateHandlerService }, { type: i0.ChangeDetectorRef }], propDecorators: { density: [{ type: Input }], isDensityDefault: [{ type: HostBinding, args: ["class.nui-table__table-header-row_height_default"] }], isDensityCompact: [{ type: HostBinding, args: ["class.nui-table__table-header-row_height_compact"] }], isDensityTiny: [{ type: HostBinding, args: ["class.nui-table__table-header-row_height_tiny"] }] } }); /** * @ignore */ /** Data row template container that contains the cell outlet. Adds the right class and role. */ export class TableRowComponent extends CdkRow { get isSelected() { return this.isRowSelected(); } get isDensityDefault() { return this.density.toLowerCase() === "default"; } get isDensityCompact() { return this.density.toLowerCase() === "compact"; } get isDensityTiny() { return this.density.toLowerCase() === "tiny"; } constructor(elementRef, tableStateHandlerService, changeDetectorRef) { super(); this.elementRef = elementRef; this.tableStateHandlerService = tableStateHandlerService; this.changeDetectorRef = changeDetectorRef; this.density = "default"; this.clickableRow = false; this.clickableRowConfig = { clickableSelectors: ["nui-row", "tr[nui-row]"], ignoredSelectors: DEFAULT_INTERACTIVE_ELEMENTS, }; this.onDestroy$ = new Subject(); this.selectable = this.tableStateHandlerService.selectable; this.selectionMode = this.tableStateHandlerService.selectionMode; } ngOnInit() { const rowHeightClass = `nui-table__table-row_height_${this.density.toLowerCase()}`; this.elementRef.nativeElement.classList.add(rowHeightClass); // when selection changes we need to detect changes to check check-boxes this.selectionChangeSubscription = this.tableStateHandlerService.selectionChanged .pipe(takeUntil(this.onDestroy$)) .subscribe(() => { this.changeDetectorRef.detectChanges(); }); this.tableStateHandlerService.selectableChanged .pipe(takeUntil(this.onDestroy$)) .subscribe((selectable) => { this.selectable = selectable; this.changeDetectorRef.markForCheck(); }); this.tableStateHandlerService.selectionModeChanged .pipe(takeUntil(this.onDestroy$)) .subscribe((mode) => { this.selectionMode = mode; this.changeDetectorRef.markForCheck(); }); } rowClickHandler(target) { if (!this.tableStateHandlerService.selectionEnabled || !this.clickableRow || !this.clickableRowConfig.clickableSelectors.length) { return; } const closestTableRow = target.closest(this.clickableRowConfig.clickableSelectors.join(",")); if (!closestTableRow) { return; } if (this.clickableRowConfig.ignoredSelectors.length && target.closest(this.clickableRowConfig.ignoredSelectors.join(","))) { return; } if (this.selectionMode === TableSelectionMode.Single) { this.rowSelected(); return; } const rowSelector = closestTableRow.querySelector(".nui-table__table-cell__checkbox"); if (rowSelector === this.rowSelectionElement?.nativeElement) { this.rowSelected(); } } rowSelected() { this.tableStateHandlerService.handleRowSelect(this.rowObject); } /** * We need to stop propagation of the checkbox click to prevent the row click handler from invoking the checkbox toggle functionality again */ stopPropagation(event) { event.stopPropagation(); } isRowSelected() { const rowObjectTrackBy = this.tableStateHandlerService.trackBy(0, this.rowObject); const includedRows = this.tableStateHandlerService.selection.include; const excludedRows = this.tableStateHandlerService.selection.exclude; if (this.tableStateHandlerService.selection.isAllPages) { // case when we unselect one page by checkbox if (this.tableStateHandlerService.selection.exclude.length > 0) { return !_includes(excludedRows, rowObjectTrackBy); } return true; } return includedRows.length > 0 ? _includes(includedRows, rowObjectTrackBy) : false; } ngOnDestroy() { this.onDestroy$.next(); this.onDestroy$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableRowComponent, deps: [{ token: i0.ElementRef }, { token: i1.TableStateHandlerService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TableRowComponent, selector: "nui-row, tr[nui-row]", inputs: { density: "density", rowObject: "rowObject", clickableRow: "clickableRow", clickableRowConfig: "clickableRowConfig" }, host: { attributes: { "role": "row" }, listeners: { "click": "rowClickHandler($event.target)" }, properties: { "class.nui-table__table-row--clickable": "this.clickableRow", "class.nui-table__table-row--selected": "this.isSelected", "class.nui-table__table-row_height_default": "this.isDensityDefault", "class.nui-table__table-row_height_compact": "this.isDensityCompact", "class.nui-table__table-row_height_tiny": "this.isDensityTiny" }, classAttribute: "nui-table__table-row" }, providers: [{ provide: CdkRow, useExisting: TableRowComponent }], viewQueries: [{ propertyName: "rowSelectionElement", first: true, predicate: ["rowSelectionElement"], descendants: true, read: ElementRef }], exportAs: ["nuiRow"], usesInheritance: true, ngImport: i0, template: ` <td *ngIf=" selectable || (selectionMode && (selectionMode === 'multi' || selectionMode === 'radio')) " class="nui-table__table-cell nui-table__table-cell--selectable" > <nui-radio *ngIf="selectionMode === 'radio'" class="nui-table__table-cell__checkbox d-inline-block" [checked]="isRowSelected()" (valueChange)="rowSelected()" (click)="stopPropagation($event)" #rowSelectionElement > </nui-radio> <nui-checkbox *ngIf="selectionMode === 'multi'" class="nui-table__table-cell__checkbox d-inline-block" [checked]="isRowSelected()" (valueChange)="rowSelected()" (click)="stopPropagation($event)" #rowSelectionElement > </nui-checkbox> </td> <ng-container cdkCellOutlet></ng-container>`, isInline: true, dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.RadioComponent, selector: "nui-radio", inputs: ["value", "hovered", "checked", "hint", "disabled", "ariaLabel"], outputs: ["valueChange"] }, { kind: "component", type: i7.CheckboxComponent, selector: "nui-checkbox", inputs: ["ariaLabel", "ariaLabelledby", "ariaDescribedby", "name", "title", "value", "hovered", "checked", "required", "hint", "disabled", "indeterminate"], outputs: ["valueChange"] }, { kind: "directive", type: i5.CdkCellOutlet, selector: "[cdkCellOutlet]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableRowComponent, decorators: [{ type: Component, args: [{ selector: "nui-row, tr[nui-row]", template: ` <td *ngIf=" selectable || (selectionMode && (selectionMode === 'multi' || selectionMode === 'radio')) " class="nui-table__table-cell nui-table__table-cell--selectable" > <nui-radio *ngIf="selectionMode === 'radio'" class="nui-table__table-cell__checkbox d-inline-block" [checked]="isRowSelected()" (valueChange)="rowSelected()" (click)="stopPropagation($event)" #rowSelectionElement > </nui-radio> <nui-checkbox *ngIf="selectionMode === 'multi'" class="nui-table__table-cell__checkbox d-inline-block" [checked]="isRowSelected()" (valueChange)="rowSelected()" (click)="stopPropagation($event)" #rowSelectionElement > </nui-checkbox> </td> <ng-container cdkCellOutlet></ng-container>`, host: { role: "row", class: "nui-table__table-row", }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: "nuiRow", providers: [{ provide: CdkRow, useExisting: TableRowComponent }], }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.TableStateHandlerService }, { type: i0.ChangeDetectorRef }], propDecorators: { density: [{ type: Input }], rowObject: [{ type: Input }], clickableRow: [{ type: Input }, { type: HostBinding, args: ["class.nui-table__table-row--clickable"] }], clickableRowConfig: [{ type: Input }], isSelected: [{ type: HostBinding, args: ["class.nui-table__table-row--selected"] }], isDensityDefault: [{ type: HostBinding, args: ["class.nui-table__table-row_height_default"] }], isDensityCompact: [{ type: HostBinding, args: ["class.nui-table__table-row_height_compact"] }], isDensityTiny: [{ type: HostBinding, args: ["class.nui-table__table-row_height_tiny"] }], rowSelectionElement: [{ type: ViewChild, args: ["rowSelectionElement", { read: ElementRef, static: false }] }], rowClickHandler: [{ type: HostListener, args: ["click", ["$event.target"]] }] } }); /** * @ignore */ export class TableFooterRowComponent extends CdkFooterRow { static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableFooterRowComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TableFooterRowComponent, selector: "nui-footer-row, tr[nui-footer-row]", host: { attributes: { "role": "row" }, classAttribute: "nui-footer-row" }, providers: [ { provide: CdkFooterRow, useExisting: TableFooterRowComponent }, ], exportAs: ["nuiFooterRow"], usesInheritance: true, ngImport: i0, template: "<ng-container cdkCellOutlet></ng-container>", isInline: true, dependencies: [{ kind: "directive", type: i5.CdkCellOutlet, selector: "[cdkCellOutlet]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableFooterRowComponent, decorators: [{ type: Component, args: [{ selector: "nui-footer-row, tr[nui-footer-row]", template: "<ng-container cdkCellOutlet></ng-container>", host: { class: "nui-footer-row", role: "row", }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, exportAs: "nuiFooterRow", providers: [ { provide: CdkFooterRow, useExisting: TableFooterRowComponent }, ], }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGFibGUvdGFibGUtcm93L3RhYmxlLXJvdy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFDSCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixlQUFlLEVBQ2YsTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLGVBQWUsRUFLZixXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLFNBQVMsTUFBTSxpQkFBaUIsQ0FBQztBQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFeEYsT0FBTyxFQUFFLGNBQWMsRUFBaUIsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FB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QUk7b0JBQ3JDLFFBQVEsRUFBRSxjQUFjO29CQUN4QixTQUFTLEVBQUU7d0JBQ1AsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcseUJBQXlCLEVBQUU7cUJBQ2xFO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgQ2RrRm9vdGVyUm93LFxuICAgIENka0Zvb3RlclJvd0RlZixcbiAgICBDZGtIZWFkZXJSb3csXG4gICAgQ2RrSGVhZGVyUm93RGVmLFxuICAgIENka1JvdyxcbiAgICBDZGtSb3dEZWYsXG59IGZyb20gXCJAYW5ndWxhci9jZGsvdGFibGVcIjtcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIEl0ZXJhYmxlRGlmZmVycyxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBfaW5jbHVkZXMgZnJvbSBcImxvZGFzaC9pbmNsdWRlc1wiO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQgeyBERUZBVUxUX0lOVEVSQUNUSVZFX0VMRU1FTlRTIH0gZnJvbSBcIi4uLy4uLy4uL2NvbnN0YW50cy9pbnRlcmFjdGlvbi5jb25zdGFudHNcIjtcbmltcG9ydCB7IElTZWxlY3RvclN0YXRlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3B1YmxpYy1hcGlcIjtcbmltcG9ydCB7IENoZWNrYm94U3RhdHVzLCBTZWxlY3Rpb25UeXBlIH0gZnJvbSBcIi4uLy4uL3NlbGVjdG9yL3B1YmxpYy1hcGlcIjtcbmltcG9ydCB7IFRhYmxlU3RhdGVIYW5kbGVyU2VydmljZSB9IGZyb20gXCIuLi90YWJsZS1zdGF0ZS1oYW5kbGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gICAgQ2xpY2thYmxlUm93T3B0aW9ucyxcbiAgICBSb3dIZWlnaHRPcHRpb25zLFxuICAgIFRhYmxlU2VsZWN0aW9uTW9kZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiBcIltudWlIZWFkZXJSb3dEZWZdXCIsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogQ2RrSGVhZGVyUm93RGVmLCB1c2VFeGlzdGluZzogVGFibGVIZWFkZXJSb3dEZWZEaXJlY3RpdmUgfSxcbiAgICBdLFxuICAgIGhvc3Q6IHsgcm9sZTogXCJyb3dcIiB9LFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUhlYWRlclJvd0RlZkRpcmVjdGl2ZVxuICAgIGV4dGVuZHMgQ2RrSGVhZGVyUm93RGVmXG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzXG57XG4gICAgQElucHV0KCkgc2V0IG51aUhlYWRlclJvd0RlZih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHZhbHVlID8/IFtdO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBudWlIZWFkZXJSb3dEZWZTdGlja3kodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zdGlja3kgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGFibGVDb2x1bW5zU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgICAgIF9kaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXG4gICAgICAgIHByaXZhdGUgdGFibGVTdGF0ZUhhbmRsZXJTZXJ2aWNlOiBUYWJsZVN0YXRlSGFuZGxlclNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIodGVtcGxhdGUsIF9kaWZmZXJzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGFibGVTdGF0ZUhhbmRsZXJTZXJ2aWNlLnRhYmxlQ29sdW1ucyA9IEFycmF5LmZyb20odGhpcy5jb2x1bW5zKTtcblxuICAgICAgICBpZiAodGhpcy50YWJsZVN0YXRlSGFuZGxlclNlcnZpY2UucmVvcmRlcmFibGUpIHtcbiAgICAgICAgICAgIC8vIHJlb3JkZXJpbmcgY29sdW1ucyB3aGVuIGRyb3AgaXMgZmlyZWQgb24gY29sdW1uXG4gICAgICAgICAgICB0aGlzLnRhYmxlQ29sdW1uc1N1YnNjcmlwdGlvbiA9XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0YXRlSGFuZGxlclNlcnZpY2UuY29sdW