From 6543fadf5d6a857fc2f423cd7c13474fa2d850d9 Mon Sep 17 00:00:00 2001 From: Shivam K <292110273+shivoomiess@users.noreply.github.com> Date: Wed, 22 Jul 2026 13:27:10 +0200 Subject: [PATCH 1/2] fix: deep link to a particular proposal view doesn't show proposal details --- .../proposal/ProposalTableOfficer.tsx | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/apps/frontend/src/components/proposal/ProposalTableOfficer.tsx b/apps/frontend/src/components/proposal/ProposalTableOfficer.tsx index 86ecbd969f..edb80dc2ab 100644 --- a/apps/frontend/src/components/proposal/ProposalTableOfficer.tsx +++ b/apps/frontend/src/components/proposal/ProposalTableOfficer.tsx @@ -812,12 +812,23 @@ const ProposalTableOfficer = ({ const reviewModal = searchParams.get('reviewModal'); const proposalId = searchParams.get('proposalId'); + const parsedReviewModalPk = reviewModal != null ? parseInt(reviewModal) : NaN; + const reviewModalPk = Number.isInteger(parsedReviewModalPk) + ? parsedReviewModalPk + : null; + + // when we receive a link redirect, this table may not have the proposal data const proposalToReview = tableData.find( (proposal) => - (reviewModal != null && proposal.primaryKey === +reviewModal) || + (reviewModalPk != null && proposal.primaryKey === reviewModalPk) || (proposalId != null && proposal.proposalId === proposalId) ); + // The proposal can live outside the currently loaded page of results, so fall + // back to the primary key from the URL. ProposalReviewContent fetches the + // proposal by primary key itself, it does not rely on the table data. + const proposalPkToReview = proposalToReview?.primaryKey ?? reviewModalPk; + const userOfficerProposalReviewTabs = [ PROPOSAL_MODAL_TAB_NAMES.PROPOSAL_INFORMATION, ...(isTechnicalReviewEnabled @@ -1255,8 +1266,12 @@ const ProposalTableOfficer = ({ handleClose={handleClose} /> { const from = searchParams.get('from'); @@ -1287,7 +1302,7 @@ const ProposalTableOfficer = ({ }} > From 9c0e0cc1e1a250803845699641881730995b87a5 Mon Sep 17 00:00:00 2001 From: Shivam K <292110273+shivoomiess@users.noreply.github.com> Date: Wed, 22 Jul 2026 14:37:01 +0200 Subject: [PATCH 2/2] fix: Deep Links to Experiments --- .../experiment/ExperimentsTable.tsx | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/apps/frontend/src/components/experiment/ExperimentsTable.tsx b/apps/frontend/src/components/experiment/ExperimentsTable.tsx index 5972dbdacb..a1b01c32af 100644 --- a/apps/frontend/src/components/experiment/ExperimentsTable.tsx +++ b/apps/frontend/src/components/experiment/ExperimentsTable.tsx @@ -52,7 +52,7 @@ const RowActionButtons = (rowData: Experiment) => { data-cy="view-experiment" onClick={() => { setSearchParams((searchParams) => { - searchParams.set('experiment', rowData.experimentId.toString()); + searchParams.set('experiment', rowData.experimentPk.toString()); return searchParams; }); @@ -98,7 +98,12 @@ export default function ExperimentsTable({ const search = searchParams.get('search'); const page = searchParams.get('page'); const pageSize = searchParams.get('pageSize'); - const selectedExperimentId = searchParams.get('experiment'); + const selectedExperimentPk = searchParams.get('experiment'); + const parsedExperimentPk = + selectedExperimentPk !== null ? parseInt(selectedExperimentPk) : NaN; + const experimentPkFromUrl = Number.isInteger(parsedExperimentPk) + ? parsedExperimentPk + : null; const refreshTableData = () => { tableRef.current?.onQueryChange({}); }; @@ -108,11 +113,15 @@ export default function ExperimentsTable({ React.useEffect(() => { setSelectedExperiment( tableData.find( - (experiment) => - experiment.experimentId.toString() == selectedExperimentId + (experiment) => experiment.experimentPk === experimentPkFromUrl ) ); - }, [selectedExperimentId, tableData]); + }, [experimentPkFromUrl, tableData]); + + // the experiment can live outside the currently loaded page of results (e.g. a + // deep link), in which case ExperimentReviewContent fetches it by primary key + const experimentPkToReview = + selectedExperiment?.experimentPk ?? experimentPkFromUrl; React.useEffect(() => { if (isFirstRender.current) { @@ -463,10 +472,14 @@ export default function ExperimentsTable({ }} /> - {selectedExperiment && ( + {experimentPkToReview !== null && ( { setSearchParams((searchParams) => { searchParams.delete('experiment'); @@ -476,7 +489,7 @@ export default function ExperimentsTable({ }} >