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({
}}
>