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",