synapse-react-client 4.0.34 → 4.0.36

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 (336) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/aridhia-queries/AridhiaKeyFactory.d.ts +24 -0
  3. package/dist/aridhia-queries/AridhiaKeyFactory.d.ts.map +1 -0
  4. package/dist/aridhia-queries/AridhiaKeyFactory.js +49 -0
  5. package/dist/aridhia-queries/AridhiaKeyFactory.js.map +1 -0
  6. package/dist/aridhia-queries/FairFormPayload.d.ts +45 -0
  7. package/dist/aridhia-queries/FairFormPayload.d.ts.map +1 -0
  8. package/dist/aridhia-queries/FairFormPayload.js +0 -0
  9. package/dist/aridhia-queries/TransferType.d.ts +10 -0
  10. package/dist/aridhia-queries/TransferType.d.ts.map +1 -0
  11. package/dist/aridhia-queries/TransferType.js +0 -0
  12. package/dist/aridhia-queries/aridhiaTokenExchange.js +6 -6
  13. package/dist/aridhia-queries/index.d.ts +12 -0
  14. package/dist/aridhia-queries/index.d.ts.map +1 -1
  15. package/dist/aridhia-queries/index.js +12 -2
  16. package/dist/aridhia-queries/useAridhiaQuery.d.ts +37 -0
  17. package/dist/aridhia-queries/useAridhiaQuery.d.ts.map +1 -0
  18. package/dist/aridhia-queries/useAridhiaQuery.js +71 -0
  19. package/dist/aridhia-queries/useAridhiaQuery.js.map +1 -0
  20. package/dist/aridhia-queries/useGetAridhiaDatasetCatalogue.d.ts +6 -0
  21. package/dist/aridhia-queries/useGetAridhiaDatasetCatalogue.d.ts.map +1 -0
  22. package/dist/aridhia-queries/useGetAridhiaDatasetCatalogue.js +13 -0
  23. package/dist/aridhia-queries/useGetAridhiaDatasetCatalogue.js.map +1 -0
  24. package/dist/aridhia-queries/useGetAridhiaDatasetSettings.d.ts +6 -0
  25. package/dist/aridhia-queries/useGetAridhiaDatasetSettings.d.ts.map +1 -0
  26. package/dist/aridhia-queries/useGetAridhiaDatasetSettings.js +13 -0
  27. package/dist/aridhia-queries/useGetAridhiaDatasetSettings.js.map +1 -0
  28. package/dist/aridhia-queries/useGetAridhiaDictionaries.d.ts +6 -0
  29. package/dist/aridhia-queries/useGetAridhiaDictionaries.d.ts.map +1 -0
  30. package/dist/aridhia-queries/useGetAridhiaDictionaries.js +13 -0
  31. package/dist/aridhia-queries/useGetAridhiaDictionaries.js.map +1 -0
  32. package/dist/aridhia-queries/useGetAridhiaRequests.d.ts +5 -4
  33. package/dist/aridhia-queries/useGetAridhiaRequests.d.ts.map +1 -1
  34. package/dist/aridhia-queries/useGetAridhiaRequests.js +11 -18
  35. package/dist/aridhia-queries/useGetAridhiaRequests.js.map +1 -1
  36. package/dist/aridhia-queries/useGetAridhiaWorkflow.d.ts +13 -0
  37. package/dist/aridhia-queries/useGetAridhiaWorkflow.d.ts.map +1 -0
  38. package/dist/aridhia-queries/useGetAridhiaWorkflow.js +19 -0
  39. package/dist/aridhia-queries/useGetAridhiaWorkflow.js.map +1 -0
  40. package/dist/aridhia-queries/useGetAridhiaWorkspaceLocations.d.ts +6 -0
  41. package/dist/aridhia-queries/useGetAridhiaWorkspaceLocations.d.ts.map +1 -0
  42. package/dist/aridhia-queries/useGetAridhiaWorkspaceLocations.js +13 -0
  43. package/dist/aridhia-queries/useGetAridhiaWorkspaceLocations.js.map +1 -0
  44. package/dist/aridhia-queries/useGetAridhiaWorkspaceRequestForm.d.ts +19 -0
  45. package/dist/aridhia-queries/useGetAridhiaWorkspaceRequestForm.d.ts.map +1 -0
  46. package/dist/aridhia-queries/useGetAridhiaWorkspaceRequestForm.js +17 -0
  47. package/dist/aridhia-queries/useGetAridhiaWorkspaceRequestForm.js.map +1 -0
  48. package/dist/aridhia-queries/useGetAridhiaWorkspaces.d.ts +6 -0
  49. package/dist/aridhia-queries/useGetAridhiaWorkspaces.d.ts.map +1 -0
  50. package/dist/aridhia-queries/useGetAridhiaWorkspaces.js +19 -0
  51. package/dist/aridhia-queries/useGetAridhiaWorkspaces.js.map +1 -0
  52. package/dist/aridhia-queries/useSubmitAridhiaDar.d.ts +27 -0
  53. package/dist/aridhia-queries/useSubmitAridhiaDar.d.ts.map +1 -0
  54. package/dist/aridhia-queries/useSubmitAridhiaDar.js +38 -0
  55. package/dist/aridhia-queries/useSubmitAridhiaDar.js.map +1 -0
  56. package/dist/assets/icons/curie-head.svg +21 -0
  57. package/dist/components/AccessRequirement/EntityActionsRequired.d.ts +0 -1
  58. package/dist/components/AccessRequirement/EntityActionsRequired.d.ts.map +1 -1
  59. package/dist/components/AccessRequirement/EntityActionsRequired.js +3 -6
  60. package/dist/components/AccessRequirement/EntityActionsRequired.js.map +1 -1
  61. package/dist/components/AccessRequirementList/AccessRequirementList.d.ts +24 -2
  62. package/dist/components/AccessRequirementList/AccessRequirementList.d.ts.map +1 -1
  63. package/dist/components/AccessRequirementList/AccessRequirementList.js +69 -66
  64. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  65. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts.map +1 -1
  66. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js +67 -56
  67. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js.map +1 -1
  68. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts.map +1 -1
  69. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js +1 -1
  70. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js.map +1 -1
  71. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts +6 -1
  72. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts.map +1 -1
  73. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js +55 -54
  74. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js.map +1 -1
  75. package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts +3 -3
  76. package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts.map +1 -1
  77. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js +1 -1
  78. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js.map +1 -1
  79. package/dist/components/CardContainer/CardConfiguration.d.ts +8 -0
  80. package/dist/components/CardContainer/CardConfiguration.d.ts.map +1 -1
  81. package/dist/components/ChangePassword/ChangePasswordWithToken.d.ts.map +1 -1
  82. package/dist/components/ChangePassword/ChangePasswordWithToken.js +58 -23
  83. package/dist/components/ChangePassword/ChangePasswordWithToken.js.map +1 -1
  84. package/dist/components/ChangePassword/useChangePasswordFormState.d.ts.map +1 -1
  85. package/dist/components/ChangePassword/useChangePasswordFormState.js +13 -3
  86. package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
  87. package/dist/components/CreateTableViewWizard/TableNameForm.d.ts.map +1 -1
  88. package/dist/components/CreateTableViewWizard/TableNameForm.js +11 -14
  89. package/dist/components/CreateTableViewWizard/TableNameForm.js.map +1 -1
  90. package/dist/components/DataGrid/SyncGridWithSourceButton.d.ts +1 -1
  91. package/dist/components/DataGrid/SyncGridWithSourceButton.d.ts.map +1 -1
  92. package/dist/components/DataGrid/SyncGridWithSourceButton.js +55 -61
  93. package/dist/components/DataGrid/SyncGridWithSourceButton.js.map +1 -1
  94. package/dist/components/DataGrid/components/contextMenu.d.ts.map +1 -1
  95. package/dist/components/DataGrid/components/contextMenu.js +15 -15
  96. package/dist/components/DataGrid/components/contextMenu.js.map +1 -1
  97. package/dist/components/DataGrid/useMergeGridWithSource.d.ts +1 -5
  98. package/dist/components/DataGrid/useMergeGridWithSource.d.ts.map +1 -1
  99. package/dist/components/DataGrid/useMergeGridWithSource.js +21 -28
  100. package/dist/components/DataGrid/useMergeGridWithSource.js.map +1 -1
  101. package/dist/components/DatasetHosting/DatasetDownloadButton.d.ts +35 -0
  102. package/dist/components/DatasetHosting/DatasetDownloadButton.d.ts.map +1 -0
  103. package/dist/components/DatasetHosting/DatasetDownloadButton.js +132 -0
  104. package/dist/components/DatasetHosting/DatasetDownloadButton.js.map +1 -0
  105. package/dist/components/DatasetHosting/DatasetHosting.d.ts +91 -0
  106. package/dist/components/DatasetHosting/DatasetHosting.d.ts.map +1 -0
  107. package/dist/components/DatasetHosting/DatasetHosting.js +58 -0
  108. package/dist/components/DatasetHosting/DatasetHosting.js.map +1 -0
  109. package/dist/components/DatasetHosting/index.d.ts +5 -0
  110. package/dist/components/DatasetHosting/index.d.ts.map +1 -0
  111. package/dist/components/DatasetHosting/index.js +3 -0
  112. package/dist/components/DownloadCart/ActionRequiredListItem.d.ts +0 -2
  113. package/dist/components/DownloadCart/ActionRequiredListItem.d.ts.map +1 -1
  114. package/dist/components/DownloadCart/ActionRequiredListItem.js +2 -3
  115. package/dist/components/DownloadCart/ActionRequiredListItem.js.map +1 -1
  116. package/dist/components/DownloadCart/DownloadCartPage.d.ts +1 -2
  117. package/dist/components/DownloadCart/DownloadCartPage.d.ts.map +1 -1
  118. package/dist/components/DownloadCart/DownloadCartPage.js +49 -49
  119. package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
  120. package/dist/components/DownloadCart/DownloadListActionsRequired.d.ts +1 -5
  121. package/dist/components/DownloadCart/DownloadListActionsRequired.d.ts.map +1 -1
  122. package/dist/components/DownloadCart/DownloadListActionsRequired.js +5 -6
  123. package/dist/components/DownloadCart/DownloadListActionsRequired.js.map +1 -1
  124. package/dist/components/DownloadCart/RequestDownloadCard.d.ts +0 -2
  125. package/dist/components/DownloadCart/RequestDownloadCard.d.ts.map +1 -1
  126. package/dist/components/DownloadCart/RequestDownloadCard.js +28 -32
  127. package/dist/components/DownloadCart/RequestDownloadCard.js.map +1 -1
  128. package/dist/components/DownloadCart/TableQueryActionsRequired.d.ts +0 -2
  129. package/dist/components/DownloadCart/TableQueryActionsRequired.d.ts.map +1 -1
  130. package/dist/components/DownloadCart/TableQueryActionsRequired.js +7 -8
  131. package/dist/components/DownloadCart/TableQueryActionsRequired.js.map +1 -1
  132. package/dist/components/DownloadCart/index.d.ts +1 -2
  133. package/dist/components/DownloadCart/index.d.ts.map +1 -1
  134. package/dist/components/DraggableDialog/DraggableDialog.d.ts +2 -1
  135. package/dist/components/DraggableDialog/DraggableDialog.d.ts.map +1 -1
  136. package/dist/components/DraggableDialog/DraggableDialog.js +42 -33
  137. package/dist/components/DraggableDialog/DraggableDialog.js.map +1 -1
  138. package/dist/components/EntityTreeTable/hooks/useTableColumns.d.ts.map +1 -1
  139. package/dist/components/EntityTreeTable/hooks/useTableColumns.js +12 -6
  140. package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
  141. package/dist/components/ExperimentalMode/ExperimentalMode.js +2 -1
  142. package/dist/components/ExperimentalMode/ExperimentalMode.js.map +1 -1
  143. package/dist/components/GenericCard/CardActionButtonStyleContext.d.ts +10 -0
  144. package/dist/components/GenericCard/CardActionButtonStyleContext.d.ts.map +1 -0
  145. package/dist/components/GenericCard/CardActionButtonStyleContext.js +10 -0
  146. package/dist/components/GenericCard/CardActionButtonStyleContext.js.map +1 -0
  147. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js +41 -41
  148. package/dist/components/GenericCard/GenericCardActionButton.d.ts +5 -0
  149. package/dist/components/GenericCard/GenericCardActionButton.d.ts.map +1 -1
  150. package/dist/components/GenericCard/GenericCardActionButton.js +28 -11
  151. package/dist/components/GenericCard/GenericCardActionButton.js.map +1 -1
  152. package/dist/components/GenericCard/TableRowGenericCard.d.ts +24 -0
  153. package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
  154. package/dist/components/GenericCard/TableRowGenericCard.js +205 -190
  155. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  156. package/dist/components/JSONArrayEditor/JSONArrayEditor.d.ts.map +1 -1
  157. package/dist/components/JSONArrayEditor/JSONArrayEditor.js +42 -42
  158. package/dist/components/JSONArrayEditor/JSONArrayEditor.js.map +1 -1
  159. package/dist/components/JsonSchemaForm/JsonSchemaForm.css +1 -0
  160. package/dist/components/JsonSchemaForm/JsonSchemaForm.d.ts.map +1 -1
  161. package/dist/components/JsonSchemaForm/JsonSchemaForm.js +13 -12
  162. package/dist/components/JsonSchemaForm/JsonSchemaForm.js.map +1 -1
  163. package/dist/components/JsonSchemaForm/JsonSchemaForm.module.js +5 -0
  164. package/dist/components/JsonSchemaForm/JsonSchemaForm.module.js.map +1 -0
  165. package/dist/components/JsonSchemaForm/JsonSchemaForm.module.scss +109 -0
  166. package/dist/components/QueryBuilder/QueryBuilderTypes.d.ts +39 -0
  167. package/dist/components/QueryBuilder/QueryBuilderTypes.d.ts.map +1 -0
  168. package/dist/components/QueryBuilder/QueryBuilderTypes.js +11 -0
  169. package/dist/components/QueryBuilder/QueryBuilderTypes.js.map +1 -0
  170. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts +48 -0
  171. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts.map +1 -0
  172. package/dist/components/QueryBuilder/queryBuilderTranslation.js +256 -0
  173. package/dist/components/QueryBuilder/queryBuilderTranslation.js.map +1 -0
  174. package/dist/components/QueryContext/QueryContext.d.ts +0 -1
  175. package/dist/components/QueryContext/QueryContext.d.ts.map +1 -1
  176. package/dist/components/QueryContext/QueryContext.js.map +1 -1
  177. package/dist/components/QueryWrapper/QueryWrapper.d.ts +0 -1
  178. package/dist/components/QueryWrapper/QueryWrapper.d.ts.map +1 -1
  179. package/dist/components/QueryWrapper/QueryWrapper.js +52 -53
  180. package/dist/components/QueryWrapper/QueryWrapper.js.map +1 -1
  181. package/dist/components/QueryWrapperErrorBoundary.d.ts.map +1 -1
  182. package/dist/components/QueryWrapperErrorBoundary.js +4 -11
  183. package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
  184. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +0 -1
  185. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  186. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  187. package/dist/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.js +123 -123
  188. package/dist/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.js.map +1 -1
  189. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
  190. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +64 -55
  191. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  192. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts.map +1 -1
  193. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js +0 -1
  194. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js.map +1 -1
  195. package/dist/components/ShareThisPage/ShareThisPage.js +30 -29
  196. package/dist/components/ShareThisPage/ShareThisPage.js.map +1 -1
  197. package/dist/components/StorybookComponentWrapper.d.ts.map +1 -1
  198. package/dist/components/StorybookComponentWrapper.js +15 -10
  199. package/dist/components/StorybookComponentWrapper.js.map +1 -1
  200. package/dist/components/SynapseChat/GridAgentChat.d.ts.map +1 -1
  201. package/dist/components/SynapseChat/GridAgentChat.js +29 -31
  202. package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
  203. package/dist/components/SynapseChat/SynapseChat.d.ts +2 -1
  204. package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
  205. package/dist/components/SynapseChat/SynapseChat.js +118 -74
  206. package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
  207. package/dist/components/SynapseChat/SynapseChatInteraction.d.ts +3 -1
  208. package/dist/components/SynapseChat/SynapseChatInteraction.d.ts.map +1 -1
  209. package/dist/components/SynapseChat/SynapseChatInteraction.js +21 -21
  210. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  211. package/dist/components/SynapseChat/SynapseChatMessage.d.ts +1 -0
  212. package/dist/components/SynapseChat/SynapseChatMessage.d.ts.map +1 -1
  213. package/dist/components/SynapseChat/SynapseChatMessage.js +9 -8
  214. package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
  215. package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts.map +1 -1
  216. package/dist/components/SynapseChat/SynapsePortalChatDialog.js +2 -1
  217. package/dist/components/SynapseChat/SynapsePortalChatDialog.js.map +1 -1
  218. package/dist/components/SynapseTable/SynapseTable.d.ts.map +1 -1
  219. package/dist/components/SynapseTable/SynapseTable.js +2 -1
  220. package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
  221. package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.d.ts.map +1 -1
  222. package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js +29 -30
  223. package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js.map +1 -1
  224. package/dist/components/TanStackTable/StyledTanStackTable.d.ts +7 -0
  225. package/dist/components/TanStackTable/StyledTanStackTable.d.ts.map +1 -1
  226. package/dist/components/TanStackTable/StyledTanStackTable.js +68 -48
  227. package/dist/components/TanStackTable/StyledTanStackTable.js.map +1 -1
  228. package/dist/components/TanStackTable/TanStackTableUtils.d.ts.map +1 -1
  229. package/dist/components/TanStackTable/TanStackTableUtils.js +6 -6
  230. package/dist/components/TanStackTable/TanStackTableUtils.js.map +1 -1
  231. package/dist/components/TanStackTable/useSyncedTopScrollbar.d.ts +13 -0
  232. package/dist/components/TanStackTable/useSyncedTopScrollbar.d.ts.map +1 -0
  233. package/dist/components/TanStackTable/useSyncedTopScrollbar.js +32 -0
  234. package/dist/components/TanStackTable/useSyncedTopScrollbar.js.map +1 -0
  235. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts +12 -0
  236. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts.map +1 -0
  237. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js +86 -0
  238. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js.map +1 -0
  239. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPage.d.ts.map +1 -1
  240. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPage.js +20 -18
  241. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPage.js.map +1 -1
  242. package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
  243. package/dist/components/doi/CreateOrUpdateDoiModal.js +10 -13
  244. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  245. package/dist/components/entity/page/CreatedByModifiedBy.d.ts.map +1 -1
  246. package/dist/components/entity/page/CreatedByModifiedBy.js +43 -61
  247. package/dist/components/entity/page/CreatedByModifiedBy.js.map +1 -1
  248. package/dist/components/entity/page/createdByModifiedByTooltips.d.ts +7 -0
  249. package/dist/components/entity/page/createdByModifiedByTooltips.d.ts.map +1 -0
  250. package/dist/components/entity/page/createdByModifiedByTooltips.js +36 -0
  251. package/dist/components/entity/page/createdByModifiedByTooltips.js.map +1 -0
  252. package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.d.ts.map +1 -1
  253. package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js +130 -65
  254. package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js.map +1 -1
  255. package/dist/components/index.d.ts +1 -0
  256. package/dist/components/index.d.ts.map +1 -1
  257. package/dist/components/index.js +143 -140
  258. package/dist/components/menu/DropdownMenu.d.ts.map +1 -1
  259. package/dist/components/menu/DropdownMenu.js +6 -6
  260. package/dist/components/menu/DropdownMenu.js.map +1 -1
  261. package/dist/components/widgets/Range.js +8 -2
  262. package/dist/components/widgets/Range.js.map +1 -1
  263. package/dist/components/widgets/query-filter/RangeFacetFilter.d.ts.map +1 -1
  264. package/dist/components/widgets/query-filter/RangeFacetFilter.js +2 -1
  265. package/dist/components/widgets/query-filter/RangeFacetFilter.js.map +1 -1
  266. package/dist/components/widgets/query-filter/RangeFacetFilterUI.d.ts.map +1 -1
  267. package/dist/components/widgets/query-filter/RangeFacetFilterUI.js +19 -19
  268. package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
  269. package/dist/features/entity/metadata-task/components/MetadataTasksPage.js +5 -5
  270. package/dist/index.js +161 -159
  271. package/dist/index.js.map +1 -1
  272. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.d.ts.map +1 -1
  273. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js +30 -26
  274. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js.map +1 -1
  275. package/dist/mocks/msw/handlers/fileHandlers.d.ts.map +1 -1
  276. package/dist/mocks/msw/handlers/fileHandlers.js +22 -22
  277. package/dist/mocks/msw/handlers/fileHandlers.js.map +1 -1
  278. package/dist/mocks/msw/handlers/resetTwoFactorAuthHandlers.d.ts +1 -0
  279. package/dist/mocks/msw/handlers/resetTwoFactorAuthHandlers.d.ts.map +1 -1
  280. package/dist/mocks/msw/handlers/resetTwoFactorAuthHandlers.js +7 -1
  281. package/dist/mocks/msw/handlers/resetTwoFactorAuthHandlers.js.map +1 -1
  282. package/dist/mocks/msw/handlers/userProfileHandlers.d.ts.map +1 -1
  283. package/dist/mocks/msw/handlers/userProfileHandlers.js +40 -36
  284. package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
  285. package/dist/mocks/user/mock_user_profile.d.ts +1 -0
  286. package/dist/mocks/user/mock_user_profile.d.ts.map +1 -1
  287. package/dist/mocks/user/mock_user_profile.js +45 -45
  288. package/dist/mocks/user/mock_user_profile.js.map +1 -1
  289. package/dist/style/components/_all.scss +0 -1
  290. package/dist/style/components/_cards.scss +4 -2
  291. package/dist/style/main.css +1 -1
  292. package/dist/synapse-queries/KeyFactory.d.ts +2 -0
  293. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  294. package/dist/synapse-queries/KeyFactory.js +6 -0
  295. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  296. package/dist/synapse-queries/dataaccess/index.js +4 -4
  297. package/dist/synapse-queries/dataaccess/useEDuc.d.ts +20 -1
  298. package/dist/synapse-queries/dataaccess/useEDuc.d.ts.map +1 -1
  299. package/dist/synapse-queries/dataaccess/useEDuc.js +75 -49
  300. package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -1
  301. package/dist/synapse-queries/index.js +190 -188
  302. package/dist/tsconfig.build.tsbuildinfo +1 -1
  303. package/dist/utils/APIConstants.d.ts +2 -0
  304. package/dist/utils/APIConstants.d.ts.map +1 -1
  305. package/dist/utils/APIConstants.js +2 -2
  306. package/dist/utils/APIConstants.js.map +1 -1
  307. package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
  308. package/dist/utils/AppUtils/session/ApplicationSessionManager.js +20 -19
  309. package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
  310. package/dist/utils/featureflag/FeatureFlags.d.ts +2 -4
  311. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
  312. package/dist/utils/featureflag/FeatureFlags.js +1 -1
  313. package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
  314. package/dist/utils/functions/RegularExpressions.d.ts +17 -0
  315. package/dist/utils/functions/RegularExpressions.d.ts.map +1 -1
  316. package/dist/utils/functions/RegularExpressions.js +11 -4
  317. package/dist/utils/functions/RegularExpressions.js.map +1 -1
  318. package/dist/utils/functions/SqlFunctions.d.ts.map +1 -1
  319. package/dist/utils/functions/SqlFunctions.js +19 -3
  320. package/dist/utils/functions/SqlFunctions.js.map +1 -1
  321. package/dist/utils/hooks/useIsHydrated.d.ts +9 -0
  322. package/dist/utils/hooks/useIsHydrated.d.ts.map +1 -0
  323. package/dist/utils/hooks/useIsHydrated.js +10 -0
  324. package/dist/utils/hooks/useIsHydrated.js.map +1 -0
  325. package/dist/utils/index.js +16 -16
  326. package/dist/utils/types/IsType.d.ts +4 -1
  327. package/dist/utils/types/IsType.d.ts.map +1 -1
  328. package/dist/utils/types/IsType.js +4 -4
  329. package/dist/utils/types/IsType.js.map +1 -1
  330. package/dist/utils/types/index.js +2 -2
  331. package/package.json +7 -7
  332. package/dist/components/DataGrid/useMergeGridWithRecordSet.d.ts +0 -12
  333. package/dist/components/DataGrid/useMergeGridWithRecordSet.d.ts.map +0 -1
  334. package/dist/components/DataGrid/useMergeGridWithRecordSet.js +0 -25
  335. package/dist/components/DataGrid/useMergeGridWithRecordSet.js.map +0 -1
  336. package/dist/style/components/_annotations.scss +0 -110
@@ -20,27 +20,28 @@ function s(t, n) {
20
20
  }, [c, u]), { traceEvents: o };
21
21
  }
22
22
  function c(e) {
23
- let { userMessage: r, chatJobId: i, onSendChat: a, agentAvatar: c, userAvatar: l, scrollIntoView: u, animateEntry: d, isAwaitingResponse: f, pendingAttachments: p } = e, { data: m } = n(i), h = m?.requestBody, g = m?.responseBody, _ = m?.errorMessage, { traceEvents: v } = s(i, !!i && (!m?.jobState || m.jobState == "PROCESSING")), y = h?.attachments?.map((e) => {
24
- let t = e.fileHandleId, n = g?.attachmentStatuses?.find((e) => e.fileHandleId === t), r = p?.find((e) => e.fileHandleId === t);
23
+ let { userMessage: r, chatJobId: i, onSendChat: a, agentAvatar: c, userAvatar: l, scrollIntoView: u, animateEntry: d, isAwaitingResponse: f, showLoadingIcon: p, pendingAttachments: m } = e, { data: h } = n(i), g = h?.requestBody, _ = h?.responseBody, v = h?.errorMessage, { traceEvents: y } = s(i, !!i && (!h?.jobState || h.jobState == "PROCESSING")), b = g?.attachments?.map((e) => {
24
+ let t = e.fileHandleId, n = _?.attachmentStatuses?.find((e) => e.fileHandleId === t), r = m?.find((e) => e.fileHandleId === t);
25
25
  return {
26
26
  fileHandleId: t,
27
27
  fileName: n?.fileName ?? r?.fileName,
28
28
  contentType: n?.contentType ?? r?.contentType
29
29
  };
30
- }) ?? p;
30
+ }) ?? m;
31
31
  return /* @__PURE__ */ o(t, {
32
32
  agentAvatar: c,
33
33
  userAvatar: l,
34
34
  userMessage: r,
35
- chatResponseText: g?.responseText,
36
- chatResponseTrace: v,
37
- chatErrorReason: _,
35
+ chatResponseText: _?.responseText,
36
+ chatResponseTrace: y,
37
+ chatErrorReason: v,
38
38
  onSendChat: a,
39
39
  scrollIntoView: u,
40
40
  animateEntry: d,
41
41
  isAwaitingResponse: f,
42
- attachments: y,
43
- attachmentStatuses: g?.attachmentStatuses
42
+ showLoadingIcon: p,
43
+ attachments: b,
44
+ attachmentStatuses: _?.attachmentStatuses
44
45
  });
45
46
  }
46
47
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseChatMessage.js","names":[],"sources":["../../../src/components/SynapseChat/SynapseChatMessage.tsx"],"sourcesContent":["import SynapseChatInteraction from '@/components/SynapseChat/SynapseChatInteraction'\nimport usePollAsynchronousJob from '@/synapse-queries/asynchronous/usePollAsynchronousJob'\nimport { useGetChatAgentTraceEvents } from '@/synapse-queries/chat/useChat'\nimport {\n AgentChatRequest,\n AgentChatResponse,\n} from '@sage-bionetworks/synapse-client'\nimport { TraceEvent } from '@sage-bionetworks/synapse-types'\nimport { useCallback, useEffect, useState } from 'react'\nimport { ChatAttachment } from './utils/types'\n\nfunction useTraceEvent(chatJobId: string | undefined, enabled: boolean) {\n const [traceEvents, setTraceEvents] = useState<TraceEvent[]>([])\n\n const appendTraceEvents = useCallback((newEvents: TraceEvent[]) => {\n setTraceEvents(prev => {\n return [...prev, ...newEvents]\n })\n }, [])\n\n const latestTraceEvent = traceEvents.at(traceEvents.length - 1)\n const { data: newTraceEvents } = useGetChatAgentTraceEvents(\n {\n jobId: chatJobId ?? '',\n newerThanTimestamp: latestTraceEvent?.timestamp,\n },\n {\n enabled: enabled,\n refetchInterval: 1000, // Re-fetch every second if enabled\n refetchIntervalInBackground: true, // Continue polling even when the tab is not active\n },\n )\n useEffect(() => {\n if (newTraceEvents && newTraceEvents.page.length > 0) {\n appendTraceEvents(newTraceEvents.page)\n\n // send trace events to the console to ease agent debugging\n // if the trace events do not contain the latest event, add the events to the array\n console.debug(newTraceEvents.page)\n }\n }, [appendTraceEvents, newTraceEvents])\n\n return {\n traceEvents,\n }\n}\n\ntype SynapseChatMessageProps = {\n agentAvatar: React.ReactNode\n userAvatar: React.ReactNode\n /** Known at send time; never re-derived from the polled job so the bubble never renders empty. */\n userMessage: string\n /** Undefined until the async job has been registered for this interaction. */\n chatJobId?: string\n onSendChat?: (message: string) => void\n scrollIntoView?: boolean\n animateEntry?: boolean\n isAwaitingResponse?: boolean\n /**\n * Attachments sent with this message. This information is not available in any API request/response\n * until the job has finished processing, so this prop is used to optimistically render the attachment\n * chips in the message bubble until the response arrives.\n */\n pendingAttachments?: ChatAttachment[]\n}\n\nexport default function SynapseChatMessage(props: SynapseChatMessageProps) {\n const {\n userMessage,\n chatJobId,\n onSendChat,\n agentAvatar,\n userAvatar,\n scrollIntoView,\n animateEntry,\n isAwaitingResponse,\n pendingAttachments,\n } = props\n const { data: asyncJobStatus } = usePollAsynchronousJob(chatJobId)\n\n const chatRequest = asyncJobStatus?.requestBody as AgentChatRequest\n const chatResponse = asyncJobStatus?.responseBody as\n | AgentChatResponse\n | undefined\n const chatError = asyncJobStatus?.errorMessage\n\n // enabled if the job has been registered and has not finished processing\n const enableTrace =\n !!chatJobId &&\n (!asyncJobStatus?.jobState || asyncJobStatus.jobState == 'PROCESSING')\n const { traceEvents } = useTraceEvent(chatJobId, enableTrace)\n\n const attachments =\n chatRequest?.attachments?.map(attachment => {\n const fileHandleId = attachment.fileHandleId!\n const status = chatResponse?.attachmentStatuses?.find(\n s => s.fileHandleId === fileHandleId,\n )\n const pending = pendingAttachments?.find(\n a => a.fileHandleId === fileHandleId,\n )\n // Prefer the server-resolved metadata once the job's response arrives. Fall back to what\n // was optimistically sent (`pending`) so the chip doesn't lose its filename between the\n // job being registered and its response arriving.\n return {\n fileHandleId,\n fileName: status?.fileName ?? pending?.fileName,\n contentType: status?.contentType ?? pending?.contentType,\n }\n }) ?? pendingAttachments\n\n return (\n <SynapseChatInteraction\n agentAvatar={agentAvatar}\n userAvatar={userAvatar}\n userMessage={userMessage}\n chatResponseText={chatResponse?.responseText}\n chatResponseTrace={traceEvents}\n chatErrorReason={chatError}\n onSendChat={onSendChat}\n scrollIntoView={scrollIntoView}\n animateEntry={animateEntry}\n isAwaitingResponse={isAwaitingResponse}\n attachments={attachments}\n attachmentStatuses={chatResponse?.attachmentStatuses}\n />\n )\n}\n"],"mappings":";;;;;;AAWA,SAAS,EAAc,GAA+B,GAAkB;CACtE,IAAM,CAAC,GAAa,KAAkB,EAAuB,CAAC,CAAC,GAEzD,IAAoB,GAAa,MAA4B;EACjE,GAAe,MACN,CAAC,GAAG,GAAM,GAAG,CAAS,CAC9B;CACH,GAAG,CAAC,CAAC,GAEC,IAAmB,EAAY,GAAG,EAAY,SAAS,CAAC,GACxD,EAAE,MAAM,MAAmB,EAC/B;EACE,OAAO,KAAa;EACpB,oBAAoB,GAAkB;CACxC,GACA;EACW;EACT,iBAAiB;EACjB,6BAA6B;CAC/B,CACF;CAWA,OAVA,QAAgB;EACd,AAAI,KAAkB,EAAe,KAAK,SAAS,MACjD,EAAkB,EAAe,IAAI,GAIrC,QAAQ,MAAM,EAAe,IAAI;CAErC,GAAG,CAAC,GAAmB,CAAc,CAAC,GAE/B,EACL,eACF;AACF;AAqBA,SAAwB,EAAmB,GAAgC;CACzE,IAAM,EACJ,gBACA,cACA,eACA,gBACA,eACA,mBACA,iBACA,uBACA,0BACE,GACE,EAAE,MAAM,MAAmB,EAAuB,CAAS,GAE3D,IAAc,GAAgB,aAC9B,IAAe,GAAgB,cAG/B,IAAY,GAAgB,cAM5B,EAAE,mBAAgB,EAAc,GAFpC,CAAC,CAAC,MACD,CAAC,GAAgB,YAAY,EAAe,YAAY,aACC,GAEtD,IACJ,GAAa,aAAa,KAAI,MAAc;EAC1C,IAAM,IAAe,EAAW,cAC1B,IAAS,GAAc,oBAAoB,MAC/C,MAAK,EAAE,iBAAiB,CAC1B,GACM,IAAU,GAAoB,MAClC,MAAK,EAAE,iBAAiB,CAC1B;EAIA,OAAO;GACL;GACA,UAAU,GAAQ,YAAY,GAAS;GACvC,aAAa,GAAQ,eAAe,GAAS;EAC/C;CACF,CAAC,KAAK;CAER,OACE,kBAAC,GAAD;EACe;EACD;EACC;EACb,kBAAkB,GAAc;EAChC,mBAAmB;EACnB,iBAAiB;EACL;EACI;EACF;EACM;EACP;EACb,oBAAoB,GAAc;CACnC,CAAA;AAEL"}
1
+ {"version":3,"file":"SynapseChatMessage.js","names":[],"sources":["../../../src/components/SynapseChat/SynapseChatMessage.tsx"],"sourcesContent":["import SynapseChatInteraction from '@/components/SynapseChat/SynapseChatInteraction'\nimport usePollAsynchronousJob from '@/synapse-queries/asynchronous/usePollAsynchronousJob'\nimport { useGetChatAgentTraceEvents } from '@/synapse-queries/chat/useChat'\nimport {\n AgentChatRequest,\n AgentChatResponse,\n} from '@sage-bionetworks/synapse-client'\nimport { TraceEvent } from '@sage-bionetworks/synapse-types'\nimport { useCallback, useEffect, useState } from 'react'\nimport { ChatAttachment } from './utils/types'\n\nfunction useTraceEvent(chatJobId: string | undefined, enabled: boolean) {\n const [traceEvents, setTraceEvents] = useState<TraceEvent[]>([])\n\n const appendTraceEvents = useCallback((newEvents: TraceEvent[]) => {\n setTraceEvents(prev => {\n return [...prev, ...newEvents]\n })\n }, [])\n\n const latestTraceEvent = traceEvents.at(traceEvents.length - 1)\n const { data: newTraceEvents } = useGetChatAgentTraceEvents(\n {\n jobId: chatJobId ?? '',\n newerThanTimestamp: latestTraceEvent?.timestamp,\n },\n {\n enabled: enabled,\n refetchInterval: 1000, // Re-fetch every second if enabled\n refetchIntervalInBackground: true, // Continue polling even when the tab is not active\n },\n )\n useEffect(() => {\n if (newTraceEvents && newTraceEvents.page.length > 0) {\n appendTraceEvents(newTraceEvents.page)\n\n // send trace events to the console to ease agent debugging\n // if the trace events do not contain the latest event, add the events to the array\n console.debug(newTraceEvents.page)\n }\n }, [appendTraceEvents, newTraceEvents])\n\n return {\n traceEvents,\n }\n}\n\ntype SynapseChatMessageProps = {\n agentAvatar: React.ReactNode\n userAvatar: React.ReactNode\n /** Known at send time; never re-derived from the polled job so the bubble never renders empty. */\n userMessage: string\n /** Undefined until the async job has been registered for this interaction. */\n chatJobId?: string\n onSendChat?: (message: string) => void\n scrollIntoView?: boolean\n animateEntry?: boolean\n isAwaitingResponse?: boolean\n showLoadingIcon?: boolean\n /**\n * Attachments sent with this message. This information is not available in any API request/response\n * until the job has finished processing, so this prop is used to optimistically render the attachment\n * chips in the message bubble until the response arrives.\n */\n pendingAttachments?: ChatAttachment[]\n}\n\nexport default function SynapseChatMessage(props: SynapseChatMessageProps) {\n const {\n userMessage,\n chatJobId,\n onSendChat,\n agentAvatar,\n userAvatar,\n scrollIntoView,\n animateEntry,\n isAwaitingResponse,\n showLoadingIcon,\n pendingAttachments,\n } = props\n const { data: asyncJobStatus } = usePollAsynchronousJob(chatJobId)\n\n const chatRequest = asyncJobStatus?.requestBody as AgentChatRequest\n const chatResponse = asyncJobStatus?.responseBody as\n | AgentChatResponse\n | undefined\n const chatError = asyncJobStatus?.errorMessage\n\n // enabled if the job has been registered and has not finished processing\n const enableTrace =\n !!chatJobId &&\n (!asyncJobStatus?.jobState || asyncJobStatus.jobState == 'PROCESSING')\n const { traceEvents } = useTraceEvent(chatJobId, enableTrace)\n\n const attachments =\n chatRequest?.attachments?.map(attachment => {\n const fileHandleId = attachment.fileHandleId!\n const status = chatResponse?.attachmentStatuses?.find(\n s => s.fileHandleId === fileHandleId,\n )\n const pending = pendingAttachments?.find(\n a => a.fileHandleId === fileHandleId,\n )\n // Prefer the server-resolved metadata once the job's response arrives. Fall back to what\n // was optimistically sent (`pending`) so the chip doesn't lose its filename between the\n // job being registered and its response arriving.\n return {\n fileHandleId,\n fileName: status?.fileName ?? pending?.fileName,\n contentType: status?.contentType ?? pending?.contentType,\n }\n }) ?? pendingAttachments\n\n return (\n <SynapseChatInteraction\n agentAvatar={agentAvatar}\n userAvatar={userAvatar}\n userMessage={userMessage}\n chatResponseText={chatResponse?.responseText}\n chatResponseTrace={traceEvents}\n chatErrorReason={chatError}\n onSendChat={onSendChat}\n scrollIntoView={scrollIntoView}\n animateEntry={animateEntry}\n isAwaitingResponse={isAwaitingResponse}\n showLoadingIcon={showLoadingIcon}\n attachments={attachments}\n attachmentStatuses={chatResponse?.attachmentStatuses}\n />\n )\n}\n"],"mappings":";;;;;;AAWA,SAAS,EAAc,GAA+B,GAAkB;CACtE,IAAM,CAAC,GAAa,KAAkB,EAAuB,CAAC,CAAC,GAEzD,IAAoB,GAAa,MAA4B;EACjE,GAAe,MACN,CAAC,GAAG,GAAM,GAAG,CAAS,CAC9B;CACH,GAAG,CAAC,CAAC,GAEC,IAAmB,EAAY,GAAG,EAAY,SAAS,CAAC,GACxD,EAAE,MAAM,MAAmB,EAC/B;EACE,OAAO,KAAa;EACpB,oBAAoB,GAAkB;CACxC,GACA;EACW;EACT,iBAAiB;EACjB,6BAA6B;CAC/B,CACF;CAWA,OAVA,QAAgB;EACd,AAAI,KAAkB,EAAe,KAAK,SAAS,MACjD,EAAkB,EAAe,IAAI,GAIrC,QAAQ,MAAM,EAAe,IAAI;CAErC,GAAG,CAAC,GAAmB,CAAc,CAAC,GAE/B,EACL,eACF;AACF;AAsBA,SAAwB,EAAmB,GAAgC;CACzE,IAAM,EACJ,gBACA,cACA,eACA,gBACA,eACA,mBACA,iBACA,uBACA,oBACA,0BACE,GACE,EAAE,MAAM,MAAmB,EAAuB,CAAS,GAE3D,IAAc,GAAgB,aAC9B,IAAe,GAAgB,cAG/B,IAAY,GAAgB,cAM5B,EAAE,mBAAgB,EAAc,GAFpC,CAAC,CAAC,MACD,CAAC,GAAgB,YAAY,EAAe,YAAY,aACC,GAEtD,IACJ,GAAa,aAAa,KAAI,MAAc;EAC1C,IAAM,IAAe,EAAW,cAC1B,IAAS,GAAc,oBAAoB,MAC/C,MAAK,EAAE,iBAAiB,CAC1B,GACM,IAAU,GAAoB,MAClC,MAAK,EAAE,iBAAiB,CAC1B;EAIA,OAAO;GACL;GACA,UAAU,GAAQ,YAAY,GAAS;GACvC,aAAa,GAAQ,eAAe,GAAS;EAC/C;CACF,CAAC,KAAK;CAER,OACE,kBAAC,GAAD;EACe;EACD;EACC;EACb,kBAAkB,GAAc;EAChC,mBAAmB;EACnB,iBAAiB;EACL;EACI;EACF;EACM;EACH;EACJ;EACb,oBAAoB,GAAc;CACnC,CAAA;AAEL"}
@@ -1 +1 @@
1
- {"version":3,"file":"SynapsePortalChatDialog.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseChat/SynapsePortalChatDialog.tsx"],"names":[],"mappings":"AACA,OAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAE7D,MAAM,MAAM,4BAA4B,GAAG,gBAAgB,GAAG;IAC5D,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAAA;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,OAAO,EACP,GAAG,eAAe,EACnB,EAAE,4BAA4B,2CAc9B;AAED,eAAe,uBAAuB,CAAA"}
1
+ {"version":3,"file":"SynapsePortalChatDialog.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseChat/SynapsePortalChatDialog.tsx"],"names":[],"mappings":"AACA,OAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAE7D,MAAM,MAAM,4BAA4B,GAAG,gBAAgB,GAAG;IAC5D,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAAA;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,OAAO,EACP,GAAG,eAAe,EACnB,EAAE,4BAA4B,2CAgB9B;AAED,eAAe,uBAAuB,CAAA"}
@@ -7,12 +7,13 @@ function r({ open: r, onClose: i, ...a }) {
7
7
  open: r,
8
8
  onClose: i,
9
9
  title: a.chatbotName || "SynapseChat",
10
+ variant: a.variant,
10
11
  children: /* @__PURE__ */ n(e, {
11
12
  hideTitle: !0,
12
13
  textboxPositionOffset: "16px",
13
14
  ...a
14
15
  })
15
- });
16
+ }, a.variant);
16
17
  }
17
18
  //#endregion
18
19
  export { r as SynapsePortalChatDialog, r as default };
@@ -1 +1 @@
1
- {"version":3,"file":"SynapsePortalChatDialog.js","names":[],"sources":["../../../src/components/SynapseChat/SynapsePortalChatDialog.tsx"],"sourcesContent":["import DraggableDialog from '../DraggableDialog/DraggableDialog'\nimport SynapseChat, { SynapseChatProps } from './SynapseChat'\n\nexport type SynapsePortalChatDialogProps = SynapseChatProps & {\n open: boolean\n onClose: () => void\n}\n\n/**\n * A dialog that wraps SynapseChat with externally-controlled open/close state.\n * Only shown when the user is logged in and the PORTAL_CHAT feature flag is enabled.\n */\nexport function SynapsePortalChatDialog({\n open,\n onClose,\n ...chatDialogProps\n}: SynapsePortalChatDialogProps) {\n return (\n <DraggableDialog\n open={open}\n onClose={onClose}\n title={chatDialogProps.chatbotName || 'SynapseChat'}\n >\n <SynapseChat\n hideTitle={true}\n textboxPositionOffset=\"16px\"\n {...chatDialogProps}\n />\n </DraggableDialog>\n )\n}\n\nexport default SynapsePortalChatDialog\n"],"mappings":";;;;AAYA,SAAgB,EAAwB,EACtC,SACA,YACA,GAAG,KAC4B;CAC/B,OACE,kBAAC,GAAD;EACQ;EACG;EACT,OAAO,EAAgB,eAAe;YAEtC,kBAAC,GAAD;GACE,WAAW;GACX,uBAAsB;GACtB,GAAI;EACL,CAAA;CACc,CAAA;AAErB"}
1
+ {"version":3,"file":"SynapsePortalChatDialog.js","names":[],"sources":["../../../src/components/SynapseChat/SynapsePortalChatDialog.tsx"],"sourcesContent":["import DraggableDialog from '../DraggableDialog/DraggableDialog'\nimport SynapseChat, { SynapseChatProps } from './SynapseChat'\n\nexport type SynapsePortalChatDialogProps = SynapseChatProps & {\n open: boolean\n onClose: () => void\n}\n\n/**\n * A dialog that wraps SynapseChat with externally-controlled open/close state.\n * Only shown when the user is logged in and the PORTAL_CHAT feature flag is enabled.\n */\nexport function SynapsePortalChatDialog({\n open,\n onClose,\n ...chatDialogProps\n}: SynapsePortalChatDialogProps) {\n return (\n <DraggableDialog\n key={chatDialogProps.variant}\n open={open}\n onClose={onClose}\n title={chatDialogProps.chatbotName || 'SynapseChat'}\n variant={chatDialogProps.variant}\n >\n <SynapseChat\n hideTitle={true}\n textboxPositionOffset=\"16px\"\n {...chatDialogProps}\n />\n </DraggableDialog>\n )\n}\n\nexport default SynapsePortalChatDialog\n"],"mappings":";;;;AAYA,SAAgB,EAAwB,EACtC,SACA,YACA,GAAG,KAC4B;CAC/B,OACE,kBAAC,GAAD;EAEQ;EACG;EACT,OAAO,EAAgB,eAAe;EACtC,SAAS,EAAgB;YAEzB,kBAAC,GAAD;GACE,WAAW;GACX,uBAAsB;GACtB,GAAI;EACL,CAAA;CACc,GAXV,EAAgB,OAWN;AAErB"}
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseTable.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseTable/SynapseTable.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,GAAG,EACH,MAAM,EAEP,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAEL,SAAS,EAKV,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAyBvD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,cAAc,GACzB,MAAM,CAuBR;AAED,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,iBAAiB,EACf,kBAAkB,GAClB,wBAAwB,GACxB,wBAAwB,GACxB,oBAAoB,GACpB,cAAc,GACd,0BAA0B,GAC1B,6BAA6B,GAC7B,aAAa,GACb,eAAe,CAClB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,gBAAgB,EAAE,OAAO,CAAA;IACzB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAA;IACrC,2JAA2J;IAC3J,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;;;;;OAOG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,kDAAkD;IAClD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,2JAA2J;IAC3J,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,8DAA8D;IAC9D,2BAA2B,CAAC,EAAE,OAAO,CAAA;IACrC,yFAAyF;IACzF,WAAW,CAAC,EAAE,eAAe,CAAA;CAC9B,CAAA;AAID,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CA2MpD"}
1
+ {"version":3,"file":"SynapseTable.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseTable/SynapseTable.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,GAAG,EACH,MAAM,EAEP,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAEL,SAAS,EAKV,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAyBvD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,cAAc,GACzB,MAAM,CAuBR;AAED,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,iBAAiB,EACf,kBAAkB,GAClB,wBAAwB,GACxB,wBAAwB,GACxB,oBAAoB,GACpB,cAAc,GACd,0BAA0B,GAC1B,6BAA6B,GAC7B,aAAa,GACb,eAAe,CAClB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,gBAAgB,EAAE,OAAO,CAAA;IACzB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAA;IACrC,2JAA2J;IAC3J,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;;;;;OAOG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,kDAAkD;IAClD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,2JAA2J;IAC3J,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,8DAA8D;IAC9D,2BAA2B,CAAC,EAAE,OAAO,CAAA;IACrC,yFAAyF;IACzF,WAAW,CAAC,EAAE,eAAe,CAAA;CAC9B,CAAA;AAID,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CA4MpD"}
@@ -123,7 +123,8 @@ function w(S) {
123
123
  },
124
124
  table: ve,
125
125
  fullWidth: !1,
126
- autoColumnSizing: !0
126
+ autoColumnSizing: !0,
127
+ showTopScrollbar: !0
127
128
  })] })
128
129
  }) : /* @__PURE__ */ v(_, {});
129
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseTable.js","names":[],"sources":["../../../src/components/SynapseTable/SynapseTable.tsx"],"sourcesContent":["import { useGetEntity } from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils'\nimport {\n ColumnTypeEnum,\n Row,\n RowSet,\n Table,\n} from '@sage-bionetworks/synapse-types'\nimport {\n Cell,\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n VisibilityState,\n} from '@tanstack/react-table'\nimport { useAtomValue } from 'jotai'\nimport { useMemo, useState } from 'react'\nimport { LabelLinkConfig } from '../CardContainerLogic'\nimport ModalDownload from '../ModalDownload/ModalDownload'\nimport { useQueryContext } from '../QueryContext'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport { isRowSelectionVisibleAtom } from '../QueryWrapper/TableRowSelectionState'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport { SynapseTableContext } from './SynapseTableContext'\nimport {\n accessColumn,\n addToDownloadListColumn,\n directDownloadColumn,\n rowSelectionColumn,\n TableDataCell,\n TableDataColumnHeader,\n} from './SynapseTableRenderers'\nimport {\n isEntityViewOrDatasetOrCollection,\n isFileViewOrDataset,\n isSortableColumn,\n} from './SynapseTableUtils'\nimport { usePrefetchResourcesInTable } from './usePrefetchTableData'\nimport { useTableSort } from './useTableSort'\n\nconst DEFAULT_CUSTOM_COLUMNS: ColumnDef<Row, any>[] = []\n\n/**\n * Returns the minimum column width (in px) for a Synapse table column\n * based on its type and name.\n */\nexport function getColumnMinSize(\n columnName: string,\n columnType: ColumnTypeEnum,\n): number {\n const nameLower = columnName.toLowerCase()\n if (nameLower.includes('name') || nameLower.includes('description')) {\n return 250\n }\n switch (columnType) {\n case ColumnTypeEnum.ENTITYID:\n case ColumnTypeEnum.ENTITYID_LIST:\n case ColumnTypeEnum.USERID:\n case ColumnTypeEnum.USERID_LIST:\n case ColumnTypeEnum.FILEHANDLEID:\n case ColumnTypeEnum.EVALUATIONID:\n case ColumnTypeEnum.SUBMISSIONID:\n return 180\n case ColumnTypeEnum.DATE:\n case ColumnTypeEnum.DATE_LIST:\n return 120\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.STRING_LIST:\n return 100\n default:\n return 60\n }\n}\n\nexport type SynapseTableConfiguration = Pick<\n SynapseTableProps,\n | 'showAccessColumn'\n | 'showExternalAccessIcon'\n | 'showAccessColumnHeader'\n | 'showDownloadColumn'\n | 'hideDownload'\n | 'showDirectDownloadColumn'\n | 'hideAddToDownloadListColumn'\n | 'columnLinks'\n | 'customColumns'\n>\n\nexport type SynapseTableProps = {\n /** The row data shown in the table. */\n rowSet: RowSet\n /** Whether a new page of data is being loaded */\n isLoadingNewPage: boolean\n /** Custom columns to render in the table */\n customColumns?: ColumnDef<Row, any>[]\n /** If true and entity is a view or dataset, renders a column that represents if the caller has permission to download the entity represented by the row */\n showAccessColumn?: boolean\n /**\n * If true, the component will show enhanced UI for the case where\n * - the entity is a FileEntity, AND\n * - the caller has permission to fetch the dataFileHandle, AND\n * - the dataFileHandle is an instance of ExternalFileHandleInterface (i.e. the file is not controlled by Synapse)\n * Note that this requires an additional API call that cannot be batched, so it should be avoided in bulk contexts if possible.\n * @default false\n */\n showExternalAccessIcon?: boolean\n showAccessColumnHeader?: boolean\n /** @deprecated use showDirectDownloadColumn */\n showDownloadColumn?: boolean\n /** @deprecated use hideAddToDownloadListColumn */\n hideDownload?: boolean\n /** If true and entity is a file view or dataset, renders a column that allows the logged-in user to directly download the file, if they have permission */\n showDirectDownloadColumn?: boolean\n /** If true, the add to download list column will be hidden */\n hideAddToDownloadListColumn?: boolean\n /** Configuration to override cell renderers with e.g. a link to a portals detail page */\n columnLinks?: LabelLinkConfig\n}\n\nconst columnHelper = createColumnHelper<Row>()\n\nexport function SynapseTable(props: SynapseTableProps) {\n const { showDownloadColumn, hideDownload } = props\n const {\n rowSet,\n isLoadingNewPage,\n customColumns = DEFAULT_CUSTOM_COLUMNS,\n showAccessColumn,\n showExternalAccessIcon,\n showAccessColumnHeader,\n showDirectDownloadColumn = showDownloadColumn,\n hideAddToDownloadListColumn = hideDownload,\n columnLinks,\n } = props\n const {\n entityId,\n versionNumber,\n getCurrentQueryRequest,\n fileIdColumnName,\n fileVersionColumnName,\n } = useQueryContext()\n const queryRequest = useMemo(\n () => getCurrentQueryRequest(),\n [getCurrentQueryRequest],\n )\n\n const selectColumns = rowSet.headers\n\n const { data: entity } = useGetEntity<Table>(entityId, versionNumber)\n\n const { columnsToShowInTable, NoContentPlaceholder } =\n useQueryVisualizationContext()\n const synapseTableContext = useMemo(\n () => ({\n columnLinks,\n showExternalAccessIcon,\n }),\n [columnLinks, showExternalAccessIcon],\n )\n const { isAuthenticated } = useSynapseContext()\n\n const [isExportTableDownloadOpen, setIsExportTableDownloadOpen] =\n useState(false)\n\n const { sort, setSort } = useTableSort()\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n\n const isShowingAccessColumn: boolean = Boolean(\n showAccessColumn &&\n entity &&\n ((isEntityViewOrDatasetOrCollection(entity) && allRowsHaveId(rowSet)) ||\n fileIdColumnName),\n )\n const rowsAreDownloadable =\n entity &&\n isAuthenticated &&\n ((isFileViewOrDataset(entity) && allRowsHaveId(rowSet)) || fileIdColumnName)\n\n const isShowingDirectDownloadColumn = Boolean(\n rowsAreDownloadable && showDirectDownloadColumn,\n )\n\n const isShowingAddToV2DownloadListColumn: boolean = Boolean(\n rowsAreDownloadable &&\n !hideAddToDownloadListColumn &&\n !isRowSelectionVisible,\n )\n const rowEntityIDColumnIndex = fileIdColumnName\n ? rowSet.headers.findIndex(col => col.name == fileIdColumnName)\n : undefined\n const rowEntityVersionColumnIndex = fileVersionColumnName\n ? rowSet.headers.findIndex(col => col.name == fileVersionColumnName)\n : undefined\n\n const columns = useMemo(\n () => [\n ...customColumns,\n rowSelectionColumn,\n addToDownloadListColumn,\n directDownloadColumn,\n {\n ...accessColumn,\n header: showAccessColumn && showAccessColumnHeader ? 'Access' : '',\n },\n ...(selectColumns.map((selectColumn, index) => {\n return columnHelper.accessor(row => row.values[index], {\n id: selectColumn.name,\n enableSorting: isSortableColumn(selectColumn.columnType),\n enableResizing: true,\n minSize: getColumnMinSize(\n selectColumn.name,\n selectColumn.columnType as ColumnTypeEnum,\n ),\n header: TableDataColumnHeader,\n cell: TableDataCell,\n })\n }) ?? []),\n ],\n [customColumns, selectColumns, showAccessColumn, showAccessColumnHeader],\n )\n\n const prependColumnVisibility: VisibilityState = useMemo(\n () => ({\n [rowSelectionColumn.id as string]: isRowSelectionVisible,\n [addToDownloadListColumn.id as string]:\n isShowingAddToV2DownloadListColumn,\n [directDownloadColumn.id as string]: isShowingDirectDownloadColumn,\n [accessColumn.id as string]: isShowingAccessColumn,\n }),\n [\n isRowSelectionVisible,\n isShowingAccessColumn,\n isShowingAddToV2DownloadListColumn,\n isShowingDirectDownloadColumn,\n ],\n )\n\n // Transform our `columnsToShowInTable` to @tanstack/react-table's `VisibilityState`\n const columnVisibility: VisibilityState = useMemo(\n () =>\n selectColumns.reduce((prev: VisibilityState, curr) => {\n return {\n ...prev,\n [curr.name]: columnsToShowInTable.includes(curr.name),\n }\n }, prependColumnVisibility),\n [columnsToShowInTable, selectColumns, prependColumnVisibility],\n )\n\n const { dataHasBeenPrefetched } = usePrefetchResourcesInTable(rowSet)\n const renderTableDataPlaceholder = isLoadingNewPage || !dataHasBeenPrefetched\n\n const table = useReactTable({\n data: rowSet.rows,\n columns,\n defaultColumn: { minSize: 60 },\n getCoreRowModel: getCoreRowModel(),\n manualSorting: true,\n manualFiltering: true,\n onSortingChange: setSort,\n enableMultiSort: true,\n columnResizeMode: 'onChange',\n state: {\n sorting: sort,\n columnVisibility: columnVisibility,\n },\n meta: {\n rowSet,\n // make the rowEntityIDColumnIndex available to all cell renderers\n rowEntityIDColumnIndex,\n rowEntityVersionColumnIndex,\n renderPlaceholderData: renderTableDataPlaceholder,\n getWrapInExpandableTd: (cell: Cell<Row, unknown>) => {\n const selectColumn = selectColumns.find(\n cm => cm.name === cell.column.id,\n )\n return Boolean(\n selectColumn &&\n /* JSON handles its own overflow*/\n selectColumn.columnType !== ColumnTypeEnum.JSON,\n )\n },\n },\n })\n\n /**\n * Display the view\n */\n if (!rowSet) {\n return <></>\n }\n const hasResults = (rowSet.rows?.length ?? 0) > 0\n // Show the No Results UI if the current page has no rows, and this is the first page of data (offset === 0 or null/undefined).\n if (\n !hasResults &&\n (queryRequest.query.offset === 0 || queryRequest.query.offset == null)\n ) {\n return <NoContentPlaceholder />\n }\n\n return (\n <SynapseTableContext.Provider value={synapseTableContext}>\n <div>\n {isExportTableDownloadOpen && (\n <ModalDownload\n onClose={() => {\n setIsExportTableDownloadOpen(false)\n }}\n queryBundleRequest={queryRequest}\n />\n )}\n <StyledTanStackTable\n styledTableContainerProps={{\n className: 'SynapseTable',\n ['data-testid']: 'SynapseTable',\n density: 'default',\n }}\n table={table}\n fullWidth={false}\n autoColumnSizing={true}\n />\n </div>\n </SynapseTableContext.Provider>\n )\n}\n\n/**\n * If this is a view/dataset and rows have an ID, then rows represent individual objects in Synapse.\n * Presence of row IDs also indicates that the query is also necessarily not summary data, e.g. the query does\n * not include an operation like GROUP BY, DISTINCT, etc., that would cause rows to not map 1:1 to Synapse Entities\n */\nfunction allRowsHaveId(rowSet: RowSet): boolean {\n return Boolean(rowSet.rows?.every(row => !!row.rowId))\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SynapseTable.js","names":[],"sources":["../../../src/components/SynapseTable/SynapseTable.tsx"],"sourcesContent":["import { useGetEntity } from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils'\nimport {\n ColumnTypeEnum,\n Row,\n RowSet,\n Table,\n} from '@sage-bionetworks/synapse-types'\nimport {\n Cell,\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n VisibilityState,\n} from '@tanstack/react-table'\nimport { useAtomValue } from 'jotai'\nimport { useMemo, useState } from 'react'\nimport { LabelLinkConfig } from '../CardContainerLogic'\nimport ModalDownload from '../ModalDownload/ModalDownload'\nimport { useQueryContext } from '../QueryContext'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport { isRowSelectionVisibleAtom } from '../QueryWrapper/TableRowSelectionState'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport { SynapseTableContext } from './SynapseTableContext'\nimport {\n accessColumn,\n addToDownloadListColumn,\n directDownloadColumn,\n rowSelectionColumn,\n TableDataCell,\n TableDataColumnHeader,\n} from './SynapseTableRenderers'\nimport {\n isEntityViewOrDatasetOrCollection,\n isFileViewOrDataset,\n isSortableColumn,\n} from './SynapseTableUtils'\nimport { usePrefetchResourcesInTable } from './usePrefetchTableData'\nimport { useTableSort } from './useTableSort'\n\nconst DEFAULT_CUSTOM_COLUMNS: ColumnDef<Row, any>[] = []\n\n/**\n * Returns the minimum column width (in px) for a Synapse table column\n * based on its type and name.\n */\nexport function getColumnMinSize(\n columnName: string,\n columnType: ColumnTypeEnum,\n): number {\n const nameLower = columnName.toLowerCase()\n if (nameLower.includes('name') || nameLower.includes('description')) {\n return 250\n }\n switch (columnType) {\n case ColumnTypeEnum.ENTITYID:\n case ColumnTypeEnum.ENTITYID_LIST:\n case ColumnTypeEnum.USERID:\n case ColumnTypeEnum.USERID_LIST:\n case ColumnTypeEnum.FILEHANDLEID:\n case ColumnTypeEnum.EVALUATIONID:\n case ColumnTypeEnum.SUBMISSIONID:\n return 180\n case ColumnTypeEnum.DATE:\n case ColumnTypeEnum.DATE_LIST:\n return 120\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.STRING_LIST:\n return 100\n default:\n return 60\n }\n}\n\nexport type SynapseTableConfiguration = Pick<\n SynapseTableProps,\n | 'showAccessColumn'\n | 'showExternalAccessIcon'\n | 'showAccessColumnHeader'\n | 'showDownloadColumn'\n | 'hideDownload'\n | 'showDirectDownloadColumn'\n | 'hideAddToDownloadListColumn'\n | 'columnLinks'\n | 'customColumns'\n>\n\nexport type SynapseTableProps = {\n /** The row data shown in the table. */\n rowSet: RowSet\n /** Whether a new page of data is being loaded */\n isLoadingNewPage: boolean\n /** Custom columns to render in the table */\n customColumns?: ColumnDef<Row, any>[]\n /** If true and entity is a view or dataset, renders a column that represents if the caller has permission to download the entity represented by the row */\n showAccessColumn?: boolean\n /**\n * If true, the component will show enhanced UI for the case where\n * - the entity is a FileEntity, AND\n * - the caller has permission to fetch the dataFileHandle, AND\n * - the dataFileHandle is an instance of ExternalFileHandleInterface (i.e. the file is not controlled by Synapse)\n * Note that this requires an additional API call that cannot be batched, so it should be avoided in bulk contexts if possible.\n * @default false\n */\n showExternalAccessIcon?: boolean\n showAccessColumnHeader?: boolean\n /** @deprecated use showDirectDownloadColumn */\n showDownloadColumn?: boolean\n /** @deprecated use hideAddToDownloadListColumn */\n hideDownload?: boolean\n /** If true and entity is a file view or dataset, renders a column that allows the logged-in user to directly download the file, if they have permission */\n showDirectDownloadColumn?: boolean\n /** If true, the add to download list column will be hidden */\n hideAddToDownloadListColumn?: boolean\n /** Configuration to override cell renderers with e.g. a link to a portals detail page */\n columnLinks?: LabelLinkConfig\n}\n\nconst columnHelper = createColumnHelper<Row>()\n\nexport function SynapseTable(props: SynapseTableProps) {\n const { showDownloadColumn, hideDownload } = props\n const {\n rowSet,\n isLoadingNewPage,\n customColumns = DEFAULT_CUSTOM_COLUMNS,\n showAccessColumn,\n showExternalAccessIcon,\n showAccessColumnHeader,\n showDirectDownloadColumn = showDownloadColumn,\n hideAddToDownloadListColumn = hideDownload,\n columnLinks,\n } = props\n const {\n entityId,\n versionNumber,\n getCurrentQueryRequest,\n fileIdColumnName,\n fileVersionColumnName,\n } = useQueryContext()\n const queryRequest = useMemo(\n () => getCurrentQueryRequest(),\n [getCurrentQueryRequest],\n )\n\n const selectColumns = rowSet.headers\n\n const { data: entity } = useGetEntity<Table>(entityId, versionNumber)\n\n const { columnsToShowInTable, NoContentPlaceholder } =\n useQueryVisualizationContext()\n const synapseTableContext = useMemo(\n () => ({\n columnLinks,\n showExternalAccessIcon,\n }),\n [columnLinks, showExternalAccessIcon],\n )\n const { isAuthenticated } = useSynapseContext()\n\n const [isExportTableDownloadOpen, setIsExportTableDownloadOpen] =\n useState(false)\n\n const { sort, setSort } = useTableSort()\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n\n const isShowingAccessColumn: boolean = Boolean(\n showAccessColumn &&\n entity &&\n ((isEntityViewOrDatasetOrCollection(entity) && allRowsHaveId(rowSet)) ||\n fileIdColumnName),\n )\n const rowsAreDownloadable =\n entity &&\n isAuthenticated &&\n ((isFileViewOrDataset(entity) && allRowsHaveId(rowSet)) || fileIdColumnName)\n\n const isShowingDirectDownloadColumn = Boolean(\n rowsAreDownloadable && showDirectDownloadColumn,\n )\n\n const isShowingAddToV2DownloadListColumn: boolean = Boolean(\n rowsAreDownloadable &&\n !hideAddToDownloadListColumn &&\n !isRowSelectionVisible,\n )\n const rowEntityIDColumnIndex = fileIdColumnName\n ? rowSet.headers.findIndex(col => col.name == fileIdColumnName)\n : undefined\n const rowEntityVersionColumnIndex = fileVersionColumnName\n ? rowSet.headers.findIndex(col => col.name == fileVersionColumnName)\n : undefined\n\n const columns = useMemo(\n () => [\n ...customColumns,\n rowSelectionColumn,\n addToDownloadListColumn,\n directDownloadColumn,\n {\n ...accessColumn,\n header: showAccessColumn && showAccessColumnHeader ? 'Access' : '',\n },\n ...(selectColumns.map((selectColumn, index) => {\n return columnHelper.accessor(row => row.values[index], {\n id: selectColumn.name,\n enableSorting: isSortableColumn(selectColumn.columnType),\n enableResizing: true,\n minSize: getColumnMinSize(\n selectColumn.name,\n selectColumn.columnType as ColumnTypeEnum,\n ),\n header: TableDataColumnHeader,\n cell: TableDataCell,\n })\n }) ?? []),\n ],\n [customColumns, selectColumns, showAccessColumn, showAccessColumnHeader],\n )\n\n const prependColumnVisibility: VisibilityState = useMemo(\n () => ({\n [rowSelectionColumn.id as string]: isRowSelectionVisible,\n [addToDownloadListColumn.id as string]:\n isShowingAddToV2DownloadListColumn,\n [directDownloadColumn.id as string]: isShowingDirectDownloadColumn,\n [accessColumn.id as string]: isShowingAccessColumn,\n }),\n [\n isRowSelectionVisible,\n isShowingAccessColumn,\n isShowingAddToV2DownloadListColumn,\n isShowingDirectDownloadColumn,\n ],\n )\n\n // Transform our `columnsToShowInTable` to @tanstack/react-table's `VisibilityState`\n const columnVisibility: VisibilityState = useMemo(\n () =>\n selectColumns.reduce((prev: VisibilityState, curr) => {\n return {\n ...prev,\n [curr.name]: columnsToShowInTable.includes(curr.name),\n }\n }, prependColumnVisibility),\n [columnsToShowInTable, selectColumns, prependColumnVisibility],\n )\n\n const { dataHasBeenPrefetched } = usePrefetchResourcesInTable(rowSet)\n const renderTableDataPlaceholder = isLoadingNewPage || !dataHasBeenPrefetched\n\n const table = useReactTable({\n data: rowSet.rows,\n columns,\n defaultColumn: { minSize: 60 },\n getCoreRowModel: getCoreRowModel(),\n manualSorting: true,\n manualFiltering: true,\n onSortingChange: setSort,\n enableMultiSort: true,\n columnResizeMode: 'onChange',\n state: {\n sorting: sort,\n columnVisibility: columnVisibility,\n },\n meta: {\n rowSet,\n // make the rowEntityIDColumnIndex available to all cell renderers\n rowEntityIDColumnIndex,\n rowEntityVersionColumnIndex,\n renderPlaceholderData: renderTableDataPlaceholder,\n getWrapInExpandableTd: (cell: Cell<Row, unknown>) => {\n const selectColumn = selectColumns.find(\n cm => cm.name === cell.column.id,\n )\n return Boolean(\n selectColumn &&\n /* JSON handles its own overflow*/\n selectColumn.columnType !== ColumnTypeEnum.JSON,\n )\n },\n },\n })\n\n /**\n * Display the view\n */\n if (!rowSet) {\n return <></>\n }\n const hasResults = (rowSet.rows?.length ?? 0) > 0\n // Show the No Results UI if the current page has no rows, and this is the first page of data (offset === 0 or null/undefined).\n if (\n !hasResults &&\n (queryRequest.query.offset === 0 || queryRequest.query.offset == null)\n ) {\n return <NoContentPlaceholder />\n }\n\n return (\n <SynapseTableContext.Provider value={synapseTableContext}>\n <div>\n {isExportTableDownloadOpen && (\n <ModalDownload\n onClose={() => {\n setIsExportTableDownloadOpen(false)\n }}\n queryBundleRequest={queryRequest}\n />\n )}\n <StyledTanStackTable\n styledTableContainerProps={{\n className: 'SynapseTable',\n ['data-testid']: 'SynapseTable',\n density: 'default',\n }}\n table={table}\n fullWidth={false}\n autoColumnSizing={true}\n showTopScrollbar={true}\n />\n </div>\n </SynapseTableContext.Provider>\n )\n}\n\n/**\n * If this is a view/dataset and rows have an ID, then rows represent individual objects in Synapse.\n * Presence of row IDs also indicates that the query is also necessarily not summary data, e.g. the query does\n * not include an operation like GROUP BY, DISTINCT, etc., that would cause rows to not map 1:1 to Synapse Entities\n */\nfunction allRowsHaveId(rowSet: RowSet): boolean {\n return Boolean(rowSet.rows?.every(row => !!row.rowId))\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExternalPlatformActionsRequiredPrecheck.d.ts","sourceRoot":"","sources":["../../../../src/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,eAAe,CAAA;AAgBvD,OAAO,EAEL,wBAAwB,EACzB,MAAM,sCAAsC,CAAA;AAc7C,MAAM,MAAM,4CAA4C,GAAG;IAEzD,gBAAgB,EAAE,wBAAwB,CAAA;IAE1C,0BAA0B,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;IAExD,kBAAkB,EAAE,MAAM,IAAI,CAAA;CAC/B,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,uCAAuC,CAC7D,KAAK,EAAE,4CAA4C,2CAgJpD"}
1
+ {"version":3,"file":"ExternalPlatformActionsRequiredPrecheck.d.ts","sourceRoot":"","sources":["../../../../src/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,eAAe,CAAA;AAgBvD,OAAO,EAEL,wBAAwB,EACzB,MAAM,sCAAsC,CAAA;AAc7C,MAAM,MAAM,4CAA4C,GAAG;IAEzD,gBAAgB,EAAE,wBAAwB,CAAA;IAE1C,0BAA0B,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;IAExD,kBAAkB,EAAE,MAAM,IAAI,CAAA;CAC/B,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,uCAAuC,CAC7D,KAAK,EAAE,4CAA4C,2CA8IpD"}
@@ -20,66 +20,66 @@ function x(e) {
20
20
  return `SendTo${g(e.replace("\\s", ""))}ButtonFromConfirmationDialog`;
21
21
  }
22
22
  function S(g) {
23
- let { selectedPlatform: S, onConfirmButtonPropsChange: C, onSuccessfulExport: w } = g, T = c[S], { getCurrentQueryRequest: E, onViewSharingSettingsClicked: D, hasResettableFilters: O, fileIdColumnName: k, fileVersionColumnName: A, fileNameColumnName: j } = t(), { data: M, isLoading: N } = n(), P = o(), F = a(), I = i(), { unitDescription: L } = r(), [R, z] = h(void 0), B = m(() => {
23
+ let { selectedPlatform: S, onConfirmButtonPropsChange: C, onSuccessfulExport: w } = g, T = c[S], { getCurrentQueryRequest: E, hasResettableFilters: D, fileIdColumnName: O, fileVersionColumnName: k, fileNameColumnName: A } = t(), { data: j, isLoading: M } = n(), N = o(), P = a(), F = i(), { unitDescription: I } = r(), [L, R] = h(void 0), z = m(() => {
24
24
  let e = E();
25
- return I && F && M?.selectColumns && (e.query.additionalFilters = [...e.query.additionalFilters || [], s(F, P, M.selectColumns)]), e;
25
+ return F && P && j?.selectColumns && (e.query.additionalFilters = [...e.query.additionalFilters || [], s(P, N, j.selectColumns)]), e;
26
26
  }, [
27
27
  E,
28
- I,
29
28
  F,
30
- M?.selectColumns,
31
- P
32
- ]), { exportToCavatica: V, exportToTerra: H, exportToPluto: U, exportToPlutoDev: W, exportToADWorkbench: G } = l({
33
- queryBundleRequest: B,
34
- selectColumns: M?.selectColumns,
35
- fileIdColumnName: k,
36
- fileVersionColumnName: A,
37
- fileNameColumnName: j
38
- }), K = `Send ${d(O, I, P, M?.queryCount, L)} to ${T.name}`, q = f(async () => {
29
+ P,
30
+ j?.selectColumns,
31
+ N
32
+ ]), { exportToCavatica: B, exportToTerra: V, exportToPluto: H, exportToPlutoDev: U, exportToADWorkbench: W } = l({
33
+ queryBundleRequest: z,
34
+ selectColumns: j?.selectColumns,
35
+ fileIdColumnName: O,
36
+ fileVersionColumnName: k,
37
+ fileNameColumnName: A
38
+ }), G = `Send ${d(D, F, N, j?.queryCount, I)} to ${T.name}`, K = f(async () => {
39
39
  switch (S) {
40
40
  case "cavatica":
41
- await V();
41
+ await B();
42
42
  break;
43
43
  case "terra":
44
- await H();
44
+ await V();
45
45
  break;
46
46
  case "pluto":
47
- await U();
47
+ await H();
48
48
  break;
49
49
  case "plutodev":
50
- await W();
50
+ await U();
51
51
  break;
52
52
  case "adworkbench":
53
- await G();
53
+ await W();
54
54
  break;
55
55
  }
56
56
  w();
57
57
  }, [
58
+ B,
58
59
  V,
59
60
  H,
60
61
  U,
61
- W,
62
62
  w,
63
63
  S,
64
- G
64
+ W
65
65
  ]);
66
66
  return p(() => {
67
67
  C({
68
68
  id: x(S),
69
- children: K,
70
- disabled: N || R !== 0,
69
+ children: G,
70
+ disabled: M || L !== 0,
71
71
  onClick: () => {
72
- q();
72
+ K();
73
73
  }
74
74
  });
75
75
  }, [
76
- R,
76
+ L,
77
+ G,
78
+ M,
77
79
  K,
78
- N,
79
- q,
80
80
  C,
81
81
  S
82
- ]), N ? /* @__PURE__ */ y(e, { numRows: 4 }) : /* @__PURE__ */ b(v, { children: [
82
+ ]), M ? /* @__PURE__ */ y(e, { numRows: 4 }) : /* @__PURE__ */ b(v, { children: [
83
83
  /* @__PURE__ */ b(_, {
84
84
  variant: "body1",
85
85
  sx: {
@@ -103,10 +103,9 @@ function S(g) {
103
103
  ]
104
104
  }),
105
105
  /* @__PURE__ */ y(u, {
106
- queryBundleRequest: B,
107
- columnModels: M?.columnModels ?? [],
108
- onNumberOfRequiredActionsChanged: z,
109
- onViewSharingSettingsClicked: D
106
+ queryBundleRequest: z,
107
+ columnModels: j?.columnModels ?? [],
108
+ onNumberOfRequiredActionsChanged: R
110
109
  }),
111
110
  /* @__PURE__ */ b(_, {
112
111
  variant: "body1",
@@ -1 +1 @@
1
- {"version":3,"file":"ExternalPlatformActionsRequiredPrecheck.js","names":[],"sources":["../../../../src/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.tsx"],"sourcesContent":["import { ButtonProps, Typography } from '@mui/material'\nimport { upperFirst } from 'lodash-es'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useExportTableQueryToAnalysisPlatform } from '../../../synapse-queries/entity/useExportTableQueryToAnalysisPlatform'\nimport { getPrimaryKeyINFilter } from '../../../utils/functions/QueryFilterUtils'\nimport { TableQueryActionsRequired } from '../../DownloadCart/TableQueryActionsRequired'\nimport { useQueryContext } from '../../QueryContext'\nimport { useQueryVisualizationContext } from '../../QueryVisualizationWrapper/index'\nimport {\n useHasSelectedRowsAtomValue,\n useRowSelectionPrimaryKeyAtomValue,\n useSelectedRowsAtomValue,\n} from '../../QueryWrapper/TableRowSelectionState'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport { SkeletonParagraph } from '../../Skeleton/index'\nimport { getNumberOfResultsToInvokeActionCopy } from '../TopLevelControls/TopLevelControlsUtils'\nimport {\n EXTERNAL_ANALYSIS_PLATFORMS,\n ExternalAnalysisPlatform,\n} from './ExternalAnalysisPlatformsConstants'\n\n/**\n * Get the ID of the confirm button for the selected platform, used in Google Tag Manager\n * @param selectedPlatform\n */\nfunction getConfirmButtonId(\n selectedPlatform: ExternalAnalysisPlatform,\n): string {\n return `SendTo${upperFirst(\n selectedPlatform.replace('\\\\s', ''),\n )}ButtonFromConfirmationDialog`\n}\n\nexport type ExternalPlatformActionsRequiredPrecheckProps = {\n /* The external analysis platform that the user selected */\n selectedPlatform: ExternalAnalysisPlatform\n /* Callback to propagate the current confirm button appearance and behavior */\n onConfirmButtonPropsChange: (props: ButtonProps) => void\n /* Callback invoked when export to the external platform succeeds */\n onSuccessfulExport: () => void\n}\n\nexport default function ExternalPlatformActionsRequiredPrecheck(\n props: ExternalPlatformActionsRequiredPrecheckProps,\n) {\n const { selectedPlatform, onConfirmButtonPropsChange, onSuccessfulExport } =\n props\n const platform = EXTERNAL_ANALYSIS_PLATFORMS[selectedPlatform]\n\n const {\n getCurrentQueryRequest,\n onViewSharingSettingsClicked,\n hasResettableFilters,\n fileIdColumnName,\n fileVersionColumnName,\n fileNameColumnName,\n } = useQueryContext()\n\n const { data: queryMetadata, isLoading } = useGetQueryMetadata()\n const selectedRows = useSelectedRowsAtomValue()\n const rowSelectionPrimaryKey = useRowSelectionPrimaryKeyAtomValue()\n const hasSelectedRows = useHasSelectedRowsAtomValue()\n\n const { unitDescription } = useQueryVisualizationContext()\n\n const [numberOfRequiredActions, setNumberOfRequiredActions] = useState<\n number | undefined\n >(undefined)\n\n const queryFilteredBySelection = useMemo(() => {\n const request = getCurrentQueryRequest()\n if (\n hasSelectedRows &&\n rowSelectionPrimaryKey &&\n queryMetadata?.selectColumns\n ) {\n request.query.additionalFilters = [\n ...(request.query.additionalFilters || []),\n getPrimaryKeyINFilter(\n rowSelectionPrimaryKey,\n selectedRows,\n queryMetadata.selectColumns,\n ),\n ]\n }\n return request\n }, [\n getCurrentQueryRequest,\n hasSelectedRows,\n rowSelectionPrimaryKey,\n queryMetadata?.selectColumns,\n selectedRows,\n ])\n\n const {\n exportToCavatica,\n exportToTerra,\n exportToPluto,\n exportToPlutoDev,\n exportToADWorkbench,\n } = useExportTableQueryToAnalysisPlatform({\n queryBundleRequest: queryFilteredBySelection,\n selectColumns: queryMetadata?.selectColumns,\n fileIdColumnName,\n fileVersionColumnName,\n fileNameColumnName,\n })\n\n const confirmButtonText = `Send ${getNumberOfResultsToInvokeActionCopy(\n hasResettableFilters,\n hasSelectedRows,\n selectedRows,\n queryMetadata?.queryCount,\n unitDescription,\n )} to ${platform.name}`\n\n const onConfirmButtonClick = useCallback(async () => {\n switch (selectedPlatform) {\n case 'cavatica':\n await exportToCavatica()\n break\n case 'terra':\n await exportToTerra()\n break\n case 'pluto':\n await exportToPluto()\n break\n case 'plutodev':\n await exportToPlutoDev()\n break\n case 'adworkbench':\n await exportToADWorkbench()\n break\n }\n onSuccessfulExport()\n }, [\n exportToCavatica,\n exportToTerra,\n exportToPluto,\n exportToPlutoDev,\n onSuccessfulExport,\n selectedPlatform,\n exportToADWorkbench,\n ])\n\n useEffect(() => {\n onConfirmButtonPropsChange({\n id: getConfirmButtonId(selectedPlatform),\n children: confirmButtonText,\n disabled: isLoading || numberOfRequiredActions !== 0,\n onClick: () => {\n void onConfirmButtonClick()\n },\n })\n }, [\n numberOfRequiredActions,\n confirmButtonText,\n isLoading,\n onConfirmButtonClick,\n onConfirmButtonPropsChange,\n selectedPlatform,\n ])\n\n if (isLoading) return <SkeletonParagraph numRows={4} />\n\n return (\n <>\n <Typography variant=\"body1\" sx={{ fontWeight: 700, my: '10px' }}>\n Before sending the selected data to {platform.name}:\n </Typography>\n <Typography variant=\"body1\" sx={{ marginBottom: '10px' }}>\n You must meet all requirements to download the selected data. You must\n take the following actions before we can send this data to{' '}\n {platform.name}.\n </Typography>\n <TableQueryActionsRequired\n queryBundleRequest={queryFilteredBySelection}\n columnModels={queryMetadata?.columnModels ?? []}\n onNumberOfRequiredActionsChanged={setNumberOfRequiredActions}\n onViewSharingSettingsClicked={onViewSharingSettingsClicked}\n />\n <Typography variant=\"body1\" sx={{ fontWeight: 700, marginTop: '15px' }}>\n When completed, click “Send to {platform.name}“ to finish the process\n outside this application. You will be redirected to {platform.name}.\n </Typography>\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAyBA,SAAS,EACP,GACQ;CACR,OAAO,SAAS,EACd,EAAiB,QAAQ,OAAO,EAAE,CACpC,EAAE;AACJ;AAWA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,qBAAkB,+BAA4B,0BACpD,GACI,IAAW,EAA4B,IAEvC,EACJ,2BACA,iCACA,yBACA,qBACA,0BACA,0BACE,EAAgB,GAEd,EAAE,MAAM,GAAe,iBAAc,EAAoB,GACzD,IAAe,EAAyB,GACxC,IAAyB,EAAmC,GAC5D,IAAkB,EAA4B,GAE9C,EAAE,uBAAoB,EAA6B,GAEnD,CAAC,GAAyB,KAA8B,EAE5D,KAAA,CAAS,GAEL,IAA2B,QAAc;EAC7C,IAAM,IAAU,EAAuB;EAevC,OAbE,KACA,KACA,GAAe,kBAEf,EAAQ,MAAM,oBAAoB,CAChC,GAAI,EAAQ,MAAM,qBAAqB,CAAC,GACxC,EACE,GACA,GACA,EAAc,aAChB,CACF,IAEK;CACT,GAAG;EACD;EACA;EACA;EACA,GAAe;EACf;CACF,CAAC,GAEK,EACJ,qBACA,kBACA,kBACA,qBACA,2BACE,EAAsC;EACxC,oBAAoB;EACpB,eAAe,GAAe;EAC9B;EACA;EACA;CACF,CAAC,GAEK,IAAoB,QAAQ,EAChC,GACA,GACA,GACA,GAAe,YACf,CACF,EAAE,MAAM,EAAS,QAEX,IAAuB,EAAY,YAAY;EACnD,QAAQ,GAAR;GACE,KAAK;IACH,MAAM,EAAiB;IACvB;GACF,KAAK;IACH,MAAM,EAAc;IACpB;GACF,KAAK;IACH,MAAM,EAAc;IACpB;GACF,KAAK;IACH,MAAM,EAAiB;IACvB;GACF,KAAK;IACH,MAAM,EAAoB;IAC1B;EACJ;EACA,EAAmB;CACrB,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAsBD,OApBA,QAAgB;EACd,EAA2B;GACzB,IAAI,EAAmB,CAAgB;GACvC,UAAU;GACV,UAAU,KAAa,MAA4B;GACnD,eAAe;IACb,EAA0B;GAC5B;EACF,CAAC;CACH,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,GAEG,IAAkB,kBAAC,GAAD,EAAmB,SAAS,EAAI,CAAA,IAGpD,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GAAY,SAAQ;GAAQ,IAAI;IAAE,YAAY;IAAK,IAAI;GAAO;aAA9D;IAAiE;IAC1B,EAAS;IAAK;GACzC;;EACZ,kBAAC,GAAD;GAAY,SAAQ;GAAQ,IAAI,EAAE,cAAc,OAAO;aAAvD;IAA0D;IAEG;IAC1D,EAAS;IAAK;GACL;;EACZ,kBAAC,GAAD;GACE,oBAAoB;GACpB,cAAc,GAAe,gBAAgB,CAAC;GAC9C,kCAAkC;GACJ;EAC/B,CAAA;EACD,kBAAC,GAAD;GAAY,SAAQ;GAAQ,IAAI;IAAE,YAAY;IAAK,WAAW;GAAO;aAArE;IAAwE;IACtC,EAAS;IAAK;IACO,EAAS;IAAK;GACzD;;CACZ,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"ExternalPlatformActionsRequiredPrecheck.js","names":[],"sources":["../../../../src/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.tsx"],"sourcesContent":["import { ButtonProps, Typography } from '@mui/material'\nimport { upperFirst } from 'lodash-es'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useExportTableQueryToAnalysisPlatform } from '../../../synapse-queries/entity/useExportTableQueryToAnalysisPlatform'\nimport { getPrimaryKeyINFilter } from '../../../utils/functions/QueryFilterUtils'\nimport { TableQueryActionsRequired } from '../../DownloadCart/TableQueryActionsRequired'\nimport { useQueryContext } from '../../QueryContext'\nimport { useQueryVisualizationContext } from '../../QueryVisualizationWrapper/index'\nimport {\n useHasSelectedRowsAtomValue,\n useRowSelectionPrimaryKeyAtomValue,\n useSelectedRowsAtomValue,\n} from '../../QueryWrapper/TableRowSelectionState'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport { SkeletonParagraph } from '../../Skeleton/index'\nimport { getNumberOfResultsToInvokeActionCopy } from '../TopLevelControls/TopLevelControlsUtils'\nimport {\n EXTERNAL_ANALYSIS_PLATFORMS,\n ExternalAnalysisPlatform,\n} from './ExternalAnalysisPlatformsConstants'\n\n/**\n * Get the ID of the confirm button for the selected platform, used in Google Tag Manager\n * @param selectedPlatform\n */\nfunction getConfirmButtonId(\n selectedPlatform: ExternalAnalysisPlatform,\n): string {\n return `SendTo${upperFirst(\n selectedPlatform.replace('\\\\s', ''),\n )}ButtonFromConfirmationDialog`\n}\n\nexport type ExternalPlatformActionsRequiredPrecheckProps = {\n /* The external analysis platform that the user selected */\n selectedPlatform: ExternalAnalysisPlatform\n /* Callback to propagate the current confirm button appearance and behavior */\n onConfirmButtonPropsChange: (props: ButtonProps) => void\n /* Callback invoked when export to the external platform succeeds */\n onSuccessfulExport: () => void\n}\n\nexport default function ExternalPlatformActionsRequiredPrecheck(\n props: ExternalPlatformActionsRequiredPrecheckProps,\n) {\n const { selectedPlatform, onConfirmButtonPropsChange, onSuccessfulExport } =\n props\n const platform = EXTERNAL_ANALYSIS_PLATFORMS[selectedPlatform]\n\n const {\n getCurrentQueryRequest,\n hasResettableFilters,\n fileIdColumnName,\n fileVersionColumnName,\n fileNameColumnName,\n } = useQueryContext()\n\n const { data: queryMetadata, isLoading } = useGetQueryMetadata()\n const selectedRows = useSelectedRowsAtomValue()\n const rowSelectionPrimaryKey = useRowSelectionPrimaryKeyAtomValue()\n const hasSelectedRows = useHasSelectedRowsAtomValue()\n\n const { unitDescription } = useQueryVisualizationContext()\n\n const [numberOfRequiredActions, setNumberOfRequiredActions] = useState<\n number | undefined\n >(undefined)\n\n const queryFilteredBySelection = useMemo(() => {\n const request = getCurrentQueryRequest()\n if (\n hasSelectedRows &&\n rowSelectionPrimaryKey &&\n queryMetadata?.selectColumns\n ) {\n request.query.additionalFilters = [\n ...(request.query.additionalFilters || []),\n getPrimaryKeyINFilter(\n rowSelectionPrimaryKey,\n selectedRows,\n queryMetadata.selectColumns,\n ),\n ]\n }\n return request\n }, [\n getCurrentQueryRequest,\n hasSelectedRows,\n rowSelectionPrimaryKey,\n queryMetadata?.selectColumns,\n selectedRows,\n ])\n\n const {\n exportToCavatica,\n exportToTerra,\n exportToPluto,\n exportToPlutoDev,\n exportToADWorkbench,\n } = useExportTableQueryToAnalysisPlatform({\n queryBundleRequest: queryFilteredBySelection,\n selectColumns: queryMetadata?.selectColumns,\n fileIdColumnName,\n fileVersionColumnName,\n fileNameColumnName,\n })\n\n const confirmButtonText = `Send ${getNumberOfResultsToInvokeActionCopy(\n hasResettableFilters,\n hasSelectedRows,\n selectedRows,\n queryMetadata?.queryCount,\n unitDescription,\n )} to ${platform.name}`\n\n const onConfirmButtonClick = useCallback(async () => {\n switch (selectedPlatform) {\n case 'cavatica':\n await exportToCavatica()\n break\n case 'terra':\n await exportToTerra()\n break\n case 'pluto':\n await exportToPluto()\n break\n case 'plutodev':\n await exportToPlutoDev()\n break\n case 'adworkbench':\n await exportToADWorkbench()\n break\n }\n onSuccessfulExport()\n }, [\n exportToCavatica,\n exportToTerra,\n exportToPluto,\n exportToPlutoDev,\n onSuccessfulExport,\n selectedPlatform,\n exportToADWorkbench,\n ])\n\n useEffect(() => {\n onConfirmButtonPropsChange({\n id: getConfirmButtonId(selectedPlatform),\n children: confirmButtonText,\n disabled: isLoading || numberOfRequiredActions !== 0,\n onClick: () => {\n void onConfirmButtonClick()\n },\n })\n }, [\n numberOfRequiredActions,\n confirmButtonText,\n isLoading,\n onConfirmButtonClick,\n onConfirmButtonPropsChange,\n selectedPlatform,\n ])\n\n if (isLoading) return <SkeletonParagraph numRows={4} />\n\n return (\n <>\n <Typography variant=\"body1\" sx={{ fontWeight: 700, my: '10px' }}>\n Before sending the selected data to {platform.name}:\n </Typography>\n <Typography variant=\"body1\" sx={{ marginBottom: '10px' }}>\n You must meet all requirements to download the selected data. You must\n take the following actions before we can send this data to{' '}\n {platform.name}.\n </Typography>\n <TableQueryActionsRequired\n queryBundleRequest={queryFilteredBySelection}\n columnModels={queryMetadata?.columnModels ?? []}\n onNumberOfRequiredActionsChanged={setNumberOfRequiredActions}\n />\n <Typography variant=\"body1\" sx={{ fontWeight: 700, marginTop: '15px' }}>\n When completed, click “Send to {platform.name}“ to finish the process\n outside this application. You will be redirected to {platform.name}.\n </Typography>\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAyBA,SAAS,EACP,GACQ;CACR,OAAO,SAAS,EACd,EAAiB,QAAQ,OAAO,EAAE,CACpC,EAAE;AACJ;AAWA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,qBAAkB,+BAA4B,0BACpD,GACI,IAAW,EAA4B,IAEvC,EACJ,2BACA,yBACA,qBACA,0BACA,0BACE,EAAgB,GAEd,EAAE,MAAM,GAAe,iBAAc,EAAoB,GACzD,IAAe,EAAyB,GACxC,IAAyB,EAAmC,GAC5D,IAAkB,EAA4B,GAE9C,EAAE,uBAAoB,EAA6B,GAEnD,CAAC,GAAyB,KAA8B,EAE5D,KAAA,CAAS,GAEL,IAA2B,QAAc;EAC7C,IAAM,IAAU,EAAuB;EAevC,OAbE,KACA,KACA,GAAe,kBAEf,EAAQ,MAAM,oBAAoB,CAChC,GAAI,EAAQ,MAAM,qBAAqB,CAAC,GACxC,EACE,GACA,GACA,EAAc,aAChB,CACF,IAEK;CACT,GAAG;EACD;EACA;EACA;EACA,GAAe;EACf;CACF,CAAC,GAEK,EACJ,qBACA,kBACA,kBACA,qBACA,2BACE,EAAsC;EACxC,oBAAoB;EACpB,eAAe,GAAe;EAC9B;EACA;EACA;CACF,CAAC,GAEK,IAAoB,QAAQ,EAChC,GACA,GACA,GACA,GAAe,YACf,CACF,EAAE,MAAM,EAAS,QAEX,IAAuB,EAAY,YAAY;EACnD,QAAQ,GAAR;GACE,KAAK;IACH,MAAM,EAAiB;IACvB;GACF,KAAK;IACH,MAAM,EAAc;IACpB;GACF,KAAK;IACH,MAAM,EAAc;IACpB;GACF,KAAK;IACH,MAAM,EAAiB;IACvB;GACF,KAAK;IACH,MAAM,EAAoB;IAC1B;EACJ;EACA,EAAmB;CACrB,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAsBD,OApBA,QAAgB;EACd,EAA2B;GACzB,IAAI,EAAmB,CAAgB;GACvC,UAAU;GACV,UAAU,KAAa,MAA4B;GACnD,eAAe;IACb,EAA0B;GAC5B;EACF,CAAC;CACH,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,GAEG,IAAkB,kBAAC,GAAD,EAAmB,SAAS,EAAI,CAAA,IAGpD,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GAAY,SAAQ;GAAQ,IAAI;IAAE,YAAY;IAAK,IAAI;GAAO;aAA9D;IAAiE;IAC1B,EAAS;IAAK;GACzC;;EACZ,kBAAC,GAAD;GAAY,SAAQ;GAAQ,IAAI,EAAE,cAAc,OAAO;aAAvD;IAA0D;IAEG;IAC1D,EAAS;IAAK;GACL;;EACZ,kBAAC,GAAD;GACE,oBAAoB;GACpB,cAAc,GAAe,gBAAgB,CAAC;GAC9C,kCAAkC;EACnC,CAAA;EACD,kBAAC,GAAD;GAAY,SAAQ;GAAQ,IAAI;IAAE,YAAY;IAAK,WAAW;GAAO;aAArE;IAAwE;IACtC,EAAS;IAAK;IACO,EAAS;IAAK;GACzD;;CACZ,EAAA,CAAA;AAEN"}
@@ -13,6 +13,13 @@ export type StyledTanStackTableProps<TData = unknown, TRowType = Row<TData>> = {
13
13
  * Defaults to false (fixed layout).
14
14
  */
15
15
  autoColumnSizing?: boolean;
16
+ /**
17
+ * When true, renders an additional horizontal scrollbar above the table (in addition to the
18
+ * browser's native scrollbar below it), synced to the same scroll position. Useful for wide
19
+ * tables where the bottom scrollbar may be far from the viewport's visible area.
20
+ * @default false
21
+ */
22
+ showTopScrollbar?: boolean;
16
23
  slots?: StyledTanStackTableSlots<TData, TRowType>;
17
24
  slotProps?: StyledTanStackTableSlotProps<TData, TRowType>;
18
25
  } & Pick<TableBodyProps<TData, TRowType>, 'rows' | 'rowTransform'>;
@@ -1 +1 @@
1
- {"version":3,"file":"StyledTanStackTable.d.ts","sourceRoot":"","sources":["../../../src/components/TanStackTable/StyledTanStackTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,yBAAyB,EAC1B,MAAM,0CAA0C,CAAA;AACjD,OAAO,EAGL,GAAG,EACH,KAAK,EACN,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAgC,cAAc,EAAE,MAAM,aAAa,CAAA;AAM1E,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAEhF,MAAM,MAAM,wBAAwB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI;IAC7E,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACnB,yBAAyB,CAAC,EAAE,yBAAyB,CAAA;IACrD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,KAAK,CAAC,EAAE,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IACjD,SAAS,CAAC,EAAE,4BAA4B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;CAC1D,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,CAAA;AAElE;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CACzC,KAAK,GAAG,OAAO,EACf,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,EACrB,KAAK,EAAE,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,2CA0LjD"}
1
+ {"version":3,"file":"StyledTanStackTable.d.ts","sourceRoot":"","sources":["../../../src/components/TanStackTable/StyledTanStackTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,yBAAyB,EAC1B,MAAM,0CAA0C,CAAA;AAGjD,OAAO,EAGL,GAAG,EACH,KAAK,EACN,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAgC,cAAc,EAAE,MAAM,aAAa,CAAA;AAM1E,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAGhF,MAAM,MAAM,wBAAwB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI;IAC7E,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACnB,yBAAyB,CAAC,EAAE,yBAAyB,CAAA;IACrD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,KAAK,CAAC,EAAE,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IACjD,SAAS,CAAC,EAAE,4BAA4B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;CAC1D,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,CAAA;AAElE;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CACzC,KAAK,GAAG,OAAO,EACf,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,EACrB,KAAK,EAAE,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,2CAkOjD"}
@@ -1,80 +1,100 @@
1
1
  import { StyledTableContainer as e } from "../styled/StyledTableContainer.js";
2
2
  import { getColumnSizeCssVariable as t, getCommonPinningStyles as n, getHeaderSizeCssVariable as r } from "./TanStackTableUtils.js";
3
3
  import { MemoizedTableBody as i, TableBody as a } from "./TableBody.js";
4
- import { useLayoutEffect as o, useMemo as s, useRef as c, useState as l } from "react";
5
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
6
- import { flexRender as f } from "@tanstack/react-table";
4
+ import { useSyncedTopScrollbar as o } from "./useSyncedTopScrollbar.js";
5
+ import { useLayoutEffect as s, useMemo as c, useRef as l, useState as u } from "react";
6
+ import { Box as d } from "@mui/material";
7
+ import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
8
+ import { flexRender as h } from "@tanstack/react-table";
9
+ import { useForkRef as g } from "@mui/material/utils";
7
10
  //#region src/components/TanStackTable/StyledTanStackTable.tsx
8
- function p(p) {
9
- let { table: m, styledTableContainerProps: h, fullWidth: g = !0, autoColumnSizing: _ = !1, slots: v = {}, slotProps: y = {} } = p, { Thead: b = "thead", Th: x = "th", Table: S = "table", ...C } = v, { Table: w = {}, Thead: T = {}, Th: E = {}, ...D } = y, O = {
10
- table: m,
11
- slots: C,
12
- slotProps: D,
13
- rows: p.rows,
14
- rowTransform: p.rowTransform
15
- }, k = c(null), A = m.getState().columnVisibility, [j, M] = l(null), N = !_ || j?.columns === m.options.columns && j?.columnVisibility === A;
16
- o(() => {
17
- if (!_ || N || !k.current) return;
18
- let e = k.current.querySelectorAll(":scope > thead > tr:first-child > th"), t = m.getFlatHeaders(), n = {};
11
+ function _(_) {
12
+ let { table: v, styledTableContainerProps: y, fullWidth: b = !0, autoColumnSizing: x = !1, showTopScrollbar: S = !1, slots: C = {}, slotProps: w = {} } = _, { Thead: T = "thead", Th: E = "th", Table: D = "table", ...O } = C, { Table: k = {}, Thead: A = {}, Th: j = {}, ...M } = w, N = {
13
+ table: v,
14
+ slots: O,
15
+ slotProps: M,
16
+ rows: _.rows,
17
+ rowTransform: _.rowTransform
18
+ }, P = l(null), { containerRef: F, topScrollRef: I, targetWidth: L, handleTopScroll: R, handleBottomScroll: z } = o(P, S), { ref: B, onScroll: V, ...H } = y ?? {}, U = g(F, B), W = v.getState().columnVisibility, [G, K] = u(null), q = !x || G?.columns === v.options.columns && G?.columnVisibility === W;
19
+ s(() => {
20
+ if (!x || q || !P.current) return;
21
+ let e = P.current.querySelectorAll(":scope > thead > tr:first-child > th"), t = v.getFlatHeaders(), n = {};
19
22
  t.forEach((t, r) => {
20
23
  let i = e[r];
21
24
  i && (n[t.column.id] = Math.ceil(i.getBoundingClientRect().width));
22
- }), Object.keys(n).length > 0 && (m.setColumnSizing(n), M({
23
- columns: m.options.columns,
24
- columnVisibility: A
25
+ }), Object.keys(n).length > 0 && (v.setColumnSizing(n), K({
26
+ columns: v.options.columns,
27
+ columnVisibility: W
25
28
  }));
26
29
  }, [
27
- _,
28
- A,
29
- N,
30
- m
30
+ x,
31
+ W,
32
+ q,
33
+ v
31
34
  ]);
32
- let P = s(() => {
33
- let e = m.getFlatHeaders(), n = {};
35
+ let J = c(() => {
36
+ let e = v.getFlatHeaders(), n = {};
34
37
  for (let i = 0; i < e.length; i++) {
35
38
  let a = e[i];
36
39
  n[r(a.id)] = a.getSize(), n[t(a.column.id)] = a.column.getSize();
37
40
  }
38
41
  return n;
39
42
  }, [
40
- m.getState().columnSizingInfo,
41
- m.getState().columnSizing,
42
- m.getState().columnVisibility
43
- ]), F;
44
- F = g ? "100%" : N ? `${m.getTotalSize()}px` : "max-content";
45
- let I = m.getState().columnSizingInfo.isResizingColumn ? i : a;
46
- return /* @__PURE__ */ u(e, {
47
- ...h,
48
- children: /* @__PURE__ */ d(S, {
49
- ...w,
50
- ref: k,
43
+ v.getState().columnSizingInfo,
44
+ v.getState().columnSizing,
45
+ v.getState().columnVisibility
46
+ ]), Y;
47
+ Y = b ? "100%" : q ? `${v.getTotalSize()}px` : "max-content";
48
+ let X = v.getState().columnSizingInfo.isResizingColumn ? i : a;
49
+ function Z(e) {
50
+ V?.(e), S && z(e);
51
+ }
52
+ return /* @__PURE__ */ m(f, { children: [S && /* @__PURE__ */ p(d, {
53
+ ref: I,
54
+ onScroll: R,
55
+ sx: {
56
+ overflowX: "auto",
57
+ overflowY: "hidden",
58
+ height: "16px"
59
+ },
60
+ children: /* @__PURE__ */ p(d, { sx: {
61
+ width: L,
62
+ height: "1px"
63
+ } })
64
+ }), /* @__PURE__ */ p(e, {
65
+ ...H,
66
+ ref: U,
67
+ onScroll: Z,
68
+ children: /* @__PURE__ */ m(D, {
69
+ ...k,
70
+ ref: P,
51
71
  style: {
52
- ...P,
53
- tableLayout: N ? "fixed" : "auto",
54
- width: F,
55
- ...w.style
72
+ ...J,
73
+ tableLayout: q ? "fixed" : "auto",
74
+ width: Y,
75
+ ...k.style
56
76
  },
57
- children: [/* @__PURE__ */ u(b, {
58
- ...T,
59
- children: m.getHeaderGroups().map((e) => /* @__PURE__ */ u("tr", { children: e.headers.map((e) => /* @__PURE__ */ d(x, {
77
+ children: [/* @__PURE__ */ p(T, {
78
+ ...A,
79
+ children: v.getHeaderGroups().map((e) => /* @__PURE__ */ p("tr", { children: e.headers.map((e) => /* @__PURE__ */ m(E, {
60
80
  colSpan: e.colSpan,
61
- ...E,
81
+ ...j,
62
82
  style: {
63
- ...N && { width: `calc(var(${r(e.id)}) * 1px)` },
83
+ ...q && { width: `calc(var(${r(e.id)}) * 1px)` },
64
84
  ...n(e.column),
65
- ...E.style
85
+ ...j.style
66
86
  },
67
- children: [e.isPlaceholder ? null : f(e.column.columnDef.header, e.getContext()), e.column.getCanResize() && /* @__PURE__ */ u("div", {
87
+ children: [e.isPlaceholder ? null : h(e.column.columnDef.header, e.getContext()), e.column.getCanResize() && /* @__PURE__ */ p("div", {
68
88
  className: `resizer ${e.column.getIsResizing() ? "isResizing" : ""}`,
69
89
  onMouseDown: e.getResizeHandler(),
70
90
  onTouchStart: e.getResizeHandler()
71
91
  })]
72
92
  }, e.id)) }, e.id))
73
- }), /* @__PURE__ */ u(I, { ...O })]
93
+ }), /* @__PURE__ */ p(X, { ...N })]
74
94
  })
75
- });
95
+ })] });
76
96
  }
77
97
  //#endregion
78
- export { p as default };
98
+ export { _ as default };
79
99
 
80
100
  //# sourceMappingURL=StyledTanStackTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StyledTanStackTable.js","names":[],"sources":["../../../src/components/TanStackTable/StyledTanStackTable.tsx"],"sourcesContent":["import {\n StyledTableContainer,\n StyledTableContainerProps,\n} from '@/components/styled/StyledTableContainer'\nimport {\n ColumnSizingState,\n flexRender,\n Row,\n Table,\n} from '@tanstack/react-table'\nimport { useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { MemoizedTableBody, TableBody, TableBodyProps } from './TableBody'\nimport {\n getColumnSizeCssVariable,\n getCommonPinningStyles,\n getHeaderSizeCssVariable,\n} from './TanStackTableUtils'\nimport { StyledTanStackTableSlotProps, StyledTanStackTableSlots } from './types'\n\nexport type StyledTanStackTableProps<TData = unknown, TRowType = Row<TData>> = {\n table: Table<TData>\n styledTableContainerProps?: StyledTableContainerProps\n fullWidth?: boolean\n /**\n * When true, uses `table-layout: auto` so the browser sizes columns to fit their content.\n * Column sizes from TanStack act as minimum widths, and columns expand to fit wider content.\n * Resizing still works — dragging a column sets a new minimum width.\n * Defaults to false (fixed layout).\n */\n autoColumnSizing?: boolean\n slots?: StyledTanStackTableSlots<TData, TRowType>\n slotProps?: StyledTanStackTableSlotProps<TData, TRowType>\n} & Pick<TableBodyProps<TData, TRowType>, 'rows' | 'rowTransform'>\n\n/**\n * Component that renders a styled table using @tanstack/react-table. Pass your table instance into the component and\n * it will render the table with the appropriate headers and rows.\n */\nexport default function StyledTanStackTable<\n TData = unknown,\n TRowType = Row<TData>,\n>(props: StyledTanStackTableProps<TData, TRowType>) {\n const {\n table,\n styledTableContainerProps,\n fullWidth = true,\n autoColumnSizing = false,\n slots = {},\n slotProps = {},\n } = props\n const {\n Thead = 'thead',\n Th = 'th',\n Table = 'table',\n ...tableBodySlots\n } = slots\n const {\n Table: tableSlotProps = {},\n Thead: theadSlotProps = {},\n Th: thSlotProps = {},\n ...tableBodySlotProps\n } = slotProps\n\n const tableBodyProps: TableBodyProps<TData, TRowType> = {\n table,\n slots: tableBodySlots,\n slotProps: tableBodySlotProps,\n rows: props.rows!,\n rowTransform: props.rowTransform!,\n }\n\n /**\n * When autoColumnSizing is true we do a two-phase render:\n * 1. Render with table-layout: auto and no width constraints so the browser\n * natively sizes each column to its content.\n * 2. After the first paint, measure each <th> and write the real pixel widths\n * into TanStack's columnSizing state, then switch to table-layout: fixed.\n *\n * This gives content-based initial sizes while still allowing the user to drag\n * a column narrower than its content.\n */\n const tableRef = useRef<HTMLTableElement>(null)\n\n // Track what columns+visibility combination was last measured so we know when\n // a re-measurement is needed (e.g. columns change or visibility is toggled).\n const columnVisibility = table.getState().columnVisibility\n const [lastMeasuredState, setLastMeasuredState] = useState<{\n columns: typeof table.options.columns\n columnVisibility: typeof columnVisibility\n } | null>(null)\n\n // hasMeasured is true when auto-sizing is disabled (nothing to do) OR when the\n // current columns+visibility matches the last measured snapshot.\n const hasMeasured =\n !autoColumnSizing ||\n (lastMeasuredState?.columns === table.options.columns &&\n lastMeasuredState?.columnVisibility === columnVisibility)\n\n // After the browser has laid out the auto-sized table, capture the widths and\n // switch to fixed layout so that the user can resize below the content width.\n // useLayoutEffect runs synchronously after DOM mutations, before the browser\n // paints, which is required for accurate DOM measurements.\n useLayoutEffect(() => {\n if (!autoColumnSizing || hasMeasured || !tableRef.current) return\n\n const ths = tableRef.current.querySelectorAll(\n ':scope > thead > tr:first-child > th',\n )\n const headers = table.getFlatHeaders()\n const newSizes: ColumnSizingState = {}\n headers.forEach((header, i) => {\n const th = ths[i] as HTMLElement | undefined\n if (th) {\n newSizes[header.column.id] = Math.ceil(th.getBoundingClientRect().width)\n }\n })\n if (Object.keys(newSizes).length > 0) {\n table.setColumnSizing(newSizes)\n setLastMeasuredState({\n columns: table.options.columns,\n columnVisibility,\n })\n }\n }, [autoColumnSizing, columnVisibility, hasMeasured, table])\n\n /**\n * Instead of calling `column.getSize()` on every render for every header\n * and especially every data cell (very expensive),\n * we will calculate all column sizes at once at the root table level in a useMemo\n * and pass the column sizes down as CSS variables to the <table> element.\n *\n * See https://tanstack.com/table/v8/docs/guide/column-sizing#advanced-column-resizing-performance\n */\n const columnSizeVars = useMemo(() => {\n const headers = table.getFlatHeaders()\n const colSizes: { [key: string]: number } = {}\n for (let i = 0; i < headers.length; i++) {\n const header = headers[i]\n colSizes[getHeaderSizeCssVariable(header.id)] = header.getSize()\n colSizes[getColumnSizeCssVariable(header.column.id)] =\n header.column.getSize()\n }\n return colSizes\n // Intentionally limit the dependencies to only recompute when the column sizes change\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, [\n table.getState().columnSizingInfo,\n table.getState().columnSizing,\n table.getState().columnVisibility, // If a column is added, its width should be recalculated\n ])\n\n // Before measurement: let the browser shrink the table to content width so we\n // can read accurate sizes. After measurement: use the exact measured total.\n let tableWidth: string\n if (fullWidth) {\n tableWidth = '100%'\n } else if (!hasMeasured) {\n tableWidth = 'max-content'\n } else {\n tableWidth = `${table.getTotalSize()}px`\n }\n\n /* When resizing any column we will render this special memoized version of our table body */\n const TableBodyElement = table.getState().columnSizingInfo.isResizingColumn\n ? MemoizedTableBody\n : TableBody\n\n return (\n <StyledTableContainer {...styledTableContainerProps}>\n <Table\n {...tableSlotProps}\n ref={tableRef}\n style={{\n ...columnSizeVars,\n // Pre-measurement: auto layout so the browser can size columns to content.\n // Post-measurement: fixed layout so the user can resize below content width.\n tableLayout: hasMeasured ? 'fixed' : 'auto',\n width: tableWidth,\n ...tableSlotProps['style'],\n }}\n >\n <Thead {...theadSlotProps}>\n {table.getHeaderGroups().map(headerGroup => {\n return (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map(header => (\n <Th\n key={header.id}\n colSpan={header.colSpan}\n {...thSlotProps}\n style={{\n // Pre-measurement: no width hint — let the browser size freely.\n // Post-measurement: exact width from the measured/resized value.\n ...(hasMeasured && {\n width: `calc(var(${getHeaderSizeCssVariable(\n header.id,\n )}) * 1px)`,\n }),\n ...getCommonPinningStyles(header.column),\n ...thSlotProps['style'],\n }}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n {header.column.getCanResize() && (\n <div\n className={`resizer ${\n header.column.getIsResizing() ? 'isResizing' : ''\n }`}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n )}\n </Th>\n ))}\n </tr>\n )\n })}\n </Thead>\n <TableBodyElement<TData, TRowType> {...tableBodyProps} />\n </Table>\n </StyledTableContainer>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"StyledTanStackTable.js","names":[],"sources":["../../../src/components/TanStackTable/StyledTanStackTable.tsx"],"sourcesContent":["import {\n StyledTableContainer,\n StyledTableContainerProps,\n} from '@/components/styled/StyledTableContainer'\nimport { Box } from '@mui/material'\nimport { useForkRef } from '@mui/material/utils'\nimport {\n ColumnSizingState,\n flexRender,\n Row,\n Table,\n} from '@tanstack/react-table'\nimport { UIEvent, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { MemoizedTableBody, TableBody, TableBodyProps } from './TableBody'\nimport {\n getColumnSizeCssVariable,\n getCommonPinningStyles,\n getHeaderSizeCssVariable,\n} from './TanStackTableUtils'\nimport { StyledTanStackTableSlotProps, StyledTanStackTableSlots } from './types'\nimport { useSyncedTopScrollbar } from './useSyncedTopScrollbar'\n\nexport type StyledTanStackTableProps<TData = unknown, TRowType = Row<TData>> = {\n table: Table<TData>\n styledTableContainerProps?: StyledTableContainerProps\n fullWidth?: boolean\n /**\n * When true, uses `table-layout: auto` so the browser sizes columns to fit their content.\n * Column sizes from TanStack act as minimum widths, and columns expand to fit wider content.\n * Resizing still works — dragging a column sets a new minimum width.\n * Defaults to false (fixed layout).\n */\n autoColumnSizing?: boolean\n /**\n * When true, renders an additional horizontal scrollbar above the table (in addition to the\n * browser's native scrollbar below it), synced to the same scroll position. Useful for wide\n * tables where the bottom scrollbar may be far from the viewport's visible area.\n * @default false\n */\n showTopScrollbar?: boolean\n slots?: StyledTanStackTableSlots<TData, TRowType>\n slotProps?: StyledTanStackTableSlotProps<TData, TRowType>\n} & Pick<TableBodyProps<TData, TRowType>, 'rows' | 'rowTransform'>\n\n/**\n * Component that renders a styled table using @tanstack/react-table. Pass your table instance into the component and\n * it will render the table with the appropriate headers and rows.\n */\nexport default function StyledTanStackTable<\n TData = unknown,\n TRowType = Row<TData>,\n>(props: StyledTanStackTableProps<TData, TRowType>) {\n const {\n table,\n styledTableContainerProps,\n fullWidth = true,\n autoColumnSizing = false,\n showTopScrollbar = false,\n slots = {},\n slotProps = {},\n } = props\n const {\n Thead = 'thead',\n Th = 'th',\n Table = 'table',\n ...tableBodySlots\n } = slots\n const {\n Table: tableSlotProps = {},\n Thead: theadSlotProps = {},\n Th: thSlotProps = {},\n ...tableBodySlotProps\n } = slotProps\n\n const tableBodyProps: TableBodyProps<TData, TRowType> = {\n table,\n slots: tableBodySlots,\n slotProps: tableBodySlotProps,\n rows: props.rows!,\n rowTransform: props.rowTransform!,\n }\n\n /**\n * When autoColumnSizing is true we do a two-phase render:\n * 1. Render with table-layout: auto and no width constraints so the browser\n * natively sizes each column to its content.\n * 2. After the first paint, measure each <th> and write the real pixel widths\n * into TanStack's columnSizing state, then switch to table-layout: fixed.\n *\n * This gives content-based initial sizes while still allowing the user to drag\n * a column narrower than its content.\n */\n const tableRef = useRef<HTMLTableElement>(null)\n\n const {\n containerRef,\n topScrollRef,\n targetWidth: tableRenderedWidth,\n handleTopScroll,\n handleBottomScroll,\n } = useSyncedTopScrollbar(tableRef, showTopScrollbar)\n\n // Merge our own container ref/onScroll with any that the caller passed via\n // styledTableContainerProps, rather than one clobbering the other.\n const {\n ref: callerContainerRef,\n onScroll: callerOnScroll,\n ...restContainerProps\n } = styledTableContainerProps ?? {}\n const mergedContainerRef = useForkRef(containerRef, callerContainerRef)\n\n // Track what columns+visibility combination was last measured so we know when\n // a re-measurement is needed (e.g. columns change or visibility is toggled).\n const columnVisibility = table.getState().columnVisibility\n const [lastMeasuredState, setLastMeasuredState] = useState<{\n columns: typeof table.options.columns\n columnVisibility: typeof columnVisibility\n } | null>(null)\n\n // hasMeasured is true when auto-sizing is disabled (nothing to do) OR when the\n // current columns+visibility matches the last measured snapshot.\n const hasMeasured =\n !autoColumnSizing ||\n (lastMeasuredState?.columns === table.options.columns &&\n lastMeasuredState?.columnVisibility === columnVisibility)\n\n // After the browser has laid out the auto-sized table, capture the widths and\n // switch to fixed layout so that the user can resize below the content width.\n // useLayoutEffect runs synchronously after DOM mutations, before the browser\n // paints, which is required for accurate DOM measurements.\n useLayoutEffect(() => {\n if (!autoColumnSizing || hasMeasured || !tableRef.current) return\n\n const ths = tableRef.current.querySelectorAll(\n ':scope > thead > tr:first-child > th',\n )\n const headers = table.getFlatHeaders()\n const newSizes: ColumnSizingState = {}\n headers.forEach((header, i) => {\n const th = ths[i] as HTMLElement | undefined\n if (th) {\n newSizes[header.column.id] = Math.ceil(th.getBoundingClientRect().width)\n }\n })\n if (Object.keys(newSizes).length > 0) {\n table.setColumnSizing(newSizes)\n setLastMeasuredState({\n columns: table.options.columns,\n columnVisibility,\n })\n }\n }, [autoColumnSizing, columnVisibility, hasMeasured, table])\n\n /**\n * Instead of calling `column.getSize()` on every render for every header\n * and especially every data cell (very expensive),\n * we will calculate all column sizes at once at the root table level in a useMemo\n * and pass the column sizes down as CSS variables to the <table> element.\n *\n * See https://tanstack.com/table/v8/docs/guide/column-sizing#advanced-column-resizing-performance\n */\n const columnSizeVars = useMemo(() => {\n const headers = table.getFlatHeaders()\n const colSizes: { [key: string]: number } = {}\n for (let i = 0; i < headers.length; i++) {\n const header = headers[i]\n colSizes[getHeaderSizeCssVariable(header.id)] = header.getSize()\n colSizes[getColumnSizeCssVariable(header.column.id)] =\n header.column.getSize()\n }\n return colSizes\n // Intentionally limit the dependencies to only recompute when the column sizes change\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, [\n table.getState().columnSizingInfo,\n table.getState().columnSizing,\n table.getState().columnVisibility, // If a column is added, its width should be recalculated\n ])\n\n // Before measurement: let the browser shrink the table to content width so we\n // can read accurate sizes. After measurement: use the exact measured total.\n let tableWidth: string\n if (fullWidth) {\n tableWidth = '100%'\n } else if (!hasMeasured) {\n tableWidth = 'max-content'\n } else {\n tableWidth = `${table.getTotalSize()}px`\n }\n\n /* When resizing any column we will render this special memoized version of our table body */\n const TableBodyElement = table.getState().columnSizingInfo.isResizingColumn\n ? MemoizedTableBody\n : TableBody\n\n function handleContainerScroll(e: UIEvent<HTMLDivElement>) {\n callerOnScroll?.(e)\n if (showTopScrollbar) {\n handleBottomScroll(e)\n }\n }\n\n return (\n <>\n {showTopScrollbar && (\n <Box\n ref={topScrollRef}\n onScroll={handleTopScroll}\n sx={{ overflowX: 'auto', overflowY: 'hidden', height: '16px' }}\n >\n <Box sx={{ width: tableRenderedWidth, height: '1px' }} />\n </Box>\n )}\n <StyledTableContainer\n {...restContainerProps}\n ref={mergedContainerRef}\n onScroll={handleContainerScroll}\n >\n <Table\n {...tableSlotProps}\n ref={tableRef}\n style={{\n ...columnSizeVars,\n // Pre-measurement: auto layout so the browser can size columns to content.\n // Post-measurement: fixed layout so the user can resize below content width.\n tableLayout: hasMeasured ? 'fixed' : 'auto',\n width: tableWidth,\n ...tableSlotProps['style'],\n }}\n >\n <Thead {...theadSlotProps}>\n {table.getHeaderGroups().map(headerGroup => {\n return (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map(header => (\n <Th\n key={header.id}\n colSpan={header.colSpan}\n {...thSlotProps}\n style={{\n // Pre-measurement: no width hint — let the browser size freely.\n // Post-measurement: exact width from the measured/resized value.\n ...(hasMeasured && {\n width: `calc(var(${getHeaderSizeCssVariable(\n header.id,\n )}) * 1px)`,\n }),\n ...getCommonPinningStyles(header.column),\n ...thSlotProps['style'],\n }}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n {header.column.getCanResize() && (\n <div\n className={`resizer ${\n header.column.getIsResizing() ? 'isResizing' : ''\n }`}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n )}\n </Th>\n ))}\n </tr>\n )\n })}\n </Thead>\n <TableBodyElement<TData, TRowType> {...tableBodyProps} />\n </Table>\n </StyledTableContainer>\n </>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TanStackTableUtils.d.ts","sourceRoot":"","sources":["../../../src/components/TanStackTable/TanStackTableUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAErC,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,UAExD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,UAExD;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAqBzE"}
1
+ {"version":3,"file":"TanStackTableUtils.d.ts","sourceRoot":"","sources":["../../../src/components/TanStackTable/TanStackTableUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAErC,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,UAExD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,UAExD;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAsBzE"}
@@ -7,16 +7,16 @@ function t(e) {
7
7
  }
8
8
  function n(e) {
9
9
  let t = e.getIsPinned(), n = t === "left" && e.getIsLastColumn("left"), r = t === "right" && e.getIsFirstColumn("right");
10
- return {
11
- background: t ? "inherit" : void 0,
10
+ return t ? {
11
+ background: "inherit",
12
12
  boxShadow: n ? "-4px 0 4px -4px gray inset" : r ? "4px 0 4px -4px gray inset" : void 0,
13
13
  left: t === "left" ? `${e.getStart("left")}px` : void 0,
14
14
  right: t === "right" ? `${e.getAfter("right")}px` : void 0,
15
- opacity: t ? .95 : 1,
16
- position: t ? "sticky" : "relative",
15
+ opacity: .95,
16
+ position: "sticky",
17
17
  width: e.getSize(),
18
- zIndex: +!!t
19
- };
18
+ zIndex: 1
19
+ } : {};
20
20
  }
21
21
  //#endregion
22
22
  export { e as getColumnSizeCssVariable, n as getCommonPinningStyles, t as getHeaderSizeCssVariable };