UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

103 lines 16.8 kB
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