diff --git a/src/atlasComponents/databrowserModule/databrowser.service.ts b/src/atlasComponents/databrowserModule/databrowser.service.ts index 4ae965640e82ecd887e29d662949cb1bda09b71f..1bf1b91d68ed60bce9c21a2a78b4c52aa52d2a7a 100644 --- a/src/atlasComponents/databrowserModule/databrowser.service.ts +++ b/src/atlasComponents/databrowserModule/databrowser.service.ts @@ -3,23 +3,24 @@ import {ComponentRef, Injectable, OnDestroy} from "@angular/core"; import { select, Store } from "@ngrx/store"; import { BehaviorSubject, forkJoin, from, fromEvent, Observable, of, Subscription } from "rxjs"; import { catchError, debounceTime, distinctUntilChanged, filter, map, shareReplay, switchMap, withLatestFrom } from "rxjs/operators"; -import { AtlasViewerConstantsServices } from "src/atlasViewer/atlasViewer.constantService.service"; import { AtlasWorkerService } from "src/atlasViewer/atlasViewer.workerService.service"; // TODO remove dependency on widget unit module import { WidgetUnit } from "src/widget"; import { LoggingService } from "src/logging"; -import { SHOW_KG_TOS } from "src/services/state/uiState.store"; -import { FETCHED_DATAENTRIES, FETCHED_SPATIAL_DATA, IavRootStoreInterface, IDataEntry, safeFilter } from "src/services/stateStore.service"; +import { SHOW_KG_TOS } from "src/services/state/uiState.store.helper"; import { DataBrowser } from "./databrowser/databrowser.component"; import { NO_METHODS } from "./util/filterDataEntriesByMethods.pipe"; import { FilterDataEntriesByRegion } from "./util/filterDataEntriesByRegion.pipe"; -import { datastateActionToggleFav, datastateActionUnfavDataset, datastateActionFavDataset } from "src/services/state/dataState/actions"; +import { datastateActionToggleFav, datastateActionUnfavDataset, datastateActionFavDataset, datastateActionFetchedDataentries } from "src/services/state/dataState/actions"; import { getStringIdsFromRegion, getRegionHemisphere, getIdFromFullId } from 'common/util' import { viewerStateSelectedTemplateSelector, viewerStateSelectorNavigation } from "src/services/state/viewerState/selectors"; +import { BACKENDURL, getFetchOption, getHttpHeader } from "src/util/constants"; +import { IKgDataEntry } from "."; +const SPATIAL_WIDTH = 600 const noMethodDisplayName = 'No methods described' /** @@ -52,7 +53,7 @@ function generateToken() { export class DatabrowserService implements OnDestroy { public kgTos$: Observable<any> - public favedDataentries$: Observable<Partial<IDataEntry>[]> + public favedDataentries$: Observable<Partial<IKgDataEntry>[]> public darktheme: boolean = false public instantiatedWidgetUnits: WidgetUnit[] = [] @@ -64,10 +65,10 @@ export class DatabrowserService implements OnDestroy { }) } public createDatabrowser: (arg: {regions: any[], template: any, parcellation: any}) => {dataBrowser: ComponentRef<DataBrowser>, widgetUnit: ComponentRef<WidgetUnit>} - public getDataByRegion: (arg: {regions: any[] }) => Observable<IDataEntry[]> = ({ regions }) => + public getDataByRegion: (arg: {regions: any[] }) => Observable<IKgDataEntry[]> = ({ regions }) => forkJoin(regions.map(this.getDatasetsByRegion.bind(this))).pipe( map( - (arrOfArr: IDataEntry[][]) => arrOfArr.reduce( + (arrOfArr: IKgDataEntry[][]) => arrOfArr.reduce( (acc, curr) => { /** * In the event of multi region selection @@ -84,25 +85,25 @@ export class DatabrowserService implements OnDestroy { ) private filterDEByRegion: FilterDataEntriesByRegion = new FilterDataEntriesByRegion() - private dataentries: IDataEntry[] = [] + private dataentries: IKgDataEntry[] = [] private subscriptions: Subscription[] = [] public manualFetchDataset$: BehaviorSubject<null> = new BehaviorSubject(null) - public spatialDatasets$: Observable<any> + private spatialDatasets$: Observable<any> public viewportBoundingBox$: Observable<[Point, Point]> private templateSelected: any constructor( private workerService: AtlasWorkerService, - private constantService: AtlasViewerConstantsServices, - private store: Store<IavRootStoreInterface>, + + private store: Store<any>, private http: HttpClient, private log: LoggingService, ) { - this.kgTos$ = this.http.get(`${this.constantService.backendUrl}datasets/tos`, { + this.kgTos$ = this.http.get(`${BACKENDURL}datasets/tos`, { responseType: 'text', }).pipe( catchError((err, _obs) => { @@ -120,9 +121,7 @@ export class DatabrowserService implements OnDestroy { this.subscriptions.push( store.pipe( - select('dataStore'), - safeFilter('fetchedDataEntries'), - map(v => v.fetchedDataEntries), + select('fetchedDataEntries'), ).subscribe(de => { this.dataentries = de }), @@ -145,7 +144,7 @@ export class DatabrowserService implements OnDestroy { // in mm const center = position.map(n => n / 1e6) - const searchWidth = this.constantService.spatialWidth / 4 * zoom / 1e6 + const searchWidth = SPATIAL_WIDTH / 4 * zoom / 1e6 const pt1 = center.map(v => (v - searchWidth)) as [number, number, number] const pt2 = center.map(v => (v + searchWidth)) as [number, number, number] @@ -167,18 +166,11 @@ export class DatabrowserService implements OnDestroy { */ if (!templateSelected || !templateSelected.name) { return from(Promise.reject('templateSelected must not be empty')) } const encodedTemplateName = encodeURIComponent(templateSelected.name) - return this.http.get(`${this.constantService.backendUrl}datasets/spatialSearch/templateName/${encodedTemplateName}/bbox/${_bbox[0].join('_')}__${_bbox[1].join("_")}`).pipe( - catchError((err) => (this.log.log(err), of([]))), - ) - }), - ) - - this.subscriptions.push( - this.spatialDatasets$.subscribe(arr => { - this.store.dispatch({ - type: FETCHED_SPATIAL_DATA, - fetchedDataEntries: arr, - }) + // spatial dataset has halted for the time being + return of(null) + // return this.http.get(`${BACKENDURL}datasets/spatialSearch/templateName/${encodedTemplateName}/bbox/${_bbox[0].join('_')}__${_bbox[1].join("_")}`).pipe( + // catchError((err) => (this.log.log(err), of([]))), + // ) }), ) @@ -203,7 +195,7 @@ export class DatabrowserService implements OnDestroy { this.subscriptions.forEach(s => s.unsubscribe()) } - public toggleFav(dataentry: Partial<IDataEntry>) { + public toggleFav(dataentry: Partial<IKgDataEntry>) { this.store.dispatch( datastateActionToggleFav({ payload: { @@ -213,7 +205,7 @@ export class DatabrowserService implements OnDestroy { ) } - public saveToFav(dataentry: Partial<IDataEntry>) { + public saveToFav(dataentry: Partial<IKgDataEntry>) { this.store.dispatch( datastateActionFavDataset({ payload: { @@ -223,7 +215,7 @@ export class DatabrowserService implements OnDestroy { ) } - public removeFromFav(dataentry: Partial<IDataEntry>) { + public removeFromFav(dataentry: Partial<IKgDataEntry>) { this.store.dispatch( datastateActionUnfavDataset({ payload: { @@ -237,18 +229,19 @@ export class DatabrowserService implements OnDestroy { public fetchPreviewData(datasetName: string) { const encodedDatasetName = encodeURIComponent(datasetName) return new Promise((resolve, reject) => { - fetch(`${this.constantService.backendUrl}datasets/preview/${encodedDatasetName}`, this.constantService.getFetchOption()) + fetch(`${BACKENDURL}datasets/preview/${encodedDatasetName}`, getFetchOption()) .then(res => res.json()) .then(resolve) .catch(reject) }) } - private dispatchData(arr: IDataEntry[]) { - this.store.dispatch({ - type : FETCHED_DATAENTRIES, - fetchedDataEntries : arr, - }) + private dispatchData(arr: IKgDataEntry[]) { + this.store.dispatch( + datastateActionFetchedDataentries({ + fetchedDataEntries: arr + }) + ) } public fetchedFlag: boolean = false @@ -256,7 +249,7 @@ export class DatabrowserService implements OnDestroy { public fetchingFlag: boolean = false private mostRecentFetchToken: any - private memoizedDatasetByRegion = new Map<string, Observable<IDataEntry[]>>() + private memoizedDatasetByRegion = new Map<string, Observable<IKgDataEntry[]>>() private getDatasetsByRegion(region: { fullId: any }){ const hemisphereObj = (() => { @@ -271,14 +264,14 @@ export class DatabrowserService implements OnDestroy { for (const fullId of fullIds) { if (!this.memoizedDatasetByRegion.has(fullId)) { - const obs$ = this.http.get<IDataEntry[]>( - `${this.constantService.backendUrl}datasets/byRegion/${encodeURIComponent(fullId)}`, + const obs$ = this.http.get<IKgDataEntry[]>( + `${BACKENDURL}datasets/byRegion/${encodeURIComponent(fullId)}`, { params: { ...hemisphereObj, ...refSpaceObj }, - headers: this.constantService.getHttpHeader(), + headers: getHttpHeader(), responseType: 'json' } ).pipe( @@ -299,14 +292,14 @@ export class DatabrowserService implements OnDestroy { ) } - private lowLevelQuery(templateName: string, parcellationName: string): Promise<IDataEntry[]> { + private lowLevelQuery(templateName: string, parcellationName: string): Promise<IKgDataEntry[]> { const encodedTemplateName = encodeURIComponent(templateName) const encodedParcellationName = encodeURIComponent(parcellationName) return this.http.get( - `${this.constantService.backendUrl}datasets//templateNameParcellationName/${encodedTemplateName}/${encodedParcellationName}`, + `${BACKENDURL}datasets//templateNameParcellationName/${encodedTemplateName}/${encodedParcellationName}`, { - headers: this.constantService.getHttpHeader(), + headers: getHttpHeader(), responseType: 'json' } ).pipe( @@ -315,7 +308,7 @@ export class DatabrowserService implements OnDestroy { const newMap = new Map(acc) return newMap.set(item.name, item) }, new Map()) - return Array.from(map.values() as IDataEntry[]) + return Array.from(map.values() as IKgDataEntry[]) }) ).toPromise() } @@ -368,7 +361,7 @@ export class DatabrowserService implements OnDestroy { public getModalityFromDE = getModalityFromDE } -export function reduceDataentry(accumulator: Array<{name: string, occurance: number}>, dataentry: IDataEntry) { +export function reduceDataentry(accumulator: Array<{name: string, occurance: number}>, dataentry: IKgDataEntry) { const methods = (dataentry.methods || []) .reduce((acc, item) => acc.concat( item.length > 0 @@ -395,11 +388,11 @@ export function reduceDataentry(accumulator: Array<{name: string, occurance: num })) } -export function getModalityFromDE(dataentries: IDataEntry[]): CountedDataModality[] { +export function getModalityFromDE(dataentries: IKgDataEntry[]): CountedDataModality[] { return dataentries.reduce((acc, de) => reduceDataentry(acc, de), []) } -export function getIdFromDataEntry(dataentry: IDataEntry) { +export function getIdFromDataEntry(dataentry: IKgDataEntry) { const { id, fullId } = dataentry const regex = /\/([a-zA-Z0-9-]*?)$/.exec(fullId) return (regex && regex[1]) || id diff --git a/src/atlasComponents/databrowserModule/kgSingleDatasetService.service.ts b/src/atlasComponents/databrowserModule/kgSingleDatasetService.service.ts index d182542fa3fe6593809aabb14f2b0872036014a7..e25ad5e2c1e706def9c82fed040e6644f1047ce9 100644 --- a/src/atlasComponents/databrowserModule/kgSingleDatasetService.service.ts +++ b/src/atlasComponents/databrowserModule/kgSingleDatasetService.service.ts @@ -3,8 +3,6 @@ import { Injectable, OnDestroy, TemplateRef } from "@angular/core"; import { select, Store } from "@ngrx/store"; import { Observable, Subscription } from "rxjs"; import { filter, shareReplay } from "rxjs/operators"; -import { IDataEntry, ViewerPreviewFile, DATASETS_ACTIONS_TYPES } from "src/services/state/dataStore.store"; -import { IavRootStoreInterface } from "src/services/stateStore.service"; import { BACKENDURL } from "src/util/constants"; import { uiStateShowBottomSheet } from "src/services/state/uiState.store.helper"; import { ngViewerActionRemoveNgLayer } from "src/services/state/ngViewerState/actions"; @@ -16,7 +14,7 @@ export class KgSingleDatasetService implements OnDestroy { public ngLayers: Set<string> = new Set() constructor( - private store$: Store<IavRootStoreInterface>, + private store$: Store<any>, private http: HttpClient, ) { @@ -71,16 +69,6 @@ export class KgSingleDatasetService implements OnDestroy { ) } - public previewFile(file: Partial<ViewerPreviewFile>, dataset: Partial<IDataEntry>) { - this.store$.dispatch({ - type: DATASETS_ACTIONS_TYPES.PREVIEW_DATASET, - payload: { - file, - dataset - } - }) - } - public removeNgLayer({ url }) { this.store$.dispatch( ngViewerActionRemoveNgLayer({ diff --git a/src/atlasViewer/atlasViewer.component.ts b/src/atlasViewer/atlasViewer.component.ts index 0c17df576656ab199a6fb6f820c9a6132eb06d23..d80b8e60f4868cbd2e1e30f820f495cc0b555a66 100644 --- a/src/atlasViewer/atlasViewer.component.ts +++ b/src/atlasViewer/atlasViewer.component.ts @@ -23,7 +23,8 @@ import { AtlasViewerConstantsServices, UNSUPPORTED_INTERVAL, UNSUPPORTED_PREVIEW import { WidgetServices } from "src/widget"; import { LocalFileService } from "src/services/localFile.service"; -import { AGREE_COOKIE, AGREE_KG_TOS, SHOW_KG_TOS } from "src/services/state/uiState.store"; +import { AGREE_COOKIE, AGREE_KG_TOS } from "src/services/state/uiState.store"; +import { SHOW_KG_TOS } from 'src/services/state/uiState.store.helper' import { isSame } from "src/util/fn"; // import { NehubaContainer } from "../ui/nehubaContainer/nehubaContainer.component"; import { colorAnimation } from "./atlasViewer.animation" diff --git a/src/atlasViewer/atlasViewer.constantService.service.ts b/src/atlasViewer/atlasViewer.constantService.service.ts index c0ca5d31ccc0075d008fa626b0e884941ee60230..b9484fd0f400b2d18208595d2ca25db0be74bcd3 100644 --- a/src/atlasViewer/atlasViewer.constantService.service.ts +++ b/src/atlasViewer/atlasViewer.constantService.service.ts @@ -71,7 +71,6 @@ export class AtlasViewerConstantsServices implements OnDestroy { public mapParcellationNameToFetchUrl: Map<string, string[]> = new Map(this._mapArray) public spatialSearchUrl = 'https://kg-int.humanbrainproject.org/solr/' public spatialResultsPerPage = 10 - public spatialWidth = 600 public chartBaseStyle = { fill : 'origin', diff --git a/src/services/state/dataState/actions.ts b/src/services/state/dataState/actions.ts index 22560c293cd4134629a85406686158c8873e63ac..495a623165201b0012b61a9c4397226a9502e83e 100644 --- a/src/services/state/dataState/actions.ts +++ b/src/services/state/dataState/actions.ts @@ -1,4 +1,5 @@ import { createAction, props } from "@ngrx/store"; +import { IKgDataEntry } from "src/atlasComponents/databrowserModule"; export const datastateActionToggleFav = createAction( `[datastate] toggleFav`, @@ -19,3 +20,8 @@ export const datastateActionFavDataset = createAction( `[datastate] fav`, props<{ payload: { fullId: string } }>() ) + +export const datastateActionFetchedDataentries = createAction( + `[datastate] fetchedDatastate`, + props<{ fetchedDataEntries: IKgDataEntry[] }>() +) \ No newline at end of file diff --git a/src/services/state/dataStore.store.ts b/src/services/state/dataStore.store.ts index 42e389fcf2d4f1d6e462e583337c09e958005de1..962168dd111b4219e69c6f595f5ccf596df2fc95 100644 --- a/src/services/state/dataStore.store.ts +++ b/src/services/state/dataStore.store.ts @@ -3,10 +3,10 @@ */ import { Action } from '@ngrx/store' -import { GENERAL_ACTION_TYPES } from '../stateStore.service' import { LOCAL_STORAGE_CONST } from 'src/util/constants' -import { datastateActionUpdateFavDataset } from './dataState/actions' +import { datastateActionFetchedDataentries, datastateActionUpdateFavDataset } from './dataState/actions' import { IHasId } from 'src/util/interfaces' +import { generalApplyState } from '../stateStore.helper' /** * TODO merge with databrowser.usereffect.ts @@ -44,6 +44,7 @@ export const defaultState = { export const getStateStore = ({ state: state = defaultState } = {}) => (prevState: IStateInterface = state, action: Partial<IActionInterface>) => { switch (action.type) { + case datastateActionFetchedDataentries.type: case FETCHED_DATAENTRIES: { return { ...prevState, @@ -63,7 +64,7 @@ export const getStateStore = ({ state: state = defaultState } = {}) => (prevStat favDataEntries, } } - case GENERAL_ACTION_TYPES.APPLY_STATE: { + case generalApplyState.type: { const { dataStore } = (action as any).state return dataStore } diff --git a/src/services/state/uiState.store.helper.ts b/src/services/state/uiState.store.helper.ts index 24d247b73b62db609cae7110f6a44a57a0b02049..0abc17ccea5b66746c37e68ae7912e125c7c3975 100644 --- a/src/services/state/uiState.store.helper.ts +++ b/src/services/state/uiState.store.helper.ts @@ -36,3 +36,5 @@ export type TypeOpenedWidget = { type: EnumWidgetTypes data: IDatasetPreviewData } + +export const SHOW_KG_TOS = `SHOW_KG_TOS` \ No newline at end of file diff --git a/src/services/state/uiState.store.ts b/src/services/state/uiState.store.ts index b657e976144637106eba52a874f01c353fe4ffb3..3fad571ab9dcc33203ff4fee3fdcffb18cd22d48 100644 --- a/src/services/state/uiState.store.ts +++ b/src/services/state/uiState.store.ts @@ -267,7 +267,6 @@ export const EXPAND_SIDE_PANEL_CURRENT_VIEW = `EXPAND_SIDE_PANEL_CURRENT_VIEW` export const AGREE_COOKIE = `AGREE_COOKIE` export const AGREE_KG_TOS = `AGREE_KG_TOS` -export const SHOW_KG_TOS = `SHOW_KG_TOS` export const SNACKBAR_MESSAGE = uiActionSnackbarMessage.type export const SHOW_BOTTOM_SHEET = `SHOW_BOTTOM_SHEET`