Merge branch 'feature/queue-entity' of github.com:YevhenBondarenko/thingsboard into feature/queue-entity
This commit is contained in:
commit
96ea21e5db
@ -20,12 +20,26 @@
|
||||
*ngFor="let queuesControl of queuesFormArray.controls; trackBy: trackByQueue;
|
||||
let $index = index; last as isLast;"
|
||||
[ngStyle]="!isLast ? {paddingBottom: '8px'} : {}">
|
||||
<tb-queue-form [formControl]="queuesControl"
|
||||
(removeQueue)="removeQueue($index)"
|
||||
[mainQueue]="$index === 0"
|
||||
[expanded]="$index === 0"
|
||||
[newQueue]="newQueue">
|
||||
</tb-queue-form>
|
||||
<mat-expansion-panel fxFlex [expanded]="true">
|
||||
<mat-expansion-panel-header>
|
||||
<div fxFlex fxLayout="row" fxLayoutAlign="start center">
|
||||
<mat-panel-title>
|
||||
{{ queuesControl.value.name }}
|
||||
</mat-panel-title>
|
||||
<span fxFlex></span>
|
||||
<button *ngIf="!($index === 0) && !disabled" mat-icon-button style="min-width: 40px;"
|
||||
type="button"
|
||||
(click)="removeQueue($index)"
|
||||
matTooltip="{{ 'action.remove' | translate }}"
|
||||
matTooltipPosition="above">
|
||||
<mat-icon>delete</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
</mat-expansion-panel-header>
|
||||
<ng-template matExpansionPanelContent>
|
||||
<tb-queue-form [formControl]="queuesControl"></tb-queue-form>
|
||||
</ng-template>
|
||||
</mat-expansion-panel>
|
||||
</div>
|
||||
<div *ngIf="!queuesFormArray.controls.length">
|
||||
<span translate fxLayoutAlign="center center"
|
||||
|
||||
@ -126,9 +126,9 @@ export class TenantProfileQueuesComponent implements ControlValueAccessor, Valid
|
||||
} else {
|
||||
this.tenantProfileQueuesFormGroup.enable({emitEvent: false});
|
||||
}
|
||||
this.valueChangeSubscription$ = this.tenantProfileQueuesFormGroup.valueChanges.subscribe(value => {
|
||||
this.updateModel();
|
||||
});
|
||||
this.valueChangeSubscription$ = this.tenantProfileQueuesFormGroup.valueChanges.subscribe(() =>
|
||||
this.updateModel()
|
||||
);
|
||||
}
|
||||
|
||||
public trackByQueue(index: number, queueControl: AbstractControl) {
|
||||
@ -183,10 +183,6 @@ export class TenantProfileQueuesComponent implements ControlValueAccessor, Valid
|
||||
};
|
||||
}
|
||||
|
||||
getName(value) {
|
||||
return this.utils.customTranslation(value, value);
|
||||
}
|
||||
|
||||
private updateModel() {
|
||||
const queues: Array<QueueInfo> = this.tenantProfileQueuesFormGroup.get('queues').value;
|
||||
this.propagateChange(queues);
|
||||
|
||||
@ -109,7 +109,9 @@ export class TenantProfileComponent extends EntityComponent<TenantProfile> {
|
||||
this.entityForm.patchValue({name: entity.name}, {emitEvent: false});
|
||||
this.entityForm.patchValue({isolatedTbCore: entity.isolatedTbCore}, {emitEvent: false});
|
||||
this.entityForm.patchValue({isolatedTbRuleEngine: entity.isolatedTbRuleEngine}, {emitEvent: false});
|
||||
this.entityForm.get('profileData').patchValue({configuration: entity.profileData?.configuration}, {emitEvent: false});
|
||||
this.entityForm.get('profileData').patchValue({
|
||||
configuration: !this.isAdd ? entity.profileData?.configuration : createTenantProfileConfiguration(TenantProfileType.DEFAULT)
|
||||
}, {emitEvent: false});
|
||||
this.entityForm.get('profileData').patchValue({queueConfiguration: entity.profileData?.queueConfiguration}, {emitEvent: false});
|
||||
this.entityForm.patchValue({description: entity.description}, {emitEvent: false});
|
||||
}
|
||||
|
||||
@ -15,182 +15,165 @@
|
||||
limitations under the License.
|
||||
|
||||
-->
|
||||
<mat-expansion-panel fxFlex [(expanded)]="expanded">
|
||||
<mat-expansion-panel-header>
|
||||
<div fxFlex fxLayout="row" fxLayoutAlign="start center">
|
||||
<mat-panel-title>
|
||||
{{ queueTitle }}
|
||||
</mat-panel-title>
|
||||
<span fxFlex></span>
|
||||
<button *ngIf="!mainQueue && !disabled" mat-icon-button style="min-width: 40px;"
|
||||
type="button"
|
||||
(click)="removeQueue.emit()"
|
||||
matTooltip="{{ 'action.remove' | translate }}"
|
||||
matTooltipPosition="above">
|
||||
<mat-icon>delete</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
</mat-expansion-panel-header>
|
||||
<ng-template matExpansionPanelContent>
|
||||
<form [formGroup]="queueFormGroup" fxLayout="column" fxLayoutGap="0.5em">
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>admin.queue-name</mat-label>
|
||||
<input matInput formControlName="name" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('name').hasError('required')">
|
||||
{{ 'queue.name-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('name').hasError('unique')">
|
||||
{{ 'queue.name-unique' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.poll-interval</mat-label>
|
||||
<input type="number" matInput formControlName="pollInterval" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('pollInterval').hasError('required')">
|
||||
{{ 'queue.poll-interval-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('pollInterval').hasError('min') &&
|
||||
!queueFormGroup.get('pollInterval').hasError('required')">
|
||||
{{ 'queue.poll-interval-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.partitions</mat-label>
|
||||
<input type="number" matInput formControlName="partitions" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('partitions').hasError('required')">
|
||||
{{ 'queue.partitions-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('partitions').hasError('min') &&
|
||||
!queueFormGroup.get('partitions').hasError('required')">
|
||||
{{ 'queue.partitions-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-checkbox class="hinted-checkbox" formControlName="consumerPerPartition">
|
||||
<div>{{ 'queue.consumer-per-partition' | translate }}</div>
|
||||
<div class="tb-hint">{{'queue.consumer-per-partition-hint' | translate}}</div>
|
||||
</mat-checkbox>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.processing-timeout</mat-label>
|
||||
<input type="number" matInput formControlName="packProcessingTimeout" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('packProcessingTimeout').hasError('required')">
|
||||
{{ 'queue.pack-processing-timeout-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('packProcessingTimeout').hasError('min') &&
|
||||
!queueFormGroup.get('packProcessingTimeout').hasError('required')">
|
||||
{{ 'queue.pack-processing-timeout-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-accordion class="queue-strategy" [multi]="true">
|
||||
<mat-expansion-panel [expanded]="false">
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title translate>
|
||||
queue.submit-strategy
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<ng-template matExpansionPanelContent>
|
||||
<div formGroupName="submitStrategy">
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.submit-strategy</mat-label>
|
||||
<mat-select formControlName="type" required>
|
||||
<mat-option *ngFor="let strategy of submitStrategies" [value]="strategy">
|
||||
{{ strategy }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
<mat-error *ngIf="queueFormGroup.get('submitStrategy.type').hasError('required')">
|
||||
{{ 'queue.submit-strategy-type-required' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block" *ngIf="hideBatchSize">
|
||||
<mat-label translate>queue.batch-size</mat-label>
|
||||
<input type="number" matInput formControlName="batchSize" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('submitStrategy.batchSize').hasError('required')">
|
||||
{{ 'queue.batch-size-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('submitStrategy.batchSize').hasError('min') &&
|
||||
!queueFormGroup.get('submitStrategy.batchSize').hasError('required')">
|
||||
{{ 'queue.batch-size-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</ng-template>
|
||||
</mat-expansion-panel>
|
||||
<mat-expansion-panel [expanded]="false">
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title translate>
|
||||
queue.processing-strategy
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<ng-template matExpansionPanelContent>
|
||||
<div formGroupName="processingStrategy">
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.processing-strategy</mat-label>
|
||||
<mat-select formControlName="type" required>
|
||||
<mat-option *ngFor="let strategy of processingStrategies" [value]="strategy">
|
||||
{{ strategy }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.type').hasError('required')">
|
||||
{{ 'queue.processing-strategy-type-required' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.retries</mat-label>
|
||||
<input type="number" matInput formControlName="retries" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.retries').hasError('required')">
|
||||
{{ 'queue.retries-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.retries').hasError('min') &&
|
||||
!queueFormGroup.get('processingStrategy.retries').hasError('required')">
|
||||
{{ 'queue.retries-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.failure-percentage</mat-label>
|
||||
<input type="number" matInput formControlName="failurePercentage" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('required')">
|
||||
{{ 'queue.failure-percentage-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('min') &&
|
||||
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('required') &&
|
||||
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('max')">
|
||||
{{ 'queue.failure-percentage-min-value' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('max') &&
|
||||
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('required') &&
|
||||
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('min')">
|
||||
{{ 'queue.failure-percentage-max-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.pause-between-retries</mat-label>
|
||||
<input type="number" matInput formControlName="pauseBetweenRetries" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('required')">
|
||||
{{ 'queue.pause-between-retries-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('min') &&
|
||||
!queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('required')">
|
||||
{{ 'queue.pause-between-retries-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.max-pause-between-retries</mat-label>
|
||||
<input type="number" matInput formControlName="maxPauseBetweenRetries" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('required')">
|
||||
{{ 'queue.max-pause-between-retries-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('min') &&
|
||||
!queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('required')">
|
||||
{{ 'queue.max-pause-between-retries-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</ng-template>
|
||||
</mat-expansion-panel>
|
||||
</mat-accordion>
|
||||
<mat-form-field class="mat-block" formGroupName="additionalInfo">
|
||||
<mat-label translate>queue.description</mat-label>
|
||||
<textarea matInput formControlName="description" rows="2"></textarea>
|
||||
</mat-form-field>
|
||||
</form>
|
||||
</ng-template>
|
||||
</mat-expansion-panel>
|
||||
|
||||
<form [formGroup]="queueFormGroup" fxLayout="column" fxLayoutGap="0.5em">
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>admin.queue-name</mat-label>
|
||||
<input matInput formControlName="name" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('name').hasError('required')">
|
||||
{{ 'queue.name-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('name').hasError('unique')">
|
||||
{{ 'queue.name-unique' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.poll-interval</mat-label>
|
||||
<input type="number" matInput formControlName="pollInterval" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('pollInterval').hasError('required')">
|
||||
{{ 'queue.poll-interval-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('pollInterval').hasError('min') &&
|
||||
!queueFormGroup.get('pollInterval').hasError('required')">
|
||||
{{ 'queue.poll-interval-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.partitions</mat-label>
|
||||
<input type="number" matInput formControlName="partitions" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('partitions').hasError('required')">
|
||||
{{ 'queue.partitions-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('partitions').hasError('min') &&
|
||||
!queueFormGroup.get('partitions').hasError('required')">
|
||||
{{ 'queue.partitions-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-checkbox class="hinted-checkbox" formControlName="consumerPerPartition">
|
||||
<div>{{ 'queue.consumer-per-partition' | translate }}</div>
|
||||
<div class="tb-hint">{{'queue.consumer-per-partition-hint' | translate}}</div>
|
||||
</mat-checkbox>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.processing-timeout</mat-label>
|
||||
<input type="number" matInput formControlName="packProcessingTimeout" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('packProcessingTimeout').hasError('required')">
|
||||
{{ 'queue.pack-processing-timeout-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('packProcessingTimeout').hasError('min') &&
|
||||
!queueFormGroup.get('packProcessingTimeout').hasError('required')">
|
||||
{{ 'queue.pack-processing-timeout-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-accordion class="queue-strategy" [multi]="true">
|
||||
<mat-expansion-panel [expanded]="false">
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title translate>
|
||||
queue.submit-strategy
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<ng-template matExpansionPanelContent>
|
||||
<div formGroupName="submitStrategy">
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.submit-strategy</mat-label>
|
||||
<mat-select formControlName="type" required>
|
||||
<mat-option *ngFor="let strategy of submitStrategies" [value]="strategy">
|
||||
{{ queueSubmitStrategyTypesMap.get(queueSubmitStrategyTypes[strategy]).label | translate }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
<mat-error *ngIf="queueFormGroup.get('submitStrategy.type').hasError('required')">
|
||||
{{ 'queue.submit-strategy-type-required' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block" *ngIf="hideBatchSize">
|
||||
<mat-label translate>queue.batch-size</mat-label>
|
||||
<input type="number" matInput formControlName="batchSize" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('submitStrategy.batchSize').hasError('required')">
|
||||
{{ 'queue.batch-size-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('submitStrategy.batchSize').hasError('min') &&
|
||||
!queueFormGroup.get('submitStrategy.batchSize').hasError('required')">
|
||||
{{ 'queue.batch-size-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</ng-template>
|
||||
</mat-expansion-panel>
|
||||
<mat-expansion-panel [expanded]="false">
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title translate>
|
||||
queue.processing-strategy
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<ng-template matExpansionPanelContent>
|
||||
<div formGroupName="processingStrategy">
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.processing-strategy</mat-label>
|
||||
<mat-select formControlName="type" required>
|
||||
<mat-option *ngFor="let strategy of processingStrategies" [value]="strategy">
|
||||
{{ queueProcessingStrategyTypesMap.get(queueProcessingStrategyTypes[strategy]).label | translate }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.type').hasError('required')">
|
||||
{{ 'queue.processing-strategy-type-required' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.retries</mat-label>
|
||||
<input type="number" matInput formControlName="retries" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.retries').hasError('required')">
|
||||
{{ 'queue.retries-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.retries').hasError('min') &&
|
||||
!queueFormGroup.get('processingStrategy.retries').hasError('required')">
|
||||
{{ 'queue.retries-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.failure-percentage</mat-label>
|
||||
<input type="number" matInput formControlName="failurePercentage" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('required')">
|
||||
{{ 'queue.failure-percentage-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('min') &&
|
||||
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('required') &&
|
||||
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('max')">
|
||||
{{ 'queue.failure-percentage-min-value' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('max') &&
|
||||
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('required') &&
|
||||
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('min')">
|
||||
{{ 'queue.failure-percentage-max-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.pause-between-retries</mat-label>
|
||||
<input type="number" matInput formControlName="pauseBetweenRetries" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('required')">
|
||||
{{ 'queue.pause-between-retries-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('min') &&
|
||||
!queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('required')">
|
||||
{{ 'queue.pause-between-retries-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="mat-block">
|
||||
<mat-label translate>queue.max-pause-between-retries</mat-label>
|
||||
<input type="number" matInput formControlName="maxPauseBetweenRetries" required>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('required')">
|
||||
{{ 'queue.max-pause-between-retries-required' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('min') &&
|
||||
!queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('required')">
|
||||
{{ 'queue.max-pause-between-retries-min-value' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</ng-template>
|
||||
</mat-expansion-panel>
|
||||
</mat-accordion>
|
||||
<mat-form-field class="mat-block" formGroupName="additionalInfo">
|
||||
<mat-label translate>queue.description</mat-label>
|
||||
<textarea matInput formControlName="description" rows="2"></textarea>
|
||||
<mat-hint translate>queue.description-hint</mat-hint>
|
||||
</mat-form-field>
|
||||
</form>
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
/// limitations under the License.
|
||||
///
|
||||
|
||||
import { Component, forwardRef, Input, OnInit, Output, EventEmitter, OnDestroy } from '@angular/core';
|
||||
import { Component, forwardRef, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import {
|
||||
ControlValueAccessor,
|
||||
FormBuilder,
|
||||
@ -25,9 +25,14 @@ import {
|
||||
Validator,
|
||||
Validators
|
||||
} from '@angular/forms';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { UtilsService } from '@core/services/utils.service';
|
||||
import { QueueInfo, QueueProcessingStrategyTypes, QueueSubmitStrategyTypes } from '@shared/models/queue.models';
|
||||
import {
|
||||
QueueInfo,
|
||||
QueueProcessingStrategyTypes,
|
||||
QueueProcessingStrategyTypesMap,
|
||||
QueueSubmitStrategyTypes,
|
||||
QueueSubmitStrategyTypesMap
|
||||
} from '@shared/models/queue.models';
|
||||
import { isDefinedAndNotNull } from '@core/utils';
|
||||
import { Subscription } from 'rxjs';
|
||||
|
||||
@ -56,31 +61,25 @@ export class QueueFormComponent implements ControlValueAccessor, OnInit, OnDestr
|
||||
@Input()
|
||||
newQueue = false;
|
||||
|
||||
@Input()
|
||||
mainQueue = false;
|
||||
|
||||
@Input()
|
||||
systemQueue = false;
|
||||
|
||||
@Input()
|
||||
expanded = false;
|
||||
|
||||
@Output()
|
||||
removeQueue = new EventEmitter();
|
||||
|
||||
queueFormGroup: FormGroup;
|
||||
submitStrategies: string[] = [];
|
||||
processingStrategies: string[] = [];
|
||||
queueTitle = '';
|
||||
hideBatchSize = false;
|
||||
|
||||
queueSubmitStrategyTypes = QueueSubmitStrategyTypes;
|
||||
queueProcessingStrategyTypes = QueueProcessingStrategyTypes;
|
||||
submitStrategies: string[] = Object.values(this.queueSubmitStrategyTypes);
|
||||
processingStrategies: string[] = Object.values(this.queueProcessingStrategyTypes);
|
||||
queueSubmitStrategyTypesMap = QueueSubmitStrategyTypesMap;
|
||||
queueProcessingStrategyTypesMap = QueueProcessingStrategyTypesMap;
|
||||
|
||||
private modelValue: QueueInfo;
|
||||
private propagateChange = null;
|
||||
private propagateChangePending = false;
|
||||
private valueChange$: Subscription = null;
|
||||
|
||||
constructor(private dialog: MatDialog,
|
||||
private utils: UtilsService,
|
||||
constructor(private utils: UtilsService,
|
||||
private fb: FormBuilder) {
|
||||
}
|
||||
|
||||
@ -98,8 +97,6 @@ export class QueueFormComponent implements ControlValueAccessor, OnInit, OnDestr
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.submitStrategies = Object.values(QueueSubmitStrategyTypes);
|
||||
this.processingStrategies = Object.values(QueueProcessingStrategyTypes);
|
||||
this.queueFormGroup = this.fb.group(
|
||||
{
|
||||
name: ['', [Validators.required]],
|
||||
@ -128,7 +125,6 @@ export class QueueFormComponent implements ControlValueAccessor, OnInit, OnDestr
|
||||
});
|
||||
this.queueFormGroup.get('name').valueChanges.subscribe((value) => {
|
||||
this.queueFormGroup.patchValue({topic: `tb_rule_engine.${value}`});
|
||||
this.queueTitle = this.utils.customTranslation(value, value);
|
||||
});
|
||||
this.queueFormGroup.get('submitStrategy').get('type').valueChanges.subscribe(() => {
|
||||
this.submitStrategyTypeChanged();
|
||||
@ -160,14 +156,13 @@ export class QueueFormComponent implements ControlValueAccessor, OnInit, OnDestr
|
||||
writeValue(value: QueueInfo): void {
|
||||
this.propagateChangePending = false;
|
||||
this.modelValue = value;
|
||||
if (!this.modelValue.name) {
|
||||
this.expanded = true;
|
||||
}
|
||||
this.queueTitle = this.utils.customTranslation(value.name, value.name);
|
||||
if (isDefinedAndNotNull(this.modelValue)) {
|
||||
this.queueFormGroup.patchValue(this.modelValue, {emitEvent: false});
|
||||
this.submitStrategyTypeChanged();
|
||||
if (!this.modelValue.name) {
|
||||
this.queueFormGroup.get('name').enable({emitEvent: false});
|
||||
}
|
||||
}
|
||||
this.submitStrategyTypeChanged();
|
||||
if (!this.disabled && !this.queueFormGroup.valid) {
|
||||
this.updateModel();
|
||||
}
|
||||
@ -209,13 +204,11 @@ export class QueueFormComponent implements ControlValueAccessor, OnInit, OnDestr
|
||||
const type: QueueSubmitStrategyTypes = form.get('type').value;
|
||||
const batchSizeField = form.get('batchSize');
|
||||
if (type === QueueSubmitStrategyTypes.BATCH) {
|
||||
batchSizeField.enable({emitEvent: false});
|
||||
batchSizeField.patchValue(1000, {emitEvent: false});
|
||||
batchSizeField.setValidators([Validators.min(1), Validators.required]);
|
||||
this.hideBatchSize = true;
|
||||
} else {
|
||||
batchSizeField.patchValue(null, {emitEvent: false});
|
||||
batchSizeField.disable({emitEvent: false});
|
||||
batchSizeField.clearValidators();
|
||||
this.hideBatchSize = false;
|
||||
}
|
||||
|
||||
@ -101,12 +101,15 @@ export class TenantProfilesTableConfigResolver implements Resolve<EntityTableCon
|
||||
}
|
||||
|
||||
addId(queues) {
|
||||
const queuesWithId = [];
|
||||
queues.forEach(value => {
|
||||
value.id = guid();
|
||||
queuesWithId.push(value);
|
||||
});
|
||||
return queuesWithId;
|
||||
if (queues) {
|
||||
const queuesWithId = [];
|
||||
queues.forEach(value => {
|
||||
value.id = guid();
|
||||
queuesWithId.push(value);
|
||||
});
|
||||
return queuesWithId;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
resolve(): EntityTableConfig<TenantProfile> {
|
||||
|
||||
@ -14,9 +14,9 @@
|
||||
/// limitations under the License.
|
||||
///
|
||||
|
||||
import { BaseData, HasId } from '@shared/models/base-data';
|
||||
import { BaseData } from '@shared/models/base-data';
|
||||
import { TenantId } from '@shared/models/id/tenant-id';
|
||||
import {QueueId} from '@shared/models/id/queue-id';
|
||||
import { QueueId } from '@shared/models/id/queue-id';
|
||||
|
||||
export enum ServiceType {
|
||||
TB_CORE = 'TB_CORE',
|
||||
@ -33,6 +33,35 @@ export enum QueueSubmitStrategyTypes {
|
||||
BATCH = 'BATCH'
|
||||
}
|
||||
|
||||
export interface QueueStrategyData {
|
||||
label: string;
|
||||
hint: string;
|
||||
}
|
||||
|
||||
export const QueueSubmitStrategyTypesMap = new Map<QueueSubmitStrategyTypes, QueueStrategyData>(
|
||||
[
|
||||
[QueueSubmitStrategyTypes.SEQUENTIAL_BY_ORIGINATOR, {
|
||||
label: 'queue.strategies.sequential-by-originator-label',
|
||||
hint: 'queue.strategies.sequential-by-originator-hint',
|
||||
}],
|
||||
[QueueSubmitStrategyTypes.SEQUENTIAL_BY_TENANT, {
|
||||
label: 'queue.strategies.sequential-by-tenant-label',
|
||||
hint: 'queue.strategies.sequential-by-tenant-hint',
|
||||
}],
|
||||
[QueueSubmitStrategyTypes.SEQUENTIAL, {
|
||||
label: 'queue.strategies.sequential-label',
|
||||
hint: 'queue.strategies.sequential-hint',
|
||||
}],
|
||||
[QueueSubmitStrategyTypes.BURST, {
|
||||
label: 'queue.strategies.burst-label',
|
||||
hint: 'queue.strategies.burst-hint',
|
||||
}],
|
||||
[QueueSubmitStrategyTypes.BATCH, {
|
||||
label: 'queue.strategies.batch-label',
|
||||
hint: 'queue.strategies.batch-hint',
|
||||
}]
|
||||
]);
|
||||
|
||||
export enum QueueProcessingStrategyTypes {
|
||||
RETRY_FAILED_AND_TIMED_OUT = 'RETRY_FAILED_AND_TIMED_OUT',
|
||||
SKIP_ALL_FAILURES = 'SKIP_ALL_FAILURES',
|
||||
@ -42,6 +71,34 @@ export enum QueueProcessingStrategyTypes {
|
||||
RETRY_TIMED_OUT = 'RETRY_TIMED_OUT'
|
||||
}
|
||||
|
||||
export const QueueProcessingStrategyTypesMap = new Map<QueueProcessingStrategyTypes, QueueStrategyData>(
|
||||
[
|
||||
[QueueProcessingStrategyTypes.RETRY_FAILED_AND_TIMED_OUT, {
|
||||
label: 'queue.strategies.retry-failed-and-timeout-label',
|
||||
hint: 'queue.strategies.retry-failed-and-timout-hint',
|
||||
}],
|
||||
[QueueProcessingStrategyTypes.SKIP_ALL_FAILURES, {
|
||||
label: 'queue.strategies.skip-all-failures-label',
|
||||
hint: 'queue.strategies.skip-all-failures-hint',
|
||||
}],
|
||||
[QueueProcessingStrategyTypes.SKIP_ALL_FAILURES_AND_TIMED_OUT, {
|
||||
label: 'queue.strategies.skip-all-failures-and-timeouts-label',
|
||||
hint: 'queue.strategies.skip-all-failures-and-timeouts-hint',
|
||||
}],
|
||||
[QueueProcessingStrategyTypes.RETRY_ALL, {
|
||||
label: 'queue.strategies.retry-all-label',
|
||||
hint: 'queue.strategies.retry-all-hint',
|
||||
}],
|
||||
[QueueProcessingStrategyTypes.RETRY_FAILED, {
|
||||
label: 'queue.strategies.retry-failed-label',
|
||||
hint: 'queue.strategies.retry-failed-hint',
|
||||
}],
|
||||
[QueueProcessingStrategyTypes.RETRY_TIMED_OUT, {
|
||||
label: 'queue.strategies.retry-timeout-label',
|
||||
hint: 'queue.strategies.retry-timeout-hint',
|
||||
}]
|
||||
]);
|
||||
|
||||
export interface QueueInfo extends BaseData<QueueId> {
|
||||
generatedId?: string;
|
||||
name: string;
|
||||
|
||||
@ -2926,7 +2926,32 @@
|
||||
"copyId": "Copy queue Id",
|
||||
"idCopiedMessage": "Queue Id has been copied to clipboard",
|
||||
"description": "Description",
|
||||
"alt-description": "Submit Strategy: {{submitStrategy}}, Processing Strategy: {{processingStrategy}}"
|
||||
"description-hint": "This text will be displayed in the Queue description instead of the selected strategy",
|
||||
"alt-description": "Submit Strategy: {{submitStrategy}}, Processing Strategy: {{processingStrategy}}",
|
||||
"strategies": {
|
||||
"sequential-by-originator-label": "Sequential by originator",
|
||||
"sequential-by-originator-hint": "New message for e.g. device A is not submitted until previous message for device A is acknowledged",
|
||||
"sequential-by-tenant-label": "Sequential by tenant",
|
||||
"sequential-by-tenant-hint": "New message for e.g tenant A is not submitted until previous message for tenant A is acknowledged",
|
||||
"sequential-label": "Sequential",
|
||||
"sequential-hint": "New message is not submitted until previous message is acknowledged",
|
||||
"burst-label": "Burst",
|
||||
"burst-hint": "All messages are submitted to the rule chains in the order they arrive",
|
||||
"batch-label": "Batch",
|
||||
"batch-hint": "New batch is not submitted until previous batch is acknowledged",
|
||||
"skip-all-failures-label": "Skip all failures",
|
||||
"skip-all-failures-hint": "Ignore all failures",
|
||||
"skip-all-failures-and-timeouts-label": "Skip all failures and timeouts",
|
||||
"skip-all-failures-and-timeouts-hint": "Ignore all failures and timeouts",
|
||||
"retry-all-label": "Retry all",
|
||||
"retry-all-hint": "Retry all messages from processing pack",
|
||||
"retry-failed-label": "Retry failed",
|
||||
"retry-failed-hint": "Retry all failed messages from processing pack",
|
||||
"retry-timeout-label": "Retry timeout",
|
||||
"retry-timeout-hint": "Retry all timed-out messages from processing pack",
|
||||
"retry-failed-and-timeout-label": "Retry failed and timeout",
|
||||
"retry-failed-and-timeout-hint": "Retry all failed and timed-out messages from processing pack"
|
||||
}
|
||||
},
|
||||
"tenant": {
|
||||
"tenant": "Tenant",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user