|
|
|
@ -16,7 +16,7 @@ |
|
|
|
|
|
|
|
--> |
|
|
|
<form [formGroup]="timewindowForm" class="mat-content"> |
|
|
|
<mat-tab-group [ngClass]="{'tb-headless': historyOnly}" |
|
|
|
<mat-tab-group [class.tb-headless]="historyOnly" |
|
|
|
(selectedTabChange)="onTimewindowTypeChange()" [(selectedIndex)]="timewindow.selectedTab"> |
|
|
|
<mat-tab label="{{ 'timewindow.realtime' | translate }}"> |
|
|
|
<div class="tb-flex column"> |
|
|
|
@ -24,24 +24,18 @@ |
|
|
|
<div class="tb-form-panel-title">{{ 'timewindow.time-range' | translate }}</div> |
|
|
|
<div class="tb-flex align-center space-between"> |
|
|
|
<ng-container formGroupName="realtime"> |
|
|
|
<tb-toggle-select *ngIf="!quickIntervalOnly" |
|
|
|
[fxShow]="isEdit || (!timewindow.hideLastInterval && !timewindow.hideQuickInterval)" |
|
|
|
<tb-toggle-select *ngIf="!quickIntervalOnly || isEdit || (!timewindow.hideLastInterval && !timewindow.hideQuickInterval)" |
|
|
|
appearance="fill" [options]="realtimeTimewindowOptions" formControlName="realtimeType" |
|
|
|
style="max-width: 100%"> |
|
|
|
</tb-toggle-select> |
|
|
|
</ng-container> |
|
|
|
|
|
|
|
<tb-timezone-select fxFlex [fxShow]="!timewindow.hideTimezone" |
|
|
|
localBrowserTimezonePlaceholderOnEmpty="true" |
|
|
|
formControlName="timezone" |
|
|
|
subscriptSizing="dynamic" |
|
|
|
appearance="outline"> |
|
|
|
</tb-timezone-select> |
|
|
|
<ng-container *ngTemplateOutlet="timezoneSelection"> |
|
|
|
</ng-container> |
|
|
|
</div> |
|
|
|
|
|
|
|
<ng-container formGroupName="realtime"> |
|
|
|
<ng-container *ngIf="isEdit || !timewindow.hideLastInterval && |
|
|
|
timewindowForm.get('realtime.realtimeType').value === realtimeTypes.LAST_INTERVAL"> |
|
|
|
<ng-container *ngIf="timewindowForm.get('realtime.realtimeType').value === realtimeTypes.LAST_INTERVAL"> |
|
|
|
<tb-timeinterval |
|
|
|
formControlName="timewindowMs" |
|
|
|
subscriptSizing="dynamic" |
|
|
|
@ -51,9 +45,9 @@ |
|
|
|
</tb-timeinterval> |
|
|
|
</ng-container> |
|
|
|
|
|
|
|
<ng-container *ngIf="!timewindow.hideQuickInterval && |
|
|
|
timewindowForm.get('realtime.realtimeType').value === realtimeTypes.INTERVAL"> |
|
|
|
<ng-container *ngIf="timewindowForm.get('realtime.realtimeType').value === realtimeTypes.INTERVAL"> |
|
|
|
<tb-quick-time-interval |
|
|
|
displayLabel="false" |
|
|
|
formControlName="quickInterval" |
|
|
|
onlyCurrentInterval="true" |
|
|
|
subscriptSizing="dynamic" |
|
|
|
@ -69,148 +63,136 @@ |
|
|
|
</div> |
|
|
|
</mat-tab> |
|
|
|
<mat-tab label="{{ 'timewindow.history' | translate }}"> |
|
|
|
<section fxLayout="row"> |
|
|
|
<section *ngIf="isEdit" fxLayout="column" fxLayoutAlign="start center" |
|
|
|
style="padding-top: 8px; padding-left: 16px;"> |
|
|
|
<label class="tb-small hide-label" translate>timewindow.hide</label> |
|
|
|
<mat-checkbox [ngModelOptions]="{standalone: true}" [(ngModel)]="timewindow.hideInterval" |
|
|
|
(ngModelChange)="onHideIntervalChanged()"></mat-checkbox> |
|
|
|
</section> |
|
|
|
<section fxLayout="column" fxFlex [fxShow]="isEdit || !timewindow.hideInterval"> |
|
|
|
<div formGroupName="history" class="mat-content mat-padding" style="padding-top: 8px;"> |
|
|
|
<mat-radio-group formControlName="historyType"> |
|
|
|
<mat-radio-button *ngIf="forAllTimeEnabled" [value]="historyTypes.FOR_ALL_TIME" color="primary"> |
|
|
|
<section fxLayout="column"> |
|
|
|
<span translate>timewindow.for-all-time</span> |
|
|
|
</section> |
|
|
|
</mat-radio-button> |
|
|
|
<mat-radio-button [value]="historyTypes.LAST_INTERVAL" color="primary"> |
|
|
|
<section fxLayout="column"> |
|
|
|
<span translate>timewindow.last</span> |
|
|
|
<tb-timeinterval |
|
|
|
formControlName="timewindowMs" |
|
|
|
predefinedName="timewindow.last" |
|
|
|
class="history-time-input" |
|
|
|
subscriptSizing="dynamic" |
|
|
|
appearance="outline" |
|
|
|
[fxShow]="timewindowForm.get('history.historyType').value === historyTypes.LAST_INTERVAL" |
|
|
|
[required]="timewindow.selectedTab === timewindowTypes.HISTORY && |
|
|
|
timewindowForm.get('history.historyType').value === historyTypes.LAST_INTERVAL" |
|
|
|
style="padding-top: 8px;"></tb-timeinterval> |
|
|
|
</section> |
|
|
|
</mat-radio-button> |
|
|
|
<mat-radio-button [value]="historyTypes.FIXED" color="primary"> |
|
|
|
<section fxLayout="column"> |
|
|
|
<span translate>timewindow.time-period</span> |
|
|
|
<tb-datetime-period |
|
|
|
formControlName="fixedTimewindow" |
|
|
|
class="history-time-input" |
|
|
|
[fxShow]="timewindowForm.get('history.historyType').value === historyTypes.FIXED" |
|
|
|
[required]="timewindow.selectedTab === timewindowTypes.HISTORY && |
|
|
|
timewindowForm.get('history.historyType').value === historyTypes.FIXED" |
|
|
|
style="padding-top: 8px;"></tb-datetime-period> |
|
|
|
</section> |
|
|
|
</mat-radio-button> |
|
|
|
<mat-radio-button [value]="historyTypes.INTERVAL" color="primary"> |
|
|
|
<section fxLayout="column"> |
|
|
|
<span translate>timewindow.interval</span> |
|
|
|
<tb-quick-time-interval |
|
|
|
formControlName="quickInterval" |
|
|
|
class="history-time-input" |
|
|
|
subscriptSizing="dynamic" |
|
|
|
appearance="outline" |
|
|
|
[fxShow]="timewindowForm.get('history.historyType').value === historyTypes.INTERVAL" |
|
|
|
[required]="timewindow.selectedTab === timewindowTypes.HISTORY && |
|
|
|
timewindowForm.get('history.historyType').value === historyTypes.INTERVAL" |
|
|
|
style="padding-top: 8px"></tb-quick-time-interval> |
|
|
|
</section> |
|
|
|
</mat-radio-button> |
|
|
|
</mat-radio-group> |
|
|
|
<div class="tb-flex column"> |
|
|
|
<section class="tb-form-panel stroked" [fxShow]="isEdit || !timewindow.hideInterval"> |
|
|
|
<div class="tb-form-panel-title">{{ 'timewindow.time-range' | translate }}</div> |
|
|
|
<div class="tb-flex align-center space-between"> |
|
|
|
<ng-container formGroupName="history"> |
|
|
|
<tb-toggle-select appearance="fill" [options]="historyTimewindowOptions" formControlName="historyType" |
|
|
|
style="max-width: 100%"> |
|
|
|
</tb-toggle-select> |
|
|
|
</ng-container> |
|
|
|
|
|
|
|
<ng-container *ngTemplateOutlet="timezoneSelection"> |
|
|
|
</ng-container> |
|
|
|
</div> |
|
|
|
|
|
|
|
<ng-container formGroupName="history" *ngIf="isEdit || !timewindow.hideInterval && |
|
|
|
timewindowForm.get('history.historyType').value !== historyTypes.FOR_ALL_TIME"> |
|
|
|
<ng-container *ngIf="timewindowForm.get('history.historyType').value === historyTypes.LAST_INTERVAL"> |
|
|
|
<tb-timeinterval |
|
|
|
formControlName="timewindowMs" |
|
|
|
subscriptSizing="dynamic" |
|
|
|
appearance="outline" |
|
|
|
[required]="timewindow.selectedTab === timewindowTypes.HISTORY && |
|
|
|
timewindowForm.get('history.historyType').value === historyTypes.LAST_INTERVAL"> |
|
|
|
</tb-timeinterval> |
|
|
|
</ng-container> |
|
|
|
|
|
|
|
<ng-container *ngIf="timewindowForm.get('history.historyType').value === historyTypes.FIXED"> |
|
|
|
<tb-datetime-period |
|
|
|
formControlName="fixedTimewindow" |
|
|
|
class="history-time-input" |
|
|
|
[required]="timewindow.selectedTab === timewindowTypes.HISTORY && |
|
|
|
timewindowForm.get('history.historyType').value === historyTypes.FIXED"> |
|
|
|
</tb-datetime-period> |
|
|
|
</ng-container> |
|
|
|
|
|
|
|
<ng-container *ngIf="timewindowForm.get('history.historyType').value === historyTypes.INTERVAL"> |
|
|
|
<tb-quick-time-interval |
|
|
|
displayLabel="false" |
|
|
|
formControlName="quickInterval" |
|
|
|
subscriptSizing="dynamic" |
|
|
|
appearance="outline" |
|
|
|
[required]="timewindow.selectedTab === timewindowTypes.HISTORY && |
|
|
|
timewindowForm.get('history.historyType').value === historyTypes.INTERVAL"> |
|
|
|
</tb-quick-time-interval> |
|
|
|
</ng-container> |
|
|
|
</ng-container> |
|
|
|
</section> |
|
|
|
</section> |
|
|
|
<ng-container *ngTemplateOutlet="aggregationConfig"> |
|
|
|
</ng-container> |
|
|
|
<ng-container *ngTemplateOutlet="aggregationConfig"> |
|
|
|
</ng-container> |
|
|
|
</div> |
|
|
|
</mat-tab> |
|
|
|
</mat-tab-group> |
|
|
|
<ng-template #aggregationConfig> |
|
|
|
<div *ngIf="aggregation" formGroupName="aggregation" class="tb-flex column"> |
|
|
|
<section class="tb-form-panel stroked" [fxShow]="isEdit || !timewindow.hideAggregation"> |
|
|
|
<div class="tb-form-panel-title">{{ 'aggregation.aggregation' | translate }}</div> |
|
|
|
<mat-form-field subscriptSizing="dynamic" appearance="outline"> |
|
|
|
<mat-select formControlName="type" style="min-width: 150px;"> |
|
|
|
<mat-option *ngFor="let aggregation of aggregations" [value]="aggregation"> |
|
|
|
{{ aggregationTypesTranslations.get(aggregationTypes[aggregation]) | translate }} |
|
|
|
</mat-option> |
|
|
|
</mat-select> |
|
|
|
</mat-form-field> |
|
|
|
</section> |
|
|
|
<div *ngIf="aggregation" class="tb-flex column"> |
|
|
|
<ng-container formGroupName="aggregation"> |
|
|
|
<section class="tb-form-panel stroked" *ngIf="isEdit || !timewindow.hideAggregation"> |
|
|
|
<div class="tb-form-panel-title">{{ 'aggregation.aggregation' | translate }}</div> |
|
|
|
<mat-form-field subscriptSizing="dynamic" appearance="outline"> |
|
|
|
<mat-select formControlName="type" style="min-width: 150px;"> |
|
|
|
<mat-option *ngFor="let aggregation of aggregations" [value]="aggregation"> |
|
|
|
{{ aggregationTypesTranslations.get(aggregationTypes[aggregation]) | translate }} |
|
|
|
</mat-option> |
|
|
|
</mat-select> |
|
|
|
</mat-form-field> |
|
|
|
</section> |
|
|
|
|
|
|
|
<section class="tb-form-panel stroked" |
|
|
|
*ngIf="timewindowForm.get('aggregation.type').value === aggregationTypes.NONE && (isEdit || !timewindow.hideAggInterval)"> |
|
|
|
<div class="tb-form-panel-title">{{ 'aggregation.limit' | translate }}</div> |
|
|
|
<div class="limit-slider-container" fxLayout="row" fxLayoutAlign="start center" |
|
|
|
fxLayout.xs="column" fxLayoutAlign.xs="stretch"> |
|
|
|
<div fxLayout="row" fxLayoutAlign="start center" fxFlex> |
|
|
|
<mat-slider fxFlex |
|
|
|
discrete |
|
|
|
min="{{minDatapointsLimit()}}" |
|
|
|
max="{{maxDatapointsLimit()}}"><input matSliderThumb formControlName="limit"/> |
|
|
|
</mat-slider> |
|
|
|
<mat-form-field class="limit-slider-value" subscriptSizing="dynamic" appearance="outline"> |
|
|
|
<input matInput formControlName="limit" type="number" step="1" |
|
|
|
[value]="timewindowForm.get('aggregation.limit').value" |
|
|
|
min="{{minDatapointsLimit()}}" |
|
|
|
max="{{maxDatapointsLimit()}}"/> |
|
|
|
</mat-form-field> |
|
|
|
<section class="tb-form-panel stroked" |
|
|
|
*ngIf="timewindowForm.get('aggregation.type').value === aggregationTypes.NONE && (isEdit || !timewindow.hideAggInterval)"> |
|
|
|
<div class="tb-form-panel-title">{{ 'aggregation.limit' | translate }}</div> |
|
|
|
<div class="limit-slider-container" fxLayout="row" fxLayoutAlign="start center" |
|
|
|
fxLayout.xs="column" fxLayoutAlign.xs="stretch"> |
|
|
|
<div fxLayout="row" fxLayoutAlign="start center" fxFlex> |
|
|
|
<mat-slider fxFlex |
|
|
|
discrete |
|
|
|
showTickMarks |
|
|
|
step="{{datapointsLimitSliderStep()}}" |
|
|
|
min="{{minDatapointsLimit()}}" |
|
|
|
max="{{maxDatapointsLimit()}}"> |
|
|
|
<input matSliderThumb formControlName="limit"/> |
|
|
|
</mat-slider> |
|
|
|
<mat-form-field class="limit-slider-value" subscriptSizing="dynamic" appearance="outline"> |
|
|
|
<input matInput formControlName="limit" type="number" step="1" |
|
|
|
[value]="timewindowForm.get('aggregation.limit').value" |
|
|
|
min="{{minDatapointsLimit()}}" |
|
|
|
max="{{maxDatapointsLimit()}}"/> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</section> |
|
|
|
</div> |
|
|
|
<div formGroupName="realtime" |
|
|
|
*ngIf="aggregation && timewindowForm.get('aggregation.type').value !== aggregationTypes.NONE && |
|
|
|
timewindow.selectedTab === timewindowTypes.REALTIME" class="mat-content mat-padding" fxLayout="column"> |
|
|
|
<tb-timeinterval |
|
|
|
formControlName="interval" |
|
|
|
[isEdit]="isEdit" |
|
|
|
[(hideFlag)]="timewindow.hideAggInterval" |
|
|
|
(hideFlagChange)="onHideAggIntervalChanged()" |
|
|
|
[min]="minRealtimeAggInterval()" [max]="maxRealtimeAggInterval()" |
|
|
|
useCalendarIntervals |
|
|
|
subscriptSizing="dynamic" |
|
|
|
appearance="outline" |
|
|
|
predefinedName="aggregation.group-interval"> |
|
|
|
</tb-timeinterval> |
|
|
|
</div> |
|
|
|
<div formGroupName="history" |
|
|
|
*ngIf="aggregation && timewindowForm.get('aggregation.type').value !== aggregationTypes.NONE && |
|
|
|
timewindow.selectedTab === timewindowTypes.HISTORY" class="mat-content mat-padding" fxLayout="column"> |
|
|
|
<tb-timeinterval |
|
|
|
formControlName="interval" |
|
|
|
[isEdit]="isEdit" |
|
|
|
[(hideFlag)]="timewindow.hideAggInterval" |
|
|
|
(hideFlagChange)="onHideAggIntervalChanged()" |
|
|
|
[min]="minHistoryAggInterval()" [max]="maxHistoryAggInterval()" |
|
|
|
useCalendarIntervals |
|
|
|
subscriptSizing="dynamic" |
|
|
|
appearance="outline" |
|
|
|
predefinedName="aggregation.group-interval"> |
|
|
|
</tb-timeinterval> |
|
|
|
</div> |
|
|
|
<div *ngIf="timezone" class="mat-content mat-padding" fxLayout="row"> |
|
|
|
<section fxLayout="column" fxLayoutAlign="start center" [fxShow]="isEdit"> |
|
|
|
<label class="tb-small hide-label" translate>timewindow.hide</label> |
|
|
|
<mat-checkbox [ngModelOptions]="{standalone: true}" [(ngModel)]="timewindow.hideTimezone" |
|
|
|
(ngModelChange)="onHideTimezoneChanged()"></mat-checkbox> |
|
|
|
</section> |
|
|
|
</ng-container> |
|
|
|
|
|
|
|
<section class="tb-form-panel stroked" [fxShow]="(isEdit || !timewindow.hideAggInterval) |
|
|
|
&& timewindowForm.get('aggregation.type').value !== aggregationTypes.NONE"> |
|
|
|
<div class="tb-form-panel-title">{{ 'aggregation.group-interval' | translate }}</div> |
|
|
|
<ng-container formGroupName="realtime" *ngIf="timewindow.selectedTab === timewindowTypes.REALTIME"> |
|
|
|
<tb-timeinterval |
|
|
|
formControlName="interval" |
|
|
|
[isEdit]="isEdit" |
|
|
|
[(hideFlag)]="timewindow.hideAggInterval" |
|
|
|
[min]="minRealtimeAggInterval()" [max]="maxRealtimeAggInterval()" |
|
|
|
useCalendarIntervals |
|
|
|
subscriptSizing="dynamic" |
|
|
|
appearance="outline"> |
|
|
|
</tb-timeinterval> |
|
|
|
</ng-container> |
|
|
|
<ng-container formGroupName="history" *ngIf="timewindow.selectedTab === timewindowTypes.HISTORY"> |
|
|
|
<tb-timeinterval |
|
|
|
formControlName="interval" |
|
|
|
[isEdit]="isEdit" |
|
|
|
[(hideFlag)]="timewindow.hideAggInterval" |
|
|
|
[min]="minHistoryAggInterval()" [max]="maxHistoryAggInterval()" |
|
|
|
useCalendarIntervals |
|
|
|
subscriptSizing="dynamic" |
|
|
|
appearance="outline"> |
|
|
|
</tb-timeinterval> |
|
|
|
</ng-container> |
|
|
|
</section> |
|
|
|
<!-- <tb-timezone-select fxFlex [fxShow]="isEdit || !timewindow.hideTimezone"--> |
|
|
|
<!-- localBrowserTimezonePlaceholderOnEmpty="true"--> |
|
|
|
<!-- formControlName="timezone"--> |
|
|
|
<!-- appearance="outline">--> |
|
|
|
<!-- </tb-timezone-select>--> |
|
|
|
</div> |
|
|
|
</ng-template> |
|
|
|
<ng-template #timezoneSelection> |
|
|
|
<ng-container *ngIf="timezone && (isEdit || !timewindow.hideTimezone)"> |
|
|
|
<tb-timezone-select localBrowserTimezonePlaceholderOnEmpty="true" |
|
|
|
formControlName="timezone" |
|
|
|
subscriptSizing="dynamic" |
|
|
|
appearance="outline"> |
|
|
|
</tb-timezone-select> |
|
|
|
</ng-container> |
|
|
|
</ng-template> |
|
|
|
</form> |
|
|
|
<mat-divider></mat-divider> |
|
|
|
<div fxLayout="row" class="tb-panel-actions" fxLayoutAlign="end center"> |
|
|
|
<button type="button" |
|
|
|
mat-button |
|
|
|
|