@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
80 lines • 11.5 kB
JavaScript
import { Injectable } from '@angular/core';
import { InventoryService } from '@c8y/client';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { ValidationPattern } from '@c8y/ngx-components';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/client";
const defaultFilters = {
query: "(type eq 'c8y_JsonSchema') and (appliesTo.TENANTS eq true)",
pageSize: 1000,
withTotalPages: true
};
export class CustomPropertiesService {
constructor(inventoryService) {
this.inventoryService = inventoryService;
}
async getFormAndFieldList() {
const schema = await this.getCustomProperties();
const formGroup = this.buildFormGroup(schema);
const fields = this.buildFieldList(formGroup, schema);
return { form: formGroup, fields };
}
async getCustomProperties() {
let customFieldsSchema = {};
const customProperties = await this.inventoryService.list(defaultFilters);
customProperties.data.forEach(item => {
const fieldSchema = item['c8y_JsonSchema'].properties;
customFieldsSchema = { ...customFieldsSchema, ...fieldSchema };
});
return customFieldsSchema;
}
buildFormGroup(schema) {
const fg = new FormGroup({});
for (const [key, value] of Object.entries(schema)) {
const control = new FormControl(value.default, []);
this.applyValidators(control, value);
fg.addControl(key, control);
}
return fg;
}
applyValidators(control, props) {
const validatorsMap = {
required: Validators.required,
minimum: Validators.min(props.minimum),
maximum: Validators.max(props.maximum),
minLength: Validators.minLength(props.minLength),
maxLength: Validators.maxLength(props.maxLength),
pattern: Validators.pattern(props.pattern)
};
Object.entries(validatorsMap).forEach(([key, validator]) => {
if (props[key] !== undefined) {
control.addValidators(validator);
}
});
if (props.type === 'integer') {
control.addValidators(Validators.pattern(ValidationPattern.rules.integer.pattern));
}
}
buildFieldList(form, schema) {
const fieldList = [];
Object.entries(schema).forEach(([key, value]) => {
fieldList.push({
id: key,
label: value.title,
type: value.type,
format: value.format,
formControlReference: form.get(key)
});
});
return fieldList;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomPropertiesService, deps: [{ token: i1.InventoryService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomPropertiesService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomPropertiesService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.InventoryService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXByb3BlcnRpZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RlbmFudHMvY3VzdG9tLXByb3BlcnRpZXMvY3VzdG9tLXByb3BlcnRpZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvQyxPQUFPLEVBQW1CLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQWF4RCxNQUFNLGNBQWMsR0FBRztJQUNyQixLQUFLLEVBQUUsNERBQTREO0lBQ25FLFFBQVEsRUFBRSxJQUFJO0lBQ2QsY0FBYyxFQUFFLElBQUk7Q0FDckIsQ0FBQztBQUtGLE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsWUFBb0IsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7SUFBRyxDQUFDO0lBRTFELEtBQUssQ0FBQyxtQkFBbUI7UUFDdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CO1FBQy9CLElBQUksa0JBQWtCLEdBQW1CLEVBQUUsQ0FBQztRQUM1QyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLGdC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OytHQWxFVSx1QkFBdUI7bUhBQXZCLHVCQUF1QixjQUZ0QixNQUFNOzs0RkFFUCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW52ZW50b3J5U2VydmljZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEpTT05TY2hlbWE3LCBKU09OU2NoZW1hN1R5cGVOYW1lIH0gZnJvbSAnanNvbi1zY2hlbWEnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblBhdHRlcm4gfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcblxudHlwZSBQcm9wZXJ0aWVzVHlwZSA9IHsgW2tleTogc3RyaW5nXTogSlNPTlNjaGVtYTcgfTtcblxuLy8gTW9kZWwgZm9yIGluZGl2aWR1YWwgdGVuYW50IGN1c3RvbSBwcm9wZXJ0eSBmaWVsZFxuZXhwb3J0IGludGVyZmFjZSBUZW5hbnRDdXN0b21Qcm9wZXJ0eUZpZWxkIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdHlwZTogSlNPTlNjaGVtYTdUeXBlTmFtZSB8IEpTT05TY2hlbWE3VHlwZU5hbWVbXTtcbiAgZm9ybWF0PzogJ2RhdGV0aW1lJyB8IHN0cmluZztcbiAgZm9ybUNvbnRyb2xSZWZlcmVuY2U6IEFic3RyYWN0Q29udHJvbDtcbn1cblxuY29uc3QgZGVmYXVsdEZpbHRlcnMgPSB7XG4gIHF1ZXJ5OiBcIih0eXBlIGVxICdjOHlfSnNvblNjaGVtYScpIGFuZCAoYXBwbGllc1RvLlRFTkFOVFMgZXEgdHJ1ZSlcIixcbiAgcGFnZVNpemU6IDEwMDAsXG4gIHdpdGhUb3RhbFBhZ2VzOiB0cnVlXG59O1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21Qcm9wZXJ0aWVzU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSkge31cblxuICBhc3luYyBnZXRGb3JtQW5kRmllbGRMaXN0KCk6IFByb21pc2U8eyBmb3JtOiBGb3JtR3JvdXA7IGZpZWxkczogVGVuYW50Q3VzdG9tUHJvcGVydHlGaWVsZFtdIH0+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXMoKTtcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmJ1aWxkRm9ybUdyb3VwKHNjaGVtYSk7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5idWlsZEZpZWxkTGlzdChmb3JtR3JvdXAsIHNjaGVtYSk7XG4gICAgcmV0dXJuIHsgZm9ybTogZm9ybUdyb3VwLCBmaWVsZHMgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q3VzdG9tUHJvcGVydGllcygpOiBQcm9taXNlPFByb3BlcnRpZXNUeXBlPiB7XG4gICAgbGV0IGN1c3RvbUZpZWxkc1NjaGVtYTogUHJvcGVydGllc1R5cGUgPSB7fTtcbiAgICBjb25zdCBjdXN0b21Qcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmxpc3QoZGVmYXVsdEZpbHRlcnMpO1xuXG4gICAgY3VzdG9tUHJvcGVydGllcy5kYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBmaWVsZFNjaGVtYTogUHJvcGVydGllc1R5cGUgPSBpdGVtWydjOHlfSnNvblNjaGVtYSddLnByb3BlcnRpZXM7XG4gICAgICBjdXN0b21GaWVsZHNTY2hlbWEgPSB7IC4uLmN1c3RvbUZpZWxkc1NjaGVtYSwgLi4uKGZpZWxkU2NoZW1hIGFzIG9iamVjdCkgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tRmllbGRzU2NoZW1hO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvcm1Hcm91cChzY2hlbWE6IFByb3BlcnRpZXNUeXBlKTogRm9ybUdyb3VwIHtcbiAgICBjb25zdCBmZyA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgICAgY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCh2YWx1ZS5kZWZhdWx0LCBbXSk7XG4gICAgICB0aGlzLmFwcGx5VmFsaWRhdG9ycyhjb250cm9sLCB2YWx1ZSk7XG4gICAgICBmZy5hZGRDb250cm9sKGtleSwgY29udHJvbCk7XG4gICAgfVxuICAgIHJldHVybiBmZztcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlWYWxpZGF0b3JzKGNvbnRyb2w6IEZvcm1Db250cm9sLCBwcm9wczogSlNPTlNjaGVtYTcpOiB2b2lkIHtcbiAgICBjb25zdCB2YWxpZGF0b3JzTWFwID0ge1xuICAgICAgcmVxdWlyZWQ6IFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICBtaW5pbXVtOiBWYWxpZGF0b3JzLm1pbihwcm9wcy5taW5pbXVtKSxcbiAgICAgIG1heGltdW06IFZhbGlkYXRvcnMubWF4KHByb3BzLm1heGltdW0pLFxuICAgICAgbWluTGVuZ3RoOiBWYWxpZGF0b3JzLm1pbkxlbmd0aChwcm9wcy5taW5MZW5ndGgpLFxuICAgICAgbWF4TGVuZ3RoOiBWYWxpZGF0b3JzLm1heExlbmd0aChwcm9wcy5tYXhMZW5ndGgpLFxuICAgICAgcGF0dGVybjogVmFsaWRhdG9ycy5wYXR0ZXJuKHByb3BzLnBhdHRlcm4pXG4gICAgfTtcblxuICAgIE9iamVjdC5lbnRyaWVzKHZhbGlkYXRvcnNNYXApLmZvckVhY2goKFtrZXksIHZhbGlkYXRvcl0pID0+IHtcbiAgICAgIGlmIChwcm9wc1trZXkgYXMga2V5b2YgSlNPTlNjaGVtYTddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udHJvbC5hZGRWYWxpZGF0b3JzKHZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMudHlwZSA9PT0gJ2ludGVnZXInKSB7XG4gICAgICBjb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5wYXR0ZXJuKFZhbGlkYXRpb25QYXR0ZXJuLnJ1bGVzLmludGVnZXIucGF0dGVybikpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGaWVsZExpc3QoZm9ybTogRm9ybUdyb3VwLCBzY2hlbWE6IFByb3BlcnRpZXNUeXBlKTogVGVuYW50Q3VzdG9tUHJvcGVydHlGaWVsZFtdIHtcbiAgICBjb25zdCBmaWVsZExpc3Q6IFRlbmFudEN1c3RvbVByb3BlcnR5RmllbGRbXSA9IFtdO1xuICAgIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBmaWVsZExpc3QucHVzaCh7XG4gICAgICAgIGlkOiBrZXksXG4gICAgICAgIGxhYmVsOiB2YWx1ZS50aXRsZSxcbiAgICAgICAgdHlwZTogdmFsdWUudHlwZSxcbiAgICAgICAgZm9ybWF0OiB2YWx1ZS5mb3JtYXQsXG4gICAgICAgIGZvcm1Db250cm9sUmVmZXJlbmNlOiBmb3JtLmdldChrZXkpIGFzIEZvcm1Db250cm9sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWVsZExpc3Q7XG4gIH1cbn1cbiJdfQ==