Skip to content

Commit 9ba4041

Browse files
authored
Merge pull request #343 from severinbeauvais/PRC-1028
PRC-1028: prevent create/publish/edit/save when app is retired
2 parents 2d41242 + 4ea332f commit 9ba4041

15 files changed

+176
-75
lines changed

src/app/applications/application-add-edit/application-add-edit.component.html

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<div class="container">
33
<div class="title-container">
44
<div class="title-container__title">
5-
<h1><span class="text-muted">Crown land File: {{application['clFile']}} &nbsp;&rsaquo;&nbsp; </span>
5+
<h1><span class="text-muted">Crown land File: {{application.clFile}} &nbsp;&rsaquo;&nbsp; </span>
66
{{!application._id ? 'Create' : 'Edit'}} Application
77
</h1>
88
<span class="title-container__sub text-muted">Disposition Transaction: {{application.tantalisID}}</span>
@@ -11,21 +11,36 @@ <h1><span class="text-muted">Crown land File: {{application['clFile']}} &nbsp;&r
1111
<button class="btn btn-light" type="button" title="Cancel changes" (click)="cancelChanges()">
1212
Cancel
1313
</button>
14-
<button class="btn btn-primary" type="button" title="Submit new application"
15-
*ngIf="!application._id" (click)="addApplication()" [disabled]="isSubmitting">
16-
<i class="spinner rotating" [hidden]="!isSubmitting"></i>
17-
<span>{{isSubmitting ? 'Saving' : 'Save'}}</span>
18-
</button>
19-
<button class="btn btn-primary" type="button" title="Save application"
20-
*ngIf="application._id && application.isPublished === false" (click)="saveApplication()" [disabled]="isSaving">
21-
<i class="spinner rotating" [hidden]="!isSaving"></i>
22-
<span>{{isSaving ? 'Saving' : 'Save'}}</span>
23-
</button>
24-
<button class="publish-btn btn btn-primary" type="button" title="Publish Changes"
25-
*ngIf="application._id && application.isPublished === true" (click)="saveApplication()" [disabled]="isSaving">
26-
<i class="spinner rotating" [hidden]="!isSaving"></i>
27-
<span>{{isSaving ? 'Publishing' : 'Publish Changes'}}</span>
28-
</button>
14+
<div class="btn-container">
15+
<button class="btn btn-primary ml-1" type="button" title="Submit new application"
16+
*ngIf="!application._id"
17+
(click)="addApplication()"
18+
[disabled]="isSubmitting || application.isRetired">
19+
<i class="spinner rotating" [hidden]="!isSubmitting"></i>
20+
<span>{{isSubmitting ? 'Saving' : 'Save'}}</span>
21+
</button>
22+
<span title="You cannot save a retired application"></span>
23+
</div>
24+
<div class="btn-container">
25+
<button class="btn btn-primary ml-1" type="button" title="Save application"
26+
*ngIf="application._id && application.isPublished === false"
27+
(click)="saveApplication()"
28+
[disabled]="isSaving || application.isRetired">
29+
<i class="spinner rotating" [hidden]="!isSaving"></i>
30+
<span>{{isSaving ? 'Saving' : 'Save'}}</span>
31+
</button>
32+
<span title="You cannot save a retired application"></span>
33+
</div>
34+
<div class="btn-container">
35+
<button class="publish-btn btn btn-primary ml-1" type="button" title="Publish changes"
36+
*ngIf="application._id && application.isPublished === true"
37+
(click)="saveApplication()"
38+
[disabled]="isSaving || application.isRetired">
39+
<i class="spinner rotating" [hidden]="!isSaving"></i>
40+
<span>{{isSaving ? 'Publishing' : 'Publish Changes'}}</span>
41+
</button>
42+
<span title="You cannot publish changes to a retired application"></span>
43+
</div>
2944
</div>
3045
</div>
3146
</div>
@@ -83,7 +98,7 @@ <h1><span class="text-muted">Crown land File: {{application['clFile']}} &nbsp;&r
8398
<div class="form-group">
8499
<label>Applicant(s)</label>
85100
<div class="applicant-display">
86-
{{application['applicants'] || 'No Applicant on this File'}}
101+
{{application.applicants || 'No Applicant on this File'}}
87102
</div>
88103
</div>
89104

