Browse Source

Merge pull request #6805 from ArtemDzhereleiko/AD/tenant-profile-queue-layout

[3.4] UI: Layout for tenant profile and queue
pull/6840/head
Andrew Shvayka 4 years ago
committed by GitHub
parent
commit
6f553867b0
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      ui-ngx/src/app/modules/home/components/entity/add-entity-dialog.component.html
  2. 4
      ui-ngx/src/app/modules/home/components/profile/tenant-profile.component.html
  3. 4
      ui-ngx/src/app/modules/home/components/profile/tenant-profile.component.scss
  4. 888
      ui-ngx/src/app/modules/home/components/profile/tenant/default-tenant-profile-configuration.component.html
  5. 55
      ui-ngx/src/app/modules/home/components/profile/tenant/default-tenant-profile-configuration.component.scss
  6. 4
      ui-ngx/src/app/modules/home/components/profile/tenant/default-tenant-profile-configuration.component.ts
  7. 274
      ui-ngx/src/app/modules/home/components/queue/queue-form.component.html
  8. 32
      ui-ngx/src/app/modules/home/components/queue/queue-form.component.scss
  9. 185
      ui-ngx/src/assets/locale/locale.constant-en_US.json

2
ui-ngx/src/app/modules/home/components/entity/add-entity-dialog.component.html

@ -15,7 +15,7 @@
limitations under the License. limitations under the License.
--> -->
<form (ngSubmit)="add()" style="min-width: 400px;" [ngStyle]="entitiesTableConfig.addDialogStyle"> <form (ngSubmit)="add()" style="min-width: 400px; width: 700px;" [ngStyle]="entitiesTableConfig.addDialogStyle">
<mat-toolbar color="primary"> <mat-toolbar color="primary">
<h2 translate>{{ translations.add }}</h2> <h2 translate>{{ translations.add }}</h2>
<span fxFlex></span> <span fxFlex></span>

4
ui-ngx/src/app/modules/home/components/profile/tenant-profile.component.html

@ -48,7 +48,7 @@
<div class="mat-padding" fxLayout="column"> <div class="mat-padding" fxLayout="column">
<form [formGroup]="entityForm"> <form [formGroup]="entityForm">
<fieldset [disabled]="(isLoading$ | async) || !isEdit"> <fieldset [disabled]="(isLoading$ | async) || !isEdit">
<mat-form-field class="mat-block"> <mat-form-field class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.name</mat-label> <mat-label translate>tenant-profile.name</mat-label>
<input matInput formControlName="name" required/> <input matInput formControlName="name" required/>
<mat-error *ngIf="entityForm.get('name').hasError('required')"> <mat-error *ngIf="entityForm.get('name').hasError('required')">
@ -99,7 +99,7 @@
</mat-expansion-panel> </mat-expansion-panel>
</mat-accordion> </mat-accordion>
</div> </div>
<mat-form-field class="mat-block"> <mat-form-field class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.description</mat-label> <mat-label translate>tenant-profile.description</mat-label>
<textarea matInput formControlName="description" rows="2"></textarea> <textarea matInput formControlName="description" rows="2"></textarea>
</mat-form-field> </mat-form-field>

4
ui-ngx/src/app/modules/home/components/profile/tenant-profile.component.scss

