@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
149 lines • 17.8 kB
JavaScript
import { Injectable } from '@angular/core';
import { QueriesUtil } from '@c8y/client';
import { InventoryService } from '@c8y/client';
import { gettext } from '@c8y/ngx-components';
import { transform, has } from 'lodash-es';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/client";
export class FilesRepositoryService {
constructor(inventoryService) {
this.inventoryService = inventoryService;
this.baseQuery = { __has: 'c8y_IsBinary' };
this.queriesUtil = new QueriesUtil();
}
getPagination() {
return {
pageSize: 10,
currentPage: 1
};
}
hasApplicationStorageFragment(file) {
return has(file, 'c8y_applications_storage');
}
getColumns() {
return [
{
name: 'name',
header: gettext('Name'),
path: 'name',
filterable: true,
sortable: true,
sortOrder: 'asc'
},
{
name: 'type',
header: gettext('Type'),
path: 'type',
filterable: true,
sortable: true
},
{
name: 'length',
header: gettext('Size'),
path: 'length',
filterable: false,
sortable: true
},
{
name: 'owner',
header: gettext('Owner'),
path: 'owner',
filterable: true,
sortable: true
},
{
name: 'lastUpdated',
header: gettext('Last update'),
path: 'lastUpdated',
filterable: false,
sortable: true
}
];
}
/** Returns array with items id where item has not c8y_applications_storage fragment. */
getDeletableItemsIds(selectedItemsIds, dataFromDataGrid) {
const selectedItemsWithoutApplications = [];
dataFromDataGrid.forEach(item => {
selectedItemsIds.forEach(selectedItemId => {
if (selectedItemId === item.id && !this.hasApplicationStorageFragment(item)) {
selectedItemsWithoutApplications.push(selectedItemId);
}
});
});
return selectedItemsWithoutApplications;
}
/** Returns the total number of items (with no filters based on columns setup). */
async getTotal() {
const filters = {
query: this.queriesUtil.buildQuery(this.baseQuery),
withTotalElements: true
};
return (await this.inventoryService.list(filters)).paging.totalElements;
}
/** Returns data for current columns and pagination setup. */
async getData(columns, pagination, searchText = '') {
// build filters based on columns and pagination
const filters = {
text: searchText,
...this.getFilters(columns, pagination),
withTotalElements: true
};
// execute inventory query for the list of managed objects
return this.inventoryService.list(filters);
}
/** Returns filters for given columns and pagination setup. */
getFilters(columns, pagination) {
return {
query: this.getQueryString(columns),
pageSize: pagination.pageSize,
currentPage: pagination.currentPage,
withChildren: false,
withTotalPages: true
};
}
/** Returns a query string based on columns setup. */
getQueryString(columns) {
let fullQuery = this.getQueryObj(columns);
fullQuery = this.queriesUtil.addAndFilter(fullQuery, this.baseQuery);
return this.queriesUtil.buildQuery(fullQuery);
}
/** Returns a query object based on columns setup. */
getQueryObj(columns) {
return transform(columns, (query, column) => this.addColumnQuery(query, column), {
__filter: {},
__orderby: []
});
}
/** Extends given query with a part based on the setup of given column. */
addColumnQuery(query, column) {
// when a column is marked as filterable
if (column.filterable) {
// in the case of default filtering form, `filterPredicate` will contain the string entered by a user
if (column.filterPredicate) {
// so we use it as the expected value, * allow to search for it anywhere in the property
query.__filter[column.path] = `*${column.filterPredicate}*`;
}
// in the case of custom filtering form, we're storing the query in `externalFilterQuery.query`
if (column.externalFilterQuery) {
query = this.queriesUtil.addAndFilter(query, column.externalFilterQuery.query);
}
}
// when a column is sortable and has a specified sorting order
if (column.sortable && column.sortOrder) {
// add sorting condition for the configured column `path`
query.__orderby.push({
[column.path]: column.sortOrder === 'asc' ? 1 : -1
});
}
return query;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilesRepositoryService, deps: [{ token: i1.InventoryService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilesRepositoryService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilesRepositoryService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.InventoryService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtcmVwb3NpdG9yeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmlsZXMtcmVwb3NpdG9yeS9maWxlcy1yZXBvc2l0b3J5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvQyxPQUFPLEVBQUUsT0FBTyxFQUFzQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7QUFLM0MsTUFBTSxPQUFPLHNCQUFzQjtJQUdqQyxZQUFvQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUR0RCxjQUFTLEdBQUcsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFFcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTztZQUNMLFFBQVEsRUFBRSxFQUFFO1lBQ1osV0FBVyxFQUFFLENBQUM7U0FDZixDQUFDO0lBQ0osQ0FBQztJQUVELDZCQUE2QixDQUFDLElBQVM7UUFDckMsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLDBCQUEwQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPO1lBQ0w7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxNQUFNO2dCQUNaLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixRQUFRLEVBQUUsSUFBSTtnQkFDZCxTQUFTLEVBQUUsS0FBa0I7YUFDOUI7WUFDRDtnQkFD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QUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuRCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOytHQWxKVSxzQkFBc0I7bUhBQXRCLHNCQUFzQixjQUZyQixNQUFNOzs0RkFFUCxzQkFBc0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUXVlcmllc1V0aWwgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBJbnZlbnRvcnlTZXJ2aWNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgZ2V0dGV4dCwgUGFnaW5hdGlvbiwgU29ydE9yZGVyLCBDb2x1bW4sIFJvdyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgdHJhbnNmb3JtLCBoYXMgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBGaWxlc1JlcG9zaXRvcnlTZXJ2aWNlIHtcbiAgcXVlcmllc1V0aWw6IFF1ZXJpZXNVdGlsO1xuICBiYXNlUXVlcnkgPSB7IF9faGFzOiAnYzh5X0lzQmluYXJ5JyB9O1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UpIHtcbiAgICB0aGlzLnF1ZXJpZXNVdGlsID0gbmV3IFF1ZXJpZXNVdGlsKCk7XG4gIH1cblxuICBnZXRQYWdpbmF0aW9uKCk6IFBhZ2luYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlU2l6ZTogMTAsXG4gICAgICBjdXJyZW50UGFnZTogMVxuICAgIH07XG4gIH1cblxuICBoYXNBcHBsaWNhdGlvblN0b3JhZ2VGcmFnbWVudChmaWxlOiBSb3cpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGFzKGZpbGUsICdjOHlfYXBwbGljYXRpb25zX3N0b3JhZ2UnKTtcbiAgfVxuXG4gIGdldENvbHVtbnMoKTogQ29sdW1uW10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgICAgaGVhZGVyOiBnZXR0ZXh0KCdOYW1lJyksXG4gICAgICAgIHBhdGg6ICduYW1lJyxcbiAgICAgICAgZmlsdGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICAgIHNvcnRPcmRlcjogJ2FzYycgYXMgU29ydE9yZGVyXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndHlwZScsXG4gICAgICAgIGhlYWRlcjogZ2V0dGV4dCgnVHlwZScpLFxuICAgICAgICBwYXRoOiAndHlwZScsXG4gICAgICAgIGZpbHRlcmFibGU6IHRydWUsXG4gICAgICAgIHNvcnRhYmxlOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnbGVuZ3RoJyxcbiAgICAgICAgaGVhZGVyOiBnZXR0ZXh0KCdTaXplJyksXG4gICAgICAgIHBhdGg6ICdsZW5ndGgnLFxuICAgICAgICBmaWx0ZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgc29ydGFibGU6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdvd25lcicsXG4gICAgICAgIGhlYWRlcjogZ2V0dGV4dCgnT3duZXInKSxcbiAgICAgICAgcGF0aDogJ293bmVyJyxcbiAgICAgICAgZmlsdGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgc29ydGFibGU6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdsYXN0VXBkYXRlZCcsXG4gICAgICAgIGhlYWRlcjogZ2V0dGV4dCgnTGFzdCB1cGRhdGUnKSxcbiAgICAgICAgcGF0aDogJ2xhc3RVcGRhdGVkJyxcbiAgICAgICAgZmlsdGVyYWJsZTogZmFsc2UsXG4gICAgICAgIHNvcnRhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgXTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGFycmF5IHdpdGggaXRlbXMgaWQgd2hlcmUgaXRlbSBoYXMgbm90IGM4eV9hcHBsaWNhdGlvbnNfc3RvcmFnZSBmcmFnbWVudC4gKi9cbiAgZ2V0RGVsZXRhYmxlSXRlbXNJZHMoc2VsZWN0ZWRJdGVtc0lkczogc3RyaW5nW10sIGRhdGFGcm9tRGF0YUdyaWQ6IEFycmF5PGFueT4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtc1dpdGhvdXRBcHBsaWNhdGlvbnMgPSBbXTtcbiAgICBkYXRhRnJvbURhdGFHcmlkLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBzZWxlY3RlZEl0ZW1zSWRzLmZvckVhY2goc2VsZWN0ZWRJdGVtSWQgPT4ge1xuICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtSWQgPT09IGl0ZW0uaWQgJiYgIXRoaXMuaGFzQXBwbGljYXRpb25TdG9yYWdlRnJhZ21lbnQoaXRlbSkpIHtcbiAgICAgICAgICBzZWxlY3RlZEl0ZW1zV2l0aG91dEFwcGxpY2F0aW9ucy5wdXNoKHNlbGVjdGVkSXRlbUlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRJdGVtc1dpdGhvdXRBcHBsaWNhdGlvbnM7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zICh3aXRoIG5vIGZpbHRlcnMgYmFzZWQgb24gY29sdW1ucyBzZXR1cCkuICovXG4gIGFzeW5jIGdldFRvdGFsKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJpZXNVdGlsLmJ1aWxkUXVlcnkodGhpcy5iYXNlUXVlcnkpLFxuICAgICAgd2l0aFRvdGFsRWxlbWVudHM6IHRydWVcbiAgICB9O1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmxpc3QoZmlsdGVycykpLnBhZ2luZy50b3RhbEVsZW1lbnRzO1xuICB9XG5cbiAgLyoqIFJldHVybnMgZGF0YSBmb3IgY3VycmVudCBjb2x1bW5zIGFuZCBwYWdpbmF0aW9uIHNldHVwLiAqL1xuICBhc3luYyBnZXREYXRhKGNvbHVtbnM6IENvbHVtbltdLCBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uLCBzZWFyY2hUZXh0ID0gJycpIHtcbiAgICAvLyBidWlsZCBmaWx0ZXJzIGJhc2VkIG9uIGNvbHVtbnMgYW5kIHBhZ2luYXRpb25cbiAgICBjb25zdCBmaWx0ZXJzID0ge1xuICAgICAgdGV4dDogc2VhcmNoVGV4dCxcbiAgICAgIC4uLnRoaXMuZ2V0RmlsdGVycyhjb2x1bW5zLCBwYWdpbmF0aW9uKSxcbiAgICAgIHdpdGhUb3RhbEVsZW1lbnRzOiB0cnVlXG4gICAgfTtcbiAgICAvLyBleGVjdXRlIGludmVudG9yeSBxdWVyeSBmb3IgdGhlIGxpc3Qgb2YgbWFuYWdlZCBvYmplY3RzXG5cbiAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmxpc3QoZmlsdGVycyk7XG4gIH1cblxuICAvKiogUmV0dXJucyBmaWx0ZXJzIGZvciBnaXZlbiBjb2x1bW5zIGFuZCBwYWdpbmF0aW9uIHNldHVwLiAqL1xuICBwcml2YXRlIGdldEZpbHRlcnMoY29sdW1uczogQ29sdW1uW10sIHBhZ2luYXRpb246IFBhZ2luYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVlcnk6IHRoaXMuZ2V0UXVlcnlTdHJpbmcoY29sdW1ucyksXG4gICAgICBwYWdlU2l6ZTogcGFnaW5hdGlvbi5wYWdlU2l6ZSxcbiAgICAgIGN1cnJlbnRQYWdlOiBwYWdpbmF0aW9uLmN1cnJlbnRQYWdlLFxuICAgICAgd2l0aENoaWxkcmVuOiBmYWxzZSxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgcXVlcnkgc3RyaW5nIGJhc2VkIG9uIGNvbHVtbnMgc2V0dXAuICovXG4gIHByaXZhdGUgZ2V0UXVlcnlTdHJpbmcoY29sdW1uczogQ29sdW1uW10pOiBzdHJpbmcge1xuICAgIGxldCBmdWxsUXVlcnkgPSB0aGlzLmdldFF1ZXJ5T2JqKGNvbHVtbnMpO1xuICAgIGZ1bGxRdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKGZ1bGxRdWVyeSwgdGhpcy5iYXNlUXVlcnkpO1xuICAgIHJldHVybiB0aGlzLnF1ZXJpZXNVdGlsLmJ1aWxkUXVlcnkoZnVsbFF1ZXJ5KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgcXVlcnkgb2JqZWN0IGJhc2VkIG9uIGNvbHVtbnMgc2V0dXAuICovXG4gIHByaXZhdGUgZ2V0UXVlcnlPYmooY29sdW1uczogQ29sdW1uW10pIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtKGNvbHVtbnMsIChxdWVyeSwgY29sdW1uKSA9PiB0aGlzLmFkZENvbHVtblF1ZXJ5KHF1ZXJ5LCBjb2x1bW4pLCB7XG4gICAgICBfX2ZpbHRlcjoge30sXG4gICAgICBfX29yZGVyYnk6IFtdXG4gICAgfSk7XG4gIH1cblxuICAvKiogRXh0ZW5kcyBnaXZlbiBxdWVyeSB3aXRoIGEgcGFydCBiYXNlZCBvbiB0aGUgc2V0dXAgb2YgZ2l2ZW4gY29sdW1uLiAqL1xuICBwcml2YXRlIGFkZENvbHVtblF1ZXJ5KHF1ZXJ5LCBjb2x1bW46IENvbHVtbik6IHZvaWQge1xuICAgIC8vIHdoZW4gYSBjb2x1bW4gaXMgbWFya2VkIGFzIGZpbHRlcmFibGVcbiAgICBpZiAoY29sdW1uLmZpbHRlcmFibGUpIHtcbiAgICAgIC8vIGluIHRoZSBjYXNlIG9mIGRlZmF1bHQgZmlsdGVyaW5nIGZvcm0sIGBmaWx0ZXJQcmVkaWNhdGVgIHdpbGwgY29udGFpbiB0aGUgc3RyaW5nIGVudGVyZWQgYnkgYSB1c2VyXG4gICAgICBpZiAoY29sdW1uLmZpbHRlclByZWRpY2F0ZSkge1xuICAgICAgICAvLyBzbyB3ZSB1c2UgaXQgYXMgdGhlIGV4cGVjdGVkIHZhbHVlLCAqIGFsbG93IHRvIHNlYXJjaCBmb3IgaXQgYW55d2hlcmUgaW4gdGhlIHByb3BlcnR5XG4gICAgICAgIHF1ZXJ5Ll9fZmlsdGVyW2NvbHVtbi5wYXRoXSA9IGAqJHtjb2x1bW4uZmlsdGVyUHJlZGljYXRlfSpgO1xuICAgICAgfVxuXG4gICAgICAvLyBpbiB0aGUgY2FzZSBvZiBjdXN0b20gZmlsdGVyaW5nIGZvcm0sIHdlJ3JlIHN0b3JpbmcgdGhlIHF1ZXJ5IGluIGBleHRlcm5hbEZpbHRlclF1ZXJ5LnF1ZXJ5YFxuICAgICAgaWYgKGNvbHVtbi5leHRlcm5hbEZpbHRlclF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIocXVlcnksIGNvbHVtbi5leHRlcm5hbEZpbHRlclF1ZXJ5LnF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB3aGVuIGEgY29sdW1uIGlzIHNvcnRhYmxlIGFuZCBoYXMgYSBzcGVjaWZpZWQgc29ydGluZyBvcmRlclxuICAgIGlmIChjb2x1bW4uc29ydGFibGUgJiYgY29sdW1uLnNvcnRPcmRlcikge1xuICAgICAgLy8gYWRkIHNvcnRpbmcgY29uZGl0aW9uIGZvciB0aGUgY29uZmlndXJlZCBjb2x1bW4gYHBhdGhgXG4gICAgICBxdWVyeS5fX29yZGVyYnkucHVzaCh7XG4gICAgICAgIFtjb2x1bW4ucGF0aF06IGNvbHVtbi5zb3J0T3JkZXIgPT09ICdhc2MnID8gMSA6IC0xXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cbn1cbiJdfQ==