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(