synapse-react-client 4.0.10 → 4.0.12

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.
Files changed (210) hide show
  1. package/dist/SWC.index.d.ts +1 -1
  2. package/dist/SWC.index.js +1 -1
  3. package/dist/assets/icons/CloudWarning.d.ts +5 -0
  4. package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
  5. package/dist/assets/icons/CloudWarning.js +47 -0
  6. package/dist/assets/icons/CloudWarning.js.map +1 -0
  7. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.d.ts +44 -0
  8. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.d.ts.map +1 -0
  9. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.js +46 -0
  10. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.js.map +1 -0
  11. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.d.ts.map +1 -1
  12. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
  13. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  14. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  15. package/dist/components/DataGrid/columns/AutocompleteColumn.js +66 -55
  16. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  17. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
  18. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +1 -1
  19. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
  20. package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
  21. package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
  22. package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
  23. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  24. package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
  25. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  26. package/dist/components/DataGrid/utils/columnFactory.js +47 -44
  27. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  28. package/dist/components/DataGrid/utils/getEmptyValue.d.ts +2 -0
  29. package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
  30. package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
  31. package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
  32. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
  33. package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
  34. package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
  35. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts +32 -0
  36. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
  37. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
  38. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
  39. package/dist/components/DownloadCart/DownloadCartPage.d.ts.map +1 -1
  40. package/dist/components/DownloadCart/DownloadCartPage.js +183 -185
  41. package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
  42. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.css +1 -0
  43. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
  44. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
  45. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  46. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
  47. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
  48. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
  49. package/dist/components/EntityAclEditor/EntityAclEditor.js +8 -8
  50. package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
  51. package/dist/components/EntityAclEditor/InheritanceMessage.d.ts.map +1 -1
  52. package/dist/components/EntityAclEditor/InheritanceMessage.js +1 -2
  53. package/dist/components/EntityAclEditor/InheritanceMessage.js.map +1 -1
  54. package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
  55. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
  56. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  57. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
  58. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
  59. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
  60. package/dist/components/Forum/DiscussionReply.d.ts +1 -0
  61. package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
  62. package/dist/components/Forum/DiscussionReply.js +19 -19
  63. package/dist/components/Forum/DiscussionReply.js.map +1 -1
  64. package/dist/components/Forum/DiscussionThread.d.ts +1 -0
  65. package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
  66. package/dist/components/Forum/DiscussionThread.js +73 -72
  67. package/dist/components/Forum/DiscussionThread.js.map +1 -1
  68. package/dist/components/FullTextSearch/FullTextSearch.d.ts.map +1 -1
  69. package/dist/components/FullTextSearch/FullTextSearch.js +86 -47
  70. package/dist/components/FullTextSearch/FullTextSearch.js.map +1 -1
  71. package/dist/components/GenericCard/BioregistryRules.d.ts.map +1 -1
  72. package/dist/components/GenericCard/BioregistryRules.js +7 -3
  73. package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
  74. package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
  75. package/dist/components/GenericCard/TableRowGenericCard.js +157 -157
  76. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  77. package/dist/components/HeaderCard.d.ts.map +1 -1
  78. package/dist/components/HeaderCard.js +131 -130
  79. package/dist/components/HeaderCard.js.map +1 -1
  80. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  81. package/dist/components/IconSvg/IconSvg.js +2 -1
  82. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  83. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts +4 -1
  84. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts.map +1 -1
  85. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js +3 -2
  86. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js.map +1 -1
  87. package/dist/components/QueryContext/QueryContext.d.ts +6 -0
  88. package/dist/components/QueryContext/QueryContext.d.ts.map +1 -1
  89. package/dist/components/QueryContext/QueryContext.js.map +1 -1
  90. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
  91. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +12 -11
  92. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  93. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +5 -0
  94. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  95. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +32 -29
  96. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  97. package/dist/components/QueryWrapperPlotNav/UseRowSet.d.ts.map +1 -1
  98. package/dist/components/QueryWrapperPlotNav/UseRowSet.js +4 -1
  99. package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
  100. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +59 -0
  101. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -0
  102. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +174 -0
  103. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -0
  104. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts +40 -0
  105. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts.map +1 -0
  106. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js +100 -0
  107. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js.map +1 -0
  108. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +56 -0
  109. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -0
  110. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +73 -0
  111. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -0
  112. package/dist/components/ShareThisPage/ShareThisPage.js +1 -1
  113. package/dist/components/ShareThisPage/ShareThisPage.js.map +1 -1
  114. package/dist/components/SynapseChat/GridAgentChat.d.ts.map +1 -1
  115. package/dist/components/SynapseChat/GridAgentChat.js +20 -14
  116. package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
  117. package/dist/components/SynapseChat/SynapseChat.d.ts +3 -1
  118. package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
  119. package/dist/components/SynapseChat/SynapseChat.js +51 -36
  120. package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
  121. package/dist/components/SynapseHomepageV2/HotdropsAndNews.css +1 -1
  122. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js +8 -7
  123. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js.map +1 -1
  124. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.scss +16 -0
  125. package/dist/components/SynapseHomepageV2/WordPressNews.d.ts +3 -1
  126. package/dist/components/SynapseHomepageV2/WordPressNews.d.ts.map +1 -1
  127. package/dist/components/SynapseHomepageV2/WordPressNews.js +9 -8
  128. package/dist/components/SynapseHomepageV2/WordPressNews.js.map +1 -1
  129. package/dist/components/SynapseHomepageV2/WordPressNewsItem.d.ts +2 -1
  130. package/dist/components/SynapseHomepageV2/WordPressNewsItem.d.ts.map +1 -1
  131. package/dist/components/SynapseHomepageV2/WordPressNewsItem.js +2 -2
  132. package/dist/components/SynapseHomepageV2/WordPressNewsItem.js.map +1 -1
  133. package/dist/components/SynapseTable/SearchV2.d.ts +7 -0
  134. package/dist/components/SynapseTable/SearchV2.d.ts.map +1 -1
  135. package/dist/components/SynapseTable/SearchV2.js.map +1 -1
  136. package/dist/components/SynapseTable/SynapseTableRenderers.d.ts.map +1 -1
  137. package/dist/components/SynapseTable/SynapseTableRenderers.js +1 -1
  138. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  139. package/dist/components/SynapseTable/usePrefetchTableData.d.ts.map +1 -1
  140. package/dist/components/SynapseTable/usePrefetchTableData.js +6 -5
  141. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  142. package/dist/components/ToastMessage/ToastMessage.d.ts +1 -1
  143. package/dist/components/ToastMessage/ToastMessage.d.ts.map +1 -1
  144. package/dist/components/ToastMessage/ToastMessage.js +2 -2
  145. package/dist/components/ToastMessage/ToastMessage.js.map +1 -1
  146. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
  147. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
  148. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  149. package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
  150. package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
  151. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  152. package/dist/components/error/ErrorPage.d.ts +0 -4
  153. package/dist/components/error/ErrorPage.d.ts.map +1 -1
  154. package/dist/components/error/ErrorPage.js +25 -30
  155. package/dist/components/error/ErrorPage.js.map +1 -1
  156. package/dist/components/index.d.ts +4 -0
  157. package/dist/components/index.d.ts.map +1 -1
  158. package/dist/components/index.js +41 -39
  159. package/dist/components/widgets/query-filter/FacetFilterControls.d.ts.map +1 -1
  160. package/dist/components/widgets/query-filter/FacetFilterControls.js +2 -2
  161. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  162. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
  163. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
  164. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  165. package/dist/index.js +52 -50
  166. package/dist/index.js.map +1 -1
  167. package/dist/mocks/entity/index.d.ts.map +1 -1
  168. package/dist/mocks/entity/index.js +18 -16
  169. package/dist/mocks/entity/index.js.map +1 -1
  170. package/dist/mocks/mockSearchQueryData.d.ts +14 -0
  171. package/dist/mocks/mockSearchQueryData.d.ts.map +1 -0
  172. package/dist/mocks/mockSearchQueryData.js +564 -0
  173. package/dist/mocks/mockSearchQueryData.js.map +1 -0
  174. package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts +22 -0
  175. package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts.map +1 -0
  176. package/dist/mocks/msw/handlers/searchQueryHandlers.js +63 -0
  177. package/dist/mocks/msw/handlers/searchQueryHandlers.js.map +1 -0
  178. package/dist/mocks/msw/handlers.d.ts.map +1 -1
  179. package/dist/mocks/msw/handlers.js +9 -7
  180. package/dist/mocks/msw/handlers.js.map +1 -1
  181. package/dist/style/components/_cards.scss +15 -0
  182. package/dist/style/main.css +1 -1
  183. package/dist/synapse-client/SynapseClient.d.ts +7 -1
  184. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  185. package/dist/synapse-client/SynapseClient.js +422 -417
  186. package/dist/synapse-client/SynapseClient.js.map +1 -1
  187. package/dist/synapse-client/index.js +3 -3
  188. package/dist/synapse-queries/KeyFactory.d.ts +3 -0
  189. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  190. package/dist/synapse-queries/KeyFactory.js +6 -0
  191. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  192. package/dist/synapse-queries/forum/useThread.d.ts +1 -0
  193. package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
  194. package/dist/synapse-queries/forum/useThread.js +19 -12
  195. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  196. package/dist/tsconfig.build.tsbuildinfo +1 -1
  197. package/dist/utils/APIConstants.d.ts +3 -0
  198. package/dist/utils/APIConstants.d.ts.map +1 -1
  199. package/dist/utils/APIConstants.js +2 -2
  200. package/dist/utils/APIConstants.js.map +1 -1
  201. package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
  202. package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
  203. package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
  204. package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
  205. package/dist/utils/functions/EntityTypeUtils.js +15 -4
  206. package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
  207. package/dist/utils/functions/calculateFriendlyFileSize.d.ts.map +1 -1
  208. package/dist/utils/functions/calculateFriendlyFileSize.js +3 -3
  209. package/dist/utils/functions/calculateFriendlyFileSize.js.map +1 -1
  210. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"DownloadCartPage.js","names":[],"sources":["../../../src/components/DownloadCart/DownloadCartPage.tsx"],"sourcesContent":["import styles from './DownloadCartPage.module.scss'\nimport SynapseClient from '@/synapse-client'\nimport { useGetDownloadListStatistics } from '@/synapse-queries/download/useDownloadList'\nimport { useGetFeatureFlag } from '@/synapse-queries/featureflags/useGetFeatureFlag'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { DeleteTwoTone } from '@mui/icons-material'\nimport { Button, Tooltip, Typography } from '@mui/material'\nimport {\n AvailableFilter,\n FeatureFlagEnum,\n FilesStatisticsResponse,\n} from '@sage-bionetworks/synapse-types'\nimport { useEffect, useRef, useState } from 'react'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport FullWidthAlert from '../FullWidthAlert/FullWidthAlert'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { ProgrammaticInstructionsModal } from '../ProgrammaticInstructionsModal/ProgrammaticInstructionsModal'\nimport AvailableForDownloadTable from './AvailableForDownloadTable'\nimport { CreatePackageV2 } from './CreatePackageV2'\nimport { PYTHON_CLIENT_IMPORT_AND_LOGIN } from './DirectProgrammaticDownload'\nimport { calculateFriendlyFileSize } from '@/utils/functions/calculateFriendlyFileSize'\nimport { DownloadIneligibleForPackagingFilesFromListButton } from './DownloadIneligibleForPackagingFilesFromListButton'\nimport {\n DownloadListActionsRequired,\n DownloadListActionsRequiredProps,\n} from './DownloadListActionsRequired'\nimport ComponentCollapse from '../ComponentCollapse'\n\nconst pythonDownloadCode = `${PYTHON_CLIENT_IMPORT_AND_LOGIN}\ndl_list_file_entities = syn.get_download_list()`\n\nconst cliDownloadCode = `synapse get-download-list`\n\nconst filterTabs: { label: string; filter: AvailableFilter }[] = [\n { label: 'All Files', filter: undefined },\n { label: 'Files included in ZIP', filter: 'eligibleForPackaging' },\n { label: 'Files not included in ZIP', filter: 'ineligibleForPackaging' },\n]\n\n/**\n * Show the Download Cart page.\n */\nexport function DownloadCartPage(props: DownloadListActionsRequiredProps) {\n const { accessToken } = useSynapseContext()\n const [selectedTabIndex, setSelectedTabIndex] = useState<number>(0)\n const [selectedFilterTabIndex, setSelectedFilterTabIndex] =\n useState<number>(0)\n const selectedFilter = filterTabs[selectedFilterTabIndex].filter\n const [isShowingCreatePackageUI, setIsShowingCreatePackageUI] =\n useState<boolean>(false)\n const createPackageRef = useRef<HTMLDivElement>(null)\n // scroll to the CreatePackageV2 component when it is shown so that the user is aware of the next steps after clicking the button to create a package\n useEffect(() => {\n if (isShowingCreatePackageUI) {\n createPackageRef.current?.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n })\n }\n }, [isShowingCreatePackageUI])\n const [isShowingModal, setIsShowingModal] = useState<boolean>(false)\n const [isShowingDownloadSuccessAlert, setIsShowingDownloadSuccessAlert] =\n useState(false)\n const [error, setError] = useState<Error>()\n const isDownloadAllEnabled = useGetFeatureFlag(\n FeatureFlagEnum.DOWNLOAD_CART_INELIGIBLE_FILE_DOWNLOADS,\n )\n const {\n data,\n isLoading,\n isError,\n error: newError,\n refetch,\n } = useGetDownloadListStatistics()\n useEffect(() => {\n if (isError && newError) {\n setError(newError)\n }\n }, [isError, newError])\n\n const getFilterCount = (\n data: FilesStatisticsResponse,\n filter: AvailableFilter,\n ) => {\n if (filter === undefined) return data.numberOfFilesAvailableForDownload\n if (filter === 'eligibleForPackaging')\n return data.numberOfFilesAvailableForDownloadAndEligibleForPackaging\n return (\n data.numberOfFilesAvailableForDownload -\n data.numberOfFilesAvailableForDownloadAndEligibleForPackaging\n )\n }\n // SWC-5874: When arriving at the download cart when there are no ARs, the user should start in the Download list\n useEffect(() => {\n if (data && data.numberOfFilesRequiringAction == 0) {\n setSelectedTabIndex(1)\n }\n // also hide the Create Package UI if there are no files available for download\n if (\n data &&\n data.numberOfFilesAvailableForDownloadAndEligibleForPackaging === 0\n ) {\n setIsShowingCreatePackageUI(false)\n }\n }, [data])\n\n if (error) {\n return <ErrorBanner error={error} />\n }\n const clearDownloadList = async () => {\n await SynapseClient.clearDownloadListV2(accessToken)\n refetch()\n }\n return (\n <div className={styles.DownloadCartPage}>\n <div>\n <div className={`${styles.pageHeader}`}>\n <div className=\"container\">\n <div className={styles.grid}>\n <h3 className=\"pageHeaderTitle\">Your Download List</h3>\n <Tooltip\n title=\"Immediately removes all items from your download list\"\n enterNextDelay={300}\n placement=\"right\"\n >\n <Button\n onClick={() => {\n clearDownloadList()\n }}\n variant=\"text\"\n color=\"primary\"\n startIcon={<DeleteTwoTone />}\n >\n Clear Your Download List\n </Button>\n </Tooltip>\n </div>\n </div>\n </div>\n </div>\n <div className={styles.tabsContainer}>\n <div className=\"container\">\n <ul className={styles.navTabs}>\n <li\n className={`${styles.navItem}${\n selectedTabIndex == 0 ? ` ${styles.active}` : ''\n }`}\n aria-selected={selectedTabIndex == 0}\n >\n <button onClick={() => setSelectedTabIndex(0)}>\n Access Actions Required\n {!isError && !isLoading && data && (\n <span className={styles.fileCount}>\n {data.totalNumberOfFiles -\n data.numberOfFilesAvailableForDownload}\n </span>\n )}\n </button>\n </li>\n <li\n className={`${styles.navItem}${\n selectedTabIndex == 1 ? ` ${styles.active}` : ''\n }`}\n aria-selected={selectedTabIndex == 1}\n >\n <button onClick={() => setSelectedTabIndex(1)}>\n Download List\n {!isError && !isLoading && data && (\n <span className={styles.fileCount}>\n {data.numberOfFilesAvailableForDownload}\n </span>\n )}\n </button>\n </li>\n </ul>\n </div>\n </div>\n\n <div\n className={\n /*\n The DownloadListActionsRequired component stores actions in local state to track which actions are completed.\n\n Mount the actions required component and hide it with style to ensure actions stored in component state are persisted as the user switches tabs\n */\n !(selectedTabIndex == 0 && !isError && !isLoading && data)\n ? styles.hidden\n : undefined\n }\n >\n {data?.numberOfFilesRequiringAction &&\n data.numberOfFilesRequiringAction > 0 && (\n // Unmount instead of hiding the DownloadListActionsRequired component when there are 0 actions required\n // The DownloadListActionsRequired cannot discern between a fulfilled action and an action that is no longer required because the\n // file was removed from the download cart.\n // In the typical case where the download cart is cleared, unmounting the component ensures that the actions are cleared out.\n <div>\n <div className=\"container\">\n <DownloadListActionsRequired {...props} />\n </div>\n </div>\n )}\n {data?.numberOfFilesRequiringAction === 0 && (\n <div className={styles.placeholder}>\n <div>No actions are currently required.</div>\n </div>\n )}\n </div>\n\n {selectedTabIndex == 1 && !isError && !isLoading && data && (\n <div>\n {data.numberOfFilesAvailableForDownload > 0 && (\n <div className={`container ${styles.DownloadListTabContent}`}>\n <h3 className={`${styles.sectionTitle} pageHeaderTitle`}>\n Bulk Download Options\n {data.sumOfFileSizesAvailableForDownload != null && (\n <Tooltip\n placement=\"right\"\n title={\n <>\n Total file size\n <br />\n Does not include files hosted outside Synapse\n </>\n }\n slotProps={{ tooltip: { sx: { maxWidth: 400 } } }}\n >\n <span className={styles.totalFileSize}>\n {calculateFriendlyFileSize(\n data.sumOfFileSizesAvailableForDownload,\n )}{' '}\n total*\n </span>\n </Tooltip>\n )}\n </h3>\n <div>\n <div className={styles.subSectionOverview}>\n <div className={styles.subSection}>\n <div className={styles.subSectionHeader}>\n <div className={styles.headline}>\n <Typography variant={'headline3'}>\n <IconSvg icon=\"packagableFile\" /> Web Download (.ZIP)\n </Typography>\n </div>\n <div className={styles.subSectionActions}>\n {data.numberOfFilesAvailableForDownloadAndEligibleForPackaging >\n 0 && (\n <Button\n variant=\"contained\"\n onClick={() => {\n setIsShowingCreatePackageUI(true)\n }}\n startIcon={<IconSvg icon=\"download\" wrap={false} />}\n >\n Download Packages\n </Button>\n )}\n {data.numberOfFilesAvailableForDownloadAndEligibleForPackaging ==\n 0 && (\n <Tooltip\n title=\"You cannot create a .zip package because there are no eligible files.\"\n enterNextDelay={300}\n placement=\"top\"\n >\n <span>\n <Button\n variant=\"contained\"\n disabled\n startIcon={\n <IconSvg icon=\"download\" wrap={false} />\n }\n >\n Download Packages\n </Button>\n </span>\n </Tooltip>\n )}\n </div>\n </div>\n <ComponentCollapse\n component={\n <Typography variant={'body1'} component={'div'}>\n Only some files may be eligible for packaging as ZIP.\n Use the Individual Downloads tab, below, to download\n non-packageable files.&nbsp;\n <a\n href=\"https://help.synapse.org/docs/Downloading-Data-From-the-Synapse-UI.2004254837.html\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n More Information.\n </a>\n </Typography>\n }\n collapseBoxSx={{\n backgroundColor: 'transparent',\n p: 0,\n mt: '15px',\n }}\n componentContainerSx={{\n backgroundColor: 'transparent',\n p: 0,\n }}\n iconSx={{ width: '25px', height: '25px' }}\n >\n <Typography\n variant={'body1'}\n component={'div'}\n sx={{ marginBottom: '15px' }}\n >\n <ul>\n <li>Files are bundled into .ZIPs up to 1 GB each.</li>\n <li>\n Larger selections are split into multiple packages.\n </li>\n <li>\n Includes only files stored in Synapse native\n storage.\n </li>\n <li>\n Each package contains a CSV manifest with file\n annotations and metadata.\n </li>\n </ul>\n </Typography>\n </ComponentCollapse>\n </div>\n <div className={styles.subSection}>\n <div className={styles.subSectionHeader}>\n <div className={styles.headline}>\n <Typography variant={'headline3'}>\n <IconSvg icon=\"code\" /> Programmatic Download\n </Typography>\n </div>\n <div className={styles.subSectionActions}>\n <Button\n variant=\"contained\"\n onClick={() => {\n setIsShowingModal(true)\n }}\n startIcon={<IconSvg icon=\"download\" wrap={false} />}\n >\n Get R / Python / CLI Code\n </Button>\n </div>\n </div>\n <ComponentCollapse\n component={\n <Typography variant={'body1'} component={'div'}>\n Use our Python, R, or command line clients to download\n files quickly.&nbsp;\n <a\n href=\"https://help.synapse.org/docs/Downloading-Data-Programmatically.2003796248.html\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n More Information.\n </a>\n </Typography>\n }\n collapseBoxSx={{\n backgroundColor: 'transparent',\n p: 0,\n mt: '15px',\n }}\n componentContainerSx={{\n backgroundColor: 'transparent',\n p: 0,\n }}\n iconSx={{ width: '25px', height: '25px' }}\n >\n <Typography\n variant={'body1'}\n component={'div'}\n sx={{ marginBottom: '15px' }}\n >\n <ul>\n <li>Requires a client (R, Python, or CLI).</li>\n <li>\n No limits on individual file size or total download\n size.\n </li>\n <li>\n Includes files stored both on and off Synapse native\n storage.\n </li>\n <li>\n Downloads include a CSV manifest with file\n annotations and metadata.\n </li>\n </ul>\n </Typography>\n </ComponentCollapse>\n </div>\n {isDownloadAllEnabled &&\n data.numberOfFilesAvailableForDownloadAndEligibleForPackaging <\n data.numberOfFilesAvailableForDownload && (\n <div className={styles.subSection}>\n <div className={styles.subSectionHeader}>\n <div className={styles.headline}>\n <Typography variant={'headline3'}>\n <IconSvg icon=\"multiFile\" /> Multi-file Download\n </Typography>\n </div>\n <div className={styles.subSectionActions}>\n <div className={styles.ineligibleDownloadContainer}>\n <DownloadIneligibleForPackagingFilesFromListButton />\n </div>\n </div>\n </div>\n <ComponentCollapse\n component={\n <Typography variant={'body1'} component={'div'}>\n Files which <strong>aren't</strong> included in a\n ZIP package may be downloaded as a multi-file\n download.&nbsp;\n </Typography>\n }\n collapseBoxSx={{\n backgroundColor: 'transparent',\n p: 0,\n mt: '15px',\n }}\n componentContainerSx={{\n backgroundColor: 'transparent',\n p: 0,\n }}\n iconSx={{ width: '25px', height: '25px' }}\n >\n <Typography\n variant={'body1'}\n component={'div'}\n sx={{ marginBottom: '15px' }}\n >\n Clicking “Start Multi-file Download” initiates a\n download of all files in your Download List that\n can’t be bundled into a ZIP—such as large files or\n external links—in one step. Files are saved one by\n one with clear progress updates, automatic handling\n of duplicate names, and retry support if something\n fails. You can cancel anytime.\n <br />\n <br />\n Note: in some browsers, files download individually\n to your default Downloads folder instead of a\n selected location.\n </Typography>\n </ComponentCollapse>\n </div>\n )}\n </div>\n </div>\n\n <div>\n {isShowingCreatePackageUI && (\n <div ref={createPackageRef}>\n <CreatePackageV2\n onPackageCreation={() => {\n setIsShowingDownloadSuccessAlert(true)\n }}\n />\n </div>\n )}\n <h3 className={`${styles.sectionTitle} pageHeaderTitle`}>\n Download Individual Files\n </h3>\n <div className={styles.tabsContainer}>\n <ul className={styles.navTabs}>\n <li className={styles.navLabel}>View:</li>\n {filterTabs.map((tab, index) => (\n <li\n key={tab.label}\n className={`${styles.navItem}${\n selectedFilterTabIndex === index\n ? ` ${styles.active}`\n : ''\n }`}\n aria-selected={selectedFilterTabIndex === index}\n >\n <button\n onClick={() => setSelectedFilterTabIndex(index)}\n >\n {tab.label}\n {!isError && !isLoading && data && (\n <span className={styles.fileCount}>\n {getFilterCount(data, tab.filter)}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n </div>\n\n <div className={styles.availableForDownloadTableContainer}>\n <AvailableForDownloadTable\n key={selectedFilter ?? 'all'}\n filter={selectedFilter}\n />\n </div>\n </div>\n </div>\n )}\n {data.numberOfFilesAvailableForDownload === 0 && (\n <div className={styles.placeholder}>\n <Typography variant=\"body1Italic\">\n Your Download List is currently empty.\n </Typography>\n </div>\n )}\n </div>\n )}\n <FullWidthAlert\n show={isShowingDownloadSuccessAlert}\n variant=\"success\"\n title=\"Package Created\"\n description=\"A package has been created with eligible files. The items contained in this .zip file have been removed from your list. If your package is over 1GB, you will need to create multiple packages.\"\n autoCloseAfterDelayInSeconds={10}\n onClose={() => {\n setIsShowingDownloadSuccessAlert(false)\n }}\n />\n {isShowingModal && (\n <ProgrammaticInstructionsModal\n show={true}\n onClose={() => setIsShowingModal(false)}\n title=\"Download Programmatically\"\n pythonCode={pythonDownloadCode}\n cliCode={cliDownloadCode}\n // rCode={rDownloadCode}\n />\n )}\n </div>\n )\n}\n\nexport default DownloadCartPage\n"],"mappings":"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"}
