UNPKG

@circe/table

Version:
439 lines 93.7 kB
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, Renderer2, ViewChild, ViewChildren } from '@angular/core'; import { EventsService, IconsOld, ToolService } from '@circe/core'; import { BehaviorSubject, fromEvent, isObservable, of, Subject } from 'rxjs'; import { TableService } from './table.service'; import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; import { debounceTime, delay, takeUntil, tap } from 'rxjs/operators'; import { SelectComponent } from '@circe/select'; import { _isTableSource } from './table-source'; import { NpaTableConfiguration } from './configurations/table.configuration'; import { NpaTableActionsConfiguration } from './configurations/table-actions.configuration'; export class TableComponent { constructor(ev, tools, tableService, _renderer) { this.ev = ev; this.tools = tools; this.tableService = tableService; this._renderer = _renderer; this.internalUpdate = new EventEmitter(); this.sortChange = new EventEmitter(); this.scrolledToBottom = new EventEmitter(); this.internalId = ToolService.generateUuid(); this.rows$ = new BehaviorSubject([]); this.checkboxColumnsModel = {}; this.rowsHoverState = []; this.groupActions$ = new BehaviorSubject(false); this.showInternalSpinner$ = new BehaviorSubject(false); this.manualActionsHide$ = new Subject(); this.sort$ = new BehaviorSubject(null); this._originalDataCopy = []; this._componentDestroyed$ = new Subject(); this._iconHandler = new IconsOld(); } get sort() { return this.sort$.value; } set sort(sort) { var _a; (_a = this._sortSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); this._sortSubscription = isObservable(sort) ? sort.subscribe(this.sort$) : of(sort).subscribe(this.sort$); } onResize() { this.showInternalSpinner$.next(true); } _setDataStream() { var _a; if (this.data) { if (Array.isArray(this.data)) { this.dataSource$ = of(this.data); } else if (isObservable(this.data)) { this.dataSource$ = this.data; } else if (_isTableSource(this.data)) { this.dataSource$ = this.data.connect(); } else { throw new Error('[TableComponent]: data input must be of type T[], Observable<T[]> or TableSource<T>'); } (_a = this.dataSourceSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); this.dataSourceSubscription = this.dataSource$.pipe(takeUntil(this._componentDestroyed$)).subscribe((data) => { var _a; this._originalDataCopy = [...data]; this.rows$.next(this._processRows(data, (_a = this.tableConfiguration) === null || _a === void 0 ? void 0 : _a.columns)); }); this.rows$.pipe(takeUntil(this._componentDestroyed$), delay(1), tap((rows) => { this._setScrollListener(); this._viewPort.checkViewportSize(); })).subscribe(); } } _processRows(rows, columnsConfig) { return columnsConfig ? rows.map((row) => { return columnsConfig.map((c) => this._processColumn(row, c)); }) : []; } _processColumn(rowData, columnConfig) { const column = Object.assign({}, columnConfig); let auxColumn = Object.assign({ sortable: true }, columnConfig); switch (column.type) { case 'checkbox': auxColumn = this._processCheckboxColumn(column, rowData); break; case 'radio': auxColumn = this._processRadioColumn(column); break; case 'select': auxColumn = this._processSelectColumn(column, rowData); break; case 'icon': auxColumn = this._processIconColumn(rowData, column); break; case 'badge': auxColumn = this._processBadgeColumn(rowData, column); break; case 'date': auxColumn = this._processDateColumn(rowData, column); break; default: if ('param' in columnConfig) { auxColumn.value = ToolService.getValueFromMultiLevelObject(rowData, columnConfig.param); } } return auxColumn; } _processCheckboxColumn(columnConfig, rowData) { const _rowId = ToolService.getValueFromMultiLevelObject(rowData, this.tableConfiguration.keyColumnParam); const _checkboxColumn = Object.assign({}, columnConfig); const _tableServiceData = this.tableService.tables[this.id]; const _columnConfigData = _tableServiceData ? _tableServiceData[columnConfig.id] : null; _checkboxColumn.value = !!_columnConfigData && _columnConfigData.includes(_rowId); return _checkboxColumn; } _processRadioColumn(columnConfig) { const _radioColumn = Object.assign({}, columnConfig); const _tableServiceData = this.tableService.tables[this.id]; const _columnConfigData = _tableServiceData ? _tableServiceData[columnConfig.id] : null; _radioColumn.value = _columnConfigData !== null && _columnConfigData !== void 0 ? _columnConfigData : -1; return _radioColumn; } _processSelectColumn(columnConfig, rowData) { const _rowId = ToolService.getValueFromMultiLevelObject(rowData, this.tableConfiguration.keyColumnParam); const _columnConfigIsSet = !!columnConfig.typeConfig; const _selectColumn = Object.assign({}, columnConfig); const _typeConfig = _selectColumn.typeConfig; const _tableServiceData = this.tableService.tables[this.id]; const _columnConfigData = _tableServiceData ? _tableServiceData[columnConfig.id] : null; _selectColumn.selectConfig = Object.assign(Object.assign({ dropdownRelativeElement: 'npa-table__viewport' }, _typeConfig.selectConfig), { size: 'small', setDropdownParentTo: { type: 'id', name: 'npa-table-' + this.internalId } }); if (_columnConfigIsSet) { if ('defaultValue' in _typeConfig) { _selectColumn.value = _typeConfig.defaultValue; } if ('multilevel' in _typeConfig) { _selectColumn.selectConfig = Object.assign(Object.assign({}, _selectColumn.selectConfig), { multiple: _typeConfig.multilevel, multipleSelectionBehavior: 'checkbox' }); _selectColumn.value = _columnConfigData ? _columnConfigData[_rowId] : []; } else { _selectColumn.value = _columnConfigData ? _columnConfigData[_rowId] : ''; } if ('placeholder' in _typeConfig) { _selectColumn.selectConfig = Object.assign(Object.assign({}, _selectColumn.selectConfig), { placeholder: _typeConfig.placeholder }); } if (_selectColumn.selectConfig.multiple && 'multilevelButtonLabel' in _typeConfig) { _selectColumn.selectConfig = Object.assign(Object.assign({}, _selectColumn.selectConfig), { confirmButtonLabel: _typeConfig.multilevelButtonLabel }); } } return _selectColumn; } _processIconColumn(rowData, columnConfig) { const _columnConfigIsSet = !!columnConfig.typeConfig; const _selectColumn = Object.assign({}, columnConfig); const _typeConfig = _selectColumn.typeConfig; if (_columnConfigIsSet) { if ('icon' in _typeConfig) { _selectColumn.icon = this._getIcon(rowData, columnConfig); } if ('onlyIcon' in _typeConfig) { _selectColumn.onlyIcon = _typeConfig.onlyIcon; } if ('param' in columnConfig) { _selectColumn.value = ToolService.getValueFromMultiLevelObject(rowData, columnConfig.param); } } return _selectColumn; } _processBadgeColumn(rowData, columnConfig) { const _columnConfigIsSet = !!columnConfig.typeConfig; const _badgeColumn = Object.assign({}, columnConfig); const _typeConfig = _badgeColumn.typeConfig; if (_columnConfigIsSet) { if ('type' in _typeConfig) { _badgeColumn.badgeType = this._getBadgeType(rowData, columnConfig); } if ('param' in columnConfig) { _badgeColumn.value = ToolService.getValueFromMultiLevelObject(rowData, columnConfig.param); } } return _badgeColumn; } _processDateColumn(rowData, columnConfig) { const _columnConfigIsSet = !!columnConfig.typeConfig; const _dateColumn = Object.assign({}, columnConfig); if (_columnConfigIsSet) { if ('param' in columnConfig) { _dateColumn.value = new Date(ToolService.getValueFromMultiLevelObject(rowData, columnConfig.param)); } } return _dateColumn; } _getBadgeType(row, column) { const _typeConfig = column.typeConfig; const _badgeType = _typeConfig.type; if (_badgeType) { return (typeof _badgeType === 'function' ? _badgeType(row) : _badgeType); } return ''; } _getIcon(row, column) { let auxIcon = { classes: '' }; const _typeConfig = column.typeConfig; const _icon = _typeConfig.icon; if (_icon) { auxIcon = (typeof _icon === 'function' ? _icon(row) : _icon); } return this._iconHandler.getIcon(auxIcon); } _getTableValue() { return this.rows$.value.map(this.getRowValue.bind(this)); } _hideAllDropdowns() { this.manualActionsHide$.next(); if (this.selects.length) { for (const _select of this.selects) { if (_select.showDropdown) { _select.setDropdown(); } } } } _setScrollListener() { var _a; if (!!this._viewPort) { (_a = this._scrollSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); this._scrollSubscription = fromEvent(this._viewPort.getElementRef().nativeElement, 'scroll') .pipe(tap(() => this._hideAllDropdowns()), debounceTime(300), takeUntil(this._componentDestroyed$)).subscribe(this.checkScroll.bind(this)); } } _setResizeListener() { fromEvent(window, 'resize') .pipe(tap(() => this.manualActionsHide$.next()), debounceTime(300), takeUntil(this._componentDestroyed$)) .subscribe(() => { this.showInternalSpinner$.next(false); }); this.showInternalSpinner$.pipe(takeUntil(this._componentDestroyed$), delay(1)) .subscribe(() => { if (this._viewPort) { this._viewPort.checkViewportSize(); } }); } _processConfiguration(config) { this.tableConfiguration = new NpaTableConfiguration(this.rows$, config); this.tableActionsConfiguration = new NpaTableActionsConfiguration(this.tableConfiguration.actionsConfigurationModel); this._checkBiggerTableActions(this.tableActionsConfiguration.group); } ngOnInit() { this._processConfiguration(this.config); this._setDataStream(); } ngAfterViewInit() { this._setResizeListener(); } ngOnChanges(changes) { var _a, _b, _c, _d; if (this.hotRender && (((_a = changes.config) === null || _a === void 0 ? void 0 : _a.currentValue) && ((_b = changes.config) === null || _b === void 0 ? void 0 : _b.previousValue))) { this._processConfiguration((_c = changes.config) === null || _c === void 0 ? void 0 : _c.currentValue); this._setDataStream(); } if ((_d = changes.data) === null || _d === void 0 ? void 0 : _d.currentValue) { this._setDataStream(); this._checkBiggerTableActions(this.groupActions$.value); } } checkColumnCheckboxes(columnId) { const _rows = [...this.rows$.value]; const columnValues = _rows.map((r) => { var _a; return !!((_a = r.find((c) => c.id === columnId)) === null || _a === void 0 ? void 0 : _a.value); }); if (!this.checkboxColumnsModel[columnId]) { this.checkboxColumnsModel[columnId] = { checkAll: false, checkNone: true, model: false }; } this.checkboxColumnsModel[columnId].checkAll = !!_rows.length && columnValues && (columnValues === null || columnValues === void 0 ? void 0 : columnValues.every((v) => v)); this.checkboxColumnsModel[columnId].checkNone = columnValues === null || columnValues === void 0 ? void 0 : columnValues.every((v) => !v); this.checkboxColumnsModel[columnId].model = this.checkboxColumnsModel[columnId].checkAll || !this.checkboxColumnsModel[columnId].checkNone; } sortTableRows(column) { if (this.tableConfiguration.sortTable && column.sortable && column.columnName) { const { sortType, columnId } = this.sort$.value; const _newSortType = (sortType === 'desc' || columnId !== column.id) ? 'asc' : 'desc'; this.sort$.next({ columnId: column.id, sortType: _newSortType }); this.sortChange.emit({ columnId: column.id, sortType: _newSortType }); } } updateRadioColumn(columnId, newValue) { const _rows = [...this.rows$.value]; _rows.forEach((row, rowIndex) => { const _column = row.find((r) => r.id === columnId); _column.value = newValue; if (_column.rowId === newValue) { const _row = this.getRowValue(row, rowIndex); const _rowId = ToolService.getValueFromMultiLevelObject(_row.npaTableDataSource, this.tableConfiguration.keyColumnParam); this.tableService .setRadioData(this.id, _rowId, _column.id); } }); this.internalUpdate.emit(this._getTableValue()); } updateCheckboxColumn(column, row, rowIndex, newValue, bypassCheck) { column.value = newValue; if (!this.checkboxColumnsModel[column.id]) { this.checkboxColumnsModel[column.id] = { checkAll: false, checkNone: true, model: false }; } const _rows = [...this.rows$.value]; const _row = this.getRowValue(row, rowIndex); const _rowId = ToolService.getValueFromMultiLevelObject(_row.npaTableDataSource, this.tableConfiguration.keyColumnParam); const columnValues = _rows.map((r) => !!r.find((c) => c.id === column.id).value); this.checkboxColumnsModel[column.id].checkAll = columnValues.every((v) => v); this.checkboxColumnsModel[column.id].checkNone = columnValues.every((v) => !v); // this.checkboxColumnsModel[column.id].model = this.checkboxColumnsModel[column.id].checkAll || !this.checkboxColumnsModel[column.id].checkNone; if (newValue) { this.tableService.addCheckboxData(this.id, _rowId, column.id); } else { this.tableService.deleteCheckboxData(this.id, _rowId, column.id); } if (!bypassCheck) { this.checkColumnCheckboxes(column.id); } this.internalUpdate.emit(this._getTableValue()); } updateColumnValue(column, row, rowIndex, newValue) { const _row = this.getRowValue(row, rowIndex); const _rowId = ToolService.getValueFromMultiLevelObject(_row.npaTableDataSource, this.tableConfiguration.keyColumnParam); column.value = newValue; this.tableService .setSelectData(this.id, _rowId, column.id, newValue); this.internalUpdate.emit(this._getTableValue()); } linkAction(column, row, rowIndex) { const _typeConfig = column.typeConfig; if (_typeConfig === null || _typeConfig === void 0 ? void 0 : _typeConfig.linkAction) { _typeConfig.linkAction(this.getRowValue(row, rowIndex)); } } setColumnCheckboxes(columnId) { const _rows = [...this.rows$.value]; this.checkboxColumnsModel[columnId].model = !this.checkboxColumnsModel[columnId].model; _rows.forEach((row, rowIndex) => { const _column = row.find((c) => c.id === columnId); this.updateCheckboxColumn(_column, row, rowIndex, this.checkboxColumnsModel[columnId].model, true); }); this.checkColumnCheckboxes(columnId); this.internalUpdate.emit(this._getTableValue()); } rowHover(columnIndex) { this.rowsHoverState = new Array(this.rowsHoverState.length).fill(false); this.rowsHoverState[columnIndex] = true; } tableMouseLeave() { this.rowsHoverState = new Array(this.rowsHoverState.length).fill(false); } rowMouseLeave(rowIndex) { this.rowsHoverState = [...this.rowsHoverState.slice(0, rowIndex), false, ...this.rowsHoverState.slice(rowIndex + 1)]; } checkScroll() { const _viewPortElement = this._viewPort.getElementRef().nativeElement; const _bodyHasScroll = _viewPortElement.offsetHeight < _viewPortElement.scrollHeight; if (this._viewPort && this.tableConfiguration.emitOnScroll) { const _viewPort = this._viewPort.getElementRef().nativeElement; if (_bodyHasScroll && _viewPort.scrollTop + _viewPort.offsetHeight >= _viewPort.scrollHeight) { this.scrolledToBottom.emit(); } } } getRowValue(row, rowIndex) { var _a; const _originalRow = (_a = this._originalDataCopy[rowIndex]) !== null && _a !== void 0 ? _a : {}; const _rowValue = { npaTableDataSource: Object.assign({}, _originalRow) }; for (const column of row) { if (column.id !== 'npa-table-actions-column') { _rowValue[column.id] = column.type === 'radio' ? (column.value === rowIndex) : column.value; } } return Object.assign({}, _rowValue); } _checkBiggerTableActions(group) { var _a, _b, _c; let _biggerTableActions; const _tableActionsComponents = this.tableActions ? Array.from(this.tableActions) : []; for (const _tableActionsComponent of _tableActionsComponents) { if (!_biggerTableActions || ((_a = _tableActionsComponent.actionsContainer) === null || _a === void 0 ? void 0 : _a.nativeElement.scrollWidth) > _biggerTableActions.scrollWidth) { _biggerTableActions = (_b = _tableActionsComponent.actionsContainer) === null || _b === void 0 ? void 0 : _b.nativeElement; } } const _tableActionsComponentParent = (_c = _tableActionsComponents[0]) === null || _c === void 0 ? void 0 : _c.el.nativeElement.parentNode; if (!group && _biggerTableActions && _biggerTableActions.scrollWidth >= (_tableActionsComponentParent === null || _tableActionsComponentParent === void 0 ? void 0 : _tableActionsComponentParent.offsetWidth)) { this.groupActions$.next(true); } else { this.groupActions$.next(group); } } ngOnDestroy() { this._componentDestroyed$.next(); this._componentDestroyed$.complete(); this._componentDestroyed$.unsubscribe(); } } TableComponent.decorators = [ { type: Component, args: [{ selector: 'npa-table', template: "<div class=\"npa-table\" #table [id]=\"'npa-table-' + internalId\" [style.height]=\"tableConfiguration?.tableHeight$ | async\">\n <div\n class=\"npa-table__header\"\n #tableHeader\n *ngIf=\"tableConfiguration?.showHeader\"\n [ngStyle]=\"{ 'min-width': table?.offsetWidth < tableConfiguration.minRowWidth ? tableConfiguration.minRowWidth + 'px' : 'unset'}\"\n [style]=\"{'grid-template-columns': tableConfiguration.columnsWidth}\">\n <div\n class=\"npa-table__header-cell npa-table__header-cell--checkbox\"\n *ngFor=\"let column of tableConfiguration.columns; trackBy: tools.identifier;\"\n [ngClass]=\"{'sort': tableConfiguration.sortTable && column.sortable && column.columnName}\">\n <ng-container *ngIf=\"column.type === 'checkbox' && column.typeConfig.checkboxInHeader\">\n <input\n class=\"npa-selection--vertical\"\n type=\"checkbox\"\n [id]=\"column.id + '-check-all'\"\n [name]=\"column.id + '-check-all'\"\n [ngClass]=\"{\n 'npa-checkbox--indeterminate': (!checkboxColumnsModel[column.id]?.checkAll) && !checkboxColumnsModel[column.id]?.checkNone\n }\"\n [checked]=\"(checkboxColumnsModel[column.id]?.checkAll && !checkboxColumnsModel[column.id]?.checkNone) || checkboxColumnsModel[column.id]?.model\"\n [ngModel]=\"checkboxColumnsModel[column.id]?.model\"\n (ngModelChange)=\"setColumnCheckboxes(column.id)\">\n <label [for]=\"column.id + '-check-all'\"></label>\n </ng-container>\n <span\n class=\"npa-tooltip\"\n [ngClass]=\"{ 'truncate-text': tableConfiguration.truncateTexts }\"\n [showWhenTruncated]=\"true\"\n [title]=\"column.columnName\"\n (click)=\"sortTableRows(column)\">\n {{column.columnName}}\n </span>\n <i\n class=\"npa-icon\"\n *ngIf=\"tableConfiguration.sortTable && column.sortable && sort$.value?.sortType && sort$.value?.columnId === column.id\"\n [ngClass]=\"sort$.value.sortType === 'asc' ? 'icon-arrow-up' : 'icon-arrow-down'\"\n (click)=\"sortTableRows(column)\">\n </i>\n </div>\n <div class=\"npa-table__header-cell npa-table__header-cell--checkbox\" *ngIf=\"tableActionsConfiguration && !tableActionsConfiguration.hideColumn\"></div>\n </div>\n <div class=\"npa-table__body--overlay\" *ngIf=\"showSpinner || (showInternalSpinner$ | async)\">\n <div class=\"npa-table__spinner-container\">\n <npa-spinner></npa-spinner>\n </div>\n </div>\n <div\n class=\"npa-table__body\"\n #tableBody\n [ngClass]=\"{'hide': showSpinner || (showInternalSpinner$ | async)}\"\n (mouseleave)=\"tableMouseLeave()\">\n <cdk-virtual-scroll-viewport\n class=\"npa-table__viewport\"\n [ngStyle]=\"{ 'min-width': (table?.offsetWidth < tableConfiguration.minRowWidth) ? tableConfiguration.minRowWidth + 'px' : 'unset'}\"\n [ngClass]=\"{'hide': (rows$ | async)?.length < 1}\"\n [itemSize]=\"41\">\n <div\n class=\"npa-table__row\"\n #tableRow\n *cdkVirtualFor=\"let row of (rows$ | async); trackBy: tools.identifier; let rowIndex = index\"\n [ngClass]=\"{'hover': tableConfiguration.hoverRows}\"\n [style]=\"{'grid-template-columns': tableConfiguration.columnsWidth}\"\n (mouseenter)=\"rowHover(rowIndex)\"\n (mouseleave)=\"rowMouseLeave(rowIndex)\">\n <div\n class=\"npa-table__cell\"\n *ngFor=\"let column of row; trackBy: tools.identifier;\" [id]=\"column.id\">\n <ng-container *ngIf=\"!column.type\">\n <span\n class=\"npa-table__cell-value npa-tooltip npa-tooltip--small npa-tooltip--light\"\n *ngIf=\"(!rowsHoverState[rowIndex] || rowsHoverState && column.id !== tableConfiguration.defaultActionColumnId) || !defaultAction\"\n [ngClass]=\"{ 'truncate-text': tableConfiguration.truncateTexts }\"\n [showWhenTruncated]=\"true\"\n [title]=\"column.value\">\n <ng-container *ngIf=\"!!column.param && (!!column.value || column.value === 0)\">{{column.value}}</ng-container>\n <ng-container *ngIf=\"!!column.param && !column.value && column.value !== 0\">{{'-'}}</ng-container>\n </span>\n <a\n class=\"npa-table__cell-value npa-link npa-tooltip npa-tooltip--small npa-tooltip--light\"\n *ngIf=\"rowsHoverState[rowIndex] && column.id === tableConfiguration.defaultActionColumnId && defaultAction\"\n [ngClass]=\"{ 'truncate-text': tableConfiguration.truncateTexts }\"\n [title]=\"tableConfiguration.truncateTexts ? column.value : defaultAction.label\"\n [showWhenTruncated]=\"true\"\n (click)=\"defaultAction.callback(getRowValue(row, rowIndex))\">\n <ng-container *ngIf=\"!!column.param && (!!column.value || column.value === 0)\">{{column.value}}</ng-container>\n <ng-container *ngIf=\"!!column.param && !column.value && column.value !== 0\">{{'-'}}</ng-container>\n </a>\n </ng-container>\n <ng-container *ngIf=\"column.type === 'date'\">\n <span\n class=\"npa-table__cell-value npa-tooltip npa-tooltip--small npa-tooltip--light\"\n *ngIf=\"(!rowsHoverState[rowIndex] || rowsHoverState && column.id !== tableConfiguration.defaultActionColumnId) || !defaultAction\"\n [ngClass]=\"{ 'truncate-text': tableConfiguration.truncateTexts }\"\n [showWhenTruncated]=\"true\"\n [title]=\"column.value | date:(column.typeConfig?.dateMask || 'MM/dd/yyyy')\">\n {{column.value ? (column.value | date:(column.typeConfig?.dateMask || 'MM/dd/yyyy')) : '-'}}\n </span>\n <a\n class=\"npa-table__cell-value npa-link npa-tooltip npa-tooltip--small npa-tooltip--light\"\n *ngIf=\"rowsHoverState[rowIndex] && column.id === tableConfiguration.defaultActionColumnId && defaultAction\"\n [ngClass]=\"{ 'truncate-text': tableConfiguration.truncateTexts }\"\n [title]=\"tableConfiguration.truncateTexts ? (column.value | date:'MM/dd/yyyy') : defaultAction.label\"\n [showWhenTruncated]=\"true\"\n (click)=\"defaultAction.callback(getRowValue(row, rowIndex))\">\n {{column.value ? (column.value | date:'MM/dd/yyyy') : '-'}}\n </a>\n </ng-container>\n <ng-container *ngIf=\"column.type === 'checkbox'\">\n <input\n class=\"npa-selection--vertical npa-selection--no-label\"\n type=\"checkbox\"\n [id]=\"column.id + '-' + rowIndex\"\n [name]=\"column.id + '-' + rowIndex\"\n [ngModel]=\"column.value || checkboxColumnsModel[column.id]?.checkAll\"\n (ngModelChange)=\"updateCheckboxColumn(column, row, rowIndex, $event)\">\n <label [for]=\"column.id + '-' + rowIndex\">{{column.typeConfig?.label}}</label>\n </ng-container>\n <ng-container *ngIf=\"column.type === 'radio'\">\n <input\n type=\"radio\"\n class=\"npa-selection--no-label\"\n [attr.id]=\"column.id + '-' + rowIndex\"\n [name]=\"column.id\"\n [value]=\"column.rowId\"\n [ngModel]=\"column.value\"\n (ngModelChange)=\"updateRadioColumn(column.id, column.rowId)\">\n <label [attr.for]=\"column.id + '-' + rowIndex\">{{column.typeConfig?.label}}</label>\n </ng-container>\n <ng-container *ngIf=\"column.type === 'icon'\">\n <span\n class=\"npa-table__cell-value npa-tooltip npa-tooltip--small npa-tooltip--light\"\n *ngIf=\"!column.onlyIcon && ((!rowsHoverState[rowIndex] || rowsHoverState && column.id !== tableConfiguration.defaultActionColumnId) || !defaultAction)\"\n [ngClass]=\"{ 'truncate-text': tableConfiguration.truncateTexts }\"\n [showWhenTruncated]=\"true\"\n [title]=\"column.value\">\n <i *ngIf=\"column.icon\" [ngClass]=\"column.icon\"></i>\n <ng-container *ngIf=\"column.param && column.value\">{{column.value}}</ng-container>\n <ng-container *ngIf=\"column.param && !column.value\">{{'-'}}</ng-container>\n </span>\n <a\n class=\"npa-table__cell-value npa-link npa-tooltip npa-tooltip--small npa-tooltip--light\"\n *ngIf=\"rowsHoverState[rowIndex] && column.id === tableConfiguration.defaultActionColumnId && defaultAction\"\n [ngClass]=\"{ 'truncate-text': tableConfiguration.truncateTexts }\"\n [title]=\"tableConfiguration.truncateTexts ? column.value : defaultAction.label\"\n [showWhenTruncated]=\"true\"\n (click)=\"defaultAction.callback(getRowValue(row, rowIndex))\">\n <i *ngIf=\"column.icon\" [ngClass]=\"column.icon\"></i>\n <ng-container *ngIf=\"column.param && column.value\">{{column.value}}</ng-container>\n <ng-container *ngIf=\"column.param && !column.value\">{{'-'}}</ng-container>\n </a>\n </ng-container>\n <ng-container *ngIf=\"column.type === 'badge'\">\n <div class=\"npa-badge npa-badge--alone npa-badge--x-small\" [ngClass]=\"'npa-badge--' + column.badgeType\">\n <div class=\"npa-badge__box\"></div>\n </div>\n <span\n class=\"npa-table__cell-value npa-tooltip npa-tooltip--small npa-tooltip--light npa-color--critical\"\n [ngClass]=\"{ 'truncate-text': tableConfiguration.truncateTexts }\"\n [showWhenTruncated]=\"true\"\n [title]=\"column.value\">\n <ng-container *ngIf=\"column.param && column.value\">{{column.value}}</ng-container>\n <ng-container *ngIf=\"column.param && !column.value\">{{'-'}}</ng-container>\n </span>\n </ng-container>\n <ng-container *ngIf=\"column.type === 'link'\">\n <a\n class=\"npa-table__cell-value npa-link\"\n *ngIf=\"!!column.value\"\n [ngClass]=\"{ 'truncate-text': tableConfiguration.truncateTexts }\"\n (click)=\"linkAction(column, row, rowIndex)\">\n {{column.typeConfig?.label ? column.typeConfig.label : column.value}}\n </a>\n <span\n class=\"npa-table__cell-value npa-tooltip npa-tooltip--small npa-tooltip--light npa-color--critical\"\n *ngIf=\"!column.value\"\n [ngClass]=\"{ 'truncate-text': tableConfiguration.truncateTexts }\"\n [showWhenTruncated]=\"true\"\n [title]=\"column.value\">-</span>\n </ng-container>\n <ng-container *ngIf=\"column.type === 'select'\">\n <label class=\"npa-label\" [for]=\"column.id + '-' + rowIndex\"></label>\n <npa-select\n [id]=\"column.id + '-' + rowIndex\"\n [config]=\"column.selectConfig\"\n [options]=\"column.typeConfig.options\"\n [ngModel]=\"column.value\"\n (ngModelChange)=\"updateColumnValue(column, row, rowIndex, $event)\">\n </npa-select>\n </ng-container>\n </div>\n <div\n class=\"npa-table__cell\" [class.hide]=\"tableActionsConfiguration.hideColumn\">\n <npa-table-actions\n #tableActions\n *ngIf=\"tableActionsConfiguration?.actions\"\n [class.hide]=\"tableActionsConfiguration.showOnHover && !rowsHoverState[rowIndex]\"\n [hotRender]=\"true\"\n [manualHideDropdown]=\"manualActionsHide$\"\n [isHoveringRow]=\"rowsHoverState[rowIndex]\"\n [tableRow]=\"row\"\n [rowData]=\"getRowValue(row, rowIndex)\"\n [group]=\"(groupActions$ | async)\"\n [actions]=\"tableActionsConfiguration.actions\"\n [setDropdownParentTo]=\"{ type: 'id', name: 'npa-table-' + internalId }\"\n [dropdownConfig]=\"tableActionsConfiguration.dropdownConfig\"\n [actionsType]=\"tableActionsConfiguration.actionsType\"\n [defaultActionId]=\"tableActionsConfiguration.defaultActionId\"\n (defaultAction)=\"defaultAction = $event\"\n (selectedOption)=\"$event.callback(getRowValue(row, rowIndex))\">\n </npa-table-actions>\n </div>\n </div>\n <div class=\"npa-table__row--spinner\" *ngIf=\"showLoadOnScrollSpinner\">\n <npa-spinner class=\"npa-spinner--20\"></npa-spinner>\n </div>\n </cdk-virtual-scroll-viewport>\n\n <div\n class=\"npa-table__body--overlay\"\n *ngIf=\"!((rows$ | async)?.length) && !showSpinner && (showInternalSpinner$ | async) === false\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{--npa-table-default-height:fit-content;--npa-table-default-column-gap:24px;--npa-table-default-column-padding:0 12px;--npa-table-header-default-height:40px;--npa-table-header-default-border-width:0 0 1px 0;--npa-table-header-default-border-style:solid;--npa-table-header-default-border-color:gray;--npa-table-header-cell-default-align:center;--npa-table-header-cell-default-justify:normal;--npa-table-header-cell-default-icon-size:12px;--npa-table-header-cell-default-icon-spacing:8px;--npa-table-header-cell-default-text-transform:uppercase;--npa-table-header-cell-default-color:gray;--npa-table-header-cell-default-icon-color:gray;--npa-table-body-default-height:calc(100% - var(--npa-table-header-default-height) - 1px);--npa-table-body-spinner-top-spacing:40px;--npa-table-row-default-height:40px;--npa-table-row-default-background-color:#fff;--npa-table-row-default-border-width:0 0 1px 0;--npa-table-row-default-border-style:solid;--npa-table-row-default-border-color:#d3d3d3;--npa-table-row-default-hover-background-color:#add8e6;--npa-table-row-default-hover-border-width:0 0 1px 0;--npa-table-row-default-hover-border-style:solid;--npa-table-row-default-hover-border-color:#d3d3d3;--npa-table-row-default-spinner-container-height:40px;--npa-table-row-default-spinner-padding:12px;--npa-table-row-cell-default-align:center;--npa-table-row-cell-default-justify:normal;--npa-table-row-cell-default-icon-spacing:8px;--npa-table-row-cell-default-color:#000}:host .npa-table{height:var(--npa-table-default-height);overflow-x:auto}:host .npa-table .npa-table__header{display:grid;grid-column-gap:var(--npa-table-default-column-gap);padding:var(--npa-table-default-column-padding);border:var(--npa-table-header-default-border-style) var(--npa-table-header-default-border-color);border-width:var(--npa-table-header-default-border-width);box-sizing:border-box}:host .npa-table .npa-table__header .npa-table__header-cell{display:flex;align-items:var(--npa-table-header-cell-default-align);justify-content:var(--npa-table-header-cell-default-justify);flex-wrap:nowrap;height:var(--npa-table-header-default-height);min-width:0;padding-right:calc(var(--npa-table-header-cell-default-icon-size) + var(--npa-table-header-cell-default-icon-spacing))}:host .npa-table .npa-table__header .npa-table__header-cell.npa-table__header-cell--checkbox INPUT[type=checkbox]:not(.npa-switch)+LABEL{margin-right:0}:host .npa-table .npa-table__header .npa-table__header-cell.sort I,:host .npa-table .npa-table__header .npa-table__header-cell.sort SPAN{cursor:pointer}:host .npa-table .npa-table__header .npa-table__header-cell.sort I{margin-left:var(--npa-table-header-cell-default-icon-spacing);font-size:var(--npa-table-header-cell-default-icon-size);line-height:1;color:var(--npa-table-header-cell-default-icon-color)}:host .npa-table .npa-table__header .npa-table__header-cell SPAN{white-space:nowrap;text-overflow:ellipsis;text-transform:var(--npa-table-header-cell-default-text-transform);color:var(--npa-table-header-cell-default-color);overflow:hidden}:host .npa-table .npa-table__body--overlay .npa-table__spinner-container{padding-top:var(--npa-table-body-spinner-top-spacing)}:host .npa-table .npa-table__body{height:var(--npa-table-body-default-height)}:host .npa-table .npa-table__body.hide{display:none}:host .npa-table .npa-table__body .npa-table__viewport{width:100%;height:100%;overflow:unset;overflow-y:overlay}:host .npa-table .npa-table__body .npa-table__viewport.hide{display:none}:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row{display:grid;grid-column-gap:var(--npa-table-default-column-gap);padding:var(--npa-table-default-column-padding);background-color:var(--npa-table-row-default-background-color);border:var(--npa-table-row-default-border-style) var(--npa-table-row-default-border-color);border-width:var(--npa-table-row-default-border-width)}:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row.hover:hover{background-color:var(--npa-table-row-default-hover-background-color);border:var(--npa-table-row-default-hover-border-style) var(--npa-table-row-default-hover-border-color);border-width:var(--npa-table-row-default-hover-border-width)}:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row .npa-table__cell{display:flex;align-items:var(--npa-table-row-cell-default-align);justify-content:var(--npa-table-row-cell-default-justify);flex-wrap:nowrap;min-height:var(--npa-table-row-default-height)}:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row .npa-table__cell.hide{display:none}:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row .npa-table__cell .npa-table__cell-value{white-space:nowrap}:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row .npa-table__cell .npa-table__cell-value:not(.npa-link):not(.npa-icon){color:var(--npa-table-row-cell-default-color)}:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row .npa-table__cell .npa-table__cell-value.truncate-text{text-overflow:ellipsis;overflow:hidden}:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row .npa-table__cell DIV.npa-badge,:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row .npa-table__cell I.npa-icon{margin-right:var(--npa-table-row-cell-default-icon-spacing)}:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row .npa-table__cell npa-select{--npa-component-width:100%}:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row .npa-table__cell npa-table-actions.hide{display:none}:host .npa-table .npa-table__body .npa-table__viewport .npa-table__row--spinner{height:var(--npa-table-row-default-spinner-container-height);padding:var(--npa-table-row-default-spinner-padding);box-sizing:border-box}"] },] } ]; TableComponent.ctorParameters = () => [ { type: EventsService }, { type: ToolService }, { type: TableService }, { type: Renderer2 } ]; TableComponent.propDecorators = { _table: [{ type: ViewChild, args: ['table',] }], _tableBody: [{ type: ViewChild, args: ['tableBody',] }], _tableRow: [{ type: ViewChild, args: ['tableRow',] }], _tableHeader: [{ type: ViewChild, args: ['tableHeader',] }], _viewPort: [{ type: ViewChild, args: [CdkVirtualScrollViewport,] }], tableActions: [{ type: ViewChildren, args: ['tableActions',] }], selects: [{ type: ViewChildren, args: [SelectComponent,] }], id: [{ type: Input }], config: [{ type: Input }], data: [{ type: Input }], showSpinner: [{ type: Input }], showLoadOnScrollSpinner: [{ type: Input }], hotRender: [{ type: Input }], sort: [{ type: Input }], internalUpdate: [{ type: Output }], sortChange: [{ type: Output }], scrolledToBottom: [{ type: Output }], onResize: [{ type: HostListener, args: ['window:resize',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFibGUvc3JjL2xpYi90YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNVLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFDbEUsTUFBTSxFQUFhLFNBQVMsRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFDbkcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQWtDLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVuRyxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQWE1RixNQUFNLE9BQU8sY0FBYztJQXNEekIsWUFDUyxFQUFpQixFQUNqQixLQUFrQixFQUNsQixZQUEwQixFQUN6QixTQUFvQjtRQUhyQixPQUFFLEdBQUYsRUFBRSxDQUFlO1FBQ2pCLFVBQUssR0FBTCxLQUFLLENBQWE7UUFDbEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDekIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQWpDcEIsbUJBQWMsR0FBd0MsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFDaEcsZUFBVSxHQUErQixJQUFJLFlBQVksRUFBZ0IsQ0FBQztRQUMxRSxxQkFBZ0IsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVuRSxlQUFVLEdBQVcsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBR2hELFVBQUssR0FBMkMsSUFBSSxlQUFlLENBQXdCLEVBQUUsQ0FBQyxDQUFDO1FBRy9GLHlCQUFvQixHQUE2QyxFQUFFLENBQUM7UUFFcEUsbUJBQWMsR0FBYyxFQUFFLENBQUM7UUFFL0Isa0JBQWEsR0FBNkIsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDOUUseUJBQW9CLEdBQTZCLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3JGLHVCQUFrQixHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3hELFVBQUssR0FBa0MsSUFBSSxlQUFlLENBQWUsSUFBSSxDQUFDLENBQUM7UUFFOUUsc0JBQWlCLEdBQVEsRUFBRSxDQUFDO1FBSTVCLHlCQUFvQixHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBWWhFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBOUNELElBQ0ksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLElBQWtEOztRQUN6RCxNQUFBLElBQUksQ0FBQyxpQkFBaUIsMENBQUUsV0FBVyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUEyQjhCLFFBQVE7UUFDckMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBV08sY0FBYzs7UUFDcEIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQWEsQ0FBQyxDQUFDO2FBQzNDO2lCQUFNLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQzlCO2lCQUFNLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3hDO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMscUZBQXFGLENBQUMsQ0FBQzthQUN4RztZQUNELE1BQUEsSUFBSSxDQUFDLHNCQUFzQiwwQ0FBRSxXQUFXLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBVyxFQUFFLEVBQUU7O2dCQUNsSCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFBLElBQUksQ0FBQyxrQkFBa0IsMENBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM3RSxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNiLFNBQVMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFDcEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLEdBQUcsQ0FBQyxDQUFDLElBQTJCLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVcsRUFBRSxhQUFvRDtRQUNwRixPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQzNDLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQXNDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFTyxjQUFjLENBQUMsT0FBWSxFQUFFLFlBQWlEO1FBQ3BGLE1BQU0sTUFBTSxxQkFBMkIsWUFBWSxDQUFFLENBQUM7UUFDdEQsSUFBSSxTQUFTLG1CQUF3QixRQUFRLEVBQUUsSUFBSSxJQUFLLFlBQVksQ0FBRSxDQUFDO1FBRXZFLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRTtZQUNuQixLQUFLLFVBQVU7Z0JBQ2IsU0FBUyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3pELE1BQU07WUFDUixLQUFLLE9BQU87Z0JBQ1YsU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0MsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxTQUFTLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDdkQsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDckQsTUFBTTtZQUNSLEtBQUssT0FBTztnQkFDVixTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDdEQsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDckQsTUFBTTtZQUNSO2dCQUNFLElBQUksT0FBTyxJQUFJLFlBQVksRUFBRTtvQkFDM0IsU0FBUyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsNEJBQTRCLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDekY7U0FDSjtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxZQUFpRCxFQUFFLE9BQVk7UUFDNUYsTUFBTSxNQUFNLEdBQVUsV0FBVyxDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEgsTUFBTSxlQUFlLHFCQUEyQixZQUFZLENBQUUsQ0FBQztRQUMvRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1RCxNQUFNLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RixlQUFlLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEYsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVPLG1CQUFtQixDQUFDLFlBQWlEO1FBQzNFLE1BQU0sWUFBWSxxQkFBMkIsWUFBWSxDQUFFLENBQUM7UUFDNUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUQsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEYsWUFBWSxDQUFDLEtBQUssR0FBRyxpQkFBaUIsYUFBakIsaUJBQWlCLGNBQWpCLGlCQUFpQixHQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTdDLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxZQUFpRCxFQUFFLE9BQVk7UUFDMUYsTUFBTSxNQUFNLEdBQVUsV0FBVyxDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEgsTUFBTSxrQkFBa0IsR0FBWSxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUM5RCxNQUFNLGFBQWEscUJBQTJCLFlBQVksQ0FBRSxDQUFDO1FBQzdELE1BQU0sV0FBVyxHQUEwQixhQUFhLENBQUMsVUFBbUMsQ0FBQztRQUM3RixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1RCxNQUFNLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUV4RixhQUFhLENBQUMsWUFBWSxpQ0FDeEIsdUJBQXVCLEVBQUUscUJBQXFCLElBQzNDLFdBQVcsQ0FBQyxZQUFZLEtBQzNCLElBQUksRUFBRSxPQUFPLEVBQ2IsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUMxRSxDQUFDO1FBRUYsSUFBSSxrQkFBa0IsRUFBRTtZQUN0QixJQUFJLGNBQWMsSUFBSSxXQUFXLEVBQUU7Z0JBQ2pDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQzthQUNoRDtZQUNELElBQUksWUFBWSxJQUFJLFdBQVcsRUFBRTtnQkFDL0IsYUFBYSxDQUFDLFlBQVksbUNBQ3JCLGFBQWEsQ0FBQyxZQUFZLEtBQzdCLFFBQVEsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUNoQyx5QkFBeUIsRUFBRSxVQUFVLEdBQ3RDLENBQUM7Z0JBQ0YsYUFBYSxDQUFDLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUMxRTtpQkFBTTtnQkFDTCxhQUFhLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQzFFO1lBQ0QsSUFBSSxhQUFhLElBQUksV0FBVyxFQUFFO2dCQUNoQyxhQUFhLENBQUMsWUFBWSxtQ0FDckIsYUFBYSxDQUFDLFlBQVksS0FDN0IsV0FBVyxFQUFFLFdBQVcsQ0FBQyxXQUFXLEdBQ3JDLENBQUM7YUFDSDtZQUNELElBQUksYUFBYSxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksdUJBQXVCLElBQUksV0FBVyxFQUFFO2dCQUNqRixhQUFhLENBQUMsWUFBWSxtQ0FDckIsYUFBYSxDQUFDLFlBQVksS0FDN0Isa0JBQWtCLEVBQUUsV0FBVyxDQUFDLHFCQUFxQixHQUN0RCxDQUFDO2FBQ0g7U0FDRjtRQUVELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxPQUFZLEVBQUUsWUFBaUQ7UUFDeEYsTUFBTSxrQkFBa0IsR0FBWSxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUM5RCxNQUFNLGFBQWEscUJBQTJCLFlBQVksQ0FBRSxDQUFDO1FBQzdELE1BQU0sV0FBVyxHQUEyQixhQUFhLENBQUMsVUFBb0MsQ0FBQztRQUUvRixJQUFJLGtCQUFrQixFQUFFO1lBQ3RCLElBQUksTUFBTSxJQUFJLFdBQVcsRUFBRTtnQkFDekIsYUFBYSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQzthQUMzRDtZQUVELElBQUksVUFBVSxJQUFJLFdBQVcsRUFBRTtnQkFDN0IsYUFBYSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO2FBQy9DO1lBRUQsSUFBSSxPQUFPLElBQUksWUFBWSxFQUFFO2dCQUMzQixhQUFhLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzdGO1NBQ0Y7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRU8sbUJBQW1CLENBQUMsT0FBWSxFQUFFLFlBQWlEO1FBQ3pGLE1BQU0sa0JBQWtCLEdBQVksQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFDOUQsTUFBTSxZQUFZLHFCQUEyQixZQUFZLENBQUUsQ0FBQztRQUM1RCxNQUFNLFdBQVcsR0FBNEIsWUFBWSxDQUFDLFVBQXFDLENBQUM7UUFFaEcsSUFBSSxrQkFBa0IsRUFBRTtZQUN0QixJQUFJLE1BQU0sSUFBSSxXQUFXLEVBQUU7Z0JBQ3pCLFlBQVksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDcEU7WUFFRCxJQUFJLE9BQU8sSUFBSSxZQUFZLEVBQUU7Z0JBQzNCLFlBQVksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUY7U0FDRjtRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxPQUFZLEVBQUUsWUFBaUQ7UUFDeEYsTUFBTSxrQkFBa0IsR0FBWSxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUM5RCxNQUFNLFdBQVcscUJBQTJCLFlBQVksQ0FBRSxDQUFDO1FBRTNELElBQUksa0JBQWtCLEVBQUU7WUFDdEIsSUFBSSxPQUFPLElBQUksWUFBWSxFQUFFO2dCQUMzQixXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDckc7U0FDRjtRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxhQUFhLENBQUMsR0FBUSxFQUFFLE1BQTJDO1FBQ3pFLE1BQU0sV