From 89d13aaf08553716cc8138a8fb25ff6e16378844 Mon Sep 17 00:00:00 2001 From: Fran McDade <18710366+frano-m@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:37:15 +1000 Subject: [PATCH 1/4] feat: optionally add logos on exports list (#4741) --- .../ExportMethod/components/Icon/icon.tsx | 13 +++++++++++++ .../azul/anvil-cmg/common/viewModelBuilders.tsx | 9 ++++++++- package-lock.json | 8 ++++---- package.json | 2 +- public/export/bdc.webp | Bin 0 -> 690 bytes public/export/cavatica.webp | Bin 0 -> 5472 bytes public/export/cgc.webp | Bin 0 -> 2324 bytes public/export/curl.webp | Bin 0 -> 528 bytes public/export/manifest.webp | Bin 0 -> 670 bytes public/export/terra.webp | Bin 0 -> 2620 bytes .../dev/export/{constants.ts => constants.tsx} | 9 ++++++++- 11 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 app/components/Export/components/AnVILExplorer/components/ExportMethod/components/Icon/icon.tsx create mode 100644 public/export/bdc.webp create mode 100644 public/export/cavatica.webp create mode 100644 public/export/cgc.webp create mode 100644 public/export/curl.webp create mode 100644 public/export/manifest.webp create mode 100644 public/export/terra.webp rename site-config/anvil-cmg/dev/export/{constants.ts => constants.tsx} (81%) diff --git a/app/components/Export/components/AnVILExplorer/components/ExportMethod/components/Icon/icon.tsx b/app/components/Export/components/AnVILExplorer/components/ExportMethod/components/Icon/icon.tsx new file mode 100644 index 000000000..0b6306b82 --- /dev/null +++ b/app/components/Export/components/AnVILExplorer/components/ExportMethod/components/Icon/icon.tsx @@ -0,0 +1,13 @@ +import { StaticImage } from "@databiosphere/findable-ui/lib/components/common/StaticImage/staticImage"; +import type { ComponentProps, JSX } from "react"; + +/** + * Icon component that wraps the StaticImage component. + * @param props - Component props. + * @returns JSX element representing the icon. + */ +export const Icon = ( + props: ComponentProps +): JSX.Element => { + return ; +}; diff --git a/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx b/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx index 20d5ed31f..ccc6f57bf 100644 --- a/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx +++ b/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx @@ -39,7 +39,6 @@ import { FadeProps as MFadeProps, Tooltip, } from "@mui/material"; -import { ExportEntity } from "app/components/Export/components/AnVILExplorer/components/ExportEntity/exportEntity"; import React, { ComponentProps, ReactNode } from "react"; import { ANVIL_CMG_CATEGORY_KEY, @@ -104,6 +103,8 @@ import * as C from "../../../../components"; import * as MDX from "../../../../components/common/MDXContent/anvil-cmg"; import { RequestAccess } from "../../../../components/Detail/components/AnVILCMG/components/RequestAccess/requestAccess"; import { Description } from "../../../../components/Detail/components/MDX/components/Description/description"; +import { ExportEntity } from "../../../../components/Export/components/AnVILExplorer/components/ExportEntity/exportEntity"; +import { Icon } from "../../../../components/Export/components/AnVILExplorer/components/ExportMethod/components/Icon/icon"; import { METADATA_KEY } from "../../../../components/Index/common/entities"; import { getPluralizedMetadataLabel } from "../../../../components/Index/common/indexTransformer"; import { SUMMARY_DISPLAY_TEXT } from "./summaryMapper/constants"; @@ -472,6 +473,7 @@ export const buildDatasetExportMethodManifestDownload = ( return { description: "Download a TSV manifest containing metadata for all data files in the dataset.", + icon: , route: `${datasetPath}${ROUTES.MANIFEST_DOWNLOAD}`, title: "Download TSV Manifest", }; @@ -505,6 +507,7 @@ export const buildDatasetExportMethodTerra = ( return { description: "Terra is a biomedical research platform to analyze data using workflows, Jupyter Notebooks, RStudio, and Galaxy.", + icon: , route: `${datasetPath}${ROUTES.TERRA}`, title: "Export to Terra", }; @@ -534,6 +537,7 @@ export const buildDatasetExportMethodCurlCommand = ( return { description: "Generate a curl command to download all files in this open-access dataset.", + icon: , route: `${datasetPath}${ROUTES.CURL_DOWNLOAD}`, title: "Download Open-Access Data Files (No Data Transfer Fees)", }; @@ -887,6 +891,7 @@ export const buildExportMethodManifestDownload = ( ...getExportMethodAccessibility(viewContext), description: "Download a TSV manifest containing metadata for all data files in the current selection, including managed-access files.", + icon: , route: ROUTES.MANIFEST_DOWNLOAD, title: "Download TSV Manifest for All Selected Data Files", }; @@ -906,6 +911,7 @@ export const buildExportMethodTerra = ( ...getExportMethodAccessibility(viewContext), description: "Terra is a biomedical research platform to analyze data using workflows, Jupyter Notebooks, RStudio, and Galaxy.", + icon: , route: ROUTES.TERRA, title: "Export to Terra", }; @@ -956,6 +962,7 @@ export const buildExportMethodBulkDownload = ( files in the current selection. ), + icon: , route: ROUTES.CURL_DOWNLOAD, title: "Download Open-Access Data Files (No Data Transfer Fees)", }; diff --git a/package-lock.json b/package-lock.json index 828a5221f..13b8f29c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "explorer", "version": "2.30.0", "dependencies": { - "@databiosphere/findable-ui": "^50.4.0", + "@databiosphere/findable-ui": "^50.5.0", "@emotion/react": "^11", "@emotion/styled": "^11", "@mdx-js/loader": "^3", @@ -1052,9 +1052,9 @@ } }, "node_modules/@databiosphere/findable-ui": { - "version": "50.4.0", - "resolved": "https://registry.npmjs.org/@databiosphere/findable-ui/-/findable-ui-50.4.0.tgz", - "integrity": "sha512-mCcfpekFvYDITqy6FMQk+lVyMWVIUz/kTGEH7i2Bx0OZd+T4AWseuYE+OZal/mYp7NQCCQoV4HO481sFKKcNzw==", + "version": "50.5.0", + "resolved": "https://registry.npmjs.org/@databiosphere/findable-ui/-/findable-ui-50.5.0.tgz", + "integrity": "sha512-bf00fAtteVi7BIJats97w6frN1iaQNLQTQVH7SDQ/IoQbvhCPQgM77xJwNwgsFWnaH/jf4hjIuGsPR8Z/NBbZw==", "license": "Apache-2.0", "engines": { "node": "22.12.0" diff --git a/package.json b/package.json index ab588fda3..93c882e6d 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "check-system-status:anvil-cmg": "esrun e2e/anvil/anvil-check-system-status.ts" }, "dependencies": { - "@databiosphere/findable-ui": "^50.4.0", + "@databiosphere/findable-ui": "^50.5.0", "@emotion/react": "^11", "@emotion/styled": "^11", "@mdx-js/loader": "^3", diff --git a/public/export/bdc.webp b/public/export/bdc.webp new file mode 100644 index 0000000000000000000000000000000000000000..92b253a9cf689111d93c6b6047ff2803ac300e4c GIT binary patch literal 690 zcmV;j0!{r=Nk&Gh0ssJ4MM6+kP&il$0000G0000-002h-06|PpNGJdR00AE$5J>T8 znH>=k!$<%m?BIl_Ni4J(VSpi`{}X_s9CI(8uSJfDB34j1AY1|f0B{iiodGIH07w8n zF&K$MA|as_%B(;j0|cOl02x8ge|Y1G;Q^}sz;=M~0RDm16U+zbr|lmI2kWO;2cQQ? z_w9G>C$Y`mU)pQ8TXbf#=U@6>;D4!~@4Dvxw|fA7yBGK#JCUU5%L>Z6!?XXvdz>fv*!0a%@x`p^{S}L`5KnM4RcYv0092$ll`P?1DWf4&;_DBQFLba z8(Z!)t^(FM&lNYAx30W@yy=GOr(0d+W80@3!z@CB*N6Fz&kPIys5@k;892=x zKd+MwIb`{k!jb09CzbPaQz?nFJ3UZ>poMv?hpV4hf5^*R<)IU&T08%*zc9oZph`DL?X+q(nHcrJ`#6C;ffd1C5c57DcKnVy3|q01~BCA^-pY literal 0 HcmV?d00001 diff --git a/public/export/cavatica.webp b/public/export/cavatica.webp new file mode 100644 index 0000000000000000000000000000000000000000..3e91ad90d24fda9a3f856dd77157ede1bb6b8f23 GIT binary patch literal 5472 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 W;+TKpjQdgdiw}p@v(`<(0002Etfk@r literal 0 HcmV?d00001 diff --git a/public/export/cgc.webp b/public/export/cgc.webp new file mode 100644 index 0000000000000000000000000000000000000000..d340669040afddcf85e12dadca3a642af966429d GIT binary patch literal 2324 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 SAaFt%?UkoA5yI)<0002C3-#^* literal 0 HcmV?d00001 diff --git a/public/export/manifest.webp b/public/export/manifest.webp new file mode 100644 index 0000000000000000000000000000000000000000..f193cdef78ecfc1a4135ce6c57f043fd03dee13a GIT binary patch literal 670 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 literal 0 HcmV?d00001 diff --git a/site-config/anvil-cmg/dev/export/constants.ts b/site-config/anvil-cmg/dev/export/constants.tsx similarity index 81% rename from site-config/anvil-cmg/dev/export/constants.ts rename to site-config/anvil-cmg/dev/export/constants.tsx index 80de619cb..8f0964c2a 100644 --- a/site-config/anvil-cmg/dev/export/constants.ts +++ b/site-config/anvil-cmg/dev/export/constants.tsx @@ -1,6 +1,7 @@ import { ExportMethod } from "@databiosphere/findable-ui/lib/components/Export/components/ExportMethod/exportMethod"; import { ComponentProps } from "react"; import { ExportToPlatform } from "../../../../app/components"; +import { Icon } from "../../../../app/components/Export/components/AnVILExplorer/components/ExportMethod/components/Icon/icon"; import { ROUTES } from "./routes"; export const EXPORTS: Record< @@ -35,20 +36,26 @@ export const EXPORTS: Record< export const EXPORT_METHODS: Record< string, - Pick, "description" | "route" | "title"> + Pick< + ComponentProps, + "description" | "icon" | "route" | "title" + > > = { BIO_DATA_CATALYST: { description: EXPORTS.BIO_DATA_CATALYST.description, + icon: , route: ROUTES.BIO_DATA_CATALYST, title: "Export to BioData Catalyst Powered by Seven Bridges (BDC-SB)", }, CANCER_GENOMICS_CLOUD: { description: EXPORTS.CANCER_GENOMICS_CLOUD.description, + icon: , route: ROUTES.CANCER_GENOMICS_CLOUD, title: "Export to Cancer Genomics Cloud (CGC)", }, CAVATICA: { description: EXPORTS.CAVATICA.description, + icon: , route: ROUTES.CAVATICA, title: "Export to CAVATICA", }, From 698946a6273d091b60616a541c1c4d5b30c88cab Mon Sep 17 00:00:00 2001 From: Fran McDade <18710366+frano-m@users.noreply.github.com> Date: Thu, 2 Apr 2026 17:10:59 +1000 Subject: [PATCH 2/4] fix: viewbuilder types to include icon in component props (#4741) --- .../azul/anvil-cmg/common/viewModelBuilders.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx b/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx index ccc6f57bf..0482c42d9 100644 --- a/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx +++ b/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx @@ -624,7 +624,7 @@ export const buildDatasetExportToPlatformMethod = ({ ...props }: Pick< ComponentProps, - "description" | "route" | "title" + "description" | "icon" | "route" | "title" >): (( response: DatasetsResponse, viewContext: ViewContext @@ -1066,7 +1066,7 @@ export const buildExportToPlatformHero = ( export const buildExportToPlatformMethod = ( props: Pick< ComponentProps, - "description" | "route" | "title" + "description" | "icon" | "route" | "title" > ): (( _: unknown, From 7b1e2539e9e5a72cc4de20807b83049ab977c64e Mon Sep 17 00:00:00 2001 From: Fran McDade <18710366+frano-m@users.noreply.github.com> Date: Thu, 2 Apr 2026 17:22:37 +1000 Subject: [PATCH 3/4] fix: rename icon component to export icon (#4741) --- .../{Icon/icon.tsx => ExportIcon/exportIcon.tsx} | 2 +- .../azul/anvil-cmg/common/viewModelBuilders.tsx | 14 +++++++------- site-config/anvil-cmg/dev/export/constants.tsx | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) rename app/components/Export/components/AnVILExplorer/components/ExportMethod/components/{Icon/icon.tsx => ExportIcon/exportIcon.tsx} (93%) diff --git a/app/components/Export/components/AnVILExplorer/components/ExportMethod/components/Icon/icon.tsx b/app/components/Export/components/AnVILExplorer/components/ExportMethod/components/ExportIcon/exportIcon.tsx similarity index 93% rename from app/components/Export/components/AnVILExplorer/components/ExportMethod/components/Icon/icon.tsx rename to app/components/Export/components/AnVILExplorer/components/ExportMethod/components/ExportIcon/exportIcon.tsx index 0b6306b82..aa5b63be5 100644 --- a/app/components/Export/components/AnVILExplorer/components/ExportMethod/components/Icon/icon.tsx +++ b/app/components/Export/components/AnVILExplorer/components/ExportMethod/components/ExportIcon/exportIcon.tsx @@ -6,7 +6,7 @@ import type { ComponentProps, JSX } from "react"; * @param props - Component props. * @returns JSX element representing the icon. */ -export const Icon = ( +export const ExportIcon = ( props: ComponentProps ): JSX.Element => { return ; diff --git a/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx b/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx index 0482c42d9..a39c9e8e1 100644 --- a/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx +++ b/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.tsx @@ -104,7 +104,7 @@ import * as MDX from "../../../../components/common/MDXContent/anvil-cmg"; import { RequestAccess } from "../../../../components/Detail/components/AnVILCMG/components/RequestAccess/requestAccess"; import { Description } from "../../../../components/Detail/components/MDX/components/Description/description"; import { ExportEntity } from "../../../../components/Export/components/AnVILExplorer/components/ExportEntity/exportEntity"; -import { Icon } from "../../../../components/Export/components/AnVILExplorer/components/ExportMethod/components/Icon/icon"; +import { ExportIcon } from "../../../../components/Export/components/AnVILExplorer/components/ExportMethod/components/ExportIcon/exportIcon"; import { METADATA_KEY } from "../../../../components/Index/common/entities"; import { getPluralizedMetadataLabel } from "../../../../components/Index/common/indexTransformer"; import { SUMMARY_DISPLAY_TEXT } from "./summaryMapper/constants"; @@ -473,7 +473,7 @@ export const buildDatasetExportMethodManifestDownload = ( return { description: "Download a TSV manifest containing metadata for all data files in the dataset.", - icon: , + icon: , route: `${datasetPath}${ROUTES.MANIFEST_DOWNLOAD}`, title: "Download TSV Manifest", }; @@ -507,7 +507,7 @@ export const buildDatasetExportMethodTerra = ( return { description: "Terra is a biomedical research platform to analyze data using workflows, Jupyter Notebooks, RStudio, and Galaxy.", - icon: , + icon: , route: `${datasetPath}${ROUTES.TERRA}`, title: "Export to Terra", }; @@ -537,7 +537,7 @@ export const buildDatasetExportMethodCurlCommand = ( return { description: "Generate a curl command to download all files in this open-access dataset.", - icon: , + icon: , route: `${datasetPath}${ROUTES.CURL_DOWNLOAD}`, title: "Download Open-Access Data Files (No Data Transfer Fees)", }; @@ -891,7 +891,7 @@ export const buildExportMethodManifestDownload = ( ...getExportMethodAccessibility(viewContext), description: "Download a TSV manifest containing metadata for all data files in the current selection, including managed-access files.", - icon: , + icon: , route: ROUTES.MANIFEST_DOWNLOAD, title: "Download TSV Manifest for All Selected Data Files", }; @@ -911,7 +911,7 @@ export const buildExportMethodTerra = ( ...getExportMethodAccessibility(viewContext), description: "Terra is a biomedical research platform to analyze data using workflows, Jupyter Notebooks, RStudio, and Galaxy.", - icon: , + icon: , route: ROUTES.TERRA, title: "Export to Terra", }; @@ -962,7 +962,7 @@ export const buildExportMethodBulkDownload = ( files in the current selection. ), - icon: , + icon: , route: ROUTES.CURL_DOWNLOAD, title: "Download Open-Access Data Files (No Data Transfer Fees)", }; diff --git a/site-config/anvil-cmg/dev/export/constants.tsx b/site-config/anvil-cmg/dev/export/constants.tsx index 8f0964c2a..b2d2dc83c 100644 --- a/site-config/anvil-cmg/dev/export/constants.tsx +++ b/site-config/anvil-cmg/dev/export/constants.tsx @@ -1,7 +1,7 @@ import { ExportMethod } from "@databiosphere/findable-ui/lib/components/Export/components/ExportMethod/exportMethod"; import { ComponentProps } from "react"; import { ExportToPlatform } from "../../../../app/components"; -import { Icon } from "../../../../app/components/Export/components/AnVILExplorer/components/ExportMethod/components/Icon/icon"; +import { ExportIcon } from "../../../../app/components/Export/components/AnVILExplorer/components/ExportMethod/components/ExportIcon/exportIcon"; import { ROUTES } from "./routes"; export const EXPORTS: Record< @@ -43,19 +43,19 @@ export const EXPORT_METHODS: Record< > = { BIO_DATA_CATALYST: { description: EXPORTS.BIO_DATA_CATALYST.description, - icon: , + icon: , route: ROUTES.BIO_DATA_CATALYST, title: "Export to BioData Catalyst Powered by Seven Bridges (BDC-SB)", }, CANCER_GENOMICS_CLOUD: { description: EXPORTS.CANCER_GENOMICS_CLOUD.description, - icon: , + icon: , route: ROUTES.CANCER_GENOMICS_CLOUD, title: "Export to Cancer Genomics Cloud (CGC)", }, CAVATICA: { description: EXPORTS.CAVATICA.description, - icon: , + icon: , route: ROUTES.CAVATICA, title: "Export to CAVATICA", }, From b39f5a2c8ec1ebacde0ce478c063a2cae5cc9a9f Mon Sep 17 00:00:00 2001 From: Fran McDade <18710366+frano-m@users.noreply.github.com> Date: Thu, 2 Apr 2026 18:40:23 +1000 Subject: [PATCH 4/4] fix: update e2e card locator to use MuiPaper ancestor and CardActionArea (#4741) Co-Authored-By: Claude Opus 4.6 (1M context) --- e2e/anvil/anvil-dataset.spec.ts | 3 ++- e2e/testFunctions.ts | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/e2e/anvil/anvil-dataset.spec.ts b/e2e/anvil/anvil-dataset.spec.ts index e3d623a10..6b0ebe84b 100644 --- a/e2e/anvil/anvil-dataset.spec.ts +++ b/e2e/anvil/anvil-dataset.spec.ts @@ -176,7 +176,8 @@ describe("Dataset", () => { */ async function clickCard(page: Page, headingText: string): Promise { await getHeadingWithText(page, headingText) - .locator("xpath=ancestor::a") + .locator("xpath=ancestor::*[contains(@class,'MuiPaper-root')]") + .locator(".MuiCardActionArea-root") .click(); } diff --git a/e2e/testFunctions.ts b/e2e/testFunctions.ts index 4467a7c0d..517c7f8ac 100644 --- a/e2e/testFunctions.ts +++ b/e2e/testFunctions.ts @@ -1199,7 +1199,9 @@ export async function testPaginationContent( * @returns - Playwright locator object for the card with the given heading text. */ function getCard(page: Page, headingText: string): Locator { - return getHeadingWithText(page, headingText).locator("xpath=ancestor::a"); + return getHeadingWithText(page, headingText) + .locator("xpath=ancestor::*[contains(@class,'MuiPaper-root')]") + .locator(".MuiCardActionArea-root"); } /**