synapse-react-client 4.0.26 → 4.0.27

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 (357) hide show
  1. package/dist/SWC.index.d.ts +3 -2
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +4 -3
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/assets/icons/FileCopy.d.ts +5 -0
  6. package/dist/assets/icons/FileCopy.d.ts.map +1 -0
  7. package/dist/assets/icons/FileCopy.js +13 -0
  8. package/dist/assets/icons/FileCopy.js.map +1 -0
  9. package/dist/assets/icons/NIHIcon.d.ts +4 -0
  10. package/dist/assets/icons/NIHIcon.d.ts.map +1 -0
  11. package/dist/assets/icons/NIHIcon.js +14 -0
  12. package/dist/assets/icons/NIHIcon.js.map +1 -0
  13. package/dist/assets/icons/fileCopy.svg +8 -0
  14. package/dist/assets/icons/fileCopy2.js +33 -0
  15. package/dist/assets/icons/fileCopy2.js.map +1 -0
  16. package/dist/assets/icons/nih.js +35 -0
  17. package/dist/assets/icons/nih.js.map +1 -0
  18. package/dist/assets/icons/nih.svg +9 -0
  19. package/dist/assets/illustrations/compute_illustration.js +485 -0
  20. package/dist/assets/illustrations/compute_illustration.js.map +1 -0
  21. package/dist/assets/illustrations/compute_illustration.svg +204 -0
  22. package/dist/assets/illustrations/curate_data_illustration.js +479 -0
  23. package/dist/assets/illustrations/curate_data_illustration.js.map +1 -0
  24. package/dist/assets/illustrations/curate_data_illustration.svg +91 -0
  25. package/dist/components/AccountLevelBadges/useRevokeCertificationUI.js +1 -1
  26. package/dist/components/AcknowledgementsPage/AcknowledgementsDialog.js +1 -1
  27. package/dist/components/Authentication/AuthenticationMethodSelection.d.ts +1 -0
  28. package/dist/components/Authentication/AuthenticationMethodSelection.d.ts.map +1 -1
  29. package/dist/components/Authentication/AuthenticationMethodSelection.js +17 -10
  30. package/dist/components/Authentication/AuthenticationMethodSelection.js.map +1 -1
  31. package/dist/components/Authentication/LastLoginInfo.d.ts +2 -2
  32. package/dist/components/Authentication/LoginForm.d.ts +1 -0
  33. package/dist/components/Authentication/LoginForm.d.ts.map +1 -1
  34. package/dist/components/Authentication/LoginForm.js +3 -2
  35. package/dist/components/Authentication/LoginForm.js.map +1 -1
  36. package/dist/components/Authentication/LoginMethod.d.ts +2 -2
  37. package/dist/components/Authentication/LoginMethod.d.ts.map +1 -1
  38. package/dist/components/Authentication/LoginMethod.js +10 -8
  39. package/dist/components/Authentication/LoginMethod.js.map +1 -1
  40. package/dist/components/Authentication/StandaloneLoginForm.d.ts +1 -0
  41. package/dist/components/Authentication/StandaloneLoginForm.d.ts.map +1 -1
  42. package/dist/components/Authentication/StandaloneLoginForm.js +16 -15
  43. package/dist/components/Authentication/StandaloneLoginForm.js.map +1 -1
  44. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +0 -2
  45. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  46. package/dist/components/Breadcrumbs/Breadcrumbs.js +24 -30
  47. package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  48. package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js +1 -1
  49. package/dist/components/ChallengeDetailPage/ChallengeDetailPage.js +1 -1
  50. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js +1 -1
  51. package/dist/components/ChangePassword/ChangePassword.js +1 -1
  52. package/dist/components/CopyToClipboardString/CopyToClipboardString.d.ts +3 -2
  53. package/dist/components/CopyToClipboardString/CopyToClipboardString.d.ts.map +1 -1
  54. package/dist/components/CopyToClipboardString/CopyToClipboardString.js +27 -18
  55. package/dist/components/CopyToClipboardString/CopyToClipboardString.js.map +1 -1
  56. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  57. package/dist/components/DataGrid/SynapseGrid.js +2 -5
  58. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  59. package/dist/components/DataGrid/SyncGridWithSourceButton.d.ts +35 -0
  60. package/dist/components/DataGrid/SyncGridWithSourceButton.d.ts.map +1 -0
  61. package/dist/components/DataGrid/SyncGridWithSourceButton.js +115 -0
  62. package/dist/components/DataGrid/SyncGridWithSourceButton.js.map +1 -0
  63. package/dist/components/DataGrid/useMergeGridWithRecordSet.d.ts +2 -0
  64. package/dist/components/DataGrid/useMergeGridWithRecordSet.d.ts.map +1 -1
  65. package/dist/components/DataGrid/useMergeGridWithRecordSet.js.map +1 -1
  66. package/dist/components/DataGrid/useMergeGridWithSource.d.ts +12 -7
  67. package/dist/components/DataGrid/useMergeGridWithSource.d.ts.map +1 -1
  68. package/dist/components/DataGrid/useMergeGridWithSource.js +31 -25
  69. package/dist/components/DataGrid/useMergeGridWithSource.js.map +1 -1
  70. package/dist/components/DownloadCart/DownloadListTable.js +1 -1
  71. package/dist/components/DynamicForm/DynamicForm.js +1 -1
  72. package/dist/components/EntityAclEditor/EntityAclEditorModal.js +1 -1
  73. package/dist/components/EntityAclEditor/useNotifyNewACLUsers.js +1 -1
  74. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -1
  75. package/dist/components/EntityFinder/EntityIdTextField.d.ts +1 -0
  76. package/dist/components/EntityFinder/EntityIdTextField.d.ts.map +1 -1
  77. package/dist/components/EntityFinder/EntityIdTextField.js +7 -6
  78. package/dist/components/EntityFinder/EntityIdTextField.js.map +1 -1
  79. package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js +1 -1
  80. package/dist/components/EntityFinder/details/view/table/FileEntityMD5Cell.js +1 -1
  81. package/dist/components/EntitySidebar/EntitySidebar.css +1 -1
  82. package/dist/components/EntitySidebar/EntitySidebar.d.ts.map +1 -1
  83. package/dist/components/EntitySidebar/EntitySidebar.js +47 -39
  84. package/dist/components/EntitySidebar/EntitySidebar.js.map +1 -1
  85. package/dist/components/EntitySidebar/EntitySidebar.module.js +11 -11
  86. package/dist/components/EntitySidebar/EntitySidebar.module.js.map +1 -1
  87. package/dist/components/EntitySidebar/EntitySidebar.module.scss +6 -6
  88. package/dist/components/FieldDescription/FieldDescription.css +1 -0
  89. package/dist/components/FieldDescription/FieldDescription.d.ts +15 -0
  90. package/dist/components/FieldDescription/FieldDescription.d.ts.map +1 -0
  91. package/dist/components/FieldDescription/FieldDescription.js +13 -0
  92. package/dist/components/FieldDescription/FieldDescription.js.map +1 -0
  93. package/dist/components/FieldDescription/FieldDescription.module.js +5 -0
  94. package/dist/components/FieldDescription/FieldDescription.module.js.map +1 -0
  95. package/dist/components/FieldDescription/FieldDescription.module.scss +8 -0
  96. package/dist/components/FieldDescription/index.d.ts +3 -0
  97. package/dist/components/FieldDescription/index.d.ts.map +1 -0
  98. package/dist/components/FieldDescription/index.js +2 -0
  99. package/dist/components/IconSvg/IconSvg.d.ts +1 -1
  100. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  101. package/dist/components/IconSvg/IconSvg.js +216 -212
  102. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  103. package/dist/components/OAuthClientAclEditor/OAuthAclEditorModal.js +1 -1
  104. package/dist/components/OAuthClientManagement/OAuthManagement.js +1 -1
  105. package/dist/components/PortalAclEditor/PortalAclEditorModal.js +1 -1
  106. package/dist/components/PortalList/CreatePortalModal.js +1 -1
  107. package/dist/components/PortalList/PortalCard.js +1 -1
  108. package/dist/components/ProjectInfo/ProjectInfo.css +1 -0
  109. package/dist/components/ProjectInfo/ProjectInfo.d.ts +5 -0
  110. package/dist/components/ProjectInfo/ProjectInfo.d.ts.map +1 -0
  111. package/dist/components/ProjectInfo/ProjectInfo.js +50 -0
  112. package/dist/components/ProjectInfo/ProjectInfo.js.map +1 -0
  113. package/dist/components/ProjectInfo/ProjectInfo.module.js +11 -0
  114. package/dist/components/ProjectInfo/ProjectInfo.module.js.map +1 -0
  115. package/dist/components/ProjectInfo/ProjectInfo.module.scss +35 -0
  116. package/dist/components/ProjectInfo/ProjectInfoPopover.d.ts +10 -0
  117. package/dist/components/ProjectInfo/ProjectInfoPopover.d.ts.map +1 -0
  118. package/dist/components/ProjectInfo/ProjectInfoPopover.js +94 -0
  119. package/dist/components/ProjectInfo/ProjectInfoPopover.js.map +1 -0
  120. package/dist/components/ProjectStorage/ProjectDataAvailability.d.ts +2 -1
  121. package/dist/components/ProjectStorage/ProjectDataAvailability.d.ts.map +1 -1
  122. package/dist/components/ProjectStorage/ProjectDataAvailability.js +67 -75
  123. package/dist/components/ProjectStorage/ProjectDataAvailability.js.map +1 -1
  124. package/dist/components/StorybookComponentWrapper.js +1 -1
  125. package/dist/components/SynapseChat/SynapseChat.js +1 -1
  126. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +1 -1
  127. package/dist/components/SynapseTable/table-top/DownloadOptions.js +1 -1
  128. package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
  129. package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js +1 -1
  130. package/dist/components/TextField/TextField.css +1 -1
  131. package/dist/components/TextField/TextField.d.ts.map +1 -1
  132. package/dist/components/TextField/TextField.js +27 -25
  133. package/dist/components/TextField/TextField.js.map +1 -1
  134. package/dist/components/TextField/TextField.module.js +3 -3
  135. package/dist/components/TextField/TextField.module.js.map +1 -1
  136. package/dist/components/TextField/TextField.module.scss +2 -5
  137. package/dist/components/Webhook/WebhookVerificationDialog.js +1 -1
  138. package/dist/components/dataaccess/SubmissionPage/ApproveSubmissionConfirmationModal.js +1 -1
  139. package/dist/components/dataaccess/SubmissionPage/CancelDataAccessRequestConfirmationModal.js +1 -1
  140. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +1 -1
  141. package/dist/components/entity/page/title_bar/EntityPageTitleBar.d.ts.map +1 -1
  142. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js +66 -49
  143. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js.map +1 -1
  144. package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js +1 -1
  145. package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js.map +1 -1
  146. package/dist/components/error/SendMessageToEntityOwnerDialog.js +1 -1
  147. package/dist/components/index.js +1 -1
  148. package/dist/components/menu/ComplexMenu.d.ts.map +1 -1
  149. package/dist/components/menu/ComplexMenu.js +1 -4
  150. package/dist/components/menu/ComplexMenu.js.map +1 -1
  151. package/dist/features/curator/GridPage/components/UpdateGridPageSearchParamsForm.js +1 -1
  152. package/dist/features/curator/GridPage/components/UpdateGridPageSearchParamsForm.js.map +1 -1
  153. package/dist/features/curator/dashboard/CuratorDashboard.d.ts +1 -1
  154. package/dist/features/curator/dashboard/CuratorDashboard.d.ts.map +1 -1
  155. package/dist/features/curator/dashboard/CuratorDashboard.js +36 -35
  156. package/dist/features/curator/dashboard/CuratorDashboard.js.map +1 -1
  157. package/dist/features/curator/dashboard/CuratorDashboardRouter.d.ts +13 -0
  158. package/dist/features/curator/dashboard/CuratorDashboardRouter.d.ts.map +1 -0
  159. package/dist/features/curator/dashboard/CuratorDashboardRouter.js +37 -0
  160. package/dist/features/curator/dashboard/CuratorDashboardRouter.js.map +1 -0
  161. package/dist/features/curator/dashboard/components/CurationTaskCard.css +1 -1
  162. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts +3 -1
  163. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -1
  164. package/dist/features/curator/dashboard/components/CurationTaskCard.js +26 -157
  165. package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -1
  166. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js +10 -6
  167. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js.map +1 -1
  168. package/dist/features/curator/dashboard/components/CurationTaskCard.module.scss +31 -0
  169. package/dist/features/curator/dashboard/components/CurationTaskCardLayout.d.ts +25 -0
  170. package/dist/features/curator/dashboard/components/CurationTaskCardLayout.d.ts.map +1 -0
  171. package/dist/features/curator/dashboard/components/CurationTaskCardLayout.js +134 -0
  172. package/dist/features/curator/dashboard/components/CurationTaskCardLayout.js.map +1 -0
  173. package/dist/features/curator/dashboard/components/ExecutableTaskCard.d.ts +10 -0
  174. package/dist/features/curator/dashboard/components/ExecutableTaskCard.d.ts.map +1 -0
  175. package/dist/features/curator/dashboard/components/ExecutableTaskCard.js +51 -0
  176. package/dist/features/curator/dashboard/components/ExecutableTaskCard.js.map +1 -0
  177. package/dist/features/curator/dashboard/components/GridTaskCard.d.ts +10 -0
  178. package/dist/features/curator/dashboard/components/GridTaskCard.d.ts.map +1 -0
  179. package/dist/features/curator/dashboard/components/GridTaskCard.js +35 -0
  180. package/dist/features/curator/dashboard/components/GridTaskCard.js.map +1 -0
  181. package/dist/features/curator/dashboard/components/NextStepButton.css +1 -1
  182. package/dist/features/curator/dashboard/components/NextStepButton.d.ts +3 -0
  183. package/dist/features/curator/dashboard/components/NextStepButton.d.ts.map +1 -1
  184. package/dist/features/curator/dashboard/components/NextStepButton.js +56 -26
  185. package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -1
  186. package/dist/features/curator/dashboard/components/NextStepButton.module.js +6 -5
  187. package/dist/features/curator/dashboard/components/NextStepButton.module.js.map +1 -1
  188. package/dist/features/curator/dashboard/components/NextStepButton.module.scss +28 -0
  189. package/dist/features/curator/dashboard/components/getExecutableTaskButtonState.d.ts +31 -0
  190. package/dist/features/curator/dashboard/components/getExecutableTaskButtonState.d.ts.map +1 -0
  191. package/dist/features/curator/dashboard/components/getExecutableTaskButtonState.js +32 -0
  192. package/dist/features/curator/dashboard/components/getExecutableTaskButtonState.js.map +1 -0
  193. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -1
  194. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +213 -204
  195. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -1
  196. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts +0 -1
  197. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
  198. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +19 -39
  199. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  200. package/dist/features/entity/metadata-task/components/MetadataTasksPage.d.ts +9 -3
  201. package/dist/features/entity/metadata-task/components/MetadataTasksPage.d.ts.map +1 -1
  202. package/dist/features/entity/metadata-task/components/MetadataTasksPage.js +37 -46
  203. package/dist/features/entity/metadata-task/components/MetadataTasksPage.js.map +1 -1
  204. package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.d.ts +17 -0
  205. package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.d.ts.map +1 -0
  206. package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.js +43 -0
  207. package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.js.map +1 -0
  208. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
  209. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +27 -26
  210. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  211. package/dist/features/entity/metadata-task/create-task/CommonTaskFields.d.ts +16 -0
  212. package/dist/features/entity/metadata-task/create-task/CommonTaskFields.d.ts.map +1 -0
  213. package/dist/features/entity/metadata-task/create-task/CommonTaskFields.js +64 -0
  214. package/dist/features/entity/metadata-task/create-task/CommonTaskFields.js.map +1 -0
  215. package/dist/features/entity/metadata-task/create-task/ComputeTaskForm.d.ts +41 -0
  216. package/dist/features/entity/metadata-task/create-task/ComputeTaskForm.d.ts.map +1 -0
  217. package/dist/features/entity/metadata-task/create-task/ComputeTaskForm.js +165 -0
  218. package/dist/features/entity/metadata-task/create-task/ComputeTaskForm.js.map +1 -0
  219. package/dist/features/entity/metadata-task/create-task/CreateCurationTaskFlow.d.ts +18 -0
  220. package/dist/features/entity/metadata-task/create-task/CreateCurationTaskFlow.d.ts.map +1 -0
  221. package/dist/features/entity/metadata-task/create-task/CreateCurationTaskFlow.js +78 -0
  222. package/dist/features/entity/metadata-task/create-task/CreateCurationTaskFlow.js.map +1 -0
  223. package/dist/features/entity/metadata-task/create-task/CreateTaskCategoryPicker.d.ts +10 -0
  224. package/dist/features/entity/metadata-task/create-task/CreateTaskCategoryPicker.d.ts.map +1 -0
  225. package/dist/features/entity/metadata-task/create-task/CreateTaskCategoryPicker.js +40 -0
  226. package/dist/features/entity/metadata-task/create-task/CreateTaskCategoryPicker.js.map +1 -0
  227. package/dist/features/entity/metadata-task/create-task/CreateTaskConfirmation.d.ts +13 -0
  228. package/dist/features/entity/metadata-task/create-task/CreateTaskConfirmation.d.ts.map +1 -0
  229. package/dist/features/entity/metadata-task/create-task/CreateTaskConfirmation.js +35 -0
  230. package/dist/features/entity/metadata-task/create-task/CreateTaskConfirmation.js.map +1 -0
  231. package/dist/features/entity/metadata-task/create-task/CurateTaskForm.d.ts +41 -0
  232. package/dist/features/entity/metadata-task/create-task/CurateTaskForm.d.ts.map +1 -0
  233. package/dist/features/entity/metadata-task/create-task/CurateTaskForm.js +198 -0
  234. package/dist/features/entity/metadata-task/create-task/CurateTaskForm.js.map +1 -0
  235. package/dist/features/entity/metadata-task/create-task/EditCurationTaskPage.d.ts +8 -0
  236. package/dist/features/entity/metadata-task/create-task/EditCurationTaskPage.d.ts.map +1 -0
  237. package/dist/features/entity/metadata-task/create-task/EditCurationTaskPage.js +29 -0
  238. package/dist/features/entity/metadata-task/create-task/EditCurationTaskPage.js.map +1 -0
  239. package/dist/features/entity/metadata-task/create-task/FileBasedFields.d.ts +13 -0
  240. package/dist/features/entity/metadata-task/create-task/FileBasedFields.d.ts.map +1 -0
  241. package/dist/features/entity/metadata-task/create-task/FileBasedFields.js +65 -0
  242. package/dist/features/entity/metadata-task/create-task/FileBasedFields.js.map +1 -0
  243. package/dist/features/entity/metadata-task/create-task/ProjectSelectorField.d.ts +11 -0
  244. package/dist/features/entity/metadata-task/create-task/ProjectSelectorField.d.ts.map +1 -0
  245. package/dist/features/entity/metadata-task/create-task/ProjectSelectorField.js +33 -0
  246. package/dist/features/entity/metadata-task/create-task/ProjectSelectorField.js.map +1 -0
  247. package/dist/features/entity/metadata-task/create-task/RecordBasedFields.d.ts +13 -0
  248. package/dist/features/entity/metadata-task/create-task/RecordBasedFields.d.ts.map +1 -0
  249. package/dist/features/entity/metadata-task/create-task/RecordBasedFields.js +38 -0
  250. package/dist/features/entity/metadata-task/create-task/RecordBasedFields.js.map +1 -0
  251. package/dist/features/entity/metadata-task/create-task/RecordSetFields.d.ts +13 -0
  252. package/dist/features/entity/metadata-task/create-task/RecordSetFields.d.ts.map +1 -0
  253. package/dist/features/entity/metadata-task/create-task/RecordSetFields.js +72 -0
  254. package/dist/features/entity/metadata-task/create-task/RecordSetFields.js.map +1 -0
  255. package/dist/features/entity/metadata-task/create-task/SampleSheetFields.d.ts +11 -0
  256. package/dist/features/entity/metadata-task/create-task/SampleSheetFields.d.ts.map +1 -0
  257. package/dist/features/entity/metadata-task/create-task/SampleSheetFields.js +42 -0
  258. package/dist/features/entity/metadata-task/create-task/SampleSheetFields.js.map +1 -0
  259. package/dist/features/entity/metadata-task/create-task/TaskCategoryCard.d.ts +17 -0
  260. package/dist/features/entity/metadata-task/create-task/TaskCategoryCard.d.ts.map +1 -0
  261. package/dist/features/entity/metadata-task/create-task/TaskCategoryCard.js +70 -0
  262. package/dist/features/entity/metadata-task/create-task/TaskCategoryCard.js.map +1 -0
  263. package/dist/features/entity/metadata-task/create-task/TaskFormActions.d.ts +23 -0
  264. package/dist/features/entity/metadata-task/create-task/TaskFormActions.d.ts.map +1 -0
  265. package/dist/features/entity/metadata-task/create-task/TaskFormActions.js +68 -0
  266. package/dist/features/entity/metadata-task/create-task/TaskFormActions.js.map +1 -0
  267. package/dist/features/entity/metadata-task/create-task/TaskFormHeader.d.ts +17 -0
  268. package/dist/features/entity/metadata-task/create-task/TaskFormHeader.d.ts.map +1 -0
  269. package/dist/features/entity/metadata-task/create-task/TaskFormHeader.js +33 -0
  270. package/dist/features/entity/metadata-task/create-task/TaskFormHeader.js.map +1 -0
  271. package/dist/features/entity/metadata-task/create-task/useCurationTaskFormState.d.ts +50 -0
  272. package/dist/features/entity/metadata-task/create-task/useCurationTaskFormState.d.ts.map +1 -0
  273. package/dist/features/entity/metadata-task/create-task/useCurationTaskFormState.js +76 -0
  274. package/dist/features/entity/metadata-task/create-task/useCurationTaskFormState.js.map +1 -0
  275. package/dist/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.d.ts +36 -0
  276. package/dist/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.d.ts.map +1 -0
  277. package/dist/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.js +31 -0
  278. package/dist/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.js.map +1 -0
  279. package/dist/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.d.ts +32 -0
  280. package/dist/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.d.ts.map +1 -0
  281. package/dist/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.js +33 -0
  282. package/dist/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.js.map +1 -0
  283. package/dist/features/entity/metadata-task/create-task/utils/taskIdValidation.d.ts +10 -0
  284. package/dist/features/entity/metadata-task/create-task/utils/taskIdValidation.d.ts.map +1 -0
  285. package/dist/features/entity/metadata-task/create-task/utils/taskIdValidation.js +13 -0
  286. package/dist/features/entity/metadata-task/create-task/utils/taskIdValidation.js.map +1 -0
  287. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.d.ts.map +1 -1
  288. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js +24 -24
  289. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
  290. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.d.ts.map +1 -1
  291. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js +2 -2
  292. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js.map +1 -1
  293. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.d.ts.map +1 -1
  294. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +33 -32
  295. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
  296. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -1
  297. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +24 -21
  298. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -1
  299. package/dist/features/entity/metadata-task/utils/constants.d.ts +84 -15
  300. package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -1
  301. package/dist/features/entity/metadata-task/utils/constants.js +47 -3
  302. package/dist/features/entity/metadata-task/utils/constants.js.map +1 -1
  303. package/dist/features/entity/metadata-task/utils/dueDate.d.ts +22 -0
  304. package/dist/features/entity/metadata-task/utils/dueDate.d.ts.map +1 -0
  305. package/dist/features/entity/metadata-task/utils/dueDate.js +24 -0
  306. package/dist/features/entity/metadata-task/utils/dueDate.js.map +1 -0
  307. package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.d.ts +2 -2
  308. package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.d.ts.map +1 -1
  309. package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.js +5 -6
  310. package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.js.map +1 -1
  311. package/dist/features/entity/metadata-task/utils/getGridSourceIdForTask.d.ts +4 -4
  312. package/dist/features/entity/metadata-task/utils/getGridSourceIdForTask.d.ts.map +1 -1
  313. package/dist/features/entity/metadata-task/utils/getGridSourceIdForTask.js +5 -6
  314. package/dist/features/entity/metadata-task/utils/getGridSourceIdForTask.js.map +1 -1
  315. package/dist/features/entity/metadata-task/utils/types.d.ts +12 -0
  316. package/dist/features/entity/metadata-task/utils/types.d.ts.map +1 -0
  317. package/dist/features/entity/metadata-task/utils/types.js +18 -0
  318. package/dist/features/entity/metadata-task/utils/types.js.map +1 -0
  319. package/dist/mocks/curation/mockCurationTask.d.ts +6 -0
  320. package/dist/mocks/curation/mockCurationTask.d.ts.map +1 -1
  321. package/dist/mocks/curation/mockCurationTask.js +20 -3
  322. package/dist/mocks/curation/mockCurationTask.js.map +1 -1
  323. package/dist/mocks/msw/handlers/curationTaskExecutionHandlers.d.ts +16 -0
  324. package/dist/mocks/msw/handlers/curationTaskExecutionHandlers.d.ts.map +1 -0
  325. package/dist/mocks/msw/handlers/curationTaskExecutionHandlers.js +24 -0
  326. package/dist/mocks/msw/handlers/curationTaskExecutionHandlers.js.map +1 -0
  327. package/dist/synapse-client/SynapseClient.d.ts +7 -1
  328. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  329. package/dist/synapse-client/SynapseClient.js +493 -482
  330. package/dist/synapse-client/SynapseClient.js.map +1 -1
  331. package/dist/synapse-client/index.js +3 -3
  332. package/dist/synapse-queries/curation/task/useCurationTask.d.ts +8 -1
  333. package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
  334. package/dist/synapse-queries/curation/task/useCurationTask.js +48 -34
  335. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  336. package/dist/theme/palette/Palettes.js +2 -2
  337. package/dist/theme/palette/Palettes.js.map +1 -1
  338. package/dist/tsconfig.build.tsbuildinfo +1 -1
  339. package/dist/utils/AppUtils/session/useSessionManager.d.ts.map +1 -1
  340. package/dist/utils/AppUtils/session/useSessionManager.js +50 -48
  341. package/dist/utils/AppUtils/session/useSessionManager.js.map +1 -1
  342. package/dist/utils/SynapseConstants.d.ts +4 -1
  343. package/dist/utils/SynapseConstants.d.ts.map +1 -1
  344. package/dist/utils/SynapseConstants.js +86 -83
  345. package/dist/utils/SynapseConstants.js.map +1 -1
  346. package/dist/utils/featureflag/FeatureFlags.d.ts +2 -2
  347. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
  348. package/dist/utils/featureflag/FeatureFlags.js +1 -1
  349. package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
  350. package/dist/utils/hooks/useDetectSSOCode.d.ts.map +1 -1
  351. package/dist/utils/hooks/useDetectSSOCode.js +37 -27
  352. package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
  353. package/package.json +5 -5
  354. package/dist/components/DataGrid/MergeGridWithSourceTableButton.d.ts +0 -8
  355. package/dist/components/DataGrid/MergeGridWithSourceTableButton.d.ts.map +0 -1
  356. package/dist/components/DataGrid/MergeGridWithSourceTableButton.js +0 -64
  357. package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +0 -1
