Skip to content

Commit 79293cf

Browse files
feat: add deposition information to dataset metadata display (#1873)
* feat: add deposition fields to GraphQL queries - Add title field to dataset deposition query - Add id and title fields to run deposition query - Enables displaying deposition information in metadata tables 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * feat: add deposition-related translation keys - Add additionalContributions translation - Add originalDepositionId translation - Add originalDepositionName translation - Support new deposition metadata display labels 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * feat: add deposition info to dataset metadata table - Add original deposition name with link to deposition page - Add original deposition ID with proper formatting - Add additional contributions list with deposition links - Enhance metadata table with deposition-related information 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * feat: add deposition queries for additional contributions Add GraphQL queries to fetch depositions that contribute to datasets/runs through annotations, tomograms, or direct dataset associations. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * feat: process additional contributing depositions in hooks Extract and filter additional contributing depositions from GraphQL data, excluding original deposition and returning sorted unique IDs. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * feat: display dynamic additional contributions in metadata Replace hardcoded deposition IDs with dynamic data from hooks in DatasetMetadataTable and pass through DatasetMetadataDrawer and RunMetadataDrawer components. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * fix: handle when id is undefined * refactor: extract additional contributing depositions logic to utility function Extract duplicate logic for getting additional contributing depositions into a reusable utility function. This eliminates code duplication between useDatasetById and useRunById hooks while maintaining the same functionality. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]>
1 parent 54e71aa commit 79293cf

File tree

9 files changed

+169
-3
lines changed

9 files changed

+169
-3
lines changed

frontend/packages/data-portal/app/components/Dataset/DatasetMetadataDrawer.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,14 @@ export function DatasetMetadataDrawer() {
2424
}
2525

2626
function MetadataTab() {
27-
const { dataset } = useDatasetById()
27+
const { dataset, additionalContributingDepositions } = useDatasetById()
2828

2929
return (
3030
<>
31-
<DatasetMetadataTable dataset={dataset} />
31+
<DatasetMetadataTable
32+
dataset={dataset}
33+
additionalContributingDepositions={additionalContributingDepositions}
34+
/>
3235
<SampleAndExperimentConditionsTable dataset={dataset} />
3336
<DatasetTiltSeriesTable />
3437
</>

frontend/packages/data-portal/app/components/Dataset/DatasetMetadataTable.tsx

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,12 @@ export function DatasetMetadataTable({
3939
dataset,
4040
showAllFields,
4141
initialOpen,
42+
additionalContributingDepositions = [],
4243
}: {
4344
dataset: Dataset
4445
showAllFields?: boolean
4546
initialOpen?: boolean
47+
additionalContributingDepositions?: number[]
4648
}) {
4749
const { t } = useI18n()
4850

@@ -115,6 +117,60 @@ export function DatasetMetadataTable({
115117
values: [dataset.depositionDate?.split('T')[0] ?? ''],
116118
},
117119

120+
{
121+
label: t('originalDepositionName'),
122+
values: [dataset.deposition?.title ?? ''],
123+
renderValue: (value: string) => {
124+
const id = dataset.deposition?.id
125+
126+
if (!id) {
127+
return <span>--</span>
128+
}
129+
130+
return (
131+
<Link
132+
className="text-light-sds-color-primitive-blue-500"
133+
to={`/depositions/${id}`}
134+
>
135+
{value}
136+
</Link>
137+
)
138+
},
139+
},
140+
141+
{
142+
label: t('originalDepositionId'),
143+
values: [dataset.deposition?.id ?? '--'],
144+
renderValue: (value: string) => {
145+
return (
146+
<span>
147+
{IdPrefix.Deposition}-{value}
148+
</span>
149+
)
150+
},
151+
},
152+
153+
{
154+
label: t('additionalContributions'),
155+
values: additionalContributingDepositions,
156+
renderValues(values) {
157+
return (
158+
<ul>
159+
{values.map((value) => (
160+
<li key={value}>
161+
<Link
162+
className="text-light-sds-color-primitive-blue-500"
163+
to={`/depositions/${value}`}
164+
>
165+
{IdPrefix.Deposition}-{value}
166+
</Link>
167+
</li>
168+
))}
169+
</ul>
170+
)
171+
},
172+
},
173+
118174
{
119175
label: t('releaseDate'),
120176
values: [dataset.releaseDate?.split('T')[0] ?? ''],

frontend/packages/data-portal/app/components/Run/RunMetadataDrawer.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export function RunMetadataDrawer() {
2525
}
2626

2727
function MetadataTab() {
28-
const { run } = useRunById()
28+
const { run, additionalContributingDepositions } = useRunById()
2929

3030
return (
3131
<>
@@ -35,6 +35,9 @@ function MetadataTab() {
3535
showAllFields
3636
dataset={run.dataset}
3737
initialOpen={false}
38+
additionalContributingDepositions={
39+
additionalContributingDepositions
40+
}
3841
/>
3942
<SampleAndExperimentConditionsTable
4043
dataset={run.dataset}

frontend/packages/data-portal/app/graphql/getDatasetByIdV2.server.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const GET_DATASET_BY_ID_QUERY_V2 = gql(`
4242
deposition{
4343
id
4444
description
45+
title
4546
annotationsAggregate(where: {annotationShapes: {annotationFilesAggregate: {count: {filter: {isVisualizationDefault: {_eq: true}}}}}}) {
4647
aggregate {
4748
count
@@ -221,6 +222,34 @@ const GET_DATASET_BY_ID_QUERY_V2 = gql(`
221222
id
222223
title
223224
}
225+
226+
depositionsWithAnnotations: depositions(where: {
227+
annotations: {
228+
run: {
229+
datasetId: { _eq: $id }
230+
}
231+
}
232+
}) {
233+
id
234+
}
235+
236+
depositionsWithTomograms: depositions(where: {
237+
tomograms: {
238+
run: {
239+
datasetId: { _eq: $id }
240+
}
241+
}
242+
}) {
243+
id
244+
}
245+
246+
depositionsWithDatasets: depositions(where: {
247+
datasets: {
248+
id: { _eq: $id }
249+
}
250+
}) {
251+
id
252+
}
224253
}
225254
`)
226255

frontend/packages/data-portal/app/graphql/getRunByIdV2.server.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ const GET_RUN_BY_ID_QUERY_V2 = gql(`
6868
cellStrainId
6969
cellTypeId
7070
deposition {
71+
id
72+
title
73+
7174
annotationsAggregate(
7275
where: {annotationShapesAggregate: {count: {filter: {annotationFiles: {isVisualizationDefault: {_eq: true}}}}}}
7376
) {
@@ -467,6 +470,32 @@ const GET_RUN_BY_ID_QUERY_V2 = gql(`
467470
id
468471
title
469472
}
473+
474+
depositionsWithAnnotations: depositions(where: {
475+
annotations: {
476+
runId: { _eq: $id }
477+
}
478+
}) {
479+
id
480+
}
481+
482+
depositionsWithTomograms: depositions(where: {
483+
tomograms: {
484+
runId: { _eq: $id }
485+
}
486+
}) {
487+
id
488+
}
489+
490+
depositionsWithDatasets: depositions(where: {
491+
datasets: {
492+
runs: {
493+
id: { _eq: $id }
494+
}
495+
}
496+
}) {
497+
id
498+
}
470499
}
471500
`)
472501

frontend/packages/data-portal/app/hooks/useDatasetById.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useTypedLoaderData } from 'remix-typedjson'
22

33
import { GetDatasetByIdV2Query } from 'app/__generated_v2__/graphql'
4+
import { getAdditionalContributingDepositions } from 'app/utils/deposition'
45
import { isDefined } from 'app/utils/nullish'
56

67
export function useDatasetById() {
@@ -31,6 +32,15 @@ export function useDatasetById() {
3132
?.map((aggregate) => aggregate.groupBy?.tiltSeriesQuality)
3233
.filter(isDefined) ?? []
3334

35+
// Get additional contributing depositions (excluding the original deposition)
36+
const additionalContributingDepositions =
37+
getAdditionalContributingDepositions(
38+
v2.depositionsWithAnnotations,
39+
v2.depositionsWithTomograms,
40+
v2.depositionsWithDatasets,
41+
dataset?.deposition?.id,
42+
)
43+
3444
return {
3545
runs,
3646
unFilteredRuns,
@@ -39,5 +49,6 @@ export function useDatasetById() {
3949
objectNames,
4050
objectShapeTypes,
4151
tiltseriesQualityScores,
52+
additionalContributingDepositions,
4253
}
4354
}

frontend/packages/data-portal/app/hooks/useRunById.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useTypedLoaderData } from 'remix-typedjson'
22

33
import { GetRunByIdV2Query } from 'app/__generated_v2__/graphql'
4+
import { getAdditionalContributingDepositions } from 'app/utils/deposition'
45
import { isDefined } from 'app/utils/nullish'
56

67
export function useRunById() {
@@ -81,6 +82,15 @@ export function useRunById() {
8182

8283
const deposition = v2.depositions[0]
8384

85+
// Get additional contributing depositions (excluding the original deposition)
86+
const additionalContributingDepositions =
87+
getAdditionalContributingDepositions(
88+
v2.depositionsWithAnnotations,
89+
v2.depositionsWithTomograms,
90+
v2.depositionsWithDatasets,
91+
run?.dataset?.deposition?.id,
92+
)
93+
8494
return {
8595
run,
8696
tomograms,
@@ -95,5 +105,6 @@ export function useRunById() {
95105
ctfCount,
96106
deposition,
97107
annotationShapes,
108+
additionalContributingDepositions,
98109
}
99110
}

frontend/packages/data-portal/app/utils/deposition.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
import type { DataContentsFragment } from 'app/__generated_v2__/graphql'
22

3+
interface DepositionWithId {
4+
id: number
5+
}
6+
7+
export function getAdditionalContributingDepositions(
8+
depositionsWithAnnotations: DepositionWithId[] | null | undefined,
9+
depositionsWithTomograms: DepositionWithId[] | null | undefined,
10+
depositionsWithDatasets: DepositionWithId[] | null | undefined,
11+
originalDepositionId: number | null | undefined,
12+
): number[] {
13+
return Array.from(
14+
new Set([
15+
...(depositionsWithAnnotations?.map((dep) => dep.id) ?? []),
16+
...(depositionsWithTomograms?.map((dep) => dep.id) ?? []),
17+
...(depositionsWithDatasets?.map((dep) => dep.id) ?? []),
18+
]),
19+
)
20+
.filter((id) => id !== originalDepositionId)
21+
.sort((a, b) => a - b)
22+
}
23+
324
export function getDataContents(runs: DataContentsFragment[]) {
425
let annotations = 0
526
let tomograms = 0

frontend/packages/data-portal/public/locales/en/translation.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"acquisitionMethods": "Acquisition Methods",
1313
"acrossDatasets_one": "Across {{count}} Dataset",
1414
"acrossDatasets_other": "Across {{count}} Datasets",
15+
"additionalContributions": "Additional Contributions",
1516
"additionalMicroscopeOpticalSetup": "Additional microscope optical setup",
1617
"affiliationName": "Affiliation Name",
1718
"affiliationNames": "Affiliation Names",
@@ -360,6 +361,8 @@
360361
"organizers": "Organizers",
361362
"orientedPoint": "Oriented Point",
362363
"orientedPoints": "Oriented Points",
364+
"originalDepositionId": "Original Deposition ID",
365+
"originalDepositionName": "Original Deposition Name",
363366
"other": "Other",
364367
"otherAnnotations_one": "{{count}} Other Annotation",
365368
"otherAnnotations_other": "{{count}} Other Annotations",

0 commit comments

Comments
 (0)