This is an automated email from the ASF dual-hosted git repository.

riemer pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/streampipes.git


The following commit(s) were added to refs/heads/dev by this push:
     new d02884282b fix: add validator to pipeline and adapter name (#3616)
d02884282b is described below

commit d02884282bc8045379f8251859e88b9f6cba1684
Author: Marcel Früholz <[email protected]>
AuthorDate: Tue May 20 20:30:27 2025 +0200

    fix: add validator to pipeline and adapter name (#3616)
---
 .../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(

Reply via email to