UNPKG

ontimize-web-ngx

Version:
790 lines 130 kB
import { DataSource } from '@angular/cdk/collections'; import { EventEmitter, NgZone } from '@angular/core'; import { asyncScheduler, BehaviorSubject, EMPTY, merge, Observable, of, Subject, Subscription } from 'rxjs'; import { distinctUntilChanged, filter, map, observeOn, switchMap } from 'rxjs/operators'; import { ColumnValueFilterOperator } from '../../../types/table/o-column-value-filter.type'; import { Codes } from '../../../util/codes'; import { Util } from '../../../util/util'; import { OTableGroupedRow } from './row/o-table-row-group.class'; export class OnRangeChangeVirtualScroll { constructor(data) { this.range = data; } } export class DefaultOTableDataSource extends DataSource { get data() { return this.dataTotalsChange.value ?? []; } get quickFilter() { return this._quickFilterChange.value || ''; } set quickFilter(filter) { this._quickFilterChange.next(filter); } constructor(table) { super(); this.table = table; this.dataTotalsChange = new BehaviorSubject(null); this._virtualPageChange = new BehaviorSubject(new OnRangeChangeVirtualScroll({ start: 0, end: 0 })); this._quickFilterChange = new BehaviorSubject(''); this._columnValueFilterChange = new BehaviorSubject(null); this.groupByColumnChange = new Subject(); this.filteredData = []; this.aggregateData = {}; this.onRenderedDataChange = new EventEmitter(); this._renderedData = null; this.resultsLength = 0; this.columnValueFilters = []; this.groupedRowState = []; this.activeAggregates = {}; this.groupedRowsSubscription = new Subscription(); this.levelsExpansionState = {}; this.ngZone = table.injector.get(NgZone); this._database = table.daoTable; if (this._database) { this.resultsLength = this._database.data.length; } if (table.paginator) { this._paginator = table.matpaginator; } if (this.table.virtualScrollViewport) { this.table.virtualScrollViewport.renderedRangeStream .pipe(distinctUntilChanged()) .subscribe((value) => { this._virtualPageChange.next(new OnRangeChangeVirtualScroll(value)); }); } this._tableOptions = table.oTableOptions; this._sort = table.sort; } sortFunction(a, b) { return this._sort.sortFunction(a, b); } get renderedData() { return this._renderedData; } set renderedData(arg) { this._renderedData = arg; this.onRenderedDataChange.emit(); } initializeRenderedData() { this._renderedData ?? (this._renderedData = []); } connect() { const tag = (type, obs) => obs.pipe(map(value => ({ type, value }))); const displayDataChanges = []; displayDataChanges.push(tag('DATACHANGE', this._database.dataChange)); if (!this.table.pageable) { if (this._sort) { displayDataChanges.push(tag('SORTCHANGE', this._sort.oSortChange)); } if (this._tableOptions.filter) { displayDataChanges.push(tag('QUICKFILTERCHANGE', this._quickFilterChange)); } if (this._paginator) { displayDataChanges.push(tag('PAGINATOR', this._paginator.page)); } } displayDataChanges.push(tag('FILTERBYCOLUMN', this._columnValueFilterChange).pipe(filter(event => { if (event.value === null) { return false; } return true; }))); if (this.table.groupable) { displayDataChanges.push(tag('GROUP_BY', this.groupByColumnChange)); } const mainDataStream = merge(...displayDataChanges).pipe(observeOn(asyncScheduler), switchMap((event) => { let data = Object.assign([], this._database.data); if (!Array.isArray(data) || this.renderedData === null) { this.renderedData = []; return of(null); } return this.processDataOutsideAngular(data); })); const virtualScrollStream = this.table.virtualScrollViewport ? this._virtualPageChange.pipe(filter(() => { return this.renderedData !== null && this.renderedData !== undefined && Array.isArray(this.renderedData) && this.renderedData.length > 0; }), switchMap((x) => { return of(this.getVirtualScrollData(this.renderedData, x)); })) : EMPTY; return merge(mainDataStream, virtualScrollStream); } processDataOutsideAngular(data) { return new Observable(observer => { this.ngZone.runOutsideAngular(() => { setTimeout(() => { data = this.executeDataProcessing(data, observer); }, 0); }); }); } updateTableState(renderedData, resultsLength, aggregateData = {}) { this.renderedData = renderedData; this.resultsLength = resultsLength; this.aggregateData = aggregateData; } executeDataProcessing(data, observer) { try { if (this.existsAnyCalculatedColumn()) { data = this.getColumnCalculatedData(data); } if (!this.table.pageable) { data = this.getColumnValueFilterData(data); data = this.getQuickFilterData(data); data = this.getSortedData(data); } this.filteredData = Object.assign([], data); let resultsLength; if (this.table.pageable) { const totalRecordsNumber = this.table.getTotalRecordsNumber(); resultsLength = totalRecordsNumber ?? data.length; } else { resultsLength = data.length; data = this.getPaginationData(data); } if (this.table.groupable && !Util.isArrayEmpty(this.table.groupedColumnsArray) && data.length > 0) { data = this.getGroupedData(data); } const renderedData = data; if (this.table.virtualScrollViewport && !this._paginator) { if (this.table.scrollStrategy.getSavedScrollPosition() === 0) { data = this.getVirtualScrollData(data, new OnRangeChangeVirtualScroll({ start: 0, end: Codes.LIMIT_SCROLLVIRTUAL })); } } const aggregateData = this.getAggregatesData(renderedData); this.ngZone.run(() => { this.updateTableState(renderedData, resultsLength, aggregateData); this.table.loadingService.setLoading(false); this.table.cd.markForCheck(); observer.next(data); observer.complete(); }); } catch (error) { console.error('❌ Error while processing data:', error); this.ngZone.run(() => { this.table.loadingService.setLoading(false); this.table.cd.markForCheck(); observer.error(error); }); } return data; } getGroupedData(data) { data = this.getSubGroupsOfGroupedRow(data); data = this.filterCollapsedRowGroup(data); return data; } getSubGroupsOfGroupedRow(data) { return data = this.getSublevel(data, 0); } getAggregatesData(data) { const obj = {}; if (this._tableOptions === undefined) { return obj; } this._tableOptions.columns.forEach((column) => { if (column.aggregate && column.visible) { const valueOrPromise = this.calculateAggregate(data, column.attr, column.aggregate.operator); if (valueOrPromise instanceof Promise) { valueOrPromise .then(resolvedValue => { obj[column.attr] = resolvedValue; }) .catch(err => console.error(`o-table-column-aggregate: Async aggregate error in column "${column.attr}" using aggregate function "${column.aggregate.operator}":`, err)); } else { obj[column.attr] = valueOrPromise; } } }); return obj; } getColumnCalculatedData(data) { const self = this; const calculatedCols = this._tableOptions.columns.filter((oCol) => oCol.visible && oCol.calculate !== undefined); return data.map((row) => { calculatedCols.forEach((oColumn) => { let value; if (typeof oColumn.calculate === 'string') { value = self.transformFormula(oColumn.calculate, row); } else if (typeof oColumn.calculate === 'function') { value = oColumn.calculate(row); } row[oColumn.attr] = isNaN(value) ? 0 : value; }); return row; }); } transformFormula(formulaArg, row) { let formula = formulaArg; const columnsAttr = this._tableOptions.columns.map((oCol) => oCol.attr); columnsAttr.forEach((column) => { formula = formula.replace(column, row[column]); }); let resultFormula = ''; try { resultFormula = (new Function('return ' + formula))(); } catch (e) { console.error('Operation defined in the calculated column is incorrect '); } return resultFormula; } getQuickFilterData(data) { if (Util.isDefined(this.quickFilter) && this.quickFilter.length > 0) { const filterData = !this._tableOptions.filterCaseSensitive ? this.quickFilter.toLowerCase() : this.quickFilter; return data.filter((item) => { const passCustomFilter = this.fulfillsCustomFilterFunctions(filterData, item); const passSearchString = this.fulfillsQuickfilter(filterData, item); return passCustomFilter || passSearchString; }); } else { return data; } } getPaginationData(data) { if (!this._paginator || isNaN(this._paginator.pageSize)) { return data; } let startIndex = isNaN(this._paginator.pageSize) ? 0 : this._paginator.pageIndex * this._paginator.pageSize; if (data.length > 0 && data.length < startIndex) { startIndex = 0; this._paginator.pageIndex = 0; } return data.splice(startIndex, this._paginator.pageSize); } getVirtualScrollData(data, x) { return data.slice(x.range.start, x.range.end); } disconnect() { this.dataTotalsChange.complete(); this._quickFilterChange.complete(); this._columnValueFilterChange.complete(); this.groupByColumnChange.complete(); this._virtualPageChange.complete(); } fulfillsCustomFilterFunctions(filter, item) { const customFilterCols = this.table.oTableOptions.columns.filter(oCol => oCol.useCustomFilterFunction()); return customFilterCols.some(oCol => oCol.renderer.filterFunction(item[oCol.attr], item, filter)); } fulfillsQuickfilter(filter, item) { const columns = this._tableOptions.columns.filter((oCol) => oCol.useQuickfilterFunction()); let searchStr = columns.map((oCol) => oCol.getFilterValue(item[oCol.attr], item).join(' ')).join(' '); if (!this._tableOptions.filterCaseSensitive) { searchStr = searchStr.toLowerCase(); } return searchStr.indexOf(filter) !== -1; } getSortedData(data) { if (!this._sort) return data; const rendererData = this.getDataToSort(data); const sortedData = this._sort.getSortedData(rendererData); const tableKeys = this.table.getKeys(); const originalDataSorted = []; sortedData.forEach(sortedElement => { const keysValuesInSortData = tableKeys.map(element => sortedElement[element]); let i = 0; let found = false; while (i < data.length && !found) { const keysValuesInData = tableKeys.map(element => data[i][element]); if (Util.isArrayEqual(keysValuesInSortData, keysValuesInData)) { originalDataSorted.push(data[i]); found = true; } i++; } }); return originalDataSorted; } getTableData() { return this._database.data; } getCurrentData() { return this.getData(); } getCurrentAllData() { return this.getAllData(false, false); } getCurrentRendererData() { return this.getRenderedData(this.renderedData); } getAllRendererData() { return this.getAllData(true, true); } get sqlTypes() { return this._database.sqlTypes; } getData() { return this.renderedData; } getRenderedData(data) { const visibleColumns = this._tableOptions.columns.filter(oCol => oCol.visible); return data.map((row) => { const obj = {}; visibleColumns.forEach((oCol) => { const useRenderer = oCol.renderer && oCol.renderer.getCellData; obj[oCol.attr] = useRenderer ? oCol.renderer.getCellData(row[oCol.attr], row) : row[oCol.attr]; }); return obj; }); } getDataToSort(data) { if (!this._sort) return data; const sortColumns = this._tableOptions.columns.filter(oCol => oCol.visible && this._sort.activeArray.map(x => x.id).indexOf(oCol.attr) > -1); const existColumnToTrasformToSort = sortColumns.filter((oCol) => (oCol.type === 'translate' || oCol.type === 'service')).length > 0; if (!existColumnToTrasformToSort) { return data; } this.table.getKeys().forEach(key => { sortColumns.push(this.table.getOColumn(key)); }); return data.map((row) => { const obj = {}; sortColumns.forEach((oCol) => { const useRenderer = oCol.renderer && (oCol.type === 'translate' || oCol.type === 'service') && oCol.renderer.getCellData; obj[oCol.attr] = useRenderer ? oCol.renderer.getCellData(row[oCol.attr], row) : row[oCol.attr]; }); return obj; }); } getAllData(usingRendererers, onlyVisibleColumns) { let tableColumns = this._tableOptions.columns; if (onlyVisibleColumns) { tableColumns = this._tableOptions.columns.filter(oCol => oCol.visible); } return this.filteredData.map((row) => { const obj = {}; tableColumns.forEach((oCol) => { const useRenderer = usingRendererers && oCol.renderer && oCol.renderer.getCellData; obj[oCol.attr] = useRenderer ? oCol.renderer.getCellData(row[oCol.attr], row) : row[oCol.attr]; }); return obj; }); } getRenderersData(data, tableColumns) { return data.map((row) => { const obj = Object.assign({}, row); tableColumns.forEach((oCol) => { obj[oCol.attr] = oCol.renderer.getCellData(row[oCol.attr], row); }); return obj; }); } getColumnData(ocolumn) { return this.renderedData.map((row) => { const obj = {}; if (ocolumn) { obj[ocolumn] = row[ocolumn]; } return obj; }); } initializeColumnsFilters(filters) { this.columnValueFilters = []; filters.forEach(filter => { this.columnValueFilters.push(filter); }); if (!this.table.pageable && this.columnValueFilters.length > 0) { this._columnValueFilterChange.next(this.columnValueFilters); } } isColumnValueFilterActive() { return this.columnValueFilters.length !== 0; } getColumnValueFilters() { return this.columnValueFilters; } getColumnValueFilterByAttr(attr) { return this.columnValueFilters.find(item => item.attr === attr); } clearColumnFilters(trigger = true, columnsAttr) { if (Util.isDefined(columnsAttr)) { this.columnValueFilters = this.columnValueFilters.filter(x => !columnsAttr.includes(x.attr)); } else { this.columnValueFilters = []; } if (trigger) { this._columnValueFilterChange.next(this.columnValueFilters); } } clearColumnFilter(attr, trigger = true) { this.columnValueFilters = this.columnValueFilters.filter(x => x.attr !== attr); if (trigger) { this._columnValueFilterChange.next(this.columnValueFilters); } } addColumnFilter(filter) { const existingFilterIndex = this.columnValueFilters.findIndex(item => item.attr === filter.attr); if (existingFilterIndex > -1) { this.columnValueFilters.splice(existingFilterIndex, 1, filter); } else { let validFilter = Util.isDefined(filter.values); if (validFilter) { switch (filter.operator) { case ColumnValueFilterOperator.IN: validFilter = filter.values.length > 0; break; case ColumnValueFilterOperator.BETWEEN: validFilter = filter.values.length === 2; break; case ColumnValueFilterOperator.EQUAL: case ColumnValueFilterOperator.LESS_EQUAL: case ColumnValueFilterOperator.MORE_EQUAL: validFilter = true; break; default: validFilter = false; } if (validFilter) { this.columnValueFilters.push(filter); } } } if (!this.table.pageable) { this._columnValueFilterChange.next(this.columnValueFilters); } } getColumnValueFilterData(data) { this.columnValueFilters.forEach(filter => { const filterColumn = this.table.oTableOptions.columns.find(col => col.attr === filter.attr); if (filterColumn) { switch (filter.operator) { case ColumnValueFilterOperator.IN: const filterValues = (filter.values || []).reduce((previous, current) => previous.concat(filterColumn.getFilterValue(current).map(f => Util.normalizeString(f))), []); data = data.filter((item) => { if (filterColumn.renderer && filterColumn.renderer.filterFunction) { return filterColumn.renderer.filterFunction(item[filter.attr], item); } else { const colValues = filterColumn.getFilterValue(item[filter.attr], item).map(f => Util.normalizeString(f)); return filterValues.some(value => colValues.indexOf(value) !== -1); } }); break; case ColumnValueFilterOperator.EQUAL: const normalizedValue = Util.normalizeString(filter.values); data = data.filter(item => { const colValues = filterColumn.getFilterValue(item[filter.attr], item).map(f => Util.normalizeString(f)); let regExp; if (normalizedValue.includes('*')) { regExp = new RegExp('^' + normalizedValue.split('*').join('.*') + '$'); } return colValues.some(colValue => regExp ? regExp.test(colValue) : colValue.toString().includes(normalizedValue)); }); break; case ColumnValueFilterOperator.BETWEEN: data = data.filter(item => item[filter.attr] >= filter.values[0] && item[filter.attr] <= filter.values[1]); break; case ColumnValueFilterOperator.MORE_EQUAL: data = data.filter(item => item[filter.attr] >= filter.values); break; case ColumnValueFilterOperator.LESS_EQUAL: data = data.filter(item => item[filter.attr] <= filter.values); break; } } }); return data; } getAggregateData(column) { const obj = {}; let totalValue = ''; if (typeof this._tableOptions === 'undefined') { return new Array(obj); } totalValue = this.aggregateData[column.attr]; return totalValue; } calculateAggregate(data, columnAttr, operator) { let resultAggregate; if (typeof operator === 'string') { switch (operator.toLowerCase()) { case 'count': resultAggregate = this.count(columnAttr, data); break; case 'min': resultAggregate = this.min(columnAttr, data); break; case 'max': resultAggregate = this.max(columnAttr, data); break; case 'avg': resultAggregate = this.avg(columnAttr, data); break; default: resultAggregate = this.sum(columnAttr, data); break; } } else { const columnData = this.getColumnData(columnAttr); if (typeof operator === 'function') { resultAggregate = operator(columnData, columnAttr, this.table); } } return resultAggregate; } sum(column, data) { let value = 0; if (data) { if (data[0] instanceof OTableGroupedRow) { this.getDataFromFirstLevelTableGroupRow(data).forEach(x => { value = x.getColumnAggregateData(column).reduce((acumulator, currentValue) => { return acumulator + (isNaN(currentValue[column]) ? 0 : currentValue[column]); }, value); }); } else { value = data.reduce((acumulator, currentValue) => { return acumulator + (isNaN(currentValue[column]) ? 0 : currentValue[column]); }, value); } } return +(value).toFixed(2); } count(column, data) { let value = 0; if (data) { if (data[0] instanceof OTableGroupedRow) { this.getDataFromFirstLevelTableGroupRow(data).forEach(x => { value = x.getColumnAggregateData(column).reduce((acumulator) => { return acumulator + 1; }, value); }); } else { value = data.reduce((acumulator) => { return acumulator + 1; }, 0); } } return value; } avg(column, data) { const totalSum = this.sum(column, data); const totalCount = this.count(column, data); return +((totalSum === 0 || totalCount === 0) ? 0 : (totalSum / totalCount)).toFixed(2); } min(column, data) { let tempMin = []; if (data[0] instanceof OTableGroupedRow) { tempMin = this.getDataFromFirstLevelTableGroupRow(data).map(x => { return Math.min(...x.getColumnAggregateData(column).map(x => x[column])); }); } else { tempMin = data.map(x => x[column]); } return tempMin.length > 0 ? Math.min(...tempMin) : 0; } max(column, data) { let tempMax = []; if (data[0] instanceof OTableGroupedRow) { tempMax = this.getDataFromFirstLevelTableGroupRow(data).map(x => { return Math.max(...x.getColumnAggregateData(column).map(x => x[column])); }); } else { tempMax = data.map(x => x[column]); } return tempMax.length > 0 ? Math.max(...tempMax) : 0; } isFirstLevelTableGroupRow(tableRowGroupData) { return tableRowGroupData instanceof OTableGroupedRow && tableRowGroupData.level === 1; } getDataFromFirstLevelTableGroupRow(data) { return data.filter(x => this.isFirstLevelTableGroupRow(x)); } existsAnyCalculatedColumn() { return this._tableOptions.columns.find((oCol) => oCol.calculate !== undefined) !== undefined; } updateRenderedRowData(rowData) { const tableKeys = this.table.getKeys(); const record = this.renderedData.find((data) => { let found = true; for (let i = 0, len = tableKeys.length; i < len; i++) { const key = tableKeys[i]; if (data[key] !== rowData[key]) { found = false; break; } } return found; }); if (Util.isDefined(record)) { Object.assign(record, rowData); } } getDataInformationByGroup(data, level) { const recordHash = {}; data.forEach((row, i) => { const keys = {}; for (let i = 0; i <= level; i++) { keys[this.table.groupedColumnsArray[i]] = this.table.getColumnDataByAttr(this.table.groupedColumnsArray[i], row); } const recordKey = JSON.stringify(keys); if (recordHash.hasOwnProperty(recordKey)) { recordHash[recordKey].push(i); } else { recordHash[recordKey] = [i]; } }); return recordHash; } recalculateColumnAggregate(columnAttr, row) { const aggregateConf = row.getActiveColumnAggregateConfiguration(columnAttr); const data = row.getColumnAggregateData(columnAttr); const valueOrPromise = this.calculateAggregate(data, aggregateConf.attr, aggregateConf.aggregateFunction || aggregateConf.aggregate); if (valueOrPromise instanceof Promise) { valueOrPromise .then(value => { row.setColumnAggregateValue(columnAttr, value); }) .catch(err => console.error(`o-table-column-aggregate: Async aggregate error in column "${columnAttr}" using aggregate function "${aggregateConf.aggregateFunction}":`, err)); } else { row.setColumnAggregateValue(columnAttr, valueOrPromise); } } getSublevel(data, level, parent) { if (level >= this.table.groupedColumnsArray.length) { return data; } const recordHash = this.getDataInformationByGroup(data, level); let result = []; Object.keys(recordHash).forEach(recordKey => { const row = new OTableGroupedRow({ column: this.table.groupedColumnsArray[level], keysAsString: recordKey, level: level + 1, parent: parent }); this.groupedRowsSubscription.add(row.aggregateFunctionChange.subscribe(arg => { if (arg.changeAllGroupedRows) { this.activeAggregates[arg.columnAttr] = arg.activeAggregate; this.renderedData.filter(row => row instanceof OTableGroupedRow).forEach(row => { row.setColumnActiveAggregateFunction(arg.columnAttr, arg.activeAggregate, false); this.recalculateColumnAggregate(arg.columnAttr, row); }); } else { this.recalculateColumnAggregate(arg.columnAttr, arg.row); } })); const affectedIndexes = recordHash[row.keysAsString]; const groupData = data.filter((row, index) => affectedIndexes.includes(index)); this.table.visibleColArray.forEach((columnAttr, i) => { if (i === 0) { row.title = this.getTextGroupRow(row, affectedIndexes.length); } const useColumnAggregate = this.table.useColumnGroupingAggregate(columnAttr); if (useColumnAggregate) { row.initializeColumnAggregate(columnAttr, this.table.getColumnGroupingComponent(columnAttr)); if (Util.isDefined(this.activeAggregates[columnAttr])) { row.setColumnActiveAggregateFunction(columnAttr, this.activeAggregates[columnAttr], false); } if (row.hasActiveAggregate(columnAttr)) { const aggregateData = groupData.map(x => { const obj = {}; obj[columnAttr] = x[columnAttr]; return obj; }); row.setColumnAggregateData(columnAttr, aggregateData); const aggregateConf = row.getActiveColumnAggregateConfiguration(columnAttr); const valueOrPromise = this.calculateAggregate(aggregateData, aggregateConf.attr, aggregateConf.aggregateFunction || aggregateConf.aggregate); if (valueOrPromise instanceof Promise) { valueOrPromise .then(value => { row.setColumnAggregateValue(columnAttr, value); }) .catch(err => console.error(`o-table-columns-grouping-column: Async aggregate error in column "${columnAttr}" using aggregate function "${aggregateConf.aggregateFunction}":`, err)); } else { row.setColumnAggregateValue(columnAttr, valueOrPromise); } } } }); row.expanded = this.getExpansionState(row); const subGroup = this.getSublevel(groupData, level + 1, row); subGroup.unshift(row); result = result.concat(subGroup); }); return result; } filterCollapsedRowGroup(data) { return data.filter((row) => (row instanceof OTableGroupedRow) ? row.visible : this.belongsToExpandedGroupedRow(data, row)); } belongsToExpandedGroupedRow(data, row) { let parent; let match = false; for (let index = 0; index < data.length && !match; index++) { if (data[index] instanceof OTableGroupedRow) { parent = data[index]; } else if (Util.isEquivalent(data[index], row)) { match = true; } } return Util.isDefined(parent) ? (parent.visible && parent.expanded) : true; } updateGroupedColumns(reason = 'column-update') { this.table.loadingService.setLoading(true); this.groupByColumnChange.next(reason); } toggleGroupByColumn(rowGroup) { if (rowGroup.expandSameLevel(this.table.expandGroupsSameLevel)) { this.levelsExpansionState[rowGroup.level] = !rowGroup.expanded; } else { this.updateStateRowGrouped(rowGroup); } this.groupByColumnChange.next('toggle'); } setRowGroupLevelExpansion(rowGroup, value) { this.levelsExpansionState[rowGroup.level] = value; this.groupByColumnChange.next('level-expansion'); } updateStateRowGrouped(rowGroup) { const stateRowGrouped = this.groupedRowState.find(row => rowGroup.keysAsString === row.keysAsString && JSON.stringify(rowGroup.parent) === JSON.stringify(row.parent)); if (Util.isDefined(stateRowGrouped)) { stateRowGrouped.expanded = !stateRowGrouped.expanded; } else { rowGroup.expanded = !rowGroup.expanded; this.groupedRowState.push(rowGroup); } } getTextGroupRow(group, totalCounts) { const field = this.table.groupedColumnsArray[group.level - 1]; let value = JSON.parse(group.keysAsString)[this.table.groupedColumnsArray[group.level - 1]]; const oCol = this.table.getOColumn(field); if (!value && Util.isDefined(oCol.renderer) && this.table.isInstanceOfOTableCellRendererServiceComponent(oCol.renderer)) { value = ' - '; if (!this.table.onDataLoadedCellRendererSubscription) { this.table.onDataLoadedCellRendererSubscription = oCol.renderer.onDataLoaded.subscribe(x => { this.updateGroupedColumns(); }); } } return this.table.translateService.get(oCol.title) + ': ' + value + ' (' + totalCounts + ')'; } getExpansionState(row) { let expansionState = !parent || !this.table.collapseGroupedColumns; if (row.expandSameLevel(this.table.expandGroupsSameLevel)) { expansionState = this.levelsExpansionState.hasOwnProperty(row.level) ? this.levelsExpansionState[row.level] : expansionState; } else { const rowGroup = this.groupedRowState.find(x => x.keysAsString === row.keysAsString && JSON.stringify(x.parent) === JSON.stringify(row.parent)); expansionState = rowGroup ? rowGroup.expanded : expansionState; } return expansionState; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1vLXRhYmxlLmRhdGFzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9leHRlbnNpb25zL2RlZmF1bHQtby10YWJsZS5kYXRhc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSwwQkFBMEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJekYsT0FBTyxFQUFFLHlCQUF5QixFQUFzQixNQUFNLGlEQUFpRCxDQUFDO0FBQ2hILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJakUsTUFBTSxPQUFPLDBCQUEwQjtJQUdyQyxZQUFZLElBQWU7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBUUQsTUFBTSxPQUFPLHVCQUF3QixTQUFRLFVBQWU7SUFHMUQsSUFBSSxJQUFJLEtBQVksT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFvQi9ELElBQUksV0FBVyxL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