@@ -1,166 +1,35 @@
1
1
  import { displayToast as e } from "../../../../components/ToastMessage/ToastMessage.js";
2
- import t from "../../../../synapse-queries/entity/useEntityBundle.js";
3
2
  import "../../../../components/index.js";
4
- import { OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE as n, TASK_STATUS_CONFIG as r } from "../../../entity/metadata-task/utils/constants.js";
5
- import i from "../../../entity/metadata-task/hooks/useOpenCuratorButton.js";
6
- import a from "../../../entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js";
7
- import o from "./CurationTaskCard.module.js";
8
- import s from "./NextStepButton.js";
9
- import c from "./shared.module.js";
10
- import l from "./UserOrTeamChip.js";
11
- import { useState as u } from "react";
12
- import { Box as d, Card as f, Chip as p, Divider as m, IconButton as h, Skeleton as g, Typography as _ } from "@mui/material";
13
- import { jsx as v, jsxs as y } from "react/jsx-runtime";
14
- import b from "classnames";
15
- import x from "@mui/icons-material/SettingsOutlined";
3
+ import { getComputeTaskConcreteType as t } from "../../../entity/metadata-task/utils/types.js";
4
+ import n from "./CurationTaskCard.module.js";
5
+ import r, { deriveCardFields as i } from "./CurationTaskCardLayout.js";
6
+ import a from "./NextStepButton.js";
7
+ import o from "./ExecutableTaskCard.js";
8
+ import s from "./GridTaskCard.js";
9
+ import { jsx as c } from "react/jsx-runtime";
16
10
  //#region src/features/curator/dashboard/components/CurationTaskCard.tsx
17
- function S(t) {
18
- let { onClick: n, isLoading: r, isPending: a, hasPermission: o } = i(t);
19
- if (!t.task || !t.status) throw Error("Task bundle is missing required properties");
20
- switch (t.task?.taskProperties?.concreteType) {
11
+ function l(l) {
12
+ let { taskBundle: u } = l;
13
+ if (!u.task || !u.status) throw Error("Task bundle is missing required properties");
14
+ let d = u.task.taskProperties?.concreteType;
15
+ if (t(u.task.taskProperties)) return /* @__PURE__ */ c(o, { taskBundle: u });
16
+ switch (d) {
21
17
  case "org.sagebionetworks.repo.model.curation.metadata.FileBasedMetadataTaskProperties":
22
- case "org.sagebionetworks.repo.model.curation.metadata.RecordBasedMetadataTaskProperties": return {
23
- title: t.task.dataType,
24
- description: t.task.instructions ?? "",
25
- taskId: t.task.taskId,
26
- principalIds: t.task.assigneePrincipalId ? [t.task.assigneePrincipalId] : [],
27
- buttonText: "Open Curator",
28
- taskType: "Curate Data",
29
- statusState: t.status.state,
30
- onClickNextStep: n,
31
- isLoading: r,
32
- isPending: a,
33
- hasPermission: o
34
- };
35
- default: console.error("No UI implemented for task type: " + t.task?.taskProperties?.concreteType);
18
+ case "org.sagebionetworks.repo.model.curation.metadata.RecordBasedMetadataTaskProperties": return /* @__PURE__ */ c(s, { taskBundle: u });
19
+ default: return console.error("No UI implemented for task type: " + d), /* @__PURE__ */ c(r, {
20
+ taskBundle: u,
21
+ ...i(u.task),
22
+ taskType: "",
23
+ renderActionButton: ({ expanded: t }) => /* @__PURE__ */ c(a, {
24
+ className: n.cardButton,
25
+ buttonText: "Continue",
26
+ onClick: () => e("No action defined for this task type", "danger", { title: "Unexpected Error" }),
27
+ expanded: t
28
+ })
29
+ });
36
30
  }
37
- return {
38
- title: t.task.dataType,
39
- description: t.task.instructions ?? "",
40
- taskId: t.task.taskId,
41
- principalIds: t.task.assigneePrincipalId ? [t.task.assigneePrincipalId] : [],
42
- buttonText: "Continue",
43
- taskType: "",
44
- statusState: t.status.state,
45
- onClickNextStep: () => {
46
- e("No action defined for this task type", "danger", { title: "Unexpected Error" });
47
- },
48
- isLoading: !1,
49
- isPending: !1,
50
- hasPermission: void 0
51
- };
52
- }
53
- function C(e) {
54
- let { label: t } = e;
55
- return /* @__PURE__ */ v(p, {
56
- sx: {
57
- fontWeight: 600,
58
- backgroundColor: "#BFD3ED"
59
- },
60
- label: t
61
- });
62
- }
63
- function w(e) {
64
- let { state: t } = e;
65
- if (!t) return null;
66
- let { label: n, backgroundColor: i } = r[t];
67
- return /* @__PURE__ */ v(p, {
68
- size: "small",
69
- sx: {
70
- fontWeight: 600,
71
- backgroundColor: i
72
- },
73
- label: n
74
- });
75
- }
76
- function T(r) {
77
- let { taskBundle: i } = r, { title: p, description: T, taskId: E, taskType: D, principalIds: O, buttonText: k, statusState: A, onClickNextStep: j, hasPermission: M, isLoading: N, isPending: P } = S(i), [F, I] = u(!1), L = i.task?.projectId, { data: R } = t(L, void 0, {
78
- includeEntity: !0,
79
- includePermissions: !0
80
- }), z = R?.permissions?.canEdit ?? !1;
81
- function B() {
82
- M ? j() : e(n, "danger");
83
- }
84
- return /* @__PURE__ */ y(f, {
85
- className: b(c.card, o.card),
86
- children: [/* @__PURE__ */ y("div", {
87
- className: o.cardContent,
88
- children: [
89
- /* @__PURE__ */ y("div", {
90
- className: o.mainContent,
91
- children: [
92
- /* @__PURE__ */ y("div", {
93
- className: o.titleChipContainer,
94
- children: [
95
- /* @__PURE__ */ v(_, {
96
- variant: "headline3",
97
- children: p
98
- }),
99
- D && /* @__PURE__ */ v(C, { label: D }),
100
- z && /* @__PURE__ */ v(h, {
101
- onClick: () => I(!0),
102
- "aria-label": "Task settings",
103
- children: /* @__PURE__ */ v(x, {})
104
- })
105
- ]
106
- }),
107
- /* @__PURE__ */ y(d, {
108
- sx: {
109
- display: "flex",
110
- gap: 4
111
- },
112
- children: [R?.entity?.name ? /* @__PURE__ */ v(_, {
113
- variant: "body1",
114
- children: R.entity.name
115
- }) : /* @__PURE__ */ v(g, { width: 100 }), E && /* @__PURE__ */ y(_, {
116
- variant: "body1",
117
- children: ["Task ID: ", E]
118
- })]
119
- }),
120
- T && /* @__PURE__ */ v(_, {
121
- variant: "body1",
122
- children: T
123
- }),
124
- /* @__PURE__ */ v("div", {
125
- className: o.userChipContainer,
126
- children: O.map((e) => /* @__PURE__ */ v(l, { principalId: e }, e))
127
- })
128
- ]
129
- }),
130
- /* @__PURE__ */ v(d, {
131
- sx: {
132
- display: "flex",
133
- alignItems: "center"
134
- },
135
- children: /* @__PURE__ */ v(w, { state: A })
136
- }),
137
- /* @__PURE__ */ v(m, {
138
- orientation: "vertical",
139
- flexItem: !0,
140
- sx: { display: {
141
- xs: "none",
142
- md: "block"
143
- } }
144
- }),
145
- /* @__PURE__ */ v(s, {
146
- className: o.cardButton,
147
- buttonText: k,
148
- onClick: B,
149
- disabled: N,
150
- loading: P
151
- })
152
- ]
153
- }), /* @__PURE__ */ v(a, {
154
- open: F,
155
- onCancel: () => I(!1),
156
- onSuccess: () => I(!1),
157
- onDeleteSuccess: () => I(!1),
158
- projectId: L ?? "",
159
- task: i.task
160
- }, String(F))]
161
- });
162
31
  }
163
32
  //#endregion
164
- export { T as default };
33
+ export { l as default };
165
34
 
166
35
  //# sourceMappingURL=CurationTaskCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CurationTaskCard.js","names":[],"sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCard.tsx"],"sourcesContent":["import { displayToast } from '@/components'\nimport CreateOrUpdateCurationTaskDialog from '@/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog'\nimport { TASK_STATUS_CONFIG } from '@/features/entity/metadata-task/utils/constants'\nimport useOpenCuratorFromTaskButton from '@/features/entity/metadata-task/hooks/useOpenCuratorButton'\nimport { OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE } from '@/features/entity/metadata-task/utils/constants'\nimport useGetEntityBundle from '@/synapse-queries/entity/useEntityBundle'\nimport {\n Box,\n Card,\n Chip,\n Divider,\n IconButton,\n Skeleton,\n Typography,\n} from '@mui/material'\nimport {\n TaskBundle,\n TaskStatusStateEnum,\n} from '@sage-bionetworks/synapse-client'\nimport classNames from 'classnames'\nimport styles from './CurationTaskCard.module.scss'\nimport NextStepButton from './NextStepButton'\nimport sharedStyles from './shared.module.scss'\nimport UserOrTeamChip from './UserOrTeamChip'\nimport SettingsOutlinedIcon from '@mui/icons-material/SettingsOutlined'\nimport { useState } from 'react'\n\nexport type CurationTaskCardProps = {\n taskBundle: TaskBundle\n}\n\nfunction useUiForTask(taskBundle: TaskBundle) {\n const { onClick, isLoading, isPending, hasPermission } =\n useOpenCuratorFromTaskButton(taskBundle)\n\n if (!taskBundle.task || !taskBundle.status) {\n throw new Error('Task bundle is missing required properties')\n }\n\n switch (taskBundle.task?.taskProperties?.concreteType) {\n case 'org.sagebionetworks.repo.model.curation.metadata.FileBasedMetadataTaskProperties':\n case 'org.sagebionetworks.repo.model.curation.metadata.RecordBasedMetadataTaskProperties':\n return {\n title: taskBundle.task.dataType,\n description: taskBundle.task.instructions ?? '',\n taskId: taskBundle.task.taskId,\n principalIds: taskBundle.task.assigneePrincipalId\n ? [taskBundle.task.assigneePrincipalId]\n : [],\n buttonText: 'Open Curator',\n taskType: 'Curate Data',\n statusState: taskBundle.status.state,\n onClickNextStep: onClick,\n isLoading,\n isPending,\n hasPermission,\n }\n default: {\n console.error(\n 'No UI implemented for task type: ' +\n // @ts-expect-error - the switch should be exhaustive for known types\n taskBundle.task?.taskProperties?.concreteType,\n )\n }\n }\n\n return {\n title: taskBundle.task.dataType,\n description: taskBundle.task.instructions ?? '',\n taskId: taskBundle.task.taskId!,\n principalIds: taskBundle.task.assigneePrincipalId\n ? [taskBundle.task.assigneePrincipalId]\n : [],\n buttonText: 'Continue',\n taskType: '',\n statusState: taskBundle.status.state,\n onClickNextStep: () => {\n displayToast('No action defined for this task type', 'danger', {\n title: 'Unexpected Error',\n })\n },\n isLoading: false,\n isPending: false,\n hasPermission: undefined,\n }\n}\n\nfunction TaskTypeChip(props: { label: string }) {\n const { label } = props\n return (\n <Chip sx={{ fontWeight: 600, backgroundColor: '#BFD3ED' }} label={label} />\n )\n}\n\nfunction TaskStatusChip(props: { state: TaskStatusStateEnum | undefined }) {\n const { state } = props\n if (!state) return null\n const { label, backgroundColor } = TASK_STATUS_CONFIG[state]\n return (\n <Chip\n size=\"small\"\n sx={{ fontWeight: 600, backgroundColor }}\n label={label}\n />\n )\n}\n\n/**\n * Card component for displaying a curation task on the curator dashboard. Shows relevant information about the task and includes a button to proceed to the next step in the workflow.\n */\nexport default function CurationTaskCard(props: CurationTaskCardProps) {\n const { taskBundle } = props\n const {\n title,\n description,\n taskId,\n taskType,\n principalIds,\n buttonText,\n statusState,\n onClickNextStep,\n hasPermission: hasPermissionToOpenGrid,\n isLoading,\n isPending,\n } = useUiForTask(taskBundle)\n\n const [isSettingsOpen, setIsSettingsOpen] = useState(false)\n\n const projectId = taskBundle.task?.projectId\n const { data: bundle } = useGetEntityBundle(projectId, undefined, {\n includeEntity: true,\n includePermissions: true,\n })\n const canEdit = bundle?.permissions?.canEdit ?? false\n\n function onClickAction() {\n if (hasPermissionToOpenGrid) {\n onClickNextStep()\n } else {\n displayToast(OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE, 'danger')\n }\n }\n\n return (\n <Card className={classNames(sharedStyles.card, styles.card)}>\n <div className={styles.cardContent}>\n <div className={styles.mainContent}>\n <div className={styles.titleChipContainer}>\n <Typography variant=\"headline3\">{title}</Typography>\n {taskType && <TaskTypeChip label={taskType} />}\n {canEdit && (\n <IconButton\n onClick={() => setIsSettingsOpen(true)}\n aria-label=\"Task settings\"\n >\n <SettingsOutlinedIcon />\n </IconButton>\n )}\n </div>\n <Box sx={{ display: 'flex', gap: 4 }}>\n {bundle?.entity?.name ? (\n <Typography variant=\"body1\">{bundle.entity.name}</Typography>\n ) : (\n <Skeleton width={100} />\n )}\n {taskId && (\n <Typography variant=\"body1\">Task ID: {taskId}</Typography>\n )}\n </Box>\n {description && (\n <Typography variant=\"body1\">{description}</Typography>\n )}\n <div className={styles.userChipContainer}>\n {principalIds.map(principalId => (\n <UserOrTeamChip key={principalId} principalId={principalId} />\n ))}\n </div>\n </div>\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <TaskStatusChip state={statusState} />\n </Box>\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={{ display: { xs: 'none', md: 'block' } }}\n />\n <NextStepButton\n className={styles.cardButton}\n buttonText={buttonText}\n onClick={onClickAction}\n disabled={isLoading}\n loading={isPending}\n />\n </div>\n <CreateOrUpdateCurationTaskDialog\n key={String(isSettingsOpen)}\n open={isSettingsOpen}\n onCancel={() => setIsSettingsOpen(false)}\n onSuccess={() => setIsSettingsOpen(false)}\n onDeleteSuccess={() => setIsSettingsOpen(false)}\n projectId={projectId ?? ''}\n task={taskBundle.task}\n />\n </Card>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CurationTaskCard.js","names":[],"sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCard.tsx"],"sourcesContent":["import { displayToast } from '@/components'\nimport { getComputeTaskConcreteType } from '@/features/entity/metadata-task/utils/types'\nimport { TaskBundle } from '@sage-bionetworks/synapse-client'\nimport CurationTaskCardLayout, {\n deriveCardFields,\n} from './CurationTaskCardLayout'\nimport ExecutableTaskCard from './ExecutableTaskCard'\nimport GridTaskCard from './GridTaskCard'\nimport NextStepButton from './NextStepButton'\nimport styles from './CurationTaskCard.module.scss'\n\nexport type CurationTaskCardProps = {\n taskBundle: TaskBundle\n}\n\n/**\n * Card component for displaying a curation task on the curator dashboard. Dispatches to the card\n * variant appropriate for the task's type: an executable (Compute Data) task, a grid-supported\n * (Curate Data) task, or a fallback for unrecognized types.\n */\nexport default function CurationTaskCard(props: CurationTaskCardProps) {\n const { taskBundle } = props\n\n if (!taskBundle.task || !taskBundle.status) {\n throw new Error('Task bundle is missing required properties')\n }\n\n const concreteType = taskBundle.task.taskProperties?.concreteType\n\n if (getComputeTaskConcreteType(taskBundle.task.taskProperties)) {\n return <ExecutableTaskCard taskBundle={taskBundle} />\n }\n\n switch (concreteType) {\n case 'org.sagebionetworks.repo.model.curation.metadata.FileBasedMetadataTaskProperties':\n case 'org.sagebionetworks.repo.model.curation.metadata.RecordBasedMetadataTaskProperties':\n return <GridTaskCard taskBundle={taskBundle} />\n default:\n console.error('No UI implemented for task type: ' + concreteType)\n return (\n <CurationTaskCardLayout\n taskBundle={taskBundle}\n {...deriveCardFields(taskBundle.task)}\n taskType=\"\"\n renderActionButton={({ expanded }) => (\n <NextStepButton\n className={styles.cardButton}\n buttonText=\"Continue\"\n onClick={() =>\n displayToast('No action defined for this task type', 'danger', {\n title: 'Unexpected Error',\n })\n }\n expanded={expanded}\n />\n )}\n />\n )\n }\n}\n"],"mappings":";;;;;;;;;;AAoBA,SAAwB,EAAiB,GAA8B;CACrE,IAAM,EAAE,kBAAe;CAEvB,IAAI,CAAC,EAAW,QAAQ,CAAC,EAAW,QAClC,MAAU,MAAM,4CAA4C;CAG9D,IAAM,IAAe,EAAW,KAAK,gBAAgB;CAErD,IAAI,EAA2B,EAAW,KAAK,cAAc,GAC3D,OAAO,kBAAC,GAAD,EAAgC,cAAa,CAAA;CAGtD,QAAQ,GAAR;EACE,KAAK;EACL,KAAK,sFACH,OAAO,kBAAC,GAAD,EAA0B,cAAa,CAAA;EAChD,SAEE,OADA,QAAQ,MAAM,sCAAsC,CAAY,GAE9D,kBAAC,GAAD;GACc;GACZ,GAAI,EAAiB,EAAW,IAAI;GACpC,UAAS;GACT,qBAAqB,EAAE,kBACrB,kBAAC,GAAD;IACE,WAAW,EAAO;IAClB,YAAW;IACX,eACE,EAAa,wCAAwC,UAAU,EAC7D,OAAO,mBACT,CAAC;IAEO;GACX,CAAA;EAEJ,CAAA;CAEP;AACF"}
@@ -1,10 +1,14 @@
1
1
  import './CurationTaskCard.css';var e = {
2
- card: "_card_12r05_1",
3
- cardContent: "_cardContent_12r05_5",
4
- mainContent: "_mainContent_12r05_18",
5
- titleChipContainer: "_titleChipContainer_12r05_25",
6
- userChipContainer: "_userChipContainer_12r05_39",
7
- buttonContainer: "_buttonContainer_12r05_47"
2
+ card: "_card_pb0lb_1",
3
+ cardContent: "_cardContent_pb0lb_5",
4
+ mainContent: "_mainContent_pb0lb_18",
5
+ titleChipContainer: "_titleChipContainer_pb0lb_26",
6
+ title: "_title_pb0lb_26",
7
+ entityInfo: "_entityInfo_pb0lb_47",
8
+ statusContainer: "_statusContainer_pb0lb_52",
9
+ expandedContent: "_expandedContent_pb0lb_59",
10
+ userChipContainer: "_userChipContainer_pb0lb_69",
11
+ buttonContainer: "_buttonContainer_pb0lb_77"
8
12
  };
9
13
  //#endregion
10
14
  export { e as default };
@@ -1 +1 @@
1
- {"version":3,"file":"CurationTaskCard.module.js","names":[],"sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCard.module.scss"],"sourcesContent":[".card:global(.MuiCard-root) {\n background-color: #f5f8fa;\n}\n\n.cardContent {\n display: flex;\n flex-direction: row;\n margin-bottom: 16px;\n gap: 24px;\n align-items: stretch;\n\n @media (max-width: 768px) {\n flex-direction: column;\n }\n}\n\n.mainContent {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex-grow: 1;\n}\n\n.titleChipContainer {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 16px;\n align-items: center;\n @media (max-width: 768px) {\n flex-direction: column;\n align-items: flex-start;\n }\n}\n\n.userChipContainer {\n display: flex;\n flex-direction: row;\n gap: 16px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.buttonContainer {\n display: flex;\n flex-grow: 0;\n flex-shrink: 0;\n margin-left: auto;\n @media (max-width: 768px) {\n margin-left: 0;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"CurationTaskCard.module.js","names":[],"sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCard.module.scss"],"sourcesContent":[".card:global(.MuiCard-root) {\n background-color: #f5f8fa;\n}\n\n.cardContent {\n display: flex;\n flex-direction: row;\n margin-bottom: 16px;\n gap: 24px;\n align-items: stretch;\n\n @media (max-width: 768px) {\n flex-direction: column;\n }\n}\n\n.mainContent {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex-grow: 1;\n flex: 1;\n}\n\n.titleChipContainer {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 16px;\n align-items: center;\n @media (max-width: 768px) {\n flex-direction: column;\n align-items: flex-start;\n }\n}\n\n.title {\n cursor: pointer;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.entityInfo {\n display: flex;\n gap: 16px;\n}\n\n.statusContainer {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n}\n\n.expandedContent {\n background-color: #fff;\n padding: 16px;\n margin: 16px;\n border-radius: 4px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.userChipContainer {\n display: flex;\n flex-direction: row;\n gap: 16px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.buttonContainer {\n display: flex;\n flex-grow: 0;\n flex-shrink: 0;\n margin-left: auto;\n @media (max-width: 768px) {\n margin-left: 0;\n }\n}\n"],"mappings":""}
@@ -19,6 +19,7 @@
19
19
  flex-direction: column;
20
20
  gap: 16px;
21
21
  flex-grow: 1;
22
+ flex: 1;
22
23
  }
23
24
 
24
25
  .titleChipContainer {
@@ -33,6 +34,36 @@
33
34
  }
34
35
  }
35
36
 
37
+ .title {
38
+ cursor: pointer;
39
+
40
+ &:hover {
41
+ text-decoration: underline;
42
+ }
43
+ }
44
+
45
+ .entityInfo {
46
+ display: flex;
47
+ gap: 16px;
48
+ }
49
+
50
+ .statusContainer {
51
+ display: flex;
52
+ flex-direction: column;
53
+ align-items: flex-start;
54
+ gap: 8px;
55
+ }
56
+
57
+ .expandedContent {
58
+ background-color: #fff;
59
+ padding: 16px;
60
+ margin: 16px;
61
+ border-radius: 4px;
62
+ display: flex;
63
+ flex-direction: column;
64
+ gap: 16px;
65
+ }
66
+
36
67
  .userChipContainer {
37
68
  display: flex;
38
69
  flex-direction: row;
@@ -0,0 +1,25 @@
1
+ import { TaskBundle } from '@sage-bionetworks/synapse-client';
2
+ import { ReactNode } from 'react';
3
+ export type CurationTaskCardLayoutProps = {
4
+ taskBundle: TaskBundle;
5
+ title: string;
6
+ description: string;
7
+ taskType: string;
8
+ principalIds: string[];
9
+ /** Renders the action button. `expanded` reflects whether the card is in its expanded layout. */
10
+ renderActionButton: (props: {
11
+ expanded: boolean;
12
+ }) => ReactNode;
13
+ };
14
+ /** Derives the fields shared by every card variant from a task's common properties. */
15
+ export declare function deriveCardFields(task: TaskBundle['task']): {
16
+ title: string;
17
+ description: string;
18
+ principalIds: string[];
19
+ };
20
+ /**
21
+ * Shared presentational chrome for a curation task card: title, chips, entity info, assignees,
22
+ * status/due date, and an action button slot. Both the grid and executable task cards compose this.
23
+ */
24
+ export default function CurationTaskCardLayout(props: CurationTaskCardLayoutProps): import("react/jsx-runtime").JSX.Element;
25
+ //# sourceMappingURL=CurationTaskCardLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CurationTaskCardLayout.d.ts","sourceRoot":"","sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCardLayout.tsx"],"names":[],"mappings":"AASA,OAAO,EACL,UAAU,EAEX,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAY,MAAM,OAAO,CAAA;AA+D3C,MAAM,MAAM,2BAA2B,GAAG;IACxC,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,iGAAiG;IACjG,kBAAkB,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,KAAK,SAAS,CAAA;CAChE,CAAA;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;;;;EAMxD;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,KAAK,EAAE,2BAA2B,2CAqFnC"}
@@ -0,0 +1,134 @@
1
+ import e from "../../../../synapse-queries/entity/useEntityBundle.js";
2
+ import { TASK_STATUS_CONFIG as t } from "../../../entity/metadata-task/utils/constants.js";
3
+ import { parseDueDate as n } from "../../../entity/metadata-task/utils/dueDate.js";
4
+ import r from "./CurationTaskCard.module.js";
5
+ import i from "./shared.module.js";
6
+ import a from "./UserOrTeamChip.js";
7
+ import { useState as o } from "react";
8
+ import { Card as s, Chip as c, Collapse as l, Divider as u, IconButton as d, Skeleton as f, Typography as p } from "@mui/material";
9
+ import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
10
+ import { useNavigate as _ } from "react-router";
11
+ import v from "dayjs";
12
+ import y from "dayjs/plugin/utc";
13
+ import b from "classnames";
14
+ import x from "@mui/icons-material/SettingsOutlined";
15
+ //#region src/features/curator/dashboard/components/CurationTaskCardLayout.tsx
16
+ v.extend(y);
17
+ function S(e) {
18
+ let { label: t } = e;
19
+ return /* @__PURE__ */ h(c, {
20
+ sx: {
21
+ fontWeight: 600,
22
+ backgroundColor: "#BFD3ED"
23
+ },
24
+ label: t
25
+ });
26
+ }
27
+ function C(e) {
28
+ let { state: n } = e;
29
+ if (!n) return null;
30
+ let { label: r, backgroundColor: i } = t[n];
31
+ return /* @__PURE__ */ h(c, {
32
+ size: "small",
33
+ sx: {
34
+ fontWeight: 600,
35
+ backgroundColor: i
36
+ },
37
+ label: r
38
+ });
39
+ }
40
+ function w(e) {
41
+ let { dueDate: t } = e, r = n(t);
42
+ if (!r) return null;
43
+ let i = r.diff(v.utc().startOf("day"), "day"), a = r.format("MM/DD/YY"), o = "#E0E0E0";
44
+ return i < 0 ? o = "#FFCDD2" : i < 30 && (o = "#FFF9C4"), /* @__PURE__ */ h(c, {
45
+ size: "small",
46
+ sx: {
47
+ fontWeight: 600,
48
+ backgroundColor: o
49
+ },
50
+ label: `Due ${a}`
51
+ });
52
+ }
53
+ function T(e) {
54
+ return {
55
+ title: e?.dataType ?? "",
56
+ description: e?.instructions ?? "",
57
+ principalIds: e?.assigneePrincipalId ? [e.assigneePrincipalId] : []
58
+ };
59
+ }
60
+ function E(t) {
61
+ let { taskBundle: n, title: c, description: v, taskType: y, principalIds: T, renderActionButton: E } = t, D = _(), [O, k] = o(!1), A = n.task?.taskId, j = n.task?.projectId, { data: M } = e(j, void 0, {
62
+ includeEntity: !0,
63
+ includePermissions: !0
64
+ }), N = M?.permissions?.canEdit ?? !1;
65
+ return /* @__PURE__ */ g(s, {
66
+ className: b(i.card, r.card),
67
+ children: [/* @__PURE__ */ g("div", {
68
+ className: r.cardContent,
69
+ children: [
70
+ /* @__PURE__ */ g("div", {
71
+ className: r.mainContent,
72
+ children: [
73
+ /* @__PURE__ */ g("div", {
74
+ className: r.titleChipContainer,
75
+ children: [
76
+ /* @__PURE__ */ h(p, {
77
+ variant: "headline3",
78
+ className: r.title,
79
+ onClick: () => k(!O),
80
+ children: c
81
+ }),
82
+ y && /* @__PURE__ */ h(S, { label: y }),
83
+ N && /* @__PURE__ */ h(d, {
84
+ onClick: () => void D(`edit/${A}`),
85
+ "aria-label": "Task settings",
86
+ children: /* @__PURE__ */ h(x, {})
87
+ })
88
+ ]
89
+ }),
90
+ /* @__PURE__ */ g("div", {
91
+ className: r.entityInfo,
92
+ children: [M?.entity?.name ? /* @__PURE__ */ h(p, {
93
+ variant: "body1",
94
+ children: M.entity.name
95
+ }) : /* @__PURE__ */ h(f, { width: 100 }), A && /* @__PURE__ */ g(p, {
96
+ variant: "body1",
97
+ children: ["Task ID: ", A]
98
+ })]
99
+ }),
100
+ /* @__PURE__ */ h("div", {
101
+ className: r.userChipContainer,
102
+ children: T.map((e) => /* @__PURE__ */ h(a, { principalId: e }, e))
103
+ })
104
+ ]
105
+ }),
106
+ /* @__PURE__ */ g("div", {
107
+ className: r.statusContainer,
108
+ children: [/* @__PURE__ */ h(C, { state: n.status?.state }), /* @__PURE__ */ h(w, { dueDate: n.status?.dueDate })]
109
+ }),
110
+ !O && /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(u, {
111
+ orientation: "vertical",
112
+ flexItem: !0,
113
+ sx: { display: {
114
+ xs: "none",
115
+ md: "block"
116
+ } }
117
+ }), E({ expanded: !1 })] })
118
+ ]
119
+ }), /* @__PURE__ */ h(l, {
120
+ in: O,
121
+ children: /* @__PURE__ */ g("div", {
122
+ className: r.expandedContent,
123
+ children: [v && /* @__PURE__ */ h(p, {
124
+ variant: "body1",
125
+ children: v
126
+ }), E({ expanded: !0 })]
127
+ })
128
+ })]
129
+ });
130
+ }
131
+ //#endregion
132
+ export { E as default, T as deriveCardFields };
133
+
134
+ //# sourceMappingURL=CurationTaskCardLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CurationTaskCardLayout.js","names":[],"sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCardLayout.tsx"],"sourcesContent":["import {\n Card,\n Chip,\n Collapse,\n Divider,\n IconButton,\n Skeleton,\n Typography,\n} from '@mui/material'\nimport {\n TaskBundle,\n TaskStatusStateEnum,\n} from '@sage-bionetworks/synapse-client'\nimport classNames from 'classnames'\nimport { ReactNode, useState } from 'react'\nimport { useNavigate } from 'react-router'\nimport dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport SettingsOutlinedIcon from '@mui/icons-material/SettingsOutlined'\nimport useGetEntityBundle from '@/synapse-queries/entity/useEntityBundle'\nimport { TASK_STATUS_CONFIG } from '@/features/entity/metadata-task/utils/constants'\nimport { parseDueDate } from '@/features/entity/metadata-task/utils/dueDate'\nimport styles from './CurationTaskCard.module.scss'\nimport sharedStyles from './shared.module.scss'\nimport UserOrTeamChip from './UserOrTeamChip'\n\ndayjs.extend(utc)\n\nfunction TaskTypeChip(props: { label: string }) {\n const { label } = props\n return (\n <Chip sx={{ fontWeight: 600, backgroundColor: '#BFD3ED' }} label={label} />\n )\n}\n\n/**\n * A chip to display CurationTask status.\n *\n * See {@link https://www.figma.com/design/0oPm5lLSUva8kyfVNMS6FA/Sage-Style---Component-Library--SDS-?node-id=4942-1129&m=dev}\n */\nfunction TaskStatusChip(props: { state: TaskStatusStateEnum | undefined }) {\n const { state } = props\n if (!state) return null\n const { label, backgroundColor } = TASK_STATUS_CONFIG[state]\n return (\n <Chip\n size=\"small\"\n sx={{ fontWeight: 600, backgroundColor }}\n label={label}\n />\n )\n}\n\nfunction DueDateChip(props: { dueDate: string | undefined }) {\n const { dueDate } = props\n const dueDateObj = parseDueDate(dueDate)\n if (!dueDateObj) return null\n\n const daysUntilDue = dueDateObj.diff(dayjs.utc().startOf('day'), 'day')\n const formattedDate = dueDateObj.format('MM/DD/YY')\n\n let backgroundColor = '#E0E0E0'\n if (daysUntilDue < 0) {\n backgroundColor = '#FFCDD2'\n } else if (daysUntilDue < 30) {\n backgroundColor = '#FFF9C4'\n }\n\n return (\n <Chip\n size=\"small\"\n sx={{ fontWeight: 600, backgroundColor }}\n label={`Due ${formattedDate}`}\n />\n )\n}\n\nexport type CurationTaskCardLayoutProps = {\n taskBundle: TaskBundle\n title: string\n description: string\n taskType: string\n principalIds: string[]\n /** Renders the action button. `expanded` reflects whether the card is in its expanded layout. */\n renderActionButton: (props: { expanded: boolean }) => ReactNode\n}\n\n/** Derives the fields shared by every card variant from a task's common properties. */\nexport function deriveCardFields(task: TaskBundle['task']) {\n return {\n title: task?.dataType ?? '',\n description: task?.instructions ?? '',\n principalIds: task?.assigneePrincipalId ? [task.assigneePrincipalId] : [],\n }\n}\n\n/**\n * Shared presentational chrome for a curation task card: title, chips, entity info, assignees,\n * status/due date, and an action button slot. Both the grid and executable task cards compose this.\n */\nexport default function CurationTaskCardLayout(\n props: CurationTaskCardLayoutProps,\n) {\n const {\n taskBundle,\n title,\n description,\n taskType,\n principalIds,\n renderActionButton,\n } = props\n\n const navigate = useNavigate()\n const [isExpanded, setIsExpanded] = useState(false)\n\n const taskId = taskBundle.task?.taskId\n const projectId = taskBundle.task?.projectId\n const { data: bundle } = useGetEntityBundle(projectId, undefined, {\n includeEntity: true,\n includePermissions: true,\n })\n const canEdit = bundle?.permissions?.canEdit ?? false\n\n return (\n <Card className={classNames(sharedStyles.card, styles.card)}>\n <div className={styles.cardContent}>\n <div className={styles.mainContent}>\n <div className={styles.titleChipContainer}>\n <Typography\n variant=\"headline3\"\n className={styles.title}\n onClick={() => setIsExpanded(!isExpanded)}\n >\n {title}\n </Typography>\n {taskType && <TaskTypeChip label={taskType} />}\n {canEdit && (\n <IconButton\n onClick={() => void navigate(`edit/${taskId}`)}\n aria-label=\"Task settings\"\n >\n <SettingsOutlinedIcon />\n </IconButton>\n )}\n </div>\n <div className={styles.entityInfo}>\n {bundle?.entity?.name ? (\n <Typography variant=\"body1\">{bundle.entity.name}</Typography>\n ) : (\n <Skeleton width={100} />\n )}\n {taskId && (\n <Typography variant=\"body1\">Task ID: {taskId}</Typography>\n )}\n </div>\n <div className={styles.userChipContainer}>\n {principalIds.map(principalId => (\n <UserOrTeamChip key={principalId} principalId={principalId} />\n ))}\n </div>\n </div>\n <div className={styles.statusContainer}>\n <TaskStatusChip state={taskBundle.status?.state} />\n <DueDateChip dueDate={taskBundle.status?.dueDate} />\n </div>\n {!isExpanded && (\n <>\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={{ display: { xs: 'none', md: 'block' } }}\n />\n {renderActionButton({ expanded: false })}\n </>\n )}\n </div>\n <Collapse in={isExpanded}>\n <div className={styles.expandedContent}>\n {description && (\n <Typography variant=\"body1\">{description}</Typography>\n )}\n {renderActionButton({ expanded: true })}\n </div>\n </Collapse>\n </Card>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;AA0BA,EAAM,OAAO,CAAG;AAEhB,SAAS,EAAa,GAA0B;CAC9C,IAAM,EAAE,aAAU;CAClB,OACE,kBAAC,GAAD;EAAM,IAAI;GAAE,YAAY;GAAK,iBAAiB;EAAU;EAAU;CAAQ,CAAA;AAE9E;AAOA,SAAS,EAAe,GAAmD;CACzE,IAAM,EAAE,aAAU;CAClB,IAAI,CAAC,GAAO,OAAO;CACnB,IAAM,EAAE,UAAO,uBAAoB,EAAmB;CACtD,OACE,kBAAC,GAAD;EACE,MAAK;EACL,IAAI;GAAE,YAAY;GAAK;EAAgB;EAChC;CACR,CAAA;AAEL;AAEA,SAAS,EAAY,GAAwC;CAC3D,IAAM,EAAE,eAAY,GACd,IAAa,EAAa,CAAO;CACvC,IAAI,CAAC,GAAY,OAAO;CAExB,IAAM,IAAe,EAAW,KAAK,EAAM,IAAI,EAAE,QAAQ,KAAK,GAAG,KAAK,GAChE,IAAgB,EAAW,OAAO,UAAU,GAE9C,IAAkB;CAOtB,OANI,IAAe,IACjB,IAAkB,YACT,IAAe,OACxB,IAAkB,YAIlB,kBAAC,GAAD;EACE,MAAK;EACL,IAAI;GAAE,YAAY;GAAK;EAAgB;EACvC,OAAO,OAAO;CACf,CAAA;AAEL;AAaA,SAAgB,EAAiB,GAA0B;CACzD,OAAO;EACL,OAAO,GAAM,YAAY;EACzB,aAAa,GAAM,gBAAgB;EACnC,cAAc,GAAM,sBAAsB,CAAC,EAAK,mBAAmB,IAAI,CAAC;CAC1E;AACF;AAMA,SAAwB,EACtB,GACA;CACA,IAAM,EACJ,eACA,UACA,gBACA,aACA,iBACA,0BACE,GAEE,IAAW,EAAY,GACvB,CAAC,GAAY,KAAiB,EAAS,EAAK,GAE5C,IAAS,EAAW,MAAM,QAC1B,IAAY,EAAW,MAAM,WAC7B,EAAE,MAAM,MAAW,EAAmB,GAAW,KAAA,GAAW;EAChE,eAAe;EACf,oBAAoB;CACtB,CAAC,GACK,IAAU,GAAQ,aAAa,WAAW;CAEhD,OACE,kBAAC,GAAD;EAAM,WAAW,EAAW,EAAa,MAAM,EAAO,IAAI;YAA1D,CACE,kBAAC,OAAD;GAAK,WAAW,EAAO;aAAvB;IACE,kBAAC,OAAD;KAAK,WAAW,EAAO;eAAvB;MACE,kBAAC,OAAD;OAAK,WAAW,EAAO;iBAAvB;QACE,kBAAC,GAAD;SACE,SAAQ;SACR,WAAW,EAAO;SAClB,eAAe,EAAc,CAAC,CAAU;mBAEvC;QACS,CAAA;QACX,KAAY,kBAAC,GAAD,EAAc,OAAO,EAAW,CAAA;QAC5C,KACC,kBAAC,GAAD;SACE,eAAe,KAAK,EAAS,QAAQ,GAAQ;SAC7C,cAAW;mBAEX,kBAAC,GAAD,CAAuB,CAAA;QACb,CAAA;OAEX;;MACL,kBAAC,OAAD;OAAK,WAAW,EAAO;iBAAvB,CACG,GAAQ,QAAQ,OACf,kBAAC,GAAD;QAAY,SAAQ;kBAAS,EAAO,OAAO;OAAiB,CAAA,IAE5D,kBAAC,GAAD,EAAU,OAAO,IAAM,CAAA,GAExB,KACC,kBAAC,GAAD;QAAY,SAAQ;kBAApB,CAA4B,aAAU,CAAmB;SAExD;;MACL,kBAAC,OAAD;OAAK,WAAW,EAAO;iBACpB,EAAa,KAAI,MAChB,kBAAC,GAAD,EAA+C,eAAc,GAAxC,CAAwC,CAC9D;MACE,CAAA;KACF;;IACL,kBAAC,OAAD;KAAK,WAAW,EAAO;eAAvB,CACE,kBAAC,GAAD,EAAgB,OAAO,EAAW,QAAQ,MAAQ,CAAA,GAClD,kBAAC,GAAD,EAAa,SAAS,EAAW,QAAQ,QAAU,CAAA,CAChD;;IACJ,CAAC,KACA,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;KACE,aAAY;KACZ,UAAA;KACA,IAAI,EAAE,SAAS;MAAE,IAAI;MAAQ,IAAI;KAAQ,EAAE;IAC5C,CAAA,GACA,EAAmB,EAAE,UAAU,GAAM,CAAC,CACvC,EAAA,CAAA;GAED;MACL,kBAAC,GAAD;GAAU,IAAI;aACZ,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAvB,CACG,KACC,kBAAC,GAAD;KAAY,SAAQ;eAAS;IAAwB,CAAA,GAEtD,EAAmB,EAAE,UAAU,GAAK,CAAC,CACnC;;EACG,CAAA,CACN;;AAEV"}
@@ -0,0 +1,10 @@
1
+ import { TaskBundle } from '@sage-bionetworks/synapse-client';
2
+ export type ExecutableTaskCardProps = {
3
+ taskBundle: TaskBundle;
4
+ };
5
+ /**
6
+ * Card for an executable (Compute Data) curation task. Lets an authorized user run the task's agent
7
+ * and, once finished, navigate to the destination task where the generated output was written.
8
+ */
9
+ export default function ExecutableTaskCard(props: ExecutableTaskCardProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=ExecutableTaskCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutableTaskCard.d.ts","sourceRoot":"","sources":["../../../../../src/features/curator/dashboard/components/ExecutableTaskCard.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAS7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,2CAwExE"}
@@ -0,0 +1,51 @@
1
+ import { displayToast as e } from "../../../../components/ToastMessage/ToastMessage.js";
2
+ import { GRID_PAGE_TASK_ID_QUERY_PARAM as t } from "../../../../utils/SynapseConstants.js";
3
+ import n from "../../../../synapse-queries/entity/useEntityBundle.js";
4
+ import { useGetCurrentUserProfile as r } from "../../../../synapse-queries/user/useUserBundle.js";
5
+ import { useGetIsPrincipalIdUserOrMemberOfTeam as i } from "../../../../synapse-queries/team/useTeamMembers.js";
6
+ import "../../../../components/index.js";
7
+ import { useExecuteCurationTask as a } from "../../../../synapse-queries/curation/task/useCurationTask.js";
8
+ import o from "./CurationTaskCard.module.js";
9
+ import s, { deriveCardFields as c } from "./CurationTaskCardLayout.js";
10
+ import { getExecutableTaskButtonState as l } from "./getExecutableTaskButtonState.js";
11
+ import u from "./NextStepButton.js";
12
+ import { jsx as d } from "react/jsx-runtime";
13
+ import { useSearchParams as f } from "react-router";
14
+ //#region src/features/curator/dashboard/components/ExecutableTaskCard.tsx
15
+ function p(p) {
16
+ let { taskBundle: m } = p, h = m.task, g = h.taskProperties, _ = g && "destinationTaskId" in g ? g.destinationTaskId : void 0, [, v] = f(), { data: y } = n(h.projectId, void 0, {
17
+ includeEntity: !0,
18
+ includePermissions: !0
19
+ }), b = y?.permissions?.canEdit ?? !1, { data: x } = r(), { data: S } = i(x?.ownerId ?? "", h.assigneePrincipalId ?? "", { enabled: !!x?.ownerId && !!h.assigneePrincipalId }), C = b || !!S, { mutate: w, isPending: T } = a({ onError: (t) => e(t.message, "danger") }), E = l({
20
+ state: m.status?.state,
21
+ canExecute: C,
22
+ isExecutePending: T,
23
+ destinationTaskId: _
24
+ }), { title: D, description: O, principalIds: k } = c(h);
25
+ function A() {
26
+ E.action === "start" ? w(h.taskId) : E.action === "viewResult" && _ && v((e) => {
27
+ let n = new URLSearchParams(e);
28
+ return n.set(t, String(_)), n;
29
+ });
30
+ }
31
+ return /* @__PURE__ */ d(s, {
32
+ taskBundle: m,
33
+ title: D,
34
+ description: O,
35
+ taskType: "Compute",
36
+ principalIds: k,
37
+ renderActionButton: ({ expanded: e }) => /* @__PURE__ */ d(u, {
38
+ className: o.cardButton,
39
+ buttonText: E.buttonText,
40
+ onClick: A,
41
+ disabled: E.disabled,
42
+ loading: E.loading,
43
+ tooltip: E.tooltip,
44
+ expanded: e
45
+ })
46
+ });
47
+ }
48
+ //#endregion
49
+ export { p as default };
50
+
51
+ //# sourceMappingURL=ExecutableTaskCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutableTaskCard.js","names":[],"sources":["../../../../../src/features/curator/dashboard/components/ExecutableTaskCard.tsx"],"sourcesContent":["import { displayToast } from '@/components'\nimport { useExecuteCurationTask } from '@/synapse-queries/curation/task/useCurationTask'\nimport useGetEntityBundle from '@/synapse-queries/entity/useEntityBundle'\nimport { useGetIsPrincipalIdUserOrMemberOfTeam } from '@/synapse-queries/team/useTeamMembers'\nimport { useGetCurrentUserProfile } from '@/synapse-queries/user/useUserBundle'\nimport { GRID_PAGE_TASK_ID_QUERY_PARAM } from '@/utils/SynapseConstants'\nimport { TaskBundle } from '@sage-bionetworks/synapse-client'\nimport { useSearchParams } from 'react-router'\nimport CurationTaskCardLayout, {\n deriveCardFields,\n} from './CurationTaskCardLayout'\nimport { getExecutableTaskButtonState } from './getExecutableTaskButtonState'\nimport NextStepButton from './NextStepButton'\nimport styles from './CurationTaskCard.module.scss'\n\nexport type ExecutableTaskCardProps = {\n taskBundle: TaskBundle\n}\n\n/**\n * Card for an executable (Compute Data) curation task. Lets an authorized user run the task's agent\n * and, once finished, navigate to the destination task where the generated output was written.\n */\nexport default function ExecutableTaskCard(props: ExecutableTaskCardProps) {\n const { taskBundle } = props\n const task = taskBundle.task!\n const taskProperties = task.taskProperties\n const destinationTaskId =\n taskProperties && 'destinationTaskId' in taskProperties\n ? taskProperties.destinationTaskId\n : undefined\n\n const [, setSearchParams] = useSearchParams()\n\n const { data: bundle } = useGetEntityBundle(task.projectId, undefined, {\n includeEntity: true,\n includePermissions: true,\n })\n const canEdit = bundle?.permissions?.canEdit ?? false\n\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n const { data: isAssigneeOrTeamMember } =\n useGetIsPrincipalIdUserOrMemberOfTeam(\n currentUserProfile?.ownerId ?? '',\n task.assigneePrincipalId ?? '',\n { enabled: !!currentUserProfile?.ownerId && !!task.assigneePrincipalId },\n )\n\n const canExecute = canEdit || Boolean(isAssigneeOrTeamMember)\n\n const { mutate: executeTask, isPending } = useExecuteCurationTask({\n onError: error => displayToast(error.message, 'danger'),\n })\n\n const buttonState = getExecutableTaskButtonState({\n state: taskBundle.status?.state,\n canExecute,\n isExecutePending: isPending,\n destinationTaskId,\n })\n\n const { title, description, principalIds } = deriveCardFields(task)\n\n function onClickAction() {\n if (buttonState.action === 'start') {\n executeTask(task.taskId!)\n } else if (buttonState.action === 'viewResult' && destinationTaskId) {\n setSearchParams(prev => {\n const next = new URLSearchParams(prev)\n next.set(GRID_PAGE_TASK_ID_QUERY_PARAM, String(destinationTaskId))\n return next\n })\n }\n }\n\n return (\n <CurationTaskCardLayout\n taskBundle={taskBundle}\n title={title}\n description={description}\n taskType=\"Compute\"\n principalIds={principalIds}\n renderActionButton={({ expanded }) => (\n <NextStepButton\n className={styles.cardButton}\n buttonText={buttonState.buttonText}\n onClick={onClickAction}\n disabled={buttonState.disabled}\n loading={buttonState.loading}\n tooltip={buttonState.tooltip}\n expanded={expanded}\n />\n )}\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AAuBA,SAAwB,EAAmB,GAAgC;CACzE,IAAM,EAAE,kBAAe,GACjB,IAAO,EAAW,MAClB,IAAiB,EAAK,gBACtB,IACJ,KAAkB,uBAAuB,IACrC,EAAe,oBACf,KAAA,GAEA,GAAG,KAAmB,EAAgB,GAEtC,EAAE,MAAM,MAAW,EAAmB,EAAK,WAAW,KAAA,GAAW;EACrE,eAAe;EACf,oBAAoB;CACtB,CAAC,GACK,IAAU,GAAQ,aAAa,WAAW,IAE1C,EAAE,MAAM,MAAuB,EAAyB,GACxD,EAAE,MAAM,MACZ,EACE,GAAoB,WAAW,IAC/B,EAAK,uBAAuB,IAC5B,EAAE,SAAS,CAAC,CAAC,GAAoB,WAAW,CAAC,CAAC,EAAK,oBAAoB,CACzE,GAEI,IAAa,KAAW,EAAQ,GAEhC,EAAE,QAAQ,GAAa,iBAAc,EAAuB,EAChE,UAAS,MAAS,EAAa,EAAM,SAAS,QAAQ,EACxD,CAAC,GAEK,IAAc,EAA6B;EAC/C,OAAO,EAAW,QAAQ;EAC1B;EACA,kBAAkB;EAClB;CACF,CAAC,GAEK,EAAE,UAAO,gBAAa,oBAAiB,EAAiB,CAAI;CAElE,SAAS,IAAgB;EACvB,AAAI,EAAY,WAAW,UACzB,EAAY,EAAK,MAAO,IACf,EAAY,WAAW,gBAAgB,KAChD,GAAgB,MAAQ;GACtB,IAAM,IAAO,IAAI,gBAAgB,CAAI;GAErC,OADA,EAAK,IAAI,GAA+B,OAAO,CAAiB,CAAC,GAC1D;EACT,CAAC;CAEL;CAEA,OACE,kBAAC,GAAD;EACc;EACL;EACM;EACb,UAAS;EACK;EACd,qBAAqB,EAAE,kBACrB,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,YAAY,EAAY;GACxB,SAAS;GACT,UAAU,EAAY;GACtB,SAAS,EAAY;GACrB,SAAS,EAAY;GACX;EACX,CAAA;CAEJ,CAAA;AAEL"}
@@ -0,0 +1,10 @@
1
+ import { TaskBundle } from '@sage-bionetworks/synapse-client';
2
+ export type GridTaskCardProps = {
3
+ taskBundle: TaskBundle;
4
+ };
5
+ /**
6
+ * Card for a grid-supported (Curate Data) curation task. The action button opens the task in
7
+ * Curator, gated on read access to the task's source entity.
8
+ */
9
+ export default function GridTaskCard(props: GridTaskCardProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=GridTaskCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridTaskCard.d.ts","sourceRoot":"","sources":["../../../../../src/features/curator/dashboard/components/GridTaskCard.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAO7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CAmC5D"}
@@ -0,0 +1,35 @@
1
+ import { displayToast as e } from "../../../../components/ToastMessage/ToastMessage.js";
2
+ import "../../../../components/index.js";
3
+ import { OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE as t } from "../../../entity/metadata-task/utils/constants.js";
4
+ import n from "../../../entity/metadata-task/hooks/useOpenCuratorButton.js";
5
+ import r from "./CurationTaskCard.module.js";
6
+ import i, { deriveCardFields as a } from "./CurationTaskCardLayout.js";
7
+ import o from "./NextStepButton.js";
8
+ import { jsx as s } from "react/jsx-runtime";
9
+ //#region src/features/curator/dashboard/components/GridTaskCard.tsx
10
+ function c(c) {
11
+ let { taskBundle: l } = c, { onClick: u, isLoading: d, isPending: f, hasPermission: p } = n(l);
12
+ function m() {
13
+ p ? u() : e(t, "danger");
14
+ }
15
+ let { title: h, description: g, principalIds: _ } = a(l.task);
16
+ return /* @__PURE__ */ s(i, {
17
+ taskBundle: l,
18
+ title: h,
19
+ description: g,
20
+ taskType: "Curate Data",
21
+ principalIds: _,
22
+ renderActionButton: ({ expanded: e }) => /* @__PURE__ */ s(o, {
23
+ className: r.cardButton,
24
+ buttonText: "Open Curator",
25
+ onClick: m,
26
+ disabled: d,
27
+ loading: f,
28
+ expanded: e
29
+ })
30
+ });
31
+ }
32
+ //#endregion
33
+ export { c as default };
34
+
35
+ //# sourceMappingURL=GridTaskCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridTaskCard.js","names":[],"sources":["../../../../../src/features/curator/dashboard/components/GridTaskCard.tsx"],"sourcesContent":["import { displayToast } from '@/components'\nimport useOpenCuratorFromTaskButton from '@/features/entity/metadata-task/hooks/useOpenCuratorButton'\nimport { OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE } from '@/features/entity/metadata-task/utils/constants'\nimport { TaskBundle } from '@sage-bionetworks/synapse-client'\nimport CurationTaskCardLayout, {\n deriveCardFields,\n} from './CurationTaskCardLayout'\nimport NextStepButton from './NextStepButton'\nimport styles from './CurationTaskCard.module.scss'\n\nexport type GridTaskCardProps = {\n taskBundle: TaskBundle\n}\n\n/**\n * Card for a grid-supported (Curate Data) curation task. The action button opens the task in\n * Curator, gated on read access to the task's source entity.\n */\nexport default function GridTaskCard(props: GridTaskCardProps) {\n const { taskBundle } = props\n\n const { onClick, isLoading, isPending, hasPermission } =\n useOpenCuratorFromTaskButton(taskBundle)\n\n function onClickAction() {\n if (hasPermission) {\n onClick()\n } else {\n displayToast(OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE, 'danger')\n }\n }\n\n const { title, description, principalIds } = deriveCardFields(taskBundle.task)\n\n return (\n <CurationTaskCardLayout\n taskBundle={taskBundle}\n title={title}\n description={description}\n taskType=\"Curate Data\"\n principalIds={principalIds}\n renderActionButton={({ expanded }) => (\n <NextStepButton\n className={styles.cardButton}\n buttonText=\"Open Curator\"\n onClick={onClickAction}\n disabled={isLoading}\n loading={isPending}\n expanded={expanded}\n />\n )}\n />\n )\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAwB,EAAa,GAA0B;CAC7D,IAAM,EAAE,kBAAe,GAEjB,EAAE,YAAS,cAAW,cAAW,qBACrC,EAA6B,CAAU;CAEzC,SAAS,IAAgB;EACvB,AAAI,IACF,EAAQ,IAER,EAAa,GAAoD,QAAQ;CAE7E;CAEA,IAAM,EAAE,UAAO,gBAAa,oBAAiB,EAAiB,EAAW,IAAI;CAE7E,OACE,kBAAC,GAAD;EACc;EACL;EACM;EACb,UAAS;EACK;EACd,qBAAqB,EAAE,kBACrB,kBAAC,GAAD;GACE,WAAW,EAAO;GAClB,YAAW;GACX,SAAS;GACT,UAAU;GACV,SAAS;GACC;EACX,CAAA;CAEJ,CAAA;AAEL"}