@ -14,6 +14,10 @@
* limitations under the License. * limitations under the License.
*/ */
:host ::ng-deep { :host ::ng-deep {
.mat-form-field-infix {
width: 100% !important;
}
.mat-checkbox{ .mat-checkbox{
&.hinted-checkbox { &.hinted-checkbox {
.mat-checkbox-inner-container { .mat-checkbox-inner-container {

888
ui-ngx/src/app/modules/home/components/profile/tenant/default-tenant-profile-configuration.component.html

@ -16,387 +16,511 @@
--> -->
<section [formGroup]="defaultTenantProfileConfigurationFormGroup" fxLayout="column"> <section [formGroup]="defaultTenantProfileConfigurationFormGroup" fxLayout="column">
<mat-form-field class="mat-block"> <fieldset class="fields-group">
<mat-label translate>tenant-profile.maximum-devices</mat-label> <legend class="group-title">
<input matInput required min="0" step="1" {{ 'tenant-profile.entities' | translate }} <span translate>tenant-profile.unlimited</span>
formControlName="maxDevices" </legend>
type="number"> <div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDevices').hasError('required')"> <mat-form-field fxFlex class="mat-block" appearance="fill">
{{ 'tenant-profile.maximum-devices-required' | translate}} <mat-label translate>tenant-profile.maximum-devices</mat-label>
</mat-error> <input matInput required min="0" step="1"
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDevices').hasError('min')"> formControlName="maxDevices"
{{ 'tenant-profile.maximum-devices-range' | translate}} type="number">
</mat-error> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDevices').hasError('required')">
</mat-form-field> {{ 'tenant-profile.maximum-devices-required' | translate}}
<mat-form-field class="mat-block"> </mat-error>
<mat-label translate>tenant-profile.maximum-assets</mat-label> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDevices').hasError('min')">
<input matInput required min="0" step="1" {{ 'tenant-profile.maximum-devices-range' | translate}}
formControlName="maxAssets" </mat-error>
type="number"> </mat-form-field>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxAssets').hasError('required')"> <mat-form-field fxFlex class="mat-block" appearance="fill">
{{ 'tenant-profile.maximum-assets-required' | translate}} <mat-label translate>tenant-profile.maximum-dashboards</mat-label>
</mat-error> <input matInput required min="0" step="1"
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxAssets').hasError('min')"> formControlName="maxDashboards"
{{ 'tenant-profile.maximum-assets-range' | translate}} type="number">
</mat-error> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDashboards').hasError('required')">
</mat-form-field> {{ 'tenant-profile.maximum-dashboards-required' | translate}}
<mat-form-field class="mat-block"> </mat-error>
<mat-label translate>tenant-profile.maximum-customers</mat-label> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDashboards').hasError('min')">
<input matInput required min="0" step="1" {{ 'tenant-profile.maximum-dashboards-range' | translate}}
formControlName="maxCustomers" </mat-error>
type="number"> </mat-form-field>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCustomers').hasError('required')"> </div>
{{ 'tenant-profile.maximum-customers-required' | translate}} <div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
</mat-error> <mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCustomers').hasError('min')"> <mat-label translate>tenant-profile.maximum-assets</mat-label>
{{ 'tenant-profile.maximum-customers-range' | translate}} <input matInput required min="0" step="1"
</mat-error> formControlName="maxAssets"
</mat-form-field> type="number">
<mat-form-field class="mat-block"> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxAssets').hasError('required')">
<mat-label translate>tenant-profile.maximum-users</mat-label> {{ 'tenant-profile.maximum-assets-required' | translate}}
<input matInput required min="0" step="1" </mat-error>
formControlName="maxUsers" <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxAssets').hasError('min')">
type="number"> {{ 'tenant-profile.maximum-assets-range' | translate}}
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxUsers').hasError('required')"> </mat-error>
{{ 'tenant-profile.maximum-users-required' | translate}} </mat-form-field>
</mat-error> <mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxUsers').hasError('min')"> <mat-label translate>tenant-profile.maximum-users</mat-label>
{{ 'tenant-profile.maximum-users-range' | translate}} <input matInput required min="0" step="1"
</mat-error> formControlName="maxUsers"
</mat-form-field> type="number">
<mat-form-field class="mat-block"> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxUsers').hasError('required')">
<mat-label translate>tenant-profile.maximum-dashboards</mat-label> {{ 'tenant-profile.maximum-users-required' | translate}}
<input matInput required min="0" step="1" </mat-error>
formControlName="maxDashboards" <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxUsers').hasError('min')">
type="number"> {{ 'tenant-profile.maximum-users-range' | translate}}
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDashboards').hasError('required')"> </mat-error>
{{ 'tenant-profile.maximum-dashboards-required' | translate}} </mat-form-field>
</mat-error> </div>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDashboards').hasError('min')"> <mat-expansion-panel class="configuration-panel">
{{ 'tenant-profile.maximum-dashboards-range' | translate}} <mat-expansion-panel-header>
</mat-error> <mat-panel-description fxLayoutAlign="end" translate>
</mat-form-field> tenant-profile.advanced-settings
<mat-form-field class="mat-block"> </mat-panel-description>
<mat-label translate>tenant-profile.maximum-rule-chains</mat-label> </mat-expansion-panel-header>
<input matInput required min="0" step="1" <ng-template matExpansionPanelContent>
formControlName="maxRuleChains" <div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
type="number"> <mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleChains').hasError('required')"> <mat-label translate>tenant-profile.maximum-customers</mat-label>
{{ 'tenant-profile.maximum-rule-chains-required' | translate}} <input matInput required min="0" step="1"
</mat-error> formControlName="maxCustomers"
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleChains').hasError('min')"> type="number">
{{ 'tenant-profile.maximum-rule-chains-range' | translate}} <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCustomers').hasError('required')">
</mat-error> {{ 'tenant-profile.maximum-customers-required' | translate}}
</mat-form-field> </mat-error>
<mat-form-field class="mat-block"> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCustomers').hasError('min')">
<mat-label translate>tenant-profile.maximum-resources-sum-data-size</mat-label> {{ 'tenant-profile.maximum-customers-range' | translate}}
<input matInput required min="0" step="1" </mat-error>
formControlName="maxResourcesInBytes" </mat-form-field>
type="number"> <mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxResourcesInBytes').hasError('required')"> <mat-label translate>tenant-profile.maximum-rule-chains</mat-label>
{{ 'tenant-profile.maximum-resources-sum-data-size-required' | translate}} <input matInput required min="0" step="1"
</mat-error> formControlName="maxRuleChains"
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxResourcesInBytes').hasError('min')"> type="number">
{{ 'tenant-profile.maximum-resources-sum-data-size-range' | translate}} <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleChains').hasError('required')">
</mat-error> {{ 'tenant-profile.maximum-rule-chains-required' | translate}}
</mat-form-field> </mat-error>
<mat-form-field class="mat-block"> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleChains').hasError('min')">
<mat-label translate>tenant-profile.maximum-ota-packages-sum-data-size</mat-label> {{ 'tenant-profile.maximum-rule-chains-range' | translate}}
<input matInput required min="0" step="1" </mat-error>
formControlName="maxOtaPackagesInBytes" </mat-form-field>
type="number"> </div>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxOtaPackagesInBytes').hasError('required')"> </ng-template>
{{ 'tenant-profile.maximum-ota-packages-sum-data-size-required' | translate}} </mat-expansion-panel>
</mat-error> </fieldset>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxOtaPackagesInBytes').hasError('min')">
{{ 'tenant-profile.maximum-ota-packages-sum-data-size-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.max-transport-messages</mat-label>
<input matInput required min="0" step="1"
formControlName="maxTransportMessages"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportMessages').hasError('required')">
{{ 'tenant-profile.max-transport-messages-range' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportMessages').hasError('min')">
{{ 'tenant-profile.max-transport-messages-required' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.max-transport-data-points</mat-label>
<input matInput required min="0" step="1"
formControlName="maxTransportDataPoints"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportDataPoints').hasError('required')">
{{ 'tenant-profile.max-transport-data-points-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportDataPoints').hasError('min')">
{{ 'tenant-profile.max-transport-data-points-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.max-r-e-executions</mat-label>
<input matInput required min="0" step="1"
formControlName="maxREExecutions"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxREExecutions').hasError('required')">
{{ 'tenant-profile.max-r-e-executions-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxREExecutions').hasError('min')">
{{ 'tenant-profile.max-r-e-executions-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.max-j-s-executions</mat-label>
<input matInput required min="0" step="1"
formControlName="maxJSExecutions"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxJSExecutions').hasError('required')">
{{ 'tenant-profile.max-j-s-executions-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxJSExecutions').hasError('min')">
{{ 'tenant-profile.max-j-s-executions-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.max-d-p-storage-days</mat-label>
<input matInput required min="0" step="1"
formControlName="maxDPStorageDays"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDPStorageDays').hasError('required')">
{{ 'tenant-profile.max-d-p-storage-days-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDPStorageDays').hasError('min')">
{{ 'tenant-profile.max-d-p-storage-days-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.default-storage-ttl-days</mat-label>
<input matInput required min="0" step="1"
formControlName="defaultStorageTtlDays"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('defaultStorageTtlDays').hasError('required')">
{{ 'tenant-profile.default-storage-ttl-days-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('defaultStorageTtlDays').hasError('min')">
{{ 'tenant-profile.default-storage-ttl-days-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.alarms-ttl-days</mat-label>
<input matInput required min="0" step="1"
formControlName="alarmsTtlDays"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('alarmsTtlDays').hasError('required')">
{{ 'tenant-profile.alarms-ttl-days-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('alarmsTtlDays').hasError('min')">
{{ 'tenant-profile.alarms-ttl-days-days-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.rpc-ttl-days</mat-label>
<input matInput required min="0" step="1"
formControlName="rpcTtlDays"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('rpcTtlDays').hasError('required')">
{{ 'tenant-profile.rpc-ttl-days-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('rpcTtlDays').hasError('min')">
{{ 'tenant-profile.rpc-ttl-days-days-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.max-rule-node-executions-per-message</mat-label>
<input matInput required min="0" step="1"
formControlName="maxRuleNodeExecutionsPerMessage"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleNodeExecutionsPerMessage').hasError('required')">
{{ 'tenant-profile.max-rule-node-executions-per-message-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleNodeExecutionsPerMessage').hasError('min')">
{{ 'tenant-profile.max-rule-node-executions-per-message-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.max-emails</mat-label>
<input matInput required min="0" step="1"
formControlName="maxEmails"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxEmails').hasError('required')">
{{ 'tenant-profile.max-emails-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxEmails').hasError('min')">
{{ 'tenant-profile.max-emails-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.max-sms</mat-label>
<input matInput required min="0" step="1"
formControlName="maxSms"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxSms').hasError('required')">
{{ 'tenant-profile.max-sms-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxSms').hasError('min')">
{{ 'tenant-profile.max-sms-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tenant-profile.max-created-alarms</mat-label>
<input matInput required min="0" step="1"
formControlName="maxCreatedAlarms"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCreatedAlarms').hasError('required')">
{{ 'tenant-profile.max-created-alarms-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCreatedAlarms').hasError('min')">
{{ 'tenant-profile.max-created-alarms-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block"> <fieldset class="fields-group">
<mat-label translate>tenant-profile.transport-tenant-msg-rate-limit</mat-label> <legend class="group-title">
<input matInput formControlName="transportTenantMsgRateLimit"> {{ 'tenant-profile.rule-engine' | translate }} <span translate>tenant-profile.unlimited</span>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('transportTenantMsgRateLimit').hasError('pattern')"> </legend>
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}} <div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
</mat-error> <mat-form-field fxFlex class="mat-block" appearance="fill">
</mat-form-field> <mat-label translate>tenant-profile.max-r-e-executions</mat-label>
<mat-form-field class="mat-block"> <input matInput required min="0" step="1"
<mat-label translate>tenant-profile.transport-tenant-telemetry-msg-rate-limit</mat-label> formControlName="maxREExecutions"
<input matInput formControlName="transportTenantTelemetryMsgRateLimit"> type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('transportTenantTelemetryMsgRateLimit').hasError('pattern')"> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxREExecutions').hasError('required')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}} {{ 'tenant-profile.max-r-e-executions-required' | translate}}
</mat-error> </mat-error>
</mat-form-field> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxREExecutions').hasError('min')">
<mat-form-field class="mat-block"> {{ 'tenant-profile.max-r-e-executions-range' | translate}}
<mat-label translate>tenant-profile.transport-tenant-telemetry-data-points-rate-limit</mat-label> </mat-error>
<input matInput formControlName="transportTenantTelemetryDataPointsRateLimit"> </mat-form-field>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('transportTenantTelemetryDataPointsRateLimit').hasError('pattern')"> <mat-form-field fxFlex class="mat-block" appearance="fill">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}} <mat-label translate>tenant-profile.max-transport-messages</mat-label>
</mat-error> <input matInput required min="0" step="1"
</mat-form-field> formControlName="maxTransportMessages"
<mat-form-field class="mat-block"> type="number">
<mat-label translate>tenant-profile.transport-device-msg-rate-limit</mat-label> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportMessages').hasError('required')">
<input matInput formControlName="transportDeviceMsgRateLimit"> {{ 'tenant-profile.max-transport-messages-range' | translate}}
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('transportDeviceMsgRateLimit').hasError('pattern')"> </mat-error>
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}} <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportMessages').hasError('min')">
</mat-error> {{ 'tenant-profile.max-transport-messages-required' | translate}}
</mat-form-field> </mat-error>
<mat-form-field class="mat-block"> </mat-form-field>
<mat-label translate>tenant-profile.transport-device-telemetry-msg-rate-limit</mat-label> </div>
<input matInput formControlName="transportDeviceTelemetryMsgRateLimit"> <mat-expansion-panel class="configuration-panel">
</mat-form-field> <mat-expansion-panel-header>
<mat-form-field class="mat-block"> <mat-panel-description fxLayoutAlign="end" translate>
<mat-label translate>tenant-profile.transport-device-telemetry-data-points-rate-limit</mat-label> tenant-profile.advanced-settings
<input matInput formControlName="transportDeviceTelemetryDataPointsRateLimit"> </mat-panel-description>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('transportDeviceTelemetryDataPointsRateLimit').hasError('pattern')"> </mat-expansion-panel-header>
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}} <ng-template matExpansionPanelContent>
</mat-error> <div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
</mat-form-field> <mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-form-field class="mat-block"> <mat-label translate>tenant-profile.max-j-s-executions</mat-label>
<mat-label translate>tenant-profile.tenant-rest-limits</mat-label> <input matInput required min="0" step="1"
<input matInput formControlName="maxJSExecutions"
formControlName="tenantServerRestLimitsConfiguration" type="number">
type="text"> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxJSExecutions').hasError('required')">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('tenantServerRestLimitsConfiguration').hasError('pattern')"> {{ 'tenant-profile.max-j-s-executions-required' | translate}}
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}} </mat-error>
</mat-error> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxJSExecutions').hasError('min')">
</mat-form-field> {{ 'tenant-profile.max-j-s-executions-range' | translate}}
<mat-form-field class="mat-block"> </mat-error>
<mat-label translate>tenant-profile.customer-rest-limits</mat-label> </mat-form-field>
<input matInput <mat-form-field fxFlex class="mat-block" appearance="fill">
formControlName="customerServerRestLimitsConfiguration" <mat-label translate>tenant-profile.max-transport-data-points</mat-label>
type="text"> <input matInput required min="0" step="1"
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('customerServerRestLimitsConfiguration').hasError('pattern')"> formControlName="maxTransportDataPoints"
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}} type="number">
</mat-error> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportDataPoints').hasError('required')">
</mat-form-field> {{ 'tenant-profile.max-transport-data-points-required' | translate}}
<mat-form-field class="mat-block"> </mat-error>
<mat-label translate>tenant-profile.ws-limit-max-sessions-per-tenant</mat-label> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportDataPoints').hasError('min')">
<input matInput type="number" formControlName="maxWsSessionsPerTenant"> {{ 'tenant-profile.max-transport-data-points-range' | translate}}
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSessionsPerTenant').hasError('min')"> </mat-error>
{{ 'tenant-profile.too-small-value-zero' | translate}} </mat-form-field>
</mat-error> </div>
</mat-form-field> <div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field class="mat-block"> <mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-max-sessions-per-customer</mat-label> <mat-label translate>tenant-profile.max-rule-node-executions-per-message</mat-label>
<input matInput type="number" formControlName="maxWsSessionsPerCustomer"> <input matInput required min="0" step="1"
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSessionsPerCustomer').hasError('min')"> formControlName="maxRuleNodeExecutionsPerMessage"
{{ 'tenant-profile.too-small-value-zero' | translate}} type="number">
</mat-error> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleNodeExecutionsPerMessage').hasError('required')">
</mat-form-field> {{ 'tenant-profile.max-rule-node-executions-per-message-required' | translate}}
<mat-form-field class="mat-block"> </mat-error>
<mat-label translate>tenant-profile.ws-limit-max-sessions-per-regular-user</mat-label> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleNodeExecutionsPerMessage').hasError('min')">
<input matInput type="number" formControlName="maxWsSessionsPerRegularUser"> {{ 'tenant-profile.max-rule-node-executions-per-message-range' | translate}}
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSessionsPerRegularUser').hasError('min')"> </mat-error>
{{ 'tenant-profile.too-small-value-zero' | translate}} </mat-form-field>
</mat-error> <div fxFlex></div>
</mat-form-field> </div>
<mat-form-field class="mat-block"> </ng-template>
<mat-label translate>tenant-profile.ws-limit-max-sessions-per-public-user</mat-label> </mat-expansion-panel>
<input matInput type="number" formControlName="maxWsSessionsPerPublicUser"> </fieldset>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSessionsPerPublicUser').hasError('min')">
{{ 'tenant-profile.too-small-value-zero' | translate}} <fieldset class="fields-group">
</mat-error> <legend class="group-title">
</mat-form-field> {{ 'tenant-profile.time-to-live' | translate }} <span translate>tenant-profile.unlimited</span>
<mat-form-field class="mat-block"> </legend>
<mat-label translate>tenant-profile.ws-limit-queue-per-session</mat-label> <div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<input matInput type="number" formControlName="wsMsgQueueLimitPerSession"> <mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('wsMsgQueueLimitPerSession').hasError('min')"> <mat-label translate>tenant-profile.max-d-p-storage-days</mat-label>
{{ 'tenant-profile.too-small-value-one' | translate}} <input matInput required min="0" step="1"
</mat-error> formControlName="maxDPStorageDays"
</mat-form-field> type="number">
<mat-form-field class="mat-block"> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDPStorageDays').hasError('required')">
<mat-label translate>tenant-profile.ws-limit-max-subscriptions-per-tenant</mat-label> {{ 'tenant-profile.max-d-p-storage-days-required' | translate}}
<input matInput type="number" formControlName="maxWsSubscriptionsPerTenant"> </mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSubscriptionsPerTenant').hasError('min')"> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDPStorageDays').hasError('min')">
{{ 'tenant-profile.too-small-value-zero' | translate}} {{ 'tenant-profile.max-d-p-storage-days-range' | translate}}
</mat-error> </mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field class="mat-block"> <mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-max-subscriptions-per-customer</mat-label> <mat-label translate>tenant-profile.alarms-ttl-days</mat-label>
<input matInput type="number" formControlName="maxWsSubscriptionsPerCustomer"> <input matInput required min="0" step="1"
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSubscriptionsPerCustomer').hasError('min')"> formControlName="alarmsTtlDays"
{{ 'tenant-profile.too-small-value-zero' | translate}} type="number">
</mat-error> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('alarmsTtlDays').hasError('required')">
</mat-form-field> {{ 'tenant-profile.alarms-ttl-days-required' | translate}}
<mat-form-field class="mat-block"> </mat-error>
<mat-label translate>tenant-profile.ws-limit-max-subscriptions-per-regular-user</mat-label> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('alarmsTtlDays').hasError('min')">
<input matInput type="number" formControlName="maxWsSubscriptionsPerRegularUser"> {{ 'tenant-profile.alarms-ttl-days-days-range' | translate}}
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSubscriptionsPerRegularUser').hasError('min')"> </mat-error>
{{ 'tenant-profile.too-small-value-zero' | translate}} </mat-form-field>
</mat-error> </div>
</mat-form-field> <div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field class="mat-block"> <mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-max-subscriptions-per-public-user</mat-label> <mat-label translate>tenant-profile.default-storage-ttl-days</mat-label>
<input matInput type="number" formControlName="maxWsSubscriptionsPerPublicUser"> <input matInput required min="0" step="1"
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSubscriptionsPerPublicUser').hasError('min')"> formControlName="defaultStorageTtlDays"
{{ 'tenant-profile.too-small-value-zero' | translate}} type="number">
</mat-error> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('defaultStorageTtlDays').hasError('required')">
</mat-form-field> {{ 'tenant-profile.default-storage-ttl-days-required' | translate}}
<mat-form-field class="mat-block"> </mat-error>
<mat-label translate>tenant-profile.ws-limit-updates-per-session</mat-label> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('defaultStorageTtlDays').hasError('min')">
<input matInput type="text" formControlName="wsUpdatesPerSessionRateLimit"> {{ 'tenant-profile.default-storage-ttl-days-range' | translate}}
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('wsUpdatesPerSessionRateLimit').hasError('pattern')"> </mat-error>
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}} </mat-form-field>
</mat-error> <mat-form-field fxFlex class="mat-block" appearance="fill">
</mat-form-field> <mat-label translate>tenant-profile.rpc-ttl-days</mat-label>
<mat-form-field class="mat-block"> <input matInput required min="0" step="1"
<mat-label translate>tenant-profile.cassandra-tenant-limits-configuration</mat-label> formControlName="rpcTtlDays"
<input matInput type="text" formControlName="cassandraQueryTenantRateLimitsConfiguration"> type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('cassandraQueryTenantRateLimitsConfiguration').hasError('pattern')"> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('rpcTtlDays').hasError('required')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}} {{ 'tenant-profile.rpc-ttl-days-required' | translate}}
</mat-error> </mat-error>
</mat-form-field> <mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('rpcTtlDays').hasError('min')">
<mat-form-field class="mat-block"> {{ 'tenant-profile.rpc-ttl-days-days-range' | translate}}
<mat-label translate>tenant-profile.tenant-entity-export-rate-limit</mat-label> </mat-error>
<input matInput formControlName="tenantEntityExportRateLimit"> </mat-form-field>
</mat-form-field> </div>
<mat-form-field class="mat-block"> </fieldset>
<mat-label translate>tenant-profile.tenant-entity-import-rate-limit</mat-label>
<input matInput formControlName="tenantEntityImportRateLimit"> <fieldset class="fields-group">
</mat-form-field> <legend class="group-title">
{{ 'tenant-profile.alarms-and-notifications' | translate }} <span translate>tenant-profile.unlimited</span>
</legend>
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.max-emails</mat-label>
<input matInput required min="0" step="1"
formControlName="maxEmails"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxEmails').hasError('required')">
{{ 'tenant-profile.max-emails-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxEmails').hasError('min')">
{{ 'tenant-profile.max-emails-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.max-created-alarms</mat-label>
<input matInput required min="0" step="1"
formControlName="maxCreatedAlarms"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCreatedAlarms').hasError('required')">
{{ 'tenant-profile.max-created-alarms-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCreatedAlarms').hasError('min')">
{{ 'tenant-profile.max-created-alarms-range' | translate}}
</mat-error>
</mat-form-field>
</div>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.max-sms</mat-label>
<input matInput required min="0" step="1"
formControlName="maxSms"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxSms').hasError('required')">
{{ 'tenant-profile.max-sms-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxSms').hasError('min')">
{{ 'tenant-profile.max-sms-range' | translate}}
</mat-error>
</mat-form-field>
<div fxFlex></div>
</div>
</fieldset>
<fieldset class="fields-group">
<legend class="group-title">
{{ 'tenant-profile.ota-files-in-bytes' | translate }} <span translate>tenant-profile.unlimited</span>
</legend>
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.maximum-resources-sum-data-size</mat-label>
<input matInput required min="0" step="1"
formControlName="maxResourcesInBytes"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxResourcesInBytes').hasError('required')">
{{ 'tenant-profile.maximum-resources-sum-data-size-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxResourcesInBytes').hasError('min')">
{{ 'tenant-profile.maximum-resources-sum-data-size-range' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.maximum-ota-packages-sum-data-size</mat-label>
<input matInput required min="0" step="1"
formControlName="maxOtaPackagesInBytes"
type="number">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxOtaPackagesInBytes').hasError('required')">
{{ 'tenant-profile.maximum-ota-packages-sum-data-size-required' | translate}}
</mat-error>
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxOtaPackagesInBytes').hasError('min')">
{{ 'tenant-profile.maximum-ota-packages-sum-data-size-range' | translate}}
</mat-error>
</mat-form-field>
</div>
</fieldset>
<fieldset class="fields-group">
<legend class="group-title">
{{ 'tenant-profile.ws-title' | translate }} <span translate>tenant-profile.unlimited</span>
</legend>
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-max-sessions-per-tenant</mat-label>
<input matInput type="number" formControlName="maxWsSessionsPerTenant">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSessionsPerTenant').hasError('min')">
{{ 'tenant-profile.too-small-value-zero' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-max-subscriptions-per-tenant</mat-label>
<input matInput type="number" formControlName="maxWsSubscriptionsPerTenant">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSubscriptionsPerTenant').hasError('min')">
{{ 'tenant-profile.too-small-value-zero' | translate}}
</mat-error>
</mat-form-field>
</div>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-max-sessions-per-customer</mat-label>
<input matInput type="number" formControlName="maxWsSessionsPerCustomer">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSessionsPerCustomer').hasError('min')">
{{ 'tenant-profile.too-small-value-zero' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-max-subscriptions-per-customer</mat-label>
<input matInput type="number" formControlName="maxWsSubscriptionsPerCustomer">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSubscriptionsPerCustomer').hasError('min')">
{{ 'tenant-profile.too-small-value-zero' | translate}}
</mat-error>
</mat-form-field>
</div>
<mat-expansion-panel class="configuration-panel">
<mat-expansion-panel-header>
<mat-panel-description fxLayoutAlign="end" translate>
tenant-profile.advanced-settings
</mat-panel-description>
</mat-expansion-panel-header>
<ng-template matExpansionPanelContent>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-max-sessions-per-public-user</mat-label>
<input matInput type="number" formControlName="maxWsSessionsPerPublicUser">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSessionsPerPublicUser').hasError('min')">
{{ 'tenant-profile.too-small-value-zero' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-max-subscriptions-per-public-user</mat-label>
<input matInput type="number" formControlName="maxWsSubscriptionsPerPublicUser">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSubscriptionsPerPublicUser').hasError('min')">
{{ 'tenant-profile.too-small-value-zero' | translate}}
</mat-error>
</mat-form-field>
</div>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-max-sessions-per-regular-user</mat-label>
<input matInput type="number" formControlName="maxWsSessionsPerRegularUser">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSessionsPerRegularUser').hasError('min')">
{{ 'tenant-profile.too-small-value-zero' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-max-subscriptions-per-regular-user</mat-label>
<input matInput type="number" formControlName="maxWsSubscriptionsPerRegularUser">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxWsSubscriptionsPerRegularUser').hasError('min')">
{{ 'tenant-profile.too-small-value-zero' | translate}}
</mat-error>
</mat-form-field>
</div>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block" appearance="fill">
<mat-label translate>tenant-profile.ws-limit-queue-per-session</mat-label>
<input matInput type="number" formControlName="wsMsgQueueLimitPerSession">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('wsMsgQueueLimitPerSession').hasError('min')">
{{ 'tenant-profile.too-small-value-one' | translate}}
</mat-error>
</mat-form-field>
<div fxFlex></div>
</div>
</ng-template>
</mat-expansion-panel>
</fieldset>
<fieldset class="fields-group">
<legend class="group-title">Rate limits</legend>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.transport-tenant-msg-rate-limit</mat-label>
<input matInput formControlName="transportTenantMsgRateLimit">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('transportTenantMsgRateLimit').hasError('pattern')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.transport-device-msg-rate-limit</mat-label>
<input matInput formControlName="transportDeviceMsgRateLimit">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('transportDeviceMsgRateLimit').hasError('pattern')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}}
</mat-error>
</mat-form-field>
</div>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.transport-tenant-telemetry-msg-rate-limit</mat-label>
<input matInput formControlName="transportTenantTelemetryMsgRateLimit">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('transportTenantTelemetryMsgRateLimit').hasError('pattern')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.transport-device-telemetry-msg-rate-limit</mat-label>
<input matInput formControlName="transportDeviceTelemetryMsgRateLimit">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('transportTenantTelemetryMsgRateLimit').hasError('pattern')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}}
</mat-error>
</mat-form-field>
</div>
<mat-expansion-panel class="configuration-panel">
<mat-expansion-panel-header>
<mat-panel-description fxLayoutAlign="end" translate>
tenant-profile.advanced-settings
</mat-panel-description>
</mat-expansion-panel-header>
<ng-template matExpansionPanelContent>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.transport-tenant-telemetry-data-points-rate-limit</mat-label>
<input matInput formControlName="transportTenantTelemetryDataPointsRateLimit">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('transportTenantTelemetryDataPointsRateLimit').hasError('pattern')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.transport-device-telemetry-data-points-rate-limit</mat-label>
<input matInput formControlName="transportDeviceTelemetryDataPointsRateLimit">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('transportDeviceTelemetryDataPointsRateLimit').hasError('pattern')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}}
</mat-error>
</mat-form-field>
</div>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.tenant-rest-limits</mat-label>
<input matInput
formControlName="tenantServerRestLimitsConfiguration"
type="text">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('tenantServerRestLimitsConfiguration').hasError('pattern')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.customer-rest-limits</mat-label>
<input matInput
formControlName="customerServerRestLimitsConfiguration"
type="text">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('customerServerRestLimitsConfiguration').hasError('pattern')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}}
</mat-error>
</mat-form-field>
</div>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.tenant-entity-export-rate-limit</mat-label>
<input matInput formControlName="tenantEntityExportRateLimit">
</mat-form-field>
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.tenant-entity-import-rate-limit</mat-label>
<input matInput formControlName="tenantEntityImportRateLimit">
</mat-form-field>
</div>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.ws-limit-updates-per-session</mat-label>
<input matInput type="text" formControlName="wsUpdatesPerSessionRateLimit">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('wsUpdatesPerSessionRateLimit').hasError('pattern')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field fxFlex class="mat-block">
<mat-label translate>tenant-profile.cassandra-tenant-limits-configuration</mat-label>
<input matInput type="text" formControlName="cassandraQueryTenantRateLimitsConfiguration">
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('cassandraQueryTenantRateLimitsConfiguration').hasError('pattern')">
{{ 'tenant-profile.incorrect-pattern-for-rate-limits' | translate}}
</mat-error>
</mat-form-field>
</div>
</ng-template>
</mat-expansion-panel>
</fieldset>
</section> </section>

55
ui-ngx/src/app/modules/home/components/profile/tenant/default-tenant-profile-configuration.component.scss

@ -0,0 +1,55 @@
/**
* Copyright © 2016-2022 The Thingsboard Authors
*
* 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.
*/
:host {
.fields-element {
padding-top: 15px;
}
.group-title > span {
color: rgba(0, 0, 0, 0.54);
}
::ng-deep {
.mat-expansion-panel {
&.configuration-panel {
box-shadow: none;
.mat-expansion-panel-header {
padding: 0;
&:hover {
background: none !important;
}
.mat-expansion-indicator {
padding: 2px;
}
}
> .mat-expansion-panel-content {
> .mat-expansion-panel-body {
padding: 0;
}
}
.mat-expansion-panel-header-description {
align-items: center;
}
}
}
}
}

4
ui-ngx/src/app/modules/home/components/profile/tenant/default-tenant-profile-configuration.component.ts

@ -25,7 +25,7 @@ import { isDefinedAndNotNull } from '@core/utils';
@Component({ @Component({
selector: 'tb-default-tenant-profile-configuration', selector: 'tb-default-tenant-profile-configuration',
templateUrl: './default-tenant-profile-configuration.component.html', templateUrl: './default-tenant-profile-configuration.component.html',
styleUrls: [], styleUrls: ['./default-tenant-profile-configuration.component.scss'],
providers: [{ providers: [{
provide: NG_VALUE_ACCESSOR, provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DefaultTenantProfileConfigurationComponent), useExisting: forwardRef(() => DefaultTenantProfileConfigurationComponent),
@ -35,7 +35,7 @@ import { isDefinedAndNotNull } from '@core/utils';
export class DefaultTenantProfileConfigurationComponent implements ControlValueAccessor, OnInit { export class DefaultTenantProfileConfigurationComponent implements ControlValueAccessor, OnInit {
defaultTenantProfileConfigurationFormGroup: FormGroup; defaultTenantProfileConfigurationFormGroup: FormGroup;
rateLimitsPattern = '^(((\\d+):(\\d+)),)*((\\d+):(\\d+))$'; rateLimitsPattern = '([1-9]\\d*:[1-9]\\d*)(,[1-9]\\d*:[1-9]\\d*)*';
private requiredValue: boolean; private requiredValue: boolean;
get required(): boolean { get required(): boolean {

274
ui-ngx/src/app/modules/home/components/queue/queue-form.component.html

@ -17,7 +17,7 @@
--> -->
<form [formGroup]="queueFormGroup" fxLayout="column"> <form [formGroup]="queueFormGroup" fxLayout="column">
<mat-form-field class="mat-block"> <mat-form-field class="mat-block" appearance="fill">
<mat-label translate>admin.queue-name</mat-label> <mat-label translate>admin.queue-name</mat-label>
<input matInput formControlName="name" required> <input matInput formControlName="name" required>
<mat-error *ngIf="queueFormGroup.get('name').hasError('required')"> <mat-error *ngIf="queueFormGroup.get('name').hasError('required')">
@ -27,151 +27,181 @@
{{ 'queue.name-unique' | translate }} {{ 'queue.name-unique' | translate }}
</mat-error> </mat-error>
</mat-form-field> </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-accordion class="queue-strategy" [multi]="true">
<mat-expansion-panel [expanded]="false"> <mat-expansion-panel [expanded]="true">
<mat-expansion-panel-header> <mat-expansion-panel-header>
<mat-panel-title translate> <mat-panel-title class="panel-title" translate>
queue.submit-strategy queue.submit-settings
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<ng-template matExpansionPanelContent> <ng-template matExpansionPanelContent>
<div formGroupName="submitStrategy"> <div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap="16px" formGroupName="submitStrategy" style="padding-bottom: 15px;">
<mat-form-field class="mat-block"> <div fxFlex>
<mat-label translate>queue.submit-strategy</mat-label> <label class="group-label" translate>queue.submit-strategy</label>
<mat-select formControlName="type" required> <mat-radio-group fxFlex fxLayout="column" fxLayoutGap="15px" formControlName="type" required>
<mat-option *ngFor="let strategy of submitStrategies" [value]="strategy"> <mat-radio-button *ngFor="let strategy of submitStrategies" [value]="strategy">
{{ queueSubmitStrategyTypesMap.get(queueSubmitStrategyTypes[strategy]).label | translate }} {{ queueSubmitStrategyTypesMap.get(queueSubmitStrategyTypes[strategy]).label | translate }}
</mat-option> <mat-icon
</mat-select> class="hint-icon"
<mat-error *ngIf="queueFormGroup.get('submitStrategy.type').hasError('required')"> matTooltip="{{ queueSubmitStrategyTypesMap.get(queueSubmitStrategyTypes[strategy]).hint | translate }}"
{{ 'queue.submit-strategy-type-required' | translate }} svgIcon="mdi:information-outline">
</mat-error> </mat-icon>
</mat-form-field> </mat-radio-button>
<mat-form-field class="mat-block" *ngIf="hideBatchSize"> </mat-radio-group>
<mat-label translate>queue.batch-size</mat-label> </div>
<input type="number" matInput formControlName="batchSize" required> <div fxFlex *ngIf="hideBatchSize">
<mat-error *ngIf="queueFormGroup.get('submitStrategy.batchSize').hasError('required')"> <label class="group-label" translate>queue.grouping-parameter</label>
{{ 'queue.batch-size-required' | translate }} <mat-form-field class="mat-block">
</mat-error> <mat-label translate>queue.batch-size</mat-label>
<mat-error *ngIf="queueFormGroup.get('submitStrategy.batchSize').hasError('min') && <input type="number" matInput formControlName="batchSize" required>
!queueFormGroup.get('submitStrategy.batchSize').hasError('required')"> <mat-error *ngIf="queueFormGroup.get('submitStrategy.batchSize').hasError('required')">
{{ 'queue.batch-size-min-value' | translate }} {{ 'queue.batch-size-required' | translate }}
</mat-error> </mat-error>
</mat-form-field> <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>
</div> </div>
</ng-template> </ng-template>
</mat-expansion-panel> </mat-expansion-panel>
<mat-expansion-panel [expanded]="false"> <mat-expansion-panel [expanded]="true">
<mat-expansion-panel-header> <mat-expansion-panel-header>
<mat-panel-title translate> <mat-panel-title class="panel-title" translate>
queue.processing-strategy queue.processing-settings
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<ng-template matExpansionPanelContent> <ng-template matExpansionPanelContent>
<div formGroupName="processingStrategy"> <div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap="16px" formGroupName="processingStrategy" style="padding-bottom: 15px;">
<mat-form-field class="mat-block"> <div fxFlex>
<mat-label translate>queue.processing-strategy</mat-label> <label class="group-label" translate>queue.processing-strategy</label>
<mat-select formControlName="type" required> <mat-radio-group fxFlex fxLayout="column" fxLayoutGap="15px" formControlName="type" required>
<mat-option *ngFor="let strategy of processingStrategies" [value]="strategy"> <mat-radio-button *ngFor="let strategy of processingStrategies" [value]="strategy">
{{ queueProcessingStrategyTypesMap.get(queueProcessingStrategyTypes[strategy]).label | translate }} {{ queueProcessingStrategyTypesMap.get(queueProcessingStrategyTypes[strategy]).label | translate }}
</mat-option> <mat-icon
</mat-select> class="hint-icon"
<mat-error *ngIf="queueFormGroup.get('processingStrategy.type').hasError('required')"> matTooltip="{{ queueProcessingStrategyTypesMap.get(queueProcessingStrategyTypes[strategy]).hint | translate }}"
{{ 'queue.processing-strategy-type-required' | translate }} svgIcon="mdi:information-outline">
</mat-error> </mat-icon>
</mat-form-field> </mat-radio-button>
<mat-form-field class="mat-block"> </mat-radio-group>
<mat-label translate>queue.retries</mat-label> </div>
<input type="number" matInput formControlName="retries" required> <div fxFlex>
<mat-error *ngIf="queueFormGroup.get('processingStrategy.retries').hasError('required')"> <label class="group-label" translate>queue.retries-settings</label>
{{ 'queue.retries-required' | translate }} <mat-form-field class="mat-block">
</mat-error> <mat-label translate>queue.retries</mat-label>
<mat-error *ngIf="queueFormGroup.get('processingStrategy.retries').hasError('min') && <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')"> !queueFormGroup.get('processingStrategy.retries').hasError('required')">
{{ 'queue.retries-min-value' | translate }} {{ 'queue.retries-min-value' | translate }}
</mat-error> </mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field class="mat-block"> <mat-form-field class="mat-block">
<mat-label translate>queue.failure-percentage</mat-label> <mat-label translate>queue.failure-percentage</mat-label>
<input type="number" matInput formControlName="failurePercentage" required> <input type="number" matInput formControlName="failurePercentage" required>
<mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('required')"> <mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('required')">
{{ 'queue.failure-percentage-required' | translate }} {{ 'queue.failure-percentage-required' | translate }}
</mat-error> </mat-error>
<mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('min') && <mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('min') &&
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('required') && !queueFormGroup.get('processingStrategy.failurePercentage').hasError('required') &&
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('max')"> !queueFormGroup.get('processingStrategy.failurePercentage').hasError('max')">
{{ 'queue.failure-percentage-min-value' | translate }} {{ 'queue.failure-percentage-min-value' | translate }}
</mat-error> </mat-error>
<mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('max') && <mat-error *ngIf="queueFormGroup.get('processingStrategy.failurePercentage').hasError('max') &&
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('required') && !queueFormGroup.get('processingStrategy.failurePercentage').hasError('required') &&
!queueFormGroup.get('processingStrategy.failurePercentage').hasError('min')"> !queueFormGroup.get('processingStrategy.failurePercentage').hasError('min')">
{{ 'queue.failure-percentage-max-value' | translate }} {{ 'queue.failure-percentage-max-value' | translate }}
</mat-error> </mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field class="mat-block"> <mat-form-field class="mat-block">
<mat-label translate>queue.pause-between-retries</mat-label> <mat-label translate>queue.pause-between-retries</mat-label>
<input type="number" matInput formControlName="pauseBetweenRetries" required> <input type="number" matInput formControlName="pauseBetweenRetries" required>
<mat-error *ngIf="queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('required')"> <mat-error *ngIf="queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('required')">
{{ 'queue.pause-between-retries-required' | translate }} {{ 'queue.pause-between-retries-required' | translate }}
</mat-error> </mat-error>
<mat-error *ngIf="queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('min') && <mat-error *ngIf="queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('min') &&
!queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('required')"> !queueFormGroup.get('processingStrategy.pauseBetweenRetries').hasError('required')">
{{ 'queue.pause-between-retries-min-value' | translate }} {{ 'queue.pause-between-retries-min-value' | translate }}
</mat-error> </mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field class="mat-block"> <mat-form-field class="mat-block">
<mat-label translate>queue.max-pause-between-retries</mat-label> <mat-label translate>queue.max-pause-between-retries</mat-label>
<input type="number" matInput formControlName="maxPauseBetweenRetries" required> <input type="number" matInput formControlName="maxPauseBetweenRetries" required>
<mat-error *ngIf="queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('required')"> <mat-error *ngIf="queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('required')">
{{ 'queue.max-pause-between-retries-required' | translate }} {{ 'queue.max-pause-between-retries-required' | translate }}
</mat-error> </mat-error>
<mat-error *ngIf="queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('min') && <mat-error *ngIf="queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('min') &&
!queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('required')"> !queueFormGroup.get('processingStrategy.maxPauseBetweenRetries').hasError('required')">
{{ 'queue.max-pause-between-retries-min-value' | translate }} {{ 'queue.max-pause-between-retries-min-value' | translate }}
</mat-error> </mat-error>
</mat-form-field> </mat-form-field>
</div>
</div>
</ng-template>
</mat-expansion-panel>
<mat-expansion-panel [expanded]="true">
<mat-expansion-panel-header>
<mat-panel-title class="panel-title" translate>
queue.polling-settings
</mat-panel-title>
</mat-expansion-panel-header>
<ng-template matExpansionPanelContent>
<div fxFlex fxLayout="column" fxLayoutGap="10px" style="padding-bottom: 15px;">
<div fxFlex>
<label class="group-label" translate>queue.batch-processing</label>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap="10px">
<mat-form-field fxFlex 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 fxFlex 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>
</div>
</div>
<div fxFlex>
<label class="group-label" translate>queue.immediate-processing</label>
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap="10px">
<mat-checkbox fxFlex fxFlexAlign.gt-xs="center" formControlName="consumerPerPartition">
{{ 'queue.consumer-per-partition' | translate }}
</mat-checkbox>
<mat-form-field fxFlex 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>
</div>
</div>
</div> </div>
</ng-template> </ng-template>
</mat-expansion-panel> </mat-expansion-panel>
</mat-accordion> </mat-accordion>
<mat-form-field class="mat-block" formGroupName="additionalInfo"> <mat-form-field class="mat-block" formGroupName="additionalInfo" appearance="fill">
<mat-label translate>queue.description</mat-label> <mat-label translate>queue.description</mat-label>
<textarea matInput formControlName="description" rows="2"></textarea> <textarea matInput formControlName="description" rows="2"></textarea>
<mat-hint translate>queue.description-hint</mat-hint> <mat-hint translate>queue.description-hint</mat-hint>

32
ui-ngx/src/app/modules/home/components/queue/queue-form.component.scss

@ -13,16 +13,38 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
:host ::ng-deep { :host {
.queue-strategy { .queue-strategy {
padding-bottom: 16px; padding-bottom: 16px;
.mat-expansion-panel-header { .group-label {
height: 50px; display: block;
padding-bottom: 10px;
} }
.mat-expansion-panel-body { .panel-title {
padding-bottom: 0 !important; font-weight: 500;
}
.hint-icon {
width: 15px;
height: 15px;
vertical-align: top;
}
}
::ng-deep {
.mat-form-field-infix {
width: 100% !important;
}
.queue-strategy {
.mat-expansion-panel-header {
height: 50px;
}
.mat-expansion-panel-body {
padding-bottom: 0 !important;
}
} }
} }
} }

185
ui-ngx/src/assets/locale/locale.constant-en_US.json

@ -2959,18 +2959,25 @@
"add" : "Add queue", "add" : "Add queue",
"details": "Queue details", "details": "Queue details",
"topic": "Topic", "topic": "Topic",
"submit-strategy": "Submit Strategy", "submit-settings": "Submit settings",
"processing-strategy": "Processing Strategy", "submit-strategy": "Strategy type *",
"grouping-parameter": "Grouping parameter",
"processing-settings": "Retries processing settings",
"processing-strategy": "Processing type *",
"retries-settings": "Retries settings",
"polling-settings": "Polling settings",
"batch-processing": "Batch processing",
"poll-interval": "Poll interval", "poll-interval": "Poll interval",
"partitions": "Partitions", "partitions": "Partitions",
"consumer-per-partition": "Consumer per partition", "immediate-processing": "Immediate processing",
"consumer-per-partition": "Send message poll for each consumer",
"consumer-per-partition-hint": "Enable separate consumer(s) per each partition", "consumer-per-partition-hint": "Enable separate consumer(s) per each partition",
"processing-timeout": "Processing timeout, ms", "processing-timeout": "Processing within, ms",
"batch-size": "Batch size", "batch-size": "Batch size",
"retries": "Retries (0 - unlimited)", "retries": "Number of retries (0 – unlimited)",
"failure-percentage": "Failure Percentage", "failure-percentage": "Percentage of failure messages for skipping retries",
"pause-between-retries": "Pause between retries", "pause-between-retries": "Retry within, sec",
"max-pause-between-retries": "Maximal pause between retries", "max-pause-between-retries": "Additional retry within, sec",
"delete": "Delete queue", "delete": "Delete queue",
"copyId": "Copy queue Id", "copyId": "Copy queue Id",
"idCopiedMessage": "Queue Id has been copied to clipboard", "idCopiedMessage": "Queue Id has been copied to clipboard",
@ -3085,93 +3092,101 @@
"export-failed-error": "Unable to export tenant profile: {{error}}", "export-failed-error": "Unable to export tenant profile: {{error}}",
"tenant-profile-file": "Tenant profile file", "tenant-profile-file": "Tenant profile file",
"invalid-tenant-profile-file-error": "Unable to import tenant profile: Invalid tenant profile data structure.", "invalid-tenant-profile-file-error": "Unable to import tenant profile: Invalid tenant profile data structure.",
"maximum-devices": "Maximum number of devices (0 - unlimited)", "advanced-settings": "Advanced settings",
"maximum-devices-required": "Maximum number of devices is required.", "entities": "Entities",
"maximum-devices-range": "Minimum number of devices can't be negative", "rule-engine": "Rule Engine",
"maximum-assets": "Maximum number of assets (0 - unlimited)", "time-to-live": "Time-to-live",
"maximum-assets-required": "Maximum number of assets is required.", "alarms-and-notifications": "Alarms and notifications",
"maximum-assets-range": "Maximum number of assets can't be negative", "ota-files-in-bytes": "OTA files in bytes",
"maximum-customers": "Maximum number of customers (0 - unlimited)", "ws-title": "WS",
"maximum-customers-required": "Maximum number of customers is required.", "unlimited": "(0 - unlimited)",
"maximum-customers-range": "Maximum number of customers can't be negative", "maximum-devices": "Devices maximum number",
"maximum-users": "Maximum number of users (0 - unlimited)", "maximum-devices-required": "Devices maximum number is required.",
"maximum-users-required": "Maximum number of users is required.", "maximum-devices-range": "Devices maximum number can't be negative",
"maximum-users-range": "Maximum number of users can't be negative", "maximum-assets": "Assets maximum number",
"maximum-dashboards": "Maximum number of dashboards (0 - unlimited)", "maximum-assets-required": "Assets maximum number is required.",
"maximum-dashboards-required": "Maximum number of dashboards is required.", "maximum-assets-range": "Assets maximum number can't be negative",
"maximum-dashboards-range": "Maximum number of dashboards can't be negative", "maximum-customers": "Customers maximum number",
"maximum-rule-chains": "Maximum number of rule chains (0 - unlimited)", "maximum-customers-required": "Customers maximum number is required.",
"maximum-rule-chains-required": "Maximum number of rule chains is required.", "maximum-customers-range": "Customers maximum number can't be negative",
"maximum-rule-chains-range": "Maximum number of rule chains can't be negative", "maximum-users": "Users maximum number",
"maximum-resources-sum-data-size": "Maximum sum of resource files size in bytes (0 - unlimited)", "maximum-users-required": "Users maximum number is required.",
"maximum-resources-sum-data-size-required": "Maximum sum of resource files size is required.", "maximum-users-range": "Users maximum number can't be negative",
"maximum-resources-sum-data-size-range": "Maximum sum of resource files size can`t be negative", "maximum-dashboards": "Dashboards maximum number",
"maximum-ota-packages-sum-data-size": "Maximum sum of ota package files size in bytes (0 - unlimited)", "maximum-dashboards-required": "Dashboards maximum number is required.",
"maximum-ota-package-sum-data-size-required": "Maximum sum of ota package files size is required.", "maximum-dashboards-range": "Dashboards maximum number can't be negative",
"maximum-ota-package-sum-data-size-range": "Maximum sum of ota package files size can`t be negative", "maximum-rule-chains": "Rule chains maximum number",
"transport-tenant-msg-rate-limit": "Transport tenant messages rate limit.", "maximum-rule-chains-required": "Rule chains maximum number is required.",
"transport-tenant-telemetry-msg-rate-limit": "Transport tenant telemetry messages rate limit.", "maximum-rule-chains-range": "Rule chains maximum number can't be negative",
"transport-tenant-telemetry-data-points-rate-limit": "Transport tenant telemetry data points rate limit.", "maximum-resources-sum-data-size": "Resource files sum size",
"transport-device-msg-rate-limit": "Transport device messages rate limit.", "maximum-resources-sum-data-size-required": "Resource files sum size is required.",
"transport-device-telemetry-msg-rate-limit": "Transport device telemetry messages rate limit.", "maximum-resources-sum-data-size-range": "Resource files sum size can`t be negative",
"transport-device-telemetry-data-points-rate-limit": "Transport device telemetry data points rate limit.", "maximum-ota-packages-sum-data-size": "OTA package files sum size",
"tenant-entity-export-rate-limit": "Entity version creation rate limit", "maximum-ota-package-sum-data-size-required": "OTA package files sum size is required.",
"tenant-entity-import-rate-limit": "Entity version load rate limit", "maximum-ota-package-sum-data-size-range": "OTA package files sum size can`t be negative",
"max-transport-messages": "Maximum number of transport messages (0 - unlimited)", "transport-tenant-msg-rate-limit": "Transport tenant messages",
"max-transport-messages-required": "Maximum number of transport messages is required.", "transport-tenant-telemetry-msg-rate-limit": "Transport tenant telemetry messages",
"max-transport-messages-range": "Maximum number of transport messages can't be negative", "transport-tenant-telemetry-data-points-rate-limit": "Transport tenant telemetry data points",
"max-transport-data-points": "Maximum number of transport data points (0 - unlimited)", "transport-device-msg-rate-limit": "Transport device messages",
"max-transport-data-points-required": "Maximum number of transport data points is required.", "transport-device-telemetry-msg-rate-limit": "Transport device telemetry messages",
"max-transport-data-points-range": "Maximum number of transport data points can't be negative", "transport-device-telemetry-data-points-rate-limit": "Transport device telemetry data points",
"max-r-e-executions": "Maximum number of Rule Engine executions (0 - unlimited)", "tenant-entity-export-rate-limit": "Entity version creation",
"max-r-e-executions-required": "Maximum number of Rule Engine executions is required.", "tenant-entity-import-rate-limit": "Entity version load",
"max-r-e-executions-range": "Maximum number of Rule Engine executions can't be negative", "max-transport-messages": "Transport messages maximum number",
"max-j-s-executions": "Maximum number of JavaScript executions (0 - unlimited)", "max-transport-messages-required": "Transport messages maximum number is required.",
"max-j-s-executions-required": "Maximum number of JavaScript executions is required.", "max-transport-messages-range": "Transport messages maximum number can't be negative",
"max-j-s-executions-range": "Maximum number of JavaScript executions can't be negative", "max-transport-data-points": "Transport data points maximum number ",
"max-d-p-storage-days": "Maximum number of data points storage days (0 - unlimited)", "max-transport-data-points-required": "Transport data points maximum number is required.",
"max-d-p-storage-days-required": "Maximum number of data points storage days is required.", "max-transport-data-points-range": "Transport data points maximum number can't be negative",
"max-d-p-storage-days-range": "Maximum number of data points storage days can't be negative", "max-r-e-executions": "Rule Engine executions maximum number",
"default-storage-ttl-days": "Default storage TTL days (0 - unlimited)", "max-r-e-executions-required": "Rule Engine executions maximum number is required.",
"default-storage-ttl-days-required": "Default storage TTL days is required.", "max-r-e-executions-range": "Rule Engine executions maximum number can't be negative",
"default-storage-ttl-days-range": "Default storage TTL days can't be negative", "max-j-s-executions": "JavaScript executions maximum number ",
"alarms-ttl-days": "Alarms TTL days (0 - unlimited)", "max-j-s-executions-required": "JavaScript executions maximum number is required.",
"max-j-s-executions-range": "JavaScript executions maximum number can't be negative",
"max-d-p-storage-days": "Data points storage days maximum number",
"max-d-p-storage-days-required": "Data points storage days maximum number is required.",
"max-d-p-storage-days-range": "Data points storage days maximum number can't be negative",
"default-storage-ttl-days": "Storage TTL days by default",
"default-storage-ttl-days-required": "Storage TTL days by default is required.",
"default-storage-ttl-days-range": "Storage TTL days by default can't be negative",
"alarms-ttl-days": "Alarms TTL days",
"alarms-ttl-days-required": "Alarms TTL days required", "alarms-ttl-days-required": "Alarms TTL days required",
"alarms-ttl-days-days-range": "Alarms TTL days can't be negative", "alarms-ttl-days-days-range": "Alarms TTL days can't be negative",
"rpc-ttl-days": "RPC TTL days (0 - unlimited)", "rpc-ttl-days": "RPC TTL days",
"rpc-ttl-days-required": "RPC TTL days required", "rpc-ttl-days-required": "RPC TTL days required",
"rpc-ttl-days-days-range": "RPC TTL days can't be negative", "rpc-ttl-days-days-range": "RPC TTL days can't be negative",
"max-rule-node-executions-per-message": "Maximum number of rule node executions per message (0 - unlimited)", "max-rule-node-executions-per-message": "Rule node per message executions maximum number",
"max-rule-node-executions-per-message-required": "Maximum number of rule node executions per message is required.", "max-rule-node-executions-per-message-required": "MRule node per message executions maximum number is required.",
"max-rule-node-executions-per-message-range": "Maximum number of rule node executions per message can't be negative", "max-rule-node-executions-per-message-range": "Rule node per message executions maximum number can't be negative",
"max-emails": "Maximum number of emails sent (0 - unlimited)", "max-emails": "Emails sent maximum number",
"max-emails-required": "Maximum number of emails sent is required.", "max-emails-required": "Emails sent maximum number is required.",
"max-emails-range": "Maximum number of emails sent can't be negative", "max-emails-range": "Emails sent maximum number can't be negative",
"max-sms": "Maximum number of SMS sent (0 - unlimited)", "max-sms": "SMS sent maximum number",
"max-sms-required": "Maximum number of SMS sent is required.", "max-sms-required": "SMS sent maximum number is required.",
"max-sms-range": "Maximum number of SMS sent can't be negative", "max-sms-range": "SMS sent maximum number can't be negative",
"max-created-alarms": "Maximum number of alarms created (0 - unlimited)", "max-created-alarms": "Alarms created maximum number",
"max-created-alarms-required": "Maximum number of alarms created is required.", "max-created-alarms-required": "Alarms created maximum number is required.",
"max-created-alarms-range": "Maximum number of alarms created can't be negative", "max-created-alarms-range": "Alarms created maximum number be negative",
"no-queue": "No Queue configured", "no-queue": "No Queue configured",
"add-queue": "Add Queue", "add-queue": "Add Queue",
"queues-with-count": "Queues ({{count}})", "queues-with-count": "Queues ({{count}})",
"tenant-rest-limits": "Rate limit for REST requests for tenant", "tenant-rest-limits": "REST requests for tenant",
"customer-rest-limits": "Rate limit for REST requests for customer", "customer-rest-limits": "REST requests for customer",
"incorrect-pattern-for-rate-limits": "The format is comma separated pairs of capacity and period (in seconds) with a colon between, e.g. 100:1,2000:60", "incorrect-pattern-for-rate-limits": "The format is comma separated pairs of capacity and period (in seconds) with a colon between, e.g. 100:1,2000:60",
"too-small-value-zero": "The value must be bigger than 0", "too-small-value-zero": "The value must be bigger than 0",
"too-small-value-one": "The value must be bigger than 1", "too-small-value-one": "The value must be bigger than 1",
"cassandra-tenant-limits-configuration": "Cassandra query rate limit for tenant", "cassandra-tenant-limits-configuration": "Cassandra query for tenant",
"ws-limit-max-sessions-per-tenant": "Maximum number of WS sessions per tenant", "ws-limit-max-sessions-per-tenant": "Sessions per tenant maximum number",
"ws-limit-max-sessions-per-customer": "Maximum number of WS sessions per customer", "ws-limit-max-sessions-per-customer": "Sessions per customer maximum number",
"ws-limit-max-sessions-per-regular-user": "Maximum number of WS sessions per regular user", "ws-limit-max-sessions-per-regular-user": "Sessions per regular user maximum number",
"ws-limit-max-sessions-per-public-user": "Maximum number of WS sessions per public user", "ws-limit-max-sessions-per-public-user": "Sessions per public user maximum number",
"ws-limit-queue-per-session": "Maximum size of WS message queue per session", "ws-limit-queue-per-session": "Message queue per session maximum size",
"ws-limit-max-subscriptions-per-tenant": "Maximum number of WS subscriptions per tenant", "ws-limit-max-subscriptions-per-tenant": "Subscriptions per tenant maximum number",
"ws-limit-max-subscriptions-per-customer": "Maximum number of WS subscriptions per customer", "ws-limit-max-subscriptions-per-customer": "Subscriptions per customer maximum number",
"ws-limit-max-subscriptions-per-regular-user": "Maximum number of WS subscriptions per regular user", "ws-limit-max-subscriptions-per-regular-user": "Subscriptions per regular user maximum number",
"ws-limit-max-subscriptions-per-public-user": "Maximum number of WS subscriptions per public user", "ws-limit-max-subscriptions-per-public-user": "Subscriptions per public user maximum number",
"ws-limit-updates-per-session": "Rate limit for WS updates per session" "ws-limit-updates-per-session": "WS updates per session"
}, },
"timeinterval": { "timeinterval": {
"seconds-interval": "{ seconds, plural, 1 {1 second} other {# seconds} }", "seconds-interval": "{ seconds, plural, 1 {1 second} other {# seconds} }",

Loading…
Cancel
Save