@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
87 lines • 16.5 kB
JavaScript
import { Component, Input, Optional } from '@angular/core';
import { AlertService, CoreModule, DynamicComponentAlert, gettext } from '@c8y/ngx-components';
import { OperationService } from '@c8y/client';
import { TranslateService } from '@ngx-translate/core';
import { BehaviorSubject } from 'rxjs';
import { map, shareReplay } from 'rxjs/operators';
import { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';
import { ReactiveFormsModule } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components";
import * as i2 from "@c8y/client";
import * as i3 from "@ngx-translate/core";
import * as i4 from "@c8y/ngx-components/context-dashboard";
import * as i5 from "@angular/common";
import * as i6 from "@angular/forms";
export class DeviceControlMessageWidgetViewComponent {
constructor(alert, operation, translate, dashboard) {
this.alert = alert;
this.operation = operation;
this.translate = translate;
this.dashboard = dashboard;
this.messageToBeSent = '';
this.operationAttribute = 'c8y_Message';
this.currentDevice = new BehaviorSubject(null);
this.operationSupportedByDevice$ = this.currentDevice.pipe(map(device => {
if (!device) {
return false;
}
const supportedOperations = device.c8y_SupportedOperations;
if (supportedOperations && Array.isArray(supportedOperations)) {
return supportedOperations.includes(this.operationAttribute);
}
return false;
}), shareReplay({ refCount: true, bufferSize: 1 }));
}
ngOnInit() {
if (this.dashboard?.isDeviceTypeDashboard && this.dashboard?.context?.id) {
this.currentDevice.next(this.dashboard.context);
}
this.operationSupportedByDeviceSubscription = this.operationSupportedByDevice$.subscribe(supported => {
if (!supported) {
this.alerts.addAlerts(new DynamicComponentAlert({
type: 'warning',
text: gettext('Operation not supported by this device')
}));
}
else {
this.alerts.clear();
}
});
}
ngOnDestroy() {
this.operationSupportedByDeviceSubscription?.unsubscribe();
}
ngOnChanges() {
if (!this.dashboard?.isDeviceTypeDashboard && this.config.device) {
this.currentDevice.next(this.config.device);
}
}
async sendMessage() {
const msg = this.messageToBeSent;
const operationDescription = this.translate.instant(gettext('Send message "{{msg}}"'), { msg });
try {
await this.operation.create({
deviceId: this.currentDevice.value?.id,
description: operationDescription,
[this.operationAttribute]: { text: msg }
});
this.alert.success(gettext('Message will be sent.'));
this.messageToBeSent = '';
}
catch (e) {
this.alert.addServerFailure(e);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DeviceControlMessageWidgetViewComponent, deps: [{ token: i1.AlertService }, { token: i2.OperationService }, { token: i3.TranslateService }, { token: i4.ContextDashboardComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DeviceControlMessageWidgetViewComponent, isStandalone: true, selector: "c8y-device-control-message-widget-view", inputs: { config: "config" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"operationSupportedByDevice$ | async\" class=\"input-group p-16\">\n <input\n type=\"text\"\n class=\"form-control\"\n data-cy=\"c8y-device-control-message-widget-view--message-textbox\"\n [(ngModel)]=\"messageToBeSent\"\n placeholder=\"{{ 'Message' | translate }}\"\n />\n <span class=\"input-group-btn\">\n <button\n title=\"{{ 'Send' | translate }}\"\n class=\"btn btn-primary\"\n data-cy=\"c8y-device-control-message-widget-view--send-button\"\n (click)=\"sendMessage()\"\n [disabled]=\"!messageToBeSent\"\n translate\n >\n Send\n </button>\n </span>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DeviceControlMessageWidgetViewComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-device-control-message-widget-view', standalone: true, imports: [CoreModule, ReactiveFormsModule], template: "<div *ngIf=\"operationSupportedByDevice$ | async\" class=\"input-group p-16\">\n <input\n type=\"text\"\n class=\"form-control\"\n data-cy=\"c8y-device-control-message-widget-view--message-textbox\"\n [(ngModel)]=\"messageToBeSent\"\n placeholder=\"{{ 'Message' | translate }}\"\n />\n <span class=\"input-group-btn\">\n <button\n title=\"{{ 'Send' | translate }}\"\n class=\"btn btn-primary\"\n data-cy=\"c8y-device-control-message-widget-view--send-button\"\n (click)=\"sendMessage()\"\n [disabled]=\"!messageToBeSent\"\n translate\n >\n Send\n </button>\n </span>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.AlertService }, { type: i2.OperationService }, { type: i3.TranslateService }, { type: i4.ContextDashboardComponent, decorators: [{
type: Optional
}] }], propDecorators: { config: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWNvbnRyb2wtbWVzc2FnZS13aWRnZXQtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kZXZpY2UtY29udHJvbC1tZXNzYWdlL2RldmljZS1jb250cm9sLW1lc3NhZ2Utd2lkZ2V0LXZpZXcvZGV2aWNlLWNvbnRyb2wtbWVzc2FnZS13aWRnZXQtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kZXZpY2UtY29udHJvbC1tZXNzYWdlL2RldmljZS1jb250cm9sLW1lc3NhZ2Utd2lkZ2V0LXZpZXcvZGV2aWNlLWNvbnRyb2wtbWVzc2FnZS13aWRnZXQtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBZ0MsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFDTCxZQUFZLEVBQ1osVUFBVSxFQUVWLHFCQUFxQixFQUVyQixPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBVXJELE1BQU0sT0FBTyx1Q0FBdUM7SUFXbEQsWUFDVSxLQUFtQixFQUNuQixTQUEyQixFQUMzQixT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RTthQUN6QyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQzsrR0E1RVUsdUNBQXVDO21HQUF2Qyx1Q0FBdUMscUpDeEJwRCxpb0JBcUJBLDJDRENZLFVBQVUsdTZCQUFFLG1CQUFtQjs7NEZBRTlCLHVDQUF1QztrQkFObkQsU0FBUzsrQkFDRSx3Q0FBd0MsY0FFdEMsSUFBSSxXQUNQLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDOzswQkFpQnZDLFFBQVE7eUNBWkYsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgQ29yZU1vZHVsZSxcbiAgRHluYW1pY0NvbXBvbmVudCxcbiAgRHluYW1pY0NvbXBvbmVudEFsZXJ0LFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yLFxuICBnZXR0ZXh0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbnRleHREYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2NvbnRleHQtZGFzaGJvYXJkJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmV4cG9ydCB0eXBlIERldmljZUNvbnRyb2xNZXNzYWdlV2lkZ2V0Q29uZmlnID0geyBkZXZpY2U/OiBJTWFuYWdlZE9iamVjdCB9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGV2aWNlLWNvbnRyb2wtbWVzc2FnZS13aWRnZXQtdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXZpY2UtY29udHJvbC1tZXNzYWdlLXdpZGdldC12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvcmVNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIERldmljZUNvbnRyb2xNZXNzYWdlV2lkZ2V0Vmlld0NvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgRHluYW1pY0NvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXRcbntcbiAgQElucHV0KCkgY29uZmlnOiBEZXZpY2VDb250cm9sTWVzc2FnZVdpZGdldENvbmZpZztcbiAgb3BlcmF0aW9uU3VwcG9ydGVkQnlEZXZpY2UkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBtZXNzYWdlVG9CZVNlbnQgPSAnJztcbiAgYWxlcnRzOiBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yO1xuICBwcml2YXRlIHJlYWRvbmx5IG9wZXJhdGlvbkF0dHJpYnV0ZSA9ICdjOHlfTWVzc2FnZSc7XG4gIHByaXZhdGUgY3VycmVudERldmljZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SU1hbmFnZWRPYmplY3QgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBvcGVyYXRpb25TdXBwb3J0ZWRCeURldmljZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWxlcnQ6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIG9wZXJhdGlvbjogT3BlcmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhc2hib2FyZDogQ29udGV4dERhc2hib2FyZENvbXBvbmVudFxuICApIHtcbiAgICB0aGlzLm9wZXJhdGlvblN1cHBvcnRlZEJ5RGV2aWNlJCA9IHRoaXMuY3VycmVudERldmljZS5waXBlKFxuICAgICAgbWFwKGRldmljZSA9PiB7XG4gICAgICAgIGlmICghZGV2aWNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZE9wZXJhdGlvbnMgPSBkZXZpY2UuYzh5X1N1cHBvcnRlZE9wZXJhdGlvbnM7XG4gICAgICAgIGlmIChzdXBwb3J0ZWRPcGVyYXRpb25zICYmIEFycmF5LmlzQXJyYXkoc3VwcG9ydGVkT3BlcmF0aW9ucykpIHtcbiAgICAgICAgICByZXR1cm4gc3VwcG9ydGVkT3BlcmF0aW9ucy5pbmNsdWRlcyh0aGlzLm9wZXJhdGlvbkF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhc2hib2FyZD8uaXNEZXZpY2VUeXBlRGFzaGJvYXJkICYmIHRoaXMuZGFzaGJvYXJkPy5jb250ZXh0Py5pZCkge1xuICAgICAgdGhpcy5jdXJyZW50RGV2aWNlLm5leHQodGhpcy5kYXNoYm9hcmQuY29udGV4dCk7XG4gICAgfVxuICAgIHRoaXMub3BlcmF0aW9uU3VwcG9ydGVkQnlEZXZpY2VTdWJzY3JpcHRpb24gPSB0aGlzLm9wZXJhdGlvblN1cHBvcnRlZEJ5RGV2aWNlJC5zdWJzY3JpYmUoXG4gICAgICBzdXBwb3J0ZWQgPT4ge1xuICAgICAgICBpZiAoIXN1cHBvcnRlZCkge1xuICAgICAgICAgIHRoaXMuYWxlcnRzLmFkZEFsZXJ0cyhcbiAgICAgICAgICAgIG5ldyBEeW5hbWljQ29tcG9uZW50QWxlcnQoe1xuICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXG4gICAgICAgICAgICAgIHRleHQ6IGdldHRleHQoJ09wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlJylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0cy5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub3BlcmF0aW9uU3VwcG9ydGVkQnlEZXZpY2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGFzaGJvYXJkPy5pc0RldmljZVR5cGVEYXNoYm9hcmQgJiYgdGhpcy5jb25maWcuZGV2aWNlKSB7XG4gICAgICB0aGlzLmN1cnJlbnREZXZpY2UubmV4dCh0aGlzLmNvbmZpZy5kZXZpY2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKCkge1xuICAgIGNvbnN0IG1zZyA9IHRoaXMubWVzc2FnZVRvQmVTZW50O1xuICAgIGNvbnN0IG9wZXJhdGlvbkRlc2NyaXB0aW9uID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChnZXR0ZXh0KCdTZW5kIG1lc3NhZ2UgXCJ7e21zZ319XCInKSwgeyBtc2cgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub3BlcmF0aW9uLmNyZWF0ZSh7XG4gICAgICAgIGRldmljZUlkOiB0aGlzLmN1cnJlbnREZXZpY2UudmFsdWU/LmlkLFxuICAgICAgICBkZXNjcmlwdGlvbjogb3BlcmF0aW9uRGVzY3JpcHRpb24sXG4gICAgICAgIFt0aGlzLm9wZXJhdGlvbkF0dHJpYnV0ZV06IHsgdGV4dDogbXNnIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hbGVydC5zdWNjZXNzKGdldHRleHQoJ01lc3NhZ2Ugd2lsbCBiZSBzZW50LicpKTtcbiAgICAgIHRoaXMubWVzc2FnZVRvQmVTZW50ID0gJyc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5hbGVydC5hZGRTZXJ2ZXJGYWlsdXJlKGUpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cIm9wZXJhdGlvblN1cHBvcnRlZEJ5RGV2aWNlJCB8IGFzeW5jXCIgY2xhc3M9XCJpbnB1dC1ncm91cCBwLTE2XCI+XG4gIDxpbnB1dFxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgZGF0YS1jeT1cImM4eS1kZXZpY2UtY29udHJvbC1tZXNzYWdlLXdpZGdldC12aWV3LS1tZXNzYWdlLXRleHRib3hcIlxuICAgIFsobmdNb2RlbCldPVwibWVzc2FnZVRvQmVTZW50XCJcbiAgICBwbGFjZWhvbGRlcj1cInt7ICdNZXNzYWdlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gIC8+XG4gIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgPGJ1dHRvblxuICAgICAgdGl0bGU9XCJ7eyAnU2VuZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgZGF0YS1jeT1cImM4eS1kZXZpY2UtY29udHJvbC1tZXNzYWdlLXdpZGdldC12aWV3LS1zZW5kLWJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwic2VuZE1lc3NhZ2UoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIW1lc3NhZ2VUb0JlU2VudFwiXG4gICAgICB0cmFuc2xhdGVcbiAgICA+XG4gICAgICBTZW5kXG4gICAgPC9idXR0b24+XG4gIDwvc3Bhbj5cbjwvZGl2PlxuIl19