@c8y/ngx-components 1024.18.1 → 1024.18.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/c8y-ngx-components-actility-device-registration.mjs +1 -1
- package/fesm2022/c8y-ngx-components-actility-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-properties.mjs +67 -20
- package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs +75 -13
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs +2 -4
- package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +6 -8
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +98 -19
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +4 -4
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +7 -7
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +5 -3
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +52 -7
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-file-preview.mjs +2 -2
- package/fesm2022/c8y-ngx-components-file-preview.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector.mjs +6 -6
- package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs +1 -1
- package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operation-picker.mjs +2 -2
- package/fesm2022/c8y-ngx-components-operation-picker.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-register-device.mjs +4 -4
- package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +2 -3
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +2 -2
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +2 -2
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +2 -4
- package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +2 -3
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs +1 -1
- package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +2 -2
- package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +3 -4
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-scada.mjs +10 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-scada.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +4 -4
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +18 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +59 -19
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +3 -2
- package/locales/es.po +3 -3
- package/locales/fr.po +3 -3
- package/locales/ja_JP.po +2 -2
- package/locales/ko.po +3 -3
- package/locales/locales.pot +1 -1
- package/locales/nl.po +3 -3
- package/locales/pl.po +2 -3
- package/locales/pt_BR.po +2 -3
- package/locales/zh_CN.po +2 -2
- package/locales/zh_TW.po +3 -3
- package/package.json +1 -1
- package/types/c8y-ngx-components-asset-properties.d.ts +9 -1
- package/types/c8y-ngx-components-asset-properties.d.ts.map +1 -1
- package/types/c8y-ngx-components-assets-navigator.d.ts +30 -3
- package/types/c8y-ngx-components-assets-navigator.d.ts.map +1 -1
- package/types/c8y-ngx-components-branding-shared-lazy-add-branding-modal.d.ts.map +1 -1
- package/types/c8y-ngx-components-context-dashboard.d.ts +44 -1
- package/types/c8y-ngx-components-context-dashboard.d.ts.map +1 -1
- package/types/c8y-ngx-components-echart-models.d.ts +9 -0
- package/types/c8y-ngx-components-echart-models.d.ts.map +1 -1
- package/types/c8y-ngx-components-echart.d.ts +32 -5
- package/types/c8y-ngx-components-echart.d.ts.map +1 -1
- package/types/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.d.ts.map +1 -1
- package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts +6 -0
- package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts.map +1 -1
- package/types/c8y-ngx-components.d.ts +50 -2
- package/types/c8y-ngx-components.d.ts.map +1 -1
|
@@ -462,7 +462,7 @@ class ActilityDeviceRegistrationComponent {
|
|
|
462
462
|
this.unsubscribe$.complete();
|
|
463
463
|
}
|
|
464
464
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: ActilityDeviceRegistrationComponent, deps: [{ token: i1$1.BsModalRef }, { token: ActilityDeviceRegistrationService }, { token: i3.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
465
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: ActilityDeviceRegistrationComponent, isStandalone: true, selector: "c8y-actility-registration", ngImport: i0, template: "<c8y-modal\n [title]=\"'Actility LoRa registration' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n\n <ng-container *ngIf=\"state === 'loadPending'; else registrationForm\">\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-container>\n\n <!--Formly schema is rendered-->\n <ng-template #registrationForm>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n c8y-modal-body\n linear\n *ngIf=\"(errorMessages$ | async).length === 0; else errorMessagesPresent\"\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"p-b-16\">\n <p class=\"modal-subtitle sticky-top\">\n {{ 'Register a single Actility device' | translate }}\n </p>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-r-24 p-t-16\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n ></formly-form>\n </div>\n\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [labels]=\"registrationStepLabels\"\n (onNext)=\"register($event)\"\n (onCancel)=\"bsModalRef.hide()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [pending]=\"state === 'registrationPending'\"\n [disabled]=\"!form?.valid\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <!--success scenario-->\n <div\n class=\"p-16 text-center\"\n *ngIf=\"state === 'registrationPending'\"\n >\n <c8y-loading></c8y-loading>\n </div>\n <div class=\"m-24\">\n <c8y-operation-result\n class=\"lead m-b-0\"\n type=\"success\"\n *ngIf=\"state === 'registrationSuccess'\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"bsModalRef.hide()\"\n [showButtons]=\"{ custom: true }\"\n [labels]=\"finalStepLabels\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n </ng-template>\n\n <!--Failure scenario-->\n <ng-template #errorMessagesPresent>\n <div class=\"m-24\">\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"state === 'registrationError'\"\n text=\"{{ 'Failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <div\n class=\"m-b-8\"\n *ngFor=\"let msg of errorMessages$ | async\"\n data-cy=\"actility-device-registration.component--registration-error\"\n [ngClass]=\"{\n 'text-center': state === 'registrationError',\n 'alert alert-danger': state === 'loadError'\n }\"\n >\n <span [innerHTML]=\"msg | translate\"></span>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n type=\"button\"\n (click)=\"bsModalRef.hide()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n </ng-template>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "progressLabel", "message"] }, { kind: "component", type: C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i4.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "component", type: C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
465
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: ActilityDeviceRegistrationComponent, isStandalone: true, selector: "c8y-actility-registration", ngImport: i0, template: "<c8y-modal\n [title]=\"'Actility LoRa registration' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n\n <ng-container *ngIf=\"state === 'loadPending'; else registrationForm\">\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-container>\n\n <!--Formly schema is rendered-->\n <ng-template #registrationForm>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n c8y-modal-body\n linear\n *ngIf=\"(errorMessages$ | async).length === 0; else errorMessagesPresent\"\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"p-b-16\">\n <p class=\"modal-subtitle sticky-top\">\n {{ 'Register a single Actility device' | translate }}\n </p>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-r-24 p-t-16\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n ></formly-form>\n </div>\n\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [labels]=\"registrationStepLabels\"\n (onNext)=\"register($event)\"\n (onCancel)=\"bsModalRef.hide()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [pending]=\"state === 'registrationPending'\"\n [disabled]=\"!form?.valid\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <!--success scenario-->\n <div\n class=\"p-16 text-center\"\n *ngIf=\"state === 'registrationPending'\"\n >\n <c8y-loading></c8y-loading>\n </div>\n <div class=\"m-24\">\n <c8y-operation-result\n class=\"lead m-b-0\"\n type=\"success\"\n *ngIf=\"state === 'registrationSuccess'\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"bsModalRef.hide()\"\n [showButtons]=\"{ custom: true }\"\n [labels]=\"finalStepLabels\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n </ng-template>\n\n <!--Failure scenario-->\n <ng-template #errorMessagesPresent>\n <div class=\"m-24\">\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"state === 'registrationError'\"\n text=\"{{ 'Failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <div\n class=\"m-b-8\"\n *ngFor=\"let msg of errorMessages$ | async\"\n data-cy=\"actility-device-registration.component--registration-error\"\n [ngClass]=\"{\n 'text-center': state === 'registrationError',\n 'alert alert-danger': state === 'loadError'\n }\"\n >\n <span [innerHTML]=\"msg | translate\"></span>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n type=\"button\"\n (click)=\"bsModalRef.hide()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n </ng-template>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "flushBody", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "progressLabel", "message"] }, { kind: "component", type: C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i4.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "component", type: C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
466
466
|
}
|
|
467
467
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: ActilityDeviceRegistrationComponent, decorators: [{
|
|
468
468
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-actility-device-registration.mjs","sources":["../../actility-device-registration/actility-device-registration.model.ts","../../actility-device-registration/actility-device-registration.service.ts","../../actility-device-registration/actility-device-registration.component.ts","../../actility-device-registration/actility-device-registration.component.html","../../actility-device-registration/actility-device-registration-button.component.ts","../../actility-device-registration/actility-device-registration-button.component.html","../../actility-device-registration/actility-device-registration.factory.ts","../../actility-device-registration/actility-device-registration.module.ts","../../actility-device-registration/c8y-ngx-components-actility-device-registration.ts"],"sourcesContent":["export interface ConnectivityPlan {\n grantedConnections: string;\n id: string;\n name: string;\n ref: string;\n usedConnections: string;\n message?: string;\n}\n\nexport interface DeviceType {\n name: string;\n id: string;\n}\n\nexport interface ActilityDeviceProfile {\n id: string;\n name: string;\n typeMAC: string;\n message?: string;\n}\n\nexport interface ActilityDeviceRegistration {\n applicationEUI: string;\n applicationKey: string;\n devEUI: string;\n deviceProfile: ActilityDeviceProfile;\n connectivityPlan: ConnectivityPlan;\n deviceType: DeviceType;\n lnsConnectionName: string;\n connection: {\n name: string;\n description: string;\n baseUrl: string;\n profileId: string;\n username: string;\n password: string;\n };\n}\n\nexport const PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION = {\n EVENT: 'deviceRegistration',\n COMPONENT: 'actility-registration',\n RESULT: { SUCCESS: 'registrationSuccess', FAILURE: 'registrationFailure' }\n} as const;\n","import { Injectable } from '@angular/core';\nimport {\n ApplicationService,\n FetchClient,\n IFetchOptions,\n IManagedObject,\n IResultList,\n InventoryService\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AppStateService, OptionsService } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { some } from 'lodash-es';\nimport {\n ActilityDeviceProfile,\n ActilityDeviceRegistration,\n ConnectivityPlan\n} from './actility-device-registration.model';\n\nexport enum ActilityErrorName {\n NoConnectivityPlansError = 'NoConnectivityPlansError',\n NoFreeSlotsInConnectivityPlansError = 'NoFreeSlotsInConnectivityPlansError',\n NoConnectivitySettingsError = 'NoConnectivitySettingsError',\n ConnectivitySettingsError = 'ConnectivitySettingsError',\n NoDeviceProfilesError = 'NoDeviceProfilesError',\n DeviceProfilesFetchError = 'DeviceProfilesFetchError',\n NoDeviceProtocolsError = 'NoDeviceProtocolsError',\n DeviceProtocolsFetchError = 'DeviceProtocolsFetchError',\n RegistrationError = 'RegistrationError'\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ActilityDeviceRegistrationService {\n private baseUrl = '/service/actility';\n private registrationUrl = `${this.baseUrl}/newDeviceRequest`;\n private connectivityPlansUrl = `${this.baseUrl}/connectivityPlans`;\n private deviceProfilesUrl = `${this.baseUrl}/deviceProfiles`;\n private headers: object = {\n 'Content-Type': 'application/json'\n };\n\n constructor(\n private inventoryService: InventoryService,\n private client: FetchClient,\n private translateService: TranslateService,\n private applicationService: ApplicationService,\n private optionsService: OptionsService,\n private appState: AppStateService\n ) {}\n\n async getConnections() {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers\n };\n const res = await this.client.fetch(`${this.baseUrl}/lns-connection`, options);\n const data = await res.json();\n\n if (res.status === 200) {\n if (data.length === 0) {\n await this.throwNoConnectivitySettingsError();\n }\n } else {\n await this.throwConnectivitySettingsError(data);\n }\n return { res, data };\n }\n /**\n * Gets connectivity plans from LoRa platform.\n * @param connectionName The name of connection for which connectivity plans will be retrieved\n * @returns The result list with connectivity plans, or throws an error with exception.\n */\n async getConnectivityPlans(connectionName: string): Promise<IResultList<ConnectivityPlan>> {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers,\n params: {\n actilityConnectionName: connectionName\n }\n };\n\n const res = await this.client.fetch(this.connectivityPlansUrl, options);\n const data = await res.json();\n\n if (res.status === 200) {\n if (data.length === 0) {\n this.throwNoConnectivityPlansError();\n } else {\n if (!this.hasAvailableConnections(data)) {\n this.throwNoFreeSlotsInConnectivityPlansError();\n }\n }\n } else {\n await this.throwConnectivitySettingsError(data);\n }\n\n return { res, data };\n }\n\n /**\n * Gets the device profiles from LoRa platform.\n * @param connectionName The name of connection for which device profiles will be retrieved\n * @returns The result list with device profiles, or throws an error with exception.\n */\n async getDeviceProfiles(connectionName: string): Promise<IResultList<ActilityDeviceProfile>> {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers,\n params: {\n actilityConnectionName: connectionName\n }\n };\n\n const res = await this.client.fetch(this.deviceProfilesUrl, options);\n const data = await res.json();\n\n if (res.status === 200) {\n if (data.length === 0) {\n this.throwNoDeviceProfilesError();\n }\n } else {\n this.throwDeviceProfilesFetchError();\n }\n\n return { res, data };\n }\n\n /**\n * Gets the device protocols\n */\n async getDeviceProtocols(\n filter: object = { withTotalPages: true }\n ): Promise<IResultList<IManagedObject>> {\n const query = {\n __filter: {\n __and: [\n { __has: 'c8y_IsDeviceType' },\n {\n type: { __in: ['c8y_ActilityDeviceType', 'c8y_LoraDeviceType', 'c8y_LpwanDeviceType'] }\n }\n ]\n },\n __orderby: [{ name: 1 }]\n };\n const deviceProtocolsList = await this.inventoryService.listQuery(query, filter);\n const { res, data } = deviceProtocolsList;\n\n if (res.status === 200) {\n if (data.length === 0) {\n this.throwNoDeviceProtocolsError();\n }\n } else {\n this.throwDeviceProtocolsFetchError();\n }\n\n return deviceProtocolsList;\n }\n\n /**\n * Creates device registration\n */\n async register(registration: ActilityDeviceRegistration) {\n const options: IFetchOptions = {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify(registration)\n };\n\n const res = await this.client.fetch(this.registrationUrl, options);\n const data = await res.json();\n\n if (res.status !== 201) {\n this.throwRegistrationError(data);\n }\n\n return { res, data };\n }\n\n /**\n * checks if used connections is less then granted connections\n */\n private hasAvailableConnections(connectivityPlans) {\n return some(\n connectivityPlans,\n plan => parseInt(plan.grantedConnections, 10) > parseInt(plan.usedConnections, 10)\n );\n }\n\n private async throwNoConnectivitySettingsError() {\n const error = new Error();\n error.name = ActilityErrorName.NoConnectivitySettingsError;\n\n if (await this.appState.isApplicationAvailable('administration')) {\n error.message = this.translateService.instant(\n gettext(\n `Could not get connectivity plans from the LoRa platform. Verify the ThingPark credentials in the Administration application under <a href=\"{{ link }}\">Settings</a>.`\n ),\n {\n link: '/apps/administration/index.html#/connectivitySettings/multiple_lns_connectors_actility'\n }\n );\n } else {\n error.message = gettext(\n 'Could not get connectivity plans from the LoRa platform. Please contact the administrator.'\n );\n }\n\n throw error;\n }\n\n private throwConnectivitySettingsError(data: { message: string }) {\n const error = new Error();\n error.name = ActilityErrorName.ConnectivitySettingsError;\n error.message = data.message;\n throw error;\n }\n\n private throwNoConnectivityPlansError() {\n const error = new Error();\n error.name = ActilityErrorName.NoConnectivityPlansError;\n error.message = gettext(\n 'No connectivity plans found. New connectivity plans must be created via the LoRa platform.'\n );\n throw error;\n }\n\n private throwNoFreeSlotsInConnectivityPlansError() {\n const companyName = this.optionsService.get('companyName', 'Cumulocity IoT');\n const error = new Error();\n error.name = ActilityErrorName.NoFreeSlotsInConnectivityPlansError;\n error.message = this.translateService.instant(\n gettext(\n `No connectivity plans with free slots available. Please contact ThingPark on the device quota limits for your connectivity plans or remove unused devices from ThingPark and retry registering the device in the {{companyName}} platform.`\n ),\n {\n companyName\n }\n );\n throw error;\n }\n\n private throwDeviceProfilesFetchError() {\n const error = new Error();\n error.name = ActilityErrorName.DeviceProfilesFetchError;\n error.message = gettext('Could not load device profiles from the LoRa platform.');\n throw error;\n }\n\n private throwNoDeviceProfilesError() {\n const error = new Error();\n error.name = ActilityErrorName.NoDeviceProfilesError;\n error.message = gettext(\n 'No device profiles found. Create a new device profile via the LoRa platform.'\n );\n throw error;\n }\n\n private throwDeviceProtocolsFetchError() {\n const error = new Error();\n error.name = ActilityErrorName.DeviceProtocolsFetchError;\n error.message = gettext('Could not load device protocols.');\n throw error;\n }\n\n private throwNoDeviceProtocolsError() {\n const error = new Error();\n error.name = ActilityErrorName.NoDeviceProtocolsError;\n error.message = this.translateService.instant(\n gettext(\n `No device protocols configured. Create a LoRa device protocol in <a href=\"{{ link }}\">Device protocols</a>.`\n ),\n {\n link: '/apps/devicemanagement/#/deviceprotocols'\n }\n );\n throw error;\n }\n\n private throwRegistrationError(data: { message: string }) {\n const error = new Error();\n error.name = ActilityErrorName.RegistrationError;\n error.message = data.message;\n throw error;\n }\n}\n","import { CdkStep } from '@angular/cdk/stepper';\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { AbstractControl, FormGroup } from '@angular/forms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n C8yStepper,\n GainsightService,\n ModalComponent,\n IconDirective,\n LoadingComponent,\n C8yStepperButtons,\n OperationResultComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { cloneDeep, uniq } from 'lodash-es';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, defer, forkJoin, from, of, Subject, throwError } from 'rxjs';\nimport { catchError, map, mergeMap, shareReplay, switchMap, takeUntil } from 'rxjs/operators';\nimport {\n ActilityDeviceRegistration,\n PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION\n} from './actility-device-registration.model';\nimport {\n ActilityDeviceRegistrationService,\n ActilityErrorName\n} from './actility-device-registration.service';\nimport { NgIf, NgFor, NgClass, AsyncPipe } from '@angular/common';\n\ntype ActilityState =\n | 'loadPending'\n | 'loadSuccess'\n | 'loadError'\n | 'registrationPending'\n | 'registrationSuccess'\n | 'registrationError';\n@Component({\n selector: 'c8y-actility-registration',\n templateUrl: 'actility-device-registration.component.html',\n imports: [\n ModalComponent,\n IconDirective,\n NgIf,\n LoadingComponent,\n C8yStepper,\n CdkStep,\n FormlyModule,\n C8yStepperButtons,\n OperationResultComponent,\n NgFor,\n NgClass,\n C8yTranslatePipe,\n AsyncPipe\n ],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class ActilityDeviceRegistrationComponent {\n stepper: C8yStepper;\n registrationStepLabels = {\n next: gettext('Register')\n };\n finalStepLabels = {\n custom: gettext('Close')\n };\n\n state: ActilityState = 'loadPending';\n errors$ = new BehaviorSubject<Error[]>([]);\n errorMessages$ = this.errors$.pipe(\n map(errors => errors.map(error => error.message)),\n map(messages => uniq(messages))\n );\n\n connections$ = this.getConnections$();\n deviceProtocols$ = this.getDeviceProtocols$();\n unsubscribe$: Subject<void> = new Subject();\n load$ = this.connections$.pipe(\n catchError((error: Error) => of(error)),\n switchMap(connections => {\n if (\n connections instanceof Error &&\n connections.name === ActilityErrorName.NoConnectivitySettingsError\n ) {\n return of([connections]);\n }\n\n return forkJoin([\n of(connections),\n this.deviceProtocols$.pipe(catchError((error: Error) => of(error)))\n ]);\n }),\n map(results => results.filter(result => result instanceof Error)),\n switchMap(errors => (errors.length === 0 ? of([]) : throwError(errors)))\n );\n\n form = new FormGroup({});\n model = {} as ActilityDeviceRegistration;\n\n // Formly schema definition to render actility device registration form\n fields: FormlyFieldConfig[] = [\n {\n key: 'connection',\n type: 'typeahead',\n templateOptions: {\n label: gettext('Connection'),\n required: true,\n c8yForOptions: this.connections$,\n displayProperty: 'name',\n valueProperties: ['name']\n }\n },\n {\n key: 'deviceProfile',\n type: 'typeahead',\n templateOptions: {\n label: gettext('Device profile'),\n required: true,\n displayProperty: 'name',\n placeholder: 'IWM-LR3',\n valueProperties: ['id', 'name', 'typeMAC']\n },\n hooks: {\n onInit: field => {\n const connectionControl = field.form.get('connection');\n connectionControl.valueChanges\n .pipe(\n takeUntil(this.unsubscribe$),\n mergeMap(({ name }) => this.getDeviceProfiles$(name))\n )\n .subscribe(\n profiles => {\n field.templateOptions.c8yForOptions = of(profiles);\n field.formControl.setValue(null);\n },\n error => {\n field.form.get('deviceProfile').setErrors({ deviceProfile: true });\n field.validators.deviceProfile.message = error.message;\n }\n );\n }\n },\n validators: {\n deviceProfile: {\n expression: (control: AbstractControl) => {\n return control.status === 'VALID';\n },\n message: () => ''\n }\n }\n },\n {\n key: 'deviceType',\n type: 'typeahead',\n templateOptions: {\n label: gettext('Device protocol'),\n required: true,\n c8yForOptions: this.deviceProtocols$,\n displayProperty: 'name',\n valueProperties: ['id', 'name']\n }\n },\n {\n key: 'devEUI',\n type: 'input',\n templateOptions: {\n placeholder: '0018A20000000004',\n label: gettext('Device EUI'),\n required: true,\n pattern: '^([a-fA-F0-9]{16})$'\n },\n validation: {\n messages: {\n pattern: gettext('Must be a valid 16 digit hexadecimal number.')\n }\n }\n },\n {\n key: 'applicationEUI',\n type: 'input',\n templateOptions: {\n placeholder: '70B3D53260000003',\n label: gettext('Application EUI'),\n required: true,\n pattern: '^([a-fA-F0-9]{16})$'\n },\n validation: {\n messages: {\n pattern: gettext('Must be a valid 16 digit hexadecimal number.')\n }\n }\n },\n {\n key: 'applicationKey',\n type: 'input',\n templateOptions: {\n label: gettext('Application key'),\n placeholder: '258DB54023EA74F0D55085F7351737D0',\n required: true,\n pattern: '^([a-fA-F0-9]{32})$'\n },\n validation: {\n messages: {\n pattern: gettext('Must be a valid 32 digit hexadecimal number.')\n }\n }\n },\n {\n key: 'connectivityPlan',\n type: 'typeahead',\n templateOptions: {\n label: gettext('Connectivity plan'),\n description: gettext('Only connectivity plans with free slots are displayed'),\n required: true,\n placeholder: 'Dev-ope testing CP',\n displayProperty: 'name',\n valueProperties: ['id', 'ref', 'name', 'grantedConnections', 'usedConnections']\n },\n hooks: {\n onInit: field => {\n const connectionControl = field.form.get('connection');\n connectionControl.valueChanges\n .pipe(\n takeUntil(this.unsubscribe$),\n mergeMap(({ name }) => this.getConnectivityPlans$(name))\n )\n .subscribe(\n profiles => {\n field.templateOptions.c8yForOptions = of(profiles);\n field.formControl.setValue(null);\n },\n error => {\n field.form.get('connectivityPlan').setErrors({ connectivityPlan: true });\n field.validators.connectivityPlan.message = error.message;\n }\n );\n }\n },\n validators: {\n connectivityPlan: {\n expression: (control: AbstractControl) => {\n return control.status === 'VALID';\n },\n message: () => ''\n }\n }\n }\n ];\n\n constructor(\n public bsModalRef: BsModalRef,\n private registrationService: ActilityDeviceRegistrationService,\n private gainsightService: GainsightService\n ) {\n this.load$.subscribe(\n () => {\n this.state = 'loadSuccess';\n },\n errors => {\n this.state = 'loadError';\n this.errors$.next(errors);\n }\n );\n }\n\n getConnectivityPlans$(name) {\n return defer(() => from(this.registrationService.getConnectivityPlans(name))).pipe(\n shareReplay(1)\n );\n }\n\n getDeviceProfiles$(name) {\n return defer(() => from(this.registrationService.getDeviceProfiles(name))).pipe(shareReplay(1));\n }\n\n getDeviceProtocols$() {\n return defer(() => from(this.registrationService.getDeviceProtocols())).pipe(shareReplay(1));\n }\n\n getConnections$() {\n return defer(() => from(this.registrationService.getConnections())).pipe(shareReplay(1));\n }\n\n async register(event: { stepper: C8yStepper; step: CdkStep }) {\n event.stepper.next();\n this.state = 'registrationPending';\n try {\n const actilityDevice = this.getActilityDeviceToSend();\n await this.registrationService.register(actilityDevice);\n this.state = 'registrationSuccess';\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.EVENT, {\n result: PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.RESULT.SUCCESS,\n component: PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.COMPONENT\n });\n } catch (error) {\n this.state = 'registrationError';\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.EVENT, {\n result: PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.RESULT.FAILURE,\n component: PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.COMPONENT\n });\n this.errors$.next([error]);\n }\n }\n\n getActilityDeviceToSend() {\n const actilityDevice: ActilityDeviceRegistration = cloneDeep(this.model);\n actilityDevice.lnsConnectionName = this.model.connection.name;\n delete (actilityDevice as any).connection;\n return actilityDevice;\n }\n ngOnDestroy(): void {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n}\n","<c8y-modal\n [title]=\"'Actility LoRa registration' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n\n <ng-container *ngIf=\"state === 'loadPending'; else registrationForm\">\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-container>\n\n <!--Formly schema is rendered-->\n <ng-template #registrationForm>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n c8y-modal-body\n linear\n *ngIf=\"(errorMessages$ | async).length === 0; else errorMessagesPresent\"\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"p-b-16\">\n <p class=\"modal-subtitle sticky-top\">\n {{ 'Register a single Actility device' | translate }}\n </p>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-r-24 p-t-16\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n ></formly-form>\n </div>\n\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [labels]=\"registrationStepLabels\"\n (onNext)=\"register($event)\"\n (onCancel)=\"bsModalRef.hide()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [pending]=\"state === 'registrationPending'\"\n [disabled]=\"!form?.valid\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <!--success scenario-->\n <div\n class=\"p-16 text-center\"\n *ngIf=\"state === 'registrationPending'\"\n >\n <c8y-loading></c8y-loading>\n </div>\n <div class=\"m-24\">\n <c8y-operation-result\n class=\"lead m-b-0\"\n type=\"success\"\n *ngIf=\"state === 'registrationSuccess'\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"bsModalRef.hide()\"\n [showButtons]=\"{ custom: true }\"\n [labels]=\"finalStepLabels\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n </ng-template>\n\n <!--Failure scenario-->\n <ng-template #errorMessagesPresent>\n <div class=\"m-24\">\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"state === 'registrationError'\"\n text=\"{{ 'Failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <div\n class=\"m-b-8\"\n *ngFor=\"let msg of errorMessages$ | async\"\n data-cy=\"actility-device-registration.component--registration-error\"\n [ngClass]=\"{\n 'text-center': state === 'registrationError',\n 'alert alert-danger': state === 'loadError'\n }\"\n >\n <span [innerHTML]=\"msg | translate\"></span>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n type=\"button\"\n (click)=\"bsModalRef.hide()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n </ng-template>\n</c8y-modal>\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ActilityDeviceRegistrationComponent } from './actility-device-registration.component';\nimport { IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-actility-registration-button',\n templateUrl: 'actility-device-registration-button.component.html',\n imports: [IconDirective, C8yTranslatePipe],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class ActilityDeviceRegistrationButtonComponent {\n constructor(private modalService: BsModalService) {}\n\n open() {\n this.modalService.show(ActilityDeviceRegistrationComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n ignoreBackdropClick: true\n });\n }\n}\n","<button title=\"{{ 'Actility LoRa' | translate }}\" type=\"button\" (click)=\"open()\">\n <i c8yIcon=\"c8y-device-connect\"></i>\n {{ 'Actility LoRa' | translate }}\n</button>\n","import { Injectable } from '@angular/core';\nimport { TenantUiService } from '@c8y/ngx-components';\nimport { ActilityDeviceRegistrationButtonComponent } from './actility-device-registration-button.component';\nimport { RegisterDeviceFactory, RegisterDeviceItem } from '@c8y/ngx-components/register-device';\n@Injectable({\n providedIn: 'root'\n})\nexport class ActilityDeviceRegistrationFactory implements RegisterDeviceFactory {\n constructor(private tenantService: TenantUiService) {}\n\n get() {\n const actions: RegisterDeviceItem[] = [];\n if (this.tenantService.isMicroserviceSubscribedInCurrentTenant('actility')) {\n actions.push({\n template: ActilityDeviceRegistrationButtonComponent,\n priority: 99,\n category: 'single'\n } as RegisterDeviceItem);\n }\n return actions;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { hookDeviceRegistration } from '@c8y/ngx-components/register-device';\nimport { ActilityDeviceRegistrationButtonComponent } from './actility-device-registration-button.component';\nimport { ActilityDeviceRegistrationFactory } from './actility-device-registration.factory';\nimport { ActilityDeviceRegistrationComponent } from './actility-device-registration.component';\nimport { ActilityDeviceRegistrationService } from './actility-device-registration.service';\n\n@NgModule({\n imports: [\n CoreModule,\n CommonModule,\n ActilityDeviceRegistrationButtonComponent,\n ActilityDeviceRegistrationComponent\n ],\n providers: [\n ActilityDeviceRegistrationService,\n hookDeviceRegistration(ActilityDeviceRegistrationFactory)\n ]\n})\nexport class ActilityDeviceRegistrationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.ActilityDeviceRegistrationService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-actility-device-registration.mjs","sources":["../../actility-device-registration/actility-device-registration.model.ts","../../actility-device-registration/actility-device-registration.service.ts","../../actility-device-registration/actility-device-registration.component.ts","../../actility-device-registration/actility-device-registration.component.html","../../actility-device-registration/actility-device-registration-button.component.ts","../../actility-device-registration/actility-device-registration-button.component.html","../../actility-device-registration/actility-device-registration.factory.ts","../../actility-device-registration/actility-device-registration.module.ts","../../actility-device-registration/c8y-ngx-components-actility-device-registration.ts"],"sourcesContent":["export interface ConnectivityPlan {\n grantedConnections: string;\n id: string;\n name: string;\n ref: string;\n usedConnections: string;\n message?: string;\n}\n\nexport interface DeviceType {\n name: string;\n id: string;\n}\n\nexport interface ActilityDeviceProfile {\n id: string;\n name: string;\n typeMAC: string;\n message?: string;\n}\n\nexport interface ActilityDeviceRegistration {\n applicationEUI: string;\n applicationKey: string;\n devEUI: string;\n deviceProfile: ActilityDeviceProfile;\n connectivityPlan: ConnectivityPlan;\n deviceType: DeviceType;\n lnsConnectionName: string;\n connection: {\n name: string;\n description: string;\n baseUrl: string;\n profileId: string;\n username: string;\n password: string;\n };\n}\n\nexport const PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION = {\n EVENT: 'deviceRegistration',\n COMPONENT: 'actility-registration',\n RESULT: { SUCCESS: 'registrationSuccess', FAILURE: 'registrationFailure' }\n} as const;\n","import { Injectable } from '@angular/core';\nimport {\n ApplicationService,\n FetchClient,\n IFetchOptions,\n IManagedObject,\n IResultList,\n InventoryService\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AppStateService, OptionsService } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { some } from 'lodash-es';\nimport {\n ActilityDeviceProfile,\n ActilityDeviceRegistration,\n ConnectivityPlan\n} from './actility-device-registration.model';\n\nexport enum ActilityErrorName {\n NoConnectivityPlansError = 'NoConnectivityPlansError',\n NoFreeSlotsInConnectivityPlansError = 'NoFreeSlotsInConnectivityPlansError',\n NoConnectivitySettingsError = 'NoConnectivitySettingsError',\n ConnectivitySettingsError = 'ConnectivitySettingsError',\n NoDeviceProfilesError = 'NoDeviceProfilesError',\n DeviceProfilesFetchError = 'DeviceProfilesFetchError',\n NoDeviceProtocolsError = 'NoDeviceProtocolsError',\n DeviceProtocolsFetchError = 'DeviceProtocolsFetchError',\n RegistrationError = 'RegistrationError'\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ActilityDeviceRegistrationService {\n private baseUrl = '/service/actility';\n private registrationUrl = `${this.baseUrl}/newDeviceRequest`;\n private connectivityPlansUrl = `${this.baseUrl}/connectivityPlans`;\n private deviceProfilesUrl = `${this.baseUrl}/deviceProfiles`;\n private headers: object = {\n 'Content-Type': 'application/json'\n };\n\n constructor(\n private inventoryService: InventoryService,\n private client: FetchClient,\n private translateService: TranslateService,\n private applicationService: ApplicationService,\n private optionsService: OptionsService,\n private appState: AppStateService\n ) {}\n\n async getConnections() {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers\n };\n const res = await this.client.fetch(`${this.baseUrl}/lns-connection`, options);\n const data = await res.json();\n\n if (res.status === 200) {\n if (data.length === 0) {\n await this.throwNoConnectivitySettingsError();\n }\n } else {\n await this.throwConnectivitySettingsError(data);\n }\n return { res, data };\n }\n /**\n * Gets connectivity plans from LoRa platform.\n * @param connectionName The name of connection for which connectivity plans will be retrieved\n * @returns The result list with connectivity plans, or throws an error with exception.\n */\n async getConnectivityPlans(connectionName: string): Promise<IResultList<ConnectivityPlan>> {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers,\n params: {\n actilityConnectionName: connectionName\n }\n };\n\n const res = await this.client.fetch(this.connectivityPlansUrl, options);\n const data = await res.json();\n\n if (res.status === 200) {\n if (data.length === 0) {\n this.throwNoConnectivityPlansError();\n } else {\n if (!this.hasAvailableConnections(data)) {\n this.throwNoFreeSlotsInConnectivityPlansError();\n }\n }\n } else {\n await this.throwConnectivitySettingsError(data);\n }\n\n return { res, data };\n }\n\n /**\n * Gets the device profiles from LoRa platform.\n * @param connectionName The name of connection for which device profiles will be retrieved\n * @returns The result list with device profiles, or throws an error with exception.\n */\n async getDeviceProfiles(connectionName: string): Promise<IResultList<ActilityDeviceProfile>> {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers,\n params: {\n actilityConnectionName: connectionName\n }\n };\n\n const res = await this.client.fetch(this.deviceProfilesUrl, options);\n const data = await res.json();\n\n if (res.status === 200) {\n if (data.length === 0) {\n this.throwNoDeviceProfilesError();\n }\n } else {\n this.throwDeviceProfilesFetchError();\n }\n\n return { res, data };\n }\n\n /**\n * Gets the device protocols\n */\n async getDeviceProtocols(\n filter: object = { withTotalPages: true }\n ): Promise<IResultList<IManagedObject>> {\n const query = {\n __filter: {\n __and: [\n { __has: 'c8y_IsDeviceType' },\n {\n type: { __in: ['c8y_ActilityDeviceType', 'c8y_LoraDeviceType', 'c8y_LpwanDeviceType'] }\n }\n ]\n },\n __orderby: [{ name: 1 }]\n };\n const deviceProtocolsList = await this.inventoryService.listQuery(query, filter);\n const { res, data } = deviceProtocolsList;\n\n if (res.status === 200) {\n if (data.length === 0) {\n this.throwNoDeviceProtocolsError();\n }\n } else {\n this.throwDeviceProtocolsFetchError();\n }\n\n return deviceProtocolsList;\n }\n\n /**\n * Creates device registration\n */\n async register(registration: ActilityDeviceRegistration) {\n const options: IFetchOptions = {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify(registration)\n };\n\n const res = await this.client.fetch(this.registrationUrl, options);\n const data = await res.json();\n\n if (res.status !== 201) {\n this.throwRegistrationError(data);\n }\n\n return { res, data };\n }\n\n /**\n * checks if used connections is less then granted connections\n */\n private hasAvailableConnections(connectivityPlans) {\n return some(\n connectivityPlans,\n plan => parseInt(plan.grantedConnections, 10) > parseInt(plan.usedConnections, 10)\n );\n }\n\n private async throwNoConnectivitySettingsError() {\n const error = new Error();\n error.name = ActilityErrorName.NoConnectivitySettingsError;\n\n if (await this.appState.isApplicationAvailable('administration')) {\n error.message = this.translateService.instant(\n gettext(\n `Could not get connectivity plans from the LoRa platform. Verify the ThingPark credentials in the Administration application under <a href=\"{{ link }}\">Settings</a>.`\n ),\n {\n link: '/apps/administration/index.html#/connectivitySettings/multiple_lns_connectors_actility'\n }\n );\n } else {\n error.message = gettext(\n 'Could not get connectivity plans from the LoRa platform. Please contact the administrator.'\n );\n }\n\n throw error;\n }\n\n private throwConnectivitySettingsError(data: { message: string }) {\n const error = new Error();\n error.name = ActilityErrorName.ConnectivitySettingsError;\n error.message = data.message;\n throw error;\n }\n\n private throwNoConnectivityPlansError() {\n const error = new Error();\n error.name = ActilityErrorName.NoConnectivityPlansError;\n error.message = gettext(\n 'No connectivity plans found. New connectivity plans must be created via the LoRa platform.'\n );\n throw error;\n }\n\n private throwNoFreeSlotsInConnectivityPlansError() {\n const companyName = this.optionsService.get('companyName', 'Cumulocity IoT');\n const error = new Error();\n error.name = ActilityErrorName.NoFreeSlotsInConnectivityPlansError;\n error.message = this.translateService.instant(\n gettext(\n `No connectivity plans with free slots available. Please contact ThingPark on the device quota limits for your connectivity plans or remove unused devices from ThingPark and retry registering the device in the {{companyName}} platform.`\n ),\n {\n companyName\n }\n );\n throw error;\n }\n\n private throwDeviceProfilesFetchError() {\n const error = new Error();\n error.name = ActilityErrorName.DeviceProfilesFetchError;\n error.message = gettext('Could not load device profiles from the LoRa platform.');\n throw error;\n }\n\n private throwNoDeviceProfilesError() {\n const error = new Error();\n error.name = ActilityErrorName.NoDeviceProfilesError;\n error.message = gettext(\n 'No device profiles found. Create a new device profile via the LoRa platform.'\n );\n throw error;\n }\n\n private throwDeviceProtocolsFetchError() {\n const error = new Error();\n error.name = ActilityErrorName.DeviceProtocolsFetchError;\n error.message = gettext('Could not load device protocols.');\n throw error;\n }\n\n private throwNoDeviceProtocolsError() {\n const error = new Error();\n error.name = ActilityErrorName.NoDeviceProtocolsError;\n error.message = this.translateService.instant(\n gettext(\n `No device protocols configured. Create a LoRa device protocol in <a href=\"{{ link }}\">Device protocols</a>.`\n ),\n {\n link: '/apps/devicemanagement/#/deviceprotocols'\n }\n );\n throw error;\n }\n\n private throwRegistrationError(data: { message: string }) {\n const error = new Error();\n error.name = ActilityErrorName.RegistrationError;\n error.message = data.message;\n throw error;\n }\n}\n","import { CdkStep } from '@angular/cdk/stepper';\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { AbstractControl, FormGroup } from '@angular/forms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n C8yStepper,\n GainsightService,\n ModalComponent,\n IconDirective,\n LoadingComponent,\n C8yStepperButtons,\n OperationResultComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { cloneDeep, uniq } from 'lodash-es';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, defer, forkJoin, from, of, Subject, throwError } from 'rxjs';\nimport { catchError, map, mergeMap, shareReplay, switchMap, takeUntil } from 'rxjs/operators';\nimport {\n ActilityDeviceRegistration,\n PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION\n} from './actility-device-registration.model';\nimport {\n ActilityDeviceRegistrationService,\n ActilityErrorName\n} from './actility-device-registration.service';\nimport { NgIf, NgFor, NgClass, AsyncPipe } from '@angular/common';\n\ntype ActilityState =\n | 'loadPending'\n | 'loadSuccess'\n | 'loadError'\n | 'registrationPending'\n | 'registrationSuccess'\n | 'registrationError';\n@Component({\n selector: 'c8y-actility-registration',\n templateUrl: 'actility-device-registration.component.html',\n imports: [\n ModalComponent,\n IconDirective,\n NgIf,\n LoadingComponent,\n C8yStepper,\n CdkStep,\n FormlyModule,\n C8yStepperButtons,\n OperationResultComponent,\n NgFor,\n NgClass,\n C8yTranslatePipe,\n AsyncPipe\n ],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class ActilityDeviceRegistrationComponent {\n stepper: C8yStepper;\n registrationStepLabels = {\n next: gettext('Register')\n };\n finalStepLabels = {\n custom: gettext('Close')\n };\n\n state: ActilityState = 'loadPending';\n errors$ = new BehaviorSubject<Error[]>([]);\n errorMessages$ = this.errors$.pipe(\n map(errors => errors.map(error => error.message)),\n map(messages => uniq(messages))\n );\n\n connections$ = this.getConnections$();\n deviceProtocols$ = this.getDeviceProtocols$();\n unsubscribe$: Subject<void> = new Subject();\n load$ = this.connections$.pipe(\n catchError((error: Error) => of(error)),\n switchMap(connections => {\n if (\n connections instanceof Error &&\n connections.name === ActilityErrorName.NoConnectivitySettingsError\n ) {\n return of([connections]);\n }\n\n return forkJoin([\n of(connections),\n this.deviceProtocols$.pipe(catchError((error: Error) => of(error)))\n ]);\n }),\n map(results => results.filter(result => result instanceof Error)),\n switchMap(errors => (errors.length === 0 ? of([]) : throwError(errors)))\n );\n\n form = new FormGroup({});\n model = {} as ActilityDeviceRegistration;\n\n // Formly schema definition to render actility device registration form\n fields: FormlyFieldConfig[] = [\n {\n key: 'connection',\n type: 'typeahead',\n templateOptions: {\n label: gettext('Connection'),\n required: true,\n c8yForOptions: this.connections$,\n displayProperty: 'name',\n valueProperties: ['name']\n }\n },\n {\n key: 'deviceProfile',\n type: 'typeahead',\n templateOptions: {\n label: gettext('Device profile'),\n required: true,\n displayProperty: 'name',\n placeholder: 'IWM-LR3',\n valueProperties: ['id', 'name', 'typeMAC']\n },\n hooks: {\n onInit: field => {\n const connectionControl = field.form.get('connection');\n connectionControl.valueChanges\n .pipe(\n takeUntil(this.unsubscribe$),\n mergeMap(({ name }) => this.getDeviceProfiles$(name))\n )\n .subscribe(\n profiles => {\n field.templateOptions.c8yForOptions = of(profiles);\n field.formControl.setValue(null);\n },\n error => {\n field.form.get('deviceProfile').setErrors({ deviceProfile: true });\n field.validators.deviceProfile.message = error.message;\n }\n );\n }\n },\n validators: {\n deviceProfile: {\n expression: (control: AbstractControl) => {\n return control.status === 'VALID';\n },\n message: () => ''\n }\n }\n },\n {\n key: 'deviceType',\n type: 'typeahead',\n templateOptions: {\n label: gettext('Device protocol'),\n required: true,\n c8yForOptions: this.deviceProtocols$,\n displayProperty: 'name',\n valueProperties: ['id', 'name']\n }\n },\n {\n key: 'devEUI',\n type: 'input',\n templateOptions: {\n placeholder: '0018A20000000004',\n label: gettext('Device EUI'),\n required: true,\n pattern: '^([a-fA-F0-9]{16})$'\n },\n validation: {\n messages: {\n pattern: gettext('Must be a valid 16 digit hexadecimal number.')\n }\n }\n },\n {\n key: 'applicationEUI',\n type: 'input',\n templateOptions: {\n placeholder: '70B3D53260000003',\n label: gettext('Application EUI'),\n required: true,\n pattern: '^([a-fA-F0-9]{16})$'\n },\n validation: {\n messages: {\n pattern: gettext('Must be a valid 16 digit hexadecimal number.')\n }\n }\n },\n {\n key: 'applicationKey',\n type: 'input',\n templateOptions: {\n label: gettext('Application key'),\n placeholder: '258DB54023EA74F0D55085F7351737D0',\n required: true,\n pattern: '^([a-fA-F0-9]{32})$'\n },\n validation: {\n messages: {\n pattern: gettext('Must be a valid 32 digit hexadecimal number.')\n }\n }\n },\n {\n key: 'connectivityPlan',\n type: 'typeahead',\n templateOptions: {\n label: gettext('Connectivity plan'),\n description: gettext('Only connectivity plans with free slots are displayed'),\n required: true,\n placeholder: 'Dev-ope testing CP',\n displayProperty: 'name',\n valueProperties: ['id', 'ref', 'name', 'grantedConnections', 'usedConnections']\n },\n hooks: {\n onInit: field => {\n const connectionControl = field.form.get('connection');\n connectionControl.valueChanges\n .pipe(\n takeUntil(this.unsubscribe$),\n mergeMap(({ name }) => this.getConnectivityPlans$(name))\n )\n .subscribe(\n profiles => {\n field.templateOptions.c8yForOptions = of(profiles);\n field.formControl.setValue(null);\n },\n error => {\n field.form.get('connectivityPlan').setErrors({ connectivityPlan: true });\n field.validators.connectivityPlan.message = error.message;\n }\n );\n }\n },\n validators: {\n connectivityPlan: {\n expression: (control: AbstractControl) => {\n return control.status === 'VALID';\n },\n message: () => ''\n }\n }\n }\n ];\n\n constructor(\n public bsModalRef: BsModalRef,\n private registrationService: ActilityDeviceRegistrationService,\n private gainsightService: GainsightService\n ) {\n this.load$.subscribe(\n () => {\n this.state = 'loadSuccess';\n },\n errors => {\n this.state = 'loadError';\n this.errors$.next(errors);\n }\n );\n }\n\n getConnectivityPlans$(name) {\n return defer(() => from(this.registrationService.getConnectivityPlans(name))).pipe(\n shareReplay(1)\n );\n }\n\n getDeviceProfiles$(name) {\n return defer(() => from(this.registrationService.getDeviceProfiles(name))).pipe(shareReplay(1));\n }\n\n getDeviceProtocols$() {\n return defer(() => from(this.registrationService.getDeviceProtocols())).pipe(shareReplay(1));\n }\n\n getConnections$() {\n return defer(() => from(this.registrationService.getConnections())).pipe(shareReplay(1));\n }\n\n async register(event: { stepper: C8yStepper; step: CdkStep }) {\n event.stepper.next();\n this.state = 'registrationPending';\n try {\n const actilityDevice = this.getActilityDeviceToSend();\n await this.registrationService.register(actilityDevice);\n this.state = 'registrationSuccess';\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.EVENT, {\n result: PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.RESULT.SUCCESS,\n component: PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.COMPONENT\n });\n } catch (error) {\n this.state = 'registrationError';\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.EVENT, {\n result: PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.RESULT.FAILURE,\n component: PRODUCT_EXPERIENCE_ACTILITY_REGISTRATION.COMPONENT\n });\n this.errors$.next([error]);\n }\n }\n\n getActilityDeviceToSend() {\n const actilityDevice: ActilityDeviceRegistration = cloneDeep(this.model);\n actilityDevice.lnsConnectionName = this.model.connection.name;\n delete (actilityDevice as any).connection;\n return actilityDevice;\n }\n ngOnDestroy(): void {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n}\n","<c8y-modal\n [title]=\"'Actility LoRa registration' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n\n <ng-container *ngIf=\"state === 'loadPending'; else registrationForm\">\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-container>\n\n <!--Formly schema is rendered-->\n <ng-template #registrationForm>\n <c8y-stepper\n [hideStepProgress]=\"true\"\n c8y-modal-body\n linear\n *ngIf=\"(errorMessages$ | async).length === 0; else errorMessagesPresent\"\n >\n <cdk-step [stepControl]=\"form\">\n <div class=\"p-b-16\">\n <p class=\"modal-subtitle sticky-top\">\n {{ 'Register a single Actility device' | translate }}\n </p>\n <formly-form\n class=\"formly-group-array-cols d-block p-l-24 p-r-24 p-t-16\"\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n ></formly-form>\n </div>\n\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [labels]=\"registrationStepLabels\"\n (onNext)=\"register($event)\"\n (onCancel)=\"bsModalRef.hide()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [pending]=\"state === 'registrationPending'\"\n [disabled]=\"!form?.valid\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <!--success scenario-->\n <div\n class=\"p-16 text-center\"\n *ngIf=\"state === 'registrationPending'\"\n >\n <c8y-loading></c8y-loading>\n </div>\n <div class=\"m-24\">\n <c8y-operation-result\n class=\"lead m-b-0\"\n type=\"success\"\n *ngIf=\"state === 'registrationSuccess'\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"bsModalRef.hide()\"\n [showButtons]=\"{ custom: true }\"\n [labels]=\"finalStepLabels\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n </ng-template>\n\n <!--Failure scenario-->\n <ng-template #errorMessagesPresent>\n <div class=\"m-24\">\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"state === 'registrationError'\"\n text=\"{{ 'Failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <div\n class=\"m-b-8\"\n *ngFor=\"let msg of errorMessages$ | async\"\n data-cy=\"actility-device-registration.component--registration-error\"\n [ngClass]=\"{\n 'text-center': state === 'registrationError',\n 'alert alert-danger': state === 'loadError'\n }\"\n >\n <span [innerHTML]=\"msg | translate\"></span>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n type=\"button\"\n (click)=\"bsModalRef.hide()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n </ng-template>\n</c8y-modal>\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ActilityDeviceRegistrationComponent } from './actility-device-registration.component';\nimport { IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-actility-registration-button',\n templateUrl: 'actility-device-registration-button.component.html',\n imports: [IconDirective, C8yTranslatePipe],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class ActilityDeviceRegistrationButtonComponent {\n constructor(private modalService: BsModalService) {}\n\n open() {\n this.modalService.show(ActilityDeviceRegistrationComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n ignoreBackdropClick: true\n });\n }\n}\n","<button title=\"{{ 'Actility LoRa' | translate }}\" type=\"button\" (click)=\"open()\">\n <i c8yIcon=\"c8y-device-connect\"></i>\n {{ 'Actility LoRa' | translate }}\n</button>\n","import { Injectable } from '@angular/core';\nimport { TenantUiService } from '@c8y/ngx-components';\nimport { ActilityDeviceRegistrationButtonComponent } from './actility-device-registration-button.component';\nimport { RegisterDeviceFactory, RegisterDeviceItem } from '@c8y/ngx-components/register-device';\n@Injectable({\n providedIn: 'root'\n})\nexport class ActilityDeviceRegistrationFactory implements RegisterDeviceFactory {\n constructor(private tenantService: TenantUiService) {}\n\n get() {\n const actions: RegisterDeviceItem[] = [];\n if (this.tenantService.isMicroserviceSubscribedInCurrentTenant('actility')) {\n actions.push({\n template: ActilityDeviceRegistrationButtonComponent,\n priority: 99,\n category: 'single'\n } as RegisterDeviceItem);\n }\n return actions;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { hookDeviceRegistration } from '@c8y/ngx-components/register-device';\nimport { ActilityDeviceRegistrationButtonComponent } from './actility-device-registration-button.component';\nimport { ActilityDeviceRegistrationFactory } from './actility-device-registration.factory';\nimport { ActilityDeviceRegistrationComponent } from './actility-device-registration.component';\nimport { ActilityDeviceRegistrationService } from './actility-device-registration.service';\n\n@NgModule({\n imports: [\n CoreModule,\n CommonModule,\n ActilityDeviceRegistrationButtonComponent,\n ActilityDeviceRegistrationComponent\n ],\n providers: [\n ActilityDeviceRegistrationService,\n hookDeviceRegistration(ActilityDeviceRegistrationFactory)\n ]\n})\nexport class ActilityDeviceRegistrationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.ActilityDeviceRegistrationService"],"mappings":"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"}
|
|
@@ -957,6 +957,29 @@ class AssetPropertiesService {
|
|
|
957
957
|
}
|
|
958
958
|
return false;
|
|
959
959
|
}
|
|
960
|
+
/**
|
|
961
|
+
* Checks whether two properties refer to the same logical property, identified by
|
|
962
|
+
* name, nested keyPath and (for computed properties) instanceId.
|
|
963
|
+
* @param property1 First property to compare.
|
|
964
|
+
* @param property2 Second property to compare.
|
|
965
|
+
* @returns True if both refer to the same logical property.
|
|
966
|
+
*/
|
|
967
|
+
isSameProperty(property1, property2) {
|
|
968
|
+
if (property1.name !== property2.name) {
|
|
969
|
+
return false;
|
|
970
|
+
}
|
|
971
|
+
const path1 = property1.keyPath?.join('.');
|
|
972
|
+
const path2 = property2.keyPath?.join('.');
|
|
973
|
+
if (path1 !== path2) {
|
|
974
|
+
return false;
|
|
975
|
+
}
|
|
976
|
+
// Computed properties can be selected multiple times with different configs, so they
|
|
977
|
+
// are only the same when their generated instanceId matches.
|
|
978
|
+
if (property1.computed || property2.computed) {
|
|
979
|
+
return property1.instanceId === property2.instanceId;
|
|
980
|
+
}
|
|
981
|
+
return true;
|
|
982
|
+
}
|
|
960
983
|
/**
|
|
961
984
|
* Retrieves custom properties from the properties library, optionally filtered by search text.
|
|
962
985
|
* @param searchText Optional search text to filter properties.
|
|
@@ -2127,7 +2150,7 @@ class AssetPropertyListComponent {
|
|
|
2127
2150
|
property.config = configs[0];
|
|
2128
2151
|
return true;
|
|
2129
2152
|
}
|
|
2130
|
-
catch
|
|
2153
|
+
catch {
|
|
2131
2154
|
return false;
|
|
2132
2155
|
}
|
|
2133
2156
|
}
|
|
@@ -2488,9 +2511,9 @@ class AssetPropertyListComponent {
|
|
|
2488
2511
|
}
|
|
2489
2512
|
}
|
|
2490
2513
|
else {
|
|
2491
|
-
// Multi or plus mode - iterate through all nodes
|
|
2514
|
+
// Multi or plus mode - iterate through all nodes.
|
|
2492
2515
|
this.dataSource.data.forEach(node => {
|
|
2493
|
-
const matchingNode = selectedPropertiesToApply.find(configProperty => this.assetPropertiesService.
|
|
2516
|
+
const matchingNode = selectedPropertiesToApply.find(configProperty => this.assetPropertiesService.isSameProperty(node.property, configProperty));
|
|
2494
2517
|
if (matchingNode) {
|
|
2495
2518
|
this.onSelectMulti(true, node, false);
|
|
2496
2519
|
}
|
|
@@ -2975,6 +2998,12 @@ class AssetPropertyTabsComponent {
|
|
|
2975
2998
|
this.selectedRegularProperties = [];
|
|
2976
2999
|
this.selectedComputedProperties = [];
|
|
2977
3000
|
}
|
|
3001
|
+
// Check if a selected property exist in the tab and determine if it has been deselected in the current tab
|
|
3002
|
+
const deselectedInCurrentTab = (property) => this.displayedProperties.some(displayed => this.assetPropertiesService.isSameProperty(displayed, property)) &&
|
|
3003
|
+
!properties.some(selected => this.assetPropertiesService.isSameProperty(selected, property));
|
|
3004
|
+
this.selectedAssetProperties = this.selectedAssetProperties.filter(property => !deselectedInCurrentTab(property));
|
|
3005
|
+
this.selectedRegularProperties = this.selectedRegularProperties.filter(property => !deselectedInCurrentTab(property));
|
|
3006
|
+
this.selectedComputedProperties = this.selectedComputedProperties.filter(property => !deselectedInCurrentTab(property));
|
|
2978
3007
|
// Update the selected properties for the current tab
|
|
2979
3008
|
if (this.selectedTab === 'asset') {
|
|
2980
3009
|
this.selectedAssetProperties = cloneDeep(properties);
|
|
@@ -2989,7 +3018,8 @@ class AssetPropertyTabsComponent {
|
|
|
2989
3018
|
...this.selectedAssetProperties,
|
|
2990
3019
|
...this.selectedRegularProperties,
|
|
2991
3020
|
...this.selectedComputedProperties
|
|
2992
|
-
]
|
|
3021
|
+
].filter((property, index, all) => all.findIndex(other => this.assetPropertiesService.isSameProperty(other, property)) ===
|
|
3022
|
+
index);
|
|
2993
3023
|
this.selectedPropertiesChange.emit(cloneDeep(allSelected));
|
|
2994
3024
|
}
|
|
2995
3025
|
onTabChange(tabName) {
|
|
@@ -3101,20 +3131,17 @@ class AssetPropertyTabsComponent {
|
|
|
3101
3131
|
this.updateConfigWithCurrentTabSelections();
|
|
3102
3132
|
}
|
|
3103
3133
|
/**
|
|
3104
|
-
* Updates the config
|
|
3134
|
+
* Updates the config with the selected properties of all tabs.
|
|
3105
3135
|
*/
|
|
3106
3136
|
updateConfigWithCurrentTabSelections() {
|
|
3107
|
-
|
|
3108
|
-
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
|
|
3113
|
-
|
|
3114
|
-
|
|
3115
|
-
currentTabSelections = this.selectedComputedProperties;
|
|
3116
|
-
}
|
|
3117
|
-
this.config = { ...this.config, selectedProperties: currentTabSelections };
|
|
3137
|
+
this.config = {
|
|
3138
|
+
...this.config,
|
|
3139
|
+
selectedProperties: [
|
|
3140
|
+
...this.selectedAssetProperties,
|
|
3141
|
+
...this.selectedRegularProperties,
|
|
3142
|
+
...this.selectedComputedProperties
|
|
3143
|
+
]
|
|
3144
|
+
};
|
|
3118
3145
|
}
|
|
3119
3146
|
/**
|
|
3120
3147
|
* Categorizes incoming selectedProperties by matching them against loaded properties.
|
|
@@ -3126,20 +3153,40 @@ class AssetPropertyTabsComponent {
|
|
|
3126
3153
|
const assetSelected = [];
|
|
3127
3154
|
const regularSelected = [];
|
|
3128
3155
|
const computedSelected = [];
|
|
3156
|
+
// Snapshot the current per-tab assignments so a property already placed in a tab (e.g. the
|
|
3157
|
+
// one the user just picked it on) keeps that tab on re-categorization. The same property
|
|
3158
|
+
// name can appear in more than one tab (a default like `name` is both an asset property and
|
|
3159
|
+
// a custom property)
|
|
3160
|
+
const previousAsset = this.selectedAssetProperties;
|
|
3161
|
+
const previousRegular = this.selectedRegularProperties;
|
|
3162
|
+
const previousComputed = this.selectedComputedProperties;
|
|
3163
|
+
const belongsTo = (bucket, prop) => bucket.some(existing => this.assetPropertiesService.isSameProperty(existing, prop));
|
|
3129
3164
|
for (const selectedProp of this.selectedProperties) {
|
|
3130
|
-
//
|
|
3131
|
-
|
|
3165
|
+
// Keep the property in the tab it already belongs to.
|
|
3166
|
+
if (belongsTo(previousAsset, selectedProp)) {
|
|
3167
|
+
assetSelected.push(selectedProp);
|
|
3168
|
+
continue;
|
|
3169
|
+
}
|
|
3170
|
+
if (belongsTo(previousComputed, selectedProp)) {
|
|
3171
|
+
computedSelected.push(selectedProp);
|
|
3172
|
+
continue;
|
|
3173
|
+
}
|
|
3174
|
+
if (belongsTo(previousRegular, selectedProp)) {
|
|
3175
|
+
regularSelected.push(selectedProp);
|
|
3176
|
+
continue;
|
|
3177
|
+
}
|
|
3178
|
+
const inAsset = this.assetProperties.some(prop => this.assetPropertiesService.isSameProperty(prop, selectedProp));
|
|
3132
3179
|
if (inAsset) {
|
|
3133
3180
|
assetSelected.push(selectedProp);
|
|
3134
3181
|
continue;
|
|
3135
3182
|
}
|
|
3136
|
-
const inComputed = this.computedProperties.some(prop => this.assetPropertiesService.
|
|
3183
|
+
const inComputed = this.computedProperties.some(prop => this.assetPropertiesService.isSameProperty(prop, selectedProp));
|
|
3137
3184
|
if (inComputed) {
|
|
3138
3185
|
computedSelected.push(selectedProp);
|
|
3139
3186
|
continue;
|
|
3140
3187
|
}
|
|
3141
3188
|
// Check if it's in regular properties
|
|
3142
|
-
const inRegular = this.regularProperties.some(prop => this.assetPropertiesService.
|
|
3189
|
+
const inRegular = this.regularProperties.some(prop => this.assetPropertiesService.isSameProperty(prop, selectedProp));
|
|
3143
3190
|
if (inRegular) {
|
|
3144
3191
|
regularSelected.push(selectedProp);
|
|
3145
3192
|
continue;
|