1
+ {"version":3,"file":"DownloadCartPage.js","names":[],"sources":["../../../src/components/DownloadCart/DownloadCartPage.tsx"],"sourcesContent":["import styles from './DownloadCartPage.module.scss'\nimport SynapseClient from '@/synapse-client'\nimport { useGetDownloadListStatistics } from '@/synapse-queries/download/useDownloadList'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { DeleteTwoTone } from '@mui/icons-material'\nimport { Button, Tooltip, Typography } from '@mui/material'\nimport {\n AvailableFilter,\n FilesStatisticsResponse,\n} from '@sage-bionetworks/synapse-types'\nimport { useEffect, useRef, useState } from 'react'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport FullWidthAlert from '../FullWidthAlert/FullWidthAlert'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { ProgrammaticInstructionsModal } from '../ProgrammaticInstructionsModal/ProgrammaticInstructionsModal'\nimport AvailableForDownloadTable from './AvailableForDownloadTable'\nimport { CreatePackageV2 } from './CreatePackageV2'\nimport { PYTHON_CLIENT_IMPORT_AND_LOGIN } from './DirectProgrammaticDownload'\nimport { calculateFriendlyFileSize } from '@/utils/functions/calculateFriendlyFileSize'\nimport { DownloadIneligibleForPackagingFilesFromListButton } from './DownloadIneligibleForPackagingFilesFromListButton'\nimport {\n DownloadListActionsRequired,\n DownloadListActionsRequiredProps,\n} from './DownloadListActionsRequired'\nimport ComponentCollapse from '../ComponentCollapse'\n\nconst pythonDownloadCode = `${PYTHON_CLIENT_IMPORT_AND_LOGIN}\ndl_list_file_entities = syn.get_download_list()`\n\nconst cliDownloadCode = `synapse get-download-list`\n\nconst filterTabs: { label: string; filter: AvailableFilter }[] = [\n { label: 'All Files', filter: undefined },\n { label: 'Files included in ZIP', filter: 'eligibleForPackaging' },\n { label: 'Files not included in ZIP', filter: 'ineligibleForPackaging' },\n]\n\n/**\n * Show the Download Cart page.\n */\nexport function DownloadCartPage(props: DownloadListActionsRequiredProps) {\n const { accessToken } = useSynapseContext()\n const [selectedTabIndex, setSelectedTabIndex] = useState<number>(0)\n const [selectedFilterTabIndex, setSelectedFilterTabIndex] =\n useState<number>(0)\n const selectedFilter = filterTabs[selectedFilterTabIndex].filter\n const [isShowingCreatePackageUI, setIsShowingCreatePackageUI] =\n useState<boolean>(false)\n const createPackageRef = useRef<HTMLDivElement>(null)\n // scroll to the CreatePackageV2 component when it is shown so that the user is aware of the next steps after clicking the button to create a package\n useEffect(() => {\n if (isShowingCreatePackageUI) {\n createPackageRef.current?.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n })\n }\n }, [isShowingCreatePackageUI])\n const [isShowingModal, setIsShowingModal] = useState<boolean>(false)\n const [isShowingDownloadSuccessAlert, setIsShowingDownloadSuccessAlert] =\n useState(false)\n const [error, setError] = useState<Error>()\n const {\n data,\n isLoading,\n isError,\n error: newError,\n refetch,\n } = useGetDownloadListStatistics()\n useEffect(() => {\n if (isError && newError) {\n setError(newError)\n }\n }, [isError, newError])\n\n const getFilterCount = (\n data: FilesStatisticsResponse,\n filter: AvailableFilter,\n ) => {\n if (filter === undefined) return data.numberOfFilesAvailableForDownload\n if (filter === 'eligibleForPackaging')\n return data.numberOfFilesAvailableForDownloadAndEligibleForPackaging\n return (\n data.numberOfFilesAvailableForDownload -\n data.numberOfFilesAvailableForDownloadAndEligibleForPackaging\n )\n }\n // SWC-5874: When arriving at the download cart when there are no ARs, the user should start in the Download list\n useEffect(() => {\n if (data && data.numberOfFilesRequiringAction == 0) {\n setSelectedTabIndex(1)\n }\n // also hide the Create Package UI if there are no files available for download\n if (\n data &&\n data.numberOfFilesAvailableForDownloadAndEligibleForPackaging === 0\n ) {\n setIsShowingCreatePackageUI(false)\n }\n }, [data])\n\n if (error) {\n return <ErrorBanner error={error} />\n }\n const clearDownloadList = async () => {\n await SynapseClient.clearDownloadListV2(accessToken)\n refetch()\n }\n return (\n <div className={styles.DownloadCartPage}>\n <div>\n <div className={`${styles.pageHeader}`}>\n <div className=\"container\">\n <div className={styles.grid}>\n <h3 className=\"pageHeaderTitle\">Your Download List</h3>\n <Tooltip\n title=\"Immediately removes all items from your download list\"\n enterNextDelay={300}\n placement=\"right\"\n >\n <Button\n onClick={() => {\n clearDownloadList()\n }}\n variant=\"text\"\n color=\"primary\"\n startIcon={<DeleteTwoTone />}\n >\n Clear Your Download List\n </Button>\n </Tooltip>\n </div>\n </div>\n </div>\n </div>\n <div className={styles.tabsContainer}>\n <div className=\"container\">\n <ul className={styles.navTabs}>\n <li\n className={`${styles.navItem}${\n selectedTabIndex == 0 ? ` ${styles.active}` : ''\n }`}\n aria-selected={selectedTabIndex == 0}\n >\n <button onClick={() => setSelectedTabIndex(0)}>\n Access Actions Required\n {!isError && !isLoading && data && (\n <span className={styles.fileCount}>\n {data.totalNumberOfFiles -\n data.numberOfFilesAvailableForDownload}\n </span>\n )}\n </button>\n </li>\n <li\n className={`${styles.navItem}${\n selectedTabIndex == 1 ? ` ${styles.active}` : ''\n }`}\n aria-selected={selectedTabIndex == 1}\n >\n <button onClick={() => setSelectedTabIndex(1)}>\n Download List\n {!isError && !isLoading && data && (\n <span className={styles.fileCount}>\n {data.numberOfFilesAvailableForDownload}\n </span>\n )}\n </button>\n </li>\n </ul>\n </div>\n </div>\n\n <div\n className={\n /*\n The DownloadListActionsRequired component stores actions in local state to track which actions are completed.\n\n Mount the actions required component and hide it with style to ensure actions stored in component state are persisted as the user switches tabs\n */\n !(selectedTabIndex == 0 && !isError && !isLoading && data)\n ? styles.hidden\n : undefined\n }\n >\n {data?.numberOfFilesRequiringAction &&\n data.numberOfFilesRequiringAction > 0 && (\n // Unmount instead of hiding the DownloadListActionsRequired component when there are 0 actions required\n // The DownloadListActionsRequired cannot discern between a fulfilled action and an action that is no longer required because the\n // file was removed from the download cart.\n // In the typical case where the download cart is cleared, unmounting the component ensures that the actions are cleared out.\n <div>\n <div className=\"container\">\n <DownloadListActionsRequired {...props} />\n </div>\n </div>\n )}\n {data?.numberOfFilesRequiringAction === 0 && (\n <div className={styles.placeholder}>\n <div>No actions are currently required.</div>\n </div>\n )}\n </div>\n\n {selectedTabIndex == 1 && !isError && !isLoading && data && (\n <div>\n {data.numberOfFilesAvailableForDownload > 0 && (\n <div className={`container ${styles.DownloadListTabContent}`}>\n <h3 className={`${styles.sectionTitle} pageHeaderTitle`}>\n Bulk Download Options\n {data.sumOfFileSizesAvailableForDownload != null && (\n <Tooltip\n placement=\"right\"\n title={\n <>\n Total file size\n <br />\n Does not include files hosted outside Synapse\n </>\n }\n slotProps={{ tooltip: { sx: { maxWidth: 400 } } }}\n >\n <span className={styles.totalFileSize}>\n {calculateFriendlyFileSize(\n data.sumOfFileSizesAvailableForDownload,\n )}{' '}\n total*\n </span>\n </Tooltip>\n )}\n </h3>\n <div>\n <div className={styles.subSectionOverview}>\n <div className={styles.subSection}>\n <div className={styles.subSectionHeader}>\n <div className={styles.headline}>\n <Typography variant={'headline3'}>\n <IconSvg icon=\"packagableFile\" /> Web Download (.ZIP)\n </Typography>\n </div>\n <div className={styles.subSectionActions}>\n {data.numberOfFilesAvailableForDownloadAndEligibleForPackaging >\n 0 && (\n <Button\n variant=\"contained\"\n onClick={() => {\n setIsShowingCreatePackageUI(true)\n }}\n startIcon={<IconSvg icon=\"download\" wrap={false} />}\n >\n Download Packages\n </Button>\n )}\n {data.numberOfFilesAvailableForDownloadAndEligibleForPackaging ==\n 0 && (\n <Tooltip\n title=\"You cannot create a .zip package because there are no eligible files.\"\n enterNextDelay={300}\n placement=\"top\"\n >\n <span>\n <Button\n variant=\"contained\"\n disabled\n startIcon={\n <IconSvg icon=\"download\" wrap={false} />\n }\n >\n Download Packages\n </Button>\n </span>\n </Tooltip>\n )}\n </div>\n </div>\n <ComponentCollapse\n component={\n <Typography variant={'body1'} component={'div'}>\n Only some files may be eligible for packaging as ZIP.\n Use the Individual Downloads tab, below, to download\n non-packageable files.&nbsp;\n <a\n href=\"https://help.synapse.org/docs/Downloading-Data-From-the-Synapse-UI.2004254837.html\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n More Information.\n </a>\n </Typography>\n }\n collapseBoxSx={{\n backgroundColor: 'transparent',\n p: 0,\n mt: '15px',\n }}\n componentContainerSx={{\n backgroundColor: 'transparent',\n p: 0,\n }}\n iconSx={{ width: '25px', height: '25px' }}\n >\n <Typography\n variant={'body1'}\n component={'div'}\n sx={{ marginBottom: '15px' }}\n >\n <ul>\n <li>Files are bundled into .ZIPs up to 1 GB each.</li>\n <li>\n Larger selections are split into multiple packages.\n </li>\n <li>\n Includes only files stored in Synapse native\n storage.\n </li>\n <li>\n Each package contains a CSV manifest with file\n annotations and metadata.\n </li>\n </ul>\n </Typography>\n </ComponentCollapse>\n </div>\n <div className={styles.subSection}>\n <div className={styles.subSectionHeader}>\n <div className={styles.headline}>\n <Typography variant={'headline3'}>\n <IconSvg icon=\"code\" /> Programmatic Download\n </Typography>\n </div>\n <div className={styles.subSectionActions}>\n <Button\n variant=\"contained\"\n onClick={() => {\n setIsShowingModal(true)\n }}\n startIcon={<IconSvg icon=\"download\" wrap={false} />}\n >\n Get R / Python / CLI Code\n </Button>\n </div>\n </div>\n <ComponentCollapse\n component={\n <Typography variant={'body1'} component={'div'}>\n Use our Python, R, or command line clients to download\n files quickly.&nbsp;\n <a\n href=\"https://help.synapse.org/docs/Downloading-Data-Programmatically.2003796248.html\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n More Information.\n </a>\n </Typography>\n }\n collapseBoxSx={{\n backgroundColor: 'transparent',\n p: 0,\n mt: '15px',\n }}\n componentContainerSx={{\n backgroundColor: 'transparent',\n p: 0,\n }}\n iconSx={{ width: '25px', height: '25px' }}\n >\n <Typography\n variant={'body1'}\n component={'div'}\n sx={{ marginBottom: '15px' }}\n >\n <ul>\n <li>Requires a client (R, Python, or CLI).</li>\n <li>\n No limits on individual file size or total download\n size.\n </li>\n <li>\n Includes files stored both on and off Synapse native\n storage.\n </li>\n <li>\n Downloads include a CSV manifest with file\n annotations and metadata.\n </li>\n </ul>\n </Typography>\n </ComponentCollapse>\n </div>\n {data.numberOfFilesAvailableForDownloadAndEligibleForPackaging <\n data.numberOfFilesAvailableForDownload && (\n <div className={styles.subSection}>\n <div className={styles.subSectionHeader}>\n <div className={styles.headline}>\n <Typography variant={'headline3'}>\n <IconSvg icon=\"multiFile\" /> Multi-file Download\n </Typography>\n </div>\n <div className={styles.subSectionActions}>\n <div className={styles.ineligibleDownloadContainer}>\n <DownloadIneligibleForPackagingFilesFromListButton />\n </div>\n </div>\n </div>\n <ComponentCollapse\n component={\n <Typography variant={'body1'} component={'div'}>\n Files which <strong>aren't</strong> included in a\n ZIP package may be downloaded as a multi-file\n download.&nbsp;\n </Typography>\n }\n collapseBoxSx={{\n backgroundColor: 'transparent',\n p: 0,\n mt: '15px',\n }}\n componentContainerSx={{\n backgroundColor: 'transparent',\n p: 0,\n }}\n iconSx={{ width: '25px', height: '25px' }}\n >\n <Typography\n variant={'body1'}\n component={'div'}\n sx={{ marginBottom: '15px' }}\n >\n Clicking “Start Multi-file Download” initiates a\n download of all files in your Download List that can’t\n be bundled into a ZIP—such as large files or external\n links—in one step. Files are saved one by one with\n clear progress updates, automatic handling of\n duplicate names, and retry support if something fails.\n You can cancel anytime.\n <br />\n <br />\n Note: in some browsers, files download individually to\n your default Downloads folder instead of a selected\n location.\n </Typography>\n </ComponentCollapse>\n </div>\n )}\n </div>\n </div>\n\n <div>\n {isShowingCreatePackageUI && (\n <div ref={createPackageRef}>\n <CreatePackageV2\n onPackageCreation={() => {\n setIsShowingDownloadSuccessAlert(true)\n }}\n />\n </div>\n )}\n <h3 className={`${styles.sectionTitle} pageHeaderTitle`}>\n Download Individual Files\n </h3>\n <div className={styles.tabsContainer}>\n <ul className={styles.navTabs}>\n <li className={styles.navLabel}>View:</li>\n {filterTabs.map((tab, index) => (\n <li\n key={tab.label}\n className={`${styles.navItem}${\n selectedFilterTabIndex === index\n ? ` ${styles.active}`\n : ''\n }`}\n aria-selected={selectedFilterTabIndex === index}\n >\n <button\n onClick={() => setSelectedFilterTabIndex(index)}\n >\n {tab.label}\n {!isError && !isLoading && data && (\n <span className={styles.fileCount}>\n {getFilterCount(data, tab.filter)}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n </div>\n\n <div className={styles.availableForDownloadTableContainer}>\n <AvailableForDownloadTable\n key={selectedFilter ?? 'all'}\n filter={selectedFilter}\n />\n </div>\n </div>\n </div>\n )}\n {data.numberOfFilesAvailableForDownload === 0 && (\n <div className={styles.placeholder}>\n <Typography variant=\"body1Italic\">\n Your Download List is currently empty.\n </Typography>\n </div>\n )}\n </div>\n )}\n <FullWidthAlert\n show={isShowingDownloadSuccessAlert}\n variant=\"success\"\n title=\"Package Created\"\n description=\"A package has been created with eligible files. The items contained in this .zip file have been removed from your list. If your package is over 1GB, you will need to create multiple packages.\"\n autoCloseAfterDelayInSeconds={10}\n onClose={() => {\n setIsShowingDownloadSuccessAlert(false)\n }}\n />\n {isShowingModal && (\n <ProgrammaticInstructionsModal\n show={true}\n onClose={() => setIsShowingModal(false)}\n title=\"Download Programmatically\"\n pythonCode={pythonDownloadCode}\n cliCode={cliDownloadCode}\n // rCode={rDownloadCode}\n />\n )}\n </div>\n )\n}\n\nexport default DownloadCartPage\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ ._visuallyHidden_58da9_1{clip:rect(0 0 0 0);border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._externalWarningPanel_58da9_12{box-sizing:border-box;flex-direction:row;align-items:center;gap:12px;width:500px;padding:16px;display:flex;position:fixed;bottom:160px;right:20px}._externalWarningPanel_58da9_12._externalWarningPanel_58da9_12{background-color:#223549;border-radius:0}._warningIcon_58da9_29{flex-shrink:0}._warningIcon_58da9_29._warningIcon_58da9_29{font-size:40px}._warningTextContainer_58da9_36{flex:1}._warningTitleText_58da9_40._warningTitleText_58da9_40{color:#fff;font-size:14px;font-weight:700;line-height:1.4}._warningCloseButton_58da9_47._warningCloseButton_58da9_47{color:#fff;flex-shrink:0;align-self:flex-start}._warningCloseButton_58da9_47._warningCloseButton_58da9_47:hover{color:#889baf}._progressPanel_58da9_56{box-sizing:border-box;flex-direction:column;gap:4px;width:500px;height:150px;padding:16px;display:flex;position:fixed;bottom:20px;right:20px}._progressPanel_58da9_56._progressPanel_58da9_56{background-color:#223549;border-radius:0}._progressTitleText_58da9_73._progressTitleText_58da9_73{color:#fff;font-size:14px;line-height:1.4}._progressFileNameText_58da9_79{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._progressFileNameText_58da9_79._progressFileNameText_58da9_79{color:#889baf;font-size:13px;line-height:1.4}._progressFooter_58da9_90{flex:1;align-items:center;gap:8px;margin-top:auto;display:flex}._progressBarContainer_58da9_98{flex-direction:column;flex:1;gap:4px;display:flex}._progressStats_58da9_105{justify-content:space-between;display:flex}._progressStatsText_58da9_110._progressStatsText_58da9_110{color:#889baf;font-size:12px}._progressBar_58da9_98 .MuiLinearProgress-bar{background-color:#469285}._cancelButtonContainer_58da9_119{flex-shrink:0;justify-content:center;width:80px;display:flex}._cancelButton_58da9_119._cancelButton_58da9_119{color:#fff;border-color:#fff;min-width:0;padding:10px 16px;font-size:.75rem;line-height:1}._cancelButton_58da9_119._cancelButton_58da9_119:hover{color:#889baf;border-color:#889baf}
@@ -1 +1 @@
1
- {"version":3,"file":"DownloadIneligibleForPackagingFilesFromListButton.d.ts","sourceRoot":"","sources":["../../../src/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.tsx"],"names":[],"mappings":"AAoDA,MAAM,MAAM,sDAAsD,GAAG;IACnE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,CAAA;CAC5C,CAAA;AAED;;;;GAIG;AACH,wBAAgB,iDAAiD,CAC/D,KAAK,EAAE,sDAAsD,kDAwrB9D;AAED,eAAe,iDAAiD,CAAA"}
1
+ {"version":3,"file":"DownloadIneligibleForPackagingFilesFromListButton.d.ts","sourceRoot":"","sources":["../../../src/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.tsx"],"names":[],"mappings":"AAoEA,MAAM,MAAM,sDAAsD,GAAG;IACnE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,CAAA;CAC5C,CAAA;AAED;;;;GAIG;AACH,wBAAgB,iDAAiD,CAC/D,KAAK,EAAE,sDAAsD,kDAu0B9D;AAED,eAAe,iDAAiD,CAAA"}
@@ -6,53 +6,75 @@ import { useSynapseContext as i } from "../../utils/context/SynapseContext.js";
6
6
  import "../../utils/index.js";
7
7
  import { useGetAvailableFilesToDownloadInfinite as a, useGetDownloadListStatistics as o, useRemoveFilesFromDownloadList as s } from "../../synapse-queries/download/useDownloadList.js";
8
8
  import { useGetEntityQueryOptions as c } from "../../synapse-queries/entity/useEntity.js";
9
- import { DialogBase as l } from "../DialogBase.js";
9
+ import l from "../../assets/icons/CloudWarning.js";
10
10
  import { deduplicateFileName as u, getFileName as d } from "./fileNameUtils.js";
11
- import { useCallback as f, useRef as p, useState as m } from "react";
12
- import { Button as h, LinearProgress as g, Typography as _ } from "@mui/material";
13
- import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
14
- import { FileHandleAssociateType as x } from "@sage-bionetworks/synapse-types";
15
- import { useQueryClient as S } from "@tanstack/react-query";
16
- import { Download as C } from "@mui/icons-material";
11
+ import f from "./DownloadIneligibleForPackagingFilesFromListButton.module.js";
12
+ import { useCallback as p, useEffect as m, useRef as h, useState as g } from "react";
13
+ import { Box as _, Button as v, IconButton as y, LinearProgress as ee, Paper as b, Typography as x } from "@mui/material";
14
+ import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
15
+ import { FileHandleAssociateType as te } from "@sage-bionetworks/synapse-types";
16
+ import { useQueryClient as ne } from "@tanstack/react-query";
17
+ import { Close as re, Download as ie } from "@mui/icons-material";
18
+ import T from "dayjs";
19
+ import E from "dayjs/plugin/relativeTime";
20
+ import D from "dayjs/plugin/duration";
17
21
  //#region src/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.tsx
18
- function w(e) {
22
+ function ae(e) {
19
23
  return "showDirectoryPicker" in e;
20
24
  }
21
- var T = 50;
22
- function E(E) {
23
- let { buttonText: D = "Start Multi-file Download", variant: O = "contained" } = E, { accessToken: k, isAuthenticated: A } = i(), j = S(), M = c(), [N, P] = m(!1), F = p(!1), I = p(!1), [L, R] = m(null), { data: z, status: B, hasNextPage: V, fetchNextPage: H, error: U } = a(), { mutateAsync: W } = s(), { refetch: G } = o(), K = f(async (t) => {
24
- if (!F.current) {
25
- if (!t || !A) {
26
- P(!1);
25
+ var O = 50, k = 3e3;
26
+ T.extend(D), T.extend(E);
27
+ function A(E) {
28
+ let { buttonText: D = "Start Multi-file Download", variant: A = "contained" } = E, { accessToken: j, isAuthenticated: M } = i(), N = ne(), P = c(), [F, I] = g(!1), L = h(!1), [oe, R] = g(!1), z = h(!1), B = h(null), [V, H] = g(null), U = h(null), [se, W] = g(""), G = h(-1), K = h(-1);
29
+ m(() => {
30
+ if (!V) {
31
+ G.current = -1, K.current = -1, W("");
32
+ return;
33
+ }
34
+ let { fileIndex: e, totalFiles: t, currentFile: n, bytesDownloaded: r, totalBytes: i } = V;
35
+ if (e !== G.current) {
36
+ G.current = e, K.current = -1, W(`Downloading file ${e} of ${t}: ${n}`);
37
+ return;
38
+ }
39
+ if (i > 0) {
40
+ let e = Math.floor(r / i * 100), t = Math.floor(e / 25) * 25;
41
+ t > 0 && t !== K.current && (K.current = t, W(`${t}% of ${n} downloaded`));
42
+ }
43
+ }, [V]);
44
+ let { data: q, status: J, hasNextPage: Y, fetchNextPage: X, error: ce } = a(), { mutateAsync: Z } = s(), { refetch: Q } = o(), $ = p(async (t) => {
45
+ if (!L.current) {
46
+ if (!t || !M) {
47
+ I(!1);
27
48
  return;
28
49
  }
29
50
  try {
30
- F.current = !0, I.current = !1;
51
+ L.current = !0, z.current = !1, R(!1);
31
52
  let i = t.pages.flatMap((e) => e.page).filter((e) => !e.isEligibleForPackaging);
32
53
  if (i.length === 0) {
33
- e("No non-packageable files available to download", "info"), P(!1), F.current = !1;
54
+ e("No non-packageable files available to download", "info"), I(!1), L.current = !1;
34
55
  return;
35
56
  }
36
- let a = w(window), o;
57
+ let a = ae(window), o;
37
58
  if (a) {
38
59
  let t = window;
39
60
  try {
40
61
  o = await t.showDirectoryPicker({ mode: "readwrite" });
41
62
  } catch (t) {
42
- console.error("Failed to select directory:", t), e("Directory selection is required to directly download files from the website.", "warning"), P(!1), F.current = !1;
63
+ console.error("Failed to select directory:", t), e("Directory selection is required to directly download files from the website.", "warning"), I(!1), L.current = !1;
43
64
  return;
44
65
  }
45
66
  } else e("Your browser will download files individually to your default downloads folder. Each file may trigger a separate download prompt.", "info");
46
- R({
67
+ U.current = null, H({
47
68
  currentFile: "",
48
69
  fileIndex: 0,
49
70
  totalFiles: i.length,
50
71
  bytesDownloaded: 0,
51
- totalBytes: 0
72
+ totalBytes: 0,
73
+ estimatedSecondsRemaining: null
52
74
  });
53
75
  let s = /* @__PURE__ */ new Map(), c = i.map(async (e) => {
54
- if (!I.current) try {
55
- let t = await j.ensureQueryData(M(e.fileEntityId, e.versionNumber?.toString())), n = `${t.id}-${e.versionNumber ?? "latest"}`;
76
+ if (!z.current) try {
77
+ let t = await N.ensureQueryData(P(e.fileEntityId, e.versionNumber?.toString())), n = `${t.id}-${e.versionNumber ?? "latest"}`;
56
78
  s.set(n, t.dataFileHandleId);
57
79
  } catch (t) {
58
80
  console.error(`Failed to fetch entity ${e.fileEntityId}:`, t);
@@ -67,15 +89,15 @@ function E(E) {
67
89
  return {
68
90
  fileHandleId: s.get(t),
69
91
  associateObjectId: e.fileEntityId,
70
- associateObjectType: x.FileEntity
92
+ associateObjectType: te.FileEntity
71
93
  };
72
94
  });
73
95
  if (l.length === 0) {
74
- e("Failed to fetch file information for download", "danger"), P(!1), F.current = !1;
96
+ e("Failed to fetch file information for download", "danger"), I(!1), L.current = !1;
75
97
  return;
76
98
  }
77
99
  let f = [];
78
- for (let e = 0; e < l.length; e += T) f.push(l.slice(e, e + T));
100
+ for (let e = 0; e < l.length; e += O) f.push(l.slice(e, e + O));
79
101
  let p = 0, m = 0, h = [], g = /* @__PURE__ */ new Map(), _ = async (e, t) => {
80
102
  try {
81
103
  let n = await fetch(e);
@@ -93,45 +115,59 @@ function E(E) {
93
115
  }, v = async (e, t) => {
94
116
  try {
95
117
  let n;
96
- if (e.fileHandle && r(e.fileHandle) ? n = e.fileHandle.externalURL : e.preSignedURL && (n = e.preSignedURL), !n) return !1;
118
+ if (e.fileHandle && r(e.fileHandle) ? (n = e.fileHandle.externalURL, R(!0)) : e.preSignedURL && (n = e.preSignedURL), !n) return !1;
97
119
  let i = u(d(e, t), g), s = p + 1;
98
- if (R((e) => e ? {
120
+ if (U.current = null, H((e) => e ? {
99
121
  ...e,
100
122
  currentFile: i,
101
123
  fileIndex: s,
102
124
  bytesDownloaded: 0,
103
- totalBytes: 0
125
+ totalBytes: 0,
126
+ estimatedSecondsRemaining: null
104
127
  } : null), !a) {
105
128
  let e = await _(n, i);
106
129
  return e && (p = s, t && h.push(t)), e;
107
130
  }
108
131
  if (!o) return !1;
109
132
  try {
110
- let e = await fetch(n);
133
+ B.current = new AbortController();
134
+ let e = await fetch(n, { signal: B.current.signal });
111
135
  if (!e.ok) throw Error(`HTTP error! status: ${e.status}`);
112
136
  let r = e.headers.get("content-length"), a = r ? parseInt(r, 10) : 0;
113
- R((e) => e ? {
137
+ H((e) => e ? {
114
138
  ...e,
115
139
  bytesDownloaded: 0,
116
140
  totalBytes: a
117
141
  } : null);
118
142
  let c = await (await o.getFileHandle(i, { create: !0 })).createWritable();
119
143
  if (e.body) {
120
- let t = e.body.getReader(), n = 0;
144
+ let t = e.body.getReader(), n = 0, r = !1;
121
145
  try {
122
146
  for (;;) {
123
- let { done: e, value: r } = await t.read();
147
+ let { done: e, value: i } = await t.read();
124
148
  if (e) break;
125
- n += r.length, await c.write(r), R((e) => e ? {
149
+ if (n += i.length, await c.write(i), z.current) {
150
+ r = !0, t.cancel(), await c.abort();
151
+ break;
152
+ }
153
+ U.current === null && (U.current = Date.now());
154
+ let o = Date.now() - U.current, s = null;
155
+ if (o > k && n > 0 && a > 0) {
156
+ let e = n / o;
157
+ s = Math.max(0, (a - n) / e / 1e3);
158
+ }
159
+ H((e) => e ? {
126
160
  ...e,
127
- bytesDownloaded: n
161
+ bytesDownloaded: n,
162
+ ...o > k && { estimatedSecondsRemaining: s }
128
163
  } : null);
129
164
  }
130
165
  } catch (e) {
131
- throw await c.abort(), e;
166
+ throw r ||= (await c.abort(), !0), e;
132
167
  } finally {
133
- await c.close();
168
+ r || await c.close();
134
169
  }
170
+ if (z.current) return !1;
135
171
  } else try {
136
172
  let t = await e.blob();
137
173
  await c.write(t);
@@ -140,6 +176,7 @@ function E(E) {
140
176
  }
141
177
  return p = s, t && h.push(t), !0;
142
178
  } catch (r) {
179
+ if (z.current || r instanceof DOMException && r.name === "AbortError") return !1;
143
180
  console.error(`Failed to fetch/write file ${e.fileHandleId}:`, r);
144
181
  try {
145
182
  return _(n, i), p = s, t && h.push(t), !0;
@@ -153,7 +190,7 @@ function E(E) {
153
190
  }, y = async (e) => {
154
191
  console.info(`Attempting to fetch ${e.length} files individually after batch failure`);
155
192
  for (let t of e) {
156
- if (I.current) {
193
+ if (z.current) {
157
194
  console.info("Individual file fetch cancelled by user");
158
195
  break;
159
196
  }
@@ -164,7 +201,7 @@ function E(E) {
164
201
  includeFileHandles: !0,
165
202
  includePreSignedURLs: !0,
166
203
  includePreviewPreSignedURLs: !1
167
- }, k);
204
+ }, j);
168
205
  if (r.requestedFiles.length > 0) {
169
206
  let e = r.requestedFiles[0];
170
207
  await v(e, i.find((e) => e.fileEntityId === t.associateObjectId)) || m++;
@@ -175,7 +212,7 @@ function E(E) {
175
212
  }
176
213
  };
177
214
  for (let e of f) {
178
- if (I.current) {
215
+ if (z.current) {
179
216
  console.info("Download cancelled by user");
180
217
  break;
181
218
  }
@@ -186,12 +223,12 @@ function E(E) {
186
223
  includeFileHandles: !0,
187
224
  includePreSignedURLs: !0,
188
225
  includePreviewPreSignedURLs: !1
189
- }, k);
226
+ }, j);
190
227
  } catch (e) {
191
228
  console.error("Failed to fetch batch:", e);
192
229
  }
193
230
  if (t) for (let n = 0; n < t.requestedFiles.length; n++) {
194
- if (I.current) {
231
+ if (z.current) {
195
232
  console.info("Download cancelled by user during batch processing");
196
233
  break;
197
234
  }
@@ -200,119 +237,149 @@ function E(E) {
200
237
  }
201
238
  else await y(e);
202
239
  }
203
- h.length > 0 && (await W({ batchToRemove: h.map((e) => ({
240
+ h.length > 0 && (await Z({ batchToRemove: h.map((e) => ({
204
241
  fileEntityId: e.fileEntityId,
205
242
  versionNumber: e.versionNumber
206
- })) }), await G(), window.scrollTo({
243
+ })) }), await Q(), window.scrollTo({
207
244
  top: 0,
208
245
  behavior: "smooth"
209
- })), I.current ? e(`Download cancelled. ${p} file${p === 1 ? " was" : "s were"} downloaded before cancellation.`, "info") : p > 0 ? e(`Download started for ${p} file${p === 1 ? "" : "s"}${m > 0 ? `. ${m} file${m === 1 ? "" : "s"} failed.` : "."}`, m > 0 ? "warning" : "success") : e("No files could be downloaded", "warning");
246
+ })), z.current ? e(`Download cancelled. ${p} file${p === 1 ? " was" : "s were"} downloaded before cancellation.`, "info") : p > 0 ? e(`Download started for ${p} file${p === 1 ? "" : "s"}${m > 0 ? `. ${m} file${m === 1 ? "" : "s"} failed.` : "."}`, m > 0 ? "warning" : "success") : e("No files could be downloaded", "warning");
210
247
  } catch (t) {
211
248
  console.error("Error downloading files:", t), e(t?.reason ?? (t instanceof Error ? t.message : void 0) ?? "An error occurred while downloading files", "danger");
212
249
  } finally {
213
- R(null), P(!1), F.current = !1;
250
+ H(null), I(!1), L.current = !1;
214
251
  }
215
252
  }
216
253
  }, [
217
- k,
218
- A,
219
254
  j,
220
255
  M,
221
- W,
222
- G
223
- ]), q = f(async () => {
224
- if (!N) {
225
- P(!0);
256
+ N,
257
+ P,
258
+ Z,
259
+ Q
260
+ ]), le = p(async () => {
261
+ if (!F) {
262
+ I(!0);
226
263
  try {
227
- let t = V, n = z;
228
- for (; t && H;) {
229
- let e = await H();
264
+ let t = Y, n = q;
265
+ for (; t && X;) {
266
+ let e = await X();
230
267
  t = e.hasNextPage, e.data && (n = e.data);
231
268
  }
232
- B === "success" && n ? K(n) : (P(!1), F.current = !1, e("Failed to load download list. Please try again.", "danger"));
269
+ J === "success" && n ? $(n) : (I(!1), L.current = !1, e("Failed to load download list. Please try again.", "danger"));
233
270
  } catch (t) {
234
- console.error("Error downloading files:", t), P(!1), F.current = !1, e(t?.reason ?? (t instanceof Error ? t.message : void 0) ?? "An error occurred while preparing files for download", "danger");
271
+ console.error("Error downloading files:", t), I(!1), L.current = !1, e(t?.reason ?? (t instanceof Error ? t.message : void 0) ?? "An error occurred while preparing files for download", "danger");
235
272
  }
236
273
  }
237
274
  }, [
238
- N,
239
- V,
240
- H,
241
- B,
242
- z,
243
- K
244
- ]), J = f(() => {
245
- I.current = !0, R(null), P(!1), F.current = !1;
275
+ F,
276
+ Y,
277
+ X,
278
+ J,
279
+ q,
280
+ $
281
+ ]), ue = p(() => {
282
+ z.current = !0, B.current?.abort(), H(null), I(!1), L.current = !1;
246
283
  }, []);
247
- return U ? null : /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(l, {
248
- open: !!L,
249
- title: "Downloading Files",
250
- hasCloseButton: !1,
251
- onCancel: J,
252
- maxWidth: "sm",
253
- content: L ? /* @__PURE__ */ b(v, { children: [
254
- /* @__PURE__ */ b(_, {
255
- variant: "body2",
256
- color: "text.secondary",
257
- gutterBottom: !0,
258
- id: "download-progress-description",
259
- children: [
260
- "File ",
261
- L.fileIndex,
262
- " of",
263
- " ",
264
- L.totalFiles
265
- ]
266
- }),
267
- /* @__PURE__ */ y(_, {
268
- variant: "body2",
269
- noWrap: !0,
270
- gutterBottom: !0,
271
- children: L.currentFile
272
- }),
273
- L.totalBytes > 0 && /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(g, {
274
- variant: "determinate",
275
- value: L.bytesDownloaded / L.totalBytes * 100,
276
- sx: { my: 2 },
277
- "aria-label": "Download progress"
278
- }), /* @__PURE__ */ b(_, {
279
- variant: "body2",
280
- color: "text.secondary",
281
- "aria-live": "polite",
282
- "aria-atomic": "true",
283
- children: [
284
- t(L.bytesDownloaded),
285
- " ",
286
- "of ",
287
- t(L.totalBytes)
288
- ]
289
- })] }),
290
- L.totalBytes === 0 && /* @__PURE__ */ y(g, {
291
- sx: { my: 2 },
292
- "aria-label": "Download progress"
293
- })
294
- ] }) : null,
295
- actions: /* @__PURE__ */ y(h, {
296
- variant: "outlined",
297
- color: "error",
298
- onClick: J,
299
- children: "Cancel"
284
+ return ce ? null : /* @__PURE__ */ w(S, { children: [
285
+ /* @__PURE__ */ C("span", {
286
+ role: "status",
287
+ "aria-live": "polite",
288
+ "aria-atomic": "true",
289
+ className: f.visuallyHidden,
290
+ children: se
300
291
  }),
301
- DialogProps: {
302
- "aria-describedby": "download-progress-description",
303
- disableEscapeKeyDown: !1
304
- }
305
- }), /* @__PURE__ */ y(h, {
306
- variant: O,
307
- onClick: () => {
308
- q();
309
- },
310
- loading: N,
311
- startIcon: /* @__PURE__ */ y(C, {}),
312
- children: D
313
- })] });
292
+ !!V && oe && /* @__PURE__ */ w(b, {
293
+ elevation: 8,
294
+ className: f.externalWarningPanel,
295
+ sx: { zIndex: (e) => e.zIndex.modal },
296
+ role: "region",
297
+ "aria-label": "External file warning",
298
+ children: [
299
+ /* @__PURE__ */ C(l, { className: f.warningIcon }),
300
+ /* @__PURE__ */ w(_, {
301
+ className: f.warningTextContainer,
302
+ children: [/* @__PURE__ */ C(x, {
303
+ className: f.warningTitleText,
304
+ children: "Some of your files are hosted externally."
305
+ }), /* @__PURE__ */ C(x, {
306
+ className: f.progressFileNameText,
307
+ children: "Downloads may be slower than expected"
308
+ })]
309
+ }),
310
+ /* @__PURE__ */ C(y, {
311
+ onClick: () => R(!1),
312
+ size: "small",
313
+ className: f.warningCloseButton,
314
+ "aria-label": "Dismiss external file warning",
315
+ children: /* @__PURE__ */ C(re, {})
316
+ })
317
+ ]
318
+ }),
319
+ !!V && /* @__PURE__ */ w(b, {
320
+ elevation: 8,
321
+ className: f.progressPanel,
322
+ sx: { zIndex: (e) => e.zIndex.modal },
323
+ role: "region",
324
+ "aria-label": "Download progress",
325
+ children: [
326
+ /* @__PURE__ */ w(x, {
327
+ className: f.progressTitleText,
328
+ children: [
329
+ "Downloading file ",
330
+ V.fileIndex,
331
+ " of",
332
+ " ",
333
+ V.totalFiles
334
+ ]
335
+ }),
336
+ /* @__PURE__ */ C(x, {
337
+ className: f.progressFileNameText,
338
+ children: V.currentFile
339
+ }),
340
+ /* @__PURE__ */ w(_, {
341
+ className: f.progressFooter,
342
+ children: [/* @__PURE__ */ w(_, {
343
+ className: f.progressBarContainer,
344
+ children: [/* @__PURE__ */ w(_, {
345
+ className: f.progressStats,
346
+ children: [/* @__PURE__ */ C(x, {
347
+ className: f.progressStatsText,
348
+ children: V.totalBytes > 0 ? `${Math.round(V.bytesDownloaded / V.totalBytes * 100)}% ( ${t(V.bytesDownloaded)} / ${t(V.totalBytes)} )` : ""
349
+ }), /* @__PURE__ */ C(x, {
350
+ className: f.progressStatsText,
351
+ children: V.estimatedSecondsRemaining === null ? "" : `About ${T.duration({ seconds: V.estimatedSecondsRemaining }).humanize()} remaining`
352
+ })]
353
+ }), /* @__PURE__ */ C(ee, {
354
+ variant: V.totalBytes > 0 ? "determinate" : "indeterminate",
355
+ value: V.totalBytes > 0 ? V.bytesDownloaded / V.totalBytes * 100 : void 0,
356
+ "aria-label": "Download progress",
357
+ className: f.progressBar
358
+ })]
359
+ }), /* @__PURE__ */ C(_, {
360
+ className: f.cancelButtonContainer,
361
+ children: /* @__PURE__ */ C(v, {
362
+ variant: "outlined",
363
+ onClick: ue,
364
+ className: f.cancelButton,
365
+ children: "Cancel"
366
+ })
367
+ })]
368
+ })
369
+ ]
370
+ }),
371
+ /* @__PURE__ */ C(v, {
372
+ variant: A,
373
+ onClick: () => {
374
+ le();
375
+ },
376
+ loading: F,
377
+ startIcon: /* @__PURE__ */ C(ie, {}),
378
+ children: D
379
+ })
380
+ ] });
314
381
  }
315
382
  //#endregion
316
- export { E as DownloadIneligibleForPackagingFilesFromListButton, E as default };
383
+ export { A as DownloadIneligibleForPackagingFilesFromListButton, A as default };
317
384
 
318
385
  //# sourceMappingURL=DownloadIneligibleForPackagingFilesFromListButton.js.map