2019-09-25 19:37:29 +03:00
|
|
|
<!--
|
|
|
|
|
|
2021-01-11 13:42:16 +02:00
|
|
|
Copyright © 2016-2021 The Thingsboard Authors
|
2019-09-25 19:37:29 +03:00
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
|
limitations under the License.
|
|
|
|
|
|
|
|
|
|
-->
|
2021-06-25 18:41:25 +03:00
|
|
|
<mat-tab-group class="tb-widget-config tb-absolute-fill" [(selectedIndex)]="selectedTab">
|
|
|
|
|
<mat-tab label="{{ 'widget-config.data' | translate }}" *ngIf="widgetType !== widgetTypes.static">
|
2019-10-10 13:00:29 +03:00
|
|
|
<div [formGroup]="dataSettings" class="mat-content mat-padding" fxLayout="column" fxLayoutGap="8px">
|
2020-04-21 11:53:26 +03:00
|
|
|
<div *ngIf="widgetType === widgetTypes.timeseries || widgetType === widgetTypes.alarm" fxFlex="100"
|
|
|
|
|
fxLayout.xs="column" fxLayoutGap="8px" fxLayoutAlign.xs="center" fxLayout="row" fxLayoutAlign="start center">
|
|
|
|
|
<div fxLayout="column" fxLayoutGap="8px" fxFlex.gt-xs>
|
2019-10-31 18:33:51 +02:00
|
|
|
<mat-checkbox formControlName="useDashboardTimewindow">
|
2019-09-25 19:37:29 +03:00
|
|
|
{{ 'widget-config.use-dashboard-timewindow' | translate }}
|
|
|
|
|
</mat-checkbox>
|
2019-10-31 18:33:51 +02:00
|
|
|
<mat-checkbox formControlName="displayTimewindow">
|
2019-09-25 19:37:29 +03:00
|
|
|
{{ 'widget-config.display-timewindow' | translate }}
|
|
|
|
|
</mat-checkbox>
|
|
|
|
|
</div>
|
2020-04-21 11:53:26 +03:00
|
|
|
<section fxLayout="row" fxLayoutAlign="start center" fxLayout.lt-lg="column" fxLayoutAlign.lt-lg="center start"
|
|
|
|
|
fxFlex.gt-xs style="margin-bottom: 16px;">
|
|
|
|
|
<span [ngClass]="{'tb-disabled-label': dataSettings.get('useDashboardTimewindow').value}" translate
|
|
|
|
|
style="padding-right: 8px;">widget-config.timewindow</span>
|
2019-10-10 13:00:29 +03:00
|
|
|
<tb-timewindow asButton="true"
|
2020-02-25 19:11:25 +02:00
|
|
|
isEdit="true"
|
2019-09-25 19:37:29 +03:00
|
|
|
aggregation="{{ widgetType === widgetTypes.timeseries }}"
|
2019-10-10 13:00:29 +03:00
|
|
|
fxFlex formControlName="timewindow"></tb-timewindow>
|
2019-09-25 19:37:29 +03:00
|
|
|
</section>
|
|
|
|
|
</div>
|
2020-02-21 16:31:03 +02:00
|
|
|
<div *ngIf="widgetType === widgetTypes.alarm" fxLayout="column" fxLayoutAlign="center">
|
2020-04-21 11:53:26 +03:00
|
|
|
<div fxLayout="column" fxLayoutAlign="center" fxLayout.gt-xs="row" fxLayoutAlign.gt-xs="start center"
|
|
|
|
|
fxLayoutGap="8px">
|
2020-07-06 14:42:36 +03:00
|
|
|
<mat-form-field fxFlex class="mat-block" floatLabel="always">
|
|
|
|
|
<mat-label translate>alarm.alarm-status-list</mat-label>
|
|
|
|
|
<mat-select formControlName="alarmStatusList" multiple
|
|
|
|
|
placeholder="{{ !dataSettings.get('alarmStatusList').value?.length ? ('alarm.any-status' | translate) : '' }}">
|
2020-02-21 16:31:03 +02:00
|
|
|
<mat-option *ngFor="let searchStatus of alarmSearchStatuses" [value]="searchStatus">
|
2020-07-06 14:42:36 +03:00
|
|
|
{{ alarmSearchStatusTranslationMap.get(searchStatus) | translate }}
|
2020-02-21 16:31:03 +02:00
|
|
|
</mat-option>
|
|
|
|
|
</mat-select>
|
|
|
|
|
</mat-form-field>
|
2020-07-06 14:42:36 +03:00
|
|
|
<mat-form-field fxFlex class="mat-block" floatLabel="always">
|
|
|
|
|
<mat-label translate>alarm.alarm-severity-list</mat-label>
|
|
|
|
|
<mat-select formControlName="alarmSeverityList" multiple
|
|
|
|
|
placeholder="{{ !dataSettings.get('alarmSeverityList').value?.length ? ('alarm.any-severity' | translate) : '' }}">
|
|
|
|
|
<mat-option *ngFor="let alarmSeverity of alarmSeverities" [value]="alarmSeverity">
|
|
|
|
|
{{ alarmSeverityTranslationMap.get(alarmSeverityEnum[alarmSeverity]) | translate }}
|
|
|
|
|
</mat-option>
|
|
|
|
|
</mat-select>
|
2020-02-21 16:31:03 +02:00
|
|
|
</mat-form-field>
|
|
|
|
|
</div>
|
2020-04-21 11:53:26 +03:00
|
|
|
<div fxLayout="column" fxLayoutAlign="center" fxLayout.gt-xs="row" fxLayoutAlign.gt-xs="start center"
|
|
|
|
|
fxLayoutGap="8px">
|
2020-07-06 14:42:36 +03:00
|
|
|
<mat-form-field fxFlex class="mat-block" floatLabel="always">
|
|
|
|
|
<mat-label translate>alarm.alarm-type-list</mat-label>
|
|
|
|
|
<mat-chip-list #alarmTypeChipList formControlName="alarmTypeList">
|
|
|
|
|
<mat-chip *ngFor="let type of alarmTypeList()" [selectable]="true"
|
|
|
|
|
[removable]="true" (removed)="removeAlarmType(type)">
|
|
|
|
|
{{type}}
|
|
|
|
|
<mat-icon matChipRemove>cancel</mat-icon>
|
|
|
|
|
</mat-chip>
|
|
|
|
|
<input placeholder="{{ !dataSettings.get('alarmTypeList').value?.length ? ('alarm.any-type' | translate) : '' }}"
|
|
|
|
|
[matChipInputFor]="alarmTypeChipList"
|
|
|
|
|
[matChipInputSeparatorKeyCodes]="separatorKeysCodes"
|
2021-07-07 17:38:51 +03:00
|
|
|
matChipInputAddOnBlur
|
2020-07-06 14:42:36 +03:00
|
|
|
(matChipInputTokenEnd)="addAlarmType($event)">
|
|
|
|
|
</mat-chip-list>
|
2020-02-21 16:31:03 +02:00
|
|
|
</mat-form-field>
|
2020-07-06 14:42:36 +03:00
|
|
|
<mat-checkbox fxFlex formControlName="searchPropagatedAlarms">
|
|
|
|
|
{{ 'alarm.search-propagated-alarms' | translate }}
|
|
|
|
|
</mat-checkbox>
|
2020-02-21 16:31:03 +02:00
|
|
|
</div>
|
2019-10-10 13:00:29 +03:00
|
|
|
</div>
|
|
|
|
|
<mat-expansion-panel class="tb-datasources" *ngIf="widgetType !== widgetTypes.rpc &&
|
|
|
|
|
widgetType !== widgetTypes.alarm &&
|
2019-10-21 19:57:18 +03:00
|
|
|
modelValue?.isDataEnabled" [expanded]="true">
|
2019-10-10 13:00:29 +03:00
|
|
|
<mat-expansion-panel-header>
|
|
|
|
|
<mat-panel-title fxLayout="column">
|
|
|
|
|
<div class="tb-panel-title" translate>widget-config.datasources</div>
|
2019-10-21 19:57:18 +03:00
|
|
|
<div *ngIf="modelValue?.typeParameters && modelValue?.typeParameters.maxDatasources > -1"
|
2020-04-21 11:53:26 +03:00
|
|
|
class="tb-panel-hint">{{ 'widget-config.maximum-datasources' | translate:{count: modelValue?.typeParameters.maxDatasources} }}</div>
|
2019-10-10 13:00:29 +03:00
|
|
|
</mat-panel-title>
|
|
|
|
|
</mat-expansion-panel-header>
|
2019-12-23 14:36:44 +02:00
|
|
|
<div *ngIf="datasourcesFormArray().length === 0; else datasourcesTemplate">
|
2019-10-10 13:00:29 +03:00
|
|
|
<span translate fxLayoutAlign="center center"
|
|
|
|
|
class="tb-prompt">datasource.add-datasource-prompt</span>
|
|
|
|
|
</div>
|
|
|
|
|
<ng-template #datasourcesTemplate>
|
|
|
|
|
<div fxFlex fxLayout="row" fxLayoutAlign="start center">
|
2021-03-02 12:04:45 +02:00
|
|
|
<span style="width: 60px;"></span>
|
2019-10-10 13:00:29 +03:00
|
|
|
<div fxFlex fxLayout="row" fxLayoutAlign="start center"
|
|
|
|
|
style="padding: 0 0 0 10px; margin: 5px;">
|
2021-03-02 12:04:45 +02:00
|
|
|
<span translate style="min-width: 120px;">widget-config.datasource-type</span>
|
2019-10-10 13:00:29 +03:00
|
|
|
<span fxHide fxShow.gt-sm translate fxFlex
|
|
|
|
|
style="padding-left: 10px;">widget-config.datasource-parameters</span>
|
|
|
|
|
<span style="min-width: 40px;"></span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div style="overflow: auto; padding-bottom: 15px;">
|
2021-03-02 12:04:45 +02:00
|
|
|
<mat-list dndDropzone dndEffectAllowed="move"
|
|
|
|
|
(dndDrop)="onDatasourceDrop($event)"
|
|
|
|
|
[dndDisableIf]="disabled" formArrayName="datasources">
|
|
|
|
|
<mat-list-item dndPlaceholderRef
|
|
|
|
|
class="dndPlaceholder">
|
|
|
|
|
</mat-list-item>
|
|
|
|
|
<mat-list-item *ngFor="let datasourceControl of datasourcesFormArray().controls; let $index = index;"
|
|
|
|
|
[dndDraggable]="datasourceControl.value"
|
|
|
|
|
(dndMoved)="dndDatasourceMoved($index)"
|
|
|
|
|
[dndDisableIf]="disabled"
|
|
|
|
|
dndEffectAllowed="move">
|
|
|
|
|
<div fxFlex fxLayout="row" fxLayoutAlign="start center">
|
|
|
|
|
<div style="width: 60px;">
|
|
|
|
|
<button *ngIf="!disabled" mat-icon-button color="primary"
|
|
|
|
|
class="handle"
|
|
|
|
|
style="min-width: 40px; margin: 0"
|
|
|
|
|
dndHandle
|
|
|
|
|
matTooltip="{{ 'action.drag' | translate }}"
|
|
|
|
|
matTooltipPosition="above">
|
|
|
|
|
<mat-icon>drag_handle</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
<span>{{$index + 1}}.</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="mat-elevation-z4" fxFlex
|
|
|
|
|
fxLayout="row"
|
|
|
|
|
fxLayoutAlign="start center"
|
|
|
|
|
style="padding: 0 0 0 10px; margin: 5px;">
|
|
|
|
|
<section fxFlex
|
|
|
|
|
fxLayout="column"
|
|
|
|
|
fxLayoutAlign="center"
|
|
|
|
|
fxLayout.gt-sm="row"
|
|
|
|
|
fxLayoutAlign.gt-sm="start center">
|
|
|
|
|
<mat-form-field class="tb-datasource-type">
|
|
|
|
|
<mat-select [formControl]="datasourceControl.get('type')">
|
|
|
|
|
<mat-option *ngFor="let datasourceType of datasourceTypes" [value]="datasourceType">
|
|
|
|
|
{{ datasourceTypesTranslations.get(datasourceType) | translate }}
|
|
|
|
|
</mat-option>
|
|
|
|
|
</mat-select>
|
2019-10-17 18:23:53 +03:00
|
|
|
</mat-form-field>
|
2021-03-02 12:04:45 +02:00
|
|
|
<section fxLayout="column" class="tb-datasource" [ngSwitch]="datasourceControl.get('type').value">
|
|
|
|
|
<ng-template [ngSwitchCase]="datasourceType.function">
|
|
|
|
|
<mat-form-field floatLabel="always"
|
|
|
|
|
class="tb-datasource-name" style="min-width: 200px;">
|
|
|
|
|
<mat-label></mat-label>
|
|
|
|
|
<input matInput
|
|
|
|
|
placeholder="{{ 'datasource.label' | translate }}"
|
|
|
|
|
[formControl]="datasourceControl.get('name')">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
</ng-template>
|
|
|
|
|
<ng-template [ngSwitchCase]="datasourceControl.get('type').value === datasourceType.entity ||
|
|
|
|
|
datasourceControl.get('type').value === datasourceType.entityCount ? datasourceControl.get('type').value : ''">
|
|
|
|
|
<tb-entity-alias-select
|
|
|
|
|
[showLabel]="true"
|
|
|
|
|
[tbRequired]="true"
|
|
|
|
|
[aliasController]="aliasController"
|
|
|
|
|
[formControl]="datasourceControl.get('entityAliasId')"
|
|
|
|
|
[callbacks]="widgetConfigCallbacks">
|
|
|
|
|
</tb-entity-alias-select>
|
|
|
|
|
<tb-filter-select
|
|
|
|
|
[showLabel]="true"
|
|
|
|
|
[aliasController]="aliasController"
|
|
|
|
|
[formControl]="datasourceControl.get('filterId')"
|
|
|
|
|
[callbacks]="widgetConfigCallbacks">
|
|
|
|
|
</tb-filter-select>
|
|
|
|
|
<mat-form-field *ngIf="datasourceControl.get('type').value === datasourceType.entityCount"
|
|
|
|
|
floatLabel="always"
|
|
|
|
|
class="tb-datasource-name no-border-top" style="min-width: 200px;">
|
|
|
|
|
<mat-label></mat-label>
|
|
|
|
|
<input matInput
|
|
|
|
|
placeholder="{{ 'datasource.label' | translate }}"
|
|
|
|
|
[formControl]="datasourceControl.get('name')">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
</ng-template>
|
2020-06-30 19:37:50 +03:00
|
|
|
</section>
|
2021-03-02 12:04:45 +02:00
|
|
|
<tb-data-keys class="tb-data-keys" fxFlex
|
|
|
|
|
[widgetType]="widgetType"
|
|
|
|
|
[datasourceType]="datasourceControl.get('type').value"
|
|
|
|
|
[maxDataKeys]="modelValue?.typeParameters?.maxDataKeys"
|
|
|
|
|
[optDataKeys]="modelValue?.typeParameters?.dataKeysOptional"
|
|
|
|
|
[aliasController]="aliasController"
|
|
|
|
|
[datakeySettingsSchema]="modelValue?.dataKeySettingsSchema"
|
|
|
|
|
[callbacks]="widgetConfigCallbacks"
|
|
|
|
|
[entityAliasId]="datasourceControl.get('entityAliasId').value"
|
|
|
|
|
[formControl]="datasourceControl.get('dataKeys')">
|
|
|
|
|
</tb-data-keys>
|
|
|
|
|
</section>
|
|
|
|
|
<button [disabled]="isLoading$ | async"
|
|
|
|
|
type="button"
|
|
|
|
|
mat-icon-button color="primary"
|
|
|
|
|
style="min-width: 40px;"
|
|
|
|
|
(click)="removeDatasource($index)"
|
|
|
|
|
matTooltip="{{ 'widget-config.remove-datasource' | translate }}"
|
|
|
|
|
matTooltipPosition="above">
|
|
|
|
|
<mat-icon>close</mat-icon>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</mat-list-item>
|
|
|
|
|
</mat-list>
|
2019-10-10 13:00:29 +03:00
|
|
|
</div>
|
|
|
|
|
</ng-template>
|
|
|
|
|
<div fxFlex fxLayout="row" fxLayoutAlign="start center">
|
|
|
|
|
<button [disabled]="isLoading$ | async"
|
2019-10-31 10:06:57 +02:00
|
|
|
type="button"
|
2020-04-21 11:53:26 +03:00
|
|
|
mat-raised-button color="primary"
|
2019-10-21 19:57:18 +03:00
|
|
|
[fxShow]="modelValue?.typeParameters &&
|
2019-12-23 14:36:44 +02:00
|
|
|
(modelValue?.typeParameters.maxDatasources == -1 || datasourcesFormArray().controls.length < modelValue?.typeParameters.maxDatasources)"
|
2019-10-10 13:00:29 +03:00
|
|
|
(click)="addDatasource()"
|
|
|
|
|
matTooltip="{{ 'widget-config.add-datasource' | translate }}"
|
|
|
|
|
matTooltipPosition="above">
|
|
|
|
|
<mat-icon>add</mat-icon>
|
|
|
|
|
<span translate>action.add</span>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</mat-expansion-panel>
|
|
|
|
|
<mat-expansion-panel class="tb-datasources" *ngIf="widgetType === widgetTypes.rpc &&
|
2019-10-21 19:57:18 +03:00
|
|
|
modelValue?.isDataEnabled" [expanded]="true">
|
2019-10-10 13:00:29 +03:00
|
|
|
<mat-expansion-panel-header>
|
|
|
|
|
<mat-panel-title>
|
|
|
|
|
{{ 'widget-config.target-device' | translate }}
|
|
|
|
|
</mat-panel-title>
|
|
|
|
|
</mat-expansion-panel-header>
|
2019-10-11 19:22:03 +03:00
|
|
|
<div [formGroup]="targetDeviceSettings" style="padding: 0 5px;">
|
|
|
|
|
<tb-entity-alias-select fxFlex
|
2019-10-21 19:57:18 +03:00
|
|
|
[tbRequired]="!widgetEditMode"
|
2019-10-11 19:22:03 +03:00
|
|
|
[aliasController]="aliasController"
|
|
|
|
|
[allowedEntityTypes]="[entityTypes.DEVICE]"
|
|
|
|
|
[callbacks]="widgetConfigCallbacks"
|
|
|
|
|
formControlName="targetDeviceAliasId">
|
|
|
|
|
</tb-entity-alias-select>
|
2019-10-10 13:00:29 +03:00
|
|
|
</div>
|
|
|
|
|
</mat-expansion-panel>
|
2019-10-24 19:52:19 +03:00
|
|
|
<mat-expansion-panel class="tb-datasources" *ngIf="widgetType === widgetTypes.alarm &&
|
|
|
|
|
modelValue?.isDataEnabled" [expanded]="true">
|
|
|
|
|
<mat-expansion-panel-header>
|
|
|
|
|
<mat-panel-title>
|
|
|
|
|
{{ 'widget-config.alarm-source' | translate }}
|
|
|
|
|
</mat-panel-title>
|
|
|
|
|
</mat-expansion-panel-header>
|
|
|
|
|
<div [formGroup]="alarmSourceSettings" style="padding: 0 5px;">
|
|
|
|
|
<section fxFlex
|
|
|
|
|
fxLayout="column"
|
|
|
|
|
fxLayoutAlign="center"
|
|
|
|
|
fxLayout.gt-sm="row"
|
|
|
|
|
fxLayoutAlign.gt-sm="start center">
|
|
|
|
|
<mat-form-field class="tb-datasource-type">
|
2020-04-21 11:53:26 +03:00
|
|
|
<mat-select formControlName="type">
|
2019-10-24 19:52:19 +03:00
|
|
|
<mat-option *ngFor="let datasourceType of datasourceTypes" [value]="datasourceType">
|
|
|
|
|
{{ datasourceTypesTranslations.get(datasourceType) | translate }}
|
|
|
|
|
</mat-option>
|
|
|
|
|
</mat-select>
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
<section class="tb-datasource" [ngSwitch]="alarmSourceSettings.get('type').value">
|
|
|
|
|
<ng-template [ngSwitchCase]="datasourceType.entity">
|
|
|
|
|
<tb-entity-alias-select
|
2020-06-30 19:37:50 +03:00
|
|
|
[showLabel]="true"
|
2019-10-24 19:52:19 +03:00
|
|
|
[tbRequired]="alarmSourceSettings.get('type').value === datasourceType.entity"
|
|
|
|
|
[aliasController]="aliasController"
|
|
|
|
|
formControlName="entityAliasId"
|
|
|
|
|
[callbacks]="widgetConfigCallbacks">
|
|
|
|
|
</tb-entity-alias-select>
|
2020-06-30 19:37:50 +03:00
|
|
|
<tb-filter-select
|
|
|
|
|
[showLabel]="true"
|
|
|
|
|
[aliasController]="aliasController"
|
|
|
|
|
formControlName="filterId"
|
|
|
|
|
[callbacks]="widgetConfigCallbacks">
|
|
|
|
|
</tb-filter-select>
|
2019-10-24 19:52:19 +03:00
|
|
|
</ng-template>
|
|
|
|
|
</section>
|
|
|
|
|
<tb-data-keys class="tb-data-keys" fxFlex
|
|
|
|
|
[widgetType]="widgetType"
|
|
|
|
|
[datasourceType]="alarmSourceSettings.get('type').value"
|
|
|
|
|
[aliasController]="aliasController"
|
|
|
|
|
[datakeySettingsSchema]="modelValue?.dataKeySettingsSchema"
|
|
|
|
|
[callbacks]="widgetConfigCallbacks"
|
|
|
|
|
[entityAliasId]="alarmSourceSettings.get('entityAliasId').value"
|
|
|
|
|
formControlName="dataKeys">
|
|
|
|
|
</tb-data-keys>
|
|
|
|
|
</section>
|
|
|
|
|
</div>
|
|
|
|
|
</mat-expansion-panel>
|
|
|
|
|
</div>
|
|
|
|
|
</mat-tab>
|
|
|
|
|
<mat-tab label="{{ 'widget-config.settings' | translate }}">
|
2020-04-21 11:53:26 +03:00
|
|
|
<div class="mat-content mat-padding" fxLayout="column" fxLayoutGap="8px">
|
2019-10-24 19:52:19 +03:00
|
|
|
<div [formGroup]="widgetSettings" fxLayout="column" fxLayoutGap="8px">
|
|
|
|
|
<span translate>widget-config.general-settings</span>
|
2020-04-21 11:53:26 +03:00
|
|
|
<div fxLayout.xs="column" fxLayoutAlign.xs="center" fxLayout="row" fxLayoutAlign="start center">
|
|
|
|
|
<div fxLayout="column" fxLayoutAlign="center" fxFlex.sm="40%" fxFlex.gt-sm="30%">
|
|
|
|
|
<mat-form-field fxFlex class="mat-block">
|
|
|
|
|
<mat-label translate>widget-config.title</mat-label>
|
|
|
|
|
<input matInput formControlName="title">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
<mat-form-field fxFlex>
|
|
|
|
|
<mat-label translate>widget-config.title-tooltip</mat-label>
|
|
|
|
|
<input matInput formControlName="titleTooltip">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
</div>
|
2019-10-24 19:52:19 +03:00
|
|
|
<div fxFlex [fxShow]="widgetSettings.get('showTitle').value">
|
|
|
|
|
<tb-json-object-edit
|
|
|
|
|
[editorStyle]="{minHeight: '100px'}"
|
|
|
|
|
required
|
|
|
|
|
label="{{ 'widget-config.title-style' | translate }}"
|
|
|
|
|
formControlName="titleStyle"
|
|
|
|
|
></tb-json-object-edit>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2020-04-21 11:53:26 +03:00
|
|
|
<div fxLayout="column" fxLayoutAlign="center" fxLayout.gt-md="row" fxLayoutAlign.gt-md="start center" fxFlex="100%"
|
2019-10-24 19:52:19 +03:00
|
|
|
fxLayoutGap="8px">
|
2020-04-21 11:53:26 +03:00
|
|
|
<div fxLayout.xs="column" fxLayoutAlign.xs="center" fxLayout="row" fxLayoutAlign="start center"
|
|
|
|
|
fxLayoutGap="8px" fxFlex.gt-md>
|
|
|
|
|
<mat-checkbox fxFlex formControlName="showTitleIcon">
|
2019-10-24 19:52:19 +03:00
|
|
|
{{ 'widget-config.display-icon' | translate }}
|
|
|
|
|
</mat-checkbox>
|
2020-04-21 11:53:26 +03:00
|
|
|
<tb-material-icon-select fxFlex
|
2019-10-24 19:52:19 +03:00
|
|
|
formControlName="titleIcon">
|
|
|
|
|
</tb-material-icon-select>
|
|
|
|
|
</div>
|
2020-04-21 11:53:26 +03:00
|
|
|
<div fxLayout.xs="column" fxLayoutAlign.xs="center" fxLayout="row" fxLayoutAlign="start center"
|
|
|
|
|
fxLayoutGap="8px" fxFlex.gt-md>
|
|
|
|
|
<tb-color-input fxFlex
|
|
|
|
|
label="{{'widget-config.icon-color' | translate}}"
|
|
|
|
|
icon="format_color_fill"
|
|
|
|
|
openOnInput
|
|
|
|
|
formControlName="iconColor">
|
|
|
|
|
</tb-color-input>
|
|
|
|
|
<mat-form-field fxFlex>
|
|
|
|
|
<mat-label translate>widget-config.icon-size</mat-label>
|
|
|
|
|
<input matInput formControlName="iconSize">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
</div>
|
2019-10-24 19:52:19 +03:00
|
|
|
</div>
|
2020-04-21 11:53:26 +03:00
|
|
|
<div fxLayout.xs="column" fxLayoutAlign.xs="center" fxLayout="row" fxLayoutAlign="start center"
|
2019-10-24 19:52:19 +03:00
|
|
|
fxLayoutGap="8px">
|
2020-04-21 11:53:26 +03:00
|
|
|
<div fxLayout="column" fxLayoutAlign="center" fxLayoutGap="8px" fxFlex.sm="40%" fxFlex.gt-sm="30%">
|
2019-10-24 19:52:19 +03:00
|
|
|
<mat-checkbox formControlName="showTitle">
|
|
|
|
|
{{ 'widget-config.display-title' | translate }}
|
|
|
|
|
</mat-checkbox>
|
|
|
|
|
<mat-checkbox formControlName="dropShadow">
|
|
|
|
|
{{ 'widget-config.drop-shadow' | translate }}
|
|
|
|
|
</mat-checkbox>
|
|
|
|
|
<mat-checkbox formControlName="enableFullscreen">
|
|
|
|
|
{{ 'widget-config.enable-fullscreen' | translate }}
|
|
|
|
|
</mat-checkbox>
|
|
|
|
|
</div>
|
|
|
|
|
<div fxFlex>
|
|
|
|
|
<tb-json-object-edit
|
|
|
|
|
[editorStyle]="{minHeight: '100px'}"
|
|
|
|
|
required
|
|
|
|
|
label="{{ 'widget-config.widget-style' | translate }}"
|
|
|
|
|
formControlName="widgetStyle"
|
|
|
|
|
></tb-json-object-edit>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2020-04-21 11:53:26 +03:00
|
|
|
<div fxLayout="column" fxLayoutAlign="center" fxLayout.gt-md="row" fxLayoutAlign.gt-md="start center"
|
|
|
|
|
fxFlex="100%" fxLayoutGap="8px">
|
|
|
|
|
<div fxLayout.xs="column" fxLayoutAlign.xs="center" fxLayout="row" fxLayoutAlign="start center"
|
|
|
|
|
fxLayoutGap="8px" fxFlex.gt-md>
|
|
|
|
|
<tb-color-input fxFlex
|
|
|
|
|
label="{{'widget-config.background-color' | translate}}"
|
|
|
|
|
icon="format_color_fill"
|
|
|
|
|
openOnInput
|
|
|
|
|
formControlName="backgroundColor">
|
|
|
|
|
</tb-color-input>
|
|
|
|
|
<tb-color-input fxFlex
|
|
|
|
|
label="{{'widget-config.text-color' | translate}}"
|
|
|
|
|
icon="format_color_fill"
|
|
|
|
|
openOnInput
|
|
|
|
|
formControlName="color">
|
|
|
|
|
</tb-color-input>
|
|
|
|
|
</div>
|
|
|
|
|
<div fxLayout.xs="column" fxLayoutAlign.xs="center" fxLayout="row" fxLayoutAlign="start center"
|
|
|
|
|
fxLayoutGap="8px" fxFlex.gt-md>
|
|
|
|
|
<mat-form-field fxFlex>
|
|
|
|
|
<mat-label translate>widget-config.padding</mat-label>
|
|
|
|
|
<input matInput formControlName="padding">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
<mat-form-field fxFlex>
|
|
|
|
|
<mat-label translate>widget-config.margin</mat-label>
|
|
|
|
|
<input matInput formControlName="margin">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
</div>
|
2019-10-24 19:52:19 +03:00
|
|
|
</div>
|
2020-04-21 11:53:26 +03:00
|
|
|
<div fxLayout.xs="column" fxLayoutAlign.xs="center" fxLayout="row" fxLayoutAlign="start center"
|
2019-10-24 19:52:19 +03:00
|
|
|
fxLayoutGap="8px">
|
|
|
|
|
<mat-form-field fxFlex>
|
|
|
|
|
<mat-label translate>widget-config.units</mat-label>
|
|
|
|
|
<input matInput formControlName="units">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
<mat-form-field fxFlex>
|
|
|
|
|
<mat-label translate>widget-config.decimals</mat-label>
|
|
|
|
|
<input matInput formControlName="decimals" type="number" min="0" max="15" step="1">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
</div>
|
2020-04-21 11:53:26 +03:00
|
|
|
<div [fxShow]="widgetType === widgetTypes.timeseries || widgetType === widgetTypes.latest"
|
|
|
|
|
fxLayout.xs="column" fxLayoutAlign.xs="center" fxLayout="row" fxLayoutAlign="start center"
|
|
|
|
|
fxLayoutGap="8px" fxFlex="100%">
|
|
|
|
|
<mat-checkbox fxFlex.gt-xs formControlName="showLegend">
|
2019-10-24 19:52:19 +03:00
|
|
|
{{ 'widget-config.display-legend' | translate }}
|
|
|
|
|
</mat-checkbox>
|
2020-04-21 11:53:26 +03:00
|
|
|
<section fxFlex.gt-xs fxLayout="row" fxLayoutAlign="start center" style="margin-bottom: 16px;">
|
2019-10-24 19:52:19 +03:00
|
|
|
<tb-legend-config formControlName="legendConfig">
|
|
|
|
|
</tb-legend-config>
|
|
|
|
|
</section>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div [formGroup]="layoutSettings" fxLayout="column" fxLayoutGap="8px">
|
|
|
|
|
<span translate>widget-config.mobile-mode-settings</span>
|
2020-04-21 11:53:26 +03:00
|
|
|
<div fxLayout.xs="column" fxLayoutAlign.xs="center" fxLayout="row" fxLayoutAlign="start center"
|
2019-10-24 19:52:19 +03:00
|
|
|
fxLayoutGap="8px">
|
|
|
|
|
<mat-form-field fxFlex>
|
|
|
|
|
<mat-label translate>widget-config.order</mat-label>
|
|
|
|
|
<input matInput formControlName="mobileOrder" type="number" step="1">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
<mat-form-field fxFlex>
|
|
|
|
|
<mat-label translate>widget-config.height</mat-label>
|
|
|
|
|
<input matInput formControlName="mobileHeight" type="number" min="1" max="10" step="1">
|
|
|
|
|
</mat-form-field>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2019-09-25 19:37:29 +03:00
|
|
|
</div>
|
|
|
|
|
</mat-tab>
|
2019-10-21 19:57:18 +03:00
|
|
|
<mat-tab *ngIf="displayAdvanced()" label="{{ 'widget-config.advanced' | translate }}">
|
|
|
|
|
<div [formGroup]="advancedSettings" class="mat-content mat-padding tb-advanced-widget-config"
|
|
|
|
|
fxLayout="column">
|
|
|
|
|
<tb-json-form
|
|
|
|
|
formControlName="settings">
|
|
|
|
|
</tb-json-form>
|
|
|
|
|
</div>
|
|
|
|
|
</mat-tab>
|
2019-10-24 19:52:19 +03:00
|
|
|
<mat-tab label="{{ 'widget-config.actions' | translate }}" [formGroup]="actionsSettings">
|
|
|
|
|
<tb-manage-widget-actions
|
|
|
|
|
[callbacks]="widgetConfigCallbacks"
|
2021-05-20 13:25:34 +03:00
|
|
|
[widgetType] = "modelValue.widgetType"
|
2019-10-24 19:52:19 +03:00
|
|
|
formControlName="actionsData">
|
|
|
|
|
</tb-manage-widget-actions>
|
2019-09-25 19:37:29 +03:00
|
|
|
</mat-tab>
|
|
|
|
|
</mat-tab-group>
|