Skip to content

Commit e1f51bc

Browse files
MillenniumFalconMechanicFran McDade
andauthored
Allow filtering on donors by an age range. First pass. #310 (#1168)
Co-authored-by: Fran McDade <franmcdade@Frans-MBP.hub>
1 parent 71f8d13 commit e1f51bc

File tree

144 files changed

+3038
-1991
lines changed

Some content is hidden

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

144 files changed

+3038
-1991
lines changed

spa/src/app/_ngrx/app.effects.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
*/
77

88
// App dependencies
9-
import { AuthEffects } from "../auth/_ngrx/auth.effects";
109
import { ConfigEffects } from "../config/_ngrx/config.effects";
1110
import { FileEffects } from "../files/_ngrx/file.effects";
1211
import { FileManifestEffects } from "../files/_ngrx/file-manifest/file-manifest.effects";
@@ -20,7 +19,6 @@ import { TableEffects } from "../files/_ngrx/table/table.effects";
2019
import { TerraEffects } from "../files/_ngrx/terra/terra.effects";
2120

2221
export const AppEffects = [
23-
AuthEffects,
2422
ConfigEffects,
2523
FileEffects,
2624
FileManifestEffects,

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
/**
2-
* UCSC Genomics Institute - CGL
3-
* https://cgl.genomics.ucsc.edu/
2+
* Human Cell Atlas
3+
* https://www.humancellatlas.org/
44
*
5-
* Set of reducers used by Boardwalk.
5+
* Complete set of reducers used by app.
66
*/
77

88
// App dependencies
9-
import * as authReducer from "../auth/_ngrx/auth.reducer";
109
import * as configReducer from "../config/_ngrx/config.reducer";
1110
import * as fileReducer from "../files/_ngrx/file.reducer";
1211
import * as httpReducer from "../http/_ngrx/http.reducer";
@@ -15,7 +14,6 @@ import * as terraReducer from "../files/_ngrx/terra/terra.reducer";
1514

1615
export const AppReducers = {
1716
...fileReducer.reducer,
18-
auth: authReducer.reducer,
1917
config: configReducer.reducer,
2018
http: httpReducer.reducer,
2119
...systemReducer.reducer,

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
/**
2-
* UCSC Genomics Institute - CGL
3-
* https://cgl.genomics.ucsc.edu/
2+
* Human Cell Atlas
3+
* https://www.humancellatlas.org/
44
*
55
* Complete application state.
66
*/
77

88
// App dependencies
9-
import { AuthState } from "../auth/_ngrx/auth.state";
109
import { ConfigState } from "../config/_ngrx/config.state";
1110
import { FileState } from "../files/_ngrx/file.state";
1211
import { HttpState } from "../http/_ngrx/http.state";
1312
import { SystemState } from "../system/_ngrx/system.state";
1413
import { TerraState } from "../files/_ngrx/terra/terra.state";
1514
import { ModalState } from "../modal/_ngrx/modal.state";
1615

17-
export interface AppState extends AuthState, ConfigState, FileState, HttpState, ModalState, SystemState, TerraState {}
16+
export interface AppState extends ConfigState, FileState, HttpState, ModalState, SystemState, TerraState {}

spa/src/app/app.component.spec.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@ import { ReplaySubject } from "rxjs";
1717
// App dependencies
1818
import { AppComponent } from "./app.component";
1919
import { ConfigService } from "./config/config.service";
20-
import { SetViewStateAction } from "./files/_ngrx/file-facet-list/set-view-state.action";
20+
import { SetViewStateAction } from "./files/_ngrx/facet/set-view-state.action";
2121
import { ReleaseBannerComponent } from "./files/releases/release-banner/release-banner.component";
22-
import { FileFacetName } from "./files/shared/file-facet-name.model";
22+
import { FileFacetName } from "./files/facet/file-facet/file-facet-name.model";
2323
import { GenusSpecies } from "./files/shared/genus-species.model";
2424
import { LibraryConstructionApproach } from "./files/shared/library-construction-approach.model";
25-
import { QueryStringFacet } from "./files/shared/query-string-facet.model";
2625
import { EntityName } from "./files/shared/entity-name.model";
2726
import { DeviceDetectorService } from "ngx-device-detector";
2827
import { AnnouncementComponent } from "./shared/announcement/announcement.component";
@@ -39,18 +38,22 @@ import { CCToolbarNavSubMenuComponent } from "./shared/cc-toolbar-nav-sub-menu/c
3938
import { CCToolbarNavSubMenuItemComponent } from "./shared/cc-toolbar-nav-sub-menu-item/cc-toolbar-nav-sub-menu-item.component";
4039
import { CCToolbarNavDropDownComponent } from "./shared/cc-toolbar-nav-drop-down/cc-toolbar-nav-drop-down.component";
4140
import { ReleaseService } from "./files/shared/release.service";
41+
import { QueryStringSearchTerm } from "./files/search/url/query-string-search-term.model";
42+
import { SearchTermUrlService } from "./files/search/url/search-term-url.service";
4243

4344

4445
describe("AppComponent:", () => {
4546

4647
const PROJECTS_PATH = "/projects";
47-
const PROJECTS_PATH_WITH_FILTERS = "/projects?filter=%5B%7B%22facetName%22:%22libraryConstructionApproach%22,%22terms%22:%5B%22Smart-seq2%22%5D%7D%5D";
48+
const PROJECTS_PATH_WITH_FILTERS = "/projects?filter=%5B%7B%22facetName%22:%22libraryConstructionApproach%22,%value%22:%5B%22Smart-seq2%22%5D%7D%5D";
4849

4950
let component: AppComponent;
5051
let fixture: ComponentFixture<AppComponent>;
5152

5253
const locationSpy = jasmine.createSpyObj("Location", ["path"]);
5354
const storeSpy = jasmine.createSpyObj("Store", ["pipe", "dispatch"]);
55+
56+
const searchTermUrlService = new SearchTermUrlService();
5457

5558
const navigation$ = new ReplaySubject<RouterEvent>(1);
5659
const routerMock = {
@@ -105,6 +108,9 @@ describe("AppComponent:", () => {
105108
}, {
106109
provide: ReleaseService,
107110
useValue: jasmine.createSpyObj("ReleaseService", ["buildReleaseView", "createReleaseDatasetView", "fetch2020MarchRelease", "isReleaseVisible"])
111+
}, {
112+
provide: SearchTermUrlService,
113+
useValue: searchTermUrlService
108114
}]
109115
});
110116

@@ -135,7 +141,7 @@ describe("AppComponent:", () => {
135141
component["setAppStateFromURL"]();
136142

137143
const filters = [
138-
new QueryStringFacet(FileFacetName.GENUS_SPECIES, [GenusSpecies.HOMO_SAPIENS])
144+
new QueryStringSearchTerm(FileFacetName.GENUS_SPECIES, [GenusSpecies.HOMO_SAPIENS])
139145
];
140146
const setViewAction = new SetViewStateAction(EntityName.PROJECTS, filters);
141147
expect(storeSpy.dispatch).toHaveBeenCalledWith(setViewAction);
@@ -149,7 +155,7 @@ describe("AppComponent:", () => {
149155
const activatedRoute = fixture.debugElement.injector.get(ActivatedRoute);
150156
spyOnProperty(activatedRoute, "snapshot").and.returnValue({
151157
queryParams: {
152-
filter: `[{"facetName": "libraryConstructionApproach", "terms": ["Smart-seq2"]}]`
158+
filter: `[{"facetName": "libraryConstructionApproach", "value": ["Smart-seq2"]}]`
153159
}
154160
});
155161
locationSpy.path.and.returnValue(PROJECTS_PATH_WITH_FILTERS);
@@ -158,7 +164,7 @@ describe("AppComponent:", () => {
158164
component["setAppStateFromURL"]();
159165

160166
const filters = [
161-
new QueryStringFacet(FileFacetName.LIBRARY_CONSTRUCTION_APPROACH, [LibraryConstructionApproach.SMART_SEQ2])
167+
new QueryStringSearchTerm(FileFacetName.LIBRARY_CONSTRUCTION_APPROACH, [LibraryConstructionApproach.SMART_SEQ2])
162168
];
163169
const setViewAction = new SetViewStateAction(EntityName.PROJECTS, filters);
164170
expect(storeSpy.dispatch).toHaveBeenCalledWith(setViewAction);

spa/src/app/app.component.ts

Lines changed: 6 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,12 @@ import { filter, map, takeUntil } from "rxjs/operators";
1616
// App dependencies
1717
import { Config } from "./config/config.model";
1818
import { selectConfigConfig } from "./config/_ngrx/config.selectors";
19-
import { SetViewStateAction } from "./files/_ngrx/file-facet-list/set-view-state.action";
19+
import { SearchTermUrlService } from "./files/search/url/search-term-url.service";
20+
import { SetViewStateAction } from "./files/_ngrx/facet/set-view-state.action";
2021
import { ClearReleaseReferrerAction } from "./files/_ngrx/release/clear-release-referrer.action";
2122
import { FetchProjectEditsRequestAction } from "./files/_ngrx/project-edits/fetch-project-edits-request.action";
2223
import { ReleaseService } from "./files/shared/release.service";
2324
import { EntityName } from "./files/shared/entity-name.model";
24-
import { FileFacetName } from "./files/shared/file-facet-name.model";
25-
import { QueryStringFacet } from "./files/shared/query-string-facet.model";
26-
import { GenusSpecies } from "./files/shared/genus-species.model";
2725
import { FetchReleasesRequestAction } from "./files/_ngrx/release/fetch-releases-request.action";
2826
import { AppState } from "./_ngrx/app.state";
2927
import { DeviceDetectorService } from "ngx-device-detector";
@@ -51,6 +49,7 @@ export class AppComponent implements OnInit, OnDestroy {
5149
/**
5250
* @param {DeviceDetectorService} deviceService
5351
* @param {ReleaseService} releaseService
52+
* @param {SearchTermUrlService} searchUrlService
5453
* @param {Store<AppState>} store
5554
* @param {ActivatedRoute} activatedRoute
5655
* @param {Location} location
@@ -59,6 +58,7 @@ export class AppComponent implements OnInit, OnDestroy {
5958
*/
6059
constructor(private deviceService: DeviceDetectorService,
6160
private releaseService: ReleaseService,
61+
private searchUrlService: SearchTermUrlService,
6262
private store: Store<AppState>,
6363
private activatedRoute: ActivatedRoute,
6464
private location: Location,
@@ -123,17 +123,6 @@ export class AppComponent implements OnInit, OnDestroy {
123123
return !( this.router.url.includes("/releases/") || this.router.url.includes("/projects/") );
124124
}
125125

126-
/**
127-
* Returns true if a filter state is encoded in the query params.
128-
*
129-
* @param {Params} params
130-
* @returns {boolean}
131-
*/
132-
private isFilterParamSpecified(params: Params): boolean {
133-
134-
return !!params["filter"];
135-
}
136-
137126
/**
138127
* Load project edits data from local JSON files.
139128
*/
@@ -185,39 +174,6 @@ export class AppComponent implements OnInit, OnDestroy {
185174
return EntityName.PROJECTS;
186175
}
187176

188-
/**
189-
* Parse the "filter" query string param, if specified.
190-
*
191-
* @param {Params} params
192-
* @returns {QueryStringFacet[]}
193-
*/
194-
private parseQueryStringFacets(params: Params): QueryStringFacet[] {
195-
196-
if ( this.isFilterParamSpecified(params) ) {
197-
198-
// We have a filter, let's extract it.
199-
let filter;
200-
const filterParam = params["filter"];
201-
try {
202-
filter = JSON.parse(filterParam);
203-
}
204-
catch (error) {
205-
console.log(error);
206-
}
207-
208-
let queryStringFacets = [];
209-
if ( filter && filter.length && filter[0].facetName ) {
210-
queryStringFacets = filter.map((selectedFacet) => {
211-
return new QueryStringFacet(selectedFacet["facetName"], selectedFacet["terms"]);
212-
});
213-
}
214-
215-
return queryStringFacets;
216-
}
217-
218-
return [];
219-
}
220-
221177
/**
222178
* Fetch current status of system, and current status of index, and display information banners, if necessary.
223179
*/
@@ -257,14 +213,12 @@ export class AppComponent implements OnInit, OnDestroy {
257213
const params = this.activatedRoute.snapshot.queryParams;
258214
const tab = this.parseTab();
259215

260-
const filter = this.parseQueryStringFacets(params);
216+
const filter = this.searchUrlService.parseQueryStringSearchTerms(params);
261217

262218
// Default app state to have human selected. This is only necessary if there is currently no filter
263219
// applied.
264220
if ( filter.length === 0 ) {
265-
const queryStringFacet =
266-
new QueryStringFacet(FileFacetName.GENUS_SPECIES, [GenusSpecies.HOMO_SAPIENS]);
267-
filter.push(queryStringFacet);
221+
filter.push(this.searchUrlService.getDefaultSearchState());
268222
}
269223

270224
this.store.dispatch(new SetViewStateAction(tab, filter));
@@ -276,10 +230,6 @@ export class AppComponent implements OnInit, OnDestroy {
276230
});
277231
}
278232

279-
/**
280-
* Life cycle hooks
281-
*/
282-
283233
/**
284234
* Kill subscriptions on destroy of component.
285235
*/

spa/src/app/app.module.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import { AppComponent } from "./app.component";
2525
import { AppRoutes } from "./app.routes";
2626
import { ConfigModule } from "./config/config.module";
2727
import { ConfigService } from "./config/config.service";
28-
import { UserService } from "./data/user/user.service";
2928
import { FilesModule } from "./files/files.module";
3029
import { ReleaseBannerComponent } from "./files/releases/release-banner/release-banner.component";
3130
import { AppReducers } from "./_ngrx/app.reducer";
@@ -89,7 +88,6 @@ import { SystemService } from "./system/shared/system.service";
8988
providers: [
9089
LocalStorageService,
9190
SystemService,
92-
UserService,
9391
// Bootstrap config from API end point, must return function from useFactory method, when function is invoked,
9492
// must return promise to ensure Angular "pauses" until config is resolved from API end point.
9593
{

spa/src/app/auth/_ngrx/auth.actions.ts

Lines changed: 0 additions & 46 deletions
This file was deleted.

spa/src/app/auth/_ngrx/auth.effects.ts

Lines changed: 0 additions & 33 deletions
This file was deleted.

spa/src/app/auth/_ngrx/auth.reducer.ts

Lines changed: 0 additions & 39 deletions
This file was deleted.

0 commit comments

Comments
 (0)