ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
790 lines • 130 kB
JavaScript
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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