synapse-react-client 4.0.2 → 4.0.3-b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.js +1 -1
- package/dist/assets/icons/AwardScroll.d.ts +5 -0
- package/dist/assets/icons/AwardScroll.d.ts.map +1 -0
- package/dist/assets/icons/AwardScroll.js +78 -0
- package/dist/assets/icons/AwardScroll.js.map +1 -0
- package/dist/assets/icons/Baseline.d.ts +5 -0
- package/dist/assets/icons/Baseline.d.ts.map +1 -0
- package/dist/assets/icons/Baseline.js +43 -0
- package/dist/assets/icons/Baseline.js.map +1 -0
- package/dist/assets/icons/Challenge.svg +13 -0
- package/dist/assets/icons/Challenge.svg.js +7 -0
- package/dist/assets/icons/Challenge.svg.js.map +1 -0
- package/dist/assets/icons/ClappingHands.d.ts +5 -0
- package/dist/assets/icons/ClappingHands.d.ts.map +1 -0
- package/dist/assets/icons/ClappingHands.js +106 -0
- package/dist/assets/icons/ClappingHands.js.map +1 -0
- package/dist/assets/icons/DNA_Two.svg +0 -0
- package/dist/assets/icons/Data2.svg +0 -0
- package/dist/assets/icons/HandWithMoney.d.ts +5 -0
- package/dist/assets/icons/HandWithMoney.d.ts.map +1 -0
- package/dist/assets/icons/HandWithMoney.js +15 -0
- package/dist/assets/icons/HandWithMoney.js.map +1 -0
- package/dist/assets/icons/MultiFile.d.ts +5 -0
- package/dist/assets/icons/MultiFile.d.ts.map +1 -0
- package/dist/assets/icons/MultiFile.js +8 -0
- package/dist/assets/icons/MultiFile.js.map +1 -0
- package/dist/assets/icons/MultiFile.svg +4 -0
- package/dist/assets/icons/MultiFile.svg.js +7 -0
- package/dist/assets/icons/MultiFile.svg.js.map +1 -0
- package/dist/assets/icons/OpenBook.d.ts +5 -0
- package/dist/assets/icons/OpenBook.d.ts.map +1 -0
- package/dist/assets/icons/OpenBook.js +99 -0
- package/dist/assets/icons/OpenBook.js.map +1 -0
- package/dist/assets/icons/Podium.d.ts +5 -0
- package/dist/assets/icons/Podium.d.ts.map +1 -0
- package/dist/assets/icons/Podium.js +36 -0
- package/dist/assets/icons/Podium.js.map +1 -0
- package/dist/assets/icons/RosetteRibbon.d.ts +5 -0
- package/dist/assets/icons/RosetteRibbon.d.ts.map +1 -0
- package/dist/assets/icons/RosetteRibbon.js +36 -0
- package/dist/assets/icons/RosetteRibbon.js.map +1 -0
- package/dist/assets/icons/StarTrophy.d.ts +5 -0
- package/dist/assets/icons/StarTrophy.d.ts.map +1 -0
- package/dist/assets/icons/StarTrophy.js +99 -0
- package/dist/assets/icons/StarTrophy.js.map +1 -0
- package/dist/assets/icons/ThreeStars.d.ts +5 -0
- package/dist/assets/icons/ThreeStars.d.ts.map +1 -0
- package/dist/assets/icons/ThreeStars.js +71 -0
- package/dist/assets/icons/ThreeStars.js.map +1 -0
- package/dist/assets/icons/UnpackagableFile.d.ts +5 -0
- package/dist/assets/icons/UnpackagableFile.d.ts.map +1 -0
- package/dist/assets/icons/UnpackagableFile.js +8 -0
- package/dist/assets/icons/UnpackagableFile.js.map +1 -0
- package/dist/assets/icons/UnpackagableFile.svg +4 -0
- package/dist/assets/icons/UnpackagableFile.svg.js +7 -0
- package/dist/assets/icons/UnpackagableFile.svg.js.map +1 -0
- package/dist/assets/mui_components/PackagableFile.d.ts.map +1 -1
- package/dist/assets/mui_components/PackagableFile.js +5 -4
- package/dist/assets/mui_components/PackagableFile.js.map +1 -1
- package/dist/assets/mui_components/PackagableFile.svg +3 -0
- package/dist/assets/mui_components/PackagableFile.svg.js +7 -0
- package/dist/assets/mui_components/PackagableFile.svg.js.map +1 -0
- package/dist/assets/themed_icons/index.d.ts +1 -2
- package/dist/assets/themed_icons/index.d.ts.map +1 -1
- package/dist/assets/themed_icons/index.js +8 -10
- package/dist/assets/themed_icons/index.js.map +1 -1
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js +4 -4
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js.map +1 -1
- package/dist/components/AddToDownloadListV2.js +10 -10
- package/dist/components/AddToDownloadListV2.js.map +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.css +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.d.ts +1 -2
- package/dist/components/BasePortalCard/BasePortalCard.d.ts.map +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.js +21 -28
- package/dist/components/BasePortalCard/BasePortalCard.js.map +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.module.scss +7 -1
- package/dist/components/BasePortalCard/BasePortalCard.module.scss.js +11 -11
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.d.ts.map +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js +24 -24
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
- package/dist/components/CardContainerLogic/CardContainerLogic.d.ts +5 -1
- package/dist/components/CardContainerLogic/CardContainerLogic.d.ts.map +1 -1
- package/dist/components/CardContainerLogic/CardContainerLogic.js.map +1 -1
- package/dist/components/CardContainerLogic/index.d.ts +1 -1
- package/dist/components/CardContainerLogic/index.d.ts.map +1 -1
- package/dist/components/CardDeck/TableQueryCardDeck.js +12 -9
- package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
- package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js +33 -33
- package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
- package/dist/components/ChangePassword/useChangePasswordFormState.js +5 -2
- package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
- package/dist/components/ComponentCollapse.d.ts +6 -10
- package/dist/components/ComponentCollapse.d.ts.map +1 -1
- package/dist/components/ComponentCollapse.js +31 -35
- package/dist/components/ComponentCollapse.js.map +1 -1
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js +12 -9
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +1 -1
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js +8 -3
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +8 -3
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +8 -3
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
- package/dist/components/DirectDownload/DirectDownload.d.ts.map +1 -1
- package/dist/components/DirectDownload/DirectDownload.js +23 -23
- package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
- package/dist/components/DownloadCart/AvailableForDownloadTable.d.ts +6 -2
- package/dist/components/DownloadCart/AvailableForDownloadTable.d.ts.map +1 -1
- package/dist/components/DownloadCart/AvailableForDownloadTable.js +10 -8
- package/dist/components/DownloadCart/AvailableForDownloadTable.js.map +1 -1
- package/dist/components/DownloadCart/CreatePackageV2.css +1 -0
- package/dist/components/DownloadCart/CreatePackageV2.d.ts.map +1 -1
- package/dist/components/DownloadCart/CreatePackageV2.js +50 -46
- package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
- package/dist/components/DownloadCart/CreatePackageV2.module.scss +38 -0
- package/dist/components/DownloadCart/CreatePackageV2.module.scss.js +14 -0
- package/dist/components/DownloadCart/CreatePackageV2.module.scss.js.map +1 -0
- package/dist/components/DownloadCart/DownloadCartPage.css +1 -0
- package/dist/components/DownloadCart/DownloadCartPage.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadCartPage.js +316 -186
- package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
- package/dist/components/DownloadCart/DownloadCartPage.module.scss +217 -0
- package/dist/components/DownloadCart/DownloadCartPage.module.scss.js +48 -0
- package/dist/components/DownloadCart/DownloadCartPage.module.scss.js.map +1 -0
- package/dist/components/DownloadCart/DownloadDetails.js +1 -1
- package/dist/components/DownloadCart/DownloadDetails.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +33 -33
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/DownloadListTable.d.ts +4 -1
- package/dist/components/DownloadCart/DownloadListTable.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadListTable.js +156 -236
- package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
- package/dist/components/DownloadCart/ShowDownloadV2.js +5 -5
- package/dist/components/DownloadCart/ShowDownloadV2.js.map +1 -1
- package/dist/components/Ecosystem/EcosystemSkeleton.js +8 -3
- package/dist/components/Ecosystem/EcosystemSkeleton.js.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +20 -20
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js +3 -3
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +6 -2
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js +11 -8
- package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js.map +1 -1
- package/dist/components/FullWidthAlert/FullWidthAlert.d.ts +2 -2
- package/dist/components/FullWidthAlert/FullWidthAlert.js.map +1 -1
- package/dist/components/GenericCard/GenericCard.d.ts +5 -5
- package/dist/components/GenericCard/GenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/GenericCard.js +117 -103
- package/dist/components/GenericCard/GenericCard.js.map +1 -1
- package/dist/components/GenericCard/LabelMaybeWithIcon.d.ts +10 -0
- package/dist/components/GenericCard/LabelMaybeWithIcon.d.ts.map +1 -0
- package/dist/components/GenericCard/LabelMaybeWithIcon.js +33 -0
- package/dist/components/GenericCard/LabelMaybeWithIcon.js.map +1 -0
- package/dist/components/GenericCard/SynapseCardLabel.d.ts +2 -1
- package/dist/components/GenericCard/SynapseCardLabel.d.ts.map +1 -1
- package/dist/components/GenericCard/SynapseCardLabel.js +86 -81
- package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.d.ts +7 -1
- package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +239 -202
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/HeaderCard.js +17 -13
- package/dist/components/HeaderCard.js.map +1 -1
- package/dist/components/Icon/Icon.js +52 -52
- package/dist/components/Icon/Icon.js.map +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
- package/dist/components/IconSvg/IconSvg.js +215 -171
- package/dist/components/IconSvg/IconSvg.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -0
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +103 -102
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/StorybookComponentWrapper.js +6 -3
- package/dist/components/StorybookComponentWrapper.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.d.ts +7 -1
- package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.js +76 -67
- package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.d.ts +2 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.js +83 -58
- package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatMessage.d.ts +1 -0
- package/dist/components/SynapseChat/SynapseChatMessage.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChatMessage.js +16 -15
- package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
- package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts +12 -0
- package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts.map +1 -0
- package/dist/components/SynapseChat/SynapsePortalChatDialog.js +30 -0
- package/dist/components/SynapseChat/SynapsePortalChatDialog.js.map +1 -0
- package/dist/components/SynapseChat/extractMessageFromTraceEvent.d.ts.map +1 -1
- package/dist/components/SynapseChat/extractMessageFromTraceEvent.js +22 -16
- package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
- package/dist/components/SynapseChat/index.d.ts +2 -0
- package/dist/components/SynapseChat/index.d.ts.map +1 -1
- package/dist/components/SynapseChat/index.js +5 -3
- package/dist/components/SynapseChat/index.js.map +1 -1
- package/dist/components/SynapseChat/useChatState.d.ts +1 -1
- package/dist/components/SynapseChat/useChatState.d.ts.map +1 -1
- package/dist/components/SynapseChat/useChatState.js +10 -7
- package/dist/components/SynapseChat/useChatState.js.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +25 -25
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.d.ts.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js +39 -39
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js +18 -18
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +13 -13
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControlsUtils.js +9 -9
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControlsUtils.js.map +1 -1
- package/dist/components/TextToComponentCollapse.d.ts +16 -0
- package/dist/components/TextToComponentCollapse.d.ts.map +1 -0
- package/dist/components/TextToComponentCollapse.js +29 -0
- package/dist/components/TextToComponentCollapse.js.map +1 -0
- package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js +8 -3
- package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js.map +1 -1
- package/dist/components/download_list/DownloadConfirmationUI.d.ts +1 -1
- package/dist/components/download_list/DownloadConfirmationUI.js +22 -22
- package/dist/components/download_list/DownloadConfirmationUI.js.map +1 -1
- package/dist/components/download_list/DownloadConfirmationUtils.js +4 -4
- package/dist/components/download_list/DownloadConfirmationUtils.js.map +1 -1
- package/dist/components/index.js +85 -83
- package/dist/components/index.js.map +1 -1
- package/dist/components/row_renderers/ObservationCard.js +12 -11
- package/dist/components/row_renderers/ObservationCard.js.map +1 -1
- package/dist/components/row_renderers/utils/CardFooter.d.ts +1 -3
- package/dist/components/row_renderers/utils/CardFooter.d.ts.map +1 -1
- package/dist/components/row_renderers/utils/CardFooter.js +31 -45
- package/dist/components/row_renderers/utils/CardFooter.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreview.js +8 -3
- package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js +8 -3
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
- package/dist/features/curator/GridPage/GridPage.js +8 -3
- package/dist/features/curator/GridPage/GridPage.js.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.js +8 -3
- package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
- package/dist/index.js +137 -135
- package/dist/index.js.map +1 -1
- package/dist/style/abstracts/_functions.scss +0 -0
- package/dist/style/abstracts/_mixins.scss +0 -0
- package/dist/style/abstracts/_variables.scss +0 -0
- package/dist/style/base/_base.scss +0 -0
- package/dist/style/base/_fonts.scss +0 -0
- package/dist/style/base/_helpers.scss +0 -0
- package/dist/style/components/_all.scss +0 -1
- package/dist/style/components/_cards.scss +22 -0
- package/dist/style/components/_download-list-v2.scss +1 -1
- package/dist/style/components/_query-wrapper-plot-nav.scss +13 -0
- package/dist/style/main.css +1 -1
- package/dist/style/main.scss +0 -0
- package/dist/style/vendors/_normalize.scss +0 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
- package/dist/utils/context/FullContextProvider.js +9 -9
- package/dist/utils/context/FullContextProvider.js.map +1 -1
- package/dist/utils/context/SynapseContext.d.ts.map +1 -1
- package/dist/utils/context/SynapseContext.js +1 -0
- package/dist/utils/context/SynapseContext.js.map +1 -1
- package/dist/utils/functions/SqlFunctions.d.ts +4 -0
- package/dist/utils/functions/SqlFunctions.d.ts.map +1 -1
- package/dist/utils/functions/SqlFunctions.js +25 -23
- package/dist/utils/functions/SqlFunctions.js.map +1 -1
- package/package.json +24 -23
- package/dist/assets/themed_icons/Challenge.d.ts +0 -3
- package/dist/assets/themed_icons/Challenge.d.ts.map +0 -1
- package/dist/assets/themed_icons/Challenge.js +0 -25
- package/dist/assets/themed_icons/Challenge.js.map +0 -1
- package/dist/style/components/_download-cart-page.scss +0 -204
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloadListTable.js","sources":["../../../src/components/DownloadCart/DownloadListTable.tsx"],"sourcesContent":["import {\n useGetAvailableFilesToDownloadInfinite,\n useRemoveFilesFromDownloadList,\n} from '@/synapse-queries'\nimport { calculateFriendlyFileSize } from '@/utils/functions/calculateFriendlyFileSize'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Box, Button, Select, Tooltip } from '@mui/material'\nimport {\n AvailableFilter,\n DownloadListItem,\n DownloadListItemResult,\n Sort,\n SortField,\n} from '@sage-bionetworks/synapse-types'\nimport {\n CellContext,\n createColumnHelper,\n getCoreRowModel,\n Row,\n SortingState,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport FileEntityDirectDownload from '../DirectDownload/FileEntityDirectDownload'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { InteractiveCopyIdsIcon } from '../InteractiveCopyIdsIcon'\nimport { BlockingLoader, SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport { SkeletonTable } from '../Skeleton'\nimport { TOOLTIP_DELAY_SHOW } from '../SynapseTable/SynapseTableConstants'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport { displayToast } from '../ToastMessage'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport DirectProgrammaticDownload from './DirectProgrammaticDownload'\nimport DownloadListStats from './DownloadListStats'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\n\nexport const TESTING_TRASH_BTN_CLASS = 'TESTING_TRASH_BTN_CLASS'\n\nfunction notifyRemovedFromDownloadList(\n notificationTitle: string,\n fileName: string,\n) {\n displayToast(`${fileName} has been removed from your list.`, 'success', {\n title: notificationTitle,\n })\n}\n\nfunction RemoveFromDownloadListButton(props: {\n ctx: CellContext<DownloadListItemResult, any>\n}) {\n const { ctx } = props\n const { mutateAsync: removeFileFromDownloadList, isPending } =\n useRemoveFilesFromDownloadList({\n onSuccess: () =>\n displayToast(\n `${ctx.row.original.fileName} has been removed from your list.`,\n 'success',\n {\n title: 'File Removed',\n },\n ),\n })\n\n return (\n <Tooltip\n title=\"Remove from Download Cart\"\n placement=\"left\"\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n >\n <span className=\"removeItem\">\n <button\n className={TESTING_TRASH_BTN_CLASS}\n onClick={() => {\n void removeFileFromDownloadList({\n batchToRemove: [\n {\n fileEntityId: ctx.row.original.fileEntityId,\n versionNumber: ctx.row.original.versionNumber,\n },\n ],\n })\n }}\n >\n {isPending ? <SynapseSpinner /> : <IconSvg icon=\"removeCircle\" />}\n </button>\n </span>\n </Tooltip>\n )\n}\n\nconst columnHelper = createColumnHelper<DownloadListItemResult>()\nconst getColumns = (args: {\n removeItem: (item: DownloadListItem, fileName: string, title: string) => void\n onCopySynIds: () => void\n}) => {\n const { onCopySynIds, removeItem } = args\n return [\n columnHelper.accessor('isEligibleForPackaging', {\n header: () => <></>,\n cell: ctx => (\n <div>\n {ctx.getValue() && (\n <Tooltip\n title=\"Eligible for packaging\"\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n placement=\"right\"\n >\n <span className=\"eligibileIcon\">\n <IconSvg wrap={false} icon=\"packagableFile\" />\n </span>\n </Tooltip>\n )}\n {!ctx.getValue() && (\n <Tooltip\n title=\"This file is ineligible for Web packaging because it is >100MB, or it is an external link, or it is not stored on Synapse native storage\"\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n placement=\"right\"\n >\n <span className=\"ineligibileIcon\">\n <IconSvg wrap={false} icon=\"warningOutlined\" />\n </span>\n </Tooltip>\n )}\n </div>\n ),\n enableResizing: false,\n enableColumnFilter: false,\n size: 50,\n }),\n columnHelper.accessor('fileName', {\n header: props => <ColumnHeader {...props} title={'Name'} />,\n cell: ctx => (\n <a\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Synapse:${ctx.row.original.fileEntityId}.${ctx.row.original.versionNumber}`}\n >\n {ctx.getValue()}\n </a>\n ),\n enableColumnFilter: false,\n size: 160,\n }),\n columnHelper.accessor('fileSizeBytes', {\n header: props => <ColumnHeader {...props} title={'Size'} />,\n cell: ctx =>\n ctx.getValue() != null ? (\n calculateFriendlyFileSize(ctx.getValue())\n ) : (\n <></>\n ),\n enableColumnFilter: false,\n size: 100,\n }),\n columnHelper.accessor('fileEntityId', {\n header: props => (\n <ColumnHeader\n {...props}\n title={'SynID'}\n additionalButtons={\n <InteractiveCopyIdsIcon size={'small'} onCopy={onCopySynIds} />\n }\n />\n ),\n cell: ctx => `${ctx.getValue()}.${ctx.row.original.versionNumber}`,\n enableColumnFilter: false,\n size: 100,\n }),\n columnHelper.accessor('projectName', {\n header: props => <ColumnHeader {...props} title={'Project'} />,\n enableColumnFilter: false,\n }),\n columnHelper.accessor('addedOn', {\n header: props => <ColumnHeader {...props} title={'Added On'} />,\n cell: ctx => formatDate(dayjs(ctx.getValue())),\n enableColumnFilter: false,\n }),\n columnHelper.accessor('createdBy', {\n header: props => <ColumnHeader {...props} title={'Created By'} />,\n cell: ctx => <UserBadge userId={ctx.getValue()} />,\n enableColumnFilter: false,\n }),\n columnHelper.accessor('createdOn', {\n header: props => <ColumnHeader {...props} title={'Created On'} />,\n cell: ctx => formatDate(dayjs(ctx.getValue())),\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n cell: ctx => (\n <div className=\"actionsContainer\">\n <span className=\"downloadItem\">\n <FileEntityDirectDownload\n entityId={ctx.row.original.fileEntityId}\n entityVersionNumber={ctx.row.original.versionNumber}\n displayFileName={false}\n onClickCallback={(isExternalLink: boolean) => {\n // SWC-5944: remove the item from the download list, unless it's an external link.\n if (!isExternalLink) {\n removeItem(\n {\n fileEntityId: ctx.row.original.fileEntityId,\n versionNumber: ctx.row.original.versionNumber,\n },\n ctx.row.original.fileName,\n 'File Downloaded',\n )\n }\n }}\n />\n </span>\n <span className=\"programmaticAccessItem\">\n <DirectProgrammaticDownload\n entityId={ctx.row.original.fileEntityId}\n version={ctx.row.original.versionNumber}\n />\n </span>\n <RemoveFromDownloadListButton ctx={ctx} />\n </div>\n ),\n enableResizing: false,\n enableColumnFilter: false,\n size: 140,\n meta: {\n textAlign: 'center',\n },\n }),\n ]\n}\n\nfunction getSortApiRequestFromTableSortState(\n sortingState: SortingState,\n): Sort | undefined {\n if (sortingState.length === 0) {\n return undefined\n }\n const sort = sortingState[0]\n let field: SortField = 'addedOn'\n\n if (sort.id === 'fileName') {\n field = 'fileName'\n } else if (sort.id === 'fileSizeBytes') {\n field = 'fileSize'\n } else if (sort.id === 'fileEntityId') {\n field = 'synId'\n } else if (sort.id === 'projectName') {\n field = 'projectName'\n } else if (sort.id === 'addedOn') {\n field = 'addedOn'\n } else if (sort.id === 'createdBy') {\n field = 'createdBy'\n } else if (sort.id === 'createdOn') {\n field = 'createdOn'\n }\n\n return {\n field,\n direction: sort.desc ? 'DESC' : 'ASC',\n }\n}\n\nexport default function DownloadListTable() {\n const handleError = useErrorHandler()\n\n const [copyingAllSynapseIDs, setCopyingAllSynapseIDs] =\n useState<boolean>(false)\n const [tableSortState, setTableSortState] = useState<SortingState>([\n {\n desc: true,\n id: 'addedOn',\n },\n ])\n\n const [filter, setFilter] = useState<AvailableFilter | undefined>(undefined)\n const {\n data,\n status,\n isFetchingNextPage,\n isLoading,\n hasNextPage,\n fetchNextPage,\n isError,\n error: newError,\n } = useGetAvailableFilesToDownloadInfinite(\n getSortApiRequestFromTableSortState(tableSortState),\n filter,\n )\n\n useEffect(() => {\n if (isError && newError) {\n handleError(newError)\n }\n }, [isError, newError, handleError])\n\n const { mutateAsync: removeFileFromDownloadList } =\n useRemoveFilesFromDownloadList()\n\n const removeItem = useCallback(\n async (\n item: DownloadListItem,\n fileName: string,\n notificationTitle: string,\n ) => {\n await removeFileFromDownloadList({ batchToRemove: [item] })\n notifyRemovedFromDownloadList(notificationTitle, fileName)\n },\n [removeFileFromDownloadList],\n )\n\n const allRows = useMemo(\n () => data?.pages.flatMap(page => page.page) ?? [],\n [data?.pages],\n )\n\n const columns = useMemo(\n () =>\n getColumns({\n removeItem: (...args) => {\n void removeItem(...args)\n },\n onCopySynIds: () => {\n // trigger loading all pages of the download list table, and then copy all IDs to the clipboard\n setCopyingAllSynapseIDs(true)\n },\n }),\n [removeItem],\n )\n\n const table = useReactTable<DownloadListItemResult>({\n data: allRows,\n columns: columns,\n getCoreRowModel: getCoreRowModel(),\n manualSorting: true,\n onSortingChange: setTableSortState,\n state: {\n columnPinning: {\n right: ['actions'],\n },\n sorting: tableSortState,\n },\n columnResizeMode: 'onChange',\n meta: {\n getRowClassNames(row: Row<DownloadListItemResult>) {\n if (!row.original.isEligibleForPackaging) {\n return 'ineligibleForPackaging'\n }\n return ''\n },\n },\n })\n\n useEffect(() => {\n const copyAllSynapseIDs = () => {\n const synIDs = allRows\n .map((item: DownloadListItemResult) => {\n return `${item.fileEntityId}.${item.versionNumber}`\n })\n .join('\\n')\n copyStringToClipboard(synIDs).then(() => {\n displayToast('Successfully copied to clipboard')\n })\n setCopyingAllSynapseIDs(false)\n }\n\n if (\n status === 'success' &&\n !isFetchingNextPage &&\n hasNextPage &&\n fetchNextPage &&\n copyingAllSynapseIDs\n ) {\n void fetchNextPage()\n } else if (!hasNextPage && copyingAllSynapseIDs) {\n // We have all the data in allRows. Put it together and copy to the clipboard\n copyAllSynapseIDs()\n }\n }, [\n status,\n isFetchingNextPage,\n hasNextPage,\n fetchNextPage,\n copyingAllSynapseIDs,\n allRows,\n ])\n\n const getFilterDisplayText = (f: AvailableFilter) => {\n if (!f) {\n return 'All'\n } else if (f == 'eligibleForPackaging') {\n return 'Only Eligible'\n } else {\n return 'Only Ineligible'\n }\n }\n\n const availableFiltersArray: AvailableFilter[] = [\n undefined,\n 'eligibleForPackaging',\n 'ineligibleForPackaging',\n ]\n return (\n <div>\n <BlockingLoader show={copyingAllSynapseIDs} />\n <Box\n sx={{\n display: 'flex',\n flexDirection: {\n xs: 'column',\n md: 'row',\n },\n justifyContent: 'space-between',\n alignItems: 'center',\n py: '15px',\n rowGap: '15px',\n }}\n >\n <DownloadListStats />\n <Box\n sx={{\n display: 'flex',\n gap: '10px',\n alignItems: 'inherit',\n justifyContent: 'end',\n }}\n >\n <Box\n sx={{\n fontWeight: '700',\n fontSize: '14px',\n }}\n >\n Filter Files By\n </Box>\n <Box\n sx={{\n button: {\n width: '144px',\n },\n }}\n >\n <Select native fullWidth value={getFilterDisplayText(filter)}>\n {availableFiltersArray.map(availableFilter => (\n <option\n key={`${getFilterDisplayText(availableFilter)}-filter-option`}\n onClick={() => {\n setFilter(availableFilter)\n }}\n >\n {getFilterDisplayText(availableFilter)}\n </option>\n ))}\n </Select>\n </Box>\n </Box>\n </Box>\n {allRows.length > 0 && (\n <div className=\"DownloadListTableV2\">\n {/* TODO: This table can be very large, so it should be refactored to use row virtualization or discrete pagination */}\n <StyledTanStackTable table={table} fullWidth={false} />\n {hasNextPage && (\n <Box sx={{ display: 'flex', justifyContent: 'right' }}>\n <Button\n variant={'contained'}\n sx={{ my: 2, ml: 'auto' }}\n onClick={() => {\n void fetchNextPage()\n }}\n disabled={isFetchingNextPage}\n startIcon={isFetchingNextPage ? <SynapseSpinner /> : undefined}\n >\n {isFetchingNextPage ? 'Loading...' : 'Show More'}\n </Button>\n </Box>\n )}\n </div>\n )}\n {isLoading && <SkeletonTable numCols={5} numRows={3} />}\n </div>\n )\n}\n"],"names":["TESTING_TRASH_BTN_CLASS","notifyRemovedFromDownloadList","notificationTitle","fileName","displayToast","RemoveFromDownloadListButton","props","ctx","removeFileFromDownloadList","isPending","useRemoveFilesFromDownloadList","jsx","Tooltip","TOOLTIP_DELAY_SHOW","SynapseSpinner","IconSvg","columnHelper","createColumnHelper","getColumns","args","onCopySynIds","removeItem","Fragment","jsxs","ColumnHeader","PRODUCTION_ENDPOINT_CONFIG","calculateFriendlyFileSize","InteractiveCopyIdsIcon","formatDate","dayjs","UserBadge","FileEntityDirectDownload","isExternalLink","DirectProgrammaticDownload","getSortApiRequestFromTableSortState","sortingState","sort","field","DownloadListTable","handleError","useErrorHandler","copyingAllSynapseIDs","setCopyingAllSynapseIDs","useState","tableSortState","setTableSortState","filter","setFilter","data","status","isFetchingNextPage","isLoading","hasNextPage","fetchNextPage","isError","newError","useGetAvailableFilesToDownloadInfinite","useEffect","useCallback","item","allRows","useMemo","page","columns","table","useReactTable","getCoreRowModel","row","synIDs","copyStringToClipboard","getFilterDisplayText","f","availableFiltersArray","BlockingLoader","Box","DownloadListStats","Select","availableFilter","StyledTanStackTable","Button","SkeletonTable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DownloadListTable.js","sources":["../../../src/components/DownloadCart/DownloadListTable.tsx"],"sourcesContent":["import {\n useGetAvailableFilesToDownloadInfinite,\n useRemoveFilesFromDownloadList,\n} from '@/synapse-queries'\nimport { calculateFriendlyFileSize } from '@/utils/functions/calculateFriendlyFileSize'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Box, Button, Tooltip, Typography } from '@mui/material'\nimport {\n AvailableFilter,\n DownloadListItem,\n DownloadListItemResult,\n Sort,\n SortField,\n} from '@sage-bionetworks/synapse-types'\nimport {\n CellContext,\n createColumnHelper,\n getCoreRowModel,\n Row,\n SortingState,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport FileEntityDirectDownload from '../DirectDownload/FileEntityDirectDownload'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { InteractiveCopyIdsIcon } from '../InteractiveCopyIdsIcon'\nimport { BlockingLoader, SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport { SkeletonTable } from '../Skeleton'\nimport { TOOLTIP_DELAY_SHOW } from '../SynapseTable/SynapseTableConstants'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport { displayToast } from '../ToastMessage'\nimport DirectProgrammaticDownload from './DirectProgrammaticDownload'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\n\nexport const TESTING_TRASH_BTN_CLASS = 'TESTING_TRASH_BTN_CLASS'\n\nfunction notifyRemovedFromDownloadList(\n notificationTitle: string,\n fileName: string,\n) {\n displayToast(`${fileName} has been removed from your list.`, 'success', {\n title: notificationTitle,\n })\n}\n\nfunction RemoveFromDownloadListButton(props: {\n ctx: CellContext<DownloadListItemResult, any>\n}) {\n const { ctx } = props\n const { mutateAsync: removeFileFromDownloadList, isPending } =\n useRemoveFilesFromDownloadList({\n onSuccess: () =>\n displayToast(\n `${ctx.row.original.fileName} has been removed from your list.`,\n 'success',\n {\n title: 'File Removed',\n },\n ),\n })\n\n return (\n <Tooltip\n title=\"Remove from Download List\"\n placement=\"left\"\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n >\n <span className=\"removeItem\">\n <button\n className={TESTING_TRASH_BTN_CLASS}\n onClick={() => {\n void removeFileFromDownloadList({\n batchToRemove: [\n {\n fileEntityId: ctx.row.original.fileEntityId,\n versionNumber: ctx.row.original.versionNumber,\n },\n ],\n })\n }}\n >\n {isPending ? <SynapseSpinner /> : <IconSvg icon=\"removeCircle\" />}\n </button>\n </span>\n </Tooltip>\n )\n}\n\nconst columnHelper = createColumnHelper<DownloadListItemResult>()\nconst getColumns = (args: {\n removeItem: (item: DownloadListItem, fileName: string, title: string) => void\n onCopySynIds: () => void\n}) => {\n const { onCopySynIds, removeItem } = args\n return [\n columnHelper.accessor('isEligibleForPackaging', {\n header: () => <></>,\n cell: ctx => (\n <div>\n {!ctx.getValue() && (\n <Tooltip\n title={\n <>\n This file can’t be packaged as a ZIP because it is {'>'}\n 100MB, or it is an external link, or it is not stored on\n Synapse native storage.\n <br />\n Try clicking the “download” icon at the end of the row, or\n download programmatically.\n </>\n }\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n placement=\"right\"\n >\n <span className=\"ineligibileIcon\">\n <IconSvg wrap={false} icon=\"unpackagableFile\" />\n </span>\n </Tooltip>\n )}\n </div>\n ),\n enableResizing: false,\n enableColumnFilter: false,\n size: 50,\n }),\n columnHelper.accessor('fileName', {\n header: props => <ColumnHeader {...props} title={'Name'} />,\n cell: ctx => (\n <a\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Synapse:${ctx.row.original.fileEntityId}.${ctx.row.original.versionNumber}`}\n >\n {ctx.getValue()}\n </a>\n ),\n enableColumnFilter: false,\n size: 360,\n }),\n columnHelper.accessor('fileSizeBytes', {\n header: props => <ColumnHeader {...props} title={'Size'} />,\n cell: ctx =>\n ctx.getValue() != null && ctx.getValue() > 0 ? (\n calculateFriendlyFileSize(ctx.getValue())\n ) : (\n <Typography variant=\"smallText1\" sx={{ color: 'grey.600' }}>\n Unknown\n </Typography>\n ),\n enableColumnFilter: false,\n size: 117,\n }),\n columnHelper.accessor('fileEntityId', {\n header: props => (\n <ColumnHeader\n {...props}\n title={'SynID'}\n additionalButtons={\n <InteractiveCopyIdsIcon size={'small'} onCopy={onCopySynIds} />\n }\n />\n ),\n cell: ctx => `${ctx.getValue()}.${ctx.row.original.versionNumber}`,\n enableColumnFilter: false,\n size: 143,\n }),\n columnHelper.accessor('addedOn', {\n header: props => <ColumnHeader {...props} title={'Added On'} />,\n cell: ctx => formatDate(dayjs(ctx.getValue())),\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.accessor('projectName', {\n header: props => <ColumnHeader {...props} title={'Project'} />,\n enableColumnFilter: false,\n size: 170,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n cell: ctx => (\n <div className=\"actionsContainer\">\n <span className=\"downloadItem\">\n <FileEntityDirectDownload\n entityId={ctx.row.original.fileEntityId}\n entityVersionNumber={ctx.row.original.versionNumber}\n displayFileName={false}\n onClickCallback={(isExternalLink: boolean) => {\n // SWC-5944: remove the item from the download list, unless it's an external link.\n if (!isExternalLink) {\n removeItem(\n {\n fileEntityId: ctx.row.original.fileEntityId,\n versionNumber: ctx.row.original.versionNumber,\n },\n ctx.row.original.fileName,\n 'File Downloaded',\n )\n }\n }}\n />\n </span>\n <span className=\"programmaticAccessItem\">\n <DirectProgrammaticDownload\n entityId={ctx.row.original.fileEntityId}\n version={ctx.row.original.versionNumber}\n />\n </span>\n <RemoveFromDownloadListButton ctx={ctx} />\n </div>\n ),\n enableResizing: false,\n enableColumnFilter: false,\n size: 140,\n meta: {\n textAlign: 'center',\n },\n }),\n ]\n}\n\nfunction getSortApiRequestFromTableSortState(\n sortingState: SortingState,\n): Sort | undefined {\n if (sortingState.length === 0) {\n return undefined\n }\n const sort = sortingState[0]\n let field: SortField = 'addedOn'\n\n if (sort.id === 'fileName') {\n field = 'fileName'\n } else if (sort.id === 'fileSizeBytes') {\n field = 'fileSize'\n } else if (sort.id === 'fileEntityId') {\n field = 'synId'\n } else if (sort.id === 'projectName') {\n field = 'projectName'\n } else if (sort.id === 'addedOn') {\n field = 'addedOn'\n } else if (sort.id === 'createdBy') {\n field = 'createdBy'\n } else if (sort.id === 'createdOn') {\n field = 'createdOn'\n }\n\n return {\n field,\n direction: sort.desc ? 'DESC' : 'ASC',\n }\n}\n\nexport default function DownloadListTable({\n filter,\n}: {\n filter?: AvailableFilter\n}) {\n const handleError = useErrorHandler()\n\n const [copyingAllSynapseIDs, setCopyingAllSynapseIDs] =\n useState<boolean>(false)\n const [tableSortState, setTableSortState] = useState<SortingState>([\n {\n desc: true,\n id: 'addedOn',\n },\n ])\n\n const {\n data,\n status,\n isFetchingNextPage,\n isLoading,\n hasNextPage,\n fetchNextPage,\n isError,\n error: newError,\n } = useGetAvailableFilesToDownloadInfinite(\n getSortApiRequestFromTableSortState(tableSortState),\n filter,\n )\n\n useEffect(() => {\n if (isError && newError) {\n handleError(newError)\n }\n }, [isError, newError, handleError])\n\n const { mutateAsync: removeFileFromDownloadList } =\n useRemoveFilesFromDownloadList()\n\n const removeItem = useCallback(\n async (\n item: DownloadListItem,\n fileName: string,\n notificationTitle: string,\n ) => {\n await removeFileFromDownloadList({ batchToRemove: [item] })\n notifyRemovedFromDownloadList(notificationTitle, fileName)\n },\n [removeFileFromDownloadList],\n )\n\n const allRows = useMemo(\n () => data?.pages.flatMap(page => page.page) ?? [],\n [data?.pages],\n )\n\n const columns = useMemo(\n () =>\n getColumns({\n removeItem: (...args) => {\n void removeItem(...args)\n },\n onCopySynIds: () => {\n // trigger loading all pages of the download list table, and then copy all IDs to the clipboard\n setCopyingAllSynapseIDs(true)\n },\n }),\n [removeItem],\n )\n\n const table = useReactTable<DownloadListItemResult>({\n data: allRows,\n columns: columns,\n getCoreRowModel: getCoreRowModel(),\n manualSorting: true,\n onSortingChange: setTableSortState,\n state: {\n columnPinning: {\n right: ['actions'],\n },\n sorting: tableSortState,\n },\n columnResizeMode: 'onChange',\n meta: {\n getRowClassNames(row: Row<DownloadListItemResult>) {\n if (!row.original.isEligibleForPackaging) {\n return 'ineligibleForPackaging'\n }\n return ''\n },\n },\n })\n\n useEffect(() => {\n const copyAllSynapseIDs = () => {\n const synIDs = allRows\n .map((item: DownloadListItemResult) => {\n return `${item.fileEntityId}.${item.versionNumber}`\n })\n .join('\\n')\n copyStringToClipboard(synIDs).then(() => {\n displayToast('Successfully copied to clipboard')\n })\n setCopyingAllSynapseIDs(false)\n }\n\n if (\n status === 'success' &&\n !isFetchingNextPage &&\n hasNextPage &&\n fetchNextPage &&\n copyingAllSynapseIDs\n ) {\n void fetchNextPage()\n } else if (!hasNextPage && copyingAllSynapseIDs) {\n // We have all the data in allRows. Put it together and copy to the clipboard\n copyAllSynapseIDs()\n }\n }, [\n status,\n isFetchingNextPage,\n hasNextPage,\n fetchNextPage,\n copyingAllSynapseIDs,\n allRows,\n ])\n\n return (\n <div>\n <BlockingLoader show={copyingAllSynapseIDs} />\n {allRows.length > 0 && (\n <div className=\"DownloadListTableV2\">\n {/* TODO: This table can be very large, so it should be refactored to use row virtualization or discrete pagination */}\n <StyledTanStackTable table={table} fullWidth={false} />\n {hasNextPage && (\n <Box sx={{ display: 'flex', justifyContent: 'right' }}>\n <Button\n variant={'contained'}\n sx={{ my: 2, ml: 'auto' }}\n onClick={() => {\n void fetchNextPage()\n }}\n disabled={isFetchingNextPage}\n startIcon={isFetchingNextPage ? <SynapseSpinner /> : undefined}\n >\n {isFetchingNextPage ? 'Loading...' : 'Show More'}\n </Button>\n </Box>\n )}\n </div>\n )}\n {allRows.length === 0 && !isLoading && (\n <Typography variant=\"body1Italic\">\n You have no matching files in your download list.\n </Typography>\n )}\n {isLoading && <SkeletonTable numCols={5} numRows={3} />}\n </div>\n )\n}\n"],"names":["TESTING_TRASH_BTN_CLASS","notifyRemovedFromDownloadList","notificationTitle","fileName","displayToast","RemoveFromDownloadListButton","props","ctx","removeFileFromDownloadList","isPending","useRemoveFilesFromDownloadList","jsx","Tooltip","TOOLTIP_DELAY_SHOW","SynapseSpinner","IconSvg","columnHelper","createColumnHelper","getColumns","args","onCopySynIds","removeItem","Fragment","jsxs","ColumnHeader","PRODUCTION_ENDPOINT_CONFIG","calculateFriendlyFileSize","Typography","InteractiveCopyIdsIcon","formatDate","dayjs","FileEntityDirectDownload","isExternalLink","DirectProgrammaticDownload","getSortApiRequestFromTableSortState","sortingState","sort","field","DownloadListTable","filter","handleError","useErrorHandler","copyingAllSynapseIDs","setCopyingAllSynapseIDs","useState","tableSortState","setTableSortState","data","status","isFetchingNextPage","isLoading","hasNextPage","fetchNextPage","isError","newError","useGetAvailableFilesToDownloadInfinite","useEffect","useCallback","item","allRows","useMemo","page","columns","table","useReactTable","getCoreRowModel","row","synIDs","copyStringToClipboard","BlockingLoader","StyledTanStackTable","Box","Button","SkeletonTable"],"mappings":"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"}
|
|
@@ -11,8 +11,8 @@ import { SkeletonInlineBlock as C } from "../Skeleton/SkeletonInlineBlock.js";
|
|
|
11
11
|
import "@mui/material/Skeleton";
|
|
12
12
|
import "lodash-es";
|
|
13
13
|
import { EmptyFallbackComponent as N } from "../error/ErrorBanner.js";
|
|
14
|
-
function F({ to: r, className:
|
|
15
|
-
const { isAuthenticated: t } = h(), e = x(),
|
|
14
|
+
function F({ to: r, className: s = "" }) {
|
|
15
|
+
const { isAuthenticated: t } = h(), e = x(), m = "Click to view items in your download list.", {
|
|
16
16
|
data: c,
|
|
17
17
|
isLoading: p,
|
|
18
18
|
isError: i,
|
|
@@ -28,11 +28,11 @@ function F({ to: r, className: m = "" }) {
|
|
|
28
28
|
const d = /* @__PURE__ */ o(
|
|
29
29
|
k,
|
|
30
30
|
{
|
|
31
|
-
title:
|
|
31
|
+
title: m,
|
|
32
32
|
placement: "bottom",
|
|
33
33
|
enterNextDelay: b,
|
|
34
34
|
children: /* @__PURE__ */ f("span", { children: [
|
|
35
|
-
/* @__PURE__ */ o("span", { className: "SRC-primary-text-color", children: /* @__PURE__ */ o(D, { icon: "
|
|
35
|
+
/* @__PURE__ */ o("span", { className: "SRC-primary-text-color", children: /* @__PURE__ */ o(D, { icon: "download" }) }),
|
|
36
36
|
/* @__PURE__ */ o("span", { className: "download-cart-size", children: a })
|
|
37
37
|
] })
|
|
38
38
|
}
|
|
@@ -42,7 +42,7 @@ function F({ to: r, className: m = "" }) {
|
|
|
42
42
|
{
|
|
43
43
|
to: r,
|
|
44
44
|
component: y,
|
|
45
|
-
className: `Download-Link v2 ${
|
|
45
|
+
className: `Download-Link v2 ${s}`,
|
|
46
46
|
children: d
|
|
47
47
|
}
|
|
48
48
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShowDownloadV2.js","sources":["../../../src/components/DownloadCart/ShowDownloadV2.tsx"],"sourcesContent":["import { useGetDownloadListStatistics } from '@/synapse-queries/download/useDownloadList'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { Link as MuiLink, Tooltip } from '@mui/material'\nimport { Suspense, useEffect } from 'react'\nimport { ErrorBoundary, useErrorHandler } from 'react-error-boundary'\nimport { Link } from 'react-router'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { TOOLTIP_DELAY_SHOW } from '../SynapseTable/SynapseTableConstants'\nimport { SkeletonInlineBlock } from '../Skeleton'\nimport { EmptyFallbackComponent } from '../error'\n\nexport type ShowDownloadV2Props = {\n to: string\n className?: string\n}\n\n/**\n * Nav bar item, displayed when files have been added to the Download
|
|
1
|
+
{"version":3,"file":"ShowDownloadV2.js","sources":["../../../src/components/DownloadCart/ShowDownloadV2.tsx"],"sourcesContent":["import { useGetDownloadListStatistics } from '@/synapse-queries/download/useDownloadList'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { Link as MuiLink, Tooltip } from '@mui/material'\nimport { Suspense, useEffect } from 'react'\nimport { ErrorBoundary, useErrorHandler } from 'react-error-boundary'\nimport { Link } from 'react-router'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { TOOLTIP_DELAY_SHOW } from '../SynapseTable/SynapseTableConstants'\nimport { SkeletonInlineBlock } from '../Skeleton'\nimport { EmptyFallbackComponent } from '../error'\n\nexport type ShowDownloadV2Props = {\n to: string\n className?: string\n}\n\n/**\n * Nav bar item, displayed when files have been added to the Download List.\n * This must be configured with the URL of a page dedicated to showing the Download List.\n */\nfunction ShowDownloadV2Internal({ to, className = '' }: ShowDownloadV2Props) {\n const { isAuthenticated } = useSynapseContext()\n const handleError = useErrorHandler()\n const tooltipText = 'Click to view items in your download list.'\n\n const {\n data,\n isLoading,\n isError,\n error: newError,\n } = useGetDownloadListStatistics()\n\n useEffect(() => {\n if (isError && newError && isAuthenticated) {\n handleError(newError)\n }\n }, [isError, newError, handleError, isAuthenticated])\n\n if (!isAuthenticated || isLoading) {\n return <></>\n }\n\n const size = data?.totalNumberOfFiles ?? 0\n if (size === 0) {\n return <></>\n }\n const content = (\n <Tooltip\n title={tooltipText}\n placement=\"bottom\"\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n >\n <span>\n <span className=\"SRC-primary-text-color\">\n <IconSvg icon=\"download\" />\n </span>\n <span className={`download-cart-size`}>{size}</span>\n </span>\n </Tooltip>\n )\n return (\n <MuiLink\n to={to}\n component={Link}\n className={`Download-Link v2 ${className}`}\n >\n {content}\n </MuiLink>\n )\n}\n\nexport function ShowDownloadV2(props: ShowDownloadV2Props) {\n return (\n <ErrorBoundary FallbackComponent={EmptyFallbackComponent}>\n <Suspense fallback={<SkeletonInlineBlock width={100} />}>\n <ShowDownloadV2Internal {...props} />\n </Suspense>\n </ErrorBoundary>\n )\n}\n\nexport default ShowDownloadV2\n"],"names":["ShowDownloadV2Internal","to","className","isAuthenticated","useSynapseContext","handleError","useErrorHandler","tooltipText","data","isLoading","isError","newError","useGetDownloadListStatistics","useEffect","jsx","Fragment","size","content","Tooltip","TOOLTIP_DELAY_SHOW","IconSvg","MuiLink","Link","ShowDownloadV2","props","ErrorBoundary","EmptyFallbackComponent","Suspense","SkeletonInlineBlock"],"mappings":";;;;;;;;;;;;;AAoBA,SAASA,EAAuB,EAAE,IAAAC,GAAI,WAAAC,IAAY,MAA2B;AAC3E,QAAM,EAAE,iBAAAC,EAAA,IAAoBC,EAAA,GACtBC,IAAcC,EAAA,GACdC,IAAc,8CAEd;AAAA,IACJ,MAAAC;AAAA,IACA,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,OAAOC;AAAA,EAAA,IACLC,EAAA;AAQJ,MANAC,EAAU,MAAM;AACd,IAAIH,KAAWC,KAAYR,KACzBE,EAAYM,CAAQ;AAAA,EAExB,GAAG,CAACD,GAASC,GAAUN,GAAaF,CAAe,CAAC,GAEhD,CAACA,KAAmBM;AACtB,WAAO,gBAAAK,EAAAC,GAAA,EAAE;AAGX,QAAMC,IAAOR,GAAM,sBAAsB;AACzC,MAAIQ,MAAS;AACX,WAAO,gBAAAF,EAAAC,GAAA,EAAE;AAEX,QAAME,IACJ,gBAAAH;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,OAAOX;AAAA,MACP,WAAU;AAAA,MACV,gBAAgBY;AAAA,MAEhB,4BAAC,QAAA,EACC,UAAA;AAAA,QAAA,gBAAAL,EAAC,UAAK,WAAU,0BACd,4BAACM,GAAA,EAAQ,MAAK,YAAW,EAAA,CAC3B;AAAA,QACA,gBAAAN,EAAC,QAAA,EAAK,WAAW,sBAAuB,UAAAE,EAAA,CAAK;AAAA,MAAA,EAAA,CAC/C;AAAA,IAAA;AAAA,EAAA;AAGJ,SACE,gBAAAF;AAAA,IAACO;AAAAA,IAAA;AAAA,MACC,IAAApB;AAAA,MACA,WAAWqB;AAAAA,MACX,WAAW,oBAAoBpB,CAAS;AAAA,MAEvC,UAAAe;AAAA,IAAA;AAAA,EAAA;AAGP;AAEO,SAASM,EAAeC,GAA4B;AACzD,2BACGC,GAAA,EAAc,mBAAmBC,GAChC,UAAA,gBAAAZ,EAACa,KAAS,UAAU,gBAAAb,EAACc,GAAA,EAAoB,OAAO,KAAK,GACnD,UAAA,gBAAAd,EAACd,KAAwB,GAAGwB,EAAA,CAAO,GACrC,GACF;AAEJ;"}
|
|
@@ -55,11 +55,14 @@ import "@mui/material/SvgIcon";
|
|
|
55
55
|
import "../../assets/icons/AccessPending.svg.js";
|
|
56
56
|
import "../../assets/icons/AccessPendingCloud.svg.js";
|
|
57
57
|
import "../../assets/icons/FileWithShield.svg.js";
|
|
58
|
+
import "../../assets/icons/MultiFile.svg.js";
|
|
59
|
+
import "../../assets/icons/UnpackagableFile.svg.js";
|
|
58
60
|
import "../../assets/icons/bioChemicalPhysical.svg.js";
|
|
59
61
|
import "../../assets/icons/computationalTool.svg.js";
|
|
60
62
|
import "../../assets/icons/dataReuse.svg.js";
|
|
61
63
|
import "../../assets/icons/inSilicoModel.svg.js";
|
|
62
64
|
import "../../assets/icons/modelSystem.svg.js";
|
|
65
|
+
import "../../assets/mui_components/PackagableFile.svg.js";
|
|
63
66
|
import "../../assets/icons/spatialProfiling.svg.js";
|
|
64
67
|
import "../Authentication/AuthenticationMethodSelection.js";
|
|
65
68
|
import "mui-one-time-password-input";
|
|
@@ -84,6 +87,7 @@ import "../../assets/icons/study-complete.svg.js";
|
|
|
84
87
|
import "../../assets/icons/translational.svg.js";
|
|
85
88
|
import "../../assets/icons/tree_horizontal.svg.js";
|
|
86
89
|
import "../../assets/icons/standardDataModel.svg.js";
|
|
90
|
+
import "../../assets/icons/Challenge.svg.js";
|
|
87
91
|
import "react-intersection-observer";
|
|
88
92
|
import "@rjsf/utils";
|
|
89
93
|
import "../SchemaDrivenAnnotationEditor/template/AdditionalPropertyContext.js";
|
|
@@ -101,10 +105,10 @@ import "../../assets/icons/DoubleQuotes.svg.js";
|
|
|
101
105
|
import "../EntityDownloadConfirmation/EntityDownloadConfirmation.js";
|
|
102
106
|
import "../QueryContext/QueryContext.js";
|
|
103
107
|
import "../QueryVisualizationWrapper/QueryVisualizationContext.js";
|
|
108
|
+
import "react-share";
|
|
104
109
|
import "../GenericCard/GenericCard.js";
|
|
105
110
|
import "@mui/system";
|
|
106
111
|
import "../GenericCard/Linkify.js";
|
|
107
|
-
import "react-share";
|
|
108
112
|
import "jotai";
|
|
109
113
|
import "lodash-es/noop";
|
|
110
114
|
import "../QueryWrapper/TableRowSelectionState.js";
|
|
@@ -203,6 +207,7 @@ import "lodash-es/set";
|
|
|
203
207
|
import "lodash-es/trimStart";
|
|
204
208
|
import "../SynapseForm/SynapseFormSubmissionGrid.js";
|
|
205
209
|
import "../SynapseChat/AccessLevelMenu.js";
|
|
210
|
+
import "react-draggable";
|
|
206
211
|
import "../TimelinePlot/phasesQueryResponseData.js";
|
|
207
212
|
import "../EntityHeaderTable/EntityHeaderTable.js";
|
|
208
213
|
import "../MuiContainer.js";
|
|
@@ -210,7 +215,7 @@ import "@mui/material/Grid";
|
|
|
210
215
|
import "@mui/icons-material/ArrowForwardIos";
|
|
211
216
|
import "../PortalAclEditor/PortalAclEditor.js";
|
|
212
217
|
import "../SynapseHomepageV2/HomepageStyles.js";
|
|
213
|
-
function
|
|
218
|
+
function li() {
|
|
214
219
|
const o = /* @__PURE__ */ t(n, { width: "80%" }), r = /* @__PURE__ */ m(e, { gap: 2, py: 2, children: [
|
|
215
220
|
/* @__PURE__ */ t(i, {}),
|
|
216
221
|
/* @__PURE__ */ t(i, {}),
|
|
@@ -228,6 +233,6 @@ function pi() {
|
|
|
228
233
|
);
|
|
229
234
|
}
|
|
230
235
|
export {
|
|
231
|
-
|
|
236
|
+
li as default
|
|
232
237
|
};
|
|
233
238
|
//# sourceMappingURL=EcosystemSkeleton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EcosystemSkeleton.js","sources":["../../../src/components/Ecosystem/EcosystemSkeleton.tsx"],"sourcesContent":["import EcosystemLayout from '@/components/Ecosystem/EcosystemLayout'\nimport { SkeletonParagraph } from '@/components/index'\nimport { Stack } from '@mui/material'\nimport Skeleton from '@mui/material/Skeleton'\n\nfunction EcosystemSkeleton() {\n const skeletonTitle = <Skeleton width={'80%'} />\n const skeletonContent = (\n <Stack gap={2} py={2}>\n <SkeletonParagraph />\n <SkeletonParagraph />\n <SkeletonParagraph />\n </Stack>\n )\n return (\n <EcosystemLayout\n config={[\n { title: skeletonTitle, content: skeletonContent },\n { title: skeletonTitle, content: skeletonContent },\n { title: skeletonTitle, content: skeletonContent },\n ]}\n />\n )\n}\n\nexport default EcosystemSkeleton\n"],"names":["EcosystemSkeleton","skeletonTitle","jsx","Skeleton","skeletonContent","jsxs","Stack","SkeletonParagraph","EcosystemLayout"],"mappings":"
|
|
1
|
+
{"version":3,"file":"EcosystemSkeleton.js","sources":["../../../src/components/Ecosystem/EcosystemSkeleton.tsx"],"sourcesContent":["import EcosystemLayout from '@/components/Ecosystem/EcosystemLayout'\nimport { SkeletonParagraph } from '@/components/index'\nimport { Stack } from '@mui/material'\nimport Skeleton from '@mui/material/Skeleton'\n\nfunction EcosystemSkeleton() {\n const skeletonTitle = <Skeleton width={'80%'} />\n const skeletonContent = (\n <Stack gap={2} py={2}>\n <SkeletonParagraph />\n <SkeletonParagraph />\n <SkeletonParagraph />\n </Stack>\n )\n return (\n <EcosystemLayout\n config={[\n { title: skeletonTitle, content: skeletonContent },\n { title: skeletonTitle, content: skeletonContent },\n { title: skeletonTitle, content: skeletonContent },\n ]}\n />\n )\n}\n\nexport default EcosystemSkeleton\n"],"names":["EcosystemSkeleton","skeletonTitle","jsx","Skeleton","skeletonContent","jsxs","Stack","SkeletonParagraph","EcosystemLayout"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,SAASA,KAAoB;AAC3B,QAAMC,IAAgB,gBAAAC,EAACC,GAAA,EAAS,OAAO,MAAA,CAAO,GACxCC,IACJ,gBAAAC,EAACC,GAAA,EAAM,KAAK,GAAG,IAAI,GACjB,UAAA;AAAA,IAAA,gBAAAJ,EAACK,GAAA,EAAkB;AAAA,sBAClBA,GAAA,EAAkB;AAAA,sBAClBA,GAAA,CAAA,CAAkB;AAAA,EAAA,GACrB;AAEF,SACE,gBAAAL;AAAA,IAACM;AAAA,IAAA;AAAA,MACC,QAAQ;AAAA,QACN,EAAE,OAAOP,GAAe,SAASG,EAAA;AAAA,QACjC,EAAE,OAAOH,GAAe,SAASG,EAAA;AAAA,QACjC,EAAE,OAAOH,GAAe,SAASG,EAAA;AAAA,MAAgB;AAAA,IACnD;AAAA,EAAA;AAGN;"}
|
|
@@ -35,8 +35,8 @@ import { DownloadOutlined as oe } from "@mui/icons-material";
|
|
|
35
35
|
import { createPortal as ne } from "react-dom";
|
|
36
36
|
import { displayFilesWereAddedToDownloadListSuccess as ie } from "../download_list/DownloadConfirmationUtils.js";
|
|
37
37
|
import { EntityDownloadConfirmation as ae } from "../EntityDownloadConfirmation/EntityDownloadConfirmation.js";
|
|
38
|
-
import { DropdownMenu as
|
|
39
|
-
import { ModalDownload as
|
|
38
|
+
import { DropdownMenu as se } from "../menu/DropdownMenu.js";
|
|
39
|
+
import { ModalDownload as re } from "../ModalDownload/ModalDownload.js";
|
|
40
40
|
import { ProgrammaticInstructionsModal as de } from "../ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js";
|
|
41
41
|
import { displayToast as E } from "../ToastMessage/ToastMessage.js";
|
|
42
42
|
const h = `import synapseclient
|
|
@@ -92,7 +92,7 @@ query.asDataFrame()`
|
|
|
92
92
|
throw new Error(`Unhandled EntityType: ${e}`);
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
|
-
function ce(e, o, n, i,
|
|
95
|
+
function ce(e, o, n, i, r, d, l, s, y, c, p, f) {
|
|
96
96
|
switch (i) {
|
|
97
97
|
case 0:
|
|
98
98
|
return {
|
|
@@ -105,21 +105,21 @@ function ce(e, o, n, i, s, d, l, r, y, c, p, f) {
|
|
|
105
105
|
};
|
|
106
106
|
case 1:
|
|
107
107
|
return {
|
|
108
|
-
text: "Add to Download
|
|
108
|
+
text: "Add to Download List",
|
|
109
109
|
disabled: c,
|
|
110
110
|
tooltipText: me(n, !!c),
|
|
111
111
|
onClick: () => {
|
|
112
112
|
n === t.file || n === t.recordset ? l({
|
|
113
113
|
entityId: e,
|
|
114
114
|
entityVersionNumber: y
|
|
115
|
-
}) :
|
|
115
|
+
}) : s(!0);
|
|
116
116
|
}
|
|
117
117
|
};
|
|
118
118
|
case 2:
|
|
119
119
|
return {
|
|
120
120
|
text: "Programmatic Access",
|
|
121
121
|
onClick: () => {
|
|
122
|
-
|
|
122
|
+
r(!0);
|
|
123
123
|
},
|
|
124
124
|
tooltipText: "View programmatic access options"
|
|
125
125
|
};
|
|
@@ -127,7 +127,7 @@ function ce(e, o, n, i, s, d, l, r, y, c, p, f) {
|
|
|
127
127
|
return {
|
|
128
128
|
text: "Programmatic Access (Docker)",
|
|
129
129
|
onClick: () => {
|
|
130
|
-
|
|
130
|
+
r(!0);
|
|
131
131
|
},
|
|
132
132
|
tooltipText: "View programmatic options to pull Docker image"
|
|
133
133
|
};
|
|
@@ -141,7 +141,7 @@ function ce(e, o, n, i, s, d, l, r, y, c, p, f) {
|
|
|
141
141
|
};
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
|
-
const me = (e, o) => o ? `This ${K(e)} has no accessible files` : "Add file(s) to your download
|
|
144
|
+
const me = (e, o) => o ? `This ${K(e)} has no accessible files` : "Add file(s) to your download list";
|
|
145
145
|
function ue(e) {
|
|
146
146
|
switch (e) {
|
|
147
147
|
case t.file:
|
|
@@ -199,16 +199,16 @@ function ue(e) {
|
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
function ye(e, o) {
|
|
202
|
-
const { data: n, isLoading: i } = F(e),
|
|
202
|
+
const { data: n, isLoading: i } = F(e), r = o === t.dataset, { data: d, isLoading: l } = ee(
|
|
203
203
|
e,
|
|
204
204
|
0,
|
|
205
205
|
1,
|
|
206
206
|
{
|
|
207
|
-
enabled:
|
|
207
|
+
enabled: r
|
|
208
208
|
}
|
|
209
209
|
);
|
|
210
|
-
let
|
|
211
|
-
return
|
|
210
|
+
let s;
|
|
211
|
+
return r ? d?.results && d.results.length > 0 ? s = d.results[0].versionNumber : s = void 0 : s = n && z(n) ? n.versionNumber : void 0, { latestVersionNumber: s, isLoading: i || l };
|
|
212
212
|
}
|
|
213
213
|
function pe(e, o, n) {
|
|
214
214
|
let i;
|
|
@@ -229,15 +229,15 @@ function nt(e) {
|
|
|
229
229
|
e.entityId,
|
|
230
230
|
o,
|
|
231
231
|
e.entityType
|
|
232
|
-
), { downloadCartPageUrl: i, isAuthenticated:
|
|
232
|
+
), { downloadCartPageUrl: i, isAuthenticated: r } = W(), { mutate: d } = X({
|
|
233
233
|
onSuccess: (m) => {
|
|
234
|
-
m.numberOfFilesAdded > 0 ? ie(i) : E("0 Files added to your Download
|
|
234
|
+
m.numberOfFilesAdded > 0 ? ie(i) : E("0 Files added to your Download List", "info");
|
|
235
235
|
},
|
|
236
236
|
onError: (m) => {
|
|
237
237
|
E(m.reason, "danger");
|
|
238
238
|
}
|
|
239
|
-
}), [l,
|
|
240
|
-
|
|
239
|
+
}), [l, s] = w(!1), [y, c] = w(!1), [p, f] = w(!1), L = () => {
|
|
240
|
+
s(!1);
|
|
241
241
|
}, T = U(e.entityType), {
|
|
242
242
|
data: k,
|
|
243
243
|
isLoading: O
|
|
@@ -268,14 +268,14 @@ function nt(e) {
|
|
|
268
268
|
e.name,
|
|
269
269
|
e.entityType,
|
|
270
270
|
_,
|
|
271
|
-
|
|
271
|
+
s,
|
|
272
272
|
D,
|
|
273
273
|
d,
|
|
274
274
|
c,
|
|
275
275
|
o,
|
|
276
276
|
x,
|
|
277
277
|
R,
|
|
278
|
-
|
|
278
|
+
r
|
|
279
279
|
)
|
|
280
280
|
)
|
|
281
281
|
), { cliCode: P, rCode: q, pythonCode: V } = le(
|
|
@@ -292,7 +292,7 @@ function nt(e) {
|
|
|
292
292
|
) : null;
|
|
293
293
|
return /* @__PURE__ */ j(H, { children: [
|
|
294
294
|
/* @__PURE__ */ u(
|
|
295
|
-
|
|
295
|
+
se,
|
|
296
296
|
{
|
|
297
297
|
items: M,
|
|
298
298
|
dropdownButtonText: "Download",
|
|
@@ -321,7 +321,7 @@ function nt(e) {
|
|
|
321
321
|
}
|
|
322
322
|
),
|
|
323
323
|
v && /* @__PURE__ */ u(
|
|
324
|
-
|
|
324
|
+
re,
|
|
325
325
|
{
|
|
326
326
|
queryBundleRequest: n,
|
|
327
327
|
onClose: I
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityDownloadButton.js","sources":["../../../src/components/EntityDownloadButton/EntityDownloadButton.tsx"],"sourcesContent":["import { useGetEntity, useGetVersions } from '@/synapse-queries'\nimport {\n useAddFileToDownloadList,\n useGetAddToDownloadListStats,\n} from '@/synapse-queries/index'\nimport { useSynapseContext } from '@/utils'\nimport {\n entityTypeToFriendlyName,\n hasFilesInView,\n isContainerType,\n isDataset,\n isEntityView,\n isVersionableEntity,\n} from '@/utils/functions/EntityTypeUtils'\nimport { useDirectDownloadHandler } from '@/utils/hooks/useDirectDownloadHandler'\nimport { isFileEntity } from '@/utils/types/IsType'\nimport { DownloadOutlined as DownloadIcon } from '@mui/icons-material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n FileHandleAssociateType,\n QueryBundleRequest,\n} from '@sage-bionetworks/synapse-types'\nimport { RefObject, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { displayFilesWereAddedToDownloadListSuccess } from '../download_list/DownloadConfirmationUtils'\nimport { EntityDownloadConfirmation } from '../EntityDownloadConfirmation'\nimport { DropdownMenu, DropdownMenuItem } from '../menu/DropdownMenu'\nimport { ModalDownload } from '../ModalDownload/ModalDownload'\nimport { ProgrammaticInstructionsModal } from '../ProgrammaticInstructionsModal/ProgrammaticInstructionsModal'\nimport { displayToast } from '../ToastMessage/index'\n\n// WIP\n// Per Nick Grosenbacher: For this to be reusable, I think we would also need to accept versionNumber as a prop. Where we would have the following behavior:\n// - If the version number is present, use it\n// - If the version number is null, do not use it,\n// - If the version number is undefined, then we would try to do the 'smart' thing-- get the latest version for datasets, otherwise don't use it.\n\n// Have to keep these consts outside of getProgrammaticAccessCode because\n// they are being called in ProgrammaticTableDownload.tsx\n// Python client import and login instructions\nexport const PYTHON_CLIENT_IMPORT_AND_LOGIN = `import synapseclient\nsyn = synapseclient.Synapse()\nsyn.login(authToken=\"YOUR_TOKEN_HERE\")`\n\n// R client import and login instructions\nexport const R_CLIENT_IMPORT_AND_LOGIN = `library(synapser)\nsynLogin(authToken=\"YOUR_TOKEN_HERE\")`\n\ntype ProgrammaticAccessCode = {\n cliCode: string | undefined\n rCode: string | undefined\n pythonCode: string | undefined\n}\n\n// Generate programmatic access code snippet content based on entity type\nfunction getProgrammaticAccessCode(\n type: EntityType,\n entityId: string,\n version: number | undefined,\n): ProgrammaticAccessCode {\n const id =\n type === EntityType.dataset && version ? `${entityId}.${version}` : entityId\n switch (type) {\n case EntityType.file:\n case EntityType.folder:\n case EntityType.project:\n case EntityType.link:\n return {\n cliCode: `synapse get -r ${entityId}`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsynGet('${entityId}')`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsyn.get('${entityId}')`,\n }\n case EntityType.dockerrepo:\n return {\n cliCode: `docker login -u <synapse username> -p <synapse password> docker.synapse.org \\n\ndocker pull docker.synapse.org/${entityId}/myrepo`,\n rCode: undefined,\n pythonCode: undefined,\n }\n case EntityType.dataset:\n case EntityType.entityview:\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n case EntityType.recordset:\n return {\n cliCode: `synapse get -q \"SELECT * FROM ${id}\"`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\nquery <- synTableQuery(\"SELECT * FROM ${id}\")\nread.table(query$filepath, sep=\",\")`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\nquery = syn.tableQuery(\"SELECT * FROM ${id}\")\nquery.asDataFrame()`,\n }\n default:\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\nenum DownloadAction {\n downloadFile,\n addToCart,\n programmaticAccess,\n programmaticAccessDocker,\n exportTable,\n}\n\n// Function that creates menu items for download actions\nfunction getMenuItemForAction(\n entityId: string,\n entityName: string,\n entityType: EntityType,\n downloadAction: DownloadAction,\n setShowProgrammaticAccess: (show: boolean) => void,\n setShowExportMetadata: (show: boolean) => void,\n addFileToDownloadList: (params: {\n entityId: string\n entityVersionNumber: number | undefined\n }) => void,\n setShowDownloadConfirmation: (show: boolean) => void,\n versionNumber?: number,\n addToCartDisabled?: boolean,\n onDownloadFile?: () => void,\n isAuthenticated?: boolean,\n): DropdownMenuItem {\n switch (downloadAction) {\n case DownloadAction.downloadFile:\n return {\n text: 'Download File',\n onClick: () => {\n if (onDownloadFile) onDownloadFile()\n },\n tooltipText: isAuthenticated\n ? 'Download this file directly'\n : 'Sign in to download this file',\n disabled: !isAuthenticated,\n }\n case DownloadAction.addToCart:\n return {\n text: 'Add to Download Cart',\n disabled: addToCartDisabled,\n tooltipText: getAddToCartTooltip(entityType, !!addToCartDisabled),\n onClick: () => {\n if (\n entityType === EntityType.file ||\n entityType === EntityType.recordset\n ) {\n addFileToDownloadList({\n entityId,\n entityVersionNumber: versionNumber,\n })\n } else {\n setShowDownloadConfirmation(true)\n }\n },\n }\n case DownloadAction.programmaticAccess:\n return {\n text: 'Programmatic Access',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic access options',\n }\n case DownloadAction.programmaticAccessDocker:\n return {\n text: 'Programmatic Access (Docker)',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic options to pull Docker image',\n }\n case DownloadAction.exportTable:\n return {\n text: 'Export Table',\n onClick: () => {\n setShowExportMetadata(true)\n },\n tooltipText: 'Export table data',\n }\n }\n}\n\n/**\n * Determines the tooltip message based on the entity type and its \"add to cart\" status.\n */\nconst getAddToCartTooltip = (\n entityType: EntityType,\n isDisabled: boolean,\n): string => {\n if (!isDisabled) {\n return 'Add file(s) to your download cart'\n }\n const entityFriendlyName = entityTypeToFriendlyName(entityType)\n return `This ${entityFriendlyName} has no accessible files`\n}\n\n// Function that returns DropdownMenuItem\nexport function getDownloadActionsForEntityType(\n type: EntityType,\n): DownloadAction[][] {\n switch (type) {\n case EntityType.file:\n case EntityType.recordset:\n return [\n [DownloadAction.downloadFile],\n [DownloadAction.addToCart, DownloadAction.programmaticAccess],\n ]\n case EntityType.project:\n case EntityType.folder:\n return [[DownloadAction.addToCart, DownloadAction.programmaticAccess]]\n case EntityType.dockerrepo:\n return [[DownloadAction.programmaticAccessDocker]]\n case EntityType.entityview:\n case EntityType.dataset:\n return [\n [\n DownloadAction.exportTable,\n DownloadAction.programmaticAccess,\n DownloadAction.addToCart,\n ],\n ]\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n return [[DownloadAction.exportTable, DownloadAction.programmaticAccess]]\n case EntityType.link:\n return [[DownloadAction.programmaticAccess]]\n default:\n // this will fail if a new EntityType is added and not handled\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\n// get the appropriate version number for download based on entity type\n// for datasets: returns the most recent released version if any exist, undefined otherwise\n// for other entities: returns the current version number\nfunction useGetLatestVersionNumber(entityId: string, entityType: EntityType) {\n // get entity data\n const { data: entityData, isLoading: entityDataLoading } =\n useGetEntity(entityId) // No version = latest\n\n // for datasets, check if any versions exist and use the most recent one\n const mustGetVersion = entityType === EntityType.dataset\n const { data: versionsData, isLoading: versionsLoading } = useGetVersions(\n entityId,\n 0,\n 1,\n {\n enabled: mustGetVersion,\n },\n )\n\n let latestVersionNumber: number | undefined\n\n if (mustGetVersion) {\n // for datasets, check if any versions exist\n if (versionsData?.results && versionsData.results.length > 0) {\n // Use the most recent released version (first in the list, since versions are returned in descending order)\n latestVersionNumber = versionsData.results[0].versionNumber\n } else {\n // no versions exist, use undefined (will use current/draft version)\n latestVersionNumber = undefined\n }\n } else {\n // for non-datasets, use the entity's version number\n latestVersionNumber =\n entityData && isVersionableEntity(entityData)\n ? entityData.versionNumber\n : undefined\n }\n\n const isLoading = entityDataLoading || versionsLoading\n\n return { latestVersionNumber, isLoading }\n}\n\n// create default queryBundleRequest with appropriate SQL\nfunction getDefaultQueryBundleRequestForEntity(\n entityId: string,\n versionNumber: number | undefined,\n entityType: EntityType,\n): QueryBundleRequest {\n let sql: string\n\n if (entityType === EntityType.dataset) {\n // for datasets:\n // - if a version number exists (released version), use it: syn123.5\n // - if no version number (no released versions), use current/draft: syn123\n sql = versionNumber\n ? `SELECT * FROM ${entityId}.${versionNumber}`\n : `SELECT * FROM ${entityId}`\n } else {\n // For non-datasets, always use entity ID without version\n sql = `SELECT * FROM ${entityId}`\n }\n\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: `${entityId}`,\n query: {\n sql: sql,\n },\n partMask: 0,\n }\n}\n\nexport function EntityDownloadButton(props: {\n entityId: string\n name: string\n entityType: EntityType\n downloadConfirmationContainer?: RefObject<HTMLElement | null>\n disabled?: boolean\n}) {\n // get the appropriate version number for the entity\n const { latestVersionNumber } = useGetLatestVersionNumber(\n props.entityId,\n props.entityType,\n )\n // create queryBundleRequest with appropriate SQL based on entity type and version\n const defaultQueryBundleRequest = getDefaultQueryBundleRequestForEntity(\n props.entityId,\n latestVersionNumber,\n props.entityType,\n )\n\n // Get context and download functionality\n const { downloadCartPageUrl, isAuthenticated } = useSynapseContext()\n const { mutate: addFileToDownloadList } = useAddFileToDownloadList({\n onSuccess: data => {\n if (data.numberOfFilesAdded > 0) {\n displayFilesWereAddedToDownloadListSuccess(downloadCartPageUrl)\n } else {\n displayToast('0 Files added to your Download Cart', 'info')\n }\n },\n onError: error => {\n displayToast(error.reason, 'danger')\n },\n })\n\n // state to manage programmatic access modal visibility\n const [showProgrammaticAccess, setShowProgrammaticAccess] =\n useState<boolean>(false)\n\n // state to manage download confirmation visibility and loading\n const [showDownloadConfirmation, setShowDownloadConfirmation] =\n useState<boolean>(false)\n const [downloadConfirmationLoading, setDownloadConfirmationLoading] =\n useState<boolean>(false)\n\n const handleCloseProgrammaticAccess = () => {\n setShowProgrammaticAccess(false)\n }\n\n const isFolderOrProject = isContainerType(props.entityType)\n\n const {\n data: folderOrProjectStats,\n isLoading: isLoadingFolderOrProjectStats,\n } = useGetAddToDownloadListStats(\n {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListStatsRequest',\n request: {\n parentId: props.entityId,\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n recursive: true,\n },\n },\n {\n enabled: isFolderOrProject,\n },\n )\n\n const folderOrProjectHasNoFiles =\n isFolderOrProject &&\n (isLoadingFolderOrProjectStats || folderOrProjectStats?.fileCount === 0)\n\n const { data: entityData } = useGetEntity(props.entityId)\n\n const { downloadFile } = useDirectDownloadHandler()\n\n const fileHandleId =\n entityData && isFileEntity(entityData)\n ? entityData.dataFileHandleId\n : undefined\n\n const onDownloadFile = fileHandleId\n ? () => {\n void downloadFile({\n fileHandleId,\n associatedObjectId: props.entityId,\n associatedObjectType: FileHandleAssociateType.FileEntity,\n })\n }\n : undefined\n\n const entityViewHasNoFiles =\n entityData && isEntityView(entityData) && !hasFilesInView(entityData)\n\n const datasetHasNoFiles =\n entityData &&\n isDataset(entityData) &&\n (!entityData.items || entityData.items.length === 0)\n\n const addToCartDisabled =\n folderOrProjectHasNoFiles || entityViewHasNoFiles || datasetHasNoFiles\n\n // state to manage export metadata modal visibility\n const [showExportMetadata, setShowExportMetadata] = useState<boolean>(false)\n\n const handleCloseExportMetadata = () => {\n setShowExportMetadata(false)\n }\n\n // Create download menu items\n const downloadActions = getDownloadActionsForEntityType(props.entityType)\n const downloadMenuItems = downloadActions.map(actionGroup =>\n actionGroup.map(action =>\n getMenuItemForAction(\n props.entityId,\n props.name,\n props.entityType,\n action,\n setShowProgrammaticAccess,\n setShowExportMetadata,\n addFileToDownloadList,\n setShowDownloadConfirmation,\n latestVersionNumber,\n addToCartDisabled,\n onDownloadFile,\n isAuthenticated,\n ),\n ),\n )\n\n // Return programmatic access modal content\n const { cliCode, rCode, pythonCode } = getProgrammaticAccessCode(\n props.entityType,\n props.entityId,\n latestVersionNumber,\n )\n\n const downloadConfirmation = showDownloadConfirmation ? (\n <EntityDownloadConfirmation\n entityId={props.entityId}\n handleClose={() => setShowDownloadConfirmation(false)}\n onIsLoadingChange={setDownloadConfirmationLoading}\n />\n ) : null\n\n return (\n <>\n <DropdownMenu\n items={downloadMenuItems}\n dropdownButtonText=\"Download\"\n buttonTooltip=\"Download options for this entity\"\n buttonProps={{\n variant: 'outlined',\n startIcon: <DownloadIcon />,\n disabled: props.disabled || downloadConfirmationLoading,\n }}\n />\n {downloadConfirmation &&\n (props.downloadConfirmationContainer?.current\n ? createPortal(\n downloadConfirmation,\n props.downloadConfirmationContainer.current,\n )\n : downloadConfirmation)}\n <ProgrammaticInstructionsModal\n show={showProgrammaticAccess}\n title={`Programmatic Access: ${props.name}`}\n onClose={handleCloseProgrammaticAccess}\n pythonCode={pythonCode}\n rCode={rCode}\n cliCode={cliCode}\n helpUrl=\"https://help.synapse.org/docs/Synapse-Docker-Registry.2011037752.html#SynapseDockerRegistry-UsingDockerImagesStoredintheSynapseDockerRegistry\"\n />\n {showExportMetadata && (\n <ModalDownload\n queryBundleRequest={defaultQueryBundleRequest}\n onClose={handleCloseExportMetadata}\n />\n )}\n </>\n )\n}\n"],"names":["PYTHON_CLIENT_IMPORT_AND_LOGIN","R_CLIENT_IMPORT_AND_LOGIN","getProgrammaticAccessCode","type","entityId","version","id","EntityType","getMenuItemForAction","entityName","entityType","downloadAction","setShowProgrammaticAccess","setShowExportMetadata","addFileToDownloadList","setShowDownloadConfirmation","versionNumber","addToCartDisabled","onDownloadFile","isAuthenticated","getAddToCartTooltip","isDisabled","entityTypeToFriendlyName","getDownloadActionsForEntityType","useGetLatestVersionNumber","entityData","entityDataLoading","useGetEntity","mustGetVersion","versionsData","versionsLoading","useGetVersions","latestVersionNumber","isVersionableEntity","getDefaultQueryBundleRequestForEntity","sql","EntityDownloadButton","props","defaultQueryBundleRequest","downloadCartPageUrl","useSynapseContext","useAddFileToDownloadList","data","displayFilesWereAddedToDownloadListSuccess","displayToast","error","showProgrammaticAccess","useState","showDownloadConfirmation","downloadConfirmationLoading","setDownloadConfirmationLoading","handleCloseProgrammaticAccess","isFolderOrProject","isContainerType","folderOrProjectStats","isLoadingFolderOrProjectStats","useGetAddToDownloadListStats","folderOrProjectHasNoFiles","downloadFile","useDirectDownloadHandler","fileHandleId","isFileEntity","FileHandleAssociateType","entityViewHasNoFiles","isEntityView","hasFilesInView","datasetHasNoFiles","isDataset","showExportMetadata","handleCloseExportMetadata","downloadMenuItems","actionGroup","action","cliCode","rCode","pythonCode","downloadConfirmation","jsx","EntityDownloadConfirmation","jsxs","Fragment","DropdownMenu","DownloadIcon","createPortal","ProgrammaticInstructionsModal","ModalDownload"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EntityDownloadButton.js","sources":["../../../src/components/EntityDownloadButton/EntityDownloadButton.tsx"],"sourcesContent":["import { useGetEntity, useGetVersions } from '@/synapse-queries'\nimport {\n useAddFileToDownloadList,\n useGetAddToDownloadListStats,\n} from '@/synapse-queries/index'\nimport { useSynapseContext } from '@/utils'\nimport {\n entityTypeToFriendlyName,\n hasFilesInView,\n isContainerType,\n isDataset,\n isEntityView,\n isVersionableEntity,\n} from '@/utils/functions/EntityTypeUtils'\nimport { useDirectDownloadHandler } from '@/utils/hooks/useDirectDownloadHandler'\nimport { isFileEntity } from '@/utils/types/IsType'\nimport { DownloadOutlined as DownloadIcon } from '@mui/icons-material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n FileHandleAssociateType,\n QueryBundleRequest,\n} from '@sage-bionetworks/synapse-types'\nimport { RefObject, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { displayFilesWereAddedToDownloadListSuccess } from '../download_list/DownloadConfirmationUtils'\nimport { EntityDownloadConfirmation } from '../EntityDownloadConfirmation'\nimport { DropdownMenu, DropdownMenuItem } from '../menu/DropdownMenu'\nimport { ModalDownload } from '../ModalDownload/ModalDownload'\nimport { ProgrammaticInstructionsModal } from '../ProgrammaticInstructionsModal/ProgrammaticInstructionsModal'\nimport { displayToast } from '../ToastMessage/index'\n\n// WIP\n// Per Nick Grosenbacher: For this to be reusable, I think we would also need to accept versionNumber as a prop. Where we would have the following behavior:\n// - If the version number is present, use it\n// - If the version number is null, do not use it,\n// - If the version number is undefined, then we would try to do the 'smart' thing-- get the latest version for datasets, otherwise don't use it.\n\n// Have to keep these consts outside of getProgrammaticAccessCode because\n// they are being called in ProgrammaticTableDownload.tsx\n// Python client import and login instructions\nexport const PYTHON_CLIENT_IMPORT_AND_LOGIN = `import synapseclient\nsyn = synapseclient.Synapse()\nsyn.login(authToken=\"YOUR_TOKEN_HERE\")`\n\n// R client import and login instructions\nexport const R_CLIENT_IMPORT_AND_LOGIN = `library(synapser)\nsynLogin(authToken=\"YOUR_TOKEN_HERE\")`\n\ntype ProgrammaticAccessCode = {\n cliCode: string | undefined\n rCode: string | undefined\n pythonCode: string | undefined\n}\n\n// Generate programmatic access code snippet content based on entity type\nfunction getProgrammaticAccessCode(\n type: EntityType,\n entityId: string,\n version: number | undefined,\n): ProgrammaticAccessCode {\n const id =\n type === EntityType.dataset && version ? `${entityId}.${version}` : entityId\n switch (type) {\n case EntityType.file:\n case EntityType.folder:\n case EntityType.project:\n case EntityType.link:\n return {\n cliCode: `synapse get -r ${entityId}`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsynGet('${entityId}')`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsyn.get('${entityId}')`,\n }\n case EntityType.dockerrepo:\n return {\n cliCode: `docker login -u <synapse username> -p <synapse password> docker.synapse.org \\n\ndocker pull docker.synapse.org/${entityId}/myrepo`,\n rCode: undefined,\n pythonCode: undefined,\n }\n case EntityType.dataset:\n case EntityType.entityview:\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n case EntityType.recordset:\n return {\n cliCode: `synapse get -q \"SELECT * FROM ${id}\"`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\nquery <- synTableQuery(\"SELECT * FROM ${id}\")\nread.table(query$filepath, sep=\",\")`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\nquery = syn.tableQuery(\"SELECT * FROM ${id}\")\nquery.asDataFrame()`,\n }\n default:\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\nenum DownloadAction {\n downloadFile,\n addToCart,\n programmaticAccess,\n programmaticAccessDocker,\n exportTable,\n}\n\n// Function that creates menu items for download actions\nfunction getMenuItemForAction(\n entityId: string,\n entityName: string,\n entityType: EntityType,\n downloadAction: DownloadAction,\n setShowProgrammaticAccess: (show: boolean) => void,\n setShowExportMetadata: (show: boolean) => void,\n addFileToDownloadList: (params: {\n entityId: string\n entityVersionNumber: number | undefined\n }) => void,\n setShowDownloadConfirmation: (show: boolean) => void,\n versionNumber?: number,\n addToCartDisabled?: boolean,\n onDownloadFile?: () => void,\n isAuthenticated?: boolean,\n): DropdownMenuItem {\n switch (downloadAction) {\n case DownloadAction.downloadFile:\n return {\n text: 'Download File',\n onClick: () => {\n if (onDownloadFile) onDownloadFile()\n },\n tooltipText: isAuthenticated\n ? 'Download this file directly'\n : 'Sign in to download this file',\n disabled: !isAuthenticated,\n }\n case DownloadAction.addToCart:\n return {\n text: 'Add to Download List',\n disabled: addToCartDisabled,\n tooltipText: getAddToCartTooltip(entityType, !!addToCartDisabled),\n onClick: () => {\n if (\n entityType === EntityType.file ||\n entityType === EntityType.recordset\n ) {\n addFileToDownloadList({\n entityId,\n entityVersionNumber: versionNumber,\n })\n } else {\n setShowDownloadConfirmation(true)\n }\n },\n }\n case DownloadAction.programmaticAccess:\n return {\n text: 'Programmatic Access',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic access options',\n }\n case DownloadAction.programmaticAccessDocker:\n return {\n text: 'Programmatic Access (Docker)',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic options to pull Docker image',\n }\n case DownloadAction.exportTable:\n return {\n text: 'Export Table',\n onClick: () => {\n setShowExportMetadata(true)\n },\n tooltipText: 'Export table data',\n }\n }\n}\n\n/**\n * Determines the tooltip message based on the entity type and its \"add to cart\" status.\n */\nconst getAddToCartTooltip = (\n entityType: EntityType,\n isDisabled: boolean,\n): string => {\n if (!isDisabled) {\n return 'Add file(s) to your download list'\n }\n const entityFriendlyName = entityTypeToFriendlyName(entityType)\n return `This ${entityFriendlyName} has no accessible files`\n}\n\n// Function that returns DropdownMenuItem\nexport function getDownloadActionsForEntityType(\n type: EntityType,\n): DownloadAction[][] {\n switch (type) {\n case EntityType.file:\n case EntityType.recordset:\n return [\n [DownloadAction.downloadFile],\n [DownloadAction.addToCart, DownloadAction.programmaticAccess],\n ]\n case EntityType.project:\n case EntityType.folder:\n return [[DownloadAction.addToCart, DownloadAction.programmaticAccess]]\n case EntityType.dockerrepo:\n return [[DownloadAction.programmaticAccessDocker]]\n case EntityType.entityview:\n case EntityType.dataset:\n return [\n [\n DownloadAction.exportTable,\n DownloadAction.programmaticAccess,\n DownloadAction.addToCart,\n ],\n ]\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n return [[DownloadAction.exportTable, DownloadAction.programmaticAccess]]\n case EntityType.link:\n return [[DownloadAction.programmaticAccess]]\n default:\n // this will fail if a new EntityType is added and not handled\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\n// get the appropriate version number for download based on entity type\n// for datasets: returns the most recent released version if any exist, undefined otherwise\n// for other entities: returns the current version number\nfunction useGetLatestVersionNumber(entityId: string, entityType: EntityType) {\n // get entity data\n const { data: entityData, isLoading: entityDataLoading } =\n useGetEntity(entityId) // No version = latest\n\n // for datasets, check if any versions exist and use the most recent one\n const mustGetVersion = entityType === EntityType.dataset\n const { data: versionsData, isLoading: versionsLoading } = useGetVersions(\n entityId,\n 0,\n 1,\n {\n enabled: mustGetVersion,\n },\n )\n\n let latestVersionNumber: number | undefined\n\n if (mustGetVersion) {\n // for datasets, check if any versions exist\n if (versionsData?.results && versionsData.results.length > 0) {\n // Use the most recent released version (first in the list, since versions are returned in descending order)\n latestVersionNumber = versionsData.results[0].versionNumber\n } else {\n // no versions exist, use undefined (will use current/draft version)\n latestVersionNumber = undefined\n }\n } else {\n // for non-datasets, use the entity's version number\n latestVersionNumber =\n entityData && isVersionableEntity(entityData)\n ? entityData.versionNumber\n : undefined\n }\n\n const isLoading = entityDataLoading || versionsLoading\n\n return { latestVersionNumber, isLoading }\n}\n\n// create default queryBundleRequest with appropriate SQL\nfunction getDefaultQueryBundleRequestForEntity(\n entityId: string,\n versionNumber: number | undefined,\n entityType: EntityType,\n): QueryBundleRequest {\n let sql: string\n\n if (entityType === EntityType.dataset) {\n // for datasets:\n // - if a version number exists (released version), use it: syn123.5\n // - if no version number (no released versions), use current/draft: syn123\n sql = versionNumber\n ? `SELECT * FROM ${entityId}.${versionNumber}`\n : `SELECT * FROM ${entityId}`\n } else {\n // For non-datasets, always use entity ID without version\n sql = `SELECT * FROM ${entityId}`\n }\n\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: `${entityId}`,\n query: {\n sql: sql,\n },\n partMask: 0,\n }\n}\n\nexport function EntityDownloadButton(props: {\n entityId: string\n name: string\n entityType: EntityType\n downloadConfirmationContainer?: RefObject<HTMLElement | null>\n disabled?: boolean\n}) {\n // get the appropriate version number for the entity\n const { latestVersionNumber } = useGetLatestVersionNumber(\n props.entityId,\n props.entityType,\n )\n // create queryBundleRequest with appropriate SQL based on entity type and version\n const defaultQueryBundleRequest = getDefaultQueryBundleRequestForEntity(\n props.entityId,\n latestVersionNumber,\n props.entityType,\n )\n\n // Get context and download functionality\n const { downloadCartPageUrl, isAuthenticated } = useSynapseContext()\n const { mutate: addFileToDownloadList } = useAddFileToDownloadList({\n onSuccess: data => {\n if (data.numberOfFilesAdded > 0) {\n displayFilesWereAddedToDownloadListSuccess(downloadCartPageUrl)\n } else {\n displayToast('0 Files added to your Download List', 'info')\n }\n },\n onError: error => {\n displayToast(error.reason, 'danger')\n },\n })\n\n // state to manage programmatic access modal visibility\n const [showProgrammaticAccess, setShowProgrammaticAccess] =\n useState<boolean>(false)\n\n // state to manage download confirmation visibility and loading\n const [showDownloadConfirmation, setShowDownloadConfirmation] =\n useState<boolean>(false)\n const [downloadConfirmationLoading, setDownloadConfirmationLoading] =\n useState<boolean>(false)\n\n const handleCloseProgrammaticAccess = () => {\n setShowProgrammaticAccess(false)\n }\n\n const isFolderOrProject = isContainerType(props.entityType)\n\n const {\n data: folderOrProjectStats,\n isLoading: isLoadingFolderOrProjectStats,\n } = useGetAddToDownloadListStats(\n {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListStatsRequest',\n request: {\n parentId: props.entityId,\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n recursive: true,\n },\n },\n {\n enabled: isFolderOrProject,\n },\n )\n\n const folderOrProjectHasNoFiles =\n isFolderOrProject &&\n (isLoadingFolderOrProjectStats || folderOrProjectStats?.fileCount === 0)\n\n const { data: entityData } = useGetEntity(props.entityId)\n\n const { downloadFile } = useDirectDownloadHandler()\n\n const fileHandleId =\n entityData && isFileEntity(entityData)\n ? entityData.dataFileHandleId\n : undefined\n\n const onDownloadFile = fileHandleId\n ? () => {\n void downloadFile({\n fileHandleId,\n associatedObjectId: props.entityId,\n associatedObjectType: FileHandleAssociateType.FileEntity,\n })\n }\n : undefined\n\n const entityViewHasNoFiles =\n entityData && isEntityView(entityData) && !hasFilesInView(entityData)\n\n const datasetHasNoFiles =\n entityData &&\n isDataset(entityData) &&\n (!entityData.items || entityData.items.length === 0)\n\n const addToCartDisabled =\n folderOrProjectHasNoFiles || entityViewHasNoFiles || datasetHasNoFiles\n\n // state to manage export metadata modal visibility\n const [showExportMetadata, setShowExportMetadata] = useState<boolean>(false)\n\n const handleCloseExportMetadata = () => {\n setShowExportMetadata(false)\n }\n\n // Create download menu items\n const downloadActions = getDownloadActionsForEntityType(props.entityType)\n const downloadMenuItems = downloadActions.map(actionGroup =>\n actionGroup.map(action =>\n getMenuItemForAction(\n props.entityId,\n props.name,\n props.entityType,\n action,\n setShowProgrammaticAccess,\n setShowExportMetadata,\n addFileToDownloadList,\n setShowDownloadConfirmation,\n latestVersionNumber,\n addToCartDisabled,\n onDownloadFile,\n isAuthenticated,\n ),\n ),\n )\n\n // Return programmatic access modal content\n const { cliCode, rCode, pythonCode } = getProgrammaticAccessCode(\n props.entityType,\n props.entityId,\n latestVersionNumber,\n )\n\n const downloadConfirmation = showDownloadConfirmation ? (\n <EntityDownloadConfirmation\n entityId={props.entityId}\n handleClose={() => setShowDownloadConfirmation(false)}\n onIsLoadingChange={setDownloadConfirmationLoading}\n />\n ) : null\n\n return (\n <>\n <DropdownMenu\n items={downloadMenuItems}\n dropdownButtonText=\"Download\"\n buttonTooltip=\"Download options for this entity\"\n buttonProps={{\n variant: 'outlined',\n startIcon: <DownloadIcon />,\n disabled: props.disabled || downloadConfirmationLoading,\n }}\n />\n {downloadConfirmation &&\n (props.downloadConfirmationContainer?.current\n ? createPortal(\n downloadConfirmation,\n props.downloadConfirmationContainer.current,\n )\n : downloadConfirmation)}\n <ProgrammaticInstructionsModal\n show={showProgrammaticAccess}\n title={`Programmatic Access: ${props.name}`}\n onClose={handleCloseProgrammaticAccess}\n pythonCode={pythonCode}\n rCode={rCode}\n cliCode={cliCode}\n helpUrl=\"https://help.synapse.org/docs/Synapse-Docker-Registry.2011037752.html#SynapseDockerRegistry-UsingDockerImagesStoredintheSynapseDockerRegistry\"\n />\n {showExportMetadata && (\n <ModalDownload\n queryBundleRequest={defaultQueryBundleRequest}\n onClose={handleCloseExportMetadata}\n />\n )}\n </>\n )\n}\n"],"names":["PYTHON_CLIENT_IMPORT_AND_LOGIN","R_CLIENT_IMPORT_AND_LOGIN","getProgrammaticAccessCode","type","entityId","version","id","EntityType","getMenuItemForAction","entityName","entityType","downloadAction","setShowProgrammaticAccess","setShowExportMetadata","addFileToDownloadList","setShowDownloadConfirmation","versionNumber","addToCartDisabled","onDownloadFile","isAuthenticated","getAddToCartTooltip","isDisabled","entityTypeToFriendlyName","getDownloadActionsForEntityType","useGetLatestVersionNumber","entityData","entityDataLoading","useGetEntity","mustGetVersion","versionsData","versionsLoading","useGetVersions","latestVersionNumber","isVersionableEntity","getDefaultQueryBundleRequestForEntity","sql","EntityDownloadButton","props","defaultQueryBundleRequest","downloadCartPageUrl","useSynapseContext","useAddFileToDownloadList","data","displayFilesWereAddedToDownloadListSuccess","displayToast","error","showProgrammaticAccess","useState","showDownloadConfirmation","downloadConfirmationLoading","setDownloadConfirmationLoading","handleCloseProgrammaticAccess","isFolderOrProject","isContainerType","folderOrProjectStats","isLoadingFolderOrProjectStats","useGetAddToDownloadListStats","folderOrProjectHasNoFiles","downloadFile","useDirectDownloadHandler","fileHandleId","isFileEntity","FileHandleAssociateType","entityViewHasNoFiles","isEntityView","hasFilesInView","datasetHasNoFiles","isDataset","showExportMetadata","handleCloseExportMetadata","downloadMenuItems","actionGroup","action","cliCode","rCode","pythonCode","downloadConfirmation","jsx","EntityDownloadConfirmation","jsxs","Fragment","DropdownMenu","DownloadIcon","createPortal","ProgrammaticInstructionsModal","ModalDownload"],"mappings":"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"}
|
|
@@ -34,7 +34,7 @@ import { displayFilesWereAddedToDownloadListSuccess as h } from "../../../../dow
|
|
|
34
34
|
import w from "../../../../IconSvg/IconSvg.js";
|
|
35
35
|
import { displayToast as x } from "../../../../ToastMessage/ToastMessage.js";
|
|
36
36
|
function to(n) {
|
|
37
|
-
const { row: p } = n, { entityId:
|
|
37
|
+
const { row: p } = n, { entityId: i, versionNumber: r } = p.original, { data: e } = a(i, r), { downloadCartPageUrl: d } = c(), { mutate: s } = g({
|
|
38
38
|
onSuccess: () => {
|
|
39
39
|
h(d);
|
|
40
40
|
},
|
|
@@ -51,12 +51,12 @@ function to(n) {
|
|
|
51
51
|
alignItems: "center",
|
|
52
52
|
height: "100%"
|
|
53
53
|
},
|
|
54
|
-
children: /* @__PURE__ */ o(f, { title: "Add to Download
|
|
54
|
+
children: /* @__PURE__ */ o(f, { title: "Add to Download List", placement: "right", children: /* @__PURE__ */ o(
|
|
55
55
|
y,
|
|
56
56
|
{
|
|
57
57
|
sx: { height: "35px", width: "35px" },
|
|
58
58
|
onClick: (t) => {
|
|
59
|
-
s({ entityId:
|
|
59
|
+
s({ entityId: i, entityVersionNumber: r }), t.stopPropagation();
|
|
60
60
|
},
|
|
61
61
|
children: /* @__PURE__ */ o(w, { icon: "download" })
|
|
62
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddToDownloadListCell.js","sources":["../../../../../../src/components/EntityFinder/details/view/table/AddToDownloadListCell.tsx"],"sourcesContent":["import useGetEntityBundle from '@/synapse-queries/entity/useEntityBundle'\nimport { useAddFileToDownloadList } from '@/synapse-queries/index'\nimport { useSynapseContext } from '@/utils/index'\nimport { Box, IconButton, Tooltip } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { CellContext } from '@tanstack/react-table'\nimport { EntityIdAndVersionNumber } from './TableCellTypes'\nimport { displayFilesWereAddedToDownloadListSuccess } from '../../../../download_list/DownloadConfirmationUtils'\nimport IconSvg from '../../../../IconSvg/IconSvg'\nimport { displayToast } from '../../../../ToastMessage/index'\n\nexport function AddFileToDownloadListCell<T extends EntityIdAndVersionNumber>(\n props: CellContext<T, unknown>,\n) {\n const { row } = props\n const { entityId, versionNumber } = row.original\n const { data: bundle } = useGetEntityBundle(entityId, versionNumber)\n\n const { downloadCartPageUrl } = useSynapseContext()\n\n const { mutate: addToDownloadList } = useAddFileToDownloadList({\n onSuccess: () => {\n displayFilesWereAddedToDownloadListSuccess(downloadCartPageUrl)\n },\n onError: error => {\n displayToast(error.reason, 'danger')\n },\n })\n if (\n !(\n bundle?.entityType == EntityType.file ||\n bundle?.entityType == EntityType.recordset\n )\n ) {\n return <></>\n }\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n }}\n >\n <Tooltip title=\"Add to Download
|
|
1
|
+
{"version":3,"file":"AddToDownloadListCell.js","sources":["../../../../../../src/components/EntityFinder/details/view/table/AddToDownloadListCell.tsx"],"sourcesContent":["import useGetEntityBundle from '@/synapse-queries/entity/useEntityBundle'\nimport { useAddFileToDownloadList } from '@/synapse-queries/index'\nimport { useSynapseContext } from '@/utils/index'\nimport { Box, IconButton, Tooltip } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { CellContext } from '@tanstack/react-table'\nimport { EntityIdAndVersionNumber } from './TableCellTypes'\nimport { displayFilesWereAddedToDownloadListSuccess } from '../../../../download_list/DownloadConfirmationUtils'\nimport IconSvg from '../../../../IconSvg/IconSvg'\nimport { displayToast } from '../../../../ToastMessage/index'\n\nexport function AddFileToDownloadListCell<T extends EntityIdAndVersionNumber>(\n props: CellContext<T, unknown>,\n) {\n const { row } = props\n const { entityId, versionNumber } = row.original\n const { data: bundle } = useGetEntityBundle(entityId, versionNumber)\n\n const { downloadCartPageUrl } = useSynapseContext()\n\n const { mutate: addToDownloadList } = useAddFileToDownloadList({\n onSuccess: () => {\n displayFilesWereAddedToDownloadListSuccess(downloadCartPageUrl)\n },\n onError: error => {\n displayToast(error.reason, 'danger')\n },\n })\n if (\n !(\n bundle?.entityType == EntityType.file ||\n bundle?.entityType == EntityType.recordset\n )\n ) {\n return <></>\n }\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n }}\n >\n <Tooltip title=\"Add to Download List\" placement=\"right\">\n <IconButton\n sx={{ height: '35px', width: '35px' }}\n onClick={event => {\n addToDownloadList({ entityId, entityVersionNumber: versionNumber })\n event.stopPropagation()\n }}\n >\n <IconSvg icon=\"download\" />\n </IconButton>\n </Tooltip>\n </Box>\n )\n}\n"],"names":["AddFileToDownloadListCell","props","row","entityId","versionNumber","bundle","useGetEntityBundle","downloadCartPageUrl","useSynapseContext","addToDownloadList","useAddFileToDownloadList","displayFilesWereAddedToDownloadListSuccess","error","displayToast","EntityType","jsx","Box","Tooltip","IconButton","event","IconSvg","Fragment"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,SAASA,GACdC,GACA;AACA,QAAM,EAAE,KAAAC,MAAQD,GACV,EAAE,UAAAE,GAAU,eAAAC,EAAA,IAAkBF,EAAI,UAClC,EAAE,MAAMG,EAAA,IAAWC,EAAmBH,GAAUC,CAAa,GAE7D,EAAE,qBAAAG,EAAA,IAAwBC,EAAA,GAE1B,EAAE,QAAQC,EAAA,IAAsBC,EAAyB;AAAA,IAC7D,WAAW,MAAM;AACf,MAAAC,EAA2CJ,CAAmB;AAAA,IAChE;AAAA,IACA,SAAS,CAAAK,MAAS;AAChB,MAAAC,EAAaD,EAAM,QAAQ,QAAQ;AAAA,IACrC;AAAA,EAAA,CACD;AACD,SAEIP,GAAQ,cAAcS,EAAW,QACjCT,GAAQ,cAAcS,EAAW,YAMnC,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,QAAQ;AAAA,MAAA;AAAA,MAGV,UAAA,gBAAAD,EAACE,GAAA,EAAQ,OAAM,wBAAuB,WAAU,SAC9C,UAAA,gBAAAF;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,IAAI,EAAE,QAAQ,QAAQ,OAAO,OAAA;AAAA,UAC7B,SAAS,CAAAC,MAAS;AAChB,YAAAV,EAAkB,EAAE,UAAAN,GAAU,qBAAqBC,EAAA,CAAe,GAClEe,EAAM,gBAAA;AAAA,UACR;AAAA,UAEA,UAAA,gBAAAJ,EAACK,GAAA,EAAQ,MAAK,WAAA,CAAW;AAAA,QAAA;AAAA,MAAA,EAC3B,CACF;AAAA,IAAA;AAAA,EAAA,IArBK,gBAAAL,EAAAM,GAAA,EAAE;AAwBb;"}
|
|
@@ -37,11 +37,14 @@ import "@mui/material/SvgIcon";
|
|
|
37
37
|
import "../../assets/icons/AccessPending.svg.js";
|
|
38
38
|
import "../../assets/icons/AccessPendingCloud.svg.js";
|
|
39
39
|
import "../../assets/icons/FileWithShield.svg.js";
|
|
40
|
+
import "../../assets/icons/MultiFile.svg.js";
|
|
41
|
+
import "../../assets/icons/UnpackagableFile.svg.js";
|
|
40
42
|
import "../../assets/icons/bioChemicalPhysical.svg.js";
|
|
41
43
|
import "../../assets/icons/computationalTool.svg.js";
|
|
42
44
|
import "../../assets/icons/dataReuse.svg.js";
|
|
43
45
|
import "../../assets/icons/inSilicoModel.svg.js";
|
|
44
46
|
import "../../assets/icons/modelSystem.svg.js";
|
|
47
|
+
import "../../assets/mui_components/PackagableFile.svg.js";
|
|
45
48
|
import "../../assets/icons/spatialProfiling.svg.js";
|
|
46
49
|
import "@mui/icons-material";
|
|
47
50
|
import "../../assets/icons/chart2.svg.js";
|
|
@@ -57,6 +60,7 @@ import "../../assets/icons/study-complete.svg.js";
|
|
|
57
60
|
import "../../assets/icons/translational.svg.js";
|
|
58
61
|
import "../../assets/icons/tree_horizontal.svg.js";
|
|
59
62
|
import "../../assets/icons/standardDataModel.svg.js";
|
|
63
|
+
import "../../assets/icons/Challenge.svg.js";
|
|
60
64
|
import K from "../ShowMore/ShowMore.js";
|
|
61
65
|
import "@mui/material/Skeleton";
|
|
62
66
|
import { SkeletonTable as Z } from "../Skeleton/SkeletonTable.js";
|
|
@@ -233,7 +237,7 @@ function rt(a) {
|
|
|
233
237
|
) }, r))
|
|
234
238
|
] });
|
|
235
239
|
}
|
|
236
|
-
function
|
|
240
|
+
function Tr(a) {
|
|
237
241
|
return /* @__PURE__ */ t(
|
|
238
242
|
H,
|
|
239
243
|
{
|
|
@@ -243,6 +247,6 @@ function yr(a) {
|
|
|
243
247
|
);
|
|
244
248
|
}
|
|
245
249
|
export {
|
|
246
|
-
|
|
250
|
+
Tr as default
|
|
247
251
|
};
|
|
248
252
|
//# sourceMappingURL=FacetPlotsCard.js.map
|