From 8878635aa9535d2108e9c2b3c2cd2d26a22a4bce Mon Sep 17 00:00:00 2001 From: MillenniumFalconMechanic Date: Wed, 29 Jan 2025 10:58:45 -0800 Subject: [PATCH] feat: unified export flow #4102 --- .../anvil-cmg/common/viewModelBuilders.ts | 244 +++++++++++++++--- pages/[entityListType]/[...params].tsx | 67 ++++- .../dev/detail/dataset/export/export.ts | 191 ++++++++++++++ .../dev/detail/dataset/exportMainColumn.ts | 44 ---- .../dev/detail/dataset/metadataMainColumn.ts | 47 ---- .../dev/index/datasetsEntityConfig.ts | 15 +- 6 files changed, 461 insertions(+), 147 deletions(-) create mode 100644 site-config/anvil-cmg/dev/detail/dataset/export/export.ts delete mode 100644 site-config/anvil-cmg/dev/detail/dataset/exportMainColumn.ts delete mode 100644 site-config/anvil-cmg/dev/detail/dataset/metadataMainColumn.ts diff --git a/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts b/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts index e5bc0c1f5..1ecb8573f 100644 --- a/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts +++ b/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts @@ -126,29 +126,52 @@ export const buildActivityType = ( }; /** - * Build props for list view access warning Alert component. + * Build props for dataset-related export warning Alert component. * @param _ - Unused. * @param viewContext - View context. * @returns model to be used as props for the Alert component. */ -export const buildAlertEntityListWarning = ( +export const buildAlertDatasetExportWarning = ( _: Unused, - viewContext: ViewContext -): React.ComponentProps => { + viewContext: ViewContext +): React.ComponentProps => { + const content = isUserAuthenticated(viewContext) + ? "To export this dataset, please request access." + : "To export this dataset, please sign in and, if necessary, request access."; return { ...ALERT_PROPS.STANDARD_WARNING, component: C.FluidPaper, - entityName: viewContext.entityConfig.label, + content, }; }; /** - * Build props for entity related export warning Alert component. + * Build props for entity related download manifest warning Alert component. * @param _ - Unused. * @param viewContext - View context. * @returns model to be used as props for the Alert component. */ -export const buildAlertExportEntityWarning = ( +export const buildAlertDatasetManifestDownloadWarning = ( + _: Unused, + viewContext: ViewContext +): React.ComponentProps => { + const content = isUserAuthenticated(viewContext) + ? "To download this dataset manifest, please request access." + : "To download this dataset manifest, please sign in and, if necessary, request access."; + return { + ...ALERT_PROPS.STANDARD_WARNING, + component: C.FluidPaper, + content, + }; +}; + +/** + * Build props for dataset-related export warning Alert component. + * @param _ - Unused. + * @param viewContext - View context. + * @returns model to be used as props for the Alert component. + */ +export const buildAlertDatasetTerraExportWarning = ( _: Unused, viewContext: ViewContext ): React.ComponentProps => { @@ -168,41 +191,38 @@ export const buildAlertExportEntityWarning = ( }; /** - * Build props for export warning Alert component. + * Build props for list view access warning Alert component. * @param _ - Unused. * @param viewContext - View context. * @returns model to be used as props for the Alert component. */ -export const buildAlertExportWarning = ( +export const buildAlertEntityListWarning = ( _: Unused, viewContext: ViewContext -): React.ComponentProps => { - const isAuthenticated = isUserAuthenticated(viewContext); +): React.ComponentProps => { return { ...ALERT_PROPS.STANDARD_WARNING, component: C.FluidPaper, - content: isAuthenticated ? null : MDX.AlertExportWarningContent({}), - size: isAuthenticated ? SIZE.MEDIUM : SIZE.LARGE, + entityName: viewContext.entityConfig.label, }; }; /** - * Build props for entity related download manifest warning Alert component. + * Build props for export warning Alert component. * @param _ - Unused. * @param viewContext - View context. * @returns model to be used as props for the Alert component. */ -export const buildAlertManifestDownloadEntityWarning = ( +export const buildAlertExportWarning = ( _: Unused, - viewContext: ViewContext -): React.ComponentProps => { - const content = isUserAuthenticated(viewContext) - ? "To download this dataset manifest, please request access." - : "To download this dataset manifest, please sign in and, if necessary, request access."; + viewContext: ViewContext +): React.ComponentProps => { + const isAuthenticated = isUserAuthenticated(viewContext); return { ...ALERT_PROPS.STANDARD_WARNING, component: C.FluidPaper, - content, + content: isAuthenticated ? null : MDX.AlertExportWarningContent({}), + size: isAuthenticated ? SIZE.MEDIUM : SIZE.LARGE, }; }; @@ -351,6 +371,121 @@ export const buildDatasetDetails = ( }; }; +/** + * Build base breadcrumbs for dataset export. Includes link to all datasets and + * the selected dataset. + * @param datasetsResponse - Response model return from datasets API. + * @returns array of breadcrumbs to be used by dataset export and dataset export method pages. + */ +export function buildDatasetExportBreadcrumbs( + datasetsResponse: DatasetsResponse +): Breadcrumb[] { + const datasetPath = buildDatasetPath(datasetsResponse); + const datasetTitle = getDatasetTitle(datasetsResponse); + return [ + { path: URL_DATASETS, text: "Datasets" }, + { path: datasetPath, text: datasetTitle }, + ]; +} + +/** + * Build props for dataset export BackPageHero component. + * @param datasetsResponse - Response model return from datasets API. + * @returns model to be used as props for the BackPageHero component. + */ +export function buildDatasetExportHero( + datasetsResponse: DatasetsResponse +): React.ComponentProps { + return { + breadcrumbs: [ + ...buildDatasetExportBreadcrumbs(datasetsResponse), + { path: "", text: "Choose Export Method" }, + ], + title: getDatasetTitle(datasetsResponse), + }; +} + +/** + * Returns breadcrumbs and title for dataset export method Hero component. + * @param datasetsResponse - Response model return from datasets API. + * @param title - Short export method description (e.g. Request File Manifest). + * @returns model to be used as props for the Hero component. + */ +function getDatasetExportMethodHero( + datasetsResponse: DatasetsResponse, + title: string +): React.ComponentProps { + const datasetPath = buildDatasetPath(datasetsResponse); + return { + breadcrumbs: [ + ...buildDatasetExportBreadcrumbs(datasetsResponse), + { path: `${datasetPath}/export`, text: "Choose Export Method" }, + { path: "", text: title }, + ], + title: getDatasetTitle(datasetsResponse), + }; +} + +/** + * Build props for dataset manifest download BackPageHero component. + * @param datasetsResponse - Response model return from datasets API. + * @returns model to be used as props for the BackPageHero component. + */ +export const buildDatasetExportMethodHeroManifestDownload = ( + datasetsResponse: DatasetsResponse +): React.ComponentProps => { + const title = "File Manifest"; + return getDatasetExportMethodHero(datasetsResponse, title); +}; + +/** + * Build props for dataset manifest download BackPageHero component. + * @param datasetsResponse - Response model return from datasets API. + * @returns model to be used as props for the BackPageHero component. + */ +export const buildDatasetExportMethodHeroTerraExport = ( + datasetsResponse: DatasetsResponse +): React.ComponentProps => { + const title = "Analyze in Terra"; + return getDatasetExportMethodHero(datasetsResponse, title); +}; + +/** + * Build props for ExportMethod component for display of the dataset manifest download section. + * @param datasetsResponse - Response model return from datasets API. + * @returns model to be used as props for the dataset file manifest export method component. + */ +export const buildDatasetExportMethodManifestDownload = ( + datasetsResponse: DatasetsResponse +): React.ComponentProps => { + const datasetPath = buildDatasetPath(datasetsResponse); + return { + buttonLabel: "Request File Manifest", + description: + "Request a file manifest suitable for downloading this dataset to your HPC cluster or local machine.", + route: `${datasetPath}${ROUTE_MANIFEST_DOWNLOAD}`, + title: "Download a File Manifest with Metadata", + }; +}; + +/** + * Build props for ExportMethod component for display of the export to terra metadata section. + * @param datasetsResponse - Response model return from datasets API. + * @returns model to be used as props for the dataset Terra export method component. + */ +export const buildDatasetExportMethodTerra = ( + datasetsResponse: DatasetsResponse +): React.ComponentProps => { + const datasetPath = buildDatasetPath(datasetsResponse); + return { + buttonLabel: "Analyze in Terra", + description: + "Terra is a biomedical research platform to analyze data using workflows, Jupyter Notebooks, RStudio, and Galaxy.", + route: `${datasetPath}${ROUTE_EXPORT_TO_TERRA}`, + title: "Export Dataset Data and Metadata to Terra Workspace", + }; +}; + /** * Build props for BackPageHero component from the given datasets response. * @param datasetsResponse - Response model return from datasets API. @@ -380,6 +515,16 @@ export const buildDatasetIds = ( }; }; +/** + * Build path to dataset from the given datasets response. + * @param datasetsResponse - Response model return from datasets API. + * @returns path to the dataset. + */ +export function buildDatasetPath(datasetsResponse: DatasetsResponse): string { + const datasetId = getDatasetEntryId(datasetsResponse); + return `${URL_DATASETS}/${datasetId}`; +} + /** * Build dataset title Link component from the given datasets response. * @param datasetsResponse - Response model return from datasets API. @@ -931,18 +1076,26 @@ function getDatasetCallToAction( const isReady = isResponseReady(datasetsResponse); const isAccessGranted = isDatasetAccessible(datasetsResponse); const registeredIdentifier = getDatasetRegisteredIdentifier(datasetsResponse); - if ( - !isReady || - isAccessGranted || - registeredIdentifier === LABEL.UNSPECIFIED - ) { + if (!isReady) { return; } - return { - label: "Request Access", - target: ANCHOR_TARGET.BLANK, - url: `https://dbgap.ncbi.nlm.nih.gov/aa/wga.cgi?adddataset=${registeredIdentifier}`, - }; + // Display export button if user is authorized to access the dataset. + if (isAccessGranted) { + return { + label: "Export", + target: ANCHOR_TARGET.SELF, + url: `/datasets/${getDatasetEntryId(datasetsResponse)}/export`, + }; + } + // Display request access button if user is not authorized to access the dataset. + if (registeredIdentifier === LABEL.UNSPECIFIED) { + return { + label: "Request Access", + target: ANCHOR_TARGET.BLANK, + url: `https://dbgap.ncbi.nlm.nih.gov/aa/wga.cgi?adddataset=${registeredIdentifier}`, + }; + } + // Otherwise, display nothing. } /** @@ -1309,12 +1462,14 @@ export const renderWhenUnAuthenticated = ( }; /** - * Renders entity related export when the given datasests response is accessible. + * Renders dataset export to Terra component when the given datasests response is accessible. Note, + * this can be removed once the verbatim feature flag is removed (use renderDatasetExport instead). * @param datasetsResponse - Response model return from datasets API. * @param viewContext - View context. * @returns model to be used as props for the ConditionalComponent component. + * @deprecated */ -export const renderExportEntity = ( +export const renderDatasetTerraExport = ( datasetsResponse: DatasetsResponse, viewContext: ViewContext ): React.ComponentProps => { @@ -1329,12 +1484,14 @@ export const renderExportEntity = ( }; /** - * Renders entity related export warning when the given datasests response is not accessible. + * Renders dataset export to Terra warning component when the given datasests response is accessible. Note, + * this can be removed once the verbatim feature flag is removed (use renderDatasetExportWarning instead). * @param datasetsResponse - Response model return from datasets API. * @param viewContext - View context. * @returns model to be used as props for the ConditionalComponent component. + * @deprecated */ -export const renderExportEntityWarning = ( +export const renderDatasetTerraExportWarning = ( datasetsResponse: DatasetsResponse, viewContext: ViewContext ): React.ComponentProps => { @@ -1342,19 +1499,19 @@ export const renderExportEntityWarning = ( exploreState: { featureFlagState }, } = viewContext; return { - isIn: !( - isDatasetAccessible(datasetsResponse) && - Boolean(featureFlagState?.includes(FEATURE_FLAGS.VERBATIM)) - ), + isIn: + !isDatasetAccessible(datasetsResponse) || + Boolean(!featureFlagState?.includes(FEATURE_FLAGS.VERBATIM)), }; }; /** - * Renders entity related download manifest when the given datasests response is accessible. + * Renders dataset export-related components (either the choose export method component, + * or specific export components) when the given dataset is accessble. * @param datasetsResponse - Response model return from datasets API. * @returns model to be used as props for the ConditionalComponent component. */ -export const renderManifestDownloadEntity = ( +export const renderDatasetExport = ( datasetsResponse: DatasetsResponse ): React.ComponentProps => { return { @@ -1363,11 +1520,12 @@ export const renderManifestDownloadEntity = ( }; /** - * Renders entity related download manifest warning when the given datasests response is not accessible. + * Renders dataset export-related warning components (either the choose export method component, + * or specific export components) when the given dataset is not accessible. * @param datasetsResponse - Response model return from datasets API. * @returns model to be used as props for the ConditionalComponent component. */ -export const renderManifestDownloadEntityWarning = ( +export const renderDatasetExportWarning = ( datasetsResponse: DatasetsResponse ): React.ComponentProps => { return { diff --git a/pages/[entityListType]/[...params].tsx b/pages/[entityListType]/[...params].tsx index f58b8bf58..68ec2e709 100644 --- a/pages/[entityListType]/[...params].tsx +++ b/pages/[entityListType]/[...params].tsx @@ -5,6 +5,7 @@ import { AzulListParams, } from "@databiosphere/findable-ui/lib/apis/azul/common/entities"; import { + PARAMS_INDEX_EXPORT_METHOD, PARAMS_INDEX_TAB, PARAMS_INDEX_UUID, } from "@databiosphere/findable-ui/lib/common/constants"; @@ -19,11 +20,14 @@ import { getEntityService } from "@databiosphere/findable-ui/lib/hooks/useEntity import { EXPLORE_MODE } from "@databiosphere/findable-ui/lib/hooks/useExploreMode"; import { database } from "@databiosphere/findable-ui/lib/utils/database"; import { EntityDetailView } from "@databiosphere/findable-ui/lib/views/EntityDetailView/entityDetailView"; +import { EntityExportView } from "@databiosphere/findable-ui/lib/views/EntityExportView/entityExportView"; +import { EntityExportMethodView } from "@databiosphere/findable-ui/lib/views/EntityExportMethodView/entityExportMethodView"; import { config } from "app/config/config"; import { GetStaticPaths, GetStaticProps, GetStaticPropsContext } from "next"; import { ParsedUrlQuery } from "querystring"; import { EntityGuard } from "../../app/components/Detail/components/EntityGuard/entityGuard"; import { readFile } from "../../app/utils/tsvParser"; +import { useRouter } from "next/router"; const setOfProcessedIds = new Set(); @@ -48,8 +52,11 @@ export interface EntityDetailPageProps extends AzulEntityStaticResponse { * @returns Entity detail view component. */ const EntityDetailPage = (props: EntityDetailPageProps): JSX.Element => { + const { query } = useRouter(); if (!props.entityListType) return <>; if (props.override) return ; + if (isChooseExportView(query)) return ; + if (isExportMethodView(query)) return ; return ; }; @@ -83,6 +90,44 @@ function isOverride(override: Override): boolean { ); } +/** + * Determine if the current view is choose export. + * @param query - The current query object. + * @returns True if the current view is choose export. + */ +function isChooseExportView(query: ParsedUrlQuery): boolean { + // Must have query params for export view. + if (!query.params) { + return false; + } + // Must have correct number of params for export view. + if (query.params.length !== PARAMS_INDEX_TAB + 1) { + return false; + } + // Must have export param. + const exportPathSegment = query.params[PARAMS_INDEX_TAB]; + return !!exportPathSegment && exportPathSegment === "export"; +} + +/** + * Determine if the current view is an export method. + * @param query - The current query object. + * @returns True if the current view is an export method. + */ +function isExportMethodView(query: ParsedUrlQuery): boolean { + // Must have query params for export method view. + if (!query.params) { + return false; + } + // Must have correct number of params for export method view. + if (query.params.length !== PARAMS_INDEX_EXPORT_METHOD + 1) { + return false; + } + // Must have export param. + const exportPathSegment = query.params[PARAMS_INDEX_TAB]; + return !!exportPathSegment && exportPathSegment === "export"; +} + /** * Seed database. * @param entityListType - Entity list type. @@ -343,7 +388,7 @@ function processEntityPaths( entitiesResponse: AzulEntitiesResponse, paths: StaticPath[] ): void { - const { detail, route: entityListType } = entityConfig; + const { detail, export: exportConfig, route: entityListType } = entityConfig; const { tabs } = detail; const { hits: entities } = entitiesResponse; const tabRoutes = getTabRoutes(tabs); @@ -363,6 +408,26 @@ function processEntityPaths( }, }); } + // Generate paths for exports: add paths for choose method and each individual + // export method. + if (!exportConfig) continue; + for (const exportRoute of [ + ...exportConfig.tabs, + ...exportConfig.exportMethods, + ]) { + // Split export routes into individual paths (e.g. /export/download-manifest), + // removing any slashes. Default to empty array if no route is provided. + const exportRoutePaths = + exportRoute?.route?.split("/").filter(Boolean) || []; + // Build and add paths for each export route. + const params = [entityId, ...exportRoutePaths]; + paths.push({ + params: { + entityListType, + params, + }, + }); + } } } diff --git a/site-config/anvil-cmg/dev/detail/dataset/export/export.ts b/site-config/anvil-cmg/dev/detail/dataset/export/export.ts new file mode 100644 index 000000000..9f8bf746c --- /dev/null +++ b/site-config/anvil-cmg/dev/detail/dataset/export/export.ts @@ -0,0 +1,191 @@ +import { + ComponentConfig, + ExportConfig, +} from "@databiosphere/findable-ui/lib/config/entities"; +import { sideColumn as exportSideColumn } from "../../../export/exportSideColumn"; +import * as V from "../../../../../../app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders"; +import * as C from "../../../../../../app/components"; +import { DatasetsResponse } from "app/apis/azul/anvil-cmg/common/responses"; +import { + ROUTE_EXPORT_TO_TERRA, + ROUTE_MANIFEST_DOWNLOAD, +} from "../../../export/constants"; +import * as MDX from "../../../../../../app/components/common/MDXContent/anvil-cmg"; + +/** + * Badge indicating dataset accessibility. + */ +const DATASET_ACCESSIBILITY_BADGE = { + component: C.AccessibilityBadge, + viewBuilder: V.buildDatasetAccessibilityBadge, +} as ComponentConfig; + +/** + * Dataset export configuration. + */ +export const exportConfig: ExportConfig = { + exportMethods: [ + { + mainColumn: [ + /* --------- */ + /* Dataset is not accessible; render warning */ + /* --------- */ + { + children: [ + { + children: [ + { + component: MDX.Alert, + viewBuilder: V.buildAlertDatasetTerraExportWarning, + } as ComponentConfig, + ], + component: C.BackPageContentSingleColumn, + } as ComponentConfig, + ], + component: C.ConditionalComponent, + viewBuilder: V.renderDatasetTerraExportWarning, + } as ComponentConfig, + /* ------ */ + /* Dataset is accessible; render Terra export method */ + /* ------ */ + { + children: [ + { + children: [ + { + component: C.ExportToTerra, + viewBuilder: V.buildExportToTerra, + } as ComponentConfig, + ], + component: C.BackPageContentMainColumn, + } as ComponentConfig, + /* sideColumn */ + ...exportSideColumn, + ], + component: C.ConditionalComponent, + viewBuilder: V.renderDatasetTerraExport, + } as ComponentConfig, + ], + route: ROUTE_EXPORT_TO_TERRA, + top: [ + { + children: [DATASET_ACCESSIBILITY_BADGE], + component: C.BackPageHero, + viewBuilder: V.buildDatasetExportMethodHeroTerraExport, + } as ComponentConfig, + ], + }, + { + mainColumn: [ + /* --------- */ + /* Dataset is not accessible; render warning */ + /* --------- */ + { + children: [ + { + children: [ + { + component: MDX.Alert, + viewBuilder: V.buildAlertDatasetManifestDownloadWarning, + } as ComponentConfig, + ], + component: C.BackPageContentSingleColumn, + } as ComponentConfig, + ], + component: C.ConditionalComponent, + viewBuilder: V.renderDatasetExportWarning, + } as ComponentConfig, + /* ------ */ + /* Dataset is accessible; render file manifest method */ + /* ------ */ + { + children: [ + { + children: [ + { + component: C.AnVILManifestDownloadEntity, + viewBuilder: V.buildManifestDownloadEntity, + } as ComponentConfig< + typeof C.AnVILManifestDownloadEntity, + DatasetsResponse + >, + ], + component: C.BackPageContentMainColumn, + } as ComponentConfig, + /* sideColumn */ + ...exportSideColumn, + ], + component: C.ConditionalComponent, + viewBuilder: V.renderDatasetExport, + } as ComponentConfig, + ], + route: ROUTE_MANIFEST_DOWNLOAD, + top: [ + { + children: [DATASET_ACCESSIBILITY_BADGE], + component: C.BackPageHero, + viewBuilder: V.buildDatasetExportMethodHeroManifestDownload, + } as ComponentConfig, + ], + }, + ], + staticLoad: true, // TODO this matches the cohort export config, but is it necessary? + tabs: [ + { + label: "Choose Export Method", + mainColumn: [ + /* --------- */ + /* Dataset is not accessible; render warning */ + /* --------- */ + { + children: [ + { + children: [ + { + component: MDX.Alert, + // TODO(cc) update text + viewBuilder: V.buildAlertDatasetExportWarning, + } as ComponentConfig, + ], + component: C.BackPageContentSingleColumn, + } as ComponentConfig, + ], + component: C.ConditionalComponent, + viewBuilder: V.renderDatasetExportWarning, + } as ComponentConfig, + /* ------ */ + /* Dataset is accessible; render export entity */ + /* ------ */ + { + children: [ + { + children: [ + { + component: C.ExportMethod, + viewBuilder: V.buildDatasetExportMethodTerra, + } as ComponentConfig, + { + component: C.ExportMethod, + viewBuilder: V.buildDatasetExportMethodManifestDownload, + } as ComponentConfig, + ], + component: C.BackPageContentMainColumn, + } as ComponentConfig, + /* sideColumn */ + ...exportSideColumn, + ], + component: C.ConditionalComponent, + viewBuilder: V.renderDatasetExport, + } as ComponentConfig, + ], + route: "/export", + }, + ], + top: [ + { + children: [DATASET_ACCESSIBILITY_BADGE], + component: C.BackPageHero, + viewBuilder: V.buildDatasetExportHero, + } as ComponentConfig, + ], +}; diff --git a/site-config/anvil-cmg/dev/detail/dataset/exportMainColumn.ts b/site-config/anvil-cmg/dev/detail/dataset/exportMainColumn.ts deleted file mode 100644 index b7ab9aee4..000000000 --- a/site-config/anvil-cmg/dev/detail/dataset/exportMainColumn.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { ComponentConfig } from "@databiosphere/findable-ui/lib/config/entities"; -import { DatasetsResponse } from "../../../../../app/apis/azul/anvil-cmg/common/responses"; -import * as C from "../../../../../app/components"; -import * as MDX from "../../../../../app/components/common/MDXContent/anvil-cmg"; -import * as V from "../../../../../app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders"; -import { sideColumn } from "../../export/exportSideColumn"; - -export const mainColumn: ComponentConfig[] = [ - { - /* Dataset is not accessible; render warning */ - children: [ - { - children: [ - { - component: MDX.Alert, - viewBuilder: V.buildAlertExportEntityWarning, - } as ComponentConfig, - ], - component: C.BackPageContentSingleColumn, - } as ComponentConfig, - ], - component: C.ConditionalComponent, - viewBuilder: V.renderExportEntityWarning, - } as ComponentConfig, - { - /* Dataset is accessible; render export entity */ - children: [ - /* mainColumn */ - { - children: [ - { - component: C.ExportToTerra, - viewBuilder: V.buildExportEntityToTerra, - } as ComponentConfig, - ], - component: C.BackPageContentMainColumn, - } as ComponentConfig, - /* sideColumn */ - ...sideColumn, - ], - component: C.ConditionalComponent, - viewBuilder: V.renderExportEntity, - } as ComponentConfig, -]; diff --git a/site-config/anvil-cmg/dev/detail/dataset/metadataMainColumn.ts b/site-config/anvil-cmg/dev/detail/dataset/metadataMainColumn.ts deleted file mode 100644 index 2168418cb..000000000 --- a/site-config/anvil-cmg/dev/detail/dataset/metadataMainColumn.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { ComponentConfig } from "@databiosphere/findable-ui/lib/config/entities"; -import { DatasetsResponse } from "../../../../../app/apis/azul/anvil-cmg/common/responses"; -import * as C from "../../../../../app/components"; -import * as MDX from "../../../../../app/components/common/MDXContent/anvil-cmg"; -import * as V from "../../../../../app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders"; -import { sideColumn } from "../../export/exportSideColumn"; - -export const mainColumn: ComponentConfig[] = [ - { - /* Dataset is not accessible; render warning */ - children: [ - { - children: [ - { - component: MDX.Alert, - viewBuilder: V.buildAlertManifestDownloadEntityWarning, - } as ComponentConfig, - ], - component: C.BackPageContentSingleColumn, - } as ComponentConfig, - ], - component: C.ConditionalComponent, - viewBuilder: V.renderManifestDownloadEntityWarning, - } as ComponentConfig, - { - /* Dataset is accessible; render export entity */ - children: [ - /* mainColumn */ - { - children: [ - { - component: C.AnVILManifestDownloadEntity, - viewBuilder: V.buildManifestDownloadEntity, - } as ComponentConfig< - typeof C.AnVILManifestDownloadEntity, - DatasetsResponse - >, - ], - component: C.BackPageContentMainColumn, - } as ComponentConfig, - /* sideColumn */ - ...sideColumn, - ], - component: C.ConditionalComponent, - viewBuilder: V.renderManifestDownloadEntity, - } as ComponentConfig, -]; diff --git a/site-config/anvil-cmg/dev/index/datasetsEntityConfig.ts b/site-config/anvil-cmg/dev/index/datasetsEntityConfig.ts index cfbeb8f89..a4ef47095 100644 --- a/site-config/anvil-cmg/dev/index/datasetsEntityConfig.ts +++ b/site-config/anvil-cmg/dev/index/datasetsEntityConfig.ts @@ -14,13 +14,12 @@ import { ANVIL_CMG_CATEGORY_KEY, ANVIL_CMG_CATEGORY_LABEL, } from "../../category"; -import { mainColumn as exportMainColumn } from "../detail/dataset/exportMainColumn"; -import { mainColumn as metadataMainColumn } from "../detail/dataset/metadataMainColumn"; import { mainColumn } from "../detail/dataset/overviewMainColumn"; import { sideColumn } from "../detail/dataset/overviewSideColumn"; import { top } from "../detail/dataset/top"; import { listHero } from "../listView/datasetsListHero"; import { subTitleHero } from "../listView/subTitleHero"; +import { exportConfig } from "../detail/dataset/export/export"; /** * Entity config object responsible for config related to the /datasets route. @@ -37,22 +36,14 @@ export const datasetsEntityConfig: EntityConfig = { route: "", sideColumn: sideColumn, }, - { - label: "Metadata", - mainColumn: metadataMainColumn, - route: "project-metadata", - }, - { - label: "Export", - mainColumn: exportMainColumn, - route: "export-to-terra", - }, ], top: top, }, exploreMode: EXPLORE_MODE.SS_FETCH_SS_FILTERING, + export: exportConfig, getId: getDatasetEntryId, getTitle: getTitle, + hideTabs: true, label: "Datasets", list: { columns: [