Skip to content

Commit 9b8d901

Browse files
authored
Merge pull request #2046 from bcgov/hotfix/ALCS-2453-handle-unique-descriptions-decision-types
ALCS-2453 Handle unique descriptions on condition types
2 parents 39b998e + a34af0a commit 9b8d901

File tree

5 files changed

+21
-1
lines changed

5 files changed

+21
-1
lines changed

alcs-frontend/src/app/features/admin/decision-condition-types/decision-condition-types-dialog/decision-condition-types-dialog.component.html

+3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ <h4>{{ isEdit ? 'Edit' : 'Create' }} Decision Condition Type</h4>
2525
<mat-label>Description</mat-label>
2626
<input required matInput id="description" formControlName="description" name="description" />
2727
</mat-form-field>
28+
<div *ngIf="conditionTypeForm.get('description')?.hasError('descriptionExists')">
29+
<app-error-message message="Description already in use or deteled, pick a different description."></app-error-message>
30+
</div>
2831
</div>
2932

3033
<div class="dialog-field full-width">

alcs-frontend/src/app/features/admin/decision-condition-types/decision-condition-types-dialog/decision-condition-types-dialog.component.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
import { ApplicationDecisionConditionService } from '../../../../services/application/decision/application-decision-v2/application-decision-condition/application-decision-condition.service';
1818
import { NoticeOfIntentDecisionConditionService } from '../../../../services/notice-of-intent/decision-v2/notice-of-intent-decision-condition/notice-of-intent-decision-condition.service';
1919
import { catchError, debounceTime, map, Observable, of, switchMap } from 'rxjs';
20-
import { codeExistsValidator } from '../../../../shared/validators/code-exists-validator';
20+
import { codeExistsValidator, descriptionExistsValidator } from '../../../../shared/validators/code-exists-validator';
2121

2222
enum ValidationFields {
2323
Dates,
@@ -54,6 +54,7 @@ export class DecisionConditionTypesDialogComponent {
5454
this.conditionTypeForm = new FormGroup({
5555
description: new FormControl(this.data?.content?.description ? this.data.content.description : '', [
5656
Validators.required,
57+
descriptionExistsValidator(this.data?.existingDescriptions ? this.data.existingDescriptions : []),
5758
]),
5859
label: new FormControl(this.data?.content?.label ? this.data.content.label : '', [Validators.required]),
5960
code: new FormControl(this.data?.content?.code ? this.data.content.code : '', [

alcs-frontend/src/app/features/admin/decision-condition-types/decision-condition-types.component.ts

+4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export class DecisionConditionTypesComponent implements OnInit {
3030

3131
decisionConditionTypeDtos: ApplicationDecisionConditionTypeDto[] | NoticeOfIntentDecisionConditionTypeDto[] = [];
3232
decisionConditionTypeCodeDtos: string[] = [];
33+
decisionConditionTypeDescriptionDtos: string[] = [];
3334
displayedColumns: string[] = ['label', 'description', 'code', 'isActive', 'actions'];
3435

3536
constructor(
@@ -45,6 +46,7 @@ export class DecisionConditionTypesComponent implements OnInit {
4546
if (!this.service) return;
4647
this.decisionConditionTypeDtos = await this.service.fetch();
4748
this.decisionConditionTypeCodeDtos = await this.service.fetchCodesWithDeleted();
49+
this.decisionConditionTypeDescriptionDtos = this.decisionConditionTypeDtos.map((d) => d.description);
4850
}
4951

5052
async onCreate() {
@@ -57,6 +59,7 @@ export class DecisionConditionTypesComponent implements OnInit {
5759
service: this.service,
5860
conditionService: this.conditionService,
5961
existingCodes: this.decisionConditionTypeCodeDtos,
62+
existingDescriptions: this.decisionConditionTypeDescriptionDtos,
6063
},
6164
});
6265
dialog.beforeClosed().subscribe(async (result) => {
@@ -77,6 +80,7 @@ export class DecisionConditionTypesComponent implements OnInit {
7780
conditionService: this.conditionService,
7881
content: dto,
7982
existingCodes: this.decisionConditionTypeCodeDtos,
83+
existingDescriptions: this.decisionConditionTypeDescriptionDtos,
8084
},
8185
});
8286
dialog.beforeClosed().subscribe(async (result) => {

alcs-frontend/src/app/features/admin/decision-condition-types/decision-dialog-data.interface.ts

+1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ export interface DecisionDialogDataInterface {
99
conditionService: ApplicationDecisionConditionService | NoticeOfIntentDecisionConditionService;
1010
content: ApplicationDecisionConditionTypeDto;
1111
existingCodes: string[];
12+
existingDescriptions: string[];
1213
}

alcs-frontend/src/app/shared/validators/code-exists-validator.ts

+11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@ export function codeExistsValidator(existingCodes: string[]): ValidatorFn {
1212
};
1313
}
1414

15+
export function descriptionExistsValidator(existingDescriptions: string[]): ValidatorFn {
16+
return (control: AbstractControl): ValidationErrors | null => {
17+
if (!control.value) return null;
18+
const inputValue = control.value.toLowerCase();
19+
if (existingDescriptions.some((description) => description.toLowerCase() === inputValue)) {
20+
return { descriptionExists: true };
21+
}
22+
return null;
23+
};
24+
}
25+
1526
export function codeExistsDirectiveValidator(model: NgModel, existingCodes: string[], code: string) {
1627
const existingErrors = model.control.errors || {};
1728
const isExisting = existingCodes.includes(code.toLowerCase());

0 commit comments

Comments
 (0)