Skip to content

Commit da77acd

Browse files
authored
Merge pull request #2072 from bcgov/feature/ALCS-1871-3
QA Fixes #1: 1871
2 parents 7192c5d + c7b9d2c commit da77acd

File tree

7 files changed

+106
-31
lines changed

7 files changed

+106
-31
lines changed

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

+10-8
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ import { ApplicationDecisionConditionCardService } from '../../services/applicat
5050
import { ApplicationDecisionConditionCardBoardDto } from '../../services/application/decision/application-decision-v2/application-decision-v2.dto';
5151
import { ApplicationDecisionConditionDialogComponent } from './dialogs/application-decision-condition-dialog/application-decision-condition-dialog.component';
5252

53+
export const CONDITION_STATUS = {
54+
EXPIRED: 'EXPIRED',
55+
PASTDUE: 'PASTDUE',
56+
};
57+
5358
export const BOARD_TYPE_CODES = {
5459
VETT: 'vett',
5560
EXEC: 'exec',
@@ -187,7 +192,7 @@ export class BoardComponent implements OnInit, OnDestroy {
187192
});
188193
}
189194

190-
onDropped($event: { id: string; status: string; cardTypeCode: CardType }) {
195+
onDropped($event: { id: string; status: string; cardTypeCode: CardType; conditionCardUuid?: string }) {
191196
switch ($event.cardTypeCode) {
192197
case CardType.APP:
193198
this.applicationService
@@ -205,6 +210,7 @@ export class BoardComponent implements OnInit, OnDestroy {
205210
case CardType.NOI_MODI:
206211
case CardType.NOTIFICATION:
207212
case CardType.INQUIRY:
213+
case CardType.APP_CON:
208214
this.cardService
209215
.updateCard({
210216
uuid: $event.id,
@@ -512,12 +518,8 @@ export class BoardComponent implements OnInit, OnDestroy {
512518
let isPastDue = false;
513519

514520
for (const condition of applicationDecisionCondition.conditions) {
515-
if (condition.status === 'EXPIRED') {
516-
isExpired = true;
517-
}
518-
if (condition.status === 'PASTDUE') {
519-
isPastDue = true;
520-
}
521+
isExpired = isExpired || condition.status === CONDITION_STATUS.EXPIRED;
522+
isPastDue = isPastDue || condition.status === CONDITION_STATUS.PASTDUE;
521523
}
522524

523525
return {
@@ -526,7 +528,7 @@ export class BoardComponent implements OnInit, OnDestroy {
526528
title: `${applicationDecisionCondition.fileNumber} (${applicationDecisionCondition.applicant})`,
527529
titleTooltip: applicationDecisionCondition.applicant,
528530
assignee: applicationDecisionCondition.card!.assignee,
529-
id: applicationDecisionCondition.fileNumber,
531+
id: applicationDecisionCondition.uuid,
530532
labels: [applicationDecisionCondition.type!],
531533
highPriority: applicationDecisionCondition.card.highPriority,
532534
cardType: CardType.APP_CON,

alcs-frontend/src/app/features/board/dialogs/application-decision-condition-dialog/application-decision-condition-dialog.component.html

+11-3
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,14 @@ <h3 class="card-title">
127127
</ng-template>
128128
</div>
129129
</div>
130-
<div class="conditions-table-container">
130+
<div class="conditions-table-container" [ngClass]="{ 'error-state': isSaveDisabled() }">
131131
<table mat-table class="conditions-table mat-elevation-z2" [dataSource]="dataSource" style="width: 100%">
132132
<ng-container matColumnDef="select">
133133
<td mat-cell *matCellDef="let element" class="column-select">
134-
<mat-checkbox [(ngModel)]="element.selected"></mat-checkbox>
134+
<mat-checkbox
135+
[disabled]="isConditionDisabled(element.condition)"
136+
[(ngModel)]="element.selected"
137+
></mat-checkbox>
135138
</td>
136139
</ng-container>
137140

@@ -155,7 +158,12 @@ <h3 class="card-title">
155158
<ng-template #multipleDateColumn>
156159
<span class="date-label">Due Date:</span>
157160
</ng-template>
158-
{{ getDate(element.condition) }}
161+
<ng-container *ngIf="getDate(element.condition); else noDate">
162+
{{ getDate(element.condition) }}
163+
</ng-container>
164+
<ng-template #noDate>
165+
<span class="no-data">No Data</span>
166+
</ng-template>
159167
</ng-container>
160168
</td>
161169
</ng-container>

alcs-frontend/src/app/features/board/dialogs/application-decision-condition-dialog/application-decision-condition-dialog.component.scss

+26
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
@use '../../../../../styles/colors.scss';
2+
13
.column-select {
24
width: 10%;
35
}
@@ -30,6 +32,25 @@
3032
margin-top: 8px;
3133
border: 2px solid #929292;
3234
border-radius: 4px;
35+
36+
::ng-deep .mdc-checkbox {
37+
--mdc-checkbox-selected-icon-color: #{colors.$primary-color};
38+
--mdc-checkbox-selected-focus-icon-color: #{colors.$primary-color};
39+
--mdc-checkbox-selected-focus-icon-color: #{colors.$primary-color};
40+
--mdc-checkbox-selected-hover-icon-color: #{colors.$primary-color};
41+
--mdc-checkbox-selected-pressed-icon-color: #{colors.$primary-color};
42+
}
43+
}
44+
45+
.error-state {
46+
border: 2px solid colors.$error-color !important;
47+
48+
::ng-deep .mdc-checkbox {
49+
--mdc-checkbox-unselected-icon-color: #{colors.$error-color};
50+
--mdc-checkbox-unselected-focus-icon-color: #{colors.$error-color};
51+
--mdc-checkbox-unselected-hover-icon-color: #{colors.$error-color};
52+
--mdc-checkbox-unselected-pressed-icon-color: #{colors.$error-color};
53+
}
3354
}
3455

3556
.date-label {
@@ -85,3 +106,8 @@
85106
flex-direction: row;
86107
gap: 1px;
87108
}
109+
110+
.no-data {
111+
color: colors.$grey;
112+
font-weight: 400;
113+
}

alcs-frontend/src/app/features/board/dialogs/application-decision-condition-dialog/application-decision-condition-dialog.component.ts

+25-13
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ import {
88
ApplicationDecisionDto,
99
UpdateApplicationDecisionConditionCardDto,
1010
} from '../../../../services/application/decision/application-decision-v2/application-decision-v2.dto';
11-
import { ApplicationService } from '../../../../services/application/application.service';
1211
import { ApplicationDecisionV2Service } from '../../../../services/application/decision/application-decision-v2/application-decision-v2.service';
13-
import { Router } from '@angular/router';
1412
import { UserService } from '../../../../services/user/user.service';
1513
import { ConfirmationDialogService } from '../../../../shared/confirmation-dialog/confirmation-dialog.service';
1614
import { BoardService } from '../../../../services/board/board.service';
@@ -63,10 +61,8 @@ export class ApplicationDecisionConditionDialogComponent extends CardDialogCompo
6361
decisionConditionCard: ApplicationDecisionConditionCardBoardDto;
6462
application: ApplicationDto;
6563
},
66-
private applicationService: ApplicationService,
6764
private applicationDecisionService: ApplicationDecisionV2Service,
6865
private applicationDecisionConditionCardService: ApplicationDecisionConditionCardService,
69-
private router: Router,
7066
dialogRef: MatDialogRef<ApplicationDecisionConditionDialogComponent>,
7167
userService: UserService,
7268
confirmationDialogService: ConfirmationDialogService,
@@ -83,22 +79,32 @@ export class ApplicationDecisionConditionDialogComponent extends CardDialogCompo
8379
}
8480

8581
async populateData() {
82+
await this.loadDecision();
83+
84+
this.populateCardData(this.applicationDecisionConditionCard.card);
85+
this.cardTitle = `${this.application.fileNumber} (${this.application.applicant})`;
86+
87+
this.loadTableData(true);
88+
}
89+
90+
async loadDecision() {
8691
const decision = await this.applicationDecisionService.getByUuid(
8792
this.applicationDecisionConditionCard.decisionUuid,
8893
true,
8994
);
9095
if (decision) {
9196
this.decision = decision;
9297
}
98+
}
9399

94-
this.populateCardData(this.applicationDecisionConditionCard.card);
95-
this.cardTitle = `${this.application.fileNumber} (${this.application.applicant})`;
96-
97-
this.dataSource.data = this.decision.conditions.map((condition, index) => ({
100+
loadTableData(filterSelected: boolean = false) {
101+
const data = this.decision.conditions.map((condition, index) => ({
98102
condition,
99103
index: countToString(index + 1),
100104
selected: this.isConditionSelected(condition),
101105
}));
106+
107+
filterSelected ? (this.dataSource.data = data.filter((item) => item.selected)) : (this.dataSource.data = data);
102108
}
103109

104110
isConditionSelected(condition: ApplicationDecisionConditionDto): boolean {
@@ -171,11 +177,14 @@ export class ApplicationDecisionConditionDialogComponent extends CardDialogCompo
171177
editClicked() {
172178
this.isEditing = true;
173179
this.displayColumns = this.editColumns;
180+
this.loadTableData();
174181
}
175182

176183
onCancel() {
177184
this.isEditing = false;
178185
this.displayColumns = this.defaultColumns;
186+
187+
this.loadTableData(true);
179188
}
180189

181190
async onSave() {
@@ -188,13 +197,16 @@ export class ApplicationDecisionConditionDialogComponent extends CardDialogCompo
188197
this.applicationDecisionConditionCard.uuid,
189198
updateDto,
190199
);
191-
if (res) {
192-
this.toastService.showSuccessToast('Condition card updated successfully');
193-
} else {
194-
this.toastService.showErrorToast('Failed to update condition card');
195-
}
200+
res
201+
? this.toastService.showSuccessToast('Condition card updated successfully')
202+
: this.toastService.showErrorToast('Failed to update condition card');
203+
196204
this.isEditing = false;
197205
this.displayColumns = this.defaultColumns;
206+
this.isDirty = true;
207+
208+
await this.loadDecision();
209+
this.loadTableData(true);
198210
}
199211

200212
isSaveDisabled(): boolean {

services/apps/alcs/src/alcs/application-decision/application-decision-condition/application-decision-condition-card/application-decision-condition-card.service.spec.ts

+27-4
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ import {
1616
ServiceNotFoundException,
1717
ServiceValidationException,
1818
} from '../../../../../../../libs/common/src/exceptions/base.exception';
19-
import { ApplicationDecisionConditionCardBoardDto } from './application-decision-condition-card.dto';
2019
import { Card } from '../../../card/card.entity';
21-
import { ApplicationType } from '../../../code/application-code/application-type/application-type.entity';
2220
import { ApplicationProfile } from '../../../../common/automapper/application.automapper.profile';
2321

2422
describe('ApplicationDecisionConditionCardService', () => {
@@ -30,6 +28,31 @@ describe('ApplicationDecisionConditionCardService', () => {
3028
let mockCardService: DeepMocked<CardService>;
3129
let mockMapper: DeepMocked<Mapper>;
3230

31+
const CARD_RELATIONS = {
32+
board: true,
33+
type: true,
34+
status: true,
35+
assignee: true,
36+
};
37+
38+
const BOARD_CARD_RELATIONS = {
39+
card: CARD_RELATIONS,
40+
conditions: true,
41+
decision: {
42+
application: {
43+
type: true,
44+
},
45+
},
46+
};
47+
48+
const DEFAULT_RELATIONS = {
49+
conditions: true,
50+
card: CARD_RELATIONS,
51+
decision: {
52+
application: true,
53+
},
54+
};
55+
3356
beforeEach(async () => {
3457
mockRepository = createMock();
3558
mockConditionService = createMock();
@@ -165,7 +188,7 @@ describe('ApplicationDecisionConditionCardService', () => {
165188

166189
expect(mockRepository.findOne).toHaveBeenCalledWith({
167190
where: { uuid },
168-
relations: ['conditions', 'decision'],
191+
relations: DEFAULT_RELATIONS,
169192
});
170193
expect(result).toEqual(conditionCard);
171194
});
@@ -199,7 +222,7 @@ describe('ApplicationDecisionConditionCardService', () => {
199222

200223
expect(mockRepository.findOne).toHaveBeenCalledWith({
201224
where: { uuid },
202-
relations: ['conditions', 'decision'],
225+
relations: DEFAULT_RELATIONS,
203226
});
204227
expect(mockBoardService.getApplicationDecisionConditionBoard).toHaveBeenCalled();
205228
expect(mockConditionService.findByUuids).toHaveBeenCalledWith(dto.conditionsUuids);

services/apps/alcs/src/alcs/application-decision/application-decision-condition/application-decision-condition-card/application-decision-condition-card.service.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ export class ApplicationDecisionConditionCardService {
4949
},
5050
};
5151

52-
private DEFAULT_RELATIONS = {
52+
DEFAULT_RELATIONS = {
5353
conditions: true,
54-
card: true,
54+
card: this.CARD_RELATIONS,
5555
decision: {
5656
application: true,
5757
},
@@ -113,7 +113,7 @@ export class ApplicationDecisionConditionCardService {
113113
async get(uuid: string): Promise<ApplicationDecisionConditionCard> {
114114
const applicationDecisionConditionCard = await this.repository.findOne({
115115
where: { uuid },
116-
relations: ['conditions', 'decision'],
116+
relations: this.DEFAULT_RELATIONS,
117117
});
118118

119119
if (!applicationDecisionConditionCard) {

services/apps/alcs/src/alcs/application-decision/application-decision-v2/application-decision/application-decision-v2.service.ts

+4
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ export class ApplicationDecisionV2Service {
219219

220220
decision.documents = decision.documents.filter((document) => !!document.document);
221221

222+
if (decision.conditions) {
223+
decision.conditions.sort((a, b) => a.auditCreatedAt.getTime() - b.auditCreatedAt.getTime());
224+
}
225+
222226
return decision;
223227
}
224228

0 commit comments

Comments
 (0)