Merge with master
This commit is contained in:
commit
11b49146ce
@ -83,7 +83,7 @@ public class QueueController extends BaseController {
|
|||||||
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
|
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
|
||||||
checkParameter("serviceType", serviceType);
|
checkParameter("serviceType", serviceType);
|
||||||
PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
|
PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
|
||||||
ServiceType type = ServiceType.valueOf(serviceType);
|
ServiceType type = ServiceType.of(serviceType);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TB_RULE_ENGINE:
|
case TB_RULE_ENGINE:
|
||||||
return queueService.findQueuesByTenantId(getTenantId(), pageLink);
|
return queueService.findQueuesByTenantId(getTenantId(), pageLink);
|
||||||
@ -136,7 +136,7 @@ public class QueueController extends BaseController {
|
|||||||
|
|
||||||
checkEntity(queue.getId(), queue, Resource.QUEUE);
|
checkEntity(queue.getId(), queue, Resource.QUEUE);
|
||||||
|
|
||||||
ServiceType type = ServiceType.valueOf(serviceType);
|
ServiceType type = ServiceType.of(serviceType);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TB_RULE_ENGINE:
|
case TB_RULE_ENGINE:
|
||||||
queue.setTenantId(getTenantId());
|
queue.setTenantId(getTenantId());
|
||||||
|
|||||||
@ -406,7 +406,7 @@ public class UserController extends BaseController {
|
|||||||
public void setUserCredentialsEnabled(
|
public void setUserCredentialsEnabled(
|
||||||
@ApiParam(value = USER_ID_PARAM_DESCRIPTION)
|
@ApiParam(value = USER_ID_PARAM_DESCRIPTION)
|
||||||
@PathVariable(USER_ID) String strUserId,
|
@PathVariable(USER_ID) String strUserId,
|
||||||
@ApiParam(value = "Disable (\"true\") or enable (\"false\") the credentials.", defaultValue = "true")
|
@ApiParam(value = "Enable (\"true\") or disable (\"false\") the credentials.", defaultValue = "true")
|
||||||
@RequestParam(required = false, defaultValue = "true") boolean userCredentialsEnabled) throws ThingsboardException {
|
@RequestParam(required = false, defaultValue = "true") boolean userCredentialsEnabled) throws ThingsboardException {
|
||||||
checkParameter(USER_ID, strUserId);
|
checkParameter(USER_ID, strUserId);
|
||||||
UserId userId = new UserId(toUUID(strUserId));
|
UserId userId = new UserId(toUUID(strUserId));
|
||||||
|
|||||||
@ -0,0 +1,96 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2023 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.
|
||||||
|
*/
|
||||||
|
package org.thingsboard.server.controller;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
|
import org.thingsboard.server.common.data.page.PageData;
|
||||||
|
import org.thingsboard.server.common.data.page.PageLink;
|
||||||
|
import org.thingsboard.server.common.data.queue.ProcessingStrategy;
|
||||||
|
import org.thingsboard.server.common.data.queue.ProcessingStrategyType;
|
||||||
|
import org.thingsboard.server.common.data.queue.Queue;
|
||||||
|
import org.thingsboard.server.common.data.queue.SubmitStrategy;
|
||||||
|
import org.thingsboard.server.common.data.queue.SubmitStrategyType;
|
||||||
|
import org.thingsboard.server.dao.service.DaoSqlTest;
|
||||||
|
|
||||||
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||||
|
|
||||||
|
@DaoSqlTest
|
||||||
|
public class BaseQueueControllerTest extends AbstractControllerTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testQueueWithServiceTypeRE() throws Exception {
|
||||||
|
loginSysAdmin();
|
||||||
|
|
||||||
|
// create queue
|
||||||
|
Queue queue = new Queue();
|
||||||
|
queue.setName("qwerty");
|
||||||
|
queue.setTopic("tb_rule_engine.qwerty");
|
||||||
|
queue.setPollInterval(25);
|
||||||
|
queue.setPartitions(10);
|
||||||
|
queue.setTenantId(TenantId.SYS_TENANT_ID);
|
||||||
|
queue.setConsumerPerPartition(false);
|
||||||
|
queue.setPackProcessingTimeout(2000);
|
||||||
|
SubmitStrategy submitStrategy = new SubmitStrategy();
|
||||||
|
submitStrategy.setType(SubmitStrategyType.SEQUENTIAL_BY_ORIGINATOR);
|
||||||
|
queue.setSubmitStrategy(submitStrategy);
|
||||||
|
ProcessingStrategy processingStrategy = new ProcessingStrategy();
|
||||||
|
processingStrategy.setType(ProcessingStrategyType.RETRY_ALL);
|
||||||
|
processingStrategy.setRetries(3);
|
||||||
|
processingStrategy.setFailurePercentage(0.7);
|
||||||
|
processingStrategy.setPauseBetweenRetries(3);
|
||||||
|
processingStrategy.setMaxPauseBetweenRetries(5);
|
||||||
|
queue.setProcessingStrategy(processingStrategy);
|
||||||
|
|
||||||
|
// create queue
|
||||||
|
Queue queue2 = new Queue();
|
||||||
|
queue2.setName("qwerty2");
|
||||||
|
queue2.setTopic("tb_rule_engine.qwerty2");
|
||||||
|
queue2.setPollInterval(25);
|
||||||
|
queue2.setPartitions(10);
|
||||||
|
queue2.setTenantId(TenantId.SYS_TENANT_ID);
|
||||||
|
queue2.setConsumerPerPartition(false);
|
||||||
|
queue2.setPackProcessingTimeout(2000);
|
||||||
|
submitStrategy.setType(SubmitStrategyType.SEQUENTIAL_BY_ORIGINATOR);
|
||||||
|
queue2.setSubmitStrategy(submitStrategy);
|
||||||
|
processingStrategy.setType(ProcessingStrategyType.RETRY_ALL);
|
||||||
|
processingStrategy.setRetries(3);
|
||||||
|
processingStrategy.setFailurePercentage(0.7);
|
||||||
|
processingStrategy.setPauseBetweenRetries(3);
|
||||||
|
processingStrategy.setMaxPauseBetweenRetries(5);
|
||||||
|
queue2.setProcessingStrategy(processingStrategy);
|
||||||
|
|
||||||
|
Queue savedQueue = doPost("/api/queues?serviceType=" + "TB-RULE-ENGINE", queue, Queue.class);
|
||||||
|
Queue savedQueue2 = doPost("/api/queues?serviceType=" + "TB_RULE_ENGINE", queue2, Queue.class);
|
||||||
|
|
||||||
|
PageLink pageLink = new PageLink(10);
|
||||||
|
PageData<Queue> pageData;
|
||||||
|
pageData = doGetTypedWithPageLink("/api/queues?serviceType=TB-RULE-ENGINE&", new TypeReference<>() {
|
||||||
|
}, pageLink);
|
||||||
|
Assert.assertFalse(pageData.getData().isEmpty());
|
||||||
|
doDelete("/api/queues/" + savedQueue.getUuidId())
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
pageData = doGetTypedWithPageLink("/api/queues?serviceType=TB_RULE_ENGINE&", new TypeReference<>() {
|
||||||
|
}, pageLink);
|
||||||
|
Assert.assertFalse(pageData.getData().isEmpty());
|
||||||
|
doDelete("/api/queues/" + savedQueue2.getUuidId())
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -34,7 +34,7 @@ public abstract class AbstractMqttClientConnectionTest extends AbstractMqttInteg
|
|||||||
try {
|
try {
|
||||||
client.connectAndWait("wrongAccessToken");
|
client.connectAndWait("wrongAccessToken");
|
||||||
} catch (MqttException e) {
|
} catch (MqttException e) {
|
||||||
Assert.assertEquals(MqttException.REASON_CODE_FAILED_AUTHENTICATION, e.getReasonCode());
|
Assert.assertEquals(MqttException.REASON_CODE_NOT_AUTHORIZED, e.getReasonCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -124,7 +124,7 @@ public class BasicMqttCredentialsTest extends AbstractMqttIntegrationTest {
|
|||||||
mqttTestClient.connectAndWait(USER_NAME3, "WRONG PASSWORD");
|
mqttTestClient.connectAndWait(USER_NAME3, "WRONG PASSWORD");
|
||||||
Assert.fail(); // This should not happens, because we have a wrong password
|
Assert.fail(); // This should not happens, because we have a wrong password
|
||||||
} catch (MqttException e) {
|
} catch (MqttException e) {
|
||||||
Assert.assertEquals(4, e.getReasonCode()); // 4 - Reason code for bad username or password in MQTT v3
|
Assert.assertEquals(5, e.getReasonCode()); // 4 - Reason code not authorized in MQTT v3
|
||||||
}
|
}
|
||||||
Assertions.assertThrows(MqttException.class, () -> {
|
Assertions.assertThrows(MqttException.class, () -> {
|
||||||
testTelemetryIsNotDelivered(clientIdAndUserNameAndPasswordDevice3, mqttTestClient);
|
testTelemetryIsNotDelivered(clientIdAndUserNameAndPasswordDevice3, mqttTestClient);
|
||||||
|
|||||||
@ -326,7 +326,7 @@ public class HashPartitionService implements PartitionService {
|
|||||||
final Map<QueueKey, List<ServiceInfo>> currentMap = new HashMap<>();
|
final Map<QueueKey, List<ServiceInfo>> currentMap = new HashMap<>();
|
||||||
services.forEach(serviceInfo -> {
|
services.forEach(serviceInfo -> {
|
||||||
for (String serviceTypeStr : serviceInfo.getServiceTypesList()) {
|
for (String serviceTypeStr : serviceInfo.getServiceTypesList()) {
|
||||||
ServiceType serviceType = ServiceType.valueOf(serviceTypeStr.toUpperCase());
|
ServiceType serviceType = ServiceType.of(serviceTypeStr);
|
||||||
if (ServiceType.TB_RULE_ENGINE.equals(serviceType)) {
|
if (ServiceType.TB_RULE_ENGINE.equals(serviceType)) {
|
||||||
partitionTopicsMap.keySet().forEach(queueKey ->
|
partitionTopicsMap.keySet().forEach(queueKey ->
|
||||||
currentMap.computeIfAbsent(queueKey, key -> new ArrayList<>()).add(serviceInfo));
|
currentMap.computeIfAbsent(queueKey, key -> new ArrayList<>()).add(serviceInfo));
|
||||||
@ -389,7 +389,7 @@ public class HashPartitionService implements PartitionService {
|
|||||||
|
|
||||||
private void addNode(Map<QueueKey, List<ServiceInfo>> queueServiceList, ServiceInfo instance) {
|
private void addNode(Map<QueueKey, List<ServiceInfo>> queueServiceList, ServiceInfo instance) {
|
||||||
for (String serviceTypeStr : instance.getServiceTypesList()) {
|
for (String serviceTypeStr : instance.getServiceTypesList()) {
|
||||||
ServiceType serviceType = ServiceType.valueOf(serviceTypeStr.toUpperCase());
|
ServiceType serviceType = ServiceType.of(serviceTypeStr);
|
||||||
if (ServiceType.TB_RULE_ENGINE.equals(serviceType)) {
|
if (ServiceType.TB_RULE_ENGINE.equals(serviceType)) {
|
||||||
partitionTopicsMap.keySet().forEach(key -> {
|
partitionTopicsMap.keySet().forEach(key -> {
|
||||||
if (key.getType().equals(ServiceType.TB_RULE_ENGINE)) {
|
if (key.getType().equals(ServiceType.TB_RULE_ENGINE)) {
|
||||||
|
|||||||
@ -27,7 +27,6 @@ public class ReturnCodeResolver {
|
|||||||
if (!MqttVersion.MQTT_5.equals(mqttVersion) && !ReturnCode.SUCCESS.equals(returnCode)) {
|
if (!MqttVersion.MQTT_5.equals(mqttVersion) && !ReturnCode.SUCCESS.equals(returnCode)) {
|
||||||
switch (returnCode) {
|
switch (returnCode) {
|
||||||
case BAD_USERNAME_OR_PASSWORD:
|
case BAD_USERNAME_OR_PASSWORD:
|
||||||
return MqttConnectReturnCode.CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD;
|
|
||||||
case NOT_AUTHORIZED_5:
|
case NOT_AUTHORIZED_5:
|
||||||
return MqttConnectReturnCode.CONNECTION_REFUSED_NOT_AUTHORIZED;
|
return MqttConnectReturnCode.CONNECTION_REFUSED_NOT_AUTHORIZED;
|
||||||
case SERVER_UNAVAILABLE_5:
|
case SERVER_UNAVAILABLE_5:
|
||||||
|
|||||||
@ -23,7 +23,7 @@ SELECT d.*
|
|||||||
, COALESCE(da.bool_v, FALSE) as active
|
, COALESCE(da.bool_v, FALSE) as active
|
||||||
FROM device d
|
FROM device d
|
||||||
LEFT JOIN customer c ON c.id = d.customer_id
|
LEFT JOIN customer c ON c.id = d.customer_id
|
||||||
LEFT JOIN attribute_kv da ON da.entity_id = d.id and da.attribute_key = 'active';
|
LEFT JOIN attribute_kv da ON da.entity_type = 'DEVICE' AND da.entity_id = d.id AND da.attribute_type = 'SERVER_SCOPE' AND da.attribute_key = 'active';
|
||||||
|
|
||||||
DROP VIEW IF EXISTS device_info_active_ts_view CASCADE;
|
DROP VIEW IF EXISTS device_info_active_ts_view CASCADE;
|
||||||
CREATE OR REPLACE VIEW device_info_active_ts_view AS
|
CREATE OR REPLACE VIEW device_info_active_ts_view AS
|
||||||
|
|||||||
@ -86,7 +86,7 @@ export class AlarmTableConfig extends EntityTableConfig<AlarmInfo, TimePageLink>
|
|||||||
private utilsService: UtilsService,
|
private utilsService: UtilsService,
|
||||||
pageMode = false) {
|
pageMode = false) {
|
||||||
super();
|
super();
|
||||||
this.loadDataOnInit = false;
|
this.loadDataOnInit = pageMode;
|
||||||
this.tableTitle = '';
|
this.tableTitle = '';
|
||||||
this.useTimePageLink = true;
|
this.useTimePageLink = true;
|
||||||
this.forAllTimeEnabled = true;
|
this.forAllTimeEnabled = true;
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
|
|
||||||
-->
|
-->
|
||||||
<form (ngSubmit)="add()" style="min-width: 400px; width: 700px;" [ngStyle]="entitiesTableConfig.addDialogStyle">
|
<form (ngSubmit)="add()" style="min-width: 400px; width: 750px;" [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>
|
||||||
|
|||||||
@ -116,7 +116,7 @@ export class TenantProfileQueuesComponent implements ControlValueAccessor, Valid
|
|||||||
}
|
}
|
||||||
|
|
||||||
writeValue(queues: Array<QueueInfo> | null): void {
|
writeValue(queues: Array<QueueInfo> | null): void {
|
||||||
if (queues.length === this.queuesFormArray.length) {
|
if (queues?.length === this.queuesFormArray.length) {
|
||||||
this.queuesFormArray.patchValue(queues, {emitEvent: false});
|
this.queuesFormArray.patchValue(queues, {emitEvent: false});
|
||||||
} else {
|
} else {
|
||||||
const queuesControls: Array<AbstractControl> = [];
|
const queuesControls: Array<AbstractControl> = [];
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
{{ 'tenant-profile.entities' | translate }} <span translate>tenant-profile.unlimited</span>
|
{{ 'tenant-profile.entities' | translate }} <span translate>tenant-profile.unlimited</span>
|
||||||
</legend>
|
</legend>
|
||||||
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.maximum-devices</mat-label>
|
<mat-label translate>tenant-profile.maximum-devices</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxDevices"
|
formControlName="maxDevices"
|
||||||
@ -32,8 +32,9 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDevices').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDevices').hasError('min')">
|
||||||
{{ 'tenant-profile.maximum-devices-range' | translate}}
|
{{ 'tenant-profile.maximum-devices-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.maximum-dashboards</mat-label>
|
<mat-label translate>tenant-profile.maximum-dashboards</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxDashboards"
|
formControlName="maxDashboards"
|
||||||
@ -44,10 +45,11 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDashboards').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDashboards').hasError('min')">
|
||||||
{{ 'tenant-profile.maximum-dashboards-range' | translate}}
|
{{ 'tenant-profile.maximum-dashboards-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.maximum-assets</mat-label>
|
<mat-label translate>tenant-profile.maximum-assets</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxAssets"
|
formControlName="maxAssets"
|
||||||
@ -58,8 +60,9 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxAssets').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxAssets').hasError('min')">
|
||||||
{{ 'tenant-profile.maximum-assets-range' | translate}}
|
{{ 'tenant-profile.maximum-assets-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.maximum-users</mat-label>
|
<mat-label translate>tenant-profile.maximum-users</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxUsers"
|
formControlName="maxUsers"
|
||||||
@ -70,6 +73,7 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxUsers').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxUsers').hasError('min')">
|
||||||
{{ 'tenant-profile.maximum-users-range' | translate}}
|
{{ 'tenant-profile.maximum-users-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<mat-expansion-panel class="configuration-panel">
|
<mat-expansion-panel class="configuration-panel">
|
||||||
@ -80,7 +84,7 @@
|
|||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<ng-template matExpansionPanelContent>
|
<ng-template matExpansionPanelContent>
|
||||||
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.maximum-customers</mat-label>
|
<mat-label translate>tenant-profile.maximum-customers</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxCustomers"
|
formControlName="maxCustomers"
|
||||||
@ -91,8 +95,9 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCustomers').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCustomers').hasError('min')">
|
||||||
{{ 'tenant-profile.maximum-customers-range' | translate}}
|
{{ 'tenant-profile.maximum-customers-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.maximum-rule-chains</mat-label>
|
<mat-label translate>tenant-profile.maximum-rule-chains</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxRuleChains"
|
formControlName="maxRuleChains"
|
||||||
@ -103,6 +108,7 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleChains').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleChains').hasError('min')">
|
||||||
{{ 'tenant-profile.maximum-rule-chains-range' | translate}}
|
{{ 'tenant-profile.maximum-rule-chains-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
@ -114,7 +120,7 @@
|
|||||||
{{ 'tenant-profile.rule-engine' | translate }} <span translate>tenant-profile.unlimited</span>
|
{{ 'tenant-profile.rule-engine' | translate }} <span translate>tenant-profile.unlimited</span>
|
||||||
</legend>
|
</legend>
|
||||||
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.max-r-e-executions</mat-label>
|
<mat-label translate>tenant-profile.max-r-e-executions</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxREExecutions"
|
formControlName="maxREExecutions"
|
||||||
@ -125,8 +131,9 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxREExecutions').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxREExecutions').hasError('min')">
|
||||||
{{ 'tenant-profile.max-r-e-executions-range' | translate}}
|
{{ 'tenant-profile.max-r-e-executions-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.max-transport-messages</mat-label>
|
<mat-label translate>tenant-profile.max-transport-messages</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxTransportMessages"
|
formControlName="maxTransportMessages"
|
||||||
@ -137,6 +144,7 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportMessages').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportMessages').hasError('min')">
|
||||||
{{ 'tenant-profile.max-transport-messages-required' | translate}}
|
{{ 'tenant-profile.max-transport-messages-required' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<mat-expansion-panel class="configuration-panel">
|
<mat-expansion-panel class="configuration-panel">
|
||||||
@ -147,7 +155,7 @@
|
|||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<ng-template matExpansionPanelContent>
|
<ng-template matExpansionPanelContent>
|
||||||
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.max-j-s-executions</mat-label>
|
<mat-label translate>tenant-profile.max-j-s-executions</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxJSExecutions"
|
formControlName="maxJSExecutions"
|
||||||
@ -158,8 +166,9 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxJSExecutions').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxJSExecutions').hasError('min')">
|
||||||
{{ 'tenant-profile.max-j-s-executions-range' | translate}}
|
{{ 'tenant-profile.max-j-s-executions-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.max-transport-data-points</mat-label>
|
<mat-label translate>tenant-profile.max-transport-data-points</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxTransportDataPoints"
|
formControlName="maxTransportDataPoints"
|
||||||
@ -170,10 +179,11 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportDataPoints').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxTransportDataPoints').hasError('min')">
|
||||||
{{ 'tenant-profile.max-transport-data-points-range' | translate}}
|
{{ 'tenant-profile.max-transport-data-points-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.max-rule-node-executions-per-message</mat-label>
|
<mat-label translate>tenant-profile.max-rule-node-executions-per-message</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxRuleNodeExecutionsPerMessage"
|
formControlName="maxRuleNodeExecutionsPerMessage"
|
||||||
@ -184,6 +194,7 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleNodeExecutionsPerMessage').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxRuleNodeExecutionsPerMessage').hasError('min')">
|
||||||
{{ 'tenant-profile.max-rule-node-executions-per-message-range' | translate}}
|
{{ 'tenant-profile.max-rule-node-executions-per-message-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<div fxFlex></div>
|
<div fxFlex></div>
|
||||||
</div>
|
</div>
|
||||||
@ -196,7 +207,7 @@
|
|||||||
{{ 'tenant-profile.time-to-live' | translate }} <span translate>tenant-profile.unlimited</span>
|
{{ 'tenant-profile.time-to-live' | translate }} <span translate>tenant-profile.unlimited</span>
|
||||||
</legend>
|
</legend>
|
||||||
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.max-d-p-storage-days</mat-label>
|
<mat-label translate>tenant-profile.max-d-p-storage-days</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxDPStorageDays"
|
formControlName="maxDPStorageDays"
|
||||||
@ -207,8 +218,9 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDPStorageDays').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxDPStorageDays').hasError('min')">
|
||||||
{{ 'tenant-profile.max-d-p-storage-days-range' | translate}}
|
{{ 'tenant-profile.max-d-p-storage-days-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.alarms-ttl-days</mat-label>
|
<mat-label translate>tenant-profile.alarms-ttl-days</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="alarmsTtlDays"
|
formControlName="alarmsTtlDays"
|
||||||
@ -219,10 +231,11 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('alarmsTtlDays').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('alarmsTtlDays').hasError('min')">
|
||||||
{{ 'tenant-profile.alarms-ttl-days-days-range' | translate}}
|
{{ 'tenant-profile.alarms-ttl-days-days-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.default-storage-ttl-days</mat-label>
|
<mat-label translate>tenant-profile.default-storage-ttl-days</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="defaultStorageTtlDays"
|
formControlName="defaultStorageTtlDays"
|
||||||
@ -233,8 +246,9 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('defaultStorageTtlDays').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('defaultStorageTtlDays').hasError('min')">
|
||||||
{{ 'tenant-profile.default-storage-ttl-days-range' | translate}}
|
{{ 'tenant-profile.default-storage-ttl-days-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.rpc-ttl-days</mat-label>
|
<mat-label translate>tenant-profile.rpc-ttl-days</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="rpcTtlDays"
|
formControlName="rpcTtlDays"
|
||||||
@ -245,6 +259,7 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('rpcTtlDays').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('rpcTtlDays').hasError('min')">
|
||||||
{{ 'tenant-profile.rpc-ttl-days-days-range' | translate}}
|
{{ 'tenant-profile.rpc-ttl-days-days-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
@ -256,7 +271,8 @@
|
|||||||
<mat-slide-toggle class="slide-toggle-element" fxFlex formControlName="smsEnabled">
|
<mat-slide-toggle class="slide-toggle-element" fxFlex formControlName="smsEnabled">
|
||||||
{{ 'tenant-profile.sms-enabled' | translate }}
|
{{ 'tenant-profile.sms-enabled' | translate }}
|
||||||
</mat-slide-toggle>
|
</mat-slide-toggle>
|
||||||
<mat-form-field *ngIf="defaultTenantProfileConfigurationFormGroup.get('smsEnabled').value" fxFlex class="mat-block" appearance="fill">
|
<mat-form-field *ngIf="defaultTenantProfileConfigurationFormGroup.get('smsEnabled').value" fxFlex class="mat-block"
|
||||||
|
appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.max-sms</mat-label>
|
<mat-label translate>tenant-profile.max-sms</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxSms"
|
formControlName="maxSms"
|
||||||
@ -268,8 +284,8 @@
|
|||||||
{{ 'tenant-profile.max-sms-range' | translate}}
|
{{ 'tenant-profile.max-sms-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.max-emails</mat-label>
|
<mat-label translate>tenant-profile.max-emails</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxEmails"
|
formControlName="maxEmails"
|
||||||
@ -280,8 +296,9 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxEmails').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxEmails').hasError('min')">
|
||||||
{{ 'tenant-profile.max-emails-range' | translate}}
|
{{ 'tenant-profile.max-emails-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.max-created-alarms</mat-label>
|
<mat-label translate>tenant-profile.max-created-alarms</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxCreatedAlarms"
|
formControlName="maxCreatedAlarms"
|
||||||
@ -292,6 +309,7 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCreatedAlarms').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxCreatedAlarms').hasError('min')">
|
||||||
{{ 'tenant-profile.max-created-alarms-range' | translate}}
|
{{ 'tenant-profile.max-created-alarms-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
@ -301,7 +319,7 @@
|
|||||||
{{ 'tenant-profile.ota-files-in-bytes' | translate }} <span translate>tenant-profile.unlimited</span>
|
{{ 'tenant-profile.ota-files-in-bytes' | translate }} <span translate>tenant-profile.unlimited</span>
|
||||||
</legend>
|
</legend>
|
||||||
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
<div class="fields-element" fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap.gt-xs="16px">
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.maximum-resources-sum-data-size</mat-label>
|
<mat-label translate>tenant-profile.maximum-resources-sum-data-size</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxResourcesInBytes"
|
formControlName="maxResourcesInBytes"
|
||||||
@ -312,18 +330,20 @@
|
|||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxResourcesInBytes').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxResourcesInBytes').hasError('min')">
|
||||||
{{ 'tenant-profile.maximum-resources-sum-data-size-range' | translate}}
|
{{ 'tenant-profile.maximum-resources-sum-data-size-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex class="mat-block" appearance="fill">
|
<mat-form-field fxFlex class="mat-block" appearance="fill" subscriptSizing="dynamic">
|
||||||
<mat-label translate>tenant-profile.maximum-ota-packages-sum-data-size</mat-label>
|
<mat-label translate>tenant-profile.maximum-ota-packages-sum-data-size</mat-label>
|
||||||
<input matInput required min="0" step="1"
|
<input matInput required min="0" step="1"
|
||||||
formControlName="maxOtaPackagesInBytes"
|
formControlName="maxOtaPackagesInBytes"
|
||||||
type="number">
|
type="number">
|
||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxOtaPackagesInBytes').hasError('required')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxOtaPackagesInBytes').hasError('required')">
|
||||||
{{ 'tenant-profile.maximum-ota-packages-sum-data-size-required' | translate}}
|
{{ 'tenant-profile.maximum-ota-package-sum-data-size-required' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxOtaPackagesInBytes').hasError('min')">
|
<mat-error *ngIf="defaultTenantProfileConfigurationFormGroup.get('maxOtaPackagesInBytes').hasError('min')">
|
||||||
{{ 'tenant-profile.maximum-ota-packages-sum-data-size-range' | translate}}
|
{{ 'tenant-profile.maximum-ota-package-sum-data-size-range' | translate}}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
<mat-hint></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|||||||
@ -37,7 +37,7 @@
|
|||||||
</mat-panel-title>
|
</mat-panel-title>
|
||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<ng-template matExpansionPanelContent>
|
<ng-template matExpansionPanelContent>
|
||||||
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap="16px" formGroupName="submitStrategy">
|
<div fxFlex fxLayout="row" fxLayout.lt-md="column" fxLayoutGap="16px" formGroupName="submitStrategy">
|
||||||
<div fxFlex>
|
<div fxFlex>
|
||||||
<label class="group-label" translate>queue.submit-strategy</label>
|
<label class="group-label" translate>queue.submit-strategy</label>
|
||||||
<mat-radio-group fxFlex fxLayout="column" formControlName="type" required>
|
<mat-radio-group fxFlex fxLayout="column" formControlName="type" required>
|
||||||
@ -75,7 +75,7 @@
|
|||||||
</mat-panel-title>
|
</mat-panel-title>
|
||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<ng-template matExpansionPanelContent>
|
<ng-template matExpansionPanelContent>
|
||||||
<div fxFlex fxLayout="row" fxLayout.xs="column" fxLayoutGap="16px" formGroupName="processingStrategy">
|
<div fxFlex fxLayout="row" fxLayout.lt-md="column" fxLayoutGap="16px" formGroupName="processingStrategy">
|
||||||
<div fxFlex>
|
<div fxFlex>
|
||||||
<label class="group-label" translate>queue.processing-strategy</label>
|
<label class="group-label" translate>queue.processing-strategy</label>
|
||||||
<mat-radio-group fxFlex fxLayout="column" formControlName="type" required>
|
<mat-radio-group fxFlex fxLayout="column" formControlName="type" required>
|
||||||
|
|||||||
@ -290,7 +290,7 @@
|
|||||||
<fieldset *ngIf="chartType === 'graph' || chartType === 'bar'" class="fields-group fields-group-slider">
|
<fieldset *ngIf="chartType === 'graph' || chartType === 'bar'" class="fields-group fields-group-slider">
|
||||||
<legend class="group-title" translate>widgets.chart.custom-legend-settings</legend>
|
<legend class="group-title" translate>widgets.chart.custom-legend-settings</legend>
|
||||||
<mat-expansion-panel class="tb-settings" [expanded]="flotSettingsFormGroup.get('customLegendEnabled').value">
|
<mat-expansion-panel class="tb-settings" [expanded]="flotSettingsFormGroup.get('customLegendEnabled').value">
|
||||||
<mat-expansion-panel-header fxLayout="row" style="height: 100%; min-height: 48px;">
|
<mat-expansion-panel-header fxLayout="row" style="height: max-content; min-height: 48px;">
|
||||||
<mat-panel-title fxFlex="60">
|
<mat-panel-title fxFlex="60">
|
||||||
<mat-slide-toggle formControlName="customLegendEnabled" (click)="$event.stopPropagation()"
|
<mat-slide-toggle formControlName="customLegendEnabled" (click)="$event.stopPropagation()"
|
||||||
fxLayoutAlign="center" style="height: 100%;">
|
fxLayoutAlign="center" style="height: 100%;">
|
||||||
|
|||||||
@ -164,6 +164,8 @@
|
|||||||
<mat-card-title>
|
<mat-card-title>
|
||||||
<span class="mat-headline-5" translate>admin.jwt.security-settings</span>
|
<span class="mat-headline-5" translate>admin.jwt.security-settings</span>
|
||||||
</mat-card-title>
|
</mat-card-title>
|
||||||
|
<span fxFlex></span>
|
||||||
|
<div tb-help="jwtSecuritySettings"></div>
|
||||||
</mat-card-header>
|
</mat-card-header>
|
||||||
<mat-card-content style="padding-top: 16px;">
|
<mat-card-content style="padding-top: 16px;">
|
||||||
<form [formGroup]="jwtSecuritySettingsFormGroup" (ngSubmit)="saveJwtSettings()" autocomplete="off">
|
<form [formGroup]="jwtSecuritySettingsFormGroup" (ngSubmit)="saveJwtSettings()" autocomplete="off">
|
||||||
|
|||||||
@ -166,6 +166,7 @@ export const HelpLinks = {
|
|||||||
templateNotifications: helpBaseUrl + '/docs/user-guide/notifications/#templates',
|
templateNotifications: helpBaseUrl + '/docs/user-guide/notifications/#templates',
|
||||||
recipientNotifications: helpBaseUrl + '/docs/user-guide/notifications/#recipients',
|
recipientNotifications: helpBaseUrl + '/docs/user-guide/notifications/#recipients',
|
||||||
ruleNotifications: helpBaseUrl + '/docs/user-guide/notifications/#rules',
|
ruleNotifications: helpBaseUrl + '/docs/user-guide/notifications/#rules',
|
||||||
|
jwtSecuritySettings: helpBaseUrl + '/docs/user-guide/ui/jwt-security-settings/',
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user