From d5cf27cdbf0359f3ade857b1a9b6ec0118fe3e7b Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 20 Nov 2020 18:19:53 +0200 Subject: [PATCH 1/2] Sms provider configuration component improvements --- ui-ngx/src/app/core/utils.ts | 4 +++ ...ws-sns-provider-configuration.component.ts | 7 +++- .../sms-provider-configuration.component.ts | 4 +-- ...io-sms-provider-configuration.component.ts | 7 +++- .../src/app/shared/models/settings.models.ts | 32 +++++++++++++++++++ 5 files changed, 50 insertions(+), 4 deletions(-) diff --git a/ui-ngx/src/app/core/utils.ts b/ui-ngx/src/app/core/utils.ts index 4650caca77..bf58d8c2c8 100644 --- a/ui-ngx/src/app/core/utils.ts +++ b/ui-ngx/src/app/core/utils.ts @@ -92,6 +92,10 @@ export function isEmptyStr(value: any): boolean { return value === ''; } +export function isNotEmptyStr(value: any): boolean { + return value !== null && typeof value === 'string' && value.trim().length > 0; +} + export function isFunction(value: any): boolean { return typeof value === 'function'; } diff --git a/ui-ngx/src/app/modules/home/components/sms/aws-sns-provider-configuration.component.ts b/ui-ngx/src/app/modules/home/components/sms/aws-sns-provider-configuration.component.ts index 6b4a2e23ad..a223df4bb1 100644 --- a/ui-ngx/src/app/modules/home/components/sms/aws-sns-provider-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/sms/aws-sns-provider-configuration.component.ts @@ -20,7 +20,11 @@ import { Store } from '@ngrx/store'; import { AppState } from '@app/core/core.state'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { isDefinedAndNotNull } from '@core/utils'; -import { AwsSnsSmsProviderConfiguration } from '@shared/models/settings.models'; +import { + AwsSnsSmsProviderConfiguration, + SmsProviderConfiguration, + SmsProviderType +} from '@shared/models/settings.models'; @Component({ selector: 'tb-aws-sns-provider-configuration', @@ -93,6 +97,7 @@ export class AwsSnsProviderConfigurationComponent implements ControlValueAccesso let configuration: AwsSnsSmsProviderConfiguration = null; if (this.awsSnsProviderConfigurationFormGroup.valid) { configuration = this.awsSnsProviderConfigurationFormGroup.value; + (configuration as SmsProviderConfiguration).type = SmsProviderType.AWS_SNS; } this.propagateChange(configuration); } diff --git a/ui-ngx/src/app/modules/home/components/sms/sms-provider-configuration.component.ts b/ui-ngx/src/app/modules/home/components/sms/sms-provider-configuration.component.ts index 4aafff9369..feea8b9939 100644 --- a/ui-ngx/src/app/modules/home/components/sms/sms-provider-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/sms/sms-provider-configuration.component.ts @@ -27,7 +27,7 @@ import { import { deepClone } from '@core/utils'; import { createSmsProviderConfiguration, - SmsProviderConfiguration, + SmsProviderConfiguration, smsProviderConfigurationValidator, SmsProviderType, smsProviderTypeTranslationMap } from '@shared/models/settings.models'; @@ -78,7 +78,7 @@ export class SmsProviderConfigurationComponent implements ControlValueAccessor, ngOnInit() { this.smsProviderConfigurationFormGroup = this.fb.group({ type: [null, Validators.required], - configuration: [null, Validators.required] + configuration: [null, smsProviderConfigurationValidator(true)] }); this.smsProviderConfigurationFormGroup.valueChanges.subscribe(() => { this.updateModel(); diff --git a/ui-ngx/src/app/modules/home/components/sms/twilio-sms-provider-configuration.component.ts b/ui-ngx/src/app/modules/home/components/sms/twilio-sms-provider-configuration.component.ts index 9d2c1a154b..5577a16a00 100644 --- a/ui-ngx/src/app/modules/home/components/sms/twilio-sms-provider-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/sms/twilio-sms-provider-configuration.component.ts @@ -20,7 +20,11 @@ import { Store } from '@ngrx/store'; import { AppState } from '@app/core/core.state'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { isDefinedAndNotNull } from '@core/utils'; -import { phoneNumberPattern, TwilioSmsProviderConfiguration } from '@shared/models/settings.models'; +import { + phoneNumberPattern, + SmsProviderConfiguration, SmsProviderType, + TwilioSmsProviderConfiguration +} from '@shared/models/settings.models'; @Component({ selector: 'tb-twilio-sms-provider-configuration', @@ -95,6 +99,7 @@ export class TwilioSmsProviderConfigurationComponent implements ControlValueAcce let configuration: TwilioSmsProviderConfiguration = null; if (this.twilioSmsProviderConfigurationFormGroup.valid) { configuration = this.twilioSmsProviderConfigurationFormGroup.value; + (configuration as SmsProviderConfiguration).type = SmsProviderType.TWILIO; } this.propagateChange(configuration); } diff --git a/ui-ngx/src/app/shared/models/settings.models.ts b/ui-ngx/src/app/shared/models/settings.models.ts index 313b92d603..582b077cac 100644 --- a/ui-ngx/src/app/shared/models/settings.models.ts +++ b/ui-ngx/src/app/shared/models/settings.models.ts @@ -15,6 +15,8 @@ /// import { DeviceTransportType } from '@shared/models/device.models'; +import { ValidatorFn } from '@angular/forms'; +import { isNotEmptyStr } from '@core/utils'; export const smtpPortPattern: RegExp = /^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$/; @@ -95,6 +97,36 @@ export interface SmsProviderConfiguration extends SmsProviderConfigurations { type: SmsProviderType; } +export function smsProviderConfigurationValidator(required: boolean): ValidatorFn { + return control => { + const configuration: SmsProviderConfiguration = control.value; + let errors = null; + if (required) { + let valid = false; + if (configuration && configuration.type) { + switch (configuration.type) { + case SmsProviderType.AWS_SNS: + const awsSnsConfiguration: AwsSnsSmsProviderConfiguration = configuration; + valid = isNotEmptyStr(awsSnsConfiguration.accessKeyId) && isNotEmptyStr(awsSnsConfiguration.secretAccessKey) + && isNotEmptyStr(awsSnsConfiguration.region); + break; + case SmsProviderType.TWILIO: + const twilioConfiguration: TwilioSmsProviderConfiguration = configuration; + valid = isNotEmptyStr(twilioConfiguration.numberFrom) && isNotEmptyStr(twilioConfiguration.accountSid) + && isNotEmptyStr(twilioConfiguration.accountToken); + break; + } + } + if (!valid) { + errors = { + invalid: true + }; + } + } + return errors; + }; +} + export interface TestSmsRequest { providerConfiguration: SmsProviderConfiguration; numberTo: string; From 6f780b8fa540068807382ce3aa7386c5577c91ba Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 20 Nov 2020 18:36:02 +0200 Subject: [PATCH 2/2] Minor improvements --- ui-ngx/src/app/shared/models/settings.models.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/ui-ngx/src/app/shared/models/settings.models.ts b/ui-ngx/src/app/shared/models/settings.models.ts index 582b077cac..64c5dda85c 100644 --- a/ui-ngx/src/app/shared/models/settings.models.ts +++ b/ui-ngx/src/app/shared/models/settings.models.ts @@ -14,7 +14,6 @@ /// limitations under the License. /// -import { DeviceTransportType } from '@shared/models/device.models'; import { ValidatorFn } from '@angular/forms'; import { isNotEmptyStr } from '@core/utils';