@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
103 lines • 16.8 kB
JavaScript
import { Injectable } from '@angular/core';
import { QueriesUtil } from '@c8y/client';
import { assign, forEach, get, identity, transform } from 'lodash-es';
import { from, isObservable, of } from 'rxjs';
import { map, share, take, withLatestFrom } from 'rxjs/operators';
import { UserPreferencesService } from '../common/user-preferences/user-preferences.service';
import { CustomColumn } from './column/custom.column';
import * as i0 from "@angular/core";
import * as i1 from "../common/user-preferences/user-preferences.service";
export class DataGridService {
constructor(userPreferencesService) {
this.userPreferencesService = userPreferencesService;
this.DEFAULT_PAGE_SIZE = 20;
this.queriesUtil = new QueriesUtil();
}
clearConfig(key) {
localStorage.removeItem(key);
}
getConfig$(key) {
return this.userPreferencesService.get(key).pipe(map(config => config || {
columns: [],
pagination: { pageSize: this.DEFAULT_PAGE_SIZE, currentPage: 1 }
}));
}
saveConfig$(config, key) {
return from(this.userPreferencesService.set(key, config));
}
getUserConfiguredColumns$(columns, storageKey) {
return this.getConfig$(storageKey).pipe(withLatestFrom(isObservable(columns) ? columns : of(columns)), map(([config, cols]) => this.applyConfigToColumns(config, cols, storageKey)), take(1), share());
}
getQueryObj(columns, defaultFilter = {}) {
return transform(columns, (query, column) => this.extendQueryByColumn(query, column), {
__filter: {},
__orderby: [],
...defaultFilter
});
}
applyConfigToColumns(config, columns, storageKey) {
if (config?.columns?.length > 0) {
const reOrderedColumns = [];
let noConfigColumns = [];
try {
const customColumns = config.columns
.filter(col => col.custom)
.map((col) => new CustomColumn(col));
// Avoid config properties to be applied to the original column object by creating shallow copy of columns
const allColumns = [...columns.map(col => ({ ...col })), ...customColumns];
noConfigColumns = allColumns.filter(col => !config.columns.some(configCol => col.name === configCol.name));
config.columns.forEach(({ visible, name, sortOrder, filter }) => {
const columnToReorder = allColumns.find(col => col.name === name);
if (columnToReorder) {
columnToReorder.visible = visible;
columnToReorder.sortOrder = sortOrder;
columnToReorder.externalFilterQuery =
columnToReorder.externalFilterQuery ?? filter?.externalFilterQuery;
columnToReorder.filterPredicate =
columnToReorder.filterPredicate ?? filter?.filterPredicate;
reOrderedColumns.push(columnToReorder);
}
});
}
catch (ex) {
this.clearConfig(storageKey);
}
return [...reOrderedColumns, ...noConfigColumns];
}
return columns;
}
extendQueryByColumn(query, column) {
if (column.filterable && column.externalFilterQuery) {
const getFilter = column.filteringConfig.getFilter || identity;
const queryObj = getFilter(column.externalFilterQuery);
if (queryObj.__or) {
query.__filter.__and = query.__filter.__and || [];
query.__filter.__and.push(queryObj);
}
else if (queryObj.__and && get(query, '__filter.__and')) {
queryObj.__and.map(obj => query.__filter.__and.push(obj));
}
else {
assign(query.__filter, queryObj);
}
}
if (column.sortable && column.sortOrder) {
const cs = {};
forEach(column.sortingConfig.pathSortingConfigs, pathSortingConfig => {
cs[pathSortingConfig.path] =
(column.sortOrder === 'asc' ? 1 : -1) * (pathSortingConfig.sortOrderModifier || 1);
});
query.__orderby.push(cs);
}
return query;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridService, deps: [{ token: i1.UserPreferencesService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.UserPreferencesService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2RhdGEtZ3JpZC9kYXRhLWdyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEUsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUM3RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7OztBQU10RCxNQUFNLE9BQU8sZUFBZTtJQUsxQixZQUFzQixzQkFBOEM7UUFBOUMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUoxRCxzQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFLL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBVztRQUNyQixZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUM5QyxHQUFHLENBQ0QsTUFBTSxDQUFDLEVBQUUsQ0FDUCxNQUFNLElBQUk7WUFDUixPQUFPLEVB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RyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLEVBQUU7Z0JBQ25FLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7b0JBQ3hCLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLENBQUMsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzsrR0EzR1UsZUFBZTttSEFBZixlQUFlLGNBRmQsTUFBTTs7NEZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBRdWVyaWVzVXRpbCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IGFzc2lnbiwgZm9yRWFjaCwgZ2V0LCBpZGVudGl0eSwgdHJhbnNmb3JtIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IGZyb20sIGlzT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2hhcmUsIHRha2UsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVXNlclByZWZlcmVuY2VzU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi91c2VyLXByZWZlcmVuY2VzL3VzZXItcHJlZmVyZW5jZXMuc2VydmljZSc7XG5pbXBvcnQgeyBDdXN0b21Db2x1bW4gfSBmcm9tICcuL2NvbHVtbi9jdXN0b20uY29sdW1uJztcbmltcG9ydCB7IENvbHVtbiwgQ3VzdG9tQ29sdW1uQ29uZmlnLCBHcmlkQ29uZmlnIH0gZnJvbSAnLi9kYXRhLWdyaWQubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEYXRhR3JpZFNlcnZpY2Uge1xuICBwcm90ZWN0ZWQgREVGQVVMVF9QQUdFX1NJWkUgPSAyMDtcblxuICBwcm90ZWN0ZWQgcXVlcmllc1V0aWw6IFF1ZXJpZXNVdGlsO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB1c2VyUHJlZmVyZW5jZXNTZXJ2aWNlOiBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlKSB7XG4gICAgdGhpcy5xdWVyaWVzVXRpbCA9IG5ldyBRdWVyaWVzVXRpbCgpO1xuICB9XG5cbiAgY2xlYXJDb25maWcoa2V5OiBzdHJpbmcpIHtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICB9XG5cbiAgZ2V0Q29uZmlnJChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8R3JpZENvbmZpZz4ge1xuICAgIHJldHVybiB0aGlzLnVzZXJQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0KGtleSkucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgY29uZmlnID0+XG4gICAgICAgICAgY29uZmlnIHx8IHtcbiAgICAgICAgICAgIGNvbHVtbnM6IFtdLFxuICAgICAgICAgICAgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogdGhpcy5ERUZBVUxUX1BBR0VfU0laRSwgY3VycmVudFBhZ2U6IDEgfVxuICAgICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgc2F2ZUNvbmZpZyQoY29uZmlnOiBHcmlkQ29uZmlnLCBrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8R3JpZENvbmZpZz4ge1xuICAgIHJldHVybiBmcm9tKHRoaXMudXNlclByZWZlcmVuY2VzU2VydmljZS5zZXQoa2V5LCBjb25maWcpKTtcbiAgfVxuXG4gIGdldFVzZXJDb25maWd1cmVkQ29sdW1ucyQoY29sdW1uczogQ29sdW1uW10gfCBPYnNlcnZhYmxlPENvbHVtbltdPiwgc3RvcmFnZUtleT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmdldENvbmZpZyQoc3RvcmFnZUtleSkucGlwZShcbiAgICAgIHdpdGhMYXRlc3RGcm9tKFxuICAgICAgICBpc09ic2VydmFibGUoY29sdW1ucykgPyBjb2x1bW5zIDogKG9mKGNvbHVtbnMpIGFzIHVua25vd24gYXMgT2JzZXJ2YWJsZTxDb2x1bW5bXT4pXG4gICAgICApLFxuICAgICAgbWFwKChbY29uZmlnLCBjb2xzXSkgPT4gdGhpcy5hcHBseUNvbmZpZ1RvQ29sdW1ucyhjb25maWcsIGNvbHMsIHN0b3JhZ2VLZXkpKSxcbiAgICAgIHRha2UoMSksXG4gICAgICBzaGFyZSgpXG4gICAgKTtcbiAgfVxuXG4gIGdldFF1ZXJ5T2JqKGNvbHVtbnM6IENvbHVtbltdLCBkZWZhdWx0RmlsdGVyID0ge30pOiBhbnkge1xuICAgIHJldHVybiB0cmFuc2Zvcm0oY29sdW1ucywgKHF1ZXJ5LCBjb2x1bW4pID0+IHRoaXMuZXh0ZW5kUXVlcnlCeUNvbHVtbihxdWVyeSwgY29sdW1uKSwge1xuICAgICAgX19maWx0ZXI6IHt9LFxuICAgICAgX19vcmRlcmJ5OiBbXSxcbiAgICAgIC4uLmRlZmF1bHRGaWx0ZXJcbiAgICB9KTtcbiAgfVxuXG4gIGFwcGx5Q29uZmlnVG9Db2x1bW5zKGNvbmZpZzogR3JpZENvbmZpZywgY29sdW1uczogQ29sdW1uW10sIHN0b3JhZ2VLZXk/OiBzdHJpbmcpOiBDb2x1bW5bXSB7XG4gICAgaWYgKGNvbmZpZz8uY29sdW1ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVPcmRlcmVkQ29sdW1ucyA9IFtdO1xuICAgICAgbGV0IG5vQ29uZmlnQ29sdW1ucyA9IFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3VzdG9tQ29sdW1ucyA9IGNvbmZpZy5jb2x1bW5zXG4gICAgICAgICAgLmZpbHRlcihjb2wgPT4gKGNvbCBhcyBDdXN0b21Db2x1bW5Db25maWcpLmN1c3RvbSlcbiAgICAgICAgICAubWFwKChjb2w6IEN1c3RvbUNvbHVtbkNvbmZpZykgPT4gbmV3IEN1c3RvbUNvbHVtbihjb2wpKTtcblxuICAgICAgICAvLyBBdm9pZCBjb25maWcgcHJvcGVydGllcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCBjb2x1bW4gb2JqZWN0IGJ5IGNyZWF0aW5nIHNoYWxsb3cgY29weSBvZiBjb2x1bW5zXG4gICAgICAgIGNvbnN0IGFsbENvbHVtbnMgPSBbLi4uY29sdW1ucy5tYXAoY29sID0+ICh7IC4uLmNvbCB9KSksIC4uLmN1c3RvbUNvbHVtbnNdO1xuXG4gICAgICAgIG5vQ29uZmlnQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKFxuICAgICAgICAgIGNvbCA9PiAhY29uZmlnLmNvbHVtbnMuc29tZShjb25maWdDb2wgPT4gY29sLm5hbWUgPT09IGNvbmZpZ0NvbC5uYW1lKVxuICAgICAgICApO1xuICAgICAgICBjb25maWcuY29sdW1ucy5mb3JFYWNoKCh7IHZpc2libGUsIG5hbWUsIHNvcnRPcmRlciwgZmlsdGVyIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5Ub1Jlb3JkZXIgPSBhbGxDb2x1bW5zLmZpbmQoY29sID0+IGNvbC5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoY29sdW1uVG9SZW9yZGVyKSB7XG4gICAgICAgICAgICBjb2x1bW5Ub1Jlb3JkZXIudmlzaWJsZSA9IHZpc2libGU7XG4gICAgICAgICAgICBjb2x1bW5Ub1Jlb3JkZXIuc29ydE9yZGVyID0gc29ydE9yZGVyO1xuICAgICAgICAgICAgY29sdW1uVG9SZW9yZGVyLmV4dGVybmFsRmlsdGVyUXVlcnkgPVxuICAgICAgICAgICAgICBjb2x1bW5Ub1Jlb3JkZXIuZXh0ZXJuYWxGaWx0ZXJRdWVyeSA/PyBmaWx0ZXI/LmV4dGVybmFsRmlsdGVyUXVlcnk7XG4gICAgICAgICAgICBjb2x1bW5Ub1Jlb3JkZXIuZmlsdGVyUHJlZGljYXRlID1cbiAgICAgICAgICAgICAgY29sdW1uVG9SZW9yZGVyLmZpbHRlclByZWRpY2F0ZSA/PyBmaWx0ZXI/LmZpbHRlclByZWRpY2F0ZTtcbiAgICAgICAgICAgIHJlT3JkZXJlZENvbHVtbnMucHVzaChjb2x1bW5Ub1Jlb3JkZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICB0aGlzLmNsZWFyQ29uZmlnKHN0b3JhZ2VLZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFsuLi5yZU9yZGVyZWRDb2x1bW5zLCAuLi5ub0NvbmZpZ0NvbHVtbnNdO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIHByaXZhdGUgZXh0ZW5kUXVlcnlCeUNvbHVtbihxdWVyeTogYW55LCBjb2x1bW46IENvbHVtbik6IHZvaWQge1xuICAgIGlmIChjb2x1bW4uZmlsdGVyYWJsZSAmJiBjb2x1bW4uZXh0ZXJuYWxGaWx0ZXJRdWVyeSkge1xuICAgICAgY29uc3QgZ2V0RmlsdGVyID0gY29sdW1uLmZpbHRlcmluZ0NvbmZpZy5nZXRGaWx0ZXIgfHwgaWRlbnRpdHk7XG4gICAgICBjb25zdCBxdWVyeU9iaiA9IGdldEZpbHRlcihjb2x1bW4uZXh0ZXJuYWxGaWx0ZXJRdWVyeSk7XG5cbiAgICAgIGlmIChxdWVyeU9iai5fX29yKSB7XG4gICAgICAgIHF1ZXJ5Ll9fZmlsdGVyLl9fYW5kID0gcXVlcnkuX19maWx0ZXIuX19hbmQgfHwgW107XG4gICAgICAgIHF1ZXJ5Ll9fZmlsdGVyLl9fYW5kLnB1c2gocXVlcnlPYmopO1xuICAgICAgfSBlbHNlIGlmIChxdWVyeU9iai5fX2FuZCAmJiBnZXQocXVlcnksICdfX2ZpbHRlci5fX2FuZCcpKSB7XG4gICAgICAgIHF1ZXJ5T2JqLl9fYW5kLm1hcChvYmogPT4gcXVlcnkuX19maWx0ZXIuX19hbmQucHVzaChvYmopKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2lnbihxdWVyeS5fX2ZpbHRlciwgcXVlcnlPYmopO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2x1bW4uc29ydGFibGUgJiYgY29sdW1uLnNvcnRPcmRlcikge1xuICAgICAgY29uc3QgY3MgPSB7fTtcbiAgICAgIGZvckVhY2goY29sdW1uLnNvcnRpbmdDb25maWcucGF0aFNvcnRpbmdDb25maWdzLCBwYXRoU29ydGluZ0NvbmZpZyA9PiB7XG4gICAgICAgIGNzW3BhdGhTb3J0aW5nQ29uZmlnLnBhdGhdID1cbiAgICAgICAgICAoY29sdW1uLnNvcnRPcmRlciA9PT0gJ2FzYycgPyAxIDogLTEpICogKHBhdGhTb3J0aW5nQ29uZmlnLnNvcnRPcmRlck1vZGlmaWVyIHx8IDEpO1xuICAgICAgfSk7XG4gICAgICBxdWVyeS5fX29yZGVyYnkucHVzaChjcyk7XG4gICAgfVxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxufVxuIl19