diff --git a/frontend/packages/data-portal/app/components/Download/AnnotationAlignmentCallout.tsx b/frontend/packages/data-portal/app/components/Download/AnnotationAlignmentCallout.tsx index a146a315a..e1f01bbbf 100644 --- a/frontend/packages/data-portal/app/components/Download/AnnotationAlignmentCallout.tsx +++ b/frontend/packages/data-portal/app/components/Download/AnnotationAlignmentCallout.tsx @@ -37,24 +37,30 @@ export function AnnotationAlignmentCallout({ {t('alignmentId')}

-

- -

-
- {misalignedTomograms?.map((tomogram) => ( -
-
{getTomogramName(tomogram)}
-
- Tomogram ID: {IdPrefix.Tomogram}-{tomogram.id} -
- {tomogram.alignment != null && ( -
- Alignment ID: {IdPrefix.Alignment}-{tomogram.alignment.id} + + {misalignedTomograms.length > 0 && ( + <> +

+ +

+ +
+ {misalignedTomograms.map((tomogram) => ( +
+
{getTomogramName(tomogram)}
+
+ Tomogram ID: {IdPrefix.Tomogram}-{tomogram.id} +
+ {tomogram.alignment != null && ( +
+ Alignment ID: {IdPrefix.Alignment}-{tomogram.alignment.id} +
+ )}
- )} + ))}
- ))} -
+ + )} ) } diff --git a/frontend/packages/data-portal/app/components/Download/ConfigureAnnotationDownloadContent.tsx b/frontend/packages/data-portal/app/components/Download/ConfigureAnnotationDownloadContent.tsx index 8292a379b..20b3b76f0 100644 --- a/frontend/packages/data-portal/app/components/Download/ConfigureAnnotationDownloadContent.tsx +++ b/frontend/packages/data-portal/app/components/Download/ConfigureAnnotationDownloadContent.tsx @@ -1,13 +1,16 @@ import { useMemo } from 'react' +import { DeepPartial } from 'utility-types' +import { AnnotationFileEdge } from 'app/__generated_v2__/graphql' import { useDownloadModalContext } from 'app/context/DownloadModal.context' import { useDownloadModalQueryParamState } from 'app/hooks/useDownloadModalQueryParamState' +import { useRunById } from 'app/hooks/useRunById' import { AnnotationAlignmentCallout } from './AnnotationAlignmentCallout' import { FileFormatDropdown } from './FileFormatDropdown' export function ConfigureAnnotationDownloadContent() { - const { objectShapeType } = useDownloadModalQueryParamState() + const { objectShapeType, fileFormat } = useDownloadModalQueryParamState() const { annotationToDownload, allTomograms } = useDownloadModalContext() const fileFormats = useMemo( @@ -18,15 +21,30 @@ export function ConfigureAnnotationDownloadContent() { [annotationToDownload?.files, objectShapeType], ) + const { annotationShapes } = useRunById() + + const isMatchingFormat = (file: DeepPartial) => + file?.node?.format === fileFormat + + const alignmentId = + annotationShapes + .find( + (shape) => + shape.annotation?.id === annotationToDownload?.id && + shape.shapeType === objectShapeType && + shape.annotationFiles.edges.some(isMatchingFormat), + ) + ?.annotationFiles.edges.find(isMatchingFormat)?.node.alignmentId ?? 0 + return ( <> tomogram.alignment?.id !== alignmentId, + )} /> ) diff --git a/frontend/packages/data-portal/app/components/Download/ConfigureDownloadContent.tsx b/frontend/packages/data-portal/app/components/Download/ConfigureDownloadContent.tsx index 2f3546d84..8094ccbec 100644 --- a/frontend/packages/data-portal/app/components/Download/ConfigureDownloadContent.tsx +++ b/frontend/packages/data-portal/app/components/Download/ConfigureDownloadContent.tsx @@ -9,10 +9,13 @@ import { ConfigureTomogramDownloadContent } from './ConfigureTomogramDownloadCon export function ConfigureDownloadContent() { const { t } = useI18n() - const { datasetTitle, runName, objectName } = useDownloadModalContext() + const { annotationName, annotationId, objectShapeType } = useDownloadModalQueryParamState() + const { annotationToDownload, datasetTitle, runName, objectName } = + useDownloadModalContext() + return ( <> @@ -32,6 +35,12 @@ export function ConfigureDownloadContent() { {objectShapeType && ( )} + {annotationToDownload !== undefined && ( + + )}

{t('selectDownload')} diff --git a/frontend/packages/data-portal/app/components/Download/DownloadOptionsContent.tsx b/frontend/packages/data-portal/app/components/Download/DownloadOptionsContent.tsx index 916d8ec66..61b594a87 100644 --- a/frontend/packages/data-portal/app/components/Download/DownloadOptionsContent.tsx +++ b/frontend/packages/data-portal/app/components/Download/DownloadOptionsContent.tsx @@ -132,6 +132,14 @@ export function DownloadOptionsContent() { value={tomogramProcessing} /> )} + {multipleTomogramsEnabled && + annotationToDownload && + tomogramToDownload?.alignment && ( + + )} {fileFormat && ( - {multipleTomogramsEnabled && annotationToDownload !== undefined ? ( + {multipleTomogramsEnabled && + annotationToDownload !== undefined && + tomogramToDownload?.alignment ? ( ) : ( diff --git a/frontend/packages/data-portal/app/components/Download/Tomogram/TomogramSelectorLabel.tsx b/frontend/packages/data-portal/app/components/Download/Tomogram/TomogramSelectorLabel.tsx index 4a1ee2c15..70acd3429 100644 --- a/frontend/packages/data-portal/app/components/Download/Tomogram/TomogramSelectorLabel.tsx +++ b/frontend/packages/data-portal/app/components/Download/Tomogram/TomogramSelectorLabel.tsx @@ -25,6 +25,7 @@ export function TomogramSelectorInputLabel({ {t('unitAngstrom', { value: tomogram.voxelSpacing })} {tomogram.isPortalStandard && } + {tomogram.isAuthorSubmitted && }

) } diff --git a/frontend/packages/data-portal/app/components/Download/Tomogram/TomogramSelectorOption.tsx b/frontend/packages/data-portal/app/components/Download/Tomogram/TomogramSelectorOption.tsx index 7034ab490..1a89603d8 100644 --- a/frontend/packages/data-portal/app/components/Download/Tomogram/TomogramSelectorOption.tsx +++ b/frontend/packages/data-portal/app/components/Download/Tomogram/TomogramSelectorOption.tsx @@ -25,6 +25,9 @@ export function TomogramSelectorOption({ {tomogram.isPortalStandard && ( )} + {tomogram.isAuthorSubmitted && ( + + )}
{t('tomogramSampling')}:{' '} diff --git a/frontend/packages/data-portal/app/components/Run/RunHeader.tsx b/frontend/packages/data-portal/app/components/Run/RunHeader.tsx index dc11f5901..f11b70433 100644 --- a/frontend/packages/data-portal/app/components/Run/RunHeader.tsx +++ b/frontend/packages/data-portal/app/components/Run/RunHeader.tsx @@ -1,4 +1,5 @@ import { Button, Icon } from '@czi-sds/components' +import { match, P } from 'ts-pattern' import { Breadcrumbs } from 'app/components/Breadcrumbs' import { CollapsibleList } from 'app/components/CollapsibleList' @@ -51,6 +52,7 @@ export function RunHeader() { annotationFilesAggregates, tomogramsCount, alignmentsCount, + tomograms, } = useRunById() const { toggleDrawer } = useMetadataDrawer() const { t } = useI18n() @@ -58,7 +60,20 @@ export function RunHeader() { const tiltSeries = run.tiltseries[0] const tomogram = run.tomogram_voxel_spacings.at(0)?.tomograms.at(0) - const keyPhotoURL = tomogram?.key_photo_url ?? undefined + + // Use author submitted tomogram if available, otherwise default to the first one + const tomogramV2 = + tomograms.find( + (currentTomogram) => + currentTomogram.isVisualizationDefault ?? + currentTomogram.isAuthorSubmitted, + ) ?? tomograms.at(0) + + const keyPhotoURL = + (multipleTomogramsEnabled + ? tomogramV2?.keyPhotoUrl + : tomogram?.key_photo_url) ?? undefined + const neuroglancerConfig = tomogram?.neuroglancer_config const { openRunDownloadModal } = useDownloadModalQueryParamState() @@ -72,7 +87,20 @@ export function RunHeader() { actions={
tomogramV2Id.toString(), + ) + .with( + { multipleTomogramsEnabled: false, tomogramV1Id: P.number }, + ({ tomogramV1Id }) => tomogramV1Id.toString(), + ) + .otherwise(() => undefined)} neuroglancerConfig={neuroglancerConfig} buttonProps={{ sdsStyle: 'rounded', diff --git a/frontend/packages/data-portal/app/components/Run/TomogramMetadataDrawer.tsx b/frontend/packages/data-portal/app/components/Run/TomogramMetadataDrawer.tsx index afd0edb04..7abe9489d 100644 --- a/frontend/packages/data-portal/app/components/Run/TomogramMetadataDrawer.tsx +++ b/frontend/packages/data-portal/app/components/Run/TomogramMetadataDrawer.tsx @@ -4,6 +4,7 @@ import { useAtom } from 'jotai' import { IdPrefix } from 'app/constants/idPrefixes' import { useI18n } from 'app/hooks/useI18n' import { MetadataDrawerId } from 'app/hooks/useMetadataDrawer' +import { useRunById } from 'app/hooks/useRunById' import { metadataDrawerTomogramAtom } from 'app/state/metadataDrawerTomogram' import { getTableData } from 'app/utils/table' import { getTomogramName, isFiducial } from 'app/utils/tomograms' @@ -21,6 +22,7 @@ import { IDENTITY_MATRIX_4X4, Matrix4x4 } from './Matrix4x4' export function TomogramMetadataDrawer() { const { t } = useI18n() const [tomogram] = useAtom(metadataDrawerTomogramAtom) + const { run } = useRunById() if (tomogram === undefined) { return null @@ -59,7 +61,7 @@ export function TomogramMetadataDrawer() { }, { label: t('publications'), - values: [], // TODO + values: [run.dataset.dataset_publications ?? ''], renderValue: (value: string) => ( ), @@ -73,9 +75,7 @@ export function TomogramMetadataDrawer() { }, { label: t('depositionName'), - // TODO(bchu): Uncomment after API field name change is in prod. - // values: [tomogram.deposition?.title ?? ''], - values: [], + values: [tomogram.deposition?.title ?? ''], renderValue: (value: string) => (
{`${t('tomogramId')}: ${IdPrefix.Tomogram}-${original.id}`} + {original.isPortalStandard && ( )} + + {original.isAuthorSubmitted && ( + + )}
), - cell: ({ getValue }) => ( + cell: ({ getValue, row: { original: tomogram } }) => ( -
+

{IdPrefix.Alignment}-{getValue()} -

+

+ + {tomogram.isPortalStandard && ( + }> +

+ {t('canonical')} +

+
+ )}
), }), @@ -159,7 +180,9 @@ export function TomogramsTable() { cell: ({ row: { original } }) => (
- {original.neuroglancerConfig != null && ( // TODO(bchu): Check it's either isPortalStandard or isAuthorSubmitted + {/* TODO Use only `isVisualizationDefault` when data is available */} + {(original.isVisualizationDefault ?? + original.isAuthorSubmitted) && ( + edge.node.format.localeCompare(edge.node.format), + ) + } // Tomogram deposition relations in V1 are incomplete. for (const tomogram of v2.tomograms) { // There are no alignments in V1. @@ -169,6 +177,65 @@ export function logIfHasDiff( }, })), alignmentsAggregate: {}, + annotationShapes: v1.annotation_files.map((file) => ({ + shapeType: file.shape_type as Annotation_File_Shape_Type_Enum, + annotationFiles: { + edges: file.annotation.files + .map((nestedFile) => ({ + node: { + format: nestedFile.format, + httpsPath: nestedFile.https_path, + s3Path: nestedFile.s3_path, + }, + })) + .sort((a, b) => a.node.format.localeCompare(b.node.format)), + }, + annotation: { + annotationMethod: file.annotation.annotation_method, + annotationPublication: file.annotation.annotation_publication, + annotationSoftware: file.annotation.annotation_software, + confidencePrecision: file.annotation.confidence_precision, + confidenceRecall: file.annotation.confidence_recall, + depositionDate: file.annotation.deposition_date, + groundTruthStatus: file.annotation.ground_truth_status, + groundTruthUsed: file.annotation.ground_truth_used, + id: file.annotation.id, + isCuratorRecommended: file.annotation.is_curator_recommended, + lastModifiedDate: file.annotation.last_modified_date!, + methodLinks: { + edges: [], + }, + methodType: file.annotation.method_type as Annotation_Method_Type_Enum, + objectCount: file.annotation.object_count, + objectDescription: file.annotation.object_description, + objectId: file.annotation.object_id, + objectName: file.annotation.object_name, + objectState: file.annotation.object_state, + releaseDate: file.annotation.release_date, + authors: { + edges: file.annotation.authors.map((author) => ({ + node: { + primaryAuthorStatus: author.primary_author_status, + correspondingAuthorStatus: author.corresponding_author_status, + name: author.name, + email: author.email, + orcid: author.orcid, + }, + })), + }, + authorsAggregate: { + aggregate: [ + { + count: file.annotation.authors_aggregate.aggregate?.count, + }, + ], + }, + deposition: { + id: file.annotation.deposition!.id ?? 0, + title: file.annotation.deposition!.title, + }, + }, + })), tomograms: v1.tomograms.map((tomogram) => ({ ctfCorrected: tomogram.ctf_corrected, fiducialAlignmentStatus: @@ -176,7 +243,7 @@ export function logIfHasDiff( httpsMrcFile: tomogram.https_mrc_scale0, id: tomogram.id, isPortalStandard: false, - // isAuthorSubmitted: tomogram.is_canonical, TODO(bchu): Uncomment when populated in V2. + isAuthorSubmitted: tomogram.is_canonical, keyPhotoThumbnailUrl: tomogram.key_photo_thumbnail_url, keyPhotoUrl: tomogram.key_photo_url, name: tomogram.name, diff --git a/frontend/packages/data-portal/app/graphql/getRunByIdV2.server.ts b/frontend/packages/data-portal/app/graphql/getRunByIdV2.server.ts index 8c924f251..1191f3f47 100644 --- a/frontend/packages/data-portal/app/graphql/getRunByIdV2.server.ts +++ b/frontend/packages/data-portal/app/graphql/getRunByIdV2.server.ts @@ -5,11 +5,21 @@ import { } from '@apollo/client' import { gql } from 'app/__generated_v2__' -import { GetRunByIdV2Query } from 'app/__generated_v2__/graphql' +import { + Annotation_File_Shape_Type_Enum, + Annotation_Method_Type_Enum, + AnnotationShapeWhereClause, + GetRunByIdV2Query, +} from 'app/__generated_v2__/graphql' +import { MAX_PER_PAGE } from 'app/constants/pagination' +import { FilterState, getFilterState } from 'app/hooks/useFilter' const GET_RUN_BY_ID_QUERY_V2 = gql(` query GetRunByIdV2( $id: Int + $limit: Int + $annotationShapesOffset: Int + $annotationShapesFilter: AnnotationShapeWhereClause ) { runs(where: { id: { _eq: $id } }) { id @@ -63,7 +73,7 @@ const GET_RUN_BY_ID_QUERY_V2 = gql(` organismName organismTaxid otherSetup - # publications # TODO(bchu): Change to new name. + datasetPublications relatedDatabaseEntries relatedDatabaseEntries releaseDate @@ -174,7 +184,92 @@ const GET_RUN_BY_ID_QUERY_V2 = gql(` } # Annotations table - # TODO(bchu) + annotationShapes( + where: $annotationShapesFilter + orderBy: [ + { + annotation: { + groundTruthStatus: desc + } + }, + { + annotation: { + depositionDate: desc + } + }, + { + annotation: { + id: desc + } + } + ] + limitOffset: { + limit: $limit + offset: $annotationShapesOffset + } + ) { + shapeType + annotationFiles { + edges { + node { + alignmentId + format + httpsPath + s3Path + } + } + } + annotation { + annotationMethod + annotationPublication + annotationSoftware + confidencePrecision + confidenceRecall + depositionDate + groundTruthStatus + groundTruthUsed + id + isCuratorRecommended + lastModifiedDate + methodLinks { + edges { + node { + id + link + linkType + name + } + } + } + methodType + objectCount + objectDescription + objectId + objectName + objectState + releaseDate + authors(orderBy: { authorListOrder: asc }) { + edges { + node { + primaryAuthorStatus + correspondingAuthorStatus + name + email + orcid + } + } + } + authorsAggregate { + aggregate { + count + } + } + deposition { + id + title + } + } + } # Tomograms table + download selector tomograms(where: { run: { id: { _eq: $id } } }) { @@ -196,6 +291,8 @@ const GET_RUN_BY_ID_QUERY_V2 = gql(` httpsMrcFile id isPortalStandard + isAuthorSubmitted + isVisualizationDefault keyPhotoThumbnailUrl keyPhotoUrl name @@ -213,7 +310,7 @@ const GET_RUN_BY_ID_QUERY_V2 = gql(` deposition { id depositionDate - # title # TODO(bchu): Uncomment when API field name change is in prod. + title } tomogramVoxelSpacing { id @@ -234,14 +331,99 @@ const GET_RUN_BY_ID_QUERY_V2 = gql(` } `) +function getAnnotationShapesFilter( + runId: number, + filterState: FilterState, +): AnnotationShapeWhereClause { + const where: AnnotationShapeWhereClause = { + annotation: { + run: { + id: { + _eq: runId, + }, + }, + }, + } + + // Deposition filter + const depositionId = +(filterState.ids.deposition ?? Number.NaN) + if (!Number.isNaN(depositionId) && depositionId > 0) { + where.annotation!.deposition = { + id: { + _eq: depositionId, + }, + } + } + + // Annotation shape filter + const { + annotation: { objectShapeTypes }, + } = filterState + if (objectShapeTypes.length > 0) { + where.shapeType = { + _in: objectShapeTypes as Annotation_File_Shape_Type_Enum[], + } + } + + // Author filters + const { name, orcid } = filterState.author + if (name || orcid) { + where.annotation!.authors = {} + } + if (name) { + where.annotation!.authors!.name = { + _ilike: `%${name}%`, + } + } + if (orcid) { + where.annotation!.authors!.orcid = { + _ilike: `%${orcid}%`, + } + } + + // Annotation filters + const { objectNames, annotationSoftwares, methodTypes, objectId } = + filterState.annotation + if (objectNames.length > 0) { + where.annotation!.objectName = { + _in: objectNames, + } + } + if (objectId) { + where.annotation!.objectId = { + _ilike: `%${objectId.replace(':', '_')}`, + } + } + if (methodTypes.length > 0) { + where.annotation!.methodType = { + _in: methodTypes as Annotation_Method_Type_Enum[], + } + } + if (annotationSoftwares.length > 0) { + where.annotation!.annotationSoftware = { + _in: annotationSoftwares, + } + } + + return where +} + export async function getRunByIdV2( client: ApolloClient, id: number, + annotationsPage: number, + params: URLSearchParams = new URLSearchParams(), ): Promise> { return client.query({ query: GET_RUN_BY_ID_QUERY_V2, variables: { id, + limit: MAX_PER_PAGE, + annotationShapesOffset: (annotationsPage - 1) * MAX_PER_PAGE, + annotationShapesFilter: getAnnotationShapesFilter( + id, + getFilterState(params), + ), }, }) } diff --git a/frontend/packages/data-portal/app/hooks/useRunById.ts b/frontend/packages/data-portal/app/hooks/useRunById.ts index 7299e11e2..d68532c00 100644 --- a/frontend/packages/data-portal/app/hooks/useRunById.ts +++ b/frontend/packages/data-portal/app/hooks/useRunById.ts @@ -14,7 +14,31 @@ export function useRunById() { const annotationFiles = v1.annotation_files - const { tomograms } = v2 + const { tomograms, annotationShapes } = v2 + + // Sort by isPortalStandard, then isAuthorSubmitted, then by id if all else is equal + // TODO we should move sort to the backend + tomograms.sort((t1, t2) => { + if (t1.isPortalStandard || t2.isPortalStandard) { + if (!t2.isPortalStandard) { + return -1 + } + + if (!t1.isPortalStandard) { + return 1 + } + } else if (t1.isAuthorSubmitted || t2.isAuthorSubmitted) { + if (!t2.isAuthorSubmitted) { + return -1 + } + + if (!t1.isAuthorSubmitted) { + return 1 + } + } + + return t2.id - t1.id + }) const processingMethods = v1.tomograms_for_distinct_processing_methods.map( (tomogram) => tomogram.processing, @@ -64,5 +88,6 @@ export function useRunById() { tomogramsCount, alignmentsCount, deposition, + annotationShapes, } } diff --git a/frontend/packages/data-portal/app/routes/runs.$id.tsx b/frontend/packages/data-portal/app/routes/runs.$id.tsx index 04a81f444..9e388fc62 100644 --- a/frontend/packages/data-portal/app/routes/runs.$id.tsx +++ b/frontend/packages/data-portal/app/routes/runs.$id.tsx @@ -56,7 +56,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { client: apolloClient, params: url.searchParams, }), - getRunByIdV2(apolloClientV2, id), + getRunByIdV2(apolloClientV2, id, annotationsPage, url.searchParams), ]) if (responseV1.runs.length === 0) { diff --git a/frontend/packages/data-portal/codegen.ts b/frontend/packages/data-portal/codegen.ts index 7f0781eb9..c83c37b0e 100644 --- a/frontend/packages/data-portal/codegen.ts +++ b/frontend/packages/data-portal/codegen.ts @@ -6,7 +6,7 @@ const SCHEMA_URL = const SCHEMA_URL_V2 = process.env.API_URL_V2 || - 'https://graphql.cryoetdataportal.czscience.com/graphql' + 'https://graphql.cryoet.staging.si.czi.technology/graphql' const config: CodegenConfig = { generates: { diff --git a/frontend/packages/data-portal/e2e/pageObjects/metadataDrawer/metadataDrawerPage.ts b/frontend/packages/data-portal/e2e/pageObjects/metadataDrawer/metadataDrawerPage.ts index 5be3485d2..39dd53bb1 100644 --- a/frontend/packages/data-portal/e2e/pageObjects/metadataDrawer/metadataDrawerPage.ts +++ b/frontend/packages/data-portal/e2e/pageObjects/metadataDrawer/metadataDrawerPage.ts @@ -95,7 +95,7 @@ export class MetadataDrawerPage extends BasePage { value: _DeepPartialArray, ) { const cells = this.getMetadataCells(label) - const nodeValue = await cells.last().innerText() + const nodeValue = (await cells.last().innerText()).replaceAll('\n', '') expect( value.every((v) => nodeValue.includes(v ?? '')), `Test for ${label} with value ${nodeValue} to include ${value.join( diff --git a/frontend/packages/data-portal/e2e/pageObjects/metadataDrawer/utils.ts b/frontend/packages/data-portal/e2e/pageObjects/metadataDrawer/utils.ts index 749f9cefe..9f855f3e2 100644 --- a/frontend/packages/data-portal/e2e/pageObjects/metadataDrawer/utils.ts +++ b/frontend/packages/data-portal/e2e/pageObjects/metadataDrawer/utils.ts @@ -11,6 +11,7 @@ import { Tiltseries, } from 'app/__generated__/graphql' import { + Dataset, Fiducial_Alignment_Status_Enum, Tomogram, } from 'app/__generated_v2__/graphql' @@ -172,14 +173,15 @@ function getAnnotationTestMetdata( function getTomogramDrawerTestMetadata( tomogram: DeepPartial, + dataset: DeepPartial | null | undefined, ): DrawerTestMetadata { return { authors: tomogram.authors!.edges!.map((edge) => edge.node!.name), - publications: '--', + publications: + dataset?.datasetPublications?.replaceAll('doi:', 'DOI:').split(', ') ?? + '--', relatedDatabases: '--', - // TODO(bchu): Uncomment when API name change is in prod. - // depositionName: tomogram.deposition?.title ?? '--', - depositionName: '--', + depositionName: tomogram.deposition?.title ?? '--', depositionId: tomogram.deposition?.id ?? '--', depositionDate: tomogram.deposition?.depositionDate ?? '--', releaseDate: '--', @@ -295,15 +297,16 @@ export async function getAnnotationTestData( export async function getTomogramTestData( client: ApolloClient, ) { - const { data } = await getRunByIdV2(client, +E2E_CONFIG.runId) + const { data } = await getRunByIdV2(client, +E2E_CONFIG.runId, 1) const tomogram = data.tomograms[0] + const { dataset } = data.runs[0] return { title: startCase( `${tomogram.id} ${tomogram.reconstructionMethod} ${tomogram.processing}`, ), - metadata: getTomogramDrawerTestMetadata(tomogram), + metadata: getTomogramDrawerTestMetadata(tomogram, dataset), } } // #endregion Data Getters diff --git a/frontend/packages/data-portal/public/locales/en/translation.json b/frontend/packages/data-portal/public/locales/en/translation.json index f58d67f90..cbbc47d0d 100644 --- a/frontend/packages/data-portal/public/locales/en/translation.json +++ b/frontend/packages/data-portal/public/locales/en/translation.json @@ -18,6 +18,7 @@ "alignment": "Alignment", "alignmentFile": "Alignment File", "alignmentId": "Alignment ID", + "alignmentIdCanonicalTooltip": "Canonical: ID of alignment used to generate the Portal Standard tomogram.", "alignmentIdTooltip": "Alignment ID: ID of the alignment used to generate the tilt series for a given tomogram.", "alignmentType": "Alignment Type", "all": "All", @@ -69,6 +70,7 @@ "cameraManufacturer": "Camera Manufacturer", "cameraModel": "Camera Model", "cancel": "Cancel", + "canonical": "Canonical", "canonicalStatus": "Canonical Status", "cellLineOrStrainName": "Cell Line or Strain Name", "cellName": "Cell Name", @@ -245,12 +247,12 @@ "next": "Next", "no": "No", "noAnnotationsAvailable": "No Annotations Available", - "normalText": "Normal text", - "notApplicable": "Not Applicable", "noAnnotationsAvailableToDownload": "No annotations available to download", "noTomogramAvailable": "No tomogram available", "noTomogramsAvailable": "No tomograms available", "noTomogramsAvailableToDownload": "No tomograms available to download", + "normalText": "Normal text", + "notApplicable": "Not Applicable", "notSubmitted": "Not Submitted", "numberOfAnnotations": "Number of Annotations", "numberOfRuns": "Number of Runs",