src/app/applications/application-add-edit/application-add-edit.component.scss

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,16 @@ form {
6767
padding: 0.75rem 1rem;
6868
background: #f7f8fa;
6969
}
70+
71+
.btn-container {
72+
position: relative;
73+
display: inline-block;
74+
75+
button:disabled + span {
76+
position: absolute;
77+
top: 0;
78+
left: 0;
79+
width: 100%;
80+
height: 100%;
81+
}
82+
}

src/app/applications/application-detail/application-detail.component.html

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,38 @@
22
<div class="container">
33
<div class="title-container">
44
<div class="title-container__title">
5-
<h1>Crown land File: {{application['clFile']}}</h1>
5+
<h1>Crown land File: {{application.clFile}}</h1>
66
<span class="title-container__sub text-muted">Disposition Transaction: {{application.tantalisID}}</span>
77
</div>
88
<div class="title-container__actions">
9-
<button class="btn btn-light" type="button" [routerLink]="['/a', application._id, 'edit']">
10-
Edit
11-
</button>
12-
<button class="btn btn-primary" type="button"
13-
*ngIf="!application.isPublished && !isRetired"
14-
(click)="publishApplication()"
15-
[disabled]="isPublishing">
16-
<i class="spinner rotating" [hidden]="!isPublishing"></i>
17-
<span>{{isPublishing ? 'Publishing' : 'Publish'}}</span>
18-
</button>
19-
<button class="btn btn-primary" type="button"
9+
<div class="btn-container">
10+
<button class="btn btn-light" type="button" title="Edit application"
11+
[routerLink]="['/a', application._id, 'edit']"
12+
[disabled]="application.isRetired">
13+
Edit
14+
</button>
15+
<span title="You cannot edit a retired application"></span>
16+
</div>
17+
<div class="btn-container">
18+
<button class="btn btn-primary ml-1" type="button" title="Publish application"
19+
*ngIf="!application.isPublished"
20+
(click)="publishApplication()"
21+
[disabled]="isPublishing || application.isRetired">
22+
<i class="spinner rotating" [hidden]="!isPublishing"></i>
23+
<span>{{isPublishing ? 'Publishing' : 'Publish'}}</span>
24+
</button>
25+
<span title="You cannot publish a retired application"></span>
26+
</div>
27+
<!-- NB: you CAN unpublish a retired application -->
28+
<button class="btn btn-primary ml-1" type="button" title="Unpublish application"
2029
*ngIf="application.isPublished"
2130
(click)="unPublishApplication()"
2231
[disabled]="isUnpublishing">
2332
<i class="spinner rotating" [hidden]="!isUnpublishing"></i>
2433
<span>{{isUnpublishing ? 'Unpublishing' : 'Unpublish'}}</span>
2534
</button>
2635
<span class="vert-pipe">&nbsp;</span>
27-
<button class="btn btn-icon" title="Remove this application from PRC"
36+
<button class="btn btn-icon" title="Remove this application from ACRFD"
2837
(click)="deleteApplication()"
2938
[disabled]="isDeleting">
3039
<i class="material-icons">
@@ -38,19 +47,19 @@ <h1>Crown land File: {{application['clFile']}}</h1>
3847

