Skip to content

Commit a6ac62e

Browse files
authored
Merge pull request #2440 from bcgov/develop
Deployment PR - 1650
2 parents 0f144f2 + 7f38672 commit a6ac62e

File tree

114 files changed

+9102
-965
lines changed

Some content is hidden

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

114 files changed

+9102
-965
lines changed

alcs-frontend/angular.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@
5050
"budgets": [
5151
{
5252
"type": "initial",
53-
"maximumWarning": "500kb",
54-
"maximumError": "2mb"
53+
"maximumWarning": "2mb",
54+
"maximumError": "3mb"
5555
},
5656
{
5757
"type": "anyComponentStyle",

alcs-frontend/src/app/features/application/post-decision/post-decision.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ <h5 id="recons" class="post-decision-header">
107107
#{{ reconsideration.resultingDecision.resolutionNumber }}/{{ reconsideration.resultingDecision.resolutionYear }}
108108
</div>
109109

110-
<div *ngIf="reconsideration.decisionOutcome">
110+
<div *ngIf="reconsideration.reviewOutcome?.code === 'PRC' || reconsideration.type.code === '33.1'">
111111
<div class="subheading2">
112112
Does the reconsideration confirm, reverse, or vary
113113
{{ reconsideration.reconsidersDecisionsNumbers.join(', ') }}?

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ export class BoardComponent implements OnInit, OnDestroy {
247247
private async setupBoard(board: BoardWithFavourite) {
248248
// clear cards to remove flickering
249249
this.cards = [];
250+
this.selectedAssignees = [];
250251
this.titleService.setTitle(`${environment.siteName} | ${board.title} Board`);
251252
this.boardIsFavourite = board.isFavourite;
252253

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<div class="layout">
2+
<div class="file">
3+
<app-compliance-and-enforcement-details-header [file]="file" [propertyOwnerName]="propertyOwnerName" />
4+
<div class="content">
5+
<div class="nav">
6+
<div *ngFor="let route of detailsRoutes" class="nav-link" data-testid="details-nav-link">
7+
<div
8+
[routerLinkActiveOptions]="{ exact: route.path === '' }"
9+
[routerLink]="route.path ? route.path : './'"
10+
class="nav-item nav-text"
11+
routerLinkActive="active"
12+
>
13+
<mat-icon>{{ route.icon }}</mat-icon>
14+
{{ route.menuTitle }}
15+
</div>
16+
</div>
17+
</div>
18+
<div cdkScrollable class="child-content">
19+
<router-outlet></router-outlet>
20+
</div>
21+
</div>
22+
</div>
23+
</div>
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
@use '../../../styles/colors';
2+
3+
.layout {
4+
display: flex;
5+
flex-direction: row;
6+
height: 100%;
7+
width: 100%;
8+
justify-content: center;
9+
}
10+
11+
.file {
12+
width: 100%;
13+
display: flex;
14+
flex-direction: column;
15+
}
16+
17+
.content {
18+
display: flex;
19+
flex-grow: 1;
20+
}
21+
22+
.child-content {
23+
padding: 24px 80px 20px 48px;
24+
flex-grow: 1;
25+
height: calc(100vh - 246px);
26+
overflow-y: auto;
27+
}
28+
29+
.nav {
30+
background-color: colors.$bg-color;
31+
height: 100%;
32+
min-width: fit-content;
33+
}
34+
35+
.nav-link {
36+
div {
37+
padding: 12px 24px;
38+
border: 2px solid transparent;
39+
}
40+
41+
div.active {
42+
font-weight: bold;
43+
background-color: colors.$primary-color-dark;
44+
color: colors.$white;
45+
border-color: colors.$primary-color-dark;
46+
47+
&:hover {
48+
cursor: default;
49+
background-color: colors.$primary-color-dark;
50+
color: colors.$white;
51+
}
52+
}
53+
54+
div:not(.disabled):hover {
55+
cursor: pointer;
56+
border-color: colors.$primary-color-dark;
57+
color: colors.$dark-contrast-text;
58+
}
59+
60+
div.active:not(.disabled):hover {
61+
color: colors.$white;
62+
}
63+
}
64+
65+
.nav-item {
66+
display: flex;
67+
align-items: center;
68+
white-space: pre-wrap;
69+
70+
.mat-icon {
71+
padding-right: 32px;
72+
}
73+
74+
&.disabled {
75+
opacity: 0.5;
76+
}
77+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { ComplianceAndEnforcementComponent } from './compliance-and-enforcement.component';
2+
import { ComplianceAndEnforcementService } from '../../services/compliance-and-enforcement/compliance-and-enforcement.service';
3+
import { ActivatedRoute } from '@angular/router';
4+
import { createMock, DeepMocked } from '@golevelup/ts-jest';
5+
import { ComponentFixture, TestBed } from '@angular/core/testing';
6+
import { HttpClient } from '@angular/common/http';
7+
8+
describe('ComplianceAndEnforcementComponent', () => {
9+
let component: ComplianceAndEnforcementComponent;
10+
let fixture: ComponentFixture<ComplianceAndEnforcementComponent>;
11+
let mockService: DeepMocked<ComplianceAndEnforcementService>;
12+
let mockRoute: DeepMocked<ActivatedRoute>;
13+
let mockHttpClient: DeepMocked<HttpClient>;
14+
15+
beforeEach(async () => {
16+
mockService = createMock<ComplianceAndEnforcementService>();
17+
mockRoute = createMock<ActivatedRoute>();
18+
mockHttpClient = createMock();
19+
20+
await TestBed.configureTestingModule({
21+
imports: [],
22+
declarations: [ComplianceAndEnforcementComponent],
23+
providers: [
24+
{
25+
provide: ComplianceAndEnforcementService,
26+
useValue: mockService,
27+
},
28+
{
29+
provide: ActivatedRoute,
30+
useValue: mockRoute,
31+
},
32+
{
33+
provide: HttpClient,
34+
useValue: mockHttpClient,
35+
},
36+
],
37+
});
38+
39+
fixture = TestBed.createComponent(ComplianceAndEnforcementComponent);
40+
component = fixture.componentInstance;
41+
fixture.detectChanges();
42+
});
43+
44+
it('should create', () => {
45+
expect(component).toBeTruthy();
46+
});
47+
48+
it('should call service.loadFile with correct arguments in loadFile()', async () => {
49+
await component.loadFile('456');
50+
expect(mockService.loadFile).toHaveBeenCalledWith('456', undefined);
51+
});
52+
53+
it('should complete destroy subject on ngOnDestroy', () => {
54+
const destroyNext = jest.spyOn(component.$destroy, 'next');
55+
const destroyComplete = jest.spyOn(component.$destroy, 'complete');
56+
component.ngOnDestroy();
57+
expect(destroyNext).toHaveBeenCalled();
58+
expect(destroyComplete).toHaveBeenCalled();
59+
});
60+
});
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { Component, OnDestroy, OnInit } from '@angular/core';
2+
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
3+
import { Subject, takeUntil } from 'rxjs';
4+
import { detailsRoutes } from './compliance-and-enforcement.module';
5+
import { ComplianceAndEnforcementDto } from '../../services/compliance-and-enforcement/compliance-and-enforcement.dto';
6+
import {
7+
ComplianceAndEnforcementService,
8+
FetchOptions,
9+
} from '../../services/compliance-and-enforcement/compliance-and-enforcement.service';
10+
import { ToastService } from '../../services/toast/toast.service';
11+
import { ResponsiblePartiesService } from '../../services/compliance-and-enforcement/responsible-parties/responsible-parties.service';
12+
import { ResponsiblePartyType } from '../../services/compliance-and-enforcement/responsible-parties/responsible-parties.dto';
13+
14+
@Component({
15+
selector: 'app-compliance-and-enforcement',
16+
templateUrl: './compliance-and-enforcement.component.html',
17+
styleUrls: ['./compliance-and-enforcement.component.scss'],
18+
})
19+
export class ComplianceAndEnforcementComponent implements OnInit, OnDestroy {
20+
$destroy = new Subject<void>();
21+
22+
detailsRoutes = detailsRoutes;
23+
24+
fileNumber?: string;
25+
file?: ComplianceAndEnforcementDto;
26+
propertyOwnerName?: string;
27+
28+
constructor(
29+
private readonly route: ActivatedRoute,
30+
private readonly router: Router,
31+
private readonly service: ComplianceAndEnforcementService,
32+
private readonly responsiblePartyService: ResponsiblePartiesService,
33+
private readonly toastService: ToastService,
34+
) {}
35+
36+
ngOnInit(): void {
37+
this.service.$file.pipe(takeUntil(this.$destroy)).subscribe((file) => {
38+
this.file = file ?? undefined;
39+
});
40+
41+
this.router.events.pipe(takeUntil(this.$destroy)).subscribe((event) => {
42+
if (event instanceof NavigationEnd && this.fileNumber) {
43+
this.loadFile(this.fileNumber, { withSubmitters: true, withProperty: true });
44+
}
45+
});
46+
47+
this.route.params.pipe(takeUntil(this.$destroy)).subscribe(async (params) => {
48+
const { fileNumber } = params;
49+
50+
if (fileNumber) {
51+
this.fileNumber = fileNumber;
52+
this.loadFile(fileNumber, { withSubmitters: true, withProperty: true });
53+
}
54+
});
55+
}
56+
57+
ngOnDestroy(): void {
58+
this.$destroy.next();
59+
this.$destroy.complete();
60+
}
61+
62+
async loadFile(fileNumber: string, options?: FetchOptions) {
63+
try {
64+
await this.service.loadFile(fileNumber, options);
65+
66+
if (this.file) {
67+
const owners = await this.responsiblePartyService.fetchByFileNumber(
68+
fileNumber,
69+
ResponsiblePartyType.PROPERTY_OWNER,
70+
);
71+
72+
this.propertyOwnerName =
73+
(owners?.[0].organizationName || owners?.[0].individualName) + (owners.length > 1 ? ' et al.' : '');
74+
}
75+
} catch (error) {
76+
console.error('Error loading file:', error);
77+
this.toastService.showErrorToast('Failed to load file');
78+
}
79+
}
80+
}
Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,74 @@
11
import { NgModule } from '@angular/core';
2-
import { RouterModule, Routes } from '@angular/router';
2+
import { Route, RouterModule, Routes } from '@angular/router';
33
import { SharedModule } from '../../shared/shared.module';
44
import { OverviewComponent } from './overview/overview.component';
55
import { MatMomentDateModule } from '@angular/material-moment-adapter';
66
import { DraftComponent } from './draft/draft.component';
77
import { SubmitterComponent } from './submitter/submitter.component';
8+
import { PropertyComponent } from './property/property.component';
9+
import { ComplianceAndEnforcementDocumentsComponent } from './documents/documents.component';
10+
import { ResponsiblePartiesComponent } from './responsible-parties/responsible-parties.component';
11+
import { DetailsOverviewComponent } from './details/overview/details-overview.component';
12+
import { ComplianceAndEnforcementComponent } from './compliance-and-enforcement.component';
13+
import { CommonModule } from '@angular/common';
14+
import { DetailsHeaderComponent } from './details/header/details-header.component';
15+
import { ComplaintReferralComponent } from './details/complaint-referral/complaint-referral.component';
16+
import { ComplaintReferralOverviewComponent } from './details/complaint-referral/overview/overview.component';
17+
import { ComplaintReferralSubmittersComponent } from './details/complaint-referral/submitters/submitters.component';
18+
19+
export const detailsRoutes: (Route & { icon?: string; menuTitle?: string })[] = [
20+
{
21+
path: '',
22+
component: DetailsOverviewComponent,
23+
icon: 'summarize',
24+
menuTitle: 'Overview',
25+
},
26+
{
27+
path: 'complaint-referral',
28+
icon: 'edit_note',
29+
menuTitle: 'Complaint / Referral',
30+
children: [
31+
{
32+
path: '',
33+
component: ComplaintReferralComponent,
34+
data: { editing: null },
35+
},
36+
{
37+
path: 'overview/edit',
38+
component: ComplaintReferralComponent,
39+
data: { editing: 'overview' },
40+
},
41+
],
42+
},
43+
];
844

945
const routes: Routes = [
46+
{
47+
path: ':fileNumber',
48+
component: ComplianceAndEnforcementComponent,
49+
children: detailsRoutes,
50+
},
1051
{
1152
path: ':fileNumber/draft',
1253
component: DraftComponent,
1354
},
1455
];
1556

1657
@NgModule({
17-
declarations: [DraftComponent, OverviewComponent, SubmitterComponent],
18-
imports: [SharedModule.forRoot(), RouterModule.forChild(routes), MatMomentDateModule],
58+
declarations: [
59+
DraftComponent,
60+
OverviewComponent,
61+
SubmitterComponent,
62+
PropertyComponent,
63+
ComplianceAndEnforcementDocumentsComponent,
64+
ResponsiblePartiesComponent,
65+
ComplianceAndEnforcementComponent,
66+
DetailsHeaderComponent,
67+
DetailsOverviewComponent,
68+
ComplaintReferralComponent,
69+
ComplaintReferralOverviewComponent,
70+
ComplaintReferralSubmittersComponent,
71+
],
72+
imports: [SharedModule.forRoot(), RouterModule.forChild(routes), MatMomentDateModule, CommonModule, SharedModule],
1973
})
2074
export class ComplianceAndEnforcementModule {}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const C_E_AUTOSAVE_DEBOUNCE_MS = 3000; // ~3 seconds
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<ng-container *ngIf="editing === null">
2+
<section class="file-section">
3+
<app-compliance-and-enforcement-complaint-referral-overview [file]="file" />
4+
5+
<div class="edit-section-button-container">
6+
<a mat-flat-button color="accent" [routerLink]="'overview/edit'" class="edit-section-button">Edit Section</a>
7+
</div>
8+
</section>
9+
10+
<section class="file-section">
11+
<app-compliance-and-enforcement-complaint-referral-submitters [file]="file" />
12+
</section>
13+
14+
<section class="file-section">
15+
<app-compliance-and-enforcement-documents
16+
#submissionDocumentsComponent
17+
[title]="'Complaint/Referral Submission'"
18+
[noDocumentsText]="'No Complaint/Referral'"
19+
[fileNumber]="fileNumber"
20+
[options]="submissionDocumentOptions"
21+
[section]="Section.SUBMISSION"
22+
/>
23+
</section>
24+
</ng-container>
25+
26+
<ng-container *ngIf="editing === 'overview'">
27+
<form [formGroup]="form">
28+
<section class="form-section">
29+
<h3>Complaint / Referral > Edit Overview</h3>
30+
<app-compliance-and-enforcement-overview #overviewComponent [parentForm]="form" [file]="file" />
31+
</section>
32+
33+
<div class="button-container">
34+
<a mat-stroked-button color="warn" [routerLink]="'../..'">Cancel</a>
35+
<button mat-flat-button color="primary" (click)="save()">Save</button>
36+
</div>
37+
</form>
38+
</ng-container>

0 commit comments

Comments
 (0)