Skip to content
Open
9 changes: 9 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 7 additions & 4 deletions packages/core/src/features/genomic/ssmsTableSlice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -292,10 +292,14 @@ const generateFilter = ({

export const smtableslice = graphqlAPISlice.injectEndpoints({
endpoints: (builder) => ({
getSsmTableData: builder.mutation<TopSsm, SsmsTableRequestParameters>({
getTopSsm: builder.query<TopSsm, SsmsTableRequestParameters>({
query: (request: SsmsTableRequestParameters) => ({
graphQLQuery: SSMSTableGraphQLQuery,
graphQLFilters: generateFilter(request),
graphQLFilters: generateFilter({
pageSize: 1,
offset: 0,
...request,
}),
}),
transformResponse: (response: { data: ssmtableResponse }) => {
const { consequence, ssm_id } = response?.data?.viewer?.explore?.ssms
Expand Down Expand Up @@ -354,6 +358,5 @@ export const smtableslice = graphqlAPISlice.injectEndpoints({
}),
});

export const { useGetSssmTableDataQuery, useGetSsmTableDataMutation } =
smtableslice;
export const { useGetSssmTableDataQuery, useGetTopSsmQuery } = smtableslice;
export const ssmsTableReducer: Reducer = smtableslice.reducer as Reducer;
2 changes: 1 addition & 1 deletion packages/core/src/features/genomic/topGenesSSMSSlice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ query TopGeneQuery (
}
`;

interface GeneSSMSEntry {
export interface GeneSSMSEntry {
genes: {
readonly name: string;
readonly symbol: string;
Expand Down
25 changes: 7 additions & 18 deletions packages/portal-proto/src/features/GeneSummary/GeneSummary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,14 @@ import { CollapsibleTextArea } from "@/components/CollapsibleTextArea";
import { SummaryCard } from "@/components/Summary/SummaryCard";
import { SummaryHeader } from "@/components/Summary/SummaryHeader";
import { SummaryErrorHeader } from "@/components/Summary/SummaryErrorHeader";
import {
useGeneSummaryQuery,
GeneSummaryData,
FilterSet,
useCoreSelector,
selectCurrentCohortFilters,
} from "@gff/core";
import { useGeneSummaryQuery, GeneSummaryData, FilterSet } from "@gff/core";
import { humanify } from "src/utils";
import CNVPlot from "../charts/CNVPlot";
import SSMPlot from "../charts/SSMPlot";
import { formatDataForHorizontalTable } from "../files/utils";
import { LoadingOverlay } from "@mantine/core";
import { WarningBanner } from "@gff/portal-components";
import { HeaderTitle } from "@/components/tailwindComponents";
import { useIsDemoApp } from "@/hooks/useIsDemoApp";
import { overwritingDemoFilterMutationFrequency } from "../genomic/GenesAndMutationFrequencyAnalysisTool";
import { CollapsibleList } from "@/components/CollapsibleList";
import SMTableContainer from "../GenomicTables/SomaticMutationsTable/SMTableContainer";
import GeneCancerDistributionTable from "../CancerDistributionTable/GeneCancerDistributionTable";
Expand All @@ -31,6 +23,7 @@ import {
GeneSummaryTableData,
} from "./utils";
import { ExternalReferenceEntry } from "@/utils/externalLinks";
import { useMutationFrequencyFilters } from "../genomic/hooks";

const formatDataForSummary = (summaryData: GeneSummaryTableData) => {
const {
Expand Down Expand Up @@ -172,25 +165,21 @@ const GeneView = ({
contextFilters = undefined,
contextSensitive = false,
}: GeneViewProps) => {
const isDemo = useIsDemoApp();
const currentCohortFilters = useCoreSelector((state) =>
selectCurrentCohortFilters(state),
);

// Since genomic filter lies in different store, it cannot be accessed using selectors.
// Hence, passing it via a callback as contextFilters
const genomicFilters = useMemo(
() => (contextSensitive ? contextFilters : undefined),
[contextFilters, contextSensitive],
);

const { cohortFilters: mutationFrequencyCohortFilters } =
useMutationFrequencyFilters();

const cohortFilters = useMemo(() => {
if (!contextSensitive) return undefined;
// if it's for mutation frequency demo use different filter (TCGA-LGG) than the current cohort filter
return isDemo
? overwritingDemoFilterMutationFrequency
: currentCohortFilters;
}, [contextSensitive, isDemo, currentCohortFilters]);
return mutationFrequencyCohortFilters;
}, [contextSensitive, mutationFrequencyCohortFilters]);

const summaryData = useMemo(
() => (data ? buildGeneSummary(data) : null),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import { ComparativeSurvival } from "@/features/genomic/types";
import { appendSearchTermFilters } from "../utils";
import TotalItems from "@/components/Table/TotalItem";
import { SET_COUNT_LIMIT } from "@/components/Modals/SetModals/constants";
import { useIsDemoApp } from "@/hooks/useIsDemoApp";

export interface GTableContainerProps {
readonly selectedSurvivalPlot: ComparativeSurvival;
Expand All @@ -60,7 +61,6 @@ export interface GTableContainerProps {
genomicFilters?: FilterSet;
cohortFilters?: FilterSet;
toggledGenes?: ReadonlyArray<string>;
isDemoMode?: boolean;
}

export const GenesTableContainer: React.FC<GTableContainerProps> = ({
Expand All @@ -70,13 +70,13 @@ export const GenesTableContainer: React.FC<GTableContainerProps> = ({
genomicFilters,
cohortFilters,
toggledGenes = [],
isDemoMode = false,
handleMutationCountClick,
}: GTableContainerProps) => {
/* States for table */
const [pageSize, setPageSize] = useState(10);
const [page, setPage] = useState(1);
const [searchTerm, setSearchTerm] = useState("");
const isDemoMode = useIsDemoApp();

const [downloadMutatedGenesTSVActive, setDownloadMutatedGenesTSVActive] =
useState(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ import { ComparativeSurvival } from "@/features/genomic/types";
import TotalItems from "@/components/Table/TotalItem";
import { SET_COUNT_LIMIT } from "@/components/Modals/SetModals/constants";
import SaveSelectionAsSetModal from "@/components/Modals/SetModals/SaveSelectionAsSetModal";
import { useIsDemoApp } from "@/hooks/useIsDemoApp";

const TABLE_SORT = [
{
Expand All @@ -71,7 +72,6 @@ export interface SMTableContainerProps {
toggledSsms?: Array<string>;
geneSymbol?: string;
tableTitle?: string;
isDemoMode?: boolean;
/*
* filter about case id sent from case summary for SMT
*/
Expand Down Expand Up @@ -113,7 +113,6 @@ export const SMTableContainer: React.FC<SMTableContainerProps> = ({
caseFilter = undefined,
handleSsmToggled = undefined,
toggledSsms = undefined,
isDemoMode = false,
isModal = false,
tableTitle = undefined,
searchTermsForGene,
Expand All @@ -133,6 +132,7 @@ export const SMTableContainer: React.FC<SMTableContainerProps> = ({
setDownloadMutationsFrequencyTSVActive,
] = useState(false);

const isDemoMode = useIsDemoApp();
const dispatch = useCoreDispatch();
const { setEntityMetadata } = useContext(SummaryModalContext);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import React, { useCallback, useState } from "react";
import { useDeepCompareCallback, useDeepCompareEffect } from "use-deep-compare";
import { useDeepCompareEffect, useDeepCompareCallback } from "use-deep-compare";
import { Tabs } from "@mantine/core";
import {
FilterSet,
useCoreSelector,
useCoreDispatch,
removeCohortFilter,
updateActiveCohortFilter,
selectCurrentCohortId,
usePrevious,
useTopGeneQuery,
useGetTopSsmQuery,
buildSSMSTableSearchFilters,
} from "@gff/core";
import { useAppDispatch } from "@/features/genomic/appApi";
import { SecondaryTabStyle } from "@/features/cohortBuilder/style";
Expand All @@ -20,18 +22,11 @@ import { GenesPanel } from "@/features/genomic/GenesPanel";
import { SSMSPanel } from "@/features/genomic/SSMSPanel";
import { TableXPositionContext } from "@/components/Table/VerticalTable";
import { ComparativeSurvival, AppModeState } from "./types";
import { useTopGeneSsms } from "./hooks";

export const overwritingDemoFilterMutationFrequency: FilterSet = {
mode: "and",
root: {
"cases.project.project_id": {
operator: "includes",
field: "cases.project.project_id",
operands: ["TCGA-LGG"],
},
},
};
import {
useAutomaticComparativeSurvival,
useMutationFrequencyFilters,
} from "./hooks";
import { appendSearchTermFilters } from "@/features/GenomicTables/utils";

const GenesAndMutationFrequencyAnalysisTool: React.FC = () => {
const isDemoMode = useIsDemoApp();
Expand All @@ -45,13 +40,6 @@ const GenesAndMutationFrequencyAnalysisTool: React.FC = () => {
geneSymbol: undefined,
});

const topGeneSSMSSuccess = useTopGeneSsms({
appMode,
comparativeSurvival,
setComparativeSurvival,
searchTermsForGene: searchTermsForGeneId,
});

const cohortId = useCoreSelector((state) => selectCurrentCohortId(state));
const prevId = usePrevious(cohortId);

Expand Down Expand Up @@ -88,6 +76,42 @@ const GenesAndMutationFrequencyAnalysisTool: React.FC = () => {
[comparativeSurvival],
);

const { cohortFilters, genomicFilters } = useMutationFrequencyFilters();

// Default top gene/ssms
const { data: topGeneSSMS, isSuccess: topGeneSSMSSuccess } = useTopGeneQuery({
cohortFilters,
genomicFilters,
});

const { geneId = "", geneSymbol = "" } = searchTermsForGeneId;

const searchFilters = buildSSMSTableSearchFilters(geneId);
const tableFilters = appendSearchTermFilters(genomicFilters, searchFilters);

// Top value when a mutation is selected from the genes table
const { data: topSSM, isSuccess: topSSMSuccess } = useGetTopSsmQuery(
{
searchTerm: geneId,
geneSymbol: geneSymbol,
genomicFilters,
cohortFilters,
tableFilters,
},
{ skip: !geneSymbol },
);

useAutomaticComparativeSurvival({
appMode,
comparativeSurvival,
setComparativeSurvival,
searchTermsForGene: searchTermsForGeneId,
topGeneSSMSSuccess,
topGeneSSMS,
topSSMSuccess,
topSSM,
});

const handleGeneAndSSmToggled = useCallback(
(
cohortStatus: string[],
Expand Down Expand Up @@ -190,7 +214,6 @@ const GenesAndMutationFrequencyAnalysisTool: React.FC = () => {
</Tabs.List>
<Tabs.Panel value="genes" pt="xs">
<GenesPanel
topGeneSSMSSuccess={topGeneSSMSSuccess}
comparativeSurvival={comparativeSurvival}
handleSurvivalPlotToggled={handleSurvivalPlotToggled}
handleGeneAndSSmToggled={handleGeneAndSSmToggled}
Expand All @@ -199,7 +222,6 @@ const GenesAndMutationFrequencyAnalysisTool: React.FC = () => {
</Tabs.Panel>
<Tabs.Panel value="ssms" pt="xs">
<SSMSPanel
topGeneSSMSSuccess={topGeneSSMSSuccess}
comparativeSurvival={comparativeSurvival}
handleSurvivalPlotToggled={handleSurvivalPlotToggled}
handleGeneAndSSmToggled={handleGeneAndSSmToggled}
Expand Down
28 changes: 9 additions & 19 deletions packages/portal-proto/src/features/genomic/GenesPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import {
} from "@/features/genomic/types";
import {
useSelectFilterContent,
useGeneAndSSMPanelData,
useGenomicSurvivalPlot,
useMutationFrequencyFilters,
} from "@/features/genomic/hooks";
import dynamic from "next/dynamic";
import { GenesTableContainer } from "../GenomicTables/GenesTable/GenesTableContainer";
Expand All @@ -22,7 +23,6 @@ const SurvivalPlot = dynamic(
);

interface GenesPanelProps {
topGeneSSMSSuccess: boolean;
comparativeSurvival: ComparativeSurvival;
handleSurvivalPlotToggled: (
symbol: string,
Expand All @@ -39,21 +39,15 @@ interface GenesPanelProps {
}

export const GenesPanel = ({
topGeneSSMSSuccess,
comparativeSurvival,
handleSurvivalPlotToggled,
handleGeneAndSSmToggled,
handleMutationCountClick,
}: GenesPanelProps): JSX.Element => {
const {
isDemoMode,
cohortFilters,
genomicFilters,
overwritingDemoFilter,
survivalPlotData,
survivalPlotFetching,
survivalPlotReady,
} = useGeneAndSSMPanelData(comparativeSurvival, true);
const { cohortFilters, genomicFilters } = useMutationFrequencyFilters();

const { survivalPlotData, survivalPlotReady, survivalPlotFetching } =
useGenomicSurvivalPlot(comparativeSurvival, true);

const currentGenes = useSelectFilterContent("genes.gene_id");
const toggledGenes = useDeepCompareMemo(() => currentGenes, [currentGenes]);
Expand All @@ -75,17 +69,14 @@ export const GenesPanel = ({
<GeneFrequencyChart
marginBottom={95}
genomicFilters={genomicFilters}
cohortFilters={isDemoMode ? overwritingDemoFilter : cohortFilters}
cohortFilters={cohortFilters}
/>
</div>
<div className="w-full xl:w-1/2 relative border border-base-lighter p-4">
<LoadingOverlay
zIndex={0}
data-testid="loading-spinner"
visible={
survivalPlotFetching ||
(!survivalPlotReady && !topGeneSSMSSuccess)
}
visible={survivalPlotFetching}
/>
<SurvivalPlot
plotType={SurvivalPlotTypes.gene}
Expand All @@ -110,8 +101,7 @@ export const GenesPanel = ({
handleGeneToggled={handleGeneToggled}
toggledGenes={toggledGenes}
genomicFilters={genomicFilters}
cohortFilters={isDemoMode ? overwritingDemoFilter : cohortFilters}
isDemoMode={isDemoMode}
cohortFilters={cohortFilters}
handleMutationCountClick={handleMutationCountClick}
/>
</div>
Expand Down
Loading