3948
<div class="bottom-container" *ngIf="application">
4049
<div class="container">
41-
<ngb-alert type="primary" [dismissible]="false" *ngIf="application['retireDate'] && !isRetired">
50+
<ngb-alert type="primary" [dismissible]="false" *ngIf="application.retireDate && !application.isRetired">
4251
<div class="alert-contents">
4352
<i class="material-icons">warning</i>
4453
<div class="alert-msg">
45-
This application will be visible on the public website until {{application['retireDate'] | date:'longDate'}}.
54+
This application will be visible on the public website until {{application.retireDate | date:'longDate'}}.
4655
</div>
4756
</div>
4857
</ngb-alert>
49-
<ngb-alert type="warning" [dismissible]="false" *ngIf="application['retireDate'] && isRetired">
58+
<ngb-alert type="warning" [dismissible]="false" *ngIf="application.retireDate && application.isRetired">
5059
<div class="alert-contents">
5160
<i class="material-icons">warning</i>
5261
<div class="alert-msg">
53-
This application was removed from the public website on {{application['retireDate'] | date:'longDate'}}.
62+
This application was removed from the public website on {{application.retireDate | date:'longDate'}}.
5463
</div>
5564
</div>
5665
</ngb-alert>
@@ -77,7 +86,7 @@ <h2>Details</h2>
7786
<ul class="nv-list">
7887
<li>
7988
<span class="name">Applicant(s):</span>
80-
<span class="value">{{application['applicants'] || 'No Applicant on this File'}}</span>
89+
<span class="value">{{application.applicants || 'No Applicant on this File'}}</span>
8190
</li>
8291
<li>
8392
<span class="name">Purpose/Subpurpose:</span>
@@ -227,7 +236,7 @@ <h3 class="title">Comment Period Details</h3>
227236
</li>
228237
</ul>
229238
<div class="btn-container">
230-
<button class="cta-btn btn btn-sm btn-outline-primary" type="button"
239+
<button class="cta-btn btn btn-sm btn-outline-primary" type="button" title="Review comments"
231240
[routerLink]="['/comments', application._id]">
232241
Review Comments<span *ngIf="application['numComments'] >= 0">&nbsp;({{application['numComments']}})</span>
233242
</button>
@@ -265,11 +274,13 @@ <h3 class="title">Application Decision</h3>
265274
</ul>
266275
</div>
267276
<div class="btn-container">
268-
<button class="cta-btn btn btn-sm btn-outline-primary" type="button"
277+
<button class="cta-btn btn btn-sm btn-outline-primary" type="button" title="Edit decision"
269278
[routerLink]="['/a', application._id, 'edit']"
279+
[disabled]="application.isRetired"
270280
fragment="appDecision">
271281
Edit Decision
272282
</button>
283+
<span title="You cannot edit the decision of a retired application"></span>
273284
</div>
274285
</div>
275286
</div>

src/app/applications/application-detail/application-detail.component.scss

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,26 @@ section {
144144

145145
ngb-alert {
146146
margin-bottom: 1.5rem;
147+
}
148+
149+
.btn-container {
150+
position: relative;
151+
152+
button:disabled + span {
153+
position: absolute;
154+
top: 0;
155+
left: 0;
156+
width: 100%;
157+
height: 100%;
158+
}
159+
}
160+
161+
.title-container__actions .btn-container {
162+
display: inline-block;
163+
}
164+
165+
.btn-container .cta-btn:disabled + span {
166+
width: 12rem;
167+
left: 50%;
168+
margin-left: -6rem;
147169
}

src/app/applications/application-detail/application-detail.component.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { Subject } from 'rxjs/Subject';
66
import 'rxjs/add/operator/takeUntil';
77
import 'rxjs/add/operator/concat';
88
import { of } from 'rxjs';
9-
import * as moment from 'moment';
109

1110
import { ConfirmComponent } from 'app/confirm/confirm.component';
1211
import { Application } from 'app/models/application';
@@ -28,7 +27,6 @@ export class ApplicationDetailComponent implements OnInit, OnDestroy {
2827
public isPublishing = false;
2928
public isUnpublishing = false;
3029
public isDeleting = false;
31-
public isRetired = false;
3230
public application: Application = null;
3331
private snackBarRef: MatSnackBarRef<SimpleSnackBar> = null;
3432
private ngUnsubscribe: Subject<boolean> = new Subject<boolean>();
@@ -54,10 +52,6 @@ export class ApplicationDetailComponent implements OnInit, OnDestroy {
5452
(data: { application: Application }) => {
5553
if (data.application) {
5654
this.application = data.application;
57-
// set flag if retire date is in the past
58-
if (this.application['retireDate']) {
59-
this.isRetired = moment(this.application['retireDate']).isBefore();
60-
}
6155
} else {
6256
alert('Uh-oh, couldn\'t load application');
6357
// application not found --> navigate back to search

src/app/applications/application-list/application-list.component.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ <h2>Crown Lands Applications in British Columbia</h2>
2424
<table class="table application-table">
2525
<thead class="application-table__sort-header">
2626
<tr>
27-
<th class="application-table__name-col sortable" (click)="sort('client')">Applicant(s)
28-
<i class="sort" [ngClass]="{'sort-asc': (column == 'client' && direction < 0), 'sort-desc': (column == 'client' && direction > 0) }" aria-hidden="true"></i>
27+
<th class="application-table__name-col sortable" (click)="sort('applicants')">Applicant(s)
28+
<i class="sort" [ngClass]="{'sort-asc': (column == 'applicants' && direction < 0), 'sort-desc': (column == 'applicants' && direction > 0) }" aria-hidden="true"></i>
2929
</th>
30-
<th class="application-table__cl_file-col sortable" (click)="sort('cl_file')">CL File
31-
<i class="sort" [ngClass]="{'sort-asc': (column == 'cl_file' && direction < 0), 'sort-desc': (column == 'cl_file' && direction > 0) }" aria-hidden="true"></i>
30+
<th class="application-table__cl_file-col sortable" (click)="sort('clFile')">CL File
31+
<i class="sort" [ngClass]="{'sort-asc': (column == 'clFile' && direction < 0), 'sort-desc': (column == 'clFile' && direction > 0) }" aria-hidden="true"></i>
3232
</th>
3333
<th class="application-table__purpose-col sortable" (click)="sort('purpose')">Purpose / Subpurpose
3434
<i class="sort" [ngClass]="{'sort-asc': (column == 'purpose' && direction < 0), 'sort-desc': (column == 'purpose' && direction > 0) }" aria-hidden="true"></i>
@@ -54,9 +54,9 @@ <h2>Crown Lands Applications in British Columbia</h2>
5454
<i class="material-icons open-icon">arrow_drop_down</i>
5555
<i class="material-icons close-icon">arrow_drop_up</i>
5656
</a>
57-
<span class="accordion__collapse-header--column application-table__name-col">{{app['applicants'] || '-'}}</span>
57+
<span class="accordion__collapse-header--column application-table__name-col">{{app.applicants || '-'}}</span>
5858
<span class="accordion__collapse-header--column application-table__cl_file-col">
59-
<a [routerLink]="['/a', app._id]">{{app['clFile'] || '-'}}</a>
59+
<a [routerLink]="['/a', app._id]">{{app.clFile || '-'}}</a>
6060
</span>
6161
<span class="accordion__collapse-header--column application-table__purpose-col">{{app.purpose || '-'}} / {{app.subpurpose || '-'}}</span>
6262
<span class="accordion__collapse-header--column application-table__region-col">{{app.region || '-'}}</span>

src/app/applications/application-resolver.service.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export class ApplicationDetailResolver implements Resolve<Application> {
3939

4040
// 7-digit CL File number for display
4141
if (application.cl_file) {
42-
application['clFile'] = application.cl_file.toString().padStart(7, '0');
42+
application.clFile = application.cl_file.toString().padStart(7, '0');
4343
}
4444

4545
// user-friendly application status
@@ -52,12 +52,14 @@ export class ApplicationDetailResolver implements Resolve<Application> {
5252
// derive unique applicants
5353
if (application.client) {
5454
const clients = application.client.split(', ');
55-
application['applicants'] = _.uniq(clients).join(', ');
55+
application.applicants = _.uniq(clients).join(', ');
5656
}
5757

5858
// derive retire date
5959
if (application.statusHistoryEffectiveDate && [this.applicationService.DECISION_APPROVED, this.applicationService.DECISION_NOT_APPROVED, this.applicationService.ABANDONED].includes(appStatusCode)) {
60-
application['retireDate'] = moment(application.statusHistoryEffectiveDate).endOf('day').add(6, 'months');
60+
application.retireDate = moment(application.statusHistoryEffectiveDate).endOf('day').add(6, 'months').toDate();
61+
// set flag if retire date is in the past
62+
application.isRetired = moment(application.retireDate).isBefore();
6163
}
6264

6365
return of(application);

src/app/applications/review-comments/review-comments.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</div>
99
<div class="title-container">
1010
<div class="title-container__title">
11-
<h1>Review Comments for Crown Land File: {{application['clFile']}}</h1>
11+
<h1>Review Comments for Crown Land File: {{application.clFile}}</h1>
1212
</div>
1313
<div class="title-container__actions">
1414
<button class="btn btn-light" (click)="exportToExcel()" [disabled]="comments.length === 0">

src/app/applications/review-comments/review-comments.component.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,13 @@ export class ReviewCommentsComponent implements OnInit, OnDestroy {
159159
delete document.isDeleted;
160160
});
161161
// add necessary properties
162-
// comment['applicants'] = this.application['applicants']; // FUTURE
163-
comment['cl_file'] = this.application['clFile'];
162+
// comment.applicants = this.application.applicants; // FUTURE
163+
comment['cl_file'] = this.application.clFile;
164164
return this.flatten_fastest(comment);
165165
});
166166

167167
const excelFileName = 'comments-'
168-
+ this.application['applicants'].replace(/\s/g, '_')
168+
+ this.application.applicants.replace(/\s/g, '_')
169169
+ moment(new Date()).format('-YYYYMMDD');
170170
const columnOrder: Array<string> = [
171171
'cl_file',

src/app/models/application.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,16 @@ export class Application {
2626
tenureStage: string;
2727
type: string;
2828
statusHistoryEffectiveDate: Date = null;
29+
tags: Array<string> = [];
2930

3031
region: string; // region code derived from Business Unit
3132
appStatus: string; // user-friendly application status
3233
cpStatus: string; // user-friendly comment period status
3334

35+
clFile: string;
36+
applicants: string;
37+
retireDate: Date = null;
38+
isRetired = false;
3439
isPublished = false; // depends on tags; see below
3540

3641
// associated data
@@ -58,6 +63,9 @@ export class Application {
5863
this.region = obj && obj.region || null;
5964
this.appStatus = obj && obj.appStatus || null;
6065
this.cpStatus = obj && obj.cpStatus || null;
66+
this.clFile = obj && obj.clFile || null;
67+
this.applicants = obj && obj.applicants || null;
68+
this.isRetired = obj && obj.isRetired || null;
6169

6270
if (obj && obj.publishDate) {
6371
this.publishDate = new Date(obj.publishDate);
@@ -67,6 +75,10 @@ export class Application {
6775
this.statusHistoryEffectiveDate = new Date(obj.statusHistoryEffectiveDate);
6876
}
6977

78+
if (obj && obj.retireDate) {
79+
this.retireDate = new Date(obj.retireDate);
80+
}
81+
7082
// replace \\n (JSON format) with newlines
7183
if (obj && obj.description) {
7284
this.description = obj.description.replace(/\\n/g, '\n');
@@ -82,6 +94,13 @@ export class Application {
8294
}
8395
}
8496

97+
// copy tags
98+
if (obj && obj.tags) {
99+
for (const tag of obj.tags) {
100+
this.tags.push(tag);
101+
}
102+
}
103+
85104
if (obj && obj.currentPeriod) {
86105
this.currentPeriod = new CommentPeriod(obj.currentPeriod);
87106
}

0 commit comments

Comments
 (0)