diff --git a/frontend/packages/data-portal/app/components/Deposition/AnnotationsSummaryMetadataTable.tsx b/frontend/packages/data-portal/app/components/Deposition/AnnotationsSummaryMetadataTable.tsx index b3881eaea..4bd0990f4 100644 --- a/frontend/packages/data-portal/app/components/Deposition/AnnotationsSummaryMetadataTable.tsx +++ b/frontend/packages/data-portal/app/components/Deposition/AnnotationsSummaryMetadataTable.tsx @@ -1,8 +1,10 @@ +import { Annotation_File_Shape_Type_Enum } from 'app/__generated_v2__/graphql' import { AccordionMetadataTable } from 'app/components/AccordionMetadataTable' import { CollapsibleList } from 'app/components/CollapsibleList' -import { shapeTypeToI18nKeyPlural } from 'app/constants/objectShapeTypes' +import { useDatasetsFilterData } from 'app/hooks/useDatasetsFilterData' import { useDepositionById } from 'app/hooks/useDepositionById' import { useI18n } from 'app/hooks/useI18n' +import { checkExhaustive } from 'app/types/utils' import { getTableData } from 'app/utils/table' export function AnnotationsSummaryMetadataTable({ @@ -12,8 +14,9 @@ export function AnnotationsSummaryMetadataTable({ }) { const { t } = useI18n() - const { deposition, objectNames, objectShapeTypes, organismNames } = - useDepositionById() + const { deposition } = useDepositionById() + const { organismNames, objectNames, objectShapeTypes } = + useDatasetsFilterData() const annotationsSummaryMetadata = getTableData( { @@ -54,11 +57,22 @@ export function AnnotationsSummaryMetadataTable({ values: [], renderValue: () => ( ), }, diff --git a/frontend/packages/data-portal/app/constants/objectShapeTypes.ts b/frontend/packages/data-portal/app/constants/objectShapeTypes.ts index a54601f20..5fa0d5a4d 100644 --- a/frontend/packages/data-portal/app/constants/objectShapeTypes.ts +++ b/frontend/packages/data-portal/app/constants/objectShapeTypes.ts @@ -9,10 +9,3 @@ export const shapeTypeToI18nKey = { Point: 'point', SegmentationMask: 'segmentationMask', } as const satisfies ShapeTypeToI18nKeyMap - -export const shapeTypeToI18nKeyPlural = { - InstanceSegmentation: 'instanceSegmentations', - OrientedPoint: 'orientedPoints', - Point: 'points', - SegmentationMask: 'segmentationMasks', -} as const satisfies ShapeTypeToI18nKeyMap diff --git a/frontend/packages/data-portal/app/graphql/getDepositionByIdV2.server.ts b/frontend/packages/data-portal/app/graphql/getDepositionByIdV2.server.ts index 407ca76a7..365b9da90 100644 --- a/frontend/packages/data-portal/app/graphql/getDepositionByIdV2.server.ts +++ b/frontend/packages/data-portal/app/graphql/getDepositionByIdV2.server.ts @@ -51,32 +51,6 @@ const GET_DEPOSITION_BY_ID = gql(` count } } - distinctOrganismNames: datasetsAggregate { - aggregate { - count - groupBy { - organismName - } - } - } - distinctObjectNames: annotationsAggregate { - aggregate { - count - groupBy { - objectName - } - } - } - distinctShapeTypes: annotationsAggregate { - aggregate { - count - groupBy { - annotationShapes { - shapeType - } - } - } - } annotationMethodCounts: annotationsAggregate { aggregate { count diff --git a/frontend/packages/data-portal/app/graphql/getDepositionDiffer.ts b/frontend/packages/data-portal/app/graphql/getDepositionDiffer.ts index ebcae2a89..19d56910e 100644 --- a/frontend/packages/data-portal/app/graphql/getDepositionDiffer.ts +++ b/frontend/packages/data-portal/app/graphql/getDepositionDiffer.ts @@ -73,30 +73,6 @@ export function logIfHasDiff( } // Counts not used. // Create consistent sort order. - for (const group of v2.depositions[0].distinctOrganismNames!.aggregate!) { - delete group.count - } - v2.depositions[0].distinctOrganismNames!.aggregate!.sort((groupA, groupB) => - String(groupA.groupBy!.organismName).localeCompare( - String(groupB.groupBy!.organismName), - ), - ) - for (const group of v2.depositions[0].distinctObjectNames!.aggregate!) { - delete group.count - } - v2.depositions[0].distinctObjectNames!.aggregate!.sort((groupA, groupB) => - String(groupA.groupBy!.objectName).localeCompare( - String(groupB.groupBy!.objectName), - ), - ) - for (const group of v2.depositions[0].distinctShapeTypes!.aggregate!) { - delete group.count - } - v2.depositions[0].distinctShapeTypes!.aggregate!.sort((groupA, groupB) => - String(groupA.groupBy!.annotationShapes!.shapeType).localeCompare( - String(groupB.groupBy!.annotationShapes!.shapeType), - ), - ) v2.depositions[0].annotationMethodCounts!.aggregate!.sort((groupA, groupB) => String(groupA.groupBy!.annotationMethod).localeCompare( String(groupB.groupBy!.annotationMethod), @@ -204,51 +180,6 @@ export function logIfHasDiff( ] : [], }, - distinctOrganismNames: { - aggregate: v1 - .deposition!.organism_names.map((dataset) => ({ - groupBy: { - organismName: dataset.organism_name, - }, - })) - .sort((groupA, groupB) => - String(groupA.groupBy.organismName).localeCompare( - String(groupB.groupBy.organismName), - ), - ), - }, - distinctObjectNames: { - aggregate: v1 - .deposition!.object_names.map((annotation) => ({ - groupBy: { - objectName: annotation.object_name, - }, - })) - .sort((groupA, groupB) => - String(groupA.groupBy.objectName).localeCompare( - String(groupB.groupBy.objectName), - ), - ), - }, - distinctShapeTypes: { - aggregate: [ - ...new Set( - v1.deposition!.annotations.flatMap((annotation) => - annotation.files.map((file) => file.shape_type), - ), - ), - ] - .sort((shapeTypeA, shapeTypeB) => - String(shapeTypeA).localeCompare(String(shapeTypeB)), - ) - .map((shapeType) => ({ - groupBy: { - annotationShapes: { - shapeType: shapeType as Annotation_File_Shape_Type_Enum, - }, - }, - })), - }, annotationMethodCounts: { aggregate: [...v1AnnotationMethodCounts.entries()] .sort(([annotationMethodA], [annotationMethodB]) => diff --git a/frontend/packages/data-portal/app/hooks/useDatasets.ts b/frontend/packages/data-portal/app/hooks/useDatasets.ts index 73379af05..bfa0f9b17 100644 --- a/frontend/packages/data-portal/app/hooks/useDatasets.ts +++ b/frontend/packages/data-portal/app/hooks/useDatasets.ts @@ -1,4 +1,3 @@ -import { useMemo } from 'react' import { useTypedLoaderData } from 'remix-typedjson' import { GetDatasetsDataQuery } from 'app/__generated__/graphql' @@ -10,18 +9,7 @@ export function useDatasets() { v1: GetDatasetsDataQuery }>() - return useMemo( - () => ({ - datasets: v1.datasets, - datasetCount: v1.datasets_aggregate.aggregate?.count ?? 0, - - filteredDatasetCount: - v1.filtered_datasets_aggregate.aggregate?.count ?? 0, - }), - [ - v1.datasets, - v1.datasets_aggregate.aggregate?.count, - v1.filtered_datasets_aggregate.aggregate?.count, - ], - ) + return { + datasets: v1.datasets, + } } diff --git a/frontend/packages/data-portal/app/hooks/useDatasetsFilterData.ts b/frontend/packages/data-portal/app/hooks/useDatasetsFilterData.ts index 250d07665..cc8e4a20e 100644 --- a/frontend/packages/data-portal/app/hooks/useDatasetsFilterData.ts +++ b/frontend/packages/data-portal/app/hooks/useDatasetsFilterData.ts @@ -12,6 +12,8 @@ export function useDatasetsFilterData() { }>() return { + filteredDatasetsCount: v2.filteredDatasetsCount.aggregate?.[0]?.count ?? 0, + totalDatasetsCount: v2.totalDatasetsCount.aggregate?.[0]?.count ?? 0, organismNames: v2.distinctOrganismNames.aggregate ?.map((aggregate) => aggregate.groupBy?.organismName) diff --git a/frontend/packages/data-portal/app/hooks/useDepositionById.ts b/frontend/packages/data-portal/app/hooks/useDepositionById.ts index a3cf572de..9f80e2a40 100644 --- a/frontend/packages/data-portal/app/hooks/useDepositionById.ts +++ b/frontend/packages/data-portal/app/hooks/useDepositionById.ts @@ -1,4 +1,3 @@ -import { useMemo } from 'react' import { useTypedLoaderData } from 'remix-typedjson' import { GetDepositionByIdQuery } from 'app/__generated__/graphql' @@ -24,46 +23,9 @@ export function useDepositionById() { .filter((entry): entry is [string, number] => isDefined(entry[0])) ?? [], ) - const objectNames = useMemo( - () => - Array.from( - new Set( - v1.deposition?.object_names.flatMap( - (annotation) => annotation.object_name, - ), - ), - ), - [v1.deposition?.object_names], - ) - - const objectShapeTypes = useMemo( - () => - Array.from( - new Set( - v1.deposition?.annotations.flatMap((annotation) => - annotation.files.flatMap((file) => file.shape_type), - ), - ), - ), - [v1.deposition?.annotations], - ) - - const organismNames = useMemo( - () => - Array.from( - new Set(v1.datasets.flatMap((dataset) => dataset.organism_name)), - ).filter(Boolean) as string[], - [v1.datasets], - ) - return { deposition: v1.deposition as Deposition, datasets: v1.datasets, - datasetsCount: v1.datasets_aggregate.aggregate?.count ?? 0, - filteredDatasetsCount: v1.filtered_datasets_aggregate.aggregate?.count ?? 0, - objectNames, - objectShapeTypes, - organismNames, annotationMethodCounts, } } diff --git a/frontend/packages/data-portal/app/routes/browse-data.datasets.tsx b/frontend/packages/data-portal/app/routes/browse-data.datasets.tsx index 2fe674e4b..250075d39 100644 --- a/frontend/packages/data-portal/app/routes/browse-data.datasets.tsx +++ b/frontend/packages/data-portal/app/routes/browse-data.datasets.tsx @@ -19,7 +19,7 @@ import { getBrowseDatasets } from 'app/graphql/getBrowseDatasets.server' import { logIfHasDiff } from 'app/graphql/getDatasetsDiffer' import { getDatasetsFilterData } from 'app/graphql/getDatasetsFilterData.server' import { getDatasetsV2 } from 'app/graphql/getDatasetsV2.server' -import { useDatasets } from 'app/hooks/useDatasets' +import { useDatasetsFilterData } from 'app/hooks/useDatasetsFilterData' import { useI18n } from 'app/hooks/useI18n' import { useBrowseDatasetFilterHistory, @@ -83,7 +83,7 @@ function BrowseDatasetTableHeader(props: TableHeaderProps) { } export default function BrowseDatasetsPage() { - const { datasetCount, filteredDatasetCount } = useDatasets() + const { filteredDatasetsCount, totalDatasetsCount } = useDatasetsFilterData() const { t } = useI18n() const { setPreviousBrowseDatasetParams } = useBrowseDatasetFilterHistory() @@ -104,8 +104,8 @@ export default function BrowseDatasetsPage() { filterPanel: , table: , noFilteredResults: , - filteredCount: filteredDatasetCount, - totalCount: datasetCount, + filteredCount: filteredDatasetsCount, + totalCount: totalDatasetsCount, countLabel: t('datasets'), Header: BrowseDatasetTableHeader, }, diff --git a/frontend/packages/data-portal/app/routes/depositions.$id.tsx b/frontend/packages/data-portal/app/routes/depositions.$id.tsx index 84b9dd9eb..2aac88d8e 100644 --- a/frontend/packages/data-portal/app/routes/depositions.$id.tsx +++ b/frontend/packages/data-portal/app/routes/depositions.$id.tsx @@ -22,6 +22,7 @@ import { getDatasetsFilterData } from 'app/graphql/getDatasetsFilterData.server' import { getDepositionById } from 'app/graphql/getDepositionById.server' import { getDepositionByIdV2 } from 'app/graphql/getDepositionByIdV2.server' import { logIfHasDiff } from 'app/graphql/getDepositionDiffer' +import { useDatasetsFilterData } from 'app/hooks/useDatasetsFilterData' import { useDepositionById } from 'app/hooks/useDepositionById' import { useI18n } from 'app/hooks/useI18n' import { @@ -166,8 +167,8 @@ export function shouldRevalidate(args: ShouldRevalidateFunctionArgs) { } export default function DepositionByIdPage() { - const { deposition, datasetsCount, filteredDatasetsCount } = - useDepositionById() + const { deposition } = useDepositionById() + const { filteredDatasetsCount, totalDatasetsCount } = useDatasetsFilterData() const { t } = useI18n() const { setPreviousDepositionId, setPreviousSingleDepositionParams } = @@ -190,7 +191,7 @@ export default function DepositionByIdPage() { { title: t('datasetsWithDepositionData'), table: , - totalCount: datasetsCount, + totalCount: totalDatasetsCount, filteredCount: filteredDatasetsCount, filterPanel: , countLabel: t('datasets'), diff --git a/frontend/packages/data-portal/public/locales/en/translation.json b/frontend/packages/data-portal/public/locales/en/translation.json index 710065fe5..c6521ad65 100644 --- a/frontend/packages/data-portal/public/locales/en/translation.json +++ b/frontend/packages/data-portal/public/locales/en/translation.json @@ -228,6 +228,7 @@ "limitOneValuePerField": "Limit one value per field", "manual": "Manual", "meetsAll": "Meets all", + "meshes": "Meshes", "metadata": "Metadata", "methodCount": "Method {{ value }}", "methodLinks": "Method Links",