From a71ba9e632cfee4635c42883cf2a9fb0b412d0d0 Mon Sep 17 00:00:00 2001 From: siosonel Date: Mon, 1 Dec 2025 07:21:29 -0800 Subject: [PATCH 1/9] create cards for ProteinPaint-based analysis tools --- config/gen3/analysisTools.json | 35 ++ src/features/apps/OncoMatrix.tsx | 8 + src/features/apps/ProteinPaint.tsx | 8 + src/features/proteinpaint/MatrixWrapper.tsx | 364 ++++++++++++++++++ .../proteinpaint/ProteinPaintWrapper.tsx | 239 ++++++++++++ src/features/proteinpaint/dev.sh | 31 ++ src/features/proteinpaint/sjpp-types.tsx | 56 +++ 7 files changed, 741 insertions(+) create mode 100644 src/features/apps/OncoMatrix.tsx create mode 100644 src/features/apps/ProteinPaint.tsx create mode 100644 src/features/proteinpaint/MatrixWrapper.tsx create mode 100644 src/features/proteinpaint/ProteinPaintWrapper.tsx create mode 100755 src/features/proteinpaint/dev.sh create mode 100644 src/features/proteinpaint/sjpp-types.tsx diff --git a/config/gen3/analysisTools.json b/config/gen3/analysisTools.json index 03f00f2..e970cca 100644 --- a/config/gen3/analysisTools.json +++ b/config/gen3/analysisTools.json @@ -81,6 +81,41 @@ "hideCounts" : true, "appId" : "CohortComparison", "countUnits": "Cases" + }, + { + "title": "ProteinPaint", + "type": "application", + "hasDemo": false, + "loginRequired": false, + "description": "Visualize mutations in protein-coding genes by consequence type and protein domain.", + "icon": "/icons/apps/ProteinPaint.svg", + "href": "/?app=ProteinPaint", + "appId" : "ProteinPaint", + "count": 1000, + "countUnits": "Cases" + }, + { + "title": "OncoMatrix", + "type": "application", + "hasDemo": false, + "loginRequired": false, + "description": "Visualize the top most mutated cases and genes affected by high impact mutations in your cohort.", + "icon": "/icons/apps/OncoMatrix.svg", + "appId" : "OncoMatrix", + "href": "/?app=OncoMatrix", + "count": 1000, + "countUnits": "Cases" + }, + { + "title": "Set Operations", + "type": "application", + "hasDemo": false, + "loginRequired": false, + "description": "Display a Venn diagram and compare/contrast your cohorts or sets of the same type.", + "icon": "/icons/apps/SetOperations.svg", + "href": "/", + "count": 1000, + "countUnits": "Cases" } ] } diff --git a/src/features/apps/OncoMatrix.tsx b/src/features/apps/OncoMatrix.tsx new file mode 100644 index 0000000..c386c45 --- /dev/null +++ b/src/features/apps/OncoMatrix.tsx @@ -0,0 +1,8 @@ +import { FC } from "react"; +import { MatrixWrapper } from "../proteinpaint/MatrixWrapper"; + +const MatrixApp: FC = () => { + return ; +}; + +export default MatrixApp; diff --git a/src/features/apps/ProteinPaint.tsx b/src/features/apps/ProteinPaint.tsx new file mode 100644 index 0000000..704010f --- /dev/null +++ b/src/features/apps/ProteinPaint.tsx @@ -0,0 +1,8 @@ +import { FC } from "react"; +import { ProteinPaintWrapper } from "../proteinpaint/ProteinPaintWrapper"; + +const ProteinPaintApp: FC = () => { + return ; +}; + +export default ProteinPaintApp; diff --git a/src/features/proteinpaint/MatrixWrapper.tsx b/src/features/proteinpaint/MatrixWrapper.tsx new file mode 100644 index 0000000..1203045 --- /dev/null +++ b/src/features/proteinpaint/MatrixWrapper.tsx @@ -0,0 +1,364 @@ +import { useRef, useCallback, useState, FC } from "react"; +import { useDeepCompareEffect } from "use-deep-compare"; +import { bindProteinPaint } from "@sjcrh/proteinpaint-client"; +import { useIsDemoApp } from "@/hooks/useIsDemoApp"; +import { + useCoreSelector, + selectCurrentCohortFilters, + convertFilterSetToGqlFilter as buildCohortGqlOperator, + FilterSet, + //PROTEINPAINT_API, + useFetchUserDetailsQuery, + useCoreDispatch, + // useCreateCaseSetFromValuesMutation, + // useGetGenesQuery, + Operation, + Includes, + showModal, + hideModal, + Modals, + selectCurrentModal, +} from "@gen3/core"; +import { DemoText } from "@/components/tailwindComponents"; +import { LoadingOverlay } from "@mantine/core"; +import { + SelectSamples, + SelectSamplesCallBackArg, + SelectSamplesCallback, + RxComponentCallbacks, +} from "./sjpp-types"; +//import { SaveCohortModal } from "@gff/portal-components"; +//import GeneSetModal from "@/components/Modals/SetModals/GeneSetModal"; +import { isEqual, cloneDeep } from "lodash"; +//import { cohortActionsHooks } from "../cohortBuilder/CohortManager/cohortActionHooks"; +//import { INVALID_COHORT_NAMES } from "../cohortBuilder/utils"; + +const basepath = 'http://localhost:3000' // PROTEINPAINT_API; + +interface PpProps { + chartType: "matrix" | "hierCluster"; + basepath?: string; +} + +export const demoFilter = Object.freeze({ + op: "in", + content: Object.freeze({ + field: "cases.disease_type", + value: Object.freeze(["Gliomas"]), + }), +}); + +export const MatrixWrapper: FC = (props: PpProps) => { + const isDemoMode = useIsDemoApp(); + // const demoFilter = { + // op: "in", + // content: { field: "cases.disease_type", value: ["Gliomas"] }, + // }; + const currentCohort = useCoreSelector(selectCurrentCohortFilters); + const filter0 = null // isDemoMode + // ? cloneDeep(demoFilter) + // : buildCohortGqlOperator(currentCohort); + const userDetails = useFetchUserDetailsQuery(); + const prevData = useRef(); + const toolApp = useRef(); + const coreDispatch = useCoreDispatch(); + const [showSaveCohortModal, setShowSaveCohortModal] = useState(false); + const [isLoading, setIsLoading] = useState(false); + // const [createSet, response] = useCreateCaseSetFromValuesMutation(); + // const [newCohortFilters, setNewCohortFilters] = + // useState(undefined); + const [customGeneSetParam, setCustomGeneSetParam] = useState(null); + const [lastGeneSetRequestId, setLastGeneSetRequestId] = useState(undefined); + + const dispatch = useCoreDispatch(); + const modal = useCoreSelector((state) => selectCurrentModal(state)); + + const callback = () => {} + // useCallback( + // (arg: SelectSamplesCallBackArg) => { + // const cases = arg.samples.map((d) => d["cases.case_id"]); + // if (cases.length > 1) { + // createSet({ values: cases, intent: "portal", set_type: "frozen" }); + // } else { + // setNewCohortFilters({ + // mode: "and", + // root: { + // "cases.case_id": { + // operator: "includes", + // field: "cases.case_id", + // operands: cases, + // }, + // }, + // }); + // setShowSaveCohortModal(true); + // } + // }, + // [createSet], + // ); + + // a set for the new cohort is created, now show the save cohort modal + // useDeepCompareEffect(() => { + // if (response.isSuccess) { + // const filters: FilterSet = { + // mode: "and", + // root: { + // "cases.case_id": { + // operator: "includes", + // field: "cases.case_id", + // operands: [`set_id:${response.data}`], + // }, + // }, + // }; + // setNewCohortFilters(filters); + // setShowSaveCohortModal(true); + // } + // }, [response.isSuccess, coreDispatch, response.data]); + + // const genesResponse = useGetGenesQuery( + // { + // request: { + // filters: { + // op: "in", + // content: { + // field: "genes.gene_id", + // value: customGeneSetParam, + // }, + // }, + // fields: ["gene_id", "symbol"], + // size: 1000, + // //from: currentPage * PAGE_SIZE, + // //sortBy, + // }, + // fetchAll: false, + // }, + // { skip: !customGeneSetParam?.length }, + // ); + // const { + // data: geneDetailData, + // isFetching: isGeneFetching, + // requestId: genesRequestId, + // } = genesResponse; + + const showLoadingOverlay = () => setIsLoading(true); + const hideLoadingOverlay = () => setIsLoading(false); + const matrixCallbacks: RxComponentCallbacks = { + "postRender.gdcOncoMatrix": hideLoadingOverlay, + "error.gdcOncoMatrix": hideLoadingOverlay, + }; + const appCallbacks: RxComponentCallbacks = { + "preDispatch.gdcPlotApp": showLoadingOverlay, + "error.gdcPlotApp": hideLoadingOverlay, + "postRender.gdcPlotApp": hideLoadingOverlay, + }; + // const genesetCallback = (/*{callback}*/) => { + // dispatch(showModal({ modal: Modals.LocalGeneSetModal })); + // // TODO: pass the gene set to the callback + // }; + const initArgs = getMatrixTrack( + props, + callback, + matrixCallbacks, + appCallbacks, + //genesetCallback, + ); + + useDeepCompareEffect( + () => { + // debounce until one of these is true + // otherwise, the userDetails.isFetching changing from false > true > false + // could trigger unnecessary, wastefule PP-app state update + if (userDetails?.isSuccess === false && userDetails?.isError === false) + return; + //if (isGeneFetching) return; + const data = { + filter0: filter0 || null, + userData: userDetails?.data, + //geneDetailData, + }; + const hasUpdates = + (data || prevData.current) && !isEqual(prevData.current, data); + if (hasUpdates) prevData.current = data; + const rootElem = divRef.current as HTMLElement; + + let updateArgs; + if (hasUpdates) { + updateArgs = { filter0: data.filter0 }; + // if (lastGeneSetRequestId != genesRequestId) { + // setLastGeneSetRequestId(genesRequestId); + // updateArgs.genes = geneDetailData.hits.map((h) => ({ + // gene: h.symbol, + // })); + // } + + // TODO: + // showing and hiding the overlay should be triggered by components that may take a while to load/render, + // this wrapper code can show the overlay here since it has supplied postRender callbacks above, + // but ideally it is the PP-app that triggers both the showing and hiding of the overlay for reliable behavior + const toolContainer = rootElem?.parentNode?.parentNode?.parentNode as HTMLElement; + toolContainer.style.backgroundColor = "#fff"; + } + + Object.assign(initArgs, { + holder: rootElem, + noheader: true, + nobox: true, + hide_dsHandles: true, + filter0: data.filter0, + }); + + // bindProteinPaint() handles rapid update requests/race condition, + // so no need to include debouncing and promise code in this wrapper + // TODO: will revert to using runproteinpaint() once these advanced capabilities + // are merged into it + bindProteinPaint({ + rootElem, + initArgs, + updateArgs, + isStale() { + // new data has replaced this one, will prevent unnecessary render + // in case of race condition + return prevData.current != data; + }, + }) + .then?.((_app) => { + toolApp.current = _app; + }) + .catch((e) => { + // the app should either work or display an error in a red banner within the tool container div, + // this uncaught-by-app error is unlikely to happen except for bundling issues that are not detected at build time + console.error(e); + }); + + return () => { + if (!toolApp.current) return; + const toolName = + props.chartType == "hierCluster" ? "GeneExpression" : "OncoMatrix"; + if (window.location.href.includes(toolName)) return; + // cancel unnecessary network requests when this tool app is hidden + toolApp.current.triggerAbort(); + }; + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [filter0, userDetails, /*geneDetailData*/], + ); + + const divRef = useRef(null); + + // const updateFilters = (field: string, operation: Operation) => { + // dispatch(hideModal()); + // setCustomGeneSetParam((operation as Includes).operands); + // }; + const existingFiltersHook = () => null; + return ( +
+ {isDemoMode && Demo showing cases with Gliomas.} +
+ + {/* setShowSaveCohortModal(false)} + filters={newCohortFilters} + hooks={cohortActionsHooks} + invalidCohortNames={INVALID_COHORT_NAMES} + /> + + */} + + +
+ ); +}; + +interface MatrixArg { + holder?: HTMLElement; + noheader?: boolean; + nobox?: boolean; + hide_dsHandles?: boolean; + host: string; + launchGdcMatrix: boolean; + launchGdcHierCluster: boolean; + filter0?: any; //FilterSet; + opts: MatrixArgOpts; + state?: any; +} + +interface MatrixArgOpts { + app: MatrixArgOptsApp; + matrix?: MatrixArgOptsMatrix; + hierCluster?: MatrixArgOptsMatrix; +} + +interface MatrixArgOptsApp { + callbacks?: RxComponentCallbacks; +} + +interface MatrixArgOptsMatrix { + allow2selectSamples?: SelectSamples; + callbacks?: RxComponentCallbacks; + customInputs?: { + geneset?: { + label: string; + showInput: () => void; + }[]; + }; +} + +function getMatrixTrack( + props: PpProps, + callback?: SelectSamplesCallback, + matrixCallbacks?: RxComponentCallbacks, + appCallbacks?: RxComponentCallbacks, + //genesetCallback?: () => void, +): MatrixArg { + const arg: MatrixArg = { + // host in gdc is just a relative url path, + // using the same domain as the GDC portal where PP is embedded + host: props.basepath || (basepath as string), + launchGdcMatrix: props.chartType == "matrix", + launchGdcHierCluster: props.chartType == "hierCluster", + opts: { + app: { + callbacks: appCallbacks, + }, + [props.chartType]: { + allow2selectSamples: { + buttonText: "Create Cohort", + attributes: [ + { + from: "sample", + to: "cases.case_id", + convert: true, + }, + ], + callback, + }, + callbacks: matrixCallbacks, + // customInputs: { + // geneset: [ + // { + // label: "Load Gene Sets", + // showInput: genesetCallback, + // }, + // ], + // }, + }, + }, + }; + + return arg; +} diff --git a/src/features/proteinpaint/ProteinPaintWrapper.tsx b/src/features/proteinpaint/ProteinPaintWrapper.tsx new file mode 100644 index 0000000..b8c9eb8 --- /dev/null +++ b/src/features/proteinpaint/ProteinPaintWrapper.tsx @@ -0,0 +1,239 @@ +import { useRef, useCallback, useState, FC } from "react"; +import { useDeepCompareEffect } from "use-deep-compare"; +import { bindProteinPaint } from "@sjcrh/proteinpaint-client"; +import { useIsDemoApp } from "@/hooks/useIsDemoApp"; +import { + useCoreSelector, + selectCurrentCohortFilters, + FilterSet, + //PROTEINPAINT_API, + useFetchUserDetailsQuery, + useCoreDispatch, + convertFilterSetToGqlFilter as buildCohortGqlOperator, + //useCreateCaseSetFromValuesMutation, +} from "@gen3/core"; +import { isEqual, cloneDeep } from "lodash"; +import { DemoText } from "@/components/tailwindComponents"; +// import { SaveCohortModal } from "@gff/portal-components"; +import { + SelectSamples, + SelectSamplesCallBackArg, + SelectSamplesCallback, +} from "./sjpp-types"; +// import { cohortActionsHooks } from "../cohortBuilder/CohortManager/cohortActionHooks"; +// import { INVALID_COHORT_NAMES } from "../cohortBuilder/utils"; + +const basepath = 'http://localhost:3000'; //PROTEINPAINT_API; + +interface PpProps { + basepath?: string; + geneId?: string; + gene2canonicalisoform?: string; + ssm_id?: string; + mds3_ssm2canonicalisoform?: mds3_isoform; + geneSearch4GDCmds3?: boolean; + hardcodeCnvOnly?: boolean; +} + +export const ProteinPaintWrapper: FC = (props: PpProps) => { + const isDemoMode = useIsDemoApp(); + const currentCohort = useCoreSelector(selectCurrentCohortFilters); + + // const cohortFilters = useCoreSelector((state) => + // isDemoMode ? DEMO_COHORT_FILTERS : selectCurrentCohortFilters(state), + // ); + + const filter0 = null // isDemoMode ? null : buildCohortGqlOperator(currentCohort); + const userDetails = useFetchUserDetailsQuery(); + + // to track reusable instance for mds3 skewer track + const prevArg = useRef({}); + const coreDispatch = useCoreDispatch(); + const [showSaveCohort, setShowSaveCohort] = useState(false); + //const [createSet, response] = useCreateCaseSetFromValuesMutation(); + // const [newCohortFilters, setNewCohortFilters] = + // useState(undefined); + + const callback = () => {} + // useCallback( + // (arg: SelectSamplesCallBackArg) => { + // const cases = arg.samples.map((d) => d["cases.case_id"]); + // if (cases.length > 1) { + // createSet({ values: cases, intent: "portal", set_type: "frozen" }); + // } else { + // setNewCohortFilters({ + // mode: "and", + // root: { + // "cases.case_id": { + // operator: "includes", + // field: "cases.case_id", + // operands: cases, + // }, + // }, + // }); + // setShowSaveCohort(true); + // } + // }, + // [createSet], + // ); + + // a set for the new cohort is created, now show the save cohort modal + // useDeepCompareEffect(() => { + // if (response.isSuccess) { + // const filters: FilterSet = { + // mode: "and", + // root: { + // "cases.case_id": { + // operator: "includes", + // field: "cases.case_id", + // operands: [`set_id:${response.data}`], + // }, + // }, + // }; + // setNewCohortFilters(filters); + // setShowSaveCohort(true); + // } + // }, [response.isSuccess, coreDispatch, response.data]); + + useDeepCompareEffect( + () => { + const rootElem = divRef.current; + const data = getLollipopTrack(props, filter0, callback); + if (!data) return; + if (isDemoMode) { + data.geneSymbol = props.hardcodeCnvOnly + ? "chr8:127682515-127792250" + : "MYC"; + } + // compare the argument to runpp to avoid unnecessary render + if ((data || prevArg.current) && isEqual(prevArg.current, data)) return; + prevArg.current = data; + + const toolContainer = rootElem?.parentNode?.parentNode?.parentNode as HTMLElement; + if (!toolContainer) return + toolContainer.style.backgroundColor = "#fff"; + + const arg = Object.assign( + { holder: rootElem, noheader: true, nobox: true }, + cloneDeep(data), + ) as Mds3Arg; + + // bindProteinPaint() handles rapid update requests/race condition, + // so no need to include debouncing and promise code in this wrapper + // TODO: will revert to using runproteinpaint() once these advanced capabilities + // are merged into it + bindProteinPaint({ + rootElem, + initArgs: arg, + updateArgs: arg, + isStale() { + // new data has replaced this one, will prevent unnecessary render + // in case of race condition + return prevArg.current != data; + }, + }); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + props.gene2canonicalisoform, + props.mds3_ssm2canonicalisoform, + props.geneSearch4GDCmds3, + isDemoMode, + filter0, + userDetails, + ], + ); + + const divRef = useRef(null); + const demoText = props.hardcodeCnvOnly + ? "Demo showing MYC CNV segments from all GDC cases" + : "Demo showing MYC mutations from all GDC cases."; + return ( +
+ {isDemoMode && {demoText}} +
+ + {/* setShowSaveCohort(false)} + filters={newCohortFilters} + hooks={cohortActionsHooks} + invalidCohortNames={INVALID_COHORT_NAMES} + />*/} +
+ ); +}; + +interface Mds3Arg { + holder?: HTMLElement; + noheader?: boolean; + nobox?: boolean; + hide_dsHandles?: boolean; + host: string; + gene2canonicalisoform?: string; + mds3_ssm2canonicalisoform?: mds3_isoform; + geneSearch4GDCmds3?: + | boolean + | { + hardcodeCnvOnly?: boolean; + }; + geneSymbol?: string; + tracks?: Track[]; + filter0?: FilterSet; + allow2selectSamples?: SelectSamples; +} + +interface Track { + type: string; + dslabel: string; + filter0: FilterSet; + allow2selectSamples?: SelectSamples; + hardcodeCnvOnly?: boolean; +} + +interface mds3_isoform { + ssm_id: string; + dslabel: string; +} + +function getLollipopTrack( + props: PpProps, + filter0: any, + callback: SelectSamplesCallback, +) { + const arg: Mds3Arg = { + // host in gdc is just a relative url path, + // using the same domain as the GDC portal where PP is embedded + host: props.basepath || (basepath as string), + geneSearch4GDCmds3: { + hardcodeCnvOnly: props.hardcodeCnvOnly, + }, + filter0, + allow2selectSamples: { + buttonText: "Create Cohort", + attributes: [{ from: "sample_id", to: "cases.case_id", convert: true }], + callback, + }, + }; + + if (props.hardcodeCnvOnly) { + arg.geneSearch4GDCmds3 = { + hardcodeCnvOnly: true, + }; + } else if (props.geneId) { + arg.gene2canonicalisoform = props.geneId; + } else if (props.ssm_id) { + arg.mds3_ssm2canonicalisoform = { + dslabel: "GDC", + ssm_id: props.ssm_id, + }; + } else { + arg.geneSearch4GDCmds3 = true; + } + + return arg; +} diff --git a/src/features/proteinpaint/dev.sh b/src/features/proteinpaint/dev.sh new file mode 100755 index 0000000..8f983ca --- /dev/null +++ b/src/features/proteinpaint/dev.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# run from the gdc-frontend-framework project root folder +# ./packages/portal-proto/src/features/proteinpaint/dev.sh +# assumes that the proteinpaint folder is a sibling dir of gff +if [[ "$1" == "unlink" ]]; then + # to test the published client package before submitting a PR with an updated pp-client version + npm unlink ../proteinpaint/client + npm uninstall @sjcrh/proteinpaint-client --save --workspace=packages/portal-proto + npm install @sjcrh/proteinpaint-client --save --save-exact --workspace=packages/portal-proto + +else + # to test the local PP client code + npm link ../proteinpaint/client + # An issue with npm link and workspaces: the non-linked @sjcrh/proteinpaint-client package + # may be moved to portal-proto/node_modules, creating 2 separate modules of the same package, + # must ensure only the linked module is used for bundling so delete + rm -rf packages/portal-proto/node_modules/@sjcrh + # also not able to do a simpler + # `cd packages/portal-proto && npm link path/to/proteinpaint/client`, + # where the linked module would be in portal-proto/node_modules instead of the + # other way around +fi + +# sometimes the nextjs bundle cache are stale after npm link +# rm -rf packages/portal-proto/.next + +# run the following tab in a separate tab +# local-ssl-proxy --config ssl-proxy.json --cert localhost.pem --key localhost-key.pem +# then from the gff dir +PORT=3333 npm run dev diff --git a/src/features/proteinpaint/sjpp-types.tsx b/src/features/proteinpaint/sjpp-types.tsx new file mode 100644 index 0000000..c36a96e --- /dev/null +++ b/src/features/proteinpaint/sjpp-types.tsx @@ -0,0 +1,56 @@ +import { FilterSet } from "@gff/core"; + +export interface PpApi { + update(arg: any): null; + staleInstance?: boolean; + getState?: () => any; +} + +export type SampleData = { + "cases.case_id"?: string; +}; + +export interface SelectSamplesCallBackArg { + samples: SampleData[]; + source: string; +} + +export type SelectSamplesCallback = (samples: SelectSamplesCallBackArg) => void; + +export type attrMapping = { + from: string; + to?: string; + convert?: boolean; +}; + +export interface SelectSamples { + buttonText: string; + attributes: attrMapping[]; + callback?: SelectSamplesCallback; +} + +export function getFilters(arg: SelectSamplesCallBackArg): FilterSet { + const { samples } = arg; + // see comments below about SV-2228 + const ids = samples.map((d) => d["cases.case_id"]).filter((d) => d && true); + return { + mode: "and", + root: { + // see https://jira.opensciencedatacloud.org/browse/SV-2228 + // per Craig: I suggest always representing cohorts comprised of cases using the cases.case_id filter, + // as it is the most general of the case filters. Within an app, you can use any filter needed; + // when these become part of the cohort, there is some potential for issues. + // NOTE: This is primarily because both the frontend and backends are trying to, in effect, + // JOINs across the explore and repository indexes, and there is some additional work needed to work will all filters. + "cases.case_id": { + operator: "includes", + field: "cases.case_id", + operands: ids, + }, + }, + }; +} + +export type RxComponentCallbacks = { + [eventName: string]: () => void; +}; From eac760e8f7cc217a03537c28e92889adaccb6459 Mon Sep 17 00:00:00 2001 From: siosonel Date: Mon, 1 Dec 2025 12:47:23 -0800 Subject: [PATCH 2/9] specify the dslabel='MMRF' argument for ProteinPaint-based tools --- config/gen3/analysisTools.json | 2 - package-lock.json | 183 +++++++++++------- package.json | 1 + src/features/apps/ProteinPaint.tsx | 6 +- src/features/proteinpaint/MatrixWrapper.tsx | 4 + .../proteinpaint/ProteinPaintWrapper.tsx | 4 +- src/features/proteinpaint/dev.sh | 8 +- 7 files changed, 126 insertions(+), 82 deletions(-) diff --git a/config/gen3/analysisTools.json b/config/gen3/analysisTools.json index e970cca..526c249 100644 --- a/config/gen3/analysisTools.json +++ b/config/gen3/analysisTools.json @@ -89,7 +89,6 @@ "loginRequired": false, "description": "Visualize mutations in protein-coding genes by consequence type and protein domain.", "icon": "/icons/apps/ProteinPaint.svg", - "href": "/?app=ProteinPaint", "appId" : "ProteinPaint", "count": 1000, "countUnits": "Cases" @@ -102,7 +101,6 @@ "description": "Visualize the top most mutated cases and genes affected by high impact mutations in your cohort.", "icon": "/icons/apps/OncoMatrix.svg", "appId" : "OncoMatrix", - "href": "/?app=OncoMatrix", "count": 1000, "countUnits": "Cases" }, diff --git a/package-lock.json b/package-lock.json index 7f1e454..dacd7ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -255,6 +255,7 @@ "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -2275,7 +2276,6 @@ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", "license": "MIT", - "peer": true, "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } @@ -2285,7 +2285,6 @@ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.6.tgz", "integrity": "sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==", "license": "MIT", - "peer": true, "dependencies": { "@codemirror/state": "^6.5.0", "crelt": "^1.0.6", @@ -2401,6 +2400,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2442,6 +2442,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2578,6 +2579,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -2600,6 +2602,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -2716,6 +2719,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -2738,6 +2742,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -2873,6 +2878,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -2895,6 +2901,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3010,6 +3017,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3032,6 +3040,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3227,6 +3236,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3249,6 +3259,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3318,6 +3329,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3340,6 +3352,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3517,6 +3530,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3539,6 +3553,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3680,6 +3695,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3702,6 +3718,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3784,6 +3801,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3806,6 +3824,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3914,6 +3933,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3936,6 +3956,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -4011,6 +4032,7 @@ "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", "license": "MIT", + "peer": true, "dependencies": { "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", @@ -6535,7 +6557,6 @@ "integrity": "sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", @@ -6564,7 +6585,6 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -6581,7 +6601,6 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -6600,7 +6619,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -6614,7 +6632,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -6633,8 +6650,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@jest/environment-jsdom-abstract/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -6642,7 +6658,6 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -7371,15 +7386,13 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@lezer/highlight": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", "license": "MIT", - "peer": true, "dependencies": { "@lezer/common": "^1.0.0" } @@ -7389,7 +7402,6 @@ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", "license": "MIT", - "peer": true, "dependencies": { "@lezer/common": "^1.0.0" } @@ -7399,6 +7411,7 @@ "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.17.8.tgz", "integrity": "sha512-42sfdLZSCpsCYmLCjSuntuPcDg3PLbakSmmYfz5Auea8gZYLr+8SS5k647doVu0BRAecqYOytkX2QC5/u/8VHw==", "license": "MIT", + "peer": true, "dependencies": { "@floating-ui/react": "^0.26.28", "clsx": "^2.1.1", @@ -7418,6 +7431,7 @@ "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-7.17.8.tgz", "integrity": "sha512-KYog/YL83PnsMef7EZagpOFq9I2gfnK0eYSzC8YvV9Mb6t/x9InqRssGWVb0GIr+TNILpEkhKoGaSKZNy10Q1g==", "license": "MIT", + "peer": true, "dependencies": { "clsx": "^2.1.1" }, @@ -7447,6 +7461,7 @@ "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.17.8.tgz", "integrity": "sha512-96qygbkTjRhdkzd5HDU8fMziemN/h758/EwrFu7TlWrEP10Vw076u+Ap/sG6OT4RGPZYYoHrTlT+mkCZblWHuw==", "license": "MIT", + "peer": true, "peerDependencies": { "react": "^18.x || ^19.x" } @@ -7608,8 +7623,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@mdx-js/loader": { "version": "3.1.1", @@ -8631,6 +8645,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -9055,6 +9070,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -11158,6 +11174,7 @@ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -11267,6 +11284,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.24" @@ -11475,18 +11493,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.8.0" - } - }, "node_modules/@swc/jest": { "version": "0.2.39", "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.39.tgz", @@ -11505,6 +11511,12 @@ "@swc/core": "*" } }, + "node_modules/@swc/nx-darwin-arm64": { + "optional": true + }, + "node_modules/@swc/nx-linux-arm64-gnu": { + "optional": true + }, "node_modules/@swc/types": { "version": "0.1.25", "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", @@ -11530,6 +11542,7 @@ "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.35.0.tgz", "integrity": "sha512-XG7t2DYf3DyHT5jxFNp5xyLVbL4hMJYJhiSdHADzAjLRYfL7AnjlRfiHDHeXxkb2N103rEIvTsBRazxXtAUz2g==", "license": "MIT", + "peer": true, "dependencies": { "@tabler/icons": "3.35.0" }, @@ -11883,8 +11896,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -12047,6 +12059,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -12242,7 +12255,6 @@ "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", @@ -12319,6 +12331,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.0.tgz", "integrity": "sha512-5x08bUtU8hfboMTrJ7mEO4CpepS9yBwAqcL52y86SWNmbPX8LVbNs3EP4cNrIZgdjk2NAlP2ahNihozpoZIxSg==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.14.0" } @@ -12354,6 +12367,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -12365,6 +12379,7 @@ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "devOptional": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -12442,8 +12457,7 @@ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/trusted-types": { "version": "2.0.7", @@ -12545,6 +12559,7 @@ "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.1", "@typescript-eslint/types": "8.46.1", @@ -13322,6 +13337,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -13429,6 +13445,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13984,6 +14001,7 @@ "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", "dev": true, "license": "MPL-2.0", + "peer": true, "engines": { "node": ">=4" } @@ -14658,6 +14676,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -15280,6 +15299,7 @@ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -15299,7 +15319,8 @@ "version": "5.65.20", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.20.tgz", "integrity": "sha512-i5dLDDxwkFCbhjvL2pNjShsojoL3XHyDwsGv1jqETUoW+lzpBKKqNTUWgQwVAOa0tUm4BwekT455ujafi8payA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/codemirror-graphql": { "version": "2.2.4", @@ -15784,8 +15805,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -16869,8 +16889,7 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dom-converter": { "version": "0.2.0", @@ -17573,6 +17592,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -17686,6 +17706,7 @@ "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -17785,6 +17806,7 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -17893,6 +17915,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -20242,6 +20265,7 @@ "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", "license": "MIT", + "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -20268,6 +20292,7 @@ "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.2.tgz", "integrity": "sha512-E1uccsZxt/96jH/OwmLPuXMACILs76pKF2i3W861LpKBCYtGIyPQGtWLuBLkND4ox1KHns70e83PS4te50nvPQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -22584,6 +22609,7 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -22644,6 +22670,7 @@ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -23102,7 +23129,6 @@ "integrity": "sha512-zbBTiqr2Vl78pKp/laGBREYzbZx9ZtqPjOK4++lL4BNDhxRnahg51HtoDrk9/VjIy9IthNEWdKVd7H5bqBhiWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/environment-jsdom-abstract": "30.2.0", @@ -23128,7 +23154,6 @@ "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", @@ -23143,7 +23168,6 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -23160,7 +23184,6 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -23179,7 +23202,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -23193,7 +23215,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -23212,8 +23233,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-environment-jsdom/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -23221,7 +23241,6 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -23232,7 +23251,6 @@ "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" @@ -23247,7 +23265,6 @@ "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" @@ -23262,7 +23279,6 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -23302,8 +23318,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/jest-environment-jsdom/node_modules/tldts": { "version": "6.1.86", @@ -23311,7 +23326,6 @@ "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tldts-core": "^6.1.86" }, @@ -23324,8 +23338,7 @@ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-environment-jsdom/node_modules/tough-cookie": { "version": "5.1.2", @@ -23333,7 +23346,6 @@ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tldts": "^6.1.32" }, @@ -23347,7 +23359,6 @@ "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "punycode": "^2.3.1" }, @@ -23361,7 +23372,6 @@ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=12" } @@ -23372,7 +23382,6 @@ "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" @@ -23387,6 +23396,7 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -23946,6 +23956,7 @@ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -24790,6 +24801,7 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 10.16.0" } @@ -25255,7 +25267,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -31399,7 +31410,8 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/minizlib": { "version": "2.1.2", @@ -31528,6 +31540,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@inquirer/confirm": "^5.0.0", "@mswjs/interceptors": "^0.39.1", @@ -31779,6 +31792,7 @@ "resolved": "https://registry.npmjs.org/next/-/next-15.5.6.tgz", "integrity": "sha512-zTxsnI3LQo3c9HSdSf91O1jMNsEzIXDShXd4wVdg9y5shwLqBXi4ZtUUJyB86KGVSJLZx0PFONvO54aheGX8QQ==", "license": "MIT", + "peer": true, "dependencies": { "@next/env": "15.5.6", "@swc/helpers": "0.5.15", @@ -32090,8 +32104,7 @@ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/nyc": { "version": "15.1.0", @@ -33239,6 +33252,7 @@ "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-3.1.1.tgz", "integrity": "sha512-s4XPAXAZajmdpHoyPOyeL6jwPHW+tZtmbVBii9IDJbzbn7Jkp2Y9dAivJPhmh4djnWSgNE6zmd5e+Jw1f+DvBQ==", "license": "MIT", + "peer": true, "dependencies": { "@plotly/d3": "3.8.2", "@plotly/d3-sankey": "0.7.2", @@ -33357,6 +33371,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -33556,6 +33571,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -33578,6 +33594,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -33672,6 +33689,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -33694,6 +33712,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -33764,6 +33783,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -33786,6 +33806,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -34094,6 +34115,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -34116,6 +34138,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -34650,6 +34673,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -34703,6 +34727,7 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -34743,7 +34768,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -34759,7 +34783,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -34772,8 +34795,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/probe-image-size": { "version": "7.2.3", @@ -35082,6 +35104,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -35103,6 +35126,7 @@ "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.2.2.tgz", "integrity": "sha512-e+hi6axHcw9VODoeVu8WyMWyoosa1pzpyjfvrLdF7CexfU+WSGZdDuRfHa4RJgTpfv3ZjdIpHE14HpYBieHFhg==", "license": "MIT", + "peer": true, "dependencies": { "@types/hoist-non-react-statics": "^3.3.5", "hoist-non-react-statics": "^3.3.2", @@ -35162,6 +35186,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -35902,6 +35927,7 @@ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -36454,7 +36480,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/redux-persist": { "version": "6.0.0", @@ -38788,8 +38815,7 @@ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/rtl-css-js": { "version": "1.16.1", @@ -39030,6 +39056,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -39616,6 +39643,7 @@ "integrity": "sha512-JJkpcmELR8N3uM03OG7Oyi5FiCsfZAjArNANw5aR4L2NFt8vErOi3XA7AgIF7gCyPeDWAmK1NV0IlF3OZnRTtQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@storybook/global": "^5.0.0", "@testing-library/jest-dom": "^6.6.3", @@ -40124,8 +40152,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/style-to-js": { "version": "1.1.18", @@ -40540,6 +40567,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "license": "MIT", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -41003,6 +41031,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -41277,6 +41306,7 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -41367,7 +41397,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tty-browserify": { "version": "0.0.1", @@ -41536,6 +41567,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -42895,8 +42927,7 @@ "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", @@ -43091,6 +43122,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -43169,6 +43201,7 @@ "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-html-community": "0.0.8", "html-entities": "^2.1.0", diff --git a/package.json b/package.json index 836a707..f765e3c 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "@next/mdx": "^15.5.3", "@oncojs/survivalplot": "^0.8.3", "@react-spring/web": "^9.7.5", + "@sjcrh/proteinpaint-client": "2.163.1", "cookies-next": "^4.3.0", "echarts": "^5.5.1", "file-saver": "^2.0.5", diff --git a/src/features/apps/ProteinPaint.tsx b/src/features/apps/ProteinPaint.tsx index 704010f..4f678d0 100644 --- a/src/features/apps/ProteinPaint.tsx +++ b/src/features/apps/ProteinPaint.tsx @@ -1,7 +1,7 @@ -import { FC } from "react"; -import { ProteinPaintWrapper } from "../proteinpaint/ProteinPaintWrapper"; +import "react"; +import { ProteinPaintWrapper } from "@/features/proteinpaint/ProteinPaintWrapper"; -const ProteinPaintApp: FC = () => { +const ProteinPaintApp = () => { return ; }; diff --git a/src/features/proteinpaint/MatrixWrapper.tsx b/src/features/proteinpaint/MatrixWrapper.tsx index 1203045..170f890 100644 --- a/src/features/proteinpaint/MatrixWrapper.tsx +++ b/src/features/proteinpaint/MatrixWrapper.tsx @@ -285,6 +285,8 @@ export const MatrixWrapper: FC = (props: PpProps) => { }; interface MatrixArg { + dslabel?: string, + genes?: string[], holder?: HTMLElement; noheader?: boolean; nobox?: boolean; @@ -326,6 +328,8 @@ function getMatrixTrack( //genesetCallback?: () => void, ): MatrixArg { const arg: MatrixArg = { + dslabel: 'MMRF', + genes: ['MYC', 'MYCN', 'NSD2', 'KRAS'], // host in gdc is just a relative url path, // using the same domain as the GDC portal where PP is embedded host: props.basepath || (basepath as string), diff --git a/src/features/proteinpaint/ProteinPaintWrapper.tsx b/src/features/proteinpaint/ProteinPaintWrapper.tsx index b8c9eb8..2f8877f 100644 --- a/src/features/proteinpaint/ProteinPaintWrapper.tsx +++ b/src/features/proteinpaint/ProteinPaintWrapper.tsx @@ -169,6 +169,7 @@ export const ProteinPaintWrapper: FC = (props: PpProps) => { }; interface Mds3Arg { + dslabel?: string; holder?: HTMLElement; noheader?: boolean; nobox?: boolean; @@ -206,6 +207,7 @@ function getLollipopTrack( callback: SelectSamplesCallback, ) { const arg: Mds3Arg = { + dslabel: 'MMRF', // host in gdc is just a relative url path, // using the same domain as the GDC portal where PP is embedded host: props.basepath || (basepath as string), @@ -228,7 +230,7 @@ function getLollipopTrack( arg.gene2canonicalisoform = props.geneId; } else if (props.ssm_id) { arg.mds3_ssm2canonicalisoform = { - dslabel: "GDC", + dslabel: "MMRF", ssm_id: props.ssm_id, }; } else { diff --git a/src/features/proteinpaint/dev.sh b/src/features/proteinpaint/dev.sh index 8f983ca..336d87f 100755 --- a/src/features/proteinpaint/dev.sh +++ b/src/features/proteinpaint/dev.sh @@ -28,4 +28,10 @@ fi # run the following tab in a separate tab # local-ssl-proxy --config ssl-proxy.json --cert localhost.pem --key localhost-key.pem # then from the gff dir -PORT=3333 npm run dev +PROTEINPAINT_API="http://localhost:3000" PORT=3333 npm run dev +# +# OR start close all open Chrome browser windows and in macOS terminal: +# open -n /Applications/Google\ Chrome.app --args --user-data-dir="/tmp/chrome-dev-session" --disable-web-security +# +# TODO: setup and use https://localhost.dev-virtuallab.themmrf.org using local-ssl-proxy +# From b7ccefe77d1da905e6ae663a9f6bd2e2d4b974c2 Mon Sep 17 00:00:00 2001 From: siosonel Date: Tue, 2 Dec 2025 11:02:17 -0600 Subject: [PATCH 3/9] add the PROTEINPAINT_API paths for reverse proxy access in env config files --- .env.development | 1 + .env.production | 1 + 2 files changed, 2 insertions(+) diff --git a/.env.development b/.env.development index 9f93418..b66e781 100644 --- a/.env.development +++ b/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_GEN3_COMMONS_NAME=gen3 +NEXT_PUBLIC_PROTEINPAINT_API=/auth/api/custom/proteinpaint diff --git a/.env.production b/.env.production index 9f93418..b66e781 100644 --- a/.env.production +++ b/.env.production @@ -1 +1,2 @@ NEXT_PUBLIC_GEN3_COMMONS_NAME=gen3 +NEXT_PUBLIC_PROTEINPAINT_API=/auth/api/custom/proteinpaint From 0aaf0305f49f2e33dca44073202465377570d5bd Mon Sep 17 00:00:00 2001 From: siosonel Date: Tue, 2 Dec 2025 12:23:41 -0600 Subject: [PATCH 4/9] update proteinpaint-client version to 2.164.0 --- package-lock.json | 190 ++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 83 insertions(+), 109 deletions(-) diff --git a/package-lock.json b/package-lock.json index dacd7ef..49efdd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "@next/mdx": "^15.5.3", "@oncojs/survivalplot": "^0.8.3", "@react-spring/web": "^9.7.5", + "@sjcrh/proteinpaint-client": "^2.164.0", "cookies-next": "^4.3.0", "echarts": "^5.5.1", "file-saver": "^2.0.5", @@ -255,7 +256,6 @@ "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -2276,6 +2276,7 @@ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", "license": "MIT", + "peer": true, "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } @@ -2285,6 +2286,7 @@ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.6.tgz", "integrity": "sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==", "license": "MIT", + "peer": true, "dependencies": { "@codemirror/state": "^6.5.0", "crelt": "^1.0.6", @@ -2400,7 +2402,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -2442,7 +2443,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -2579,7 +2579,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -2602,7 +2601,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -2719,7 +2717,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -2742,7 +2739,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -2878,7 +2874,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -2901,7 +2896,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3017,7 +3011,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3040,7 +3033,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3236,7 +3228,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3259,7 +3250,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3329,7 +3319,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3352,7 +3341,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3530,7 +3518,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3553,7 +3540,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3695,7 +3681,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3718,7 +3703,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3801,7 +3785,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3824,7 +3807,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -3933,7 +3915,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -3956,7 +3937,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -4032,7 +4012,6 @@ "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", "license": "MIT", - "peer": true, "dependencies": { "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", @@ -6557,6 +6536,7 @@ "integrity": "sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", @@ -6585,6 +6565,7 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -6601,6 +6582,7 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -6619,6 +6601,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -6632,6 +6615,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -6650,7 +6634,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@jest/environment-jsdom-abstract/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -6658,6 +6643,7 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -7386,13 +7372,15 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@lezer/highlight": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", "license": "MIT", + "peer": true, "dependencies": { "@lezer/common": "^1.0.0" } @@ -7402,6 +7390,7 @@ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", "license": "MIT", + "peer": true, "dependencies": { "@lezer/common": "^1.0.0" } @@ -7411,7 +7400,6 @@ "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.17.8.tgz", "integrity": "sha512-42sfdLZSCpsCYmLCjSuntuPcDg3PLbakSmmYfz5Auea8gZYLr+8SS5k647doVu0BRAecqYOytkX2QC5/u/8VHw==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/react": "^0.26.28", "clsx": "^2.1.1", @@ -7431,7 +7419,6 @@ "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-7.17.8.tgz", "integrity": "sha512-KYog/YL83PnsMef7EZagpOFq9I2gfnK0eYSzC8YvV9Mb6t/x9InqRssGWVb0GIr+TNILpEkhKoGaSKZNy10Q1g==", "license": "MIT", - "peer": true, "dependencies": { "clsx": "^2.1.1" }, @@ -7461,7 +7448,6 @@ "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.17.8.tgz", "integrity": "sha512-96qygbkTjRhdkzd5HDU8fMziemN/h758/EwrFu7TlWrEP10Vw076u+Ap/sG6OT4RGPZYYoHrTlT+mkCZblWHuw==", "license": "MIT", - "peer": true, "peerDependencies": { "react": "^18.x || ^19.x" } @@ -7623,7 +7609,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@mdx-js/loader": { "version": "3.1.1", @@ -8645,7 +8632,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -9070,7 +9056,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -10577,6 +10562,12 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@sjcrh/proteinpaint-client": { + "version": "2.164.0", + "resolved": "https://registry.npmjs.org/@sjcrh/proteinpaint-client/-/proteinpaint-client-2.164.0.tgz", + "integrity": "sha512-II0+DO6OAmqeEz8slwDesG7no5+FeYJPAu/+fMAFhUwTfK3oWDgqiRXHqsc4Xl0QikziGBfG/1D3+cSKxTEC3w==", + "license": "SEE LICENSE IN ./LICENSE" + }, "node_modules/@standard-schema/spec": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", @@ -11174,7 +11165,6 @@ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -11284,7 +11274,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.24" @@ -11493,6 +11482,18 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, "node_modules/@swc/jest": { "version": "0.2.39", "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.39.tgz", @@ -11511,12 +11512,6 @@ "@swc/core": "*" } }, - "node_modules/@swc/nx-darwin-arm64": { - "optional": true - }, - "node_modules/@swc/nx-linux-arm64-gnu": { - "optional": true - }, "node_modules/@swc/types": { "version": "0.1.25", "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", @@ -11542,7 +11537,6 @@ "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.35.0.tgz", "integrity": "sha512-XG7t2DYf3DyHT5jxFNp5xyLVbL4hMJYJhiSdHADzAjLRYfL7AnjlRfiHDHeXxkb2N103rEIvTsBRazxXtAUz2g==", "license": "MIT", - "peer": true, "dependencies": { "@tabler/icons": "3.35.0" }, @@ -11896,7 +11890,8 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -12059,7 +12054,6 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -12255,6 +12249,7 @@ "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", @@ -12331,7 +12326,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.0.tgz", "integrity": "sha512-5x08bUtU8hfboMTrJ7mEO4CpepS9yBwAqcL52y86SWNmbPX8LVbNs3EP4cNrIZgdjk2NAlP2ahNihozpoZIxSg==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.14.0" } @@ -12367,7 +12361,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -12379,7 +12372,6 @@ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "devOptional": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -12457,7 +12449,8 @@ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/trusted-types": { "version": "2.0.7", @@ -12559,7 +12552,6 @@ "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.1", "@typescript-eslint/types": "8.46.1", @@ -13337,7 +13329,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -13445,7 +13436,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14001,7 +13991,6 @@ "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", "dev": true, "license": "MPL-2.0", - "peer": true, "engines": { "node": ">=4" } @@ -14676,7 +14665,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -15299,7 +15287,6 @@ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -15319,8 +15306,7 @@ "version": "5.65.20", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.20.tgz", "integrity": "sha512-i5dLDDxwkFCbhjvL2pNjShsojoL3XHyDwsGv1jqETUoW+lzpBKKqNTUWgQwVAOa0tUm4BwekT455ujafi8payA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/codemirror-graphql": { "version": "2.2.4", @@ -15805,7 +15791,8 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -16889,7 +16876,8 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/dom-converter": { "version": "0.2.0", @@ -17592,7 +17580,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -17706,7 +17693,6 @@ "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -17806,7 +17792,6 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -17915,7 +17900,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -20265,7 +20249,6 @@ "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", "license": "MIT", - "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -20292,7 +20275,6 @@ "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.2.tgz", "integrity": "sha512-E1uccsZxt/96jH/OwmLPuXMACILs76pKF2i3W861LpKBCYtGIyPQGtWLuBLkND4ox1KHns70e83PS4te50nvPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -22609,7 +22591,6 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -22670,7 +22651,6 @@ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -23129,6 +23109,7 @@ "integrity": "sha512-zbBTiqr2Vl78pKp/laGBREYzbZx9ZtqPjOK4++lL4BNDhxRnahg51HtoDrk9/VjIy9IthNEWdKVd7H5bqBhiWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/environment-jsdom-abstract": "30.2.0", @@ -23154,6 +23135,7 @@ "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", @@ -23168,6 +23150,7 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -23184,6 +23167,7 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -23202,6 +23186,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -23215,6 +23200,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -23233,7 +23219,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-environment-jsdom/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -23241,6 +23228,7 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -23251,6 +23239,7 @@ "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" @@ -23265,6 +23254,7 @@ "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" @@ -23279,6 +23269,7 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -23318,7 +23309,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/jest-environment-jsdom/node_modules/tldts": { "version": "6.1.86", @@ -23326,6 +23318,7 @@ "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "tldts-core": "^6.1.86" }, @@ -23338,7 +23331,8 @@ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-environment-jsdom/node_modules/tough-cookie": { "version": "5.1.2", @@ -23346,6 +23340,7 @@ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "tldts": "^6.1.32" }, @@ -23359,6 +23354,7 @@ "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "punycode": "^2.3.1" }, @@ -23372,6 +23368,7 @@ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=12" } @@ -23382,6 +23379,7 @@ "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" @@ -23396,7 +23394,6 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -23956,7 +23953,6 @@ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -24801,7 +24797,6 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 10.16.0" } @@ -25267,6 +25262,7 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -31410,8 +31406,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/minizlib": { "version": "2.1.2", @@ -31540,7 +31535,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "@inquirer/confirm": "^5.0.0", "@mswjs/interceptors": "^0.39.1", @@ -31792,7 +31786,6 @@ "resolved": "https://registry.npmjs.org/next/-/next-15.5.6.tgz", "integrity": "sha512-zTxsnI3LQo3c9HSdSf91O1jMNsEzIXDShXd4wVdg9y5shwLqBXi4ZtUUJyB86KGVSJLZx0PFONvO54aheGX8QQ==", "license": "MIT", - "peer": true, "dependencies": { "@next/env": "15.5.6", "@swc/helpers": "0.5.15", @@ -32104,7 +32097,8 @@ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/nyc": { "version": "15.1.0", @@ -33252,7 +33246,6 @@ "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-3.1.1.tgz", "integrity": "sha512-s4XPAXAZajmdpHoyPOyeL6jwPHW+tZtmbVBii9IDJbzbn7Jkp2Y9dAivJPhmh4djnWSgNE6zmd5e+Jw1f+DvBQ==", "license": "MIT", - "peer": true, "dependencies": { "@plotly/d3": "3.8.2", "@plotly/d3-sankey": "0.7.2", @@ -33371,7 +33364,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -33571,7 +33563,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -33594,7 +33585,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -33689,7 +33679,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -33712,7 +33701,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -33783,7 +33771,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -33806,7 +33793,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -34115,7 +34101,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -34138,7 +34123,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -34673,7 +34657,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -34727,7 +34710,6 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -34768,6 +34750,7 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -34783,6 +34766,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -34795,7 +34779,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/probe-image-size": { "version": "7.2.3", @@ -35104,7 +35089,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -35126,7 +35110,6 @@ "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.2.2.tgz", "integrity": "sha512-e+hi6axHcw9VODoeVu8WyMWyoosa1pzpyjfvrLdF7CexfU+WSGZdDuRfHa4RJgTpfv3ZjdIpHE14HpYBieHFhg==", "license": "MIT", - "peer": true, "dependencies": { "@types/hoist-non-react-statics": "^3.3.5", "hoist-non-react-statics": "^3.3.2", @@ -35186,7 +35169,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -35927,7 +35909,6 @@ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -36480,8 +36461,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/redux-persist": { "version": "6.0.0", @@ -38815,7 +38795,8 @@ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/rtl-css-js": { "version": "1.16.1", @@ -39056,7 +39037,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -39643,7 +39623,6 @@ "integrity": "sha512-JJkpcmELR8N3uM03OG7Oyi5FiCsfZAjArNANw5aR4L2NFt8vErOi3XA7AgIF7gCyPeDWAmK1NV0IlF3OZnRTtQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@storybook/global": "^5.0.0", "@testing-library/jest-dom": "^6.6.3", @@ -40152,7 +40131,8 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/style-to-js": { "version": "1.1.18", @@ -40567,7 +40547,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -41031,7 +41010,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -41306,7 +41284,6 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -41397,8 +41374,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tty-browserify": { "version": "0.0.1", @@ -41567,7 +41543,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -42927,7 +42902,8 @@ "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", @@ -43122,7 +43098,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -43201,7 +43176,6 @@ "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-html-community": "0.0.8", "html-entities": "^2.1.0", diff --git a/package.json b/package.json index f765e3c..12541b0 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@next/mdx": "^15.5.3", "@oncojs/survivalplot": "^0.8.3", "@react-spring/web": "^9.7.5", - "@sjcrh/proteinpaint-client": "2.163.1", + "@sjcrh/proteinpaint-client": "2.164.0", "cookies-next": "^4.3.0", "echarts": "^5.5.1", "file-saver": "^2.0.5", From 33d9bde2122543797f1e315aa0de7a36cb907cf3 Mon Sep 17 00:00:00 2001 From: siosonel Date: Wed, 3 Dec 2025 15:37:37 -0600 Subject: [PATCH 5/9] fix type issues --- src/features/proteinpaint/MatrixWrapper.tsx | 2 +- src/features/proteinpaint/ProteinPaintWrapper.tsx | 2 +- src/features/proteinpaint/sjpp-types.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/features/proteinpaint/MatrixWrapper.tsx b/src/features/proteinpaint/MatrixWrapper.tsx index 170f890..76ebfad 100644 --- a/src/features/proteinpaint/MatrixWrapper.tsx +++ b/src/features/proteinpaint/MatrixWrapper.tsx @@ -1,4 +1,4 @@ -import { useRef, useCallback, useState, FC } from "react"; +import React, { useRef, useCallback, useState, FC } from "react"; import { useDeepCompareEffect } from "use-deep-compare"; import { bindProteinPaint } from "@sjcrh/proteinpaint-client"; import { useIsDemoApp } from "@/hooks/useIsDemoApp"; diff --git a/src/features/proteinpaint/ProteinPaintWrapper.tsx b/src/features/proteinpaint/ProteinPaintWrapper.tsx index 2f8877f..7c70e79 100644 --- a/src/features/proteinpaint/ProteinPaintWrapper.tsx +++ b/src/features/proteinpaint/ProteinPaintWrapper.tsx @@ -1,4 +1,4 @@ -import { useRef, useCallback, useState, FC } from "react"; +import React, { useRef, useCallback, useState, FC } from "react"; import { useDeepCompareEffect } from "use-deep-compare"; import { bindProteinPaint } from "@sjcrh/proteinpaint-client"; import { useIsDemoApp } from "@/hooks/useIsDemoApp"; diff --git a/src/features/proteinpaint/sjpp-types.tsx b/src/features/proteinpaint/sjpp-types.tsx index c36a96e..e1cd681 100644 --- a/src/features/proteinpaint/sjpp-types.tsx +++ b/src/features/proteinpaint/sjpp-types.tsx @@ -1,4 +1,4 @@ -import { FilterSet } from "@gff/core"; +import { FilterSet } from "@gen3/core"; export interface PpApi { update(arg: any): null; From fe99aeeb4ecf65efdd6344a51e491845ceb71994 Mon Sep 17 00:00:00 2001 From: siosonel Date: Wed, 3 Dec 2025 16:57:21 -0600 Subject: [PATCH 6/9] update proteinpaint-client to 2.164.1; fix more type issues related to PP and OncoMatrix tools --- package-lock.json | 8 ++++---- package.json | 2 +- src/features/proteinpaint/MatrixWrapper.tsx | 6 +++--- src/features/proteinpaint/ProteinPaintWrapper.tsx | 2 +- src/features/proteinpaint/sjpp-types.tsx | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49efdd7..9e400dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "@next/mdx": "^15.5.3", "@oncojs/survivalplot": "^0.8.3", "@react-spring/web": "^9.7.5", - "@sjcrh/proteinpaint-client": "^2.164.0", + "@sjcrh/proteinpaint-client": "^2.164.1", "cookies-next": "^4.3.0", "echarts": "^5.5.1", "file-saver": "^2.0.5", @@ -10563,9 +10563,9 @@ } }, "node_modules/@sjcrh/proteinpaint-client": { - "version": "2.164.0", - "resolved": "https://registry.npmjs.org/@sjcrh/proteinpaint-client/-/proteinpaint-client-2.164.0.tgz", - "integrity": "sha512-II0+DO6OAmqeEz8slwDesG7no5+FeYJPAu/+fMAFhUwTfK3oWDgqiRXHqsc4Xl0QikziGBfG/1D3+cSKxTEC3w==", + "version": "2.164.1", + "resolved": "https://registry.npmjs.org/@sjcrh/proteinpaint-client/-/proteinpaint-client-2.164.1.tgz", + "integrity": "sha512-Wm9EkdOWZbLTrJteyJ9udTLsWUB+9AVx+vrpG+2xEBdgTnZfF+XgxADqSYspDliGs1254SBRL46e2uiM4za9VA==", "license": "SEE LICENSE IN ./LICENSE" }, "node_modules/@standard-schema/spec": { diff --git a/package.json b/package.json index 12541b0..3a78a4e 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@next/mdx": "^15.5.3", "@oncojs/survivalplot": "^0.8.3", "@react-spring/web": "^9.7.5", - "@sjcrh/proteinpaint-client": "2.164.0", + "@sjcrh/proteinpaint-client": "^2.164.1", "cookies-next": "^4.3.0", "echarts": "^5.5.1", "file-saver": "^2.0.5", diff --git a/src/features/proteinpaint/MatrixWrapper.tsx b/src/features/proteinpaint/MatrixWrapper.tsx index 76ebfad..6fc0401 100644 --- a/src/features/proteinpaint/MatrixWrapper.tsx +++ b/src/features/proteinpaint/MatrixWrapper.tsx @@ -220,10 +220,10 @@ export const MatrixWrapper: FC = (props: PpProps) => { return prevData.current != data; }, }) - .then?.((_app) => { + .then?.((_app: any) => { toolApp.current = _app; }) - .catch((e) => { + .catch((e: any) => { // the app should either work or display an error in a red banner within the tool container div, // this uncaught-by-app error is unlikely to happen except for bundling issues that are not detected at build time console.error(e); @@ -242,7 +242,7 @@ export const MatrixWrapper: FC = (props: PpProps) => { [filter0, userDetails, /*geneDetailData*/], ); - const divRef = useRef(null); + const divRef = useRef(null); // const updateFilters = (field: string, operation: Operation) => { // dispatch(hideModal()); diff --git a/src/features/proteinpaint/ProteinPaintWrapper.tsx b/src/features/proteinpaint/ProteinPaintWrapper.tsx index 7c70e79..2a973dd 100644 --- a/src/features/proteinpaint/ProteinPaintWrapper.tsx +++ b/src/features/proteinpaint/ProteinPaintWrapper.tsx @@ -144,7 +144,7 @@ export const ProteinPaintWrapper: FC = (props: PpProps) => { ], ); - const divRef = useRef(null); + const divRef = useRef(null); const demoText = props.hardcodeCnvOnly ? "Demo showing MYC CNV segments from all GDC cases" : "Demo showing MYC mutations from all GDC cases."; diff --git a/src/features/proteinpaint/sjpp-types.tsx b/src/features/proteinpaint/sjpp-types.tsx index e1cd681..af29376 100644 --- a/src/features/proteinpaint/sjpp-types.tsx +++ b/src/features/proteinpaint/sjpp-types.tsx @@ -7,7 +7,7 @@ export interface PpApi { } export type SampleData = { - "cases.case_id"?: string; + "cases.case_id": string; }; export interface SelectSamplesCallBackArg { @@ -32,7 +32,7 @@ export interface SelectSamples { export function getFilters(arg: SelectSamplesCallBackArg): FilterSet { const { samples } = arg; // see comments below about SV-2228 - const ids = samples.map((d) => d["cases.case_id"]).filter((d) => d && true); + const ids: (string | number)[] = samples.map((d) => d["cases.case_id"]).filter((d) => typeof d === 'string' || typeof d === 'number'); return { mode: "and", root: { From 271fc44326b2a40fea4567a9cf5ef7d4911f65e6 Mon Sep 17 00:00:00 2001 From: siosonel Date: Wed, 3 Dec 2025 17:12:32 -0600 Subject: [PATCH 7/9] fix the react import in ProteinPaint and OncoMatrix apps --- src/features/apps/OncoMatrix.tsx | 4 ++-- src/features/apps/ProteinPaint.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/features/apps/OncoMatrix.tsx b/src/features/apps/OncoMatrix.tsx index c386c45..e609ae4 100644 --- a/src/features/apps/OncoMatrix.tsx +++ b/src/features/apps/OncoMatrix.tsx @@ -1,7 +1,7 @@ -import { FC } from "react"; +import React from "react"; import { MatrixWrapper } from "../proteinpaint/MatrixWrapper"; -const MatrixApp: FC = () => { +const MatrixApp: React.FC = () => { return ; }; diff --git a/src/features/apps/ProteinPaint.tsx b/src/features/apps/ProteinPaint.tsx index 4f678d0..b326bf0 100644 --- a/src/features/apps/ProteinPaint.tsx +++ b/src/features/apps/ProteinPaint.tsx @@ -1,7 +1,7 @@ -import "react"; +import React from "react"; import { ProteinPaintWrapper } from "@/features/proteinpaint/ProteinPaintWrapper"; -const ProteinPaintApp = () => { +const ProteinPaintApp: React.FC = () => { return ; }; From 111e0fc48adda748d1605b9b2eec5f84c94838ca Mon Sep 17 00:00:00 2001 From: siosonel Date: Thu, 4 Dec 2025 18:59:42 -0800 Subject: [PATCH 8/9] compute filter0 in PP and OncoMatrix tools --- src/features/proteinpaint/MatrixWrapper.tsx | 32 +++++++++---------- .../proteinpaint/ProteinPaintWrapper.tsx | 18 +++++------ 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/features/proteinpaint/MatrixWrapper.tsx b/src/features/proteinpaint/MatrixWrapper.tsx index 6fc0401..484f74c 100644 --- a/src/features/proteinpaint/MatrixWrapper.tsx +++ b/src/features/proteinpaint/MatrixWrapper.tsx @@ -4,7 +4,6 @@ import { bindProteinPaint } from "@sjcrh/proteinpaint-client"; import { useIsDemoApp } from "@/hooks/useIsDemoApp"; import { useCoreSelector, - selectCurrentCohortFilters, convertFilterSetToGqlFilter as buildCohortGqlOperator, FilterSet, //PROTEINPAINT_API, @@ -19,6 +18,8 @@ import { Modals, selectCurrentModal, } from "@gen3/core"; +import { joinFilters, selectCurrentCohortCaseFilters } from "@/core/utils"; +import { DEMO_COHORT_FILTERS } from "./constants"; import { DemoText } from "@/components/tailwindComponents"; import { LoadingOverlay } from "@mantine/core"; import { @@ -32,6 +33,7 @@ import { import { isEqual, cloneDeep } from "lodash"; //import { cohortActionsHooks } from "../cohortBuilder/CohortManager/cohortActionHooks"; //import { INVALID_COHORT_NAMES } from "../cohortBuilder/utils"; +import { COHORT_FILTER_INDEX } from '@/core'; const basepath = 'http://localhost:3000' // PROTEINPAINT_API; @@ -40,24 +42,20 @@ interface PpProps { basepath?: string; } -export const demoFilter = Object.freeze({ - op: "in", - content: Object.freeze({ - field: "cases.disease_type", - value: Object.freeze(["Gliomas"]), - }), -}); +// export const demoFilter = Object.freeze({ +// op: "in", +// content: Object.freeze({ +// field: "cases.disease_type", +// value: Object.freeze(["Gliomas"]), +// }), +// }); export const MatrixWrapper: FC = (props: PpProps) => { const isDemoMode = useIsDemoApp(); - // const demoFilter = { - // op: "in", - // content: { field: "cases.disease_type", value: ["Gliomas"] }, - // }; - const currentCohort = useCoreSelector(selectCurrentCohortFilters); - const filter0 = null // isDemoMode - // ? cloneDeep(demoFilter) - // : buildCohortGqlOperator(currentCohort); + const currentCohort = useCoreSelector((state) => + selectCurrentCohortCaseFilters(state, COHORT_FILTER_INDEX), + ); + const filter0 = isDemoMode ? null : buildCohortGqlOperator(currentCohort); const userDetails = useFetchUserDetailsQuery(); const prevData = useRef(); const toolApp = useRef(); @@ -251,7 +249,7 @@ export const MatrixWrapper: FC = (props: PpProps) => { const existingFiltersHook = () => null; return (
- {isDemoMode && Demo showing cases with Gliomas.} + {isDemoMode && Showing cases in demo cohort.}
= (props: PpProps) => { const isDemoMode = useIsDemoApp(); - const currentCohort = useCoreSelector(selectCurrentCohortFilters); - - // const cohortFilters = useCoreSelector((state) => - // isDemoMode ? DEMO_COHORT_FILTERS : selectCurrentCohortFilters(state), - // ); - - const filter0 = null // isDemoMode ? null : buildCohortGqlOperator(currentCohort); + const currentCohort = useCoreSelector((state) => + selectCurrentCohortCaseFilters(state, COHORT_FILTER_INDEX), + ); + const filter0 = isDemoMode ? null : buildCohortGqlOperator(currentCohort); const userDetails = useFetchUserDetailsQuery(); // to track reusable instance for mds3 skewer track From 41c61ead26aea5b8053b249cd0e83369e8d3f692 Mon Sep 17 00:00:00 2001 From: siosonel Date: Thu, 4 Dec 2025 19:07:54 -0800 Subject: [PATCH 9/9] track proteinpaint constants --- src/features/proteinpaint/constants.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/features/proteinpaint/constants.ts diff --git a/src/features/proteinpaint/constants.ts b/src/features/proteinpaint/constants.ts new file mode 100644 index 0000000..9478ba8 --- /dev/null +++ b/src/features/proteinpaint/constants.ts @@ -0,0 +1,12 @@ +import { FilterSet } from "@gen3/core"; + +export const DEMO_COHORT_FILTERS: FilterSet = { + mode: "and", + root: { + "cases.project.project_id": { + operator: "includes", + field: "cases.project.project_id", + operands: ["TCGA-LGG"], + }, + }, +};