@circe/table
Version:
Circe Components for Angular :: Table Component
439 lines • 93.7 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFibGUvc3JjL2xpYi90YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNVLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFDbEUsTUFBTSxFQUFhLFNBQVMsRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFDbkcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQWtDLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVuRyxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQWE1RixNQUFNLE9BQU8sY0FBYztJQXNEekIsWUFDUyxFQUFpQixFQUNqQixLQUFrQixFQUNsQixZQUEwQixFQUN6QixTQUFvQjtRQUhyQixPQUFFLEdBQUYsRUFBRSxDQUFlO1FBQ2pCLFVBQUssR0FBTCxLQUFLLENBQWE7UUFDbEIsaUJBQVksR0FBWixZQUFZ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