synapse-react-client 4.0.9 → 4.0.10

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 (543) hide show
  1. package/dist/SWC.index.d.ts +1 -0
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +2 -1
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/aridhia-queries/aridhiaTokenExchange.js.map +1 -1
  6. package/dist/aridhia-queries/useGetAridhiaRequests.js.map +1 -1
  7. package/dist/assets/icons/TasksIcon.d.ts.map +1 -1
  8. package/dist/assets/icons/TasksIcon.js +6 -10
  9. package/dist/assets/icons/TasksIcon.js.map +1 -1
  10. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.d.ts.map +1 -1
  11. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js +69 -63
  12. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
  13. package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js.map +1 -1
  14. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  15. package/dist/components/AccessRequirementList/AccessRequirementListUtils.js.map +1 -1
  16. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
  17. package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
  18. package/dist/components/AccessRequirementRelatedProjectsList/AccessRequirementRelatedProjectsList.js.map +1 -1
  19. package/dist/components/AccessTokenPage/AccessTokenCard/AccessTokenCard.js.map +1 -1
  20. package/dist/components/AcknowledgementsPage/StudyAcknowledgements.js.map +1 -1
  21. package/dist/components/AclEditor/PermissionLevelMenu.js.map +1 -1
  22. package/dist/components/AclEditor/ResourceAccessAndUserGroupHeader.js.map +1 -1
  23. package/dist/components/AclEditor/useSortResourceAccessList.js.map +1 -1
  24. package/dist/components/AclEditor/useUpdateAcl.js.map +1 -1
  25. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  26. package/dist/components/Authentication/AuthenticationMethodSelection.d.ts.map +1 -1
  27. package/dist/components/Authentication/AuthenticationMethodSelection.js +38 -37
  28. package/dist/components/Authentication/AuthenticationMethodSelection.js.map +1 -1
  29. package/dist/components/Authentication/Constants.d.ts +1 -0
  30. package/dist/components/Authentication/Constants.d.ts.map +1 -1
  31. package/dist/components/Authentication/Constants.js +2 -2
  32. package/dist/components/Authentication/Constants.js.map +1 -1
  33. package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
  34. package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
  35. package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
  36. package/dist/components/Authentication/RegenerateBackupCodesWarning.js.map +1 -1
  37. package/dist/components/Authentication/Reset2FAWarning.js.map +1 -1
  38. package/dist/components/Authentication/StandaloneLoginForm.js +1 -1
  39. package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
  40. package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
  41. package/dist/components/Authentication/TwoFactorEnrollmentForm.js +2 -1
  42. package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
  43. package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
  44. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  45. package/dist/components/CardDeck/CardDeck.Mobile.js.map +1 -1
  46. package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
  47. package/dist/components/CertificationQuiz/CertificationQuiz.js.map +1 -1
  48. package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
  49. package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
  50. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
  51. package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js.map +1 -1
  52. package/dist/components/ChallengeSubmission/EvaluationQueueList.js.map +1 -1
  53. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  54. package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js.map +1 -1
  55. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
  56. package/dist/components/ChangePassword/ChangePassword.js.map +1 -1
  57. package/dist/components/ChangePassword/ChangePasswordWithToken.js.map +1 -1
  58. package/dist/components/ChangePassword/useChangePasswordFormState.js +1 -1
  59. package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
  60. package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
  61. package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
  62. package/dist/components/ComponentCollapse.js.map +1 -1
  63. package/dist/components/CookiesNotification/CookiesNotification.js.map +1 -1
  64. package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
  65. package/dist/components/CreateTableViewWizard/CreateTableViewWizardUtils.js.map +1 -1
  66. package/dist/components/DataGrid/DataGrid.d.ts +0 -1
  67. package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
  68. package/dist/components/DataGrid/DataGrid.js +72 -72
  69. package/dist/components/DataGrid/DataGrid.js.map +1 -1
  70. package/dist/components/DataGrid/DataGridWebSocket.d.ts +4 -0
  71. package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
  72. package/dist/components/DataGrid/DataGridWebSocket.js +9 -8
  73. package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
  74. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  75. package/dist/components/DataGrid/SynapseGrid.js +326 -268
  76. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  77. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +2 -0
  78. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  79. package/dist/components/DataGrid/columns/AutocompleteColumn.js +113 -67
  80. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  81. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts +2 -1
  82. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
  83. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +126 -122
  84. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
  85. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +58 -0
  86. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -0
  87. package/dist/components/DataGrid/columns/useGridAutocompleteState.js +52 -0
  88. package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -0
  89. package/dist/components/DataGrid/components/ValidationAlert.d.ts +5 -2
  90. package/dist/components/DataGrid/components/ValidationAlert.d.ts.map +1 -1
  91. package/dist/components/DataGrid/components/ValidationAlert.js +429 -24
  92. package/dist/components/DataGrid/components/ValidationAlert.js.map +1 -1
  93. package/dist/components/DataGrid/hooks/useColumnResizeHandles.js.map +1 -1
  94. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
  95. package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
  96. package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
  97. package/dist/components/DataGrid/useCRDTModelView.js.map +1 -1
  98. package/dist/components/DataGrid/useDataGridWebsocket.d.ts +7 -0
  99. package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
  100. package/dist/components/DataGrid/useDataGridWebsocket.js +16 -2
  101. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  102. package/dist/components/DataGrid/useInitializeGridConnection.js.map +1 -1
  103. package/dist/components/DataGrid/useMergeGridWithRecordSet.js.map +1 -1
  104. package/dist/components/DataGrid/useMergeGridWithSource.js.map +1 -1
  105. package/dist/components/DataGrid/useMergeGridWithTable.js.map +1 -1
  106. package/dist/components/DataGrid/utils/DataGridUtils.js.map +1 -1
  107. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  108. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  109. package/dist/components/DataGrid/utils/computeReplicaSelectionModel.js.map +1 -1
  110. package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
  111. package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
  112. package/dist/components/DataGrid/utils/getCellClassName.js +8 -8
  113. package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
  114. package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
  115. package/dist/components/DataGrid/utils/modelRowsToGrid.js.map +1 -1
  116. package/dist/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType.js.map +1 -1
  117. package/dist/components/DataGrid/utils/splitPatch.js.map +1 -1
  118. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  119. package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
  120. package/dist/components/DirectDownloadButton.js.map +1 -1
  121. package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
  122. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  123. package/dist/components/DownloadCart/DownloadListActionsRequired.js.map +1 -1
  124. package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
  125. package/dist/components/DownloadCart/fileNameUtils.js.map +1 -1
  126. package/dist/components/DraggableDialog/DraggableDialog.js.map +1 -1
  127. package/dist/components/DynamicForm/DynamicFormModal.js.map +1 -1
  128. package/dist/components/Ecosystem/TableQueryEcosystem.js.map +1 -1
  129. package/dist/components/EntityAclEditor/EntityAclEditor.d.ts.map +1 -1
  130. package/dist/components/EntityAclEditor/EntityAclEditor.js +103 -103
  131. package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
  132. package/dist/components/EntityAclEditor/useNotifyNewACLUsers.js.map +1 -1
  133. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
  134. package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
  135. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  136. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.d.ts.map +1 -1
  137. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +36 -30
  138. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
  139. package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
  140. package/dist/components/EntityFinder/VersionSelectionType.js.map +1 -1
  141. package/dist/components/EntityFinder/details/configurations/EntityChildrenDetails.js.map +1 -1
  142. package/dist/components/EntityFinder/details/configurations/FavoritesDetails.js.map +1 -1
  143. package/dist/components/EntityFinder/details/configurations/ProjectListDetails.js.map +1 -1
  144. package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
  145. package/dist/components/EntityFinder/tree/EntityTree.js.map +1 -1
  146. package/dist/components/EntityFinder/tree/VirtualizedTree.js.map +1 -1
  147. package/dist/components/EntityFinder/useEntitySelection.js.map +1 -1
  148. package/dist/components/EntityForm/EntityForm.js.map +1 -1
  149. package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
  150. package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
  151. package/dist/components/EntityHeaderTable/useEntityHeaderTableState.js.map +1 -1
  152. package/dist/components/EntitySubjectsSelector/EntitySubjectsSelector.js.map +1 -1
  153. package/dist/components/EntityTreeTable/components/IdColumnHeader.js.map +1 -1
  154. package/dist/components/EntityTreeTable/hooks/useEntityTreeState.js.map +1 -1
  155. package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
  156. package/dist/components/EntityTreeTable/hooks/useTableData.js.map +1 -1
  157. package/dist/components/EntityTreeTable/hooks/useTreeOperationsWithDirectFetch.js.map +1 -1
  158. package/dist/components/EntityUpload/EntityUpload.js.map +1 -1
  159. package/dist/components/ExperimentalMode/ExperimentalMode.js.map +1 -1
  160. package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js.map +1 -1
  161. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  162. package/dist/components/FeaturedDataTabs/QueryPerFacetPlotsCard.js.map +1 -1
  163. package/dist/components/FeaturedDataTabs/SingleQueryFacetPlotsCards.js.map +1 -1
  164. package/dist/components/FeaturedResearch/FeaturedResearch.js.map +1 -1
  165. package/dist/components/FeaturedToolsList/FeaturedToolsList.js.map +1 -1
  166. package/dist/components/FilePreview/FileHandleContentRenderer.js.map +1 -1
  167. package/dist/components/FilePreview/HtmlPreview/HtmlPreview.js.map +1 -1
  168. package/dist/components/FilePreview/PreviewRendererType.js.map +1 -1
  169. package/dist/components/Forum/DiscussionReply.js.map +1 -1
  170. package/dist/components/Forum/DiscussionSearchResult.js.map +1 -1
  171. package/dist/components/Forum/ForumTable.js.map +1 -1
  172. package/dist/components/Forum/ForumThreadEditor.js.map +1 -1
  173. package/dist/components/FullTextSearch/FullTextSearchUtils.js.map +1 -1
  174. package/dist/components/GenericCard/GenericCard.d.ts.map +1 -1
  175. package/dist/components/GenericCard/GenericCard.js +12 -7
  176. package/dist/components/GenericCard/GenericCard.js.map +1 -1
  177. package/dist/components/GenericCard/Linkify.js.map +1 -1
  178. package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
  179. package/dist/components/GenericCard/TableRowGenericCard.js +105 -105
  180. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  181. package/dist/components/Goals/Goals.Mobile.js.map +1 -1
  182. package/dist/components/Goals/Goals.js.map +1 -1
  183. package/dist/components/GoalsV2/GoalsV2.Mobile.js.map +1 -1
  184. package/dist/components/GoalsV2/GoalsV2.js.map +1 -1
  185. package/dist/components/GoalsV3/GoalsV3.Mobile.js.map +1 -1
  186. package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
  187. package/dist/components/GoogleMap/SynapseUserMarker.js.map +1 -1
  188. package/dist/components/HasAccess/AccessIcon.js.map +1 -1
  189. package/dist/components/HasAccess/useHasAccess.js.map +1 -1
  190. package/dist/components/HeaderCard/HeaderCardV2.js.map +1 -1
  191. package/dist/components/HeaderCard.d.ts +6 -1
  192. package/dist/components/HeaderCard.d.ts.map +1 -1
  193. package/dist/components/HeaderCard.js +107 -76
  194. package/dist/components/HeaderCard.js.map +1 -1
  195. package/dist/components/HexGrid/HexGrid.js.map +1 -1
  196. package/dist/components/IconList.js.map +1 -1
  197. package/dist/components/ImageCardGridWithLinks/ImageCardGridWithLinks.js.map +1 -1
  198. package/dist/components/ImageFromSynapseTable.js.map +1 -1
  199. package/dist/components/JSONArrayEditor/useParseCsv.js.map +1 -1
  200. package/dist/components/JsonSchemaForm/templates/ArrayFieldDescriptionTemplate.js.map +1 -1
  201. package/dist/components/JsonSchemaForm/templates/ArrayFieldItemTemplate.js.map +1 -1
  202. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
  203. package/dist/components/JsonSchemaForm/templates/FieldTemplate.js.map +1 -1
  204. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
  205. package/dist/components/Markdown/MarkdownGithub.js.map +1 -1
  206. package/dist/components/Markdown/MarkdownSynapse.js.map +1 -1
  207. package/dist/components/Markdown/MarkdownUtils.js.map +1 -1
  208. package/dist/components/Markdown/SynapseWikiContext.js.map +1 -1
  209. package/dist/components/Markdown/UserMentionModal.js.map +1 -1
  210. package/dist/components/Markdown/widget/MarkdownProvenanceGraph.js.map +1 -1
  211. package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
  212. package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
  213. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.d.ts.map +1 -1
  214. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js +45 -39
  215. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
  216. package/dist/components/OAuthClientManagement/OAuthManagement.js.map +1 -1
  217. package/dist/components/PageProgress/PageProgress.js.map +1 -1
  218. package/dist/components/Plot/DotPlot.js.map +1 -1
  219. package/dist/components/Plot/Plot.js.map +1 -1
  220. package/dist/components/Plot/SynapsePlot.js.map +1 -1
  221. package/dist/components/Plot/ThemesPlot.js.map +1 -1
  222. package/dist/components/Plot/UpsetPlot.js.map +1 -1
  223. package/dist/components/PortalAclEditor/PortalAclEditor.d.ts.map +1 -1
  224. package/dist/components/PortalAclEditor/PortalAclEditor.js +43 -41
  225. package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
  226. package/dist/components/PortalFeaturedPartners/PortalFeaturedPartners.js.map +1 -1
  227. package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
  228. package/dist/components/ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js.map +1 -1
  229. package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
  230. package/dist/components/Programs/Programs.Mobile.js.map +1 -1
  231. package/dist/components/Programs/Programs.js.map +1 -1
  232. package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
  233. package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
  234. package/dist/components/ProvenanceGraph/ProvenanceGraphUtils.js.map +1 -1
  235. package/dist/components/ProvenanceGraph/ProvenanceUtils.js.map +1 -1
  236. package/dist/components/QueryCount/QueryCount.js.map +1 -1
  237. package/dist/components/QueryCountButton/QueryCountButton.js.map +1 -1
  238. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  239. package/dist/components/QueryWrapper/QueryWrapper.js.map +1 -1
  240. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
  241. package/dist/components/QueryWrapper/TableRowSelectionState.js.map +1 -1
  242. package/dist/components/QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL.js.map +1 -1
  243. package/dist/components/QueryWrapper/useGetQueryMetadata.js.map +1 -1
  244. package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
  245. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  246. package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
  247. package/dist/components/RecentPublicationsGrid/RecentPublicationsGrid.js.map +1 -1
  248. package/dist/components/ReleaseCard/ReleaseCardUtils.js.map +1 -1
  249. package/dist/components/ResizableContainer/hooks/useResizable.js.map +1 -1
  250. package/dist/components/Resources/Resources.Mobile.js.map +1 -1
  251. package/dist/components/Resources/Resources.js.map +1 -1
  252. package/dist/components/RowDataTable/RowDataTableWithQuery.js.map +1 -1
  253. package/dist/components/SageResourcesPopover/SageResourcesPopover.js.map +1 -1
  254. package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.js.map +1 -1
  255. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
  256. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
  257. package/dist/components/SmartLink/SmartButton.js.map +1 -1
  258. package/dist/components/SmartLink/SmartLink.js.map +1 -1
  259. package/dist/components/SourceAppImage.js.map +1 -1
  260. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
  261. package/dist/components/StatisticsPlot.js.map +1 -1
  262. package/dist/components/StorybookComponentWrapper.js.map +1 -1
  263. package/dist/components/SubsectionRowRenderer/SubsectionRowRenderer.js.map +1 -1
  264. package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js.map +1 -1
  265. package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
  266. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  267. package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
  268. package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
  269. package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
  270. package/dist/components/SynapseForm/SummaryTable.js.map +1 -1
  271. package/dist/components/SynapseForm/SynapseForm.js +4 -2
  272. package/dist/components/SynapseForm/SynapseForm.js.map +1 -1
  273. package/dist/components/SynapseForm/SynapseFormWrapper.js.map +1 -1
  274. package/dist/components/SynapseHomepageV2/SynapseByTheNumbersItem.js.map +1 -1
  275. package/dist/components/SynapseHomepageV2/SynapseFeatureItem.js.map +1 -1
  276. package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
  277. package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
  278. package/dist/components/SynapseHomepageV2/SynapseInActionItem.js.map +1 -1
  279. package/dist/components/SynapseHomepageV2/SynapsePlans.js.map +1 -1
  280. package/dist/components/SynapseHomepageV2/SynapseTrendingProjects.js.map +1 -1
  281. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts +8 -7
  282. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
  283. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +173 -164
  284. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
  285. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
  286. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanel.js.map +1 -1
  287. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
  288. package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js.map +1 -1
  289. package/dist/components/SynapseTable/EntityIDColumnCopyIcon.js.map +1 -1
  290. package/dist/components/SynapseTable/NoContentPlaceholderType.js.map +1 -1
  291. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
  292. package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js.map +1 -1
  293. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  294. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  295. package/dist/components/SynapseTable/table-top/ColumnSelection.js.map +1 -1
  296. package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
  297. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  298. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
  299. package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/DefaultValueField.js.map +1 -1
  300. package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js.map +1 -1
  301. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts +1 -1
  302. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts.map +1 -1
  303. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
  304. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
  305. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.js.map +1 -1
  306. package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.js.map +1 -1
  307. package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
  308. package/dist/components/TanStackTable/ColumnHeader.d.ts +1 -0
  309. package/dist/components/TanStackTable/ColumnHeader.d.ts.map +1 -1
  310. package/dist/components/TanStackTable/ColumnHeader.js +8 -8
  311. package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
  312. package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
  313. package/dist/components/TanStackTable/TableBody.js.map +1 -1
  314. package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js.map +1 -1
  315. package/dist/components/TextField/TextField.js.map +1 -1
  316. package/dist/components/TimelinePlot/TimelinePhase.js.map +1 -1
  317. package/dist/components/TimelinePlot/TimelinePlot.js.map +1 -1
  318. package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js.map +1 -1
  319. package/dist/components/UserCard/Avatar.js.map +1 -1
  320. package/dist/components/UserCardList/UserCardList.js.map +1 -1
  321. package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Mobile.js.map +1 -1
  322. package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
  323. package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
  324. package/dist/components/UserProfileLinks/UserProjects.js.map +1 -1
  325. package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
  326. package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
  327. package/dist/components/WikiMarkdownEditor/WikiMarkdownEditor.js.map +1 -1
  328. package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js.map +1 -1
  329. package/dist/components/dataaccess/AccessApprovalsTable.js.map +1 -1
  330. package/dist/components/dataaccess/AccessRequestSubmissionTable.js.map +1 -1
  331. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  332. package/dist/components/dataaccess/UseAccessRequirementTable.js.map +1 -1
  333. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.js.map +1 -1
  334. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  335. package/dist/components/entity/page/CreatedByModifiedBy.js.map +1 -1
  336. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  337. package/dist/components/entity/page/title_bar/useDataCiteUsage.js.map +1 -1
  338. package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
  339. package/dist/components/error/ErrorPage.js.map +1 -1
  340. package/dist/components/favorites/FavoritesPage.js.map +1 -1
  341. package/dist/components/file/upload/BasicFileHandleUpload.js.map +1 -1
  342. package/dist/components/layout/SWCHeader.d.ts +9 -0
  343. package/dist/components/layout/SWCHeader.d.ts.map +1 -0
  344. package/dist/components/layout/SWCHeader.js +19 -0
  345. package/dist/components/layout/SWCHeader.js.map +1 -0
  346. package/dist/components/layout/SWCPageLayout.d.ts +9 -0
  347. package/dist/components/layout/SWCPageLayout.d.ts.map +1 -0
  348. package/dist/components/layout/SWCPageLayout.js +14 -0
  349. package/dist/components/layout/SWCPageLayout.js.map +1 -0
  350. package/dist/components/menu/ComplexMenu.js.map +1 -1
  351. package/dist/components/row_renderers/utils/ChipContainer.js.map +1 -1
  352. package/dist/components/styled/StyledPopover.js.map +1 -1
  353. package/dist/components/table/CsvPreview/CsvPreview.js +2 -1
  354. package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
  355. package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
  356. package/dist/components/trash/TrashCanList.js.map +1 -1
  357. package/dist/components/widgets/FileHandleLink.js.map +1 -1
  358. package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
  359. package/dist/components/widgets/SynapseVideo.js.map +1 -1
  360. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  361. package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
  362. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
  363. package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
  364. package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js.map +1 -1
  365. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  366. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  367. package/dist/components/widgets/query-filter/RangeFacetFilter.js.map +1 -1
  368. package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
  369. package/dist/features/curator/GridPage/components/GridPageTitle.d.ts.map +1 -1
  370. package/dist/features/curator/GridPage/components/GridPageTitle.js +23 -30
  371. package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
  372. package/dist/features/curator/dashboard/CuratorDashboard.d.ts +2 -0
  373. package/dist/features/curator/dashboard/CuratorDashboard.d.ts.map +1 -0
  374. package/dist/features/curator/dashboard/CuratorDashboard.js +45 -0
  375. package/dist/features/curator/dashboard/CuratorDashboard.js.map +1 -0
  376. package/dist/features/curator/dashboard/components/CurationTaskCard.css +1 -0
  377. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts +9 -0
  378. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -0
  379. package/dist/features/curator/dashboard/components/CurationTaskCard.js +106 -0
  380. package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -0
  381. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js +12 -0
  382. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js.map +1 -0
  383. package/dist/features/curator/dashboard/components/CurationTaskCard.module.scss +52 -0
  384. package/dist/features/curator/dashboard/components/NextStepButton.css +1 -0
  385. package/dist/features/curator/dashboard/components/NextStepButton.d.ts +14 -0
  386. package/dist/features/curator/dashboard/components/NextStepButton.d.ts.map +1 -0
  387. package/dist/features/curator/dashboard/components/NextStepButton.js +35 -0
  388. package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -0
  389. package/dist/features/curator/dashboard/components/NextStepButton.module.js +11 -0
  390. package/dist/features/curator/dashboard/components/NextStepButton.module.js.map +1 -0
  391. package/dist/features/curator/dashboard/components/NextStepButton.module.scss +57 -0
  392. package/dist/features/curator/dashboard/components/UserOrTeamChip.css +1 -1
  393. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js +1 -1
  394. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js.map +1 -1
  395. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.scss +5 -5
  396. package/dist/features/curator/dashboard/components/shared.css +1 -0
  397. package/dist/features/curator/dashboard/components/shared.module.js +5 -0
  398. package/dist/features/curator/dashboard/components/shared.module.js.map +1 -0
  399. package/dist/features/curator/dashboard/components/shared.module.scss +8 -0
  400. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts +0 -2
  401. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
  402. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +16 -34
  403. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  404. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  405. package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.js.map +1 -1
  406. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
  407. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js.map +1 -1
  408. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +1 -1
  409. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
  410. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts +10 -0
  411. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -0
  412. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +37 -0
  413. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -0
  414. package/dist/features/entity/metadata-task/utils/constants.d.ts +5 -0
  415. package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -0
  416. package/dist/features/entity/metadata-task/utils/constants.js +6 -0
  417. package/dist/features/entity/metadata-task/utils/constants.js.map +1 -0
  418. package/dist/mocks/challenge/mockChallenge.js.map +1 -1
  419. package/dist/mocks/entity/mockDataset.js.map +1 -1
  420. package/dist/mocks/entity/mockDatasetCollection.js.map +1 -1
  421. package/dist/mocks/entity/mockFileEntity.js.map +1 -1
  422. package/dist/mocks/entity/mockFileView.js.map +1 -1
  423. package/dist/mocks/entity/mockGeneratedEntityData.js.map +1 -1
  424. package/dist/mocks/entity/mockProject.js.map +1 -1
  425. package/dist/mocks/entity/mockProjectView.js.map +1 -1
  426. package/dist/mocks/entity/mockRootEntity.js.map +1 -1
  427. package/dist/mocks/entity/mockTableEntity.js.map +1 -1
  428. package/dist/mocks/mockWiki.js.map +1 -1
  429. package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
  430. package/dist/mocks/msw/handlers/challengeHandlers.js.map +1 -1
  431. package/dist/mocks/msw/handlers/changePasswordHandlers.js.map +1 -1
  432. package/dist/mocks/msw/handlers/discussionHandlers.js.map +1 -1
  433. package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
  434. package/dist/mocks/msw/handlers/fileHandlers.js.map +1 -1
  435. package/dist/mocks/msw/handlers/gridHandlers.js.map +1 -1
  436. package/dist/mocks/msw/handlers/personalAccessTokenHandlers.js.map +1 -1
  437. package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
  438. package/dist/mocks/msw/handlers/teamHandlers.js.map +1 -1
  439. package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
  440. package/dist/mocks/msw/handlers/wikiHandlers.js.map +1 -1
  441. package/dist/mocks/provenance/mockActivity.js.map +1 -1
  442. package/dist/mocks/query/mockReleaseCardsTableQueryResultBundle.js.map +1 -1
  443. package/dist/ror-client/index.js.map +1 -1
  444. package/dist/style/components/_cards.scss +4 -0
  445. package/dist/style/components/_data-grid-extra.css +1 -1
  446. package/dist/style/components/_data-grid-extra.scss +2 -0
  447. package/dist/style/main.css +1 -1
  448. package/dist/synapse-client/HttpClient.js.map +1 -1
  449. package/dist/synapse-client/SynapseClient.js.map +1 -1
  450. package/dist/synapse-queries/QueryMatching.test-utils.js.map +1 -1
  451. package/dist/synapse-queries/auth/useTwoFactorEnrollment.js.map +1 -1
  452. package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -1
  453. package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
  454. package/dist/synapse-queries/curation/task/useCurationTask.js +1 -1
  455. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  456. package/dist/synapse-queries/dataaccess/useRestrictionInformation.js.map +1 -1
  457. package/dist/synapse-queries/doi/useDOI.js.map +1 -1
  458. package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
  459. package/dist/synapse-queries/entity/useEntity.js.map +1 -1
  460. package/dist/synapse-queries/entity/useEntityBundle.js.map +1 -1
  461. package/dist/synapse-queries/entity/useExportTableQueryToAnalysisPlatform.js.map +1 -1
  462. package/dist/synapse-queries/entity/useExportToTerra.js.map +1 -1
  463. package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
  464. package/dist/synapse-queries/entity/useSchema.js.map +1 -1
  465. package/dist/synapse-queries/file/UploadToS3.js.map +1 -1
  466. package/dist/synapse-queries/file/useDirectUploadToS3.js.map +1 -1
  467. package/dist/synapse-queries/file/useFiles.js.map +1 -1
  468. package/dist/synapse-queries/forum/useReply.js.map +1 -1
  469. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  470. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts +2 -0
  471. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts.map +1 -1
  472. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
  473. package/dist/synapse-queries/grid/useExportGrid.js.map +1 -1
  474. package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
  475. package/dist/synapse-queries/grid/useImportCsvIntoGrid.js.map +1 -1
  476. package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
  477. package/dist/synapse-queries/table/useGetCsvPreview.js.map +1 -1
  478. package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
  479. package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
  480. package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
  481. package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
  482. package/dist/synapse-queries/user/useUserGroupHeader.js.map +1 -1
  483. package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
  484. package/dist/theme/ThemeProvider.js.map +1 -1
  485. package/dist/tsconfig.build.tsbuildinfo +1 -1
  486. package/dist/utils/AppUtils/session/SynapseSessionManager.js.map +1 -1
  487. package/dist/utils/AppUtils/session/useSessionManager.js.map +1 -1
  488. package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
  489. package/dist/utils/challenge/evaluation/EvaluationUtils.js.map +1 -1
  490. package/dist/utils/context/SynapseContext.js.map +1 -1
  491. package/dist/utils/functions/AccessControlListUtils.d.ts +4 -0
  492. package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
  493. package/dist/utils/functions/AccessControlListUtils.js +12 -1
  494. package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
  495. package/dist/utils/functions/GridApiUtils.js.map +1 -1
  496. package/dist/utils/functions/QueryFilterUtils.js.map +1 -1
  497. package/dist/utils/functions/RealmUtils.d.ts +4 -0
  498. package/dist/utils/functions/RealmUtils.d.ts.map +1 -1
  499. package/dist/utils/functions/RealmUtils.js +9 -3
  500. package/dist/utils/functions/RealmUtils.js.map +1 -1
  501. package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
  502. package/dist/utils/functions/SanitizeHtmlUtils.test-utils.js.map +1 -1
  503. package/dist/utils/functions/SqlFunctions.js.map +1 -1
  504. package/dist/utils/functions/StringUtils.js.map +1 -1
  505. package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
  506. package/dist/utils/functions/getDataFromFromStorage.js.map +1 -1
  507. package/dist/utils/functions/getEndpoint.js.map +1 -1
  508. package/dist/utils/functions/getUserData.js.map +1 -1
  509. package/dist/utils/functions/queryUtils.js.map +1 -1
  510. package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
  511. package/dist/utils/hooks/useConfirmItems.js.map +1 -1
  512. package/dist/utils/hooks/useCookiePreferences.js.map +1 -1
  513. package/dist/utils/hooks/useCreateShortUrl.js.map +1 -1
  514. package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
  515. package/dist/utils/hooks/useDirectDownloadHandler.js.map +1 -1
  516. package/dist/utils/hooks/useGetGoalData.js.map +1 -1
  517. package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
  518. package/dist/utils/hooks/useImageUrlUtils.js.map +1 -1
  519. package/dist/utils/hooks/useImmutableTableQuery/useImmutableTableQuery.js.map +1 -1
  520. package/dist/utils/hooks/useImmutableTableQuery/useTableQueryReducer.js.map +1 -1
  521. package/dist/utils/hooks/useIsBot.js.map +1 -1
  522. package/dist/utils/hooks/useListState.js.map +1 -1
  523. package/dist/utils/hooks/useLogin.d.ts.map +1 -1
  524. package/dist/utils/hooks/useLogin.js +53 -52
  525. package/dist/utils/hooks/useLogin.js.map +1 -1
  526. package/dist/utils/hooks/useMutuallyExclusiveState.js.map +1 -1
  527. package/dist/utils/hooks/useOverlay.js.map +1 -1
  528. package/dist/utils/hooks/usePreFetchResource.js.map +1 -1
  529. package/dist/utils/hooks/useQuerySearchParam.js.map +1 -1
  530. package/dist/utils/hooks/useScrollFadeTransition.js.map +1 -1
  531. package/dist/utils/hooks/useSet.js.map +1 -1
  532. package/dist/utils/hooks/useSourceAppConfigs.js.map +1 -1
  533. package/dist/utils/hooks/useTableImageUrl.js.map +1 -1
  534. package/dist/utils/hooks/useUploadFileEntity/useCreatePathsAndGetParentId.js.map +1 -1
  535. package/dist/utils/hooks/useUploadFileEntity/useLinkFileEntityToURL.js.map +1 -1
  536. package/dist/utils/hooks/useUploadFileEntity/usePrepareFileEntityUpload.js.map +1 -1
  537. package/dist/utils/hooks/useUploadFileEntity/useTrackFileUploads.js.map +1 -1
  538. package/dist/utils/hooks/useUploadFileEntity/useUploadFileEntities.js.map +1 -1
  539. package/dist/utils/hooks/useUploadFileEntity/useUploadFiles.js.map +1 -1
  540. package/dist/utils/hooks/useUploadFileEntity/willUploadsExceedStorageLimit.js.map +1 -1
  541. package/dist/utils/html/TargetEnum.js.map +1 -1
  542. package/dist/utils/jsonschema/SchemaAnnotationUtils.js.map +1 -1
  543. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"CreateTableViewWizardUtils.js","names":[],"sources":["../../../src/components/CreateTableViewWizard/CreateTableViewWizardUtils.ts"],"sourcesContent":["import { entityTypeToFriendlyName } from '@/utils/functions/EntityTypeUtils'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n ColumnModel,\n Entity,\n EntityView,\n MaterializedView,\n SubmissionView,\n Table,\n VirtualTable,\n} from '@sage-bionetworks/synapse-types'\n\nexport type CreateTableViewWizardStep =\n | 'CHOOSE_TABLE_TYPE'\n | 'CHOOSE_VIEW_TYPE'\n | 'ENTITY_VIEW_SCOPE'\n | 'SUBMISSION_VIEW_SCOPE'\n | 'TABLE_COLUMNS'\n | 'TABLE_SQL'\n | 'TABLE_NAME'\n\nexport function getModalTitle(\n step: CreateTableViewWizardStep,\n entityType?: EntityType,\n): string {\n switch (step) {\n case 'CHOOSE_TABLE_TYPE':\n return 'Create Table or View'\n case 'CHOOSE_VIEW_TYPE':\n return 'Create View'\n case 'ENTITY_VIEW_SCOPE':\n case 'SUBMISSION_VIEW_SCOPE':\n return `Define ${entityTypeToFriendlyName(entityType!)} Scope`\n case 'TABLE_SQL':\n return 'Create a SQL-Defined View'\n\n case 'TABLE_COLUMNS':\n return `Add Columns to ${entityTypeToFriendlyName(entityType!)}`\n\n case 'TABLE_NAME':\n return `Create the ${entityTypeToFriendlyName(entityType!)}`\n }\n}\n\nexport function getPreviousStep(\n currentStep: CreateTableViewWizardStep,\n entityType?: EntityType,\n): CreateTableViewWizardStep {\n switch (currentStep) {\n case 'CHOOSE_TABLE_TYPE':\n // This should never happen\n break\n case 'CHOOSE_VIEW_TYPE':\n return 'CHOOSE_TABLE_TYPE'\n case 'ENTITY_VIEW_SCOPE':\n case 'SUBMISSION_VIEW_SCOPE':\n case 'TABLE_SQL':\n return 'CHOOSE_VIEW_TYPE'\n case 'TABLE_COLUMNS':\n // If this is a table, then go back to the table type selection\n if (entityType === EntityType.table) {\n return 'CHOOSE_TABLE_TYPE'\n }\n // If this is a view, go back to scope selection\n if (entityType === EntityType.entityview) {\n return 'ENTITY_VIEW_SCOPE'\n }\n if (entityType === EntityType.submissionview) {\n return 'SUBMISSION_VIEW_SCOPE'\n }\n break\n case 'TABLE_NAME':\n if (\n entityType === EntityType.table ||\n entityType === EntityType.entityview ||\n entityType === EntityType.submissionview\n ) {\n return 'TABLE_COLUMNS'\n } else if (\n entityType === EntityType.materializedview ||\n entityType === EntityType.virtualtable\n ) {\n // TODO: Currently, this block is unreachable\n // TABLE_SQL is the last step, but after PLFM-8209 is complete, TABLE_SQL can come before TABLE_NAME, where this will make more sense\n // Other than removing this comment, no change will be needed here\n return 'TABLE_SQL'\n }\n break\n }\n console.warn(`Unknown previous step at ${currentStep} for type ${entityType}`)\n return 'CHOOSE_TABLE_TYPE'\n}\n\nexport function isLastStep(step: CreateTableViewWizardStep) {\n return step === 'TABLE_NAME'\n}\n\nexport function getStepAfterTypeSelection(\n entityType: EntityType,\n): CreateTableViewWizardStep {\n if (entityType === EntityType.table) {\n return 'TABLE_COLUMNS'\n }\n if (entityType === EntityType.entityview) {\n return 'ENTITY_VIEW_SCOPE'\n }\n if (entityType === EntityType.submissionview) {\n return 'SUBMISSION_VIEW_SCOPE'\n }\n if (\n entityType === EntityType.materializedview ||\n entityType === EntityType.virtualtable\n ) {\n return 'TABLE_SQL'\n }\n\n // Should never happen\n return 'CHOOSE_TABLE_TYPE'\n}\n\nexport function maybeSetColumnIds(\n entityToCreate: Entity,\n entityType: EntityType,\n createdColumnModels: ColumnModel[],\n) {\n const hasColumnIdsTypes: EntityType[] = [\n EntityType.table,\n EntityType.entityview,\n EntityType.submissionview,\n EntityType.dataset,\n EntityType.datasetcollection,\n ]\n if (hasColumnIdsTypes.includes(entityType)) {\n if (createdColumnModels.length > 0) {\n ;(entityToCreate as Table)['columnIds'] = createdColumnModels.map(\n cm => cm.id,\n )\n }\n }\n}\n\nexport function maybeSetScopeIds(\n entityToCreate: Entity,\n entityType: EntityType,\n scopeIds: string[],\n) {\n const hasScopeIdsTypes: EntityType[] = [\n EntityType.entityview,\n EntityType.submissionview,\n ]\n if (hasScopeIdsTypes.includes(entityType) && scopeIds.length > 0) {\n ;(entityToCreate as EntityView | SubmissionView)['scopeIds'] = scopeIds\n }\n}\n\nexport function maybeSetViewTypeMask(\n entityToCreate: Entity,\n entityType: EntityType,\n viewTypeMask: number,\n) {\n if (entityType === EntityType.entityview) {\n ;(entityToCreate as EntityView)['viewTypeMask'] = viewTypeMask\n }\n}\n\nexport function maybeSetDefiningSQL(\n entityToCreate: Entity,\n entityType: EntityType,\n sql: string,\n) {\n const hasDefiningSQLTypes: EntityType[] = [\n EntityType.materializedview,\n EntityType.virtualtable,\n ]\n if (hasDefiningSQLTypes.includes(entityType)) {\n ;(entityToCreate as MaterializedView | VirtualTable)['definingSQL'] = sql\n }\n}\n"],"mappings":";;;AAqBA,SAAgB,EACd,GACA,GACQ;AACR,SAAQ,GAAR;EACE,KAAK,oBACH,QAAO;EACT,KAAK,mBACH,QAAO;EACT,KAAK;EACL,KAAK,wBACH,QAAO,UAAU,EAAyB,EAAY,CAAC;EACzD,KAAK,YACH,QAAO;EAET,KAAK,gBACH,QAAO,kBAAkB,EAAyB,EAAY;EAEhE,KAAK,aACH,QAAO,cAAc,EAAyB,EAAY;;;AAIhE,SAAgB,EACd,GACA,GAC2B;AAC3B,SAAQ,GAAR;EACE,KAAK,oBAEH;EACF,KAAK,mBACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,YACH,QAAO;EACT,KAAK;AAEH,OAAI,MAAe,EAAW,MAC5B,QAAO;AAGT,OAAI,MAAe,EAAW,WAC5B,QAAO;AAET,OAAI,MAAe,EAAW,eAC5B,QAAO;AAET;EACF,KAAK;AACH,OACE,MAAe,EAAW,SAC1B,MAAe,EAAW,cAC1B,MAAe,EAAW,eAE1B,QAAO;OAEP,MAAe,EAAW,oBAC1B,MAAe,EAAW,aAK1B,QAAO;AAET;;AAGJ,QADA,QAAQ,KAAK,4BAA4B,EAAY,YAAY,IAAa,EACvE;;AAGT,SAAgB,EAAW,GAAiC;AAC1D,QAAO,MAAS;;AAGlB,SAAgB,EACd,GAC2B;AAkB3B,QAjBI,MAAe,EAAW,QACrB,kBAEL,MAAe,EAAW,aACrB,sBAEL,MAAe,EAAW,iBACrB,0BAGP,MAAe,EAAW,oBAC1B,MAAe,EAAW,eAEnB,cAIF;;AAGT,SAAgB,EACd,GACA,GACA,GACA;AAQA,CAPwC;EACtC,EAAW;EACX,EAAW;EACX,EAAW;EACX,EAAW;EACX,EAAW;EACZ,CACqB,SAAS,EAAW,IACpC,EAAoB,SAAS,MAC7B,EAAyB,YAAe,EAAoB,KAC5D,MAAM,EAAG,GACV;;AAKP,SAAgB,EACd,GACA,GACA,GACA;AAKA,CAJuC,CACrC,EAAW,YACX,EAAW,eACZ,CACoB,SAAS,EAAW,IAAI,EAAS,SAAS,MAC3D,EAA+C,WAAc;;AAInE,SAAgB,EACd,GACA,GACA,GACA;AACA,CAAI,MAAe,EAAW,eAC1B,EAA8B,eAAkB;;AAItD,SAAgB,EACd,GACA,GACA,GACA;AAKA,CAJ0C,CACxC,EAAW,kBACX,EAAW,aACZ,CACuB,SAAS,EAAW,KACxC,EAAmD,cAAiB"}
