This is an automated email from the ASF dual-hosted git repository. mfholz pushed a commit to branch input-validators-pipeline-adapter-names in repository https://gitbox.apache.org/repos/asf/streampipes.git
commit efbef5a3b7ff7e542b7e1adca10b65ce896f17d0 Author: Marcelfrueh <[email protected]> AuthorDate: Tue May 20 15:15:01 2025 +0200 fix: add validator to pipeline and adapter name --- .../start-adapter-configuration.component.html | 34 ++++++++++++++++++++++ .../start-adapter-configuration.component.ts | 9 ++++-- .../core-ui/static-properties/input.validator.ts | 23 ++++++++++++++- .../save-pipeline-settings.component.html | 33 ++++++++++++++++++++- .../save-pipeline-settings.component.ts | 4 ++- 5 files changed, 97 insertions(+), 6 deletions(-) diff --git a/ui/src/app/connect/components/adapter-configuration/start-adapter-configuration/start-adapter-configuration.component.html b/ui/src/app/connect/components/adapter-configuration/start-adapter-configuration/start-adapter-configuration.component.html index f8fcd94bf0..a80c40f3aa 100644 --- a/ui/src/app/connect/components/adapter-configuration/start-adapter-configuration/start-adapter-configuration.component.html +++ b/ui/src/app/connect/components/adapter-configuration/start-adapter-configuration/start-adapter-configuration.component.html @@ -33,6 +33,40 @@ required (blur)="triggerTutorialAdapterNameAssigned()" /> + <mat-error + *ngIf=" + startAdapterForm + .get('adapterName') + .hasError('invalidName') + " + > + Name can only contain letters, numbers, dashes (-), and + underscores (_). + </mat-error> + <mat-error + *ngIf=" + startAdapterForm + .get('adapterName') + .hasError('required') || + startAdapterForm + .get('adapterName') + .hasError('whiteSpaceOnly') + " + > + Adapter name is required. + </mat-error> + <mat-error + *ngIf=" + startAdapterForm + .get('adapterName') + .hasError('minlength') || + startAdapterForm + .get('adapterName') + .hasError('maxlength') + " + > + Adapter name must have between 3 and 40 characters. + </mat-error> </mat-form-field> <mat-form-field color="accent"> <input diff --git a/ui/src/app/connect/components/adapter-configuration/start-adapter-configuration/start-adapter-configuration.component.ts b/ui/src/app/connect/components/adapter-configuration/start-adapter-configuration/start-adapter-configuration.component.ts index 9e2246a07c..37253e8db0 100644 --- a/ui/src/app/connect/components/adapter-configuration/start-adapter-configuration/start-adapter-configuration.component.ts +++ b/ui/src/app/connect/components/adapter-configuration/start-adapter-configuration/start-adapter-configuration.component.ts @@ -35,6 +35,7 @@ import { DialogService, PanelType } from '@streampipes/shared-ui'; import { ShepherdService } from '../../../../services/tour/shepherd.service'; import { TimestampPipe } from '../../../filter/timestamp.pipe'; import { TransformationRuleService } from '../../../services/transformation-rule.service'; +import { ValidateName } from '../../../../core-ui/static-properties/input.validator'; @Component({ selector: 'sp-start-adapter-configuration', @@ -110,10 +111,12 @@ export class StartAdapterConfigurationComponent implements OnInit { this.startAdapterForm = this._formBuilder.group({}); this.startAdapterForm.addControl( 'adapterName', - new UntypedFormControl( - this.adapterDescription.name, + new UntypedFormControl(this.adapterDescription.name, [ Validators.required, - ), + Validators.minLength(3), + Validators.maxLength(40), + ValidateName(), + ]), ); this.startAdapterForm.valueChanges.subscribe( v => (this.adapterDescription.name = v.adapterName), diff --git a/ui/src/app/core-ui/static-properties/input.validator.ts b/ui/src/app/core-ui/static-properties/input.validator.ts index ee493b944c..1d8e1f1c75 100644 --- a/ui/src/app/core-ui/static-properties/input.validator.ts +++ b/ui/src/app/core-ui/static-properties/input.validator.ts @@ -16,7 +16,7 @@ * */ -import { AbstractControl } from '@angular/forms'; +import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; export function ValidateUrl(control: AbstractControl) { if (control.value == null) { @@ -49,3 +49,24 @@ export function ValidateString(control: AbstractControl) { } return null; } + +export function ValidateName(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (value == null) { + return null; + } + + const trimmed = value.trim(); + + if (trimmed.length === 0) { + return { whiteSpaceOnly: { value } }; + } + + const regex = /^[a-zA-Z0-9 _-]+$/; + const valid = regex.test(trimmed); + + return valid ? null : { invalidName: { value } }; + }; +} diff --git a/ui/src/app/editor/dialog/save-pipeline/save-pipeline-settings/save-pipeline-settings.component.html b/ui/src/app/editor/dialog/save-pipeline/save-pipeline-settings/save-pipeline-settings.component.html index 4b8020d004..c0aab9497d 100644 --- a/ui/src/app/editor/dialog/save-pipeline/save-pipeline-settings/save-pipeline-settings.component.html +++ b/ui/src/app/editor/dialog/save-pipeline/save-pipeline-settings/save-pipeline-settings.component.html @@ -29,7 +29,38 @@ (blur)="triggerTutorial()" /> <mat-error - >Pipeline name must have between 3 and 40 characters. + *ngIf=" + submitPipelineForm + .get('pipelineName') + .hasError('required') || + submitPipelineForm + .get('pipelineName') + .hasError('whiteSpaceOnly') + " + > + Pipeline name is required. + </mat-error> + <mat-error + *ngIf=" + submitPipelineForm + .get('pipelineName') + .hasError('minlength') || + submitPipelineForm + .get('pipelineName') + .hasError('maxlength') + " + > + Pipeline name must have between 3 and 50 characters. + </mat-error> + <mat-error + *ngIf=" + submitPipelineForm + .get('pipelineName') + .hasError('invalidName') + " + > + Pipeline name can only contain letters, numbers, dashes (-), + and underscores (_). </mat-error> </mat-form-field> <mat-form-field fxFlex color="accent"> diff --git a/ui/src/app/editor/dialog/save-pipeline/save-pipeline-settings/save-pipeline-settings.component.ts b/ui/src/app/editor/dialog/save-pipeline/save-pipeline-settings/save-pipeline-settings.component.ts index fb0daa47bb..c5a22f85f0 100644 --- a/ui/src/app/editor/dialog/save-pipeline/save-pipeline-settings/save-pipeline-settings.component.ts +++ b/ui/src/app/editor/dialog/save-pipeline/save-pipeline-settings/save-pipeline-settings.component.ts @@ -29,6 +29,7 @@ import { PipelineService, } from '@streampipes/platform-services'; import { PipelineStorageOptions } from '../../../model/editor.model'; +import { ValidateName } from '../../../../core-ui/static-properties/input.validator'; @Component({ selector: 'sp-save-pipeline-settings', @@ -61,7 +62,8 @@ export class SavePipelineSettingsComponent implements OnInit { new UntypedFormControl(this.pipeline.name, [ Validators.required, Validators.minLength(3), - Validators.maxLength(40), + Validators.maxLength(50), + ValidateName(), ]), ); this.submitPipelineForm.addControl(
