{
+ this.addEntity(null);
+ }, 0);
+ }
+ }
}
ngAfterViewInit() {
diff --git a/ui-ngx/src/app/modules/home/components/filter/filters-dialog.component.html b/ui-ngx/src/app/modules/home/components/filter/filters-dialog.component.html
index 2d24bc479f..69f72c8aaf 100644
--- a/ui-ngx/src/app/modules/home/components/filter/filters-dialog.component.html
+++ b/ui-ngx/src/app/modules/home/components/filter/filters-dialog.component.html
@@ -69,7 +69,7 @@
style="min-width: 48px;"
type="button"
(click)="duplicateFilter($index)"
- matTooltip="{{ 'filter.duplicate-filter' | translate }}"
+ matTooltip="{{ 'filter.duplicate-filter-action' | translate }}"
matTooltipPosition="above">
content_copy
diff --git a/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.html b/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.html
index cd711f9e12..afbaa924ac 100644
--- a/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.html
+++ b/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.html
@@ -27,36 +27,80 @@
{{ 'device-profile.provision-strategy-required' | translate }}
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ 'device-profile.provision-strategy-x509.allow-create-new-devices' | translate }}
+
+
+
+ device-profile.provision-strategy-x509.certificate-value
+
+
+ {{ 'device-profile.provision-strategy-x509.certificate-value-required' | translate }}
+
+
+
+ device-profile.provision-strategy-x509.cn-regex-variable
+
+
+
+ {{ 'device-profile.provision-strategy-x509.cn-regex-variable-required' | translate }}
+
+ device-profile.provision-strategy-x509.cn-regex-variable-hint
+
+
+
+
+
+
diff --git a/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.ts
index 872571dc20..54a9b98aa5 100644
--- a/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.ts
+++ b/ui-ngx/src/app/modules/home/components/profile/device-profile-provision-configuration.component.ts
@@ -32,7 +32,7 @@ import {
DeviceProvisionType,
deviceProvisionTypeTranslationMap
} from '@shared/models/device.models';
-import { generateSecret, isDefinedAndNotNull } from '@core/utils';
+import { generateSecret, isBoolean, isDefinedAndNotNull } from '@core/utils';
import { ActionNotificationShow } from '@core/notification/notification.actions';
import { Store } from '@ngrx/store';
import { AppState } from '@core/core.state';
@@ -86,14 +86,36 @@ export class DeviceProfileProvisionConfigurationComponent implements ControlValu
this.provisionConfigurationFormGroup = this.fb.group({
type: [DeviceProvisionType.DISABLED, Validators.required],
provisionDeviceSecret: [{value: null, disabled: true}, Validators.required],
- provisionDeviceKey: [{value: null, disabled: true}, Validators.required]
+ provisionDeviceKey: [{value: null, disabled: true}, Validators.required],
+ certificateValue: [{value: null, disabled: true}, Validators.required],
+ certificateRegExPattern: [{value: null, disabled: true}, Validators.required],
+ allowCreateNewDevicesByX509Certificate: [{value: null, disabled: true}, Validators.required]
});
this.provisionConfigurationFormGroup.get('type').valueChanges.subscribe((type) => {
if (type === DeviceProvisionType.DISABLED) {
- this.provisionConfigurationFormGroup.get('provisionDeviceSecret').disable({emitEvent: false});
- this.provisionConfigurationFormGroup.get('provisionDeviceSecret').patchValue(null, {emitEvent: false});
- this.provisionConfigurationFormGroup.get('provisionDeviceKey').disable({emitEvent: false});
- this.provisionConfigurationFormGroup.get('provisionDeviceKey').patchValue(null);
+ for (const field in this.provisionConfigurationFormGroup.controls) {
+ if (field !== 'type') {
+ const control = this.provisionConfigurationFormGroup.get(field);
+ control.disable({emitEvent: false});
+ control.patchValue(null, {emitEvent: false});
+ }
+ }
+ } else if (type === DeviceProvisionType.X509_CERTIFICATE_CHAIN) {
+ const certificateValue: string = this.provisionConfigurationFormGroup.get('certificateValue').value;
+ if (!certificateValue || !certificateValue.length) {
+ this.provisionConfigurationFormGroup.get('certificateValue').patchValue(null, {emitEvent: false});
+ }
+ const certificateRegExPattern: string = this.provisionConfigurationFormGroup.get('certificateRegExPattern').value;
+ if (!certificateRegExPattern || !certificateRegExPattern.length) {
+ this.provisionConfigurationFormGroup.get('certificateRegExPattern').patchValue('[\\w]*', {emitEvent: false});
+ }
+ const allowCreateNewDevicesByX509Certificate: boolean | null = this.provisionConfigurationFormGroup.get('allowCreateNewDevicesByX509Certificate').value;
+ if (!isBoolean(allowCreateNewDevicesByX509Certificate)) {
+ this.provisionConfigurationFormGroup.get('allowCreateNewDevicesByX509Certificate').patchValue(true, {emitEvent: false});
+ }
+ this.provisionConfigurationFormGroup.get('certificateValue').enable({emitEvent: false});
+ this.provisionConfigurationFormGroup.get('certificateRegExPattern').enable({emitEvent: false});
+ this.provisionConfigurationFormGroup.get('allowCreateNewDevicesByX509Certificate').enable({emitEvent: false});
} else {
const provisionDeviceSecret: string = this.provisionConfigurationFormGroup.get('provisionDeviceSecret').value;
if (!provisionDeviceSecret || !provisionDeviceSecret.length) {
@@ -120,16 +142,19 @@ export class DeviceProfileProvisionConfigurationComponent implements ControlValu
}
writeValue(value: DeviceProvisionConfiguration | null): void {
- if (isDefinedAndNotNull(value)){
+ if (isDefinedAndNotNull(value)) {
+ if (value.type === DeviceProvisionType.X509_CERTIFICATE_CHAIN) {
+ value.certificateValue = value.provisionDeviceSecret;
+ }
this.provisionConfigurationFormGroup.patchValue(value, {emitEvent: false});
} else {
this.provisionConfigurationFormGroup.patchValue({type: DeviceProvisionType.DISABLED});
}
}
- setDisabledState(isDisabled: boolean){
+ setDisabledState(isDisabled: boolean) {
this.disabled = isDisabled;
- if (this.disabled){
+ if (this.disabled) {
this.provisionConfigurationFormGroup.disable({emitEvent: false});
} else {
if (this.provisionConfigurationFormGroup.get('type').value !== DeviceProvisionType.DISABLED) {
@@ -150,8 +175,12 @@ export class DeviceProfileProvisionConfigurationComponent implements ControlValu
private updateModel(): void {
let deviceProvisionConfiguration: DeviceProvisionConfiguration = null;
+ this.resetFormControls(this.provisionConfigurationFormGroup.value);
if (this.provisionConfigurationFormGroup.valid) {
deviceProvisionConfiguration = this.provisionConfigurationFormGroup.getRawValue();
+ if (deviceProvisionConfiguration.type === DeviceProvisionType.X509_CERTIFICATE_CHAIN) {
+ deviceProvisionConfiguration.provisionDeviceSecret = deviceProvisionConfiguration.certificateValue;
+ }
}
this.propagateChange(deviceProvisionConfiguration);
}
@@ -166,4 +195,15 @@ export class DeviceProfileProvisionConfigurationComponent implements ControlValu
horizontalPosition: 'right'
}));
}
+
+ private resetFormControls(value: DeviceProvisionConfiguration) {
+ if (value.type === DeviceProvisionType.CHECK_PRE_PROVISIONED_DEVICES || value.type === DeviceProvisionType.ALLOW_CREATE_NEW_DEVICES) {
+ this.provisionConfigurationFormGroup.get('certificateValue').reset({value: null, disabled: true}, {emitEvent: false});
+ this.provisionConfigurationFormGroup.get('certificateRegExPattern').reset({value: null, disabled: true}, {emitEvent: false});
+ this.provisionConfigurationFormGroup.get('allowCreateNewDevicesByX509Certificate').reset({value: null, disabled: true}, {emitEvent: false});
+ } else if (value.type === DeviceProvisionType.X509_CERTIFICATE_CHAIN) {
+ this.provisionConfigurationFormGroup.get('provisionDeviceSecret').reset({value: null, disabled: true}, {emitEvent: false});
+ this.provisionConfigurationFormGroup.get('provisionDeviceKey').reset({value: null, disabled: true}, {emitEvent: false});
+ }
+ }
}
diff --git a/ui-ngx/src/app/modules/home/components/profile/device-profile.component.ts b/ui-ngx/src/app/modules/home/components/profile/device-profile.component.ts
index 9adcf9c168..db6539318d 100644
--- a/ui-ngx/src/app/modules/home/components/profile/device-profile.component.ts
+++ b/ui-ngx/src/app/modules/home/components/profile/device-profile.component.ts
@@ -104,7 +104,9 @@ export class DeviceProfileComponent extends EntityComponent
{
const deviceProvisionConfiguration: DeviceProvisionConfiguration = {
type: entity?.provisionType ? entity.provisionType : DeviceProvisionType.DISABLED,
provisionDeviceKey: entity?.provisionDeviceKey,
- provisionDeviceSecret: entity?.profileData?.provisionConfiguration?.provisionDeviceSecret
+ provisionDeviceSecret: entity?.profileData?.provisionConfiguration?.provisionDeviceSecret,
+ certificateRegExPattern: entity?.profileData?.provisionConfiguration?.certificateRegExPattern,
+ allowCreateNewDevicesByX509Certificate: entity?.profileData?.provisionConfiguration?.allowCreateNewDevicesByX509Certificate
};
const form = this.fb.group(
{
@@ -185,7 +187,9 @@ export class DeviceProfileComponent extends EntityComponent {
const deviceProvisionConfiguration: DeviceProvisionConfiguration = {
type: entity?.provisionType ? entity.provisionType : DeviceProvisionType.DISABLED,
provisionDeviceKey: entity?.provisionDeviceKey,
- provisionDeviceSecret: entity?.profileData?.provisionConfiguration?.provisionDeviceSecret
+ provisionDeviceSecret: entity?.profileData?.provisionConfiguration?.provisionDeviceSecret,
+ certificateRegExPattern: entity?.profileData?.provisionConfiguration?.certificateRegExPattern,
+ allowCreateNewDevicesByX509Certificate: entity?.profileData?.provisionConfiguration?.allowCreateNewDevicesByX509Certificate
};
this.entityForm.patchValue({name: entity.name});
this.entityForm.patchValue({type: entity.type}, {emitEvent: false});
diff --git a/ui-ngx/src/app/modules/home/components/profile/device/mqtt-device-profile-transport-configuration.component.html b/ui-ngx/src/app/modules/home/components/profile/device/mqtt-device-profile-transport-configuration.component.html
index 17feca514b..45cf2040b2 100644
--- a/ui-ngx/src/app/modules/home/components/profile/device/mqtt-device-profile-transport-configuration.component.html
+++ b/ui-ngx/src/app/modules/home/components/profile/device/mqtt-device-profile-transport-configuration.component.html
@@ -169,6 +169,6 @@
{{ 'device-profile.mqtt-send-ack-on-validation-exception' | translate }}
-
+