1
+ {"version":3,"file":"CreateTableViewWizardUtils.js","names":[],"sources":["../../../src/components/CreateTableViewWizard/CreateTableViewWizardUtils.ts"],"sourcesContent":["import { entityTypeToFriendlyName } from '@/utils/functions/EntityTypeUtils'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n ColumnModel,\n Entity,\n EntityView,\n MaterializedView,\n SubmissionView,\n Table,\n VirtualTable,\n} from '@sage-bionetworks/synapse-types'\n\nexport type CreateTableViewWizardStep =\n | 'CHOOSE_TABLE_TYPE'\n | 'CHOOSE_VIEW_TYPE'\n | 'ENTITY_VIEW_SCOPE'\n | 'SUBMISSION_VIEW_SCOPE'\n | 'TABLE_COLUMNS'\n | 'TABLE_SQL'\n | 'TABLE_NAME'\n\nexport function getModalTitle(\n step: CreateTableViewWizardStep,\n entityType?: EntityType,\n): string {\n switch (step) {\n case 'CHOOSE_TABLE_TYPE':\n return 'Create Table or View'\n case 'CHOOSE_VIEW_TYPE':\n return 'Create View'\n case 'ENTITY_VIEW_SCOPE':\n case 'SUBMISSION_VIEW_SCOPE':\n return `Define ${entityTypeToFriendlyName(entityType!)} Scope`\n case 'TABLE_SQL':\n return 'Create a SQL-Defined View'\n\n case 'TABLE_COLUMNS':\n return `Add Columns to ${entityTypeToFriendlyName(entityType!)}`\n\n case 'TABLE_NAME':\n return `Create the ${entityTypeToFriendlyName(entityType!)}`\n }\n}\n\nexport function getPreviousStep(\n currentStep: CreateTableViewWizardStep,\n entityType?: EntityType,\n): CreateTableViewWizardStep {\n switch (currentStep) {\n case 'CHOOSE_TABLE_TYPE':\n // This should never happen\n break\n case 'CHOOSE_VIEW_TYPE':\n return 'CHOOSE_TABLE_TYPE'\n case 'ENTITY_VIEW_SCOPE':\n case 'SUBMISSION_VIEW_SCOPE':\n case 'TABLE_SQL':\n return 'CHOOSE_VIEW_TYPE'\n case 'TABLE_COLUMNS':\n // If this is a table, then go back to the table type selection\n if (entityType === EntityType.table) {\n return 'CHOOSE_TABLE_TYPE'\n }\n // If this is a view, go back to scope selection\n if (entityType === EntityType.entityview) {\n return 'ENTITY_VIEW_SCOPE'\n }\n if (entityType === EntityType.submissionview) {\n return 'SUBMISSION_VIEW_SCOPE'\n }\n break\n case 'TABLE_NAME':\n if (\n entityType === EntityType.table ||\n entityType === EntityType.entityview ||\n entityType === EntityType.submissionview\n ) {\n return 'TABLE_COLUMNS'\n } else if (\n entityType === EntityType.materializedview ||\n entityType === EntityType.virtualtable\n ) {\n // TODO: Currently, this block is unreachable\n // TABLE_SQL is the last step, but after PLFM-8209 is complete, TABLE_SQL can come before TABLE_NAME, where this will make more sense\n // Other than removing this comment, no change will be needed here\n return 'TABLE_SQL'\n }\n break\n }\n console.warn(`Unknown previous step at ${currentStep} for type ${entityType}`)\n return 'CHOOSE_TABLE_TYPE'\n}\n\nexport function isLastStep(step: CreateTableViewWizardStep) {\n return step === 'TABLE_NAME'\n}\n\nexport function getStepAfterTypeSelection(\n entityType: EntityType,\n): CreateTableViewWizardStep {\n if (entityType === EntityType.table) {\n return 'TABLE_COLUMNS'\n }\n if (entityType === EntityType.entityview) {\n return 'ENTITY_VIEW_SCOPE'\n }\n if (entityType === EntityType.submissionview) {\n return 'SUBMISSION_VIEW_SCOPE'\n }\n if (\n entityType === EntityType.materializedview ||\n entityType === EntityType.virtualtable\n ) {\n return 'TABLE_SQL'\n }\n\n // Should never happen\n return 'CHOOSE_TABLE_TYPE'\n}\n\nexport function maybeSetColumnIds(\n entityToCreate: Entity,\n entityType: EntityType,\n createdColumnModels: ColumnModel[],\n) {\n const hasColumnIdsTypes: EntityType[] = [\n EntityType.table,\n EntityType.entityview,\n EntityType.submissionview,\n EntityType.dataset,\n EntityType.datasetcollection,\n ]\n if (hasColumnIdsTypes.includes(entityType)) {\n if (createdColumnModels.length > 0) {\n ;(entityToCreate as Table)['columnIds'] = createdColumnModels.map(\n cm => cm.id,\n )\n }\n }\n}\n\nexport function maybeSetScopeIds(\n entityToCreate: Entity,\n entityType: EntityType,\n scopeIds: string[],\n) {\n const hasScopeIdsTypes: EntityType[] = [\n EntityType.entityview,\n EntityType.submissionview,\n ]\n if (hasScopeIdsTypes.includes(entityType) && scopeIds.length > 0) {\n ;(entityToCreate as EntityView | SubmissionView)['scopeIds'] = scopeIds\n }\n}\n\nexport function maybeSetViewTypeMask(\n entityToCreate: Entity,\n entityType: EntityType,\n viewTypeMask: number,\n) {\n if (entityType === EntityType.entityview) {\n ;(entityToCreate as EntityView)['viewTypeMask'] = viewTypeMask\n }\n}\n\nexport function maybeSetDefiningSQL(\n entityToCreate: Entity,\n entityType: EntityType,\n sql: string,\n) {\n const hasDefiningSQLTypes: EntityType[] = [\n EntityType.materializedview,\n EntityType.virtualtable,\n ]\n if (hasDefiningSQLTypes.includes(entityType)) {\n ;(entityToCreate as MaterializedView | VirtualTable)['definingSQL'] = sql\n }\n}\n"],"mappings":";;;AAqBA,SAAgB,EACd,GACA,GACQ;AACR,SAAQ,GAAR;EACE,KAAK,oBACH,QAAO;EACT,KAAK,mBACH,QAAO;EACT,KAAK;EACL,KAAK,wBACH,QAAO,UAAU,EAAyB,EAAY,CAAC;EACzD,KAAK,YACH,QAAO;EAET,KAAK,gBACH,QAAO,kBAAkB,EAAyB,EAAY;EAEhE,KAAK,aACH,QAAO,cAAc,EAAyB,EAAY;;;AAIhE,SAAgB,EACd,GACA,GAC2B;AAC3B,SAAQ,GAAR;EACE,KAAK,oBAEH;EACF,KAAK,mBACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,YACH,QAAO;EACT,KAAK;AAEH,OAAI,MAAe,EAAW,MAC5B,QAAO;AAGT,OAAI,MAAe,EAAW,WAC5B,QAAO;AAET,OAAI,MAAe,EAAW,eAC5B,QAAO;AAET;EACF,KAAK;AACH,OACE,MAAe,EAAW,SAC1B,MAAe,EAAW,cAC1B,MAAe,EAAW,eAE1B,QAAO;OAEP,MAAe,EAAW,oBAC1B,MAAe,EAAW,aAK1B,QAAO;AAET;;AAGJ,QADA,QAAQ,KAAK,4BAA4B,EAAY,YAAY,IAAa,EACvE;;AAGT,SAAgB,EAAW,GAAiC;AAC1D,QAAO,MAAS;;AAGlB,SAAgB,EACd,GAC2B;AAkB3B,QAjBI,MAAe,EAAW,QACrB,kBAEL,MAAe,EAAW,aACrB,sBAEL,MAAe,EAAW,iBACrB,0BAGP,MAAe,EAAW,oBAC1B,MAAe,EAAW,eAEnB,cAIF;;AAGT,SAAgB,EACd,GACA,GACA,GACA;AAQA,CAAI;EANF,EAAW;EACX,EAAW;EACX,EAAW;EACX,EAAW;EACX,EAAW;EAET,CAAkB,SAAS,EAAW,IACpC,EAAoB,SAAS,MAC7B,EAAyB,YAAe,EAAoB,KAC5D,MAAM,EAAG,GACV;;AAKP,SAAgB,EACd,GACA,GACA,GACA;AAKA,CAAI,CAHF,EAAW,YACX,EAAW,eAET,CAAiB,SAAS,EAAW,IAAI,EAAS,SAAS,MAC3D,EAA+C,WAAc;;AAInE,SAAgB,EACd,GACA,GACA,GACA;AACA,CAAI,MAAe,EAAW,eAC1B,EAA8B,eAAkB;;AAItD,SAAgB,EACd,GACA,GACA,GACA;AAKA,CAAI,CAHF,EAAW,kBACX,EAAW,aAET,CAAoB,SAAS,EAAW,KACxC,EAAmD,cAAiB"}
@@ -19,7 +19,6 @@ type DataGridProps = {
19
19
  handleSelectionChange: (opts: {
20
20
  selection: SelectionWithId | null;
21
21
  }) => void;
22
- onSelectedRowChange?: (rowIndex: number | null, row: DataGridRow | null) => void;
23
22
  remoteSelections?: readonly RemoteSelection[];
24
23
  };
25
24
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"DataGrid.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/DataGrid.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAEL,gBAAgB,EACjB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,uDAAuD,CAAA;AAC9D,OAAO,8CAA8C,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAMxE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAElE,KAAK,aAAa,GAAG;IACnB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IACjD,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,oBAAoB,EAAE,mBAAmB,CAAA;IACzC,SAAS,EAAE,WAAW,EAAE,CAAA;IACxB,YAAY,EAAE,OAAO,CAAA;IACrB,UAAU,EAAE,WAAW,GAAG,SAAS,CAAA;IACnC,aAAa,EAAE,eAAe,GAAG,IAAI,CAAA;IACrC,YAAY,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IACxE,qBAAqB,EAAE,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,eAAe,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5E,mBAAmB,CAAC,EAAE,CACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,GAAG,EAAE,WAAW,GAAG,IAAI,KACpB,IAAI,CAAA;IACT,gBAAgB,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CAC9C,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAK,EAAE,aAAa,2CA2OpD"}
1
+ {"version":3,"file":"DataGrid.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/DataGrid.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAEL,gBAAgB,EACjB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,uDAAuD,CAAA;AAC9D,OAAO,8CAA8C,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAMxE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAElE,KAAK,aAAa,GAAG;IACnB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IACjD,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,oBAAoB,EAAE,mBAAmB,CAAA;IACzC,SAAS,EAAE,WAAW,EAAE,CAAA;IACxB,YAAY,EAAE,OAAO,CAAA;IACrB,UAAU,EAAE,WAAW,GAAG,SAAS,CAAA;IACnC,aAAa,EAAE,eAAe,GAAG,IAAI,CAAA;IACrC,YAAY,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IACxE,qBAAqB,EAAE,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,eAAe,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5E,gBAAgB,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CAC9C,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAoOpD"}
@@ -2,28 +2,28 @@ import { GRID_ROW_REACT_KEY_PROPERTY as e } from "./utils/DataGridUtils.js";
2
2
  import { calculateDefaultColumnWidth as t } from "./utils/calculateColumnWidth.js";
3
3
  import { modelColsToGrid as n } from "./utils/modelColsToGrid.js";
4
4
  import '../../style/components/_data-grid-extra.css';/* empty css */
5
- import { renderAddRowsComponent as r, renderRecordSetContextMenu as i, renderViewContextMenu as ee } from "./components/contextMenu.js";
6
- import { getCellClassName as a } from "./utils/getCellClassName.js";
5
+ import { renderAddRowsComponent as r, renderRecordSetContextMenu as i, renderViewContextMenu as a } from "./components/contextMenu.js";
6
+ import { getCellClassName as ee } from "./utils/getCellClassName.js";
7
7
  import { useColumnResizeHandles as te } from "./hooks/useColumnResizeHandles.js";
8
8
  import { useEffect as ne, useRef as o, useState as s } from "react";
9
9
  import { jsx as c } from "react/jsx-runtime";
10
- import { c as re } from "react/compiler-runtime";
11
- import { DynamicDataSheetGrid as ie } from "@sage-bionetworks/react-datasheet-grid";
12
10
  import l from "classnames";
11
+ import { c as re } from "react/compiler-runtime";
12
+ import { DynamicDataSheetGrid as u } from "@sage-bionetworks/react-datasheet-grid";
13
13
  import "@sage-bionetworks/react-datasheet-grid/dist/style.css";
14
14
  //#region src/components/DataGrid/DataGrid.tsx
15
- function u(u) {
16
- let d = re(46), { gridRef: f, rowValues: p, columnNames: m, columnOrder: h, schemaPropertiesInfo: g, entityIsView: _, jsonSchema: v, lastSelection: y, handleChange: b, handleSelectionChange: x, onSelectedRowChange: S, remoteSelections: C } = u, w;
17
- d[0] === Symbol.for("react.memo_cache_sentinel") ? (w = {}, d[0] = w) : w = d[0];
18
- let [T, E] = s(w), [D, se] = s(!1), O, k;
19
- d[1] !== m || d[2] !== h || d[3] !== g ? (O = () => {
20
- !m || !h || E((e) => {
21
- let n = h.map((e) => m[e]);
15
+ function d(d) {
16
+ let p = re(43), { gridRef: m, rowValues: h, columnNames: g, columnOrder: _, schemaPropertiesInfo: v, entityIsView: y, jsonSchema: b, lastSelection: x, handleChange: S, handleSelectionChange: C, remoteSelections: w } = d, T;
17
+ p[0] === Symbol.for("react.memo_cache_sentinel") ? (T = {}, p[0] = T) : T = p[0];
18
+ let [E, D] = s(T), [O, k] = s(!1), A, j;
19
+ p[1] !== g || p[2] !== _ || p[3] !== v ? (A = () => {
20
+ !g || !_ || D((e) => {
21
+ let n = _.map((e) => g[e]);
22
22
  if (!n.some((t) => !e[t])) return e;
23
23
  let r = { ...e };
24
24
  return n.forEach((e, n) => {
25
25
  if (!r[e]) {
26
- let i = g[e];
26
+ let i = v[e];
27
27
  r[e] = t(e, i, {
28
28
  showPinIcon: n === 0,
29
29
  hasDescription: !!i?.description
@@ -31,102 +31,102 @@ function u(u) {
31
31
  }
32
32
  }), r;
33
33
  });
34
- }, k = [
35
- m,
36
- h,
37
- g
38
- ], d[1] = m, d[2] = h, d[3] = g, d[4] = O, d[5] = k) : (O = d[4], k = d[5]), ne(O, k);
39
- let A;
40
- d[6] === h ? A = d[7] : (A = (e) => {
41
- typeof e != "number" || e < 0 || !h || e >= h.length || e === 0 && se(oe);
42
- }, d[6] = h, d[7] = A);
43
- let j = A, M;
44
- d[8] === D ? M = d[9] : (M = D ? new Set([0]) : /* @__PURE__ */ new Set(), d[8] = D, d[9] = M);
34
+ }, j = [
35
+ g,
36
+ _,
37
+ v
38
+ ], p[1] = g, p[2] = _, p[3] = v, p[4] = A, p[5] = j) : (A = p[4], j = p[5]), ne(A, j);
39
+ let M;
40
+ p[6] === _ ? M = p[7] : (M = (e) => {
41
+ typeof e != "number" || e < 0 || !_ || e >= _.length || e === 0 && k(f);
42
+ }, p[6] = _, p[7] = M);
45
43
  let N = M, P;
46
- d[10] !== m || d[11] !== h || d[12] !== T || d[13] !== j || d[14] !== N || d[15] !== g ? (P = n(m, h, g, T, N, j), d[10] = m, d[11] = h, d[12] = T, d[13] = j, d[14] = N, d[15] = g, d[16] = P) : P = d[16];
47
- let F = P, [I, L] = s(null), R = _ ? ee : i, z = _ ? !1 : r, B;
48
- d[17] !== v || d[18] !== I ? (B = (e) => {
44
+ p[8] === O ? P = p[9] : (P = O ? new Set([0]) : /* @__PURE__ */ new Set(), p[8] = O, p[9] = P);
45
+ let F = P, I;
46
+ p[10] !== g || p[11] !== _ || p[12] !== E || p[13] !== N || p[14] !== F || p[15] !== v ? (I = n(g, _, v, E, F, N), p[10] = g, p[11] = _, p[12] = E, p[13] = N, p[14] = F, p[15] = v, p[16] = I) : I = p[16];
47
+ let L = I, [R, ae] = s(null), z = y ? a : i, B = y ? !1 : r, V;
48
+ p[17] !== b || p[18] !== R ? (V = (e) => {
49
49
  let { rowData: t, rowIndex: n } = e;
50
50
  return l({
51
- "row-valid": !!v && t.__validationStatus === "valid",
52
- "row-invalid": !!v && t.__validationStatus === "invalid",
53
- "row-unknown": !!v && t.__validationStatus === "pending",
54
- "row-selected": I === n
51
+ "row-valid": !!b && t.__validationStatus === "valid",
52
+ "row-invalid": !!b && t.__validationStatus === "invalid",
53
+ "row-unknown": !!b && t.__validationStatus === "pending",
54
+ "row-selected": R === n
55
55
  });
56
- }, d[17] = v, d[18] = I, d[19] = B) : B = d[19];
57
- let V = B, H;
58
- d[20] !== F || d[21] !== y || d[22] !== C || d[23] !== I ? (H = (e) => {
56
+ }, p[17] = b, p[18] = R, p[19] = V) : V = p[19];
57
+ let H = V, U;
58
+ p[20] !== L || p[21] !== x || p[22] !== w || p[23] !== R ? (U = (e) => {
59
59
  let { rowData: t, rowIndex: n, columnId: r } = e;
60
- return a({
60
+ return ee({
61
61
  rowData: t,
62
62
  rowIndex: n,
63
63
  columnId: r || "",
64
- selectedRowIndex: I,
65
- lastSelection: y,
66
- colValues: F,
67
- remoteSelections: C
64
+ selectedRowIndex: R,
65
+ lastSelection: x,
66
+ colValues: L,
67
+ remoteSelections: w
68
68
  });
69
- }, d[20] = F, d[21] = y, d[22] = C, d[23] = I, d[24] = H) : H = d[24];
70
- let U = H, ce = ae, W;
71
- d[25] !== S || d[26] !== p ? (W = (e) => {
69
+ }, p[20] = L, p[21] = x, p[22] = w, p[23] = R, p[24] = U) : U = p[24];
70
+ let W = U, oe = ie, G;
71
+ p[25] === Symbol.for("react.memo_cache_sentinel") ? (G = (e) => {
72
72
  let { cell: t } = e;
73
- t ? (L(t.row), S?.(t.row, p[t.row])) : (L(null), S?.(null, null));
74
- }, d[25] = S, d[26] = p, d[27] = W) : W = d[27];
75
- let G = W, K = o(null), q = o(null), J;
76
- d[28] === f ? J = d[29] : (J = (e, t) => {
77
- if (f.current) {
78
- let e = f.current.activeCell;
73
+ ae(t ? t.row : null);
74
+ }, p[25] = G) : G = p[25];
75
+ let se = G, K = o(null), q = o(null), J;
76
+ p[26] === m ? J = p[27] : (J = (e, t) => {
77
+ if (m.current) {
78
+ let e = m.current.activeCell;
79
79
  e ? q.current = {
80
80
  col: e.col,
81
81
  row: e.row
82
82
  } : q.current = null;
83
83
  }
84
- E((n) => ({
84
+ D((n) => ({
85
85
  ...n,
86
86
  [e]: t
87
87
  }));
88
- }, d[28] = f, d[29] = J);
88
+ }, p[26] = m, p[27] = J);
89
89
  let Y = J, X;
90
- d[30] !== F || d[31] !== Y ? (X = {
90
+ p[28] !== L || p[29] !== Y ? (X = {
91
91
  wrapperRef: K,
92
- colValues: F,
92
+ colValues: L,
93
93
  onColumnResize: Y
94
- }, d[30] = F, d[31] = Y, d[32] = X) : X = d[32], te(X);
94
+ }, p[28] = L, p[29] = Y, p[30] = X) : X = p[30], te(X);
95
95
  let Z;
96
- d[33] === Symbol.for("react.memo_cache_sentinel") ? (Z = {
96
+ p[31] === Symbol.for("react.memo_cache_sentinel") ? (Z = {
97
97
  position: "relative",
98
98
  width: "100%"
99
- }, d[33] = Z) : Z = d[33];
100
- let Q = !_, $;
101
- return d[34] !== z || d[35] !== U || d[36] !== F || d[37] !== R || d[38] !== f || d[39] !== G || d[40] !== b || d[41] !== x || d[42] !== V || d[43] !== p || d[44] !== Q ? ($ = /* @__PURE__ */ c("div", {
99
+ }, p[31] = Z) : Z = p[31];
100
+ let Q = !y, $;
101
+ return p[32] !== B || p[33] !== W || p[34] !== L || p[35] !== z || p[36] !== m || p[37] !== S || p[38] !== C || p[39] !== H || p[40] !== h || p[41] !== Q ? ($ = /* @__PURE__ */ c("div", {
102
102
  ref: K,
103
103
  style: Z,
104
- children: /* @__PURE__ */ c(ie, {
105
- ref: f,
106
- value: p,
107
- columns: F,
104
+ children: /* @__PURE__ */ c(u, {
105
+ ref: m,
106
+ value: h,
107
+ columns: L,
108
108
  autoAddRow: Q,
109
109
  disableSmartDelete: !0,
110
- addRowsComponent: z,
111
- contextMenuComponent: R,
110
+ addRowsComponent: B,
111
+ contextMenuComponent: z,
112
112
  rowKey: e,
113
- rowClassName: V,
114
- cellClassName: U,
115
- duplicateRow: ce,
116
- onChange: b,
117
- onActiveCellChange: G,
118
- onSelectionChange: x
113
+ rowClassName: H,
114
+ cellClassName: W,
115
+ duplicateRow: oe,
116
+ onChange: S,
117
+ onActiveCellChange: se,
118
+ onSelectionChange: C
119
119
  })
120
- }), d[34] = z, d[35] = U, d[36] = F, d[37] = R, d[38] = f, d[39] = G, d[40] = b, d[41] = x, d[42] = V, d[43] = p, d[44] = Q, d[45] = $) : $ = d[45], $;
120
+ }), p[32] = B, p[33] = W, p[34] = L, p[35] = z, p[36] = m, p[37] = S, p[38] = C, p[39] = H, p[40] = h, p[41] = Q, p[42] = $) : $ = p[42], $;
121
121
  }
122
- function ae(e) {
122
+ function ie(e) {
123
123
  let { rowData: t } = e;
124
124
  return { ...t };
125
125
  }
126
- function oe(e) {
126
+ function f(e) {
127
127
  return !e;
128
128
  }
129
129
  //#endregion
130
- export { u as default };
130
+ export { d as default };
131
131
 
132
132
  //# sourceMappingURL=DataGrid.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataGrid.js","names":["modelColsToGrid","SchemaPropertiesMap","classNames","JSONSchema7","useEffect","useMemo","useState","useRef","useCallback","DynamicDataSheetGrid","DataSheetGridRef","SelectionWithId","renderAddRowsComponent","renderRecordSetContextMenu","renderViewContextMenu","DataGridRow","Operation","GRID_ROW_REACT_KEY_PROPERTY","getCellClassName","useColumnResizeHandles","calculateDefaultColumnWidth","HeaderOptions","RemoteSelection","DataGridProps","gridRef","React","RefObject","columnNames","columnOrder","schemaPropertiesInfo","rowValues","entityIsView","jsonSchema","lastSelection","handleChange","newValue","operations","handleSelectionChange","opts","selection","onSelectedRowChange","rowIndex","row","remoteSelections","DataGrid","props","$","_c","t0","Symbol","for","columnWidths","setColumnWidths","isPinned","setIsPinned","t1","t2","prev","modelColumnNames","map","idx","needsUpdate","some","name","newWidths","forEach","columnName","arrayIndex","propertyInfo","headerOptions","showPinIcon","hasDescription","description","t3","columnIndex","length","_temp","handleTogglePin","t4","Set","pinnedColumnsSet","t5","colValues","selectedRowIndex","setSelectedRowIndex","contextMenuComponent","addRowsComponent","t6","t7","rowData","__validationStatus","rowClassNameCallback","t8","rowData_0","rowIndex_0","columnId","cellClassNameCallback","duplicateRowCallback","_temp2","t9","cell","handleActiveCellChange","wrapperRef","activeCellBeforeResizeRef","columnName_0","newWidth","current","activeCell","col","prev_1","handleColumnResize","t10","onColumnResize","t11","position","width","t12","t13","rowData_1","prev_0"],"sources":["../../../src/components/DataGrid/DataGrid.tsx"],"sourcesContent":["import { modelColsToGrid } from '@/components/DataGrid/utils/modelColsToGrid'\nimport { SchemaPropertiesMap } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport classNames from 'classnames'\nimport { JSONSchema7 } from 'json-schema'\nimport { useEffect, useMemo, useState, useRef, useCallback } from 'react'\nimport {\n DynamicDataSheetGrid,\n DataSheetGridRef,\n} from '@sage-bionetworks/react-datasheet-grid'\nimport '@sage-bionetworks/react-datasheet-grid/dist/style.css'\nimport '../../style/components/_data-grid-extra.scss'\nimport { SelectionWithId } from '@sage-bionetworks/react-datasheet-grid'\nimport {\n renderAddRowsComponent,\n renderRecordSetContextMenu,\n renderViewContextMenu,\n} from './components/contextMenu'\nimport { DataGridRow, Operation } from './DataGridTypes'\nimport { GRID_ROW_REACT_KEY_PROPERTY } from './utils/DataGridUtils'\nimport { getCellClassName } from './utils/getCellClassName'\nimport { useColumnResizeHandles } from './hooks/useColumnResizeHandles'\nimport {\n calculateDefaultColumnWidth,\n HeaderOptions,\n} from './utils/calculateColumnWidth'\nimport type { RemoteSelection } from './hooks/useRemoteSelections'\n\ntype DataGridProps = {\n gridRef: React.RefObject<DataSheetGridRef | null>\n columnNames: string[]\n columnOrder: number[]\n schemaPropertiesInfo: SchemaPropertiesMap\n rowValues: DataGridRow[]\n entityIsView: boolean\n jsonSchema: JSONSchema7 | undefined\n lastSelection: SelectionWithId | null\n handleChange: (newValue: DataGridRow[], operations: Operation[]) => void\n handleSelectionChange: (opts: { selection: SelectionWithId | null }) => void\n onSelectedRowChange?: (\n rowIndex: number | null,\n row: DataGridRow | null,\n ) => void\n remoteSelections?: readonly RemoteSelection[]\n}\n\n/**\n * Component that renders a data grid/spreadsheet using react-datasheet-grid.\n * @param props\n * @constructor\n */\nexport default function DataGrid(props: DataGridProps) {\n const {\n gridRef,\n rowValues,\n columnNames,\n columnOrder,\n schemaPropertiesInfo,\n entityIsView,\n jsonSchema,\n lastSelection,\n handleChange,\n handleSelectionChange,\n onSelectedRowChange,\n remoteSelections,\n } = props\n\n // Move columnWidths state into DataGrid\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({})\n\n // Pin state management for first column\n const [isPinned, setIsPinned] = useState(false)\n\n // Initialize column widths with defaults when columns first become available\n useEffect(() => {\n if (!columnNames || !columnOrder) {\n return\n }\n\n // Initialize widths for any columns that don't have them yet\n setColumnWidths(prev => {\n const modelColumnNames = columnOrder.map(idx => columnNames[idx])\n\n // Check if any columns need initialization\n const needsUpdate = modelColumnNames.some(name => !prev[name])\n\n if (!needsUpdate) {\n return prev // Return same reference to avoid triggering updates\n }\n\n const newWidths = { ...prev }\n modelColumnNames.forEach((columnName, arrayIndex) => {\n if (!newWidths[columnName]) {\n // Calculate default width using centralized function\n const propertyInfo = schemaPropertiesInfo[columnName]\n const headerOptions: HeaderOptions = {\n showPinIcon: arrayIndex === 0,\n hasDescription: !!propertyInfo?.description,\n }\n newWidths[columnName] = calculateDefaultColumnWidth(\n columnName,\n propertyInfo,\n headerOptions,\n )\n }\n })\n return newWidths\n })\n }, [columnNames, columnOrder, schemaPropertiesInfo])\n\n // Handler to toggle pin state for the first column only\n const handleTogglePin = useCallback(\n (columnIndex: number) => {\n // Validate columnIndex\n if (\n typeof columnIndex !== 'number' ||\n columnIndex < 0 ||\n !columnOrder ||\n columnIndex >= columnOrder.length\n ) {\n return\n }\n\n if (columnIndex !== 0) return // Only allow first column pinning\n\n setIsPinned(prev => !prev)\n },\n [columnOrder],\n )\n\n // Memoize the pinned columns set to prevent recalculation during scroll\n const pinnedColumnsSet = useMemo<Set<number>>(() => {\n return isPinned ? new Set([0]) : new Set()\n }, [isPinned])\n\n const colValues = useMemo(\n () =>\n modelColsToGrid(\n columnNames,\n columnOrder,\n schemaPropertiesInfo,\n columnWidths,\n pinnedColumnsSet,\n handleTogglePin,\n ),\n [\n columnNames,\n columnOrder,\n schemaPropertiesInfo,\n columnWidths,\n pinnedColumnsSet,\n handleTogglePin,\n ],\n )\n const [selectedRowIndex, setSelectedRowIndex] = useState<number | null>(null)\n\n // Memoize contextMenuComponent\n const contextMenuComponent = useMemo(\n () => (entityIsView ? renderViewContextMenu : renderRecordSetContextMenu),\n [entityIsView],\n )\n\n // Memoize addRowsComponent\n const addRowsComponent = useMemo(\n () => (entityIsView ? false : renderAddRowsComponent),\n [entityIsView],\n )\n\n // Wrap rowClassName in useCallback\n const rowClassNameCallback = useCallback(\n ({ rowData, rowIndex }: { rowData: DataGridRow; rowIndex: number }) =>\n classNames({\n 'row-valid': !!jsonSchema && rowData.__validationStatus === 'valid',\n 'row-invalid': !!jsonSchema && rowData.__validationStatus === 'invalid',\n 'row-unknown': !!jsonSchema && rowData.__validationStatus === 'pending',\n 'row-selected': selectedRowIndex === rowIndex,\n }),\n [jsonSchema, selectedRowIndex],\n )\n\n // Wrap cellClassName in useCallback\n const cellClassNameCallback = useCallback(\n ({\n rowData,\n rowIndex,\n columnId,\n }: {\n rowData: unknown\n rowIndex: number\n columnId?: string\n }) => {\n return getCellClassName({\n rowData: rowData as DataGridRow,\n rowIndex,\n columnId: columnId || '',\n selectedRowIndex,\n lastSelection,\n colValues,\n remoteSelections,\n })\n },\n [selectedRowIndex, lastSelection, colValues, remoteSelections],\n )\n\n // Wrap duplicateRow in useCallback\n const duplicateRowCallback = useCallback(\n ({ rowData }: { rowData: DataGridRow }) => ({\n ...rowData,\n }),\n [],\n )\n\n // Wrap onActiveCellChange in useCallback\n const handleActiveCellChange = useCallback(\n ({ cell }: { cell: { row: number; col: number } | null }) => {\n if (cell) {\n setSelectedRowIndex(cell.row)\n onSelectedRowChange?.(cell.row, rowValues[cell.row])\n } else {\n setSelectedRowIndex(null)\n onSelectedRowChange?.(null, null)\n }\n },\n [onSelectedRowChange, rowValues],\n )\n\n // Wrapper ref for the grid container\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n // Store the active cell before column resize so we can restore it\n const activeCellBeforeResizeRef = useRef<{ col: number; row: number } | null>(\n null,\n )\n\n // Handle column resize callback\n const handleColumnResize = useCallback(\n (columnName: string, newWidth: number) => {\n // Save the current active cell before updating widths (which will trigger remount)\n if (gridRef.current) {\n const activeCell = gridRef.current.activeCell\n if (activeCell) {\n activeCellBeforeResizeRef.current = {\n col: activeCell.col,\n row: activeCell.row,\n }\n } else {\n // Explicitly clear the ref if there's no active cell\n activeCellBeforeResizeRef.current = null\n }\n }\n\n setColumnWidths(prev => ({\n ...prev,\n [columnName]: newWidth,\n }))\n },\n [gridRef],\n )\n\n // Setup column resize handles\n useColumnResizeHandles({\n wrapperRef,\n colValues,\n onColumnResize: handleColumnResize,\n })\n\n return (\n <div ref={wrapperRef} style={{ position: 'relative', width: '100%' }}>\n <DynamicDataSheetGrid\n ref={gridRef}\n value={rowValues}\n columns={colValues}\n autoAddRow={!entityIsView}\n disableSmartDelete\n addRowsComponent={addRowsComponent}\n contextMenuComponent={contextMenuComponent}\n rowKey={GRID_ROW_REACT_KEY_PROPERTY}\n rowClassName={rowClassNameCallback}\n cellClassName={cellClassNameCallback}\n duplicateRow={duplicateRowCallback}\n onChange={handleChange}\n onActiveCellChange={handleActiveCellChange}\n onSelectionChange={handleSelectionChange}\n />\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataGrid.js","names":["modelColsToGrid","SchemaPropertiesMap","classNames","JSONSchema7","useEffect","useMemo","useState","useRef","useCallback","DynamicDataSheetGrid","DataSheetGridRef","SelectionWithId","renderAddRowsComponent","renderRecordSetContextMenu","renderViewContextMenu","DataGridRow","Operation","GRID_ROW_REACT_KEY_PROPERTY","getCellClassName","useColumnResizeHandles","calculateDefaultColumnWidth","HeaderOptions","RemoteSelection","DataGridProps","gridRef","React","RefObject","columnNames","columnOrder","schemaPropertiesInfo","rowValues","entityIsView","jsonSchema","lastSelection","handleChange","newValue","operations","handleSelectionChange","opts","selection","remoteSelections","DataGrid","props","$","_c","t0","Symbol","for","columnWidths","setColumnWidths","isPinned","setIsPinned","t1","t2","prev","modelColumnNames","map","idx","needsUpdate","some","name","newWidths","forEach","columnName","arrayIndex","propertyInfo","headerOptions","showPinIcon","hasDescription","description","t3","columnIndex","length","_temp","handleTogglePin","t4","Set","pinnedColumnsSet","t5","colValues","selectedRowIndex","setSelectedRowIndex","contextMenuComponent","addRowsComponent","t6","t7","rowData","rowIndex","__validationStatus","rowClassNameCallback","t8","rowData_0","rowIndex_0","columnId","cellClassNameCallback","duplicateRowCallback","_temp2","t9","cell","row","handleActiveCellChange","wrapperRef","activeCellBeforeResizeRef","columnName_0","newWidth","current","activeCell","col","prev_1","handleColumnResize","t10","onColumnResize","t11","position","width","t12","t13","rowData_1","prev_0"],"sources":["../../../src/components/DataGrid/DataGrid.tsx"],"sourcesContent":["import { modelColsToGrid } from '@/components/DataGrid/utils/modelColsToGrid'\nimport { SchemaPropertiesMap } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport classNames from 'classnames'\nimport { JSONSchema7 } from 'json-schema'\nimport { useEffect, useMemo, useState, useRef, useCallback } from 'react'\nimport {\n DynamicDataSheetGrid,\n DataSheetGridRef,\n} from '@sage-bionetworks/react-datasheet-grid'\nimport '@sage-bionetworks/react-datasheet-grid/dist/style.css'\nimport '../../style/components/_data-grid-extra.scss'\nimport { SelectionWithId } from '@sage-bionetworks/react-datasheet-grid'\nimport {\n renderAddRowsComponent,\n renderRecordSetContextMenu,\n renderViewContextMenu,\n} from './components/contextMenu'\nimport { DataGridRow, Operation } from './DataGridTypes'\nimport { GRID_ROW_REACT_KEY_PROPERTY } from './utils/DataGridUtils'\nimport { getCellClassName } from './utils/getCellClassName'\nimport { useColumnResizeHandles } from './hooks/useColumnResizeHandles'\nimport {\n calculateDefaultColumnWidth,\n HeaderOptions,\n} from './utils/calculateColumnWidth'\nimport type { RemoteSelection } from './hooks/useRemoteSelections'\n\ntype DataGridProps = {\n gridRef: React.RefObject<DataSheetGridRef | null>\n columnNames: string[]\n columnOrder: number[]\n schemaPropertiesInfo: SchemaPropertiesMap\n rowValues: DataGridRow[]\n entityIsView: boolean\n jsonSchema: JSONSchema7 | undefined\n lastSelection: SelectionWithId | null\n handleChange: (newValue: DataGridRow[], operations: Operation[]) => void\n handleSelectionChange: (opts: { selection: SelectionWithId | null }) => void\n remoteSelections?: readonly RemoteSelection[]\n}\n\n/**\n * Component that renders a data grid/spreadsheet using react-datasheet-grid.\n * @param props\n * @constructor\n */\nexport default function DataGrid(props: DataGridProps) {\n const {\n gridRef,\n rowValues,\n columnNames,\n columnOrder,\n schemaPropertiesInfo,\n entityIsView,\n jsonSchema,\n lastSelection,\n handleChange,\n handleSelectionChange,\n remoteSelections,\n } = props\n\n // Move columnWidths state into DataGrid\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({})\n\n // Pin state management for first column\n const [isPinned, setIsPinned] = useState(false)\n\n // Initialize column widths with defaults when columns first become available\n useEffect(() => {\n if (!columnNames || !columnOrder) {\n return\n }\n\n // Initialize widths for any columns that don't have them yet\n setColumnWidths(prev => {\n const modelColumnNames = columnOrder.map(idx => columnNames[idx])\n\n // Check if any columns need initialization\n const needsUpdate = modelColumnNames.some(name => !prev[name])\n\n if (!needsUpdate) {\n return prev // Return same reference to avoid triggering updates\n }\n\n const newWidths = { ...prev }\n modelColumnNames.forEach((columnName, arrayIndex) => {\n if (!newWidths[columnName]) {\n // Calculate default width using centralized function\n const propertyInfo = schemaPropertiesInfo[columnName]\n const headerOptions: HeaderOptions = {\n showPinIcon: arrayIndex === 0,\n hasDescription: !!propertyInfo?.description,\n }\n newWidths[columnName] = calculateDefaultColumnWidth(\n columnName,\n propertyInfo,\n headerOptions,\n )\n }\n })\n return newWidths\n })\n }, [columnNames, columnOrder, schemaPropertiesInfo])\n\n // Handler to toggle pin state for the first column only\n const handleTogglePin = useCallback(\n (columnIndex: number) => {\n // Validate columnIndex\n if (\n typeof columnIndex !== 'number' ||\n columnIndex < 0 ||\n !columnOrder ||\n columnIndex >= columnOrder.length\n ) {\n return\n }\n\n if (columnIndex !== 0) return // Only allow first column pinning\n\n setIsPinned(prev => !prev)\n },\n [columnOrder],\n )\n\n // Memoize the pinned columns set to prevent recalculation during scroll\n const pinnedColumnsSet = useMemo<Set<number>>(() => {\n return isPinned ? new Set([0]) : new Set()\n }, [isPinned])\n\n const colValues = useMemo(\n () =>\n modelColsToGrid(\n columnNames,\n columnOrder,\n schemaPropertiesInfo,\n columnWidths,\n pinnedColumnsSet,\n handleTogglePin,\n ),\n [\n columnNames,\n columnOrder,\n schemaPropertiesInfo,\n columnWidths,\n pinnedColumnsSet,\n handleTogglePin,\n ],\n )\n const [selectedRowIndex, setSelectedRowIndex] = useState<number | null>(null)\n\n // Memoize contextMenuComponent\n const contextMenuComponent = useMemo(\n () => (entityIsView ? renderViewContextMenu : renderRecordSetContextMenu),\n [entityIsView],\n )\n\n // Memoize addRowsComponent\n const addRowsComponent = useMemo(\n () => (entityIsView ? false : renderAddRowsComponent),\n [entityIsView],\n )\n\n // Wrap rowClassName in useCallback\n const rowClassNameCallback = useCallback(\n ({ rowData, rowIndex }: { rowData: DataGridRow; rowIndex: number }) =>\n classNames({\n 'row-valid': !!jsonSchema && rowData.__validationStatus === 'valid',\n 'row-invalid': !!jsonSchema && rowData.__validationStatus === 'invalid',\n 'row-unknown': !!jsonSchema && rowData.__validationStatus === 'pending',\n 'row-selected': selectedRowIndex === rowIndex,\n }),\n [jsonSchema, selectedRowIndex],\n )\n\n // Wrap cellClassName in useCallback\n const cellClassNameCallback = useCallback(\n ({\n rowData,\n rowIndex,\n columnId,\n }: {\n rowData: unknown\n rowIndex: number\n columnId?: string\n }) => {\n return getCellClassName({\n rowData: rowData as DataGridRow,\n rowIndex,\n columnId: columnId || '',\n selectedRowIndex,\n lastSelection,\n colValues,\n remoteSelections,\n })\n },\n [selectedRowIndex, lastSelection, colValues, remoteSelections],\n )\n\n // Wrap duplicateRow in useCallback\n const duplicateRowCallback = useCallback(\n ({ rowData }: { rowData: DataGridRow }) => ({\n ...rowData,\n }),\n [],\n )\n\n // Wrap onActiveCellChange in useCallback\n const handleActiveCellChange = useCallback(\n ({ cell }: { cell: { row: number; col: number } | null }) => {\n setSelectedRowIndex(cell ? cell.row : null)\n },\n [],\n )\n\n // Wrapper ref for the grid container\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n // Store the active cell before column resize so we can restore it\n const activeCellBeforeResizeRef = useRef<{ col: number; row: number } | null>(\n null,\n )\n\n // Handle column resize callback\n const handleColumnResize = useCallback(\n (columnName: string, newWidth: number) => {\n // Save the current active cell before updating widths (which will trigger remount)\n if (gridRef.current) {\n const activeCell = gridRef.current.activeCell\n if (activeCell) {\n activeCellBeforeResizeRef.current = {\n col: activeCell.col,\n row: activeCell.row,\n }\n } else {\n // Explicitly clear the ref if there's no active cell\n activeCellBeforeResizeRef.current = null\n }\n }\n\n setColumnWidths(prev => ({\n ...prev,\n [columnName]: newWidth,\n }))\n },\n [gridRef],\n )\n\n // Setup column resize handles\n useColumnResizeHandles({\n wrapperRef,\n colValues,\n onColumnResize: handleColumnResize,\n })\n\n return (\n <div ref={wrapperRef} style={{ position: 'relative', width: '100%' }}>\n <DynamicDataSheetGrid\n ref={gridRef}\n value={rowValues}\n columns={colValues}\n autoAddRow={!entityIsView}\n disableSmartDelete\n addRowsComponent={addRowsComponent}\n contextMenuComponent={contextMenuComponent}\n rowKey={GRID_ROW_REACT_KEY_PROPERTY}\n rowClassName={rowClassNameCallback}\n cellClassName={cellClassNameCallback}\n duplicateRow={duplicateRowCallback}\n onChange={handleChange}\n onActiveCellChange={handleActiveCellChange}\n onSelectionChange={handleSelectionChange}\n />\n </div>\n )\n}\n"],"mappings":"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"}
@@ -7,6 +7,8 @@ type DataGridWebSocketConstructorArgs = {
7
7
  onModelCreate?: (model: GridModel) => void;
8
8
  onReplicaConnected?: () => void;
9
9
  onReplicaDisconnected?: () => void;
10
+ onSyncStart?: () => void;
11
+ onSyncEnd?: () => void;
10
12
  maxPayloadSizeBytes?: number;
11
13
  socket?: WebSocket;
12
14
  model?: GridModel | null;
@@ -26,6 +28,8 @@ export declare class DataGridWebSocket {
26
28
  private onStatusChange;
27
29
  private onReplicaConnected;
28
30
  private onReplicaDisconnected;
31
+ private onSyncStart;
32
+ private onSyncEnd;
29
33
  constructor(args: DataGridWebSocketConstructorArgs);
30
34
  private attachSocketHandlers;
31
35
  disconnect(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"DataGridWebSocket.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/DataGridWebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAyC/D,KAAK,gCAAgC,GAAG;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACvE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IAC1C,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC/B,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAA;IAClC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAQD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,mBAAmB,CAAQ;IACnC,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,eAAe,CAAwB;IAE/C,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,cAAc,CAAqD;IAC3E,OAAO,CAAC,kBAAkB,CAAY;IACtC,OAAO,CAAC,qBAAqB,CAAY;gBAE7B,IAAI,EAAE,gCAAgC;IAyClD,OAAO,CAAC,oBAAoB;IAwBrB,UAAU;IAWjB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,kBAAkB;YAiBZ,qBAAqB;IAYnC,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,kBAAkB;IAuD1B,OAAO,CAAC,WAAW;IAWZ,SAAS;IAIhB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,eAAe;YAST,sBAAsB;CAYrC"}
1
+ {"version":3,"file":"DataGridWebSocket.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/DataGridWebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAyC/D,KAAK,gCAAgC,GAAG;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACvE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IAC1C,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC/B,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAA;IAClC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAQD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,mBAAmB,CAAQ;IACnC,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,eAAe,CAAwB;IAE/C,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,cAAc,CAAqD;IAC3E,OAAO,CAAC,kBAAkB,CAAY;IACtC,OAAO,CAAC,qBAAqB,CAAY;IACzC,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,SAAS,CAAY;gBAEjB,IAAI,EAAE,gCAAgC;IA6ClD,OAAO,CAAC,oBAAoB;IAwBrB,UAAU;IAWjB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,kBAAkB;YAiBZ,qBAAqB;IAYnC,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,kBAAkB;IAkD1B,OAAO,CAAC,WAAW;IAWZ,SAAS;IAIhB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,eAAe;YAUT,sBAAsB;CAYrC"}
@@ -30,9 +30,11 @@ var h = /* @__PURE__ */ function(e) {
30
30
  onStatusChange;
31
31
  onReplicaConnected;
32
32
  onReplicaDisconnected;
33
+ onSyncStart;
34
+ onSyncEnd;
33
35
  constructor(e) {
34
- let { replicaId: t, url: n, onGridReady: r, onStatusChange: i, onModelCreate: o, onReplicaConnected: s, onReplicaDisconnected: l, maxPayloadSizeBytes: u, socket: d, model: p, patchThrottleMs: m } = e;
35
- this.messageCounter = new a(), this.replicaId = t, this.maxPayloadSizeBytes = u ?? g, this.socket = d ?? new WebSocket(n), this.onModelCreate = o ?? c, this.onGridReady = r ?? c, this.onStatusChange = i ?? c, this.onReplicaConnected = s ?? c, this.onReplicaDisconnected = l ?? c, p && (this.model = p), this.attachSocketHandlers(), this.throttledSendPatch = f(() => this.sendPatchImmediate(), m ?? _, {
36
+ let { replicaId: t, url: n, onGridReady: r, onStatusChange: i, onModelCreate: o, onReplicaConnected: s, onReplicaDisconnected: l, onSyncStart: u, onSyncEnd: d, maxPayloadSizeBytes: p, socket: m, model: h, patchThrottleMs: v } = e;
37
+ this.messageCounter = new a(), this.replicaId = t, this.maxPayloadSizeBytes = p ?? g, this.socket = m ?? new WebSocket(n), this.onModelCreate = o ?? c, this.onGridReady = r ?? c, this.onStatusChange = i ?? c, this.onReplicaConnected = s ?? c, this.onReplicaDisconnected = l ?? c, this.onSyncStart = u ?? c, this.onSyncEnd = d ?? c, h && (this.model = h), this.attachSocketHandlers(), this.throttledSendPatch = f(() => this.sendPatchImmediate(), v ?? _, {
36
38
  leading: !1,
37
39
  trailing: !0
38
40
  });
@@ -93,13 +95,14 @@ var h = /* @__PURE__ */ function(e) {
93
95
  async handleSnapshotPayload(e) {
94
96
  console.debug("Received snapshot URL from server:", e);
95
97
  try {
96
- this.model = (await this.fetchAndDecodeSnapshot(e)).fork(this.replicaId), this.onModelCreate(this.model), this.sendClockSync();
98
+ let t = await this.fetchAndDecodeSnapshot(e);
99
+ this.model = t.fork(this.replicaId), this.onModelCreate(this.model), this.sendClockSync();
97
100
  } catch (e) {
98
101
  console.error("Failed to fetch or decode snapshot", e);
99
102
  }
100
103
  }
101
104
  handleResponseComplete() {
102
- this.onGridReady(), console.debug("Clocks synchronized with server. Incrementing sequence number.");
105
+ this.onGridReady(), this.onSyncEnd(), console.debug("Clocks synchronized with server. Incrementing sequence number.");
103
106
  }
104
107
  handleNotification(e) {
105
108
  let t = e.getMethodName();
@@ -120,9 +123,7 @@ var h = /* @__PURE__ */ function(e) {
120
123
  }
121
124
  {
122
125
  let e = this.verboseEncoder.encode(this.model);
123
- console.debug("New patch received, syncing data:", e.time);
124
- let t = new r(this.messageCounter.getNext(), "synchronize-clock", e.time);
125
- this.sendMessage(t);
126
+ console.debug("New patch received, syncing data:", e.time), this.sendSyncMessage(e.time);
126
127
  }
127
128
  break;
128
129
  case "replica-connected":
@@ -153,7 +154,7 @@ var h = /* @__PURE__ */ function(e) {
153
154
  }
154
155
  sendSyncMessage(e) {
155
156
  let t = new r(this.messageCounter.getNext(), "synchronize-clock", e ?? []);
156
- this.sendMessage(t);
157
+ this.onSyncStart(), this.sendMessage(t);
157
158
  }
158
159
  async fetchAndDecodeSnapshot(e) {
159
160
  let t = await (await (await s(e)).blob()).arrayBuffer(), n = m(new Uint8Array(t));
@@ -1 +1 @@
1
- {"version":3,"file":"DataGridWebSocket.js","names":["GridModel","JsonRx","JsonRxMessage","JsonRxNotification","JsonRxRequestComplete","JsonRxResponse","JsonRxResponseComplete","MessageCounter","splitPatch","Model","CompactCodecPatch","decode","Encoder","VerboseEncoder","JsonCrdtVerboseLogicalTimestamp","noop","throttle","DebouncedFunc","Decoder","SnapshotDecoder","decodeCbor","IndexedFields","fetchWithExponentialTimeout","SynapseGridWebSocketMessagePayloadType","PATCH","SNAPSHOT","PATCHES","SynapseGridWebSocketMessagePayload","type","body","DataGridWebSocketConstructorArgs","replicaId","url","onGridReady","onStatusChange","isOpen","instance","DataGridWebSocket","onModelCreate","model","onReplicaConnected","onReplicaDisconnected","maxPayloadSizeBytes","socket","WebSocket","patchThrottleMs","DEFAULT_MAX_PAYLOAD_SIZE_BYTES","DEFAULT_PATCH_THROTTLE_MS","messageCounter","verboseEncoder","throttledSendPatch","snapshotDecoder","_this","constructor","args","attachSocketHandlers","sendPatchImmediate","leading","trailing","onopen","console","debug","onmessage","event","MessageEvent","data","handleMessage","error","onclose","onerror","Event","disconnect","flush","cancel","readyState","OPEN","close","warn","sendClockSync","patchesWereSent","verbModel","encode","sendSyncMessage","time","rawMessage","message","fromJson","JSON","parse","handleResponse","handleResponseComplete","handleNotification","payload","getPayload","handlePatchPayload","handleSnapshotPayload","encodedPatch","patches","map","fromPatches","fork","applyBatch","err","snapshotUrl","decodedModel","fetchAndDecodeSnapshot","methodName","getMethodName","undefined","msg","getNext","sendMessage","send","stringify","getJson","sendPatch","patch","api","hasOperationsToDispatch","ops","length","forEach","compactEncodedPatch","clock","Promise","response","blob","buffer","arrayBuffer","decodedFromCbor","Uint8Array"],"sources":["../../../src/components/DataGrid/DataGridWebSocket.ts"],"sourcesContent":["import { GridModel } from '@/components/DataGrid/DataGridTypes'\nimport JsonRx from '@/components/DataGrid/utils/json-rx/JsonRx'\nimport JsonRxMessage from '@/components/DataGrid/utils/json-rx/JsonRxMessage'\nimport JsonRxNotification from '@/components/DataGrid/utils/json-rx/JsonRxNotification'\nimport JsonRxRequestComplete from '@/components/DataGrid/utils/json-rx/JsonRxRequestComplete'\nimport JsonRxResponse from '@/components/DataGrid/utils/json-rx/JsonRxResponse'\nimport JsonRxResponseComplete from '@/components/DataGrid/utils/json-rx/JsonRxResponseComplete'\nimport MessageCounter from '@/components/DataGrid/utils/MessageCounter'\nimport { splitPatch } from '@/components/DataGrid/utils/splitPatch'\nimport { Model } from 'json-joy/lib/json-crdt'\nimport {\n CompactCodecPatch,\n decode,\n} from 'json-joy/lib/json-crdt-patch/codec/compact'\nimport { Encoder as VerboseEncoder } from 'json-joy/lib/json-crdt/codec/structural/verbose/Encoder'\nimport { JsonCrdtVerboseLogicalTimestamp } from 'json-joy/lib/json-crdt/codec/structural/verbose/types'\nimport noop from 'lodash-es/noop'\nimport throttle from 'lodash-es/throttle'\nimport { type DebouncedFunc } from 'lodash-es'\nimport { Decoder as SnapshotDecoder } from 'json-joy/lib/json-crdt/codec/indexed/binary/Decoder'\nimport { decode as decodeCbor } from 'cbor2'\nimport type { IndexedFields } from 'json-joy/lib/json-crdt/codec/indexed/binary'\nimport { fetchWithExponentialTimeout } from '@sage-bionetworks/synapse-client'\n\nenum SynapseGridWebSocketMessagePayloadType {\n PATCH = 'patch',\n SNAPSHOT = 'snapshot',\n PATCHES = 'patches',\n}\n\ntype SynapseGridWebSocketMessagePayload =\n | {\n type: SynapseGridWebSocketMessagePayloadType.PATCH\n body: CompactCodecPatch\n }\n | {\n type: SynapseGridWebSocketMessagePayloadType.PATCHES\n body: CompactCodecPatch[]\n }\n | { type: SynapseGridWebSocketMessagePayloadType.SNAPSHOT; body: string }\n\ntype DataGridWebSocketConstructorArgs = {\n replicaId: number\n url: string\n onGridReady?: () => void\n onStatusChange?: (isOpen: boolean, instance: DataGridWebSocket) => void\n onModelCreate?: (model: GridModel) => void\n onReplicaConnected?: () => void\n onReplicaDisconnected?: () => void\n maxPayloadSizeBytes?: number\n socket?: WebSocket\n model?: GridModel | null\n patchThrottleMs?: number\n}\n\n// API Gateway WebSocket payload size limit is 32 KB per message\n// There is some overhead we aren't computing in our utility, namely the size of the patch header and the communication protocol itself\n// So add some buffer\nconst DEFAULT_MAX_PAYLOAD_SIZE_BYTES = 30 * 1024 // 30 KB\nconst DEFAULT_PATCH_THROTTLE_MS = 250\n\nexport class DataGridWebSocket {\n private socket: WebSocket\n private model: GridModel | null = null\n private messageCounter: MessageCounter\n private replicaId: number\n private verboseEncoder = new VerboseEncoder()\n private maxPayloadSizeBytes: number\n private throttledSendPatch: DebouncedFunc<() => void>\n private snapshotDecoder = new SnapshotDecoder()\n\n private onModelCreate: (model: GridModel) => void\n private onGridReady: () => void\n private onStatusChange: (isOpen: boolean, _this: DataGridWebSocket) => void\n private onReplicaConnected: () => void\n private onReplicaDisconnected: () => void\n\n constructor(args: DataGridWebSocketConstructorArgs) {\n const {\n replicaId,\n url,\n onGridReady,\n onStatusChange,\n onModelCreate,\n onReplicaConnected,\n onReplicaDisconnected,\n maxPayloadSizeBytes,\n socket,\n model,\n patchThrottleMs,\n } = args\n this.messageCounter = new MessageCounter()\n this.replicaId = replicaId\n this.maxPayloadSizeBytes =\n maxPayloadSizeBytes ?? DEFAULT_MAX_PAYLOAD_SIZE_BYTES\n this.socket = socket ?? new WebSocket(url)\n\n // Assign callbacks, falling back to no-ops\n this.onModelCreate = onModelCreate ?? noop\n this.onGridReady = onGridReady ?? noop\n this.onStatusChange = onStatusChange ?? noop\n this.onReplicaConnected = onReplicaConnected ?? noop\n this.onReplicaDisconnected = onReplicaDisconnected ?? noop\n\n // Restore existing model if provided\n if (model) {\n this.model = model\n }\n\n this.attachSocketHandlers()\n\n this.throttledSendPatch = throttle(\n () => this.sendPatchImmediate(),\n patchThrottleMs ?? DEFAULT_PATCH_THROTTLE_MS,\n { leading: false, trailing: true },\n )\n }\n\n private attachSocketHandlers() {\n this.socket.onopen = () => {\n console.debug('Connected to the WebSocket server')\n this.onStatusChange(true, this)\n }\n\n this.socket.onmessage = (event: MessageEvent) => {\n if (typeof event.data === 'string') {\n this.handleMessage(event.data)\n } else {\n console.error('Received non-string message data:', event.data)\n }\n }\n\n this.socket.onclose = () => {\n console.debug('Disconnected from the WebSocket server')\n this.onStatusChange(false, this)\n }\n\n this.socket.onerror = (error: Event) => {\n console.error('WebSocket error:', error)\n }\n }\n\n public disconnect() {\n this.throttledSendPatch.flush()\n this.throttledSendPatch.cancel()\n if (this.socket.readyState === WebSocket.OPEN) {\n this.socket.close()\n console.debug('WebSocket connection closed')\n } else {\n console.warn('WebSocket is not open. No action taken.')\n }\n }\n\n /**\n * Flushes the local model clock and sends the resulting patch (or a clock-sync\n * message) to the server so that both sides converge.\n */\n private sendClockSync() {\n if (!this.model) {\n console.error('Model is not initialized. Cannot sync model.')\n return\n }\n\n const patchesWereSent = this.sendPatchImmediate()\n if (!patchesWereSent) {\n // We've flushed all of our changes, so now we can receive changes from the server\n const verbModel = this.verboseEncoder.encode(this.model)\n this.sendSyncMessage(verbModel.time)\n }\n }\n\n private handleMessage(rawMessage: string) {\n const message = JsonRx.fromJson(JSON.parse(rawMessage))\n if (message instanceof JsonRxResponse) {\n this.handleResponse(\n message as JsonRxResponse<SynapseGridWebSocketMessagePayload>,\n )\n } else if (message instanceof JsonRxResponseComplete) {\n this.handleResponseComplete()\n } else if (message instanceof JsonRxNotification) {\n this.handleNotification(message)\n } else {\n console.warn('Unexpected WebSocket message format:', message)\n }\n }\n\n private handleResponse(\n message: JsonRxResponse<SynapseGridWebSocketMessagePayload>,\n ) {\n const payload = message.getPayload()\n\n switch (payload.type) {\n case SynapseGridWebSocketMessagePayloadType.PATCH:\n this.handlePatchPayload([payload.body])\n break\n\n case SynapseGridWebSocketMessagePayloadType.PATCHES:\n void this.handlePatchPayload(payload.body)\n break\n\n case SynapseGridWebSocketMessagePayloadType.SNAPSHOT:\n void this.handleSnapshotPayload(payload.body)\n break\n\n default:\n console.warn('Unknown payload type:', payload)\n break\n }\n }\n\n private handlePatchPayload(encodedPatch: CompactCodecPatch[]) {\n try {\n const patches = encodedPatch.map(decode)\n if (!this.model) {\n this.model = Model.fromPatches(patches).fork(\n this.replicaId,\n ) as unknown as GridModel\n this.onModelCreate(this.model)\n } else {\n this.model.applyBatch(patches)\n }\n this.sendClockSync()\n } catch (err) {\n console.error('Failed to apply patches or send clock:', err)\n }\n }\n\n private async handleSnapshotPayload(snapshotUrl: string) {\n console.debug('Received snapshot URL from server:', snapshotUrl)\n try {\n const decodedModel = await this.fetchAndDecodeSnapshot(snapshotUrl)\n this.model = decodedModel.fork(this.replicaId) as unknown as GridModel\n this.onModelCreate(this.model)\n this.sendClockSync()\n } catch (err) {\n console.error('Failed to fetch or decode snapshot', err)\n }\n }\n\n private handleResponseComplete() {\n // Clocks are in sync, no further action needed\n this.onGridReady()\n console.debug(\n 'Clocks synchronized with server. Incrementing sequence number.',\n )\n }\n\n private handleNotification(message: JsonRxNotification) {\n const methodName = message.getMethodName()\n console.debug('Notification received from server:', methodName)\n\n switch (methodName) {\n case 'ping':\n console.debug('Received ping from server')\n break\n\n case 'connected':\n console.debug('Server ready to receive patches')\n this.sendSyncMessage(\n this.model ? this.verboseEncoder.encode(this.model).time : undefined,\n )\n break\n\n case 'error':\n console.warn('Error from server:', message.getPayload())\n break\n\n case 'new-patch':\n if (!this.model) {\n console.warn(\n \"Model is not initialized. Cannot handle 'new-patch' message.\",\n )\n break\n }\n {\n const verbModel = this.verboseEncoder.encode(this.model)\n console.debug('New patch received, syncing data:', verbModel.time)\n const msg = new JsonRxRequestComplete(\n this.messageCounter.getNext(),\n 'synchronize-clock',\n verbModel.time,\n )\n this.sendMessage(msg)\n }\n break\n\n case 'replica-connected':\n console.debug('A replica connected to the grid session')\n this.onReplicaConnected()\n break\n\n case 'replica-disconnected':\n console.debug('A replica disconnected from the grid session')\n this.onReplicaDisconnected()\n break\n\n default:\n console.warn('Unknown notification method:', methodName)\n break\n }\n }\n\n private sendMessage(message: JsonRxMessage) {\n if (this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify(message.getJson()))\n } else {\n console.error(\n 'WebSocket is not open. Unable to send message. Current state:',\n this.socket.readyState,\n )\n }\n }\n\n public sendPatch() {\n this.throttledSendPatch()\n }\n\n /**\n * @returns true if one or more patches were sent\n */\n private sendPatchImmediate(): boolean {\n if (!this.model) {\n console.warn('Model is not initialized. Cannot send patch.')\n return false\n }\n\n const patch = this.model.api.flush()\n const hasOperationsToDispatch = patch.ops.length > 0\n\n if (hasOperationsToDispatch) {\n // Split the patch if it exceeds the maximum size we can send in a single frame\n const patches = splitPatch(patch, this.maxPayloadSizeBytes)\n patches.forEach(compactEncodedPatch => {\n console.debug('Sending patch to server:', compactEncodedPatch)\n const msg = new JsonRxRequestComplete(\n this.messageCounter.getNext(),\n 'patch',\n compactEncodedPatch,\n )\n this.sendMessage(msg)\n })\n }\n\n return hasOperationsToDispatch\n }\n\n private sendSyncMessage(clock?: number | JsonCrdtVerboseLogicalTimestamp[]) {\n const message = new JsonRxRequestComplete(\n this.messageCounter.getNext(),\n 'synchronize-clock',\n clock ?? [],\n )\n this.sendMessage(message)\n }\n\n private async fetchAndDecodeSnapshot(\n snapshotUrl: string,\n ): Promise<GridModel> {\n const response = await fetchWithExponentialTimeout(snapshotUrl)\n const blob = await response.blob()\n const buffer = await blob.arrayBuffer()\n const decodedFromCbor = decodeCbor(new Uint8Array(buffer))\n const decodedModel = this.snapshotDecoder.decode(\n decodedFromCbor as IndexedFields,\n ) as unknown as GridModel\n return decodedModel\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataGridWebSocket.js","names":["GridModel","JsonRx","JsonRxMessage","JsonRxNotification","JsonRxRequestComplete","JsonRxResponse","JsonRxResponseComplete","MessageCounter","splitPatch","Model","CompactCodecPatch","decode","Encoder","VerboseEncoder","JsonCrdtVerboseLogicalTimestamp","noop","throttle","DebouncedFunc","Decoder","SnapshotDecoder","decodeCbor","IndexedFields","fetchWithExponentialTimeout","SynapseGridWebSocketMessagePayloadType","PATCH","SNAPSHOT","PATCHES","SynapseGridWebSocketMessagePayload","type","body","DataGridWebSocketConstructorArgs","replicaId","url","onGridReady","onStatusChange","isOpen","instance","DataGridWebSocket","onModelCreate","model","onReplicaConnected","onReplicaDisconnected","onSyncStart","onSyncEnd","maxPayloadSizeBytes","socket","WebSocket","patchThrottleMs","DEFAULT_MAX_PAYLOAD_SIZE_BYTES","DEFAULT_PATCH_THROTTLE_MS","messageCounter","verboseEncoder","throttledSendPatch","snapshotDecoder","_this","constructor","args","attachSocketHandlers","sendPatchImmediate","leading","trailing","onopen","console","debug","onmessage","event","MessageEvent","data","handleMessage","error","onclose","onerror","Event","disconnect","flush","cancel","readyState","OPEN","close","warn","sendClockSync","patchesWereSent","verbModel","encode","sendSyncMessage","time","rawMessage","message","fromJson","JSON","parse","handleResponse","handleResponseComplete","handleNotification","payload","getPayload","handlePatchPayload","handleSnapshotPayload","encodedPatch","patches","map","fromPatches","fork","applyBatch","err","snapshotUrl","decodedModel","fetchAndDecodeSnapshot","methodName","getMethodName","undefined","sendMessage","send","stringify","getJson","sendPatch","patch","api","hasOperationsToDispatch","ops","length","forEach","compactEncodedPatch","msg","getNext","clock","Promise","response","blob","buffer","arrayBuffer","decodedFromCbor","Uint8Array"],"sources":["../../../src/components/DataGrid/DataGridWebSocket.ts"],"sourcesContent":["import { GridModel } from '@/components/DataGrid/DataGridTypes'\nimport JsonRx from '@/components/DataGrid/utils/json-rx/JsonRx'\nimport JsonRxMessage from '@/components/DataGrid/utils/json-rx/JsonRxMessage'\nimport JsonRxNotification from '@/components/DataGrid/utils/json-rx/JsonRxNotification'\nimport JsonRxRequestComplete from '@/components/DataGrid/utils/json-rx/JsonRxRequestComplete'\nimport JsonRxResponse from '@/components/DataGrid/utils/json-rx/JsonRxResponse'\nimport JsonRxResponseComplete from '@/components/DataGrid/utils/json-rx/JsonRxResponseComplete'\nimport MessageCounter from '@/components/DataGrid/utils/MessageCounter'\nimport { splitPatch } from '@/components/DataGrid/utils/splitPatch'\nimport { Model } from 'json-joy/lib/json-crdt'\nimport {\n CompactCodecPatch,\n decode,\n} from 'json-joy/lib/json-crdt-patch/codec/compact'\nimport { Encoder as VerboseEncoder } from 'json-joy/lib/json-crdt/codec/structural/verbose/Encoder'\nimport { JsonCrdtVerboseLogicalTimestamp } from 'json-joy/lib/json-crdt/codec/structural/verbose/types'\nimport noop from 'lodash-es/noop'\nimport throttle from 'lodash-es/throttle'\nimport { type DebouncedFunc } from 'lodash-es'\nimport { Decoder as SnapshotDecoder } from 'json-joy/lib/json-crdt/codec/indexed/binary/Decoder'\nimport { decode as decodeCbor } from 'cbor2'\nimport type { IndexedFields } from 'json-joy/lib/json-crdt/codec/indexed/binary'\nimport { fetchWithExponentialTimeout } from '@sage-bionetworks/synapse-client'\n\nenum SynapseGridWebSocketMessagePayloadType {\n PATCH = 'patch',\n SNAPSHOT = 'snapshot',\n PATCHES = 'patches',\n}\n\ntype SynapseGridWebSocketMessagePayload =\n | {\n type: SynapseGridWebSocketMessagePayloadType.PATCH\n body: CompactCodecPatch\n }\n | {\n type: SynapseGridWebSocketMessagePayloadType.PATCHES\n body: CompactCodecPatch[]\n }\n | { type: SynapseGridWebSocketMessagePayloadType.SNAPSHOT; body: string }\n\ntype DataGridWebSocketConstructorArgs = {\n replicaId: number\n url: string\n onGridReady?: () => void\n onStatusChange?: (isOpen: boolean, instance: DataGridWebSocket) => void\n onModelCreate?: (model: GridModel) => void\n onReplicaConnected?: () => void\n onReplicaDisconnected?: () => void\n onSyncStart?: () => void\n onSyncEnd?: () => void\n maxPayloadSizeBytes?: number\n socket?: WebSocket\n model?: GridModel | null\n patchThrottleMs?: number\n}\n\n// API Gateway WebSocket payload size limit is 32 KB per message\n// There is some overhead we aren't computing in our utility, namely the size of the patch header and the communication protocol itself\n// So add some buffer\nconst DEFAULT_MAX_PAYLOAD_SIZE_BYTES = 30 * 1024 // 30 KB\nconst DEFAULT_PATCH_THROTTLE_MS = 250\n\nexport class DataGridWebSocket {\n private socket: WebSocket\n private model: GridModel | null = null\n private messageCounter: MessageCounter\n private replicaId: number\n private verboseEncoder = new VerboseEncoder()\n private maxPayloadSizeBytes: number\n private throttledSendPatch: DebouncedFunc<() => void>\n private snapshotDecoder = new SnapshotDecoder()\n\n private onModelCreate: (model: GridModel) => void\n private onGridReady: () => void\n private onStatusChange: (isOpen: boolean, _this: DataGridWebSocket) => void\n private onReplicaConnected: () => void\n private onReplicaDisconnected: () => void\n private onSyncStart: () => void\n private onSyncEnd: () => void\n\n constructor(args: DataGridWebSocketConstructorArgs) {\n const {\n replicaId,\n url,\n onGridReady,\n onStatusChange,\n onModelCreate,\n onReplicaConnected,\n onReplicaDisconnected,\n onSyncStart,\n onSyncEnd,\n maxPayloadSizeBytes,\n socket,\n model,\n patchThrottleMs,\n } = args\n this.messageCounter = new MessageCounter()\n this.replicaId = replicaId\n this.maxPayloadSizeBytes =\n maxPayloadSizeBytes ?? DEFAULT_MAX_PAYLOAD_SIZE_BYTES\n this.socket = socket ?? new WebSocket(url)\n\n // Assign callbacks, falling back to no-ops\n this.onModelCreate = onModelCreate ?? noop\n this.onGridReady = onGridReady ?? noop\n this.onStatusChange = onStatusChange ?? noop\n this.onReplicaConnected = onReplicaConnected ?? noop\n this.onReplicaDisconnected = onReplicaDisconnected ?? noop\n this.onSyncStart = onSyncStart ?? noop\n this.onSyncEnd = onSyncEnd ?? noop\n\n // Restore existing model if provided\n if (model) {\n this.model = model\n }\n\n this.attachSocketHandlers()\n\n this.throttledSendPatch = throttle(\n () => this.sendPatchImmediate(),\n patchThrottleMs ?? DEFAULT_PATCH_THROTTLE_MS,\n { leading: false, trailing: true },\n )\n }\n\n private attachSocketHandlers() {\n this.socket.onopen = () => {\n console.debug('Connected to the WebSocket server')\n this.onStatusChange(true, this)\n }\n\n this.socket.onmessage = (event: MessageEvent) => {\n if (typeof event.data === 'string') {\n this.handleMessage(event.data)\n } else {\n console.error('Received non-string message data:', event.data)\n }\n }\n\n this.socket.onclose = () => {\n console.debug('Disconnected from the WebSocket server')\n this.onStatusChange(false, this)\n }\n\n this.socket.onerror = (error: Event) => {\n console.error('WebSocket error:', error)\n }\n }\n\n public disconnect() {\n this.throttledSendPatch.flush()\n this.throttledSendPatch.cancel()\n if (this.socket.readyState === WebSocket.OPEN) {\n this.socket.close()\n console.debug('WebSocket connection closed')\n } else {\n console.warn('WebSocket is not open. No action taken.')\n }\n }\n\n /**\n * Flushes the local model clock and sends the resulting patch (or a clock-sync\n * message) to the server so that both sides converge.\n */\n private sendClockSync() {\n if (!this.model) {\n console.error('Model is not initialized. Cannot sync model.')\n return\n }\n\n const patchesWereSent = this.sendPatchImmediate()\n if (!patchesWereSent) {\n // We've flushed all of our changes, so now we can receive changes from the server\n const verbModel = this.verboseEncoder.encode(this.model)\n this.sendSyncMessage(verbModel.time)\n }\n }\n\n private handleMessage(rawMessage: string) {\n const message = JsonRx.fromJson(JSON.parse(rawMessage))\n if (message instanceof JsonRxResponse) {\n this.handleResponse(\n message as JsonRxResponse<SynapseGridWebSocketMessagePayload>,\n )\n } else if (message instanceof JsonRxResponseComplete) {\n this.handleResponseComplete()\n } else if (message instanceof JsonRxNotification) {\n this.handleNotification(message)\n } else {\n console.warn('Unexpected WebSocket message format:', message)\n }\n }\n\n private handleResponse(\n message: JsonRxResponse<SynapseGridWebSocketMessagePayload>,\n ) {\n const payload = message.getPayload()\n\n switch (payload.type) {\n case SynapseGridWebSocketMessagePayloadType.PATCH:\n this.handlePatchPayload([payload.body])\n break\n\n case SynapseGridWebSocketMessagePayloadType.PATCHES:\n void this.handlePatchPayload(payload.body)\n break\n\n case SynapseGridWebSocketMessagePayloadType.SNAPSHOT:\n void this.handleSnapshotPayload(payload.body)\n break\n\n default:\n console.warn('Unknown payload type:', payload)\n break\n }\n }\n\n private handlePatchPayload(encodedPatch: CompactCodecPatch[]) {\n try {\n const patches = encodedPatch.map(decode)\n if (!this.model) {\n this.model = Model.fromPatches(patches).fork(\n this.replicaId,\n ) as unknown as GridModel\n this.onModelCreate(this.model)\n } else {\n this.model.applyBatch(patches)\n }\n this.sendClockSync()\n } catch (err) {\n console.error('Failed to apply patches or send clock:', err)\n }\n }\n\n private async handleSnapshotPayload(snapshotUrl: string) {\n console.debug('Received snapshot URL from server:', snapshotUrl)\n try {\n const decodedModel = await this.fetchAndDecodeSnapshot(snapshotUrl)\n this.model = decodedModel.fork(this.replicaId) as unknown as GridModel\n this.onModelCreate(this.model)\n this.sendClockSync()\n } catch (err) {\n console.error('Failed to fetch or decode snapshot', err)\n }\n }\n\n private handleResponseComplete() {\n // Clocks are in sync, no further action needed\n this.onGridReady()\n this.onSyncEnd()\n console.debug(\n 'Clocks synchronized with server. Incrementing sequence number.',\n )\n }\n\n private handleNotification(message: JsonRxNotification) {\n const methodName = message.getMethodName()\n console.debug('Notification received from server:', methodName)\n\n switch (methodName) {\n case 'ping':\n console.debug('Received ping from server')\n break\n\n case 'connected':\n console.debug('Server ready to receive patches')\n this.sendSyncMessage(\n this.model ? this.verboseEncoder.encode(this.model).time : undefined,\n )\n break\n\n case 'error':\n console.warn('Error from server:', message.getPayload())\n break\n\n case 'new-patch':\n if (!this.model) {\n console.warn(\n \"Model is not initialized. Cannot handle 'new-patch' message.\",\n )\n break\n }\n {\n const verbModel = this.verboseEncoder.encode(this.model)\n console.debug('New patch received, syncing data:', verbModel.time)\n this.sendSyncMessage(verbModel.time)\n }\n break\n\n case 'replica-connected':\n console.debug('A replica connected to the grid session')\n this.onReplicaConnected()\n break\n\n case 'replica-disconnected':\n console.debug('A replica disconnected from the grid session')\n this.onReplicaDisconnected()\n break\n\n default:\n console.warn('Unknown notification method:', methodName)\n break\n }\n }\n\n private sendMessage(message: JsonRxMessage) {\n if (this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify(message.getJson()))\n } else {\n console.error(\n 'WebSocket is not open. Unable to send message. Current state:',\n this.socket.readyState,\n )\n }\n }\n\n public sendPatch() {\n this.throttledSendPatch()\n }\n\n /**\n * @returns true if one or more patches were sent\n */\n private sendPatchImmediate(): boolean {\n if (!this.model) {\n console.warn('Model is not initialized. Cannot send patch.')\n return false\n }\n\n const patch = this.model.api.flush()\n const hasOperationsToDispatch = patch.ops.length > 0\n\n if (hasOperationsToDispatch) {\n // Split the patch if it exceeds the maximum size we can send in a single frame\n const patches = splitPatch(patch, this.maxPayloadSizeBytes)\n patches.forEach(compactEncodedPatch => {\n console.debug('Sending patch to server:', compactEncodedPatch)\n const msg = new JsonRxRequestComplete(\n this.messageCounter.getNext(),\n 'patch',\n compactEncodedPatch,\n )\n this.sendMessage(msg)\n })\n }\n\n return hasOperationsToDispatch\n }\n\n private sendSyncMessage(clock?: number | JsonCrdtVerboseLogicalTimestamp[]) {\n const message = new JsonRxRequestComplete(\n this.messageCounter.getNext(),\n 'synchronize-clock',\n clock ?? [],\n )\n this.onSyncStart()\n this.sendMessage(message)\n }\n\n private async fetchAndDecodeSnapshot(\n snapshotUrl: string,\n ): Promise<GridModel> {\n const response = await fetchWithExponentialTimeout(snapshotUrl)\n const blob = await response.blob()\n const buffer = await blob.arrayBuffer()\n const decodedFromCbor = decodeCbor(new Uint8Array(buffer))\n const decodedModel = this.snapshotDecoder.decode(\n decodedFromCbor as IndexedFields,\n ) as unknown as GridModel\n return decodedModel\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseGrid.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/SynapseGrid.tsx"],"names":[],"mappings":"AAaA,OAAO,EACL,iBAAiB,EAElB,MAAM,kCAAkC,CAAA;AA8BzC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACpD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CACjD,CAAA;AAED,QAAA,MAAM,WAAW,gHA6ehB,CAAA;AAED,eAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"SynapseGrid.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/SynapseGrid.tsx"],"names":[],"mappings":"AAcA,OAAO,EACL,iBAAiB,EAElB,MAAM,kCAAkC,CAAA;AA8BzC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACpD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CACjD,CAAA;AAED,QAAA,MAAM,WAAW,gHAsfhB,CAAA;AAED,eAAe,WAAW,CAAA"}