diff --git a/src/pages/studyView/StudyViewPage.tsx b/src/pages/studyView/StudyViewPage.tsx index f485d25d8e3..3fae2de9aa1 100644 --- a/src/pages/studyView/StudyViewPage.tsx +++ b/src/pages/studyView/StudyViewPage.tsx @@ -189,13 +189,18 @@ export default class StudyViewPage extends React.Component< newStudyViewFilter.sharedCustomData = params.sharedCustomData; } } + + let updateStoreFromURLPromise = remoteData(() => Promise.resolve([])); if (!_.isEqual(newStudyViewFilter, this.store.studyViewQueryFilter)) { - this.store.updateStoreFromURL(newStudyViewFilter); this.store.studyViewQueryFilter = newStudyViewFilter; + updateStoreFromURLPromise = remoteData(async () => { + await this.store.updateStoreFromURL(newStudyViewFilter); + return []; + }); } onMobxPromise( - this.store.queriedPhysicalStudyIds, + [this.store.queriedPhysicalStudyIds, updateStoreFromURLPromise], (strArr: string[]) => { this.store.initializeReaction(); trackEvent({ diff --git a/src/pages/studyView/StudyViewPageStore.ts b/src/pages/studyView/StudyViewPageStore.ts index 1d189395218..e516edf6103 100644 --- a/src/pages/studyView/StudyViewPageStore.ts +++ b/src/pages/studyView/StudyViewPageStore.ts @@ -268,6 +268,10 @@ import { PageType } from 'shared/userSession/PageType'; import { FeatureFlagEnum } from 'shared/featureFlags'; import intersect from 'fast_array_intersect'; import { PillStore } from 'shared/components/PillTag/PillTag'; +import { + PatientIdentifier, + PatientIdentifierFilter, +} from 'shared/model/PatientIdentifierFilter'; export const STUDY_VIEW_FILTER_AUTOSUBMIT = 'study_view_filter_autosubmit'; @@ -390,15 +394,6 @@ enum CustomDataTypeEnum { NUMERICAL = 'NUMERICAL', } -interface PatientIdentifierFilter { - patientIdentifiers: PatientIdentifier[]; -} - -interface PatientIdentifier { - patientId: string; - studyId: string; -} - export class StudyViewPageStore implements IAnnotationFilterSettings, ISettingsMenuButtonVisible { private reactionDisposers: IReactionDisposer[] = []; @@ -2181,16 +2176,10 @@ export class StudyViewPageStore const samples = await this.fetchSamplesWithSampleListIds( sampleListIds ); - const { - patientIdentifiers, - } = parsedFilterJson as PatientIdentifierFilter; - const sampleIdentifiers = this.convertPatientIdentifiersToSampleIdentifiers( - patientIdentifiers, + filters = this.getStudyViewFilterFromPatientIdentifierFilter( + parsedFilterJson as PatientIdentifierFilter, samples ); - if (sampleIdentifiers.length > 0) { - filters.sampleIdentifiers = sampleIdentifiers; - } } else { filters = parsedFilterJson as Partial; } @@ -2265,15 +2254,31 @@ export class StudyViewPageStore }); } + getStudyViewFilterFromPatientIdentifierFilter( + patientIdentifierFilter: PatientIdentifierFilter, + samples: Sample[] + ): Partial { + const filters: Partial = {}; + const sampleIdentifiers = this.convertPatientIdentifiersToSampleIdentifiers( + patientIdentifierFilter.patientIdentifiers, + samples + ); + if (sampleIdentifiers.length > 0) { + filters.sampleIdentifiers = sampleIdentifiers; + } + return filters; + } + convertPatientIdentifiersToSampleIdentifiers( patientIdentifiers: Array, samples: Sample[] ): SampleIdentifier[] { + const patientIdentifiersMap = new Map( + patientIdentifiers.map(p => [p.studyId.concat('_', p.patientId), p]) + ); return samples .filter(s => - patientIdentifiers.some( - p => p.patientId === s.patientId && p.studyId === s.studyId - ) + patientIdentifiersMap.has(s.studyId.concat('_', s.patientId)) ) .map(s => ({ sampleId: s.sampleId, diff --git a/src/shared/model/PatientIdentifierFilter.ts b/src/shared/model/PatientIdentifierFilter.ts new file mode 100644 index 00000000000..5758f3ddb0c --- /dev/null +++ b/src/shared/model/PatientIdentifierFilter.ts @@ -0,0 +1,8 @@ +export interface PatientIdentifierFilter { + patientIdentifiers: PatientIdentifier[]; +} + +export interface PatientIdentifier { + patientId: string; + studyId: string; +}