Skip to content

Commit 1699f24

Browse files
committed
fix(ui): refactor add variable for correlation rule
1 parent 9955e47 commit 1699f24

4 files changed

Lines changed: 38 additions & 42 deletions

File tree

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

Lines changed: 8 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,6 @@
8585
</div>
8686
</div>
8787
</div>
88-
<!-- <div class="col-1 d-flex justify-content-center align-items-center">
89-
<button (click)="saveVariable(i)"
90-
[disabled]="variable.invalid || variable.get('of_type').value == null || variable.get('get').value == null"
91-
class="btn utm-button utm-button-primary"
92-
type="button">Add
93-
</button>
94-
</div>-->
9588
</div>
9689
</fieldset>
9790
</div>
@@ -105,44 +98,19 @@
10598
(variablesChange)="onVariablesChange($event)"
10699
(touched)="formGroup.get('definition')?.get('ruleExpression').markAsTouched()">
107100
</app-expression-console>
101+
102+
{{ formGroup.get('definition').get('ruleExpression').value }}
103+
104+
108105
<div *ngIf="formGroup.get('definition').get('ruleExpression').invalid &&
109106
formGroup.get('definition').get('ruleExpression').touched"
110107
class="invalid-feedback">
111108
Expression is required.
112109
</div>
113-
<!--<fieldset *ngIf="savedVariables.length > 0" class="border p-3 w-100">
114-
<legend>
115-
<label>Variables:</label>
116-
</legend>
117-
<div class="d-flex flex-wrap justify-content-start">
118-
<div *ngFor="let savedVariable of savedVariables; let j = index">
119-
<div class="mr-2" *ngIf="!savedVariable.isEditing">
120-
<div style="min-width: 100px"
121-
class="d-flex flex-wrap cursor-pointer badge p-2 border-1 badge-flat font-weight-light border-grey-100 text-blue-800">
122-
<div (click)="copyVariable(savedVariable.as)" [ngbTooltip]="savedVariable.get">
123-
<i class="mr-1 font-size-sm icon-cog7"></i>
124-
<span>
125-
{{ savedVariable.as }}
126-
</span>
127-
</div>
128-
<span class="ml-2 badge-actions">
129-
<i (click)="editVariable(j)" class="icon-pencil3 small-icon cursor-pointer mr-1"></i>
130-
<i (click)="removeSavedVariable(j)" class="icon-cross2 small-icon cursor-pointer"></i>
131-
</span>
132-
</div>
133-
</div>
134-
</div>
135-
</div>
136-
</fieldset>-->
137-
<!-- <label for="expression">Expression:</label>
138-
<textarea
139-
[ngClass]="{'is-invalid': formGroup.get('definition').get('ruleExpression').invalid && formGroup.get('definition').get('ruleExpression').touched}"
140-
class="form-control" formControlName="ruleExpression" id="expression" rows="6"></textarea>
141-
<div
142-
*ngIf="formGroup.get('definition').get('ruleExpression').invalid && formGroup.get('definition').get('ruleExpression').touched"
143-
class="invalid-feedback">
144-
Expression is required.
145-
</div>-->
110+
<div *ngIf="formGroup.get('definition.ruleExpression')?.hasError('noVariableUsed') && formGroup.get('definition.ruleExpression')?.touched"
111+
class="invalid-feedback">
112+
You must include at least one variable in the expression.
113+
</div>
146114
</div>
147115
</div>
148116
</fieldset>

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {ElasticSearchFieldInfoType} from '../../../../shared/types/elasticsearch
66
import {singleTermValidator, variableTemplate} from '../../../custom-validators';
77
import {VariableDataType} from '../../../models/rule.constant';
88
import {Rule} from '../../../models/rule.model';
9+
import {containsVariable} from '../../validators/customs.validators';
910

1011

1112
@Component({
@@ -29,7 +30,8 @@ export class AddVariableComponent implements OnInit {
2930

3031
this.formGroup.setControl('definition', this.fb.group({
3132
ruleVariables: this.fb.array([this.fb.group(variableTemplate)]),
32-
ruleExpression: [this.rule ? this.rule.definition.ruleExpression : '', Validators.required]
33+
ruleExpression: [this.rule ? this.rule.definition.ruleExpression : '', [Validators.required,
34+
containsVariable(this.savedVariables.map(v => v.as))]]
3335
}));
3436
}
3537

@@ -43,6 +45,7 @@ export class AddVariableComponent implements OnInit {
4345

4446
addVariable() {
4547
this.variables.push(this.fb.group(variableTemplate));
48+
this.reloadExpressionContainVariableValidator();
4649
}
4750

4851
removeVariable(index: number) {
@@ -99,8 +102,16 @@ export class AddVariableComponent implements OnInit {
99102
}
100103

101104
onVariablesChange(updatedVars: { as: string; ofType: string; get: string }[]) {
102-
this.savedVariables = updatedVars;
105+
this.savedVariables = [
106+
...updatedVars,
107+
];
108+
this.reloadExpressionContainVariableValidator();
103109
}
104110

111+
reloadExpressionContainVariableValidator(){
112+
const control = this.formGroup.get('definition.ruleExpression');
113+
control.setValidators([Validators.required, containsVariable(this.savedVariables.map(v => v.as))]);
114+
control.updateValueAndValidity();
105115

116+
}
106117
}

frontend/src/app/rule-management/app-rule/components/expression-console/expression-console.component.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,11 @@ export class ExpressionConsoleComponent implements ControlValueAccessor {
133133
this.suggestions = [];
134134
}
135135
}
136+
@HostListener('input', ['$event'])
137+
onInput(event: Event): void {
138+
const textarea = this.consoleRef.nativeElement;
139+
this.value = textarea.value;
140+
this.onChange(this.value);
141+
}
142+
136143
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';
2+
3+
export function containsVariable(variables: string[]): ValidatorFn {
4+
console.log('contains variable', variables);
5+
return (control: AbstractControl): ValidationErrors | null => {
6+
const value = control.value || '';
7+
const hasVariable = variables.some(v => value.includes(v));
8+
return hasVariable ? null : { noVariableUsed: true };
9+
};
10+
}

0 commit comments

Comments
 (0)