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.
Files changed (274) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/assets/icons/AwardScroll.d.ts +5 -0
  3. package/dist/assets/icons/AwardScroll.d.ts.map +1 -0
  4. package/dist/assets/icons/AwardScroll.js +78 -0
  5. package/dist/assets/icons/AwardScroll.js.map +1 -0
  6. package/dist/assets/icons/Baseline.d.ts +5 -0
  7. package/dist/assets/icons/Baseline.d.ts.map +1 -0
  8. package/dist/assets/icons/Baseline.js +43 -0
  9. package/dist/assets/icons/Baseline.js.map +1 -0
  10. package/dist/assets/icons/Challenge.svg +13 -0
  11. package/dist/assets/icons/Challenge.svg.js +7 -0
  12. package/dist/assets/icons/Challenge.svg.js.map +1 -0
  13. package/dist/assets/icons/ClappingHands.d.ts +5 -0
  14. package/dist/assets/icons/ClappingHands.d.ts.map +1 -0
  15. package/dist/assets/icons/ClappingHands.js +106 -0
  16. package/dist/assets/icons/ClappingHands.js.map +1 -0
  17. package/dist/assets/icons/DNA_Two.svg +0 -0
  18. package/dist/assets/icons/Data2.svg +0 -0
  19. package/dist/assets/icons/HandWithMoney.d.ts +5 -0
  20. package/dist/assets/icons/HandWithMoney.d.ts.map +1 -0
  21. package/dist/assets/icons/HandWithMoney.js +15 -0
  22. package/dist/assets/icons/HandWithMoney.js.map +1 -0
  23. package/dist/assets/icons/MultiFile.d.ts +5 -0
  24. package/dist/assets/icons/MultiFile.d.ts.map +1 -0
  25. package/dist/assets/icons/MultiFile.js +8 -0
  26. package/dist/assets/icons/MultiFile.js.map +1 -0
  27. package/dist/assets/icons/MultiFile.svg +4 -0
  28. package/dist/assets/icons/MultiFile.svg.js +7 -0
  29. package/dist/assets/icons/MultiFile.svg.js.map +1 -0
  30. package/dist/assets/icons/OpenBook.d.ts +5 -0
  31. package/dist/assets/icons/OpenBook.d.ts.map +1 -0
  32. package/dist/assets/icons/OpenBook.js +99 -0
  33. package/dist/assets/icons/OpenBook.js.map +1 -0
  34. package/dist/assets/icons/Podium.d.ts +5 -0
  35. package/dist/assets/icons/Podium.d.ts.map +1 -0
  36. package/dist/assets/icons/Podium.js +36 -0
  37. package/dist/assets/icons/Podium.js.map +1 -0
  38. package/dist/assets/icons/RosetteRibbon.d.ts +5 -0
  39. package/dist/assets/icons/RosetteRibbon.d.ts.map +1 -0
  40. package/dist/assets/icons/RosetteRibbon.js +36 -0
  41. package/dist/assets/icons/RosetteRibbon.js.map +1 -0
  42. package/dist/assets/icons/StarTrophy.d.ts +5 -0
  43. package/dist/assets/icons/StarTrophy.d.ts.map +1 -0
  44. package/dist/assets/icons/StarTrophy.js +99 -0
  45. package/dist/assets/icons/StarTrophy.js.map +1 -0
  46. package/dist/assets/icons/ThreeStars.d.ts +5 -0
  47. package/dist/assets/icons/ThreeStars.d.ts.map +1 -0
  48. package/dist/assets/icons/ThreeStars.js +71 -0
  49. package/dist/assets/icons/ThreeStars.js.map +1 -0
  50. package/dist/assets/icons/UnpackagableFile.d.ts +5 -0
  51. package/dist/assets/icons/UnpackagableFile.d.ts.map +1 -0
  52. package/dist/assets/icons/UnpackagableFile.js +8 -0
  53. package/dist/assets/icons/UnpackagableFile.js.map +1 -0
  54. package/dist/assets/icons/UnpackagableFile.svg +4 -0
  55. package/dist/assets/icons/UnpackagableFile.svg.js +7 -0
  56. package/dist/assets/icons/UnpackagableFile.svg.js.map +1 -0
  57. package/dist/assets/mui_components/PackagableFile.d.ts.map +1 -1
  58. package/dist/assets/mui_components/PackagableFile.js +5 -4
  59. package/dist/assets/mui_components/PackagableFile.js.map +1 -1
  60. package/dist/assets/mui_components/PackagableFile.svg +3 -0
  61. package/dist/assets/mui_components/PackagableFile.svg.js +7 -0
  62. package/dist/assets/mui_components/PackagableFile.svg.js.map +1 -0
  63. package/dist/assets/themed_icons/index.d.ts +1 -2
  64. package/dist/assets/themed_icons/index.d.ts.map +1 -1
  65. package/dist/assets/themed_icons/index.js +8 -10
  66. package/dist/assets/themed_icons/index.js.map +1 -1
  67. package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js +4 -4
  68. package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js.map +1 -1
  69. package/dist/components/AddToDownloadListV2.js +10 -10
  70. package/dist/components/AddToDownloadListV2.js.map +1 -1
  71. package/dist/components/BasePortalCard/BasePortalCard.css +1 -1
  72. package/dist/components/BasePortalCard/BasePortalCard.d.ts +1 -2
  73. package/dist/components/BasePortalCard/BasePortalCard.d.ts.map +1 -1
  74. package/dist/components/BasePortalCard/BasePortalCard.js +21 -28
  75. package/dist/components/BasePortalCard/BasePortalCard.js.map +1 -1
  76. package/dist/components/BasePortalCard/BasePortalCard.module.scss +7 -1
  77. package/dist/components/BasePortalCard/BasePortalCard.module.scss.js +11 -11
  78. package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.d.ts.map +1 -1
  79. package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js +24 -24
  80. package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
  81. package/dist/components/CardContainerLogic/CardContainerLogic.d.ts +5 -1
  82. package/dist/components/CardContainerLogic/CardContainerLogic.d.ts.map +1 -1
  83. package/dist/components/CardContainerLogic/CardContainerLogic.js.map +1 -1
  84. package/dist/components/CardContainerLogic/index.d.ts +1 -1
  85. package/dist/components/CardContainerLogic/index.d.ts.map +1 -1
  86. package/dist/components/CardDeck/TableQueryCardDeck.js +12 -9
  87. package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
  88. package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js +33 -33
  89. package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
  90. package/dist/components/ChangePassword/useChangePasswordFormState.js +5 -2
  91. package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
  92. package/dist/components/ComponentCollapse.d.ts +6 -10
  93. package/dist/components/ComponentCollapse.d.ts.map +1 -1
  94. package/dist/components/ComponentCollapse.js +31 -35
  95. package/dist/components/ComponentCollapse.js.map +1 -1
  96. package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js +12 -9
  97. package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +1 -1
  98. package/dist/components/DataGrid/MergeGridWithSourceTableButton.js +8 -3
  99. package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +1 -1
  100. package/dist/components/DataGrid/SynapseGrid.js +8 -3
  101. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  102. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +8 -3
  103. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
  104. package/dist/components/DirectDownload/DirectDownload.d.ts.map +1 -1
  105. package/dist/components/DirectDownload/DirectDownload.js +23 -23
  106. package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
  107. package/dist/components/DownloadCart/AvailableForDownloadTable.d.ts +6 -2
  108. package/dist/components/DownloadCart/AvailableForDownloadTable.d.ts.map +1 -1
  109. package/dist/components/DownloadCart/AvailableForDownloadTable.js +10 -8
  110. package/dist/components/DownloadCart/AvailableForDownloadTable.js.map +1 -1
  111. package/dist/components/DownloadCart/CreatePackageV2.css +1 -0
  112. package/dist/components/DownloadCart/CreatePackageV2.d.ts.map +1 -1
  113. package/dist/components/DownloadCart/CreatePackageV2.js +50 -46
  114. package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
  115. package/dist/components/DownloadCart/CreatePackageV2.module.scss +38 -0
  116. package/dist/components/DownloadCart/CreatePackageV2.module.scss.js +14 -0
  117. package/dist/components/DownloadCart/CreatePackageV2.module.scss.js.map +1 -0
  118. package/dist/components/DownloadCart/DownloadCartPage.css +1 -0
  119. package/dist/components/DownloadCart/DownloadCartPage.d.ts.map +1 -1
  120. package/dist/components/DownloadCart/DownloadCartPage.js +316 -186
  121. package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
  122. package/dist/components/DownloadCart/DownloadCartPage.module.scss +217 -0
  123. package/dist/components/DownloadCart/DownloadCartPage.module.scss.js +48 -0
  124. package/dist/components/DownloadCart/DownloadCartPage.module.scss.js.map +1 -0
  125. package/dist/components/DownloadCart/DownloadDetails.js +1 -1
  126. package/dist/components/DownloadCart/DownloadDetails.js.map +1 -1
  127. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +33 -33
  128. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  129. package/dist/components/DownloadCart/DownloadListTable.d.ts +4 -1
  130. package/dist/components/DownloadCart/DownloadListTable.d.ts.map +1 -1
  131. package/dist/components/DownloadCart/DownloadListTable.js +156 -236
  132. package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
  133. package/dist/components/DownloadCart/ShowDownloadV2.js +5 -5
  134. package/dist/components/DownloadCart/ShowDownloadV2.js.map +1 -1
  135. package/dist/components/Ecosystem/EcosystemSkeleton.js +8 -3
  136. package/dist/components/Ecosystem/EcosystemSkeleton.js.map +1 -1
  137. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +20 -20
  138. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  139. package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js +3 -3
  140. package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js.map +1 -1
  141. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +6 -2
  142. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  143. package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js +11 -8
  144. package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js.map +1 -1
  145. package/dist/components/FullWidthAlert/FullWidthAlert.d.ts +2 -2
  146. package/dist/components/FullWidthAlert/FullWidthAlert.js.map +1 -1
  147. package/dist/components/GenericCard/GenericCard.d.ts +5 -5
  148. package/dist/components/GenericCard/GenericCard.d.ts.map +1 -1
  149. package/dist/components/GenericCard/GenericCard.js +117 -103
  150. package/dist/components/GenericCard/GenericCard.js.map +1 -1
  151. package/dist/components/GenericCard/LabelMaybeWithIcon.d.ts +10 -0
  152. package/dist/components/GenericCard/LabelMaybeWithIcon.d.ts.map +1 -0
  153. package/dist/components/GenericCard/LabelMaybeWithIcon.js +33 -0
  154. package/dist/components/GenericCard/LabelMaybeWithIcon.js.map +1 -0
  155. package/dist/components/GenericCard/SynapseCardLabel.d.ts +2 -1
  156. package/dist/components/GenericCard/SynapseCardLabel.d.ts.map +1 -1
  157. package/dist/components/GenericCard/SynapseCardLabel.js +86 -81
  158. package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
  159. package/dist/components/GenericCard/TableRowGenericCard.d.ts +7 -1
  160. package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
  161. package/dist/components/GenericCard/TableRowGenericCard.js +239 -202
  162. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  163. package/dist/components/HeaderCard.js +17 -13
  164. package/dist/components/HeaderCard.js.map +1 -1
  165. package/dist/components/Icon/Icon.js +52 -52
  166. package/dist/components/Icon/Icon.js.map +1 -1
  167. package/dist/components/IconSvg/IconSvg.d.ts +1 -1
  168. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  169. package/dist/components/IconSvg/IconSvg.js +215 -171
  170. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  171. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -0
  172. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  173. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +103 -102
  174. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  175. package/dist/components/StorybookComponentWrapper.js +6 -3
  176. package/dist/components/StorybookComponentWrapper.js.map +1 -1
  177. package/dist/components/SynapseChat/SynapseChat.d.ts +7 -1
  178. package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
  179. package/dist/components/SynapseChat/SynapseChat.js +76 -67
  180. package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
  181. package/dist/components/SynapseChat/SynapseChatInteraction.d.ts +2 -1
  182. package/dist/components/SynapseChat/SynapseChatInteraction.d.ts.map +1 -1
  183. package/dist/components/SynapseChat/SynapseChatInteraction.js +83 -58
  184. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  185. package/dist/components/SynapseChat/SynapseChatMessage.d.ts +1 -0
  186. package/dist/components/SynapseChat/SynapseChatMessage.d.ts.map +1 -1
  187. package/dist/components/SynapseChat/SynapseChatMessage.js +16 -15
  188. package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
  189. package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts +12 -0
  190. package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts.map +1 -0
  191. package/dist/components/SynapseChat/SynapsePortalChatDialog.js +30 -0
  192. package/dist/components/SynapseChat/SynapsePortalChatDialog.js.map +1 -0
  193. package/dist/components/SynapseChat/extractMessageFromTraceEvent.d.ts.map +1 -1
  194. package/dist/components/SynapseChat/extractMessageFromTraceEvent.js +22 -16
  195. package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
  196. package/dist/components/SynapseChat/index.d.ts +2 -0
  197. package/dist/components/SynapseChat/index.d.ts.map +1 -1
  198. package/dist/components/SynapseChat/index.js +5 -3
  199. package/dist/components/SynapseChat/index.js.map +1 -1
  200. package/dist/components/SynapseChat/useChatState.d.ts +1 -1
  201. package/dist/components/SynapseChat/useChatState.d.ts.map +1 -1
  202. package/dist/components/SynapseChat/useChatState.js +10 -7
  203. package/dist/components/SynapseChat/useChatState.js.map +1 -1
  204. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +25 -25
  205. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
  206. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.d.ts.map +1 -1
  207. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js +39 -39
  208. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
  209. package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js +18 -18
  210. package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js.map +1 -1
  211. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +13 -13
  212. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
  213. package/dist/components/SynapseTable/TopLevelControls/TopLevelControlsUtils.js +9 -9
  214. package/dist/components/SynapseTable/TopLevelControls/TopLevelControlsUtils.js.map +1 -1
  215. package/dist/components/TextToComponentCollapse.d.ts +16 -0
  216. package/dist/components/TextToComponentCollapse.d.ts.map +1 -0
  217. package/dist/components/TextToComponentCollapse.js +29 -0
  218. package/dist/components/TextToComponentCollapse.js.map +1 -0
  219. package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js +8 -3
  220. package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js.map +1 -1
  221. package/dist/components/download_list/DownloadConfirmationUI.d.ts +1 -1
  222. package/dist/components/download_list/DownloadConfirmationUI.js +22 -22
  223. package/dist/components/download_list/DownloadConfirmationUI.js.map +1 -1
  224. package/dist/components/download_list/DownloadConfirmationUtils.js +4 -4
  225. package/dist/components/download_list/DownloadConfirmationUtils.js.map +1 -1
  226. package/dist/components/index.js +85 -83
  227. package/dist/components/index.js.map +1 -1
  228. package/dist/components/row_renderers/ObservationCard.js +12 -11
  229. package/dist/components/row_renderers/ObservationCard.js.map +1 -1
  230. package/dist/components/row_renderers/utils/CardFooter.d.ts +1 -3
  231. package/dist/components/row_renderers/utils/CardFooter.d.ts.map +1 -1
  232. package/dist/components/row_renderers/utils/CardFooter.js +31 -45
  233. package/dist/components/row_renderers/utils/CardFooter.js.map +1 -1
  234. package/dist/components/table/CsvPreview/CsvPreview.js +8 -3
  235. package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
  236. package/dist/components/table/CsvPreview/CsvPreviewDialog.js +8 -3
  237. package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
  238. package/dist/features/curator/GridPage/GridPage.js +8 -3
  239. package/dist/features/curator/GridPage/GridPage.js.map +1 -1
  240. package/dist/features/curator/GridPage/components/GridPageTitle.js +8 -3
  241. package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
  242. package/dist/index.js +137 -135
  243. package/dist/index.js.map +1 -1
  244. package/dist/style/abstracts/_functions.scss +0 -0
  245. package/dist/style/abstracts/_mixins.scss +0 -0
  246. package/dist/style/abstracts/_variables.scss +0 -0
  247. package/dist/style/base/_base.scss +0 -0
  248. package/dist/style/base/_fonts.scss +0 -0
  249. package/dist/style/base/_helpers.scss +0 -0
  250. package/dist/style/components/_all.scss +0 -1
  251. package/dist/style/components/_cards.scss +22 -0
  252. package/dist/style/components/_download-list-v2.scss +1 -1
  253. package/dist/style/components/_query-wrapper-plot-nav.scss +13 -0
  254. package/dist/style/main.css +1 -1
  255. package/dist/style/main.scss +0 -0
  256. package/dist/style/vendors/_normalize.scss +0 -0
  257. package/dist/tsconfig.build.tsbuildinfo +1 -1
  258. package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
  259. package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
  260. package/dist/utils/context/FullContextProvider.js +9 -9
  261. package/dist/utils/context/FullContextProvider.js.map +1 -1
  262. package/dist/utils/context/SynapseContext.d.ts.map +1 -1
  263. package/dist/utils/context/SynapseContext.js +1 -0
  264. package/dist/utils/context/SynapseContext.js.map +1 -1
  265. package/dist/utils/functions/SqlFunctions.d.ts +4 -0
  266. package/dist/utils/functions/SqlFunctions.d.ts.map +1 -1
  267. package/dist/utils/functions/SqlFunctions.js +25 -23
  268. package/dist/utils/functions/SqlFunctions.js.map +1 -1
  269. package/package.json +24 -23
  270. package/dist/assets/themed_icons/Challenge.d.ts +0 -3
  271. package/dist/assets/themed_icons/Challenge.d.ts.map +0 -1
  272. package/dist/assets/themed_icons/Challenge.js +0 -25
  273. package/dist/assets/themed_icons/Challenge.js.map +0 -1
  274. 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: m = "" }) {
15
- const { isAuthenticated: t } = h(), e = x(), s = "Click to view items in your download cart.", {
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: s,
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: "cart" }) }),
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 ${m}`,
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 Cart.\n * This must be configured with the URL of a page dedicated to showing the Download Cart.\n */\nfunction ShowDownloadV2Internal({ to, className = '' }: ShowDownloadV2Props) {\n const { isAuthenticated } = useSynapseContext()\n const handleError = useErrorHandler()\n const tooltipText = 'Click to view items in your download cart.'\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=\"cart\" />\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,QAAO,EAAA,CACvB;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;"}
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 pi() {
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
- pi as default
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;"}
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 re } from "../menu/DropdownMenu.js";
39
- import { ModalDownload as se } from "../ModalDownload/ModalDownload.js";
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, s, d, l, r, y, c, p, f) {
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 Cart",
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
- }) : r(!0);
115
+ }) : s(!0);
116
116
  }
117
117
  };
118
118
  case 2:
119
119
  return {
120
120
  text: "Programmatic Access",
121
121
  onClick: () => {
122
- s(!0);
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
- s(!0);
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 cart";
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), s = o === t.dataset, { data: d, isLoading: l } = ee(
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: s
207
+ enabled: r
208
208
  }
209
209
  );
210
- let r;
211
- return s ? d?.results && d.results.length > 0 ? r = d.results[0].versionNumber : r = void 0 : r = n && z(n) ? n.versionNumber : void 0, { latestVersionNumber: r, isLoading: i || l };
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: s } = W(), { mutate: d } = X({
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 Cart", "info");
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, r] = w(!1), [y, c] = w(!1), [p, f] = w(!1), L = () => {
240
- r(!1);
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
- r,
271
+ s,
272
272
  D,
273
273
  d,
274
274
  c,
275
275
  o,
276
276
  x,
277
277
  R,
278
- s
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
- re,
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
- se,
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: r, versionNumber: i } = p.original, { data: e } = a(r, i), { downloadCartPageUrl: d } = c(), { mutate: s } = g({
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 Cart", placement: "right", children: /* @__PURE__ */ o(
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: r, entityVersionNumber: i }), t.stopPropagation();
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 Cart\" 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;"}
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 yr(a) {
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
- yr as default
250
+ Tr as default
247
251
  };
248
252
  //# sourceMappingURL=FacetPlotsCard.js.map