From 55be033f3b67bafeaf4fbb21e6af19fd3fc751a1 Mon Sep 17 00:00:00 2001 From: Thomas Cottee Meldrum Date: Thu, 21 May 2026 11:48:07 +0100 Subject: [PATCH 1/2] fix: update proposals and assignment columns --- .../FapProposalsAndAssignmentsTable.tsx | 41 ++++++++++++++++++- .../src/graphql/fap/getFapProposals.graphql | 3 ++ apps/frontend/src/utils/user.ts | 12 ++++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/components/fap/Proposals/FapProposalsAndAssignmentsTable.tsx b/apps/frontend/src/components/fap/Proposals/FapProposalsAndAssignmentsTable.tsx index f44fcc1582..56fc07a4ca 100644 --- a/apps/frontend/src/components/fap/Proposals/FapProposalsAndAssignmentsTable.tsx +++ b/apps/frontend/src/components/fap/Proposals/FapProposalsAndAssignmentsTable.tsx @@ -44,7 +44,7 @@ import { standardDeviation, } from 'utils/mathFunctions'; import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; -import { getFullUserName } from 'utils/user'; +import { getFullUserName, getUserPreferredName } from 'utils/user'; import withConfirm, { WithConfirmType } from 'utils/withConfirm'; type ProposalReview = { @@ -101,6 +101,18 @@ const FapProposalColumns: Column[] = [ title: 'Title', field: 'proposal.title', }, + { + title: 'Principal Investigator', + render: (rowData) => { + return getUserPreferredName(rowData.proposal.proposer); + }, + customSort(a, b) { + const name1 = getUserPreferredName(a.proposal.proposer); + const name2 = getUserPreferredName(b.proposal.proposer); + + return name1 < name2 ? -1 : 1; + }, + }, { title: 'Status', field: 'proposal.status.name', @@ -112,6 +124,8 @@ const FapProposalColumns: Column[] = [ { title: 'Reviewers', render: (data) => data.assignments?.length, + customSort: (a, b) => + (a.assignments?.length || 0) - (b.assignments?.length || 0), }, { title: 'Reviews', @@ -125,6 +139,29 @@ const FapProposalColumns: Column[] = [ return totalReviews === 0 ? '-' : `${countReviews} / ${totalReviews}`; }, + customSort: (a, b) => { + const totalReviewsA = a.assignments?.length || 0; + const totalReviewsB = b.assignments?.length || 0; + const gradedProposalsA = + a.assignments?.filter( + (assignment) => + assignment.review !== null && assignment.review.grade !== null + ).length || 0; + const gradedProposalsB = + b.assignments?.filter( + (assignment) => + assignment.review !== null && assignment.review.grade !== null + ).length || 0; + + const incompleteReviewsA = totalReviewsA - gradedProposalsA; + const incompleteReviewsB = totalReviewsB - gradedProposalsB; + + if (incompleteReviewsA === incompleteReviewsB) { + return totalReviewsB - totalReviewsA; + } + + return incompleteReviewsA - incompleteReviewsB; + }, }, { title: 'Average grade', @@ -796,6 +833,8 @@ const FapProposalsAndAssignmentsTable = ({ ]} actions={tableActions} options={{ + columnsButton: true, + defaultExpanded: true, search: true, selection: true, pageSize: pageSize ? +pageSize : Math.min(10, maxPageLength), diff --git a/apps/frontend/src/graphql/fap/getFapProposals.graphql b/apps/frontend/src/graphql/fap/getFapProposals.graphql index df706d1f6d..5d9754d262 100644 --- a/apps/frontend/src/graphql/fap/getFapProposals.graphql +++ b/apps/frontend/src/graphql/fap/getFapProposals.graphql @@ -11,6 +11,9 @@ query getFapProposals($fapId: Int!, $callId: Int, $instrumentId: Int, $legacy: B proposalId proposer { id + firstname + lastname + preferredname institutionId } status { diff --git a/apps/frontend/src/utils/user.ts b/apps/frontend/src/utils/user.ts index e9c70da343..ca1844325b 100644 --- a/apps/frontend/src/utils/user.ts +++ b/apps/frontend/src/utils/user.ts @@ -5,6 +5,18 @@ export const getFullUserName = ( user?: Pick | null ): string => (user ? `${user.firstname} ${user.lastname}` : 'None'); +export const getUserPreferredName = ( + user?: Pick< + BasicUserDetails, + 'firstname' | 'lastname' | 'preferredname' + > | null +): string => + user + ? user.preferredname + ? `${user.preferredname} ${user.lastname}` + : `${user.firstname} ${user.lastname}` + : 'None'; + export const getFullUserNameWithEmail = ( user?: Pick< BasicUserDetails, From 3bd7233c17637c25daaf39649d929ef385519d81 Mon Sep 17 00:00:00 2001 From: Thomas Cottee Meldrum Date: Mon, 22 Jun 2026 15:08:37 +0100 Subject: [PATCH 2/2] remove default expanded --- .../Proposals/ProposalsView/FapProposalsAndAssignmentsTable.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/frontend/src/components/fap/Proposals/ProposalsView/FapProposalsAndAssignmentsTable.tsx b/apps/frontend/src/components/fap/Proposals/ProposalsView/FapProposalsAndAssignmentsTable.tsx index 52156ed32d..597fa7dc1e 100644 --- a/apps/frontend/src/components/fap/Proposals/ProposalsView/FapProposalsAndAssignmentsTable.tsx +++ b/apps/frontend/src/components/fap/Proposals/ProposalsView/FapProposalsAndAssignmentsTable.tsx @@ -492,7 +492,6 @@ const FapProposalsAndAssignmentsTable = ({ actions={tableActions} options={{ columnsButton: true, - defaultExpanded: true, search: true, selection: true, pageSize: pageSize ? +pageSize : Math.min(10, maxPageLength),