Skip to content

Commit c7b9d2c

Browse files
committed
Fix application decision condition board card bugs
- Show all conditions only when editing - Disable select for conditions used by other cards - Show error color for table and checkboxes when no condition is selected - Add 'No data' to conditions without end/due date values
1 parent 3fb3783 commit c7b9d2c

File tree

5 files changed

+90
-21
lines changed

5 files changed

+90
-21
lines changed

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

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

52-
private DEFAULT_RELATIONS = {
52+
DEFAULT_RELATIONS = {
5353
conditions: true,
5454
card: this.CARD_RELATIONS,
5555
decision: {

0 commit comments

Comments
 (0)