diff --git a/src/content/app/regulatory-activity-viewer/RegulatoryActivityViewer.tsx b/src/content/app/regulatory-activity-viewer/RegulatoryActivityViewer.tsx index d6d5af5dd3..b0bf576590 100644 --- a/src/content/app/regulatory-activity-viewer/RegulatoryActivityViewer.tsx +++ b/src/content/app/regulatory-activity-viewer/RegulatoryActivityViewer.tsx @@ -21,6 +21,8 @@ import { useAppSelector } from 'src/store'; import { getActiveGenomeId } from 'src/content/app/regulatory-activity-viewer/state/general/generalSelectors'; import { getMainContentBottomView } from 'src/content/app/regulatory-activity-viewer/state/ui/uiSelectors'; +import usePreselectedEpigenomes from './hooks/usePreselectedEpigenomes'; + import { StandardAppLayout } from 'src/shared/components/layout'; import RegionOverview from './components/region-overview/RegionOverview'; import RegionActivitySection from './components/region-activity-section/RegionActivitySection'; @@ -32,6 +34,7 @@ import SelectedEpigenomes from './components/selected-epigenomes/SelectedEpigeno const ActivityViewer = () => { const activeGenomeId = useAppSelector(getActiveGenomeId); + usePreselectedEpigenomes(); return ( {
Hello activity viewer + {/* The spacer divs below are temporary */}
diff --git a/src/content/app/regulatory-activity-viewer/hooks/usePreselectedEpigenomes.ts b/src/content/app/regulatory-activity-viewer/hooks/usePreselectedEpigenomes.ts new file mode 100644 index 0000000000..a279d564d5 --- /dev/null +++ b/src/content/app/regulatory-activity-viewer/hooks/usePreselectedEpigenomes.ts @@ -0,0 +1,93 @@ +/** + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { useEffect } from 'react'; + +import { useAppDispatch, useAppSelector } from 'src/store'; + +import { getEpigenomeSelectionCriteria } from 'src/content/app/regulatory-activity-viewer/state/epigenome-selection/epigenomeSelectionSelectors'; +import { getActiveGenomeId } from 'src/content/app/regulatory-activity-viewer/state/general/generalSelectors'; + +import { useEpigenomeMetadataDimensionsQuery } from 'src/content/app/regulatory-activity-viewer/state/api/activityViewerApiSlice'; +import { addSelectionCriterion } from 'src/content/app/regulatory-activity-viewer/state/epigenome-selection/epigenomeSelectionSlice'; + +import type { EpigenomeMetadataDimensions } from 'src/content/app/regulatory-activity-viewer/types/epigenomeMetadataDimensions'; + +/** + * Upon the first load of epigenome metadata dimensions, + * check if user has selected any dimensions, + * and if not, then pre-select epigenomes using the default dimensions (if available). + * + * See the CommonMetadataDimensionFields type for epigenome metadata dimensions. + * + * NOTE: this hook should be only run once, at the top level of RegulatoryActivityViewer + */ +const usePreselectedEpigenomes = () => { + const activeGenomeId = useAppSelector(getActiveGenomeId) ?? ''; + const { currentData: epigenomeMetadataDimensionsResponse } = + useEpigenomeMetadataDimensionsQuery(); + const epigenomeSelectionCriteria = useAppSelector((state) => + getEpigenomeSelectionCriteria(state, activeGenomeId) + ); + const dispatch = useAppDispatch(); + + useEffect(() => { + if (!activeGenomeId || !epigenomeMetadataDimensionsResponse) { + // can't do anything until epigenomeMetadataDimensionsResponse is available + return; + } + if (Object.keys(epigenomeSelectionCriteria).length) { + // some epigenomes have already been selected; bail out + return; + } + + const initialEpigenomeFilters = getPreselectedDimensions( + epigenomeMetadataDimensionsResponse.dimensions + ); + + if (initialEpigenomeFilters.length) { + for (const { dimensionName, value } of initialEpigenomeFilters) { + dispatch( + addSelectionCriterion({ + genomeId: activeGenomeId, + dimensionName, + value + }) + ); + } + } + }, [ + epigenomeMetadataDimensionsResponse, + epigenomeSelectionCriteria, + activeGenomeId + ]); +}; + +const getPreselectedDimensions = (dimensions: EpigenomeMetadataDimensions) => { + const result: { dimensionName: string; value: string }[] = []; + + for (const [dimensionName, dimensionData] of Object.entries(dimensions)) { + if (dimensionData.default_values.length) { + for (const value of dimensionData.default_values) { + result.push({ dimensionName, value }); + } + } + } + + return result; +}; + +export default usePreselectedEpigenomes; diff --git a/src/content/app/regulatory-activity-viewer/types/epigenomeMetadataDimensions.ts b/src/content/app/regulatory-activity-viewer/types/epigenomeMetadataDimensions.ts index bf404072c4..d490770f3a 100644 --- a/src/content/app/regulatory-activity-viewer/types/epigenomeMetadataDimensions.ts +++ b/src/content/app/regulatory-activity-viewer/types/epigenomeMetadataDimensions.ts @@ -19,12 +19,12 @@ type CommonMetadataDimensionFields = { collapsible: boolean; filterable: boolean; zero_counts_visible: boolean; + default_values: string[]; }; type DimensionWithCategoricalData = CommonMetadataDimensionFields & { type: 'categorical'; values: string[]; // <-- this is what makes the dimension "categorical" - default_values: string[]; }; type DimensionWithCategoricalDataAndOntology = CommonMetadataDimensionFields & { @@ -36,7 +36,6 @@ type DimensionWithCategoricalDataAndOntology = CommonMetadataDimensionFields & { url: string; }; }[]; - default_values: string[]; }; // the only member of this type currently is age, which is still very uncertain @@ -47,7 +46,6 @@ type DimensionWithCategoricalDataAndDescription = name: string; description: string; }[]; - default_values: string[]; }; type EpigenomeMetadataDimension =