Skip to content

Commit 0097ba3

Browse files
authored
Merge pull request #1987 from bcgov/develop
Deployment PR - 1404
2 parents 1445455 + f54da40 commit 0097ba3

File tree

188 files changed

+6600
-1822
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

188 files changed

+6600
-1822
lines changed

alcs-frontend/src/app/features/admin/admin.component.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { BoardManagementComponent } from './board-management/board-management.co
44
import { CardStatusComponent } from './card-status/card-status.component';
55
import { CeoCriterionComponent } from './ceo-criterion/ceo-criterion.component';
66
import { ConfigurationComponent } from './configuration/configuration.component';
7-
import { DecisionConditionTypesComponent } from './decision-condition-types/decision-condition-types.component';
7+
import { DecisionConditionContainerComponent } from './decision-condition-types/decision-condition-container.component';
88
import { DecisionMakerComponent } from './decision-maker/decision-maker.component';
99
import { HolidayComponent } from './holiday/holiday.component';
1010
import { LocalGovernmentComponent } from './local-government/local-government.component';
@@ -41,7 +41,7 @@ export const childRoutes = [
4141
path: 'dct',
4242
menuTitle: 'Decision Condition Types',
4343
icon: 'hvac',
44-
component: DecisionConditionTypesComponent,
44+
component: DecisionConditionContainerComponent,
4545
},
4646
{
4747
path: 'noi',

alcs-frontend/src/app/features/admin/admin.module.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { CeoCriterionComponent } from './ceo-criterion/ceo-criterion.component';
1616
import { ConfigurationComponent } from './configuration/configuration.component';
1717
import { MaintenanceBannerConfirmationDialogComponent } from './configuration/maintenance-banner-confirmation-dialog/maintenance-banner-confirmation-dialog.component';
1818
import { DecisionConditionTypesDialogComponent } from './decision-condition-types/decision-condition-types-dialog/decision-condition-types-dialog.component';
19+
import { DecisionConditionContainerComponent } from './decision-condition-types/decision-condition-container.component';
1920
import { DecisionConditionTypesComponent } from './decision-condition-types/decision-condition-types.component';
2021
import { DecisionMakerDialogComponent } from './decision-maker/decision-maker-dialog/decision-maker-dialog.component';
2122
import { DecisionMakerComponent } from './decision-maker/decision-maker.component';
@@ -54,8 +55,8 @@ const routes: Routes = [
5455
UnarchiveComponent,
5556
DecisionMakerComponent,
5657
DecisionMakerDialogComponent,
57-
DecisionConditionTypesComponent,
5858
DecisionConditionTypesDialogComponent,
59+
DecisionConditionTypesComponent,
5960
CardStatusComponent,
6061
CardStatusDialogComponent,
6162
BoardManagementComponent,
@@ -67,6 +68,7 @@ const routes: Routes = [
6768
TagComponent,
6869
TagDialogComponent,
6970
TagContainerComponent,
71+
DecisionConditionContainerComponent,
7072
],
7173
imports: [
7274
CommonModule,

alcs-frontend/src/app/features/admin/board-management/board-management-dialog/board-management-dialog.component.html

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ <h4>{{ isEdit ? 'Edit' : 'Create' }} Board</h4>
1717
<mat-label>Code</mat-label>
1818
<input [formControl]="code" required maxlength="4" minlength="4" matInput id="code" name="code" />
1919
</mat-form-field>
20+
<div *ngIf="form.get('code')?.hasError('codeExists')">
21+
<app-error-message message="Code already in use, pick a different code."></app-error-message>
22+
</div>
2023
</div>
2124

2225
<div class="full-width">

alcs-frontend/src/app/features/admin/board-management/board-management-dialog/board-management-dialog.component.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';
22
import { Component, Inject, OnInit } from '@angular/core';
3-
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
3+
import { FormBuilder, FormControl, FormGroup, NgModel, Validators } from '@angular/forms';
44
import { MatCheckboxChange } from '@angular/material/checkbox';
55
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
66
import { AdminBoardManagementService } from '../../../../services/admin-board-management/admin-board-management.service';
@@ -10,6 +10,7 @@ import { BoardService } from '../../../../services/board/board.service';
1010
import { CardStatusService } from '../../../../services/card/card-status/card-status.service';
1111
import { CardType } from '../../../../shared/card/card.component';
1212
import { BaseCodeDto } from '../../../../shared/dto/base.dto';
13+
import { codeExistsValidator } from '../../../../shared/validators/code-exists-validator';
1314

1415
const DISABLED_CREATE_CARD_TYPES = [
1516
CardType.APP,
@@ -60,6 +61,7 @@ export class BoardManagementDialogComponent implements OnInit {
6061
public data: {
6162
board: MinimalBoardDto | undefined;
6263
cardTypes: BaseCodeDto[];
64+
existingCodes: string[];
6365
},
6466
private dialogRef: MatDialogRef<BoardManagementDialogComponent>,
6567
private cardStatusService: CardStatusService,
@@ -76,6 +78,8 @@ export class BoardManagementDialogComponent implements OnInit {
7678
for (const type of this.cardTypes) {
7779
this.cardTypeMap[type.code] = type.label;
7880
}
81+
82+
this.code.addValidators(codeExistsValidator(this.data?.existingCodes ? this.data.existingCodes : []));
7983
}
8084

8185
async loadBoard(code: string) {

alcs-frontend/src/app/features/admin/board-management/board-management.component.ts

+2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export class BoardManagementComponent implements OnInit, OnDestroy {
4444
height: '80%',
4545
data: {
4646
cardTypes: this.cardTypes,
47+
existingCodes: this.boards.map((b) => b.code.toLowerCase()),
4748
},
4849
});
4950
dialog.beforeClosed().subscribe(async (result) => {
@@ -62,6 +63,7 @@ export class BoardManagementComponent implements OnInit, OnDestroy {
6263
data: {
6364
board: boardDto,
6465
cardTypes: this.cardTypes,
66+
existingCodes: this.boards.map((b) => b.code.toLowerCase()),
6567
},
6668
});
6769
dialog.beforeClosed().subscribe(async (result) => {

alcs-frontend/src/app/features/admin/card-status/card-status-dialog/card-status-dialog.component.html

+5-2
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ <h4>{{ isEdit ? 'Edit' : 'Create' }} Column</h4>
1414
matInput
1515
id="code"
1616
[(ngModel)]="code"
17+
#codeModel="ngModel"
1718
name="code"
1819
/>
1920
</mat-form-field>
2021
</div>
21-
22+
<div *ngIf="isCodeExisiting(codeModel) && !isEdit" class="full-width code-error-message">
23+
<app-error-message message="Code already in use, pick a different code."></app-error-message>
24+
</div>
2225
<div>
2326
<mat-form-field class="label" appearance="outline">
2427
<mat-label>Label</mat-label>
@@ -37,7 +40,7 @@ <h4>{{ isEdit ? 'Edit' : 'Create' }} Column</h4>
3740

3841
<div class="split">
3942
<div [matTooltip]="canDeleteReason" [matTooltipDisabled]="canDelete">
40-
<button [disabled]="!canDelete" (click)='onDelete()' mat-stroked-button color="warn">Delete</button>
43+
<button [disabled]="!canDelete" (click)="onDelete()" mat-stroked-button color="warn">Delete</button>
4144
</div>
4245
<div class="button-container">
4346
<button mat-stroked-button color="primary" mat-dialog-close="false">Close</button>

alcs-frontend/src/app/features/admin/card-status/card-status-dialog/card-status-dialog.component.scss

+8
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@
1111
.mat-mdc-form-field {
1212
width: 100%;
1313
}
14+
15+
.code-error-message {
16+
margin: -20px 0 -20px 0;
17+
}
18+
19+
.code {
20+
padding-top: 8px;
21+
}
1422
}
1523
}
1624

alcs-frontend/src/app/features/admin/card-status/card-status-dialog/card-status-dialog.component.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe('CardStatusDialogComponent', () => {
1919
imports: [ReactiveFormsModule, FormsModule],
2020
declarations: [CardStatusDialogComponent],
2121
providers: [
22-
{ provide: MAT_DIALOG_DATA, useValue: undefined },
22+
{ provide: MAT_DIALOG_DATA, useValue: { existingCodes: [] } },
2323
{ provide: MatDialogRef, useValue: {} },
2424
{
2525
provide: CardStatusService,

alcs-frontend/src/app/features/admin/card-status/card-status-dialog/card-status-dialog.component.ts

+17-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { Component, Inject, OnInit } from '@angular/core';
22
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
33
import { CardStatusDto } from '../../../../services/application/application-code.dto';
44
import { CardStatusService } from '../../../../services/card/card-status/card-status.service';
5+
import { NgModel } from '@angular/forms';
6+
import { codeExistsDirectiveValidator } from '../../../../shared/validators/code-exists-validator';
57

68
@Component({
79
selector: 'app-decision-condition-types-dialog',
@@ -19,16 +21,20 @@ export class CardStatusDialogComponent implements OnInit {
1921
canDeleteReason = '';
2022

2123
constructor(
22-
@Inject(MAT_DIALOG_DATA) public data: CardStatusDto | undefined,
24+
@Inject(MAT_DIALOG_DATA)
25+
public data: {
26+
cardStatus: CardStatusDto | undefined;
27+
existingCodes: string[];
28+
},
2329
private dialogRef: MatDialogRef<CardStatusDialogComponent>,
24-
private cardStatusService: CardStatusService
30+
private cardStatusService: CardStatusService,
2531
) {
26-
if (data) {
27-
this.description = data.description;
28-
this.label = data.label;
29-
this.code = data.code;
32+
if (data.cardStatus) {
33+
this.description = data.cardStatus.description;
34+
this.label = data.cardStatus.label;
35+
this.code = data.cardStatus.code;
3036
}
31-
this.isEdit = !!data;
37+
this.isEdit = !!data.cardStatus;
3238
}
3339

3440
async onSubmit() {
@@ -65,4 +71,8 @@ export class CardStatusDialogComponent implements OnInit {
6571
await this.cardStatusService.delete(this.code);
6672
this.dialogRef.close(true);
6773
}
74+
75+
isCodeExisiting(model: NgModel) {
76+
return codeExistsDirectiveValidator(model, this.data.existingCodes, this.code);
77+
}
6878
}

alcs-frontend/src/app/features/admin/card-status/card-status.component.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export class CardStatusComponent implements OnInit {
1818
constructor(
1919
private cardStatusService: CardStatusService,
2020
public dialog: MatDialog,
21-
private confirmationDialogService: ConfirmationDialogService
21+
private confirmationDialogService: ConfirmationDialogService,
2222
) {}
2323

2424
ngOnInit(): void {
@@ -34,6 +34,7 @@ export class CardStatusComponent implements OnInit {
3434
minWidth: '600px',
3535
maxWidth: '800px',
3636
width: '70%',
37+
data: { existingCodes: this.cardStatusDtos.map((cs) => cs.code.toLowerCase()) },
3738
});
3839
dialog.beforeClosed().subscribe(async (result) => {
3940
if (result) {
@@ -47,7 +48,7 @@ export class CardStatusComponent implements OnInit {
4748
minWidth: '600px',
4849
maxWidth: '800px',
4950
width: '70%',
50-
data: cardStatusDto,
51+
data: { cardStatus: cardStatusDto, existingCodes: this.cardStatusDtos.map((cs) => cs.code.toLowerCase()) },
5152
});
5253
dialog.beforeClosed().subscribe(async (result) => {
5354
if (result) {

alcs-frontend/src/app/features/admin/ceo-criterion/ceo-criterion-dialog/ceo-criterion-dialog.component.html

+5-1
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,13 @@ <h4>{{ isEdit ? 'Edit' : 'Create' }} CEO Criterion</h4>
2121
matInput
2222
id="code"
2323
[(ngModel)]="code"
24+
#codeModel="ngModel"
2425
name="code"
2526
/>
2627
</mat-form-field>
28+
<div *ngIf="isCodeExisting(codeModel) && !isEdit">
29+
<app-error-message message="Code already in use or deteled, pick a different code."></app-error-message>
30+
</div>
2731
</div>
2832

2933
<div class="full-width">
@@ -50,7 +54,7 @@ <h4>{{ isEdit ? 'Edit' : 'Create' }} CEO Criterion</h4>
5054
mat-flat-button
5155
color="primary"
5256
type="submit"
53-
[disabled]="!form.form.valid"
57+
[disabled]="!form.form.valid || (isCodeExisting(codeModel) && !isEdit)"
5458
>
5559
Save
5660
</button>

alcs-frontend/src/app/features/admin/ceo-criterion/ceo-criterion-dialog/ceo-criterion-dialog.component.scss

+8
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,13 @@
1515
.mat-mdc-form-field {
1616
width: 100%;
1717
}
18+
19+
.code {
20+
padding-top: 8px;
21+
}
22+
23+
.number-input {
24+
padding-top: 8px;
25+
}
1826
}
1927
}

alcs-frontend/src/app/features/admin/ceo-criterion/ceo-criterion-dialog/ceo-criterion-dialog.component.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('CeoCriterionDialogComponent', () => {
1515
imports: [ReactiveFormsModule, FormsModule],
1616
declarations: [CeoCriterionDialogComponent],
1717
providers: [
18-
{ provide: MAT_DIALOG_DATA, useValue: undefined },
18+
{ provide: MAT_DIALOG_DATA, useValue: { existingCodes: [] } },
1919
{ provide: MatDialogRef, useValue: {} },
2020
{
2121
provide: CeoCriterionService,

alcs-frontend/src/app/features/admin/ceo-criterion/ceo-criterion-dialog/ceo-criterion-dialog.component.ts

+18-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { Component, Inject } from '@angular/core';
22
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
3-
import { CeoCriterionDto } from '../../../../services/application/decision/application-decision-v2/application-decision.dto';
43
import { CeoCriterionService } from '../../../../services/ceo-criterion/ceo-criterion.service';
4+
import { NgModel } from '@angular/forms';
5+
import { CeoCriterionDto } from '../../../../services/application/decision/application-decision-v2/application-decision.dto';
6+
import { codeExistsDirectiveValidator } from '../../../../shared/validators/code-exists-validator';
57

68
@Component({
79
selector: 'app-ceo-criterion-dialog',
@@ -18,17 +20,21 @@ export class CeoCriterionDialogComponent {
1820
isEdit = false;
1921

2022
constructor(
21-
@Inject(MAT_DIALOG_DATA) public data: CeoCriterionDto | undefined,
23+
@Inject(MAT_DIALOG_DATA)
24+
public data: {
25+
ceoCriterion: CeoCriterionDto | undefined;
26+
existingCodes: string[];
27+
},
2228
private dialogRef: MatDialogRef<CeoCriterionDialogComponent>,
2329
private ceoCriterionService: CeoCriterionService,
2430
) {
25-
if (data) {
26-
this.description = data.description;
27-
this.label = data.label;
28-
this.code = data.code;
29-
this.number = data.number.toString();
31+
if (data?.ceoCriterion) {
32+
this.description = data.ceoCriterion.description;
33+
this.label = data.ceoCriterion.label;
34+
this.code = data.ceoCriterion.code;
35+
this.number = data.ceoCriterion.number.toString();
3036
}
31-
this.isEdit = !!data;
37+
this.isEdit = !!data?.ceoCriterion;
3238
}
3339

3440
async onSubmit() {
@@ -53,4 +59,8 @@ export class CeoCriterionDialogComponent {
5359
this.isLoading = false;
5460
this.dialogRef.close(true);
5561
}
62+
63+
isCodeExisting(model: NgModel) {
64+
return codeExistsDirectiveValidator(model, this.data.existingCodes, this.code);
65+
}
5666
}

alcs-frontend/src/app/features/admin/ceo-criterion/ceo-criterion.component.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ export class CeoCriterionComponent implements OnInit {
3636
minWidth: '600px',
3737
maxWidth: '800px',
3838
width: '70%',
39+
data: {
40+
existingCodes: this.ceoCriterion.map((cc) => cc.code.toLocaleLowerCase()),
41+
},
3942
});
4043
dialog.beforeClosed().subscribe(async (result) => {
4144
if (result) {
@@ -49,7 +52,7 @@ export class CeoCriterionComponent implements OnInit {
4952
minWidth: '600px',
5053
maxWidth: '800px',
5154
width: '70%',
52-
data: ceoCriterion,
55+
data: { ceoCriterion: ceoCriterion, existingCodes: this.ceoCriterion.map((cc) => cc.code) },
5356
});
5457
dialog.beforeClosed().subscribe(async (result) => {
5558
if (result) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<mat-tab-group id="conditions" mat-align-tabs="start">
2+
<mat-tab>
3+
<ng-template mat-tab-label>
4+
<span class="tab-label">Application</span>
5+
</ng-template>
6+
<br />
7+
<app-decision-condition-types [service]="applicationService" [conditionService]="applicationConditionService" />
8+
</mat-tab>
9+
10+
<mat-tab>
11+
<ng-template mat-tab-label>
12+
<span class="tab-label">Notice of Intent</span>
13+
</ng-template>
14+
<br />
15+
<app-decision-condition-types [service]="noiService" [conditionService]="noiConditionService" />
16+
</mat-tab>
17+
</mat-tab-group>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.tab-label {
2+
font-weight: 700;
3+
font-size: 16px;
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Component } from '@angular/core';
2+
import { ApplicationDecisionConditionTypesService } from '../../../services/application/application-decision-condition-types/application-decision-condition-types.service';
3+
import { NoticeofIntentDecisionConditionTypesService } from '../../../services/notice-of-intent/notice-of-intent-decision-condition-types/notice-of-intent-decision-condition-types.service';
4+
import { NoticeOfIntentDecisionConditionService } from '../../../services/notice-of-intent/decision-v2/notice-of-intent-decision-condition/notice-of-intent-decision-condition.service';
5+
import { ApplicationDecisionConditionService } from '../../../services/application/decision/application-decision-v2/application-decision-condition/application-decision-condition.service';
6+
7+
@Component({
8+
selector: 'app-decision-condition-container',
9+
templateUrl: './decision-condition-container.component.html',
10+
styleUrls: ['./decision-condition-container.component.scss'],
11+
})
12+
export class DecisionConditionContainerComponent {
13+
applicationService: ApplicationDecisionConditionTypesService;
14+
applicationConditionService: ApplicationDecisionConditionService;
15+
noiService: NoticeofIntentDecisionConditionTypesService;
16+
noiConditionService: NoticeOfIntentDecisionConditionService;
17+
18+
constructor(
19+
private aplicationDecisionConditionTypesService: ApplicationDecisionConditionTypesService,
20+
private aplicationDecisionConditionService: ApplicationDecisionConditionService,
21+
private noiDecisionConditionTypesService: NoticeofIntentDecisionConditionTypesService,
22+
private noiDecisionConditionService: NoticeOfIntentDecisionConditionService,
23+
) {
24+
this.applicationService = this.aplicationDecisionConditionTypesService;
25+
this.applicationConditionService = this.aplicationDecisionConditionService;
26+
this.noiService = this.noiDecisionConditionTypesService;
27+
this.noiConditionService = this.noiDecisionConditionService;
28+
}
29+
}

0 commit comments

Comments
 (0)