@@ -37,6 +37,7 @@ import CopyToClipboard from 'components/common/CopyToClipboard';
3737import MaterialTable from 'components/common/DenseMaterialTable' ;
3838import ListStatusIcon from 'components/common/icons/ListStatusIcon' ;
3939import ScienceIcon from 'components/common/icons/ScienceIcon' ;
40+ import RoleBasedLink from 'components/common/RoleBasedLink' ;
4041import UOLoader from 'components/common/UOLoader' ;
4142import AssignProposalsToFaps from 'components/fap/Proposals/ProposalsView/AssignProposalsToFaps' ;
4243import AssignProposalsToInstruments from 'components/instrument/AssignProposalsToInstruments' ;
@@ -68,6 +69,7 @@ import { useDownloadPDFProposal } from 'hooks/proposal/useDownloadPDFProposal';
6869import { useDownloadProposalAttachment } from 'hooks/proposal/useDownloadProposalAttachment' ;
6970import { useDownloadXLSXProposal } from 'hooks/proposal/useDownloadXLSXProposal' ;
7071import { ProposalViewData } from 'hooks/proposal/useProposalsCoreData' ;
72+ import { fromArrayToCommaSeparatedLinks } from 'utils/fromArrayToCommaSeparatedLinks' ;
7173import {
7274 addColumns ,
7375 fromArrayToCommaSeparated ,
@@ -130,9 +132,17 @@ let columns: Column<ProposalViewData>[] = [
130132 sorting : false ,
131133 emptyValue : '-' ,
132134 render : ( proposalView ) =>
133- proposalView . principalInvestigator ?. lastname
134- ? `${ proposalView . principalInvestigator . lastname } , ${ getPreferredName ( proposalView . principalInvestigator ) } `
135- : '' ,
135+ proposalView . principalInvestigator ?. lastname ? (
136+ < RoleBasedLink
137+ roleRoutes = { {
138+ [ UserRole . USER_OFFICER ] : `/People/${ proposalView . principalInvestigator . id } ` ,
139+ } }
140+ >
141+ { `${ proposalView . principalInvestigator . lastname } , ${ getPreferredName ( proposalView . principalInvestigator ) } ` }
142+ </ RoleBasedLink >
143+ ) : (
144+ ''
145+ ) ,
136146 } ,
137147 {
138148 title : 'PI Email' ,
@@ -157,6 +167,15 @@ let columns: Column<ProposalViewData>[] = [
157167 {
158168 title : 'Call' ,
159169 field : 'callShortCode' ,
170+ // No per-call route exists, so officers link to the Calls list page.
171+ render : ( rowData ) =>
172+ rowData . callShortCode ? (
173+ < RoleBasedLink roleRoutes = { { [ UserRole . USER_OFFICER ] : '/Calls' } } >
174+ { rowData . callShortCode }
175+ </ RoleBasedLink >
176+ ) : (
177+ ''
178+ ) ,
160179 } ,
161180] ;
162181
@@ -200,10 +219,17 @@ const instrumentManagementColumns = (
200219 {
201220 title : t ( 'instrument' ) ,
202221 field : 'instruments.name' ,
222+ // No per-instrument route exists, so officers link to the Instruments list page.
223+
203224 render : ( rowData : ProposalViewData ) =>
204- fromArrayToCommaSeparated (
205- rowData . instruments ?. map ( ( instrument ) => instrument . name )
225+ fromArrayToCommaSeparatedLinks (
226+ rowData . instruments ?. map ( ( instrument ) => ( {
227+ key : instrument . id ,
228+ label : instrument . name ,
229+ roleRoutes : { [ UserRole . USER_OFFICER ] : '/Instruments' } ,
230+ } ) )
206231 ) ,
232+
207233 customFilterAndSearch : ( ) => true ,
208234 } ,
209235] ;
@@ -223,7 +249,13 @@ const fapReviewColumns = (t: TFunction<'translation', undefined>) => [
223249 title : t ( 'FAP' ) ,
224250 field : 'faps.code' ,
225251 render : ( rowData : ProposalViewData ) =>
226- fromArrayToCommaSeparated ( rowData . faps ?. map ( ( fap ) => fap . code ) ) ,
252+ fromArrayToCommaSeparatedLinks (
253+ rowData . faps ?. map ( ( fap ) => ( {
254+ key : fap . id ,
255+ label : fap . code ,
256+ roleRoutes : { [ UserRole . USER_OFFICER ] : `/FapPage/${ fap . id } ` } ,
257+ } ) )
258+ ) ,
227259 } ,
228260] ;
229261const SELECT_ALL_ACTION_TOOLTIP = 'select-all-prefetched-proposals' ;
0 commit comments