Skip to content

Commit 84986ba

Browse files
committed
feat: add minWordsValidator for add rule component
1 parent aa2cce5 commit 84986ba

3 files changed

Lines changed: 40 additions & 6 deletions

File tree

frontend/src/app/rule-management/app-rule/components/add-rule/add-rule.component.html

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@
7979
class="invalid-feedback">
8080
Name is required.
8181
</div>
82+
<div *ngIf="ruleForm.get('name').errors && ruleForm.get('name').errors['minWords'] && ruleForm.get('name').touched" class="invalid-feedback">
83+
Please enter at least {{ ruleForm.get('name').errors['minWords'].requiredWords }} words,
84+
each with at least {{ ruleForm.get('name').errors['minWords'].minLengthPerWord }} characters.
85+
</div>
8286
</div>
8387
</div>
8488
<div class="col-6">
@@ -91,6 +95,10 @@
9195
class="invalid-feedback">
9296
Category is required.
9397
</div>
98+
<div *ngIf="ruleForm.get('category').errors && ruleForm.get('category').errors['minWords'] && ruleForm.get('category').touched" class="invalid-feedback">
99+
Please enter at least {{ ruleForm.get('category').errors['minWords'].requiredWords }} words,
100+
each with at least {{ ruleForm.get('category').errors['minWords'].minLengthPerWord }} characters.
101+
</div>
94102
</div>
95103
</div>
96104
</div>
@@ -105,6 +113,10 @@
105113
class="invalid-feedback">
106114
Technique is required.
107115
</div>
116+
<div *ngIf="ruleForm.get('technique').errors && ruleForm.get('technique').errors['minWords'] && ruleForm.get('technique').touched" class="invalid-feedback">
117+
Please enter at least {{ ruleForm.get('technique').errors['minWords'].requiredWords }} words,
118+
each with at least {{ ruleForm.get('technique').errors['minWords'].minLengthPerWord }} characters.
119+
</div>
108120
</div>
109121
</div>
110122
<div class="col-6">
@@ -218,6 +230,10 @@
218230
class="invalid-feedback">
219231
Description is required.
220232
</div>
233+
<div *ngIf="ruleForm.get('description').errors && ruleForm.get('description').errors['minWords'] && ruleForm.get('description').touched" class="invalid-feedback">
234+
Please enter at least {{ ruleForm.get('description').errors['minWords'].requiredWords }} words,
235+
each with at least {{ ruleForm.get('description').errors['minWords'].minLengthPerWord }} characters.
236+
</div>
221237
</div>
222238
</div>
223239
</div>

frontend/src/app/rule-management/app-rule/components/add-rule/add-rule.component.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {AddRuleStepEnum, DataType, Mode, Rule, SearchRequest} from '../../../mod
88
import {AfterEventFormService} from '../../../services/after-event-form.service';
99
import {DataTypeService} from '../../../services/data-type.service';
1010
import {RuleService} from '../../../services/rule.service';
11+
import {minWordsValidator} from "../../validators/customs.validators";
1112

1213
@Component({
1314
selector: 'app-add-rule',
@@ -130,14 +131,14 @@ export class AddRuleComponent implements OnInit, OnDestroy {
130131
this.ruleForm = this.fb.group({
131132
id: [rule ? rule.id : ''],
132133
dataTypes: [rule ? rule.dataTypes : '', Validators.required],
133-
name: [rule ? rule.name : '', Validators.required],
134+
name: [rule ? rule.name : '', [Validators.required, minWordsValidator(2, 3)]],
134135
adversary: [rule ? rule.adversary : null, Validators.required],
135136
confidentiality: [rule ? rule.confidentiality : 0, [Validators.required, Validators.min(0), Validators.max(3)]],
136137
integrity: [rule ? rule.integrity : 0, [Validators.required, Validators.min(0), Validators.max(3)]],
137138
availability: [rule ? rule.availability : 0, [Validators.required, Validators.min(0), Validators.max(3)]],
138-
category: [rule ? rule.category : '', Validators.required],
139-
technique: [rule ? rule.technique : '', Validators.required],
140-
description: [rule ? rule.description : '', Validators.required],
139+
category: [rule ? rule.category : '', [Validators.required, minWordsValidator(2, 3)]],
140+
technique: [rule ? rule.technique : '', [Validators.required, minWordsValidator(2, 3)]],
141+
description: [rule ? rule.description : '', [Validators.required, minWordsValidator(2, 3)]],
141142
systemOwner: [rule ? rule.systemOwner : false],
142143
deduplicateBy: [rule ? rule.deduplicateBy || [] : []],
143144
afterEvents: this.fb.array(
@@ -192,7 +193,7 @@ export class AddRuleComponent implements OnInit, OnDestroy {
192193
}
193194
}
194195

195-
back(){
196+
back() {
196197
this.stepCompleted.pop();
197198
switch (this.currentStep) {
198199
case 3: this.currentStep = AddRuleStepEnum.STEP2;
Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,27 @@
11
import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';
22

33
export function containsVariable(variables: string[]): ValidatorFn {
4-
console.log('contains variable', variables);
54
return (control: AbstractControl): ValidationErrors | null => {
65
const value = control.value || '';
76
const hasVariable = variables.some(v => value.includes(v));
87
return hasVariable ? null : { noVariableUsed: true };
98
};
109
}
10+
11+
export function minWordsValidator(minWords: number, minLengthPerWord: number): ValidatorFn {
12+
return (control: AbstractControl): ValidationErrors | null => {
13+
const value = control.value.trim();
14+
15+
if (!value) { return { minWords: { requiredWords: minWords, minLengthPerWord } }; }
16+
17+
const words = value
18+
.split(/\s+/)
19+
.filter(word => word.length >= minLengthPerWord);
20+
21+
return words.length >= minWords ? null : {
22+
minWords: { requiredWords: minWords, minLengthPerWord }
23+
};
24+
};
25+
}
26+
27+

0 commit comments

Comments
 (0)