Skip to content

Commit c885337

Browse files
MillenniumFalconMechanicNoopDog
authored andcommitted
Added release referrer.
1 parent 0f9af17 commit c885337

File tree

11 files changed

+141
-19
lines changed

11 files changed

+141
-19
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* Human Cell Atlas
3+
* https://www.humancellatlas.org/
4+
*
5+
* Action triggered when release referrer indicator should be cleared.
6+
*/
7+
8+
// Core dependencies
9+
import { Action } from "@ngrx/store";
10+
11+
export class ClearReleaseReferrerAction implements Action {
12+
public static ACTION_TYPE = "RELEASES.CLEAR_RELEASE_REFERRER";
13+
public readonly type = ClearReleaseReferrerAction.ACTION_TYPE;
14+
constructor() {}
15+
}
16+

spa/src/app/files/_ngrx/release/release.reducer.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,27 @@
99
import { Action } from "@ngrx/store";
1010

1111
// App dependencies
12-
import { ReleaseState } from "./release.state";
12+
import { ClearReleaseReferrerAction } from "./clear-release-referrer.action";
1313
import { FetchReleasesRequestAction } from "./fetch-releases-request.action";
1414
import { FetchReleasesSuccessAction } from "./fetch-releases-success.action";
15+
import { ReleaseState } from "./release.state";
16+
import { SetReleaseReferrerAction } from "./set-release-referrer.action";
1517

1618
export function reducer(state: ReleaseState = ReleaseState.getDefaultState(), action: Action): ReleaseState {
1719

1820
switch (action.type) {
1921

22+
case ClearReleaseReferrerAction.ACTION_TYPE:
23+
return state.clearReleaseReferrer();
24+
2025
case FetchReleasesRequestAction.ACTION_TYPE:
2126
return state.fetchReleasesByNameRequest();
2227

2328
case FetchReleasesSuccessAction.ACTION_TYPE:
2429
return state.fetchReleasesSuccess(action as FetchReleasesSuccessAction);
30+
31+
case SetReleaseReferrerAction.ACTION_TYPE:
32+
return state.setReleaseReferrer();
2533

2634
default:
2735
return state;

spa/src/app/files/_ngrx/release/release.selectors.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,9 @@ export const selectReleasesByName =
2727
*/
2828
export const selectReleaseByName =
2929
createSelector(selectReleases, (state, props) => state.releasesByName.get(props.name));
30+
31+
/**
32+
* Return the release referrer.
33+
*/
34+
export const selectReleaseReferrer =
35+
createSelector(selectReleases, (state) => state.releaseReferrer);

spa/src/app/files/_ngrx/release/release.state.ts

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ import { FetchReleasesSuccessAction } from "./fetch-releases-success.action";
1111
import { Releases } from "./releases.model";
1212

1313
const DEFAULT_RELEASE_STATE = {
14-
releasesByName: new Map()
14+
releasesByName: new Map(),
15+
releaseReferrer: false
1516
};
1617

1718
export class ReleaseState implements Releases {
1819

1920
releasesByName: Map<string, Release>;
21+
releaseReferrer: boolean;
2022

2123
/**
2224
* @param {Releases} state
@@ -25,6 +27,18 @@ export class ReleaseState implements Releases {
2527
Object.assign(this, state);
2628
}
2729

30+
31+
/**
32+
* Set release referrer to false.
33+
*/
34+
public clearReleaseReferrer(): ReleaseState {
35+
36+
return new ReleaseState({
37+
releasesByName: this.releasesByName,
38+
releaseReferrer: false
39+
});
40+
}
41+
2842
/**
2943
* @returns {ReleaseState}
3044
*/
@@ -42,8 +56,22 @@ export class ReleaseState implements Releases {
4256
accum.set(release.name, release);
4357
return accum;
4458
}, new Map());
45-
46-
return new ReleaseState({releasesByName});
59+
60+
return new ReleaseState({
61+
releasesByName,
62+
releaseReferrer: this.releaseReferrer
63+
});
64+
}
65+
66+
/**
67+
* Set release referrer to true.
68+
*/
69+
public setReleaseReferrer(): ReleaseState {
70+
71+
return new ReleaseState({
72+
releasesByName: this.releasesByName,
73+
releaseReferrer: true
74+
});
4775
}
4876

4977
/**

spa/src/app/files/_ngrx/release/releases.model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ import { Release } from "../../releases/2020-march/release.model";
1010

1111
export interface Releases {
1212
releasesByName: Map<string, Release>;
13+
releaseReferrer: boolean;
1314
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* Human Cell Atlas
3+
* https://www.humancellatlas.org/
4+
*
5+
* Action triggered when project-specific pages should return to the release page, and not the natural app page.
6+
* Specifically:
7+
*
8+
* 1. Project detail back button returns to release page and not to projects tab
9+
* 2. Release files modal close button returns to release page and not to project detail release tab
10+
*/
11+
12+
// Core dependencies
13+
import { Action } from "@ngrx/store";
14+
15+
export class SetReleaseReferrerAction implements Action {
16+
public static ACTION_TYPE = "RELEASES.SET_RELEASE_REFERRER";
17+
public readonly type = SetReleaseReferrerAction.ACTION_TYPE;
18+
constructor() {}
19+
}
20+

spa/src/app/files/project-detail/project-detail.component.ts

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,20 @@ import { ActivatedRoute, Router } from "@angular/router";
1212
import { select, Store } from "@ngrx/store";
1313
import { AppState } from "../../_ngrx/app.state";
1414
import { combineLatest, Observable } from "rxjs/index";
15-
import { filter, map } from "rxjs/operators";
15+
import { filter, map, take } from "rxjs/operators";
1616

1717
// App dependencies
18-
import { SearchTerm } from "../search/search-term.model";
19-
import { EntityName } from "../shared/entity-name.model";
20-
import EntitySpec from "../shared/entity-spec";
2118
import { selectSelectedProject } from "../_ngrx/file.selectors";
19+
import { ClearReleaseReferrerAction } from "../_ngrx/release/clear-release-referrer.action";
20+
import { selectReleaseReferrer } from "../_ngrx/release/release.selectors";
2221
import { selectSelectedProjectSearchTerms } from "../_ngrx/search/search.selectors";
2322
import { SelectProjectIdAction } from "../_ngrx/search/select-project-id.action";
2423
import { ClearSelectedProjectAction } from "../_ngrx/table/clear-selected-project.action";
2524
import { FetchProjectRequestAction } from "../_ngrx/table/table.actions";
2625
import { ProjectDetailState } from "./project-detail.state";
26+
import { SearchTerm } from "../search/search-term.model";
27+
import { EntityName } from "../shared/entity-name.model";
28+
import EntitySpec from "../shared/entity-spec";
2729

2830
@Component({
2931
selector: "project-detail",
@@ -33,7 +35,8 @@ import { ProjectDetailState } from "./project-detail.state";
3335
export class ProjectDetailComponent {
3436

3537
// Template variables
36-
public state$: Observable<ProjectDetailState>;
38+
private backUrl: string;
39+
private state$: Observable<ProjectDetailState>;
3740

3841
/**
3942
*
@@ -52,10 +55,10 @@ export class ProjectDetailComponent {
5255
*/
5356
public getLegendClass(selected: boolean): { [className: string]: boolean } {
5457

55-
return {
56-
"box": true,
57-
"selected": selected
58-
};
58+
return {
59+
"box": true,
60+
"selected": selected
61+
};
5962
}
6063

6164
/**
@@ -65,7 +68,7 @@ export class ProjectDetailComponent {
6568
*/
6669
public getProjectDetailTabs(): EntitySpec[] {
6770

68-
return [{key: EntityName.PROJECTS, displayName: "Back"}];
71+
return [{key: this.backUrl, displayName: "Back"}];
6972
}
7073

7174
/**
@@ -107,18 +110,38 @@ export class ProjectDetailComponent {
107110
}
108111

109112
/**
110-
* Clear out the selected project when the user navigates away from project detail page.
113+
* Determine the back URL; either the release page if the user has come from there, otherwise the projects tab.
114+
*/
115+
private setBackUrl() {
116+
117+
this.store
118+
.pipe(
119+
select(selectReleaseReferrer),
120+
take(1)
121+
)
122+
.subscribe((releaseReferrer) => {
123+
this.backUrl = releaseReferrer ? "releases/2020-mar" : EntityName.PROJECTS
124+
});
125+
}
126+
127+
/**
128+
* Clear out the selected project when the user navigates away from project detail page. Also clear the flag
129+
* indicating this project detail component should return the release page (if necessary).
111130
*/
112131
public ngOnDestroy() {
113132

114133
this.store.dispatch(new ClearSelectedProjectAction());
134+
this.store.dispatch(new ClearReleaseReferrerAction());
115135
}
116136

117137
/**
118138
* Update state with selected project.
119139
*/
120140
public ngOnInit() {
121141

142+
// Determine where the back button should navigate to
143+
this.setBackUrl();
144+
122145
// Add selected project to state - grab the project ID from the URL.
123146
const projectId = this.activatedRoute.snapshot.paramMap.get("id");
124147
this.store.dispatch(new FetchProjectRequestAction(projectId));
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<announcement class="release-banner">
22
<span class="fontsize-s">
33
<span>March 2020 Release lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur enim tellus, molestie in molestie ac. </span>
4-
<a href="/releases/2020-mar">View the March 2020 Release ></a>
4+
<a routerLink="/releases/2020-mar">View the March 2020 Release ></a>
55
</span>
66
</announcement>

spa/src/app/files/releases/release-table/release-table.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ <h2 class="fontsize-xl">{{organView.organ}}</h2>
77
<span>Project Title</span>
88
</mat-header-cell>
99
<mat-cell *matCellDef="let element" class="project-title fontsize-s">
10-
<a href="projects/{{element.entryId}}/releases/2020-mar">{{element.datasetId}}</a>
10+
<a routerLink="/projects/{{element.entryId}}/releases/2020-mar" (click)="setReleaseReferrer()">{{element.datasetId}}</a>
1111
</mat-cell>
1212
</ng-container>
1313
<ng-container matColumnDef="developmentalStage">

spa/src/app/files/releases/release-table/release-table.component.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import { Component, Input } from "@angular/core";
1010

1111
// App dependencies
12+
import { Store } from "@ngrx/store";
13+
import { AppState } from "../../../_ngrx/app.state";
14+
import { SetReleaseReferrerAction } from "../../_ngrx/release/set-release-referrer.action";
1215
import { ReleaseOrganView } from "../release-organ-view.model";
1316

1417
@Component({
@@ -22,7 +25,12 @@ export class ReleaseTableComponent {
2225
@Input() releaseOrganViews: ReleaseOrganView[];
2326

2427
// Locals
25-
public columnsToDisplay = ["projectTitle", "developmentalStage", "technology", "releaseFiles", "annotatedExpressionMatrix", "visualize"];
28+
private columnsToDisplay = ["projectTitle", "developmentalStage", "technology", "releaseFiles", "annotatedExpressionMatrix", "visualize"];
29+
30+
/**
31+
* @param {Store<AppState>} store
32+
*/
33+
constructor(private store: Store<AppState>) {}
2634

2735
/**
2836
* Returns the technology, based off libraryConstructionApproach. Any libraryConstructionApproach ending with
@@ -47,4 +55,16 @@ export class ReleaseTableComponent {
4755

4856
return techShortName;
4957
}
58+
59+
/**
60+
* Update state to indicate that any project-specific release components need to return to this release page (for
61+
* example:
62+
*
63+
* 1. project detail back button returns here (and not to projects tab)
64+
* 2. release files modal close button returns here (and not to project detail release tab)
65+
*/
66+
public setReleaseReferrer() {
67+
68+
this.store.dispatch(new SetReleaseReferrerAction());
69+
}
5070
}

0 commit comments

Comments
 (0)