synapse-react-client 4.0.32 → 4.0.34

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 (331) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/components/AccessRequirementList/AccessRequirementList.d.ts +5 -1
  3. package/dist/components/AccessRequirementList/AccessRequirementList.d.ts.map +1 -1
  4. package/dist/components/AccessRequirementList/AccessRequirementList.js +152 -85
  5. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  6. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.js +1 -0
  7. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.js.map +1 -1
  8. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.d.ts +1 -0
  9. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.d.ts.map +1 -1
  10. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js +62 -43
  11. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
  12. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.d.ts +6 -0
  13. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.d.ts.map +1 -1
  14. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js +227 -147
  15. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js.map +1 -1
  16. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DocumentTemplate.d.ts.map +1 -1
  17. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DocumentTemplate.js +28 -24
  18. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DocumentTemplate.js.map +1 -1
  19. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts +21 -0
  20. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts.map +1 -0
  21. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js +163 -0
  22. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js.map +1 -0
  23. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts +22 -0
  24. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts.map +1 -0
  25. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js +264 -0
  26. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js.map +1 -0
  27. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.js +1 -0
  28. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.js.map +1 -1
  29. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.d.ts.map +1 -1
  30. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js +166 -71
  31. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js.map +1 -1
  32. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.d.ts +13 -0
  33. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.d.ts.map +1 -0
  34. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.js +122 -0
  35. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.js.map +1 -0
  36. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts +17 -0
  37. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts.map +1 -0
  38. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js +112 -0
  39. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js.map +1 -0
  40. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts +22 -0
  41. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts.map +1 -0
  42. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js +193 -0
  43. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js.map +1 -0
  44. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/UploadDocumentField.d.ts +1 -0
  45. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/UploadDocumentField.d.ts.map +1 -1
  46. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/UploadDocumentField.js +7 -7
  47. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/UploadDocumentField.js.map +1 -1
  48. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/styles.d.ts +3 -0
  49. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/styles.d.ts.map +1 -0
  50. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/styles.js +9 -0
  51. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/styles.js.map +1 -0
  52. package/dist/components/CopyToClipboardIcon.d.ts +2 -1
  53. package/dist/components/CopyToClipboardIcon.d.ts.map +1 -1
  54. package/dist/components/CopyToClipboardIcon.js +6 -6
  55. package/dist/components/CopyToClipboardIcon.js.map +1 -1
  56. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  57. package/dist/components/DataGrid/SynapseGrid.js +230 -215
  58. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  59. package/dist/components/DataGrid/SyncGridWithSourceButton.js +3 -3
  60. package/dist/components/DataGrid/SyncGridWithSourceButton.js.map +1 -1
  61. package/dist/components/DataGrid/columns/DateTimeColumn.js +1 -1
  62. package/dist/components/DataGrid/columns/DateTimeColumn.js.map +1 -1
  63. package/dist/components/DataGrid/components/ReorderColumnsButton.d.ts +10 -0
  64. package/dist/components/DataGrid/components/ReorderColumnsButton.d.ts.map +1 -0
  65. package/dist/components/DataGrid/components/ReorderColumnsButton.js +37 -0
  66. package/dist/components/DataGrid/components/ReorderColumnsButton.js.map +1 -0
  67. package/dist/components/DataGrid/components/ReorderColumnsDialog.d.ts +12 -0
  68. package/dist/components/DataGrid/components/ReorderColumnsDialog.d.ts.map +1 -0
  69. package/dist/components/DataGrid/components/ReorderColumnsDialog.js +93 -0
  70. package/dist/components/DataGrid/components/ReorderColumnsDialog.js.map +1 -0
  71. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js +1 -1
  72. package/dist/components/DataGrid/utils/applyModelChange.d.ts +3 -0
  73. package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
  74. package/dist/components/DataGrid/utils/applyModelChange.js +5 -0
  75. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  76. package/dist/components/DataGrid/utils/computeDefaultColumnOrder.d.ts +8 -0
  77. package/dist/components/DataGrid/utils/computeDefaultColumnOrder.d.ts.map +1 -0
  78. package/dist/components/DataGrid/utils/computeDefaultColumnOrder.js +14 -0
  79. package/dist/components/DataGrid/utils/computeDefaultColumnOrder.js.map +1 -0
  80. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js +1 -1
  81. package/dist/components/EntityFinder/details/view/DetailsView.d.ts.map +1 -1
  82. package/dist/components/EntityFinder/details/view/DetailsView.js +119 -122
  83. package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
  84. package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.d.ts +5 -1
  85. package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.d.ts.map +1 -1
  86. package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js +7 -7
  87. package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js.map +1 -1
  88. package/dist/components/EntityLink.d.ts +2 -0
  89. package/dist/components/EntityLink.d.ts.map +1 -1
  90. package/dist/components/EntityLink.js +15 -11
  91. package/dist/components/EntityLink.js.map +1 -1
  92. package/dist/components/EntitySidebar/AccessAndPermissions.css +1 -0
  93. package/dist/components/EntitySidebar/AccessAndPermissions.d.ts +7 -0
  94. package/dist/components/EntitySidebar/AccessAndPermissions.d.ts.map +1 -0
  95. package/dist/components/EntitySidebar/AccessAndPermissions.js +75 -0
  96. package/dist/components/EntitySidebar/AccessAndPermissions.js.map +1 -0
  97. package/dist/components/EntitySidebar/AccessAndPermissions.module.js +15 -0
  98. package/dist/components/EntitySidebar/AccessAndPermissions.module.js.map +1 -0
  99. package/dist/components/EntitySidebar/AccessAndPermissions.module.scss +58 -0
  100. package/dist/components/EntitySidebar/EntitySidebar.css +1 -1
  101. package/dist/components/EntitySidebar/EntitySidebar.d.ts.map +1 -1
  102. package/dist/components/EntitySidebar/EntitySidebar.js +54 -42
  103. package/dist/components/EntitySidebar/EntitySidebar.js.map +1 -1
  104. package/dist/components/EntitySidebar/EntitySidebar.module.js +10 -11
  105. package/dist/components/EntitySidebar/EntitySidebar.module.js.map +1 -1
  106. package/dist/components/EntitySidebar/EntitySidebar.module.scss +6 -13
  107. package/dist/components/EntityTreeTable/EntityTreeTable.css +1 -1
  108. package/dist/components/EntityTreeTable/EntityTreeTable.module.js +1 -1
  109. package/dist/components/EntityTreeTable/EntityTreeTable.module.js.map +1 -1
  110. package/dist/components/EntityTreeTable/EntityTreeTable.module.scss +18 -0
  111. package/dist/components/EntityTreeTable/components/ColumnHeaders.d.ts.map +1 -1
  112. package/dist/components/EntityTreeTable/components/ColumnHeaders.js +20 -7
  113. package/dist/components/EntityTreeTable/components/ColumnHeaders.js.map +1 -1
  114. package/dist/components/EntityTreeTable/components/EntityNameCell.d.ts.map +1 -1
  115. package/dist/components/EntityTreeTable/components/EntityNameCell.js +3 -1
  116. package/dist/components/EntityTreeTable/components/EntityNameCell.js.map +1 -1
  117. package/dist/components/EntityTreeTable/components/EntityTreeTableView.d.ts.map +1 -1
  118. package/dist/components/EntityTreeTable/components/EntityTreeTableView.js +4 -1
  119. package/dist/components/EntityTreeTable/components/EntityTreeTableView.js.map +1 -1
  120. package/dist/components/EntityTreeTable/components/IdColumnHeader.d.ts.map +1 -1
  121. package/dist/components/EntityTreeTable/components/IdColumnHeader.js +3 -1
  122. package/dist/components/EntityTreeTable/components/IdColumnHeader.js.map +1 -1
  123. package/dist/components/EntityTreeTable/hooks/useTableColumns.d.ts.map +1 -1
  124. package/dist/components/EntityTreeTable/hooks/useTableColumns.js +24 -19
  125. package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
  126. package/dist/components/FilePreview/PdfPreview.d.ts.map +1 -1
  127. package/dist/components/FilePreview/PdfPreview.js +23 -20
  128. package/dist/components/FilePreview/PdfPreview.js.map +1 -1
  129. package/dist/components/Forum/DiscussionEmpty.css +1 -1
  130. package/dist/components/Forum/DiscussionEmpty.module.js +4 -4
  131. package/dist/components/Forum/DiscussionEmpty.module.js.map +1 -1
  132. package/dist/components/Forum/DiscussionEmpty.module.scss +3 -6
  133. package/dist/components/GenericCard/SynapseCardLabel.d.ts.map +1 -1
  134. package/dist/components/GenericCard/SynapseCardLabel.js +100 -99
  135. package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
  136. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.css +1 -0
  137. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.d.ts +29 -0
  138. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.d.ts.map +1 -0
  139. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.js +229 -0
  140. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.js.map +1 -0
  141. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.module.js +9 -0
  142. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.module.js.map +1 -0
  143. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.module.scss +19 -0
  144. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPickerModal.d.ts +23 -0
  145. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPickerModal.d.ts.map +1 -0
  146. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPickerModal.js +39 -0
  147. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPickerModal.js.map +1 -0
  148. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaVersionSelectionContext.d.ts +14 -0
  149. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaVersionSelectionContext.d.ts.map +1 -0
  150. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaVersionSelectionContext.js +12 -0
  151. package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaVersionSelectionContext.js.map +1 -0
  152. package/dist/components/JsonSchema/JsonSchemaPicker/VersionSelectionType.d.ts +17 -0
  153. package/dist/components/JsonSchema/JsonSchemaPicker/VersionSelectionType.d.ts.map +1 -0
  154. package/dist/components/JsonSchema/JsonSchemaPicker/VersionSelectionType.js +8 -0
  155. package/dist/components/JsonSchema/JsonSchemaPicker/VersionSelectionType.js.map +1 -0
  156. package/dist/components/JsonSchema/JsonSchemaPicker/index.d.ts +6 -0
  157. package/dist/components/JsonSchema/JsonSchemaPicker/index.d.ts.map +1 -0
  158. package/dist/components/JsonSchema/JsonSchemaPicker/index.js +4 -0
  159. package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaOrganizations.d.ts +20 -0
  160. package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaOrganizations.d.ts.map +1 -0
  161. package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaOrganizations.js +25 -0
  162. package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaOrganizations.js.map +1 -0
  163. package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaSelection.d.ts +35 -0
  164. package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaSelection.d.ts.map +1 -0
  165. package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaSelection.js +60 -0
  166. package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaSelection.js.map +1 -0
  167. package/dist/components/ProjectInfo/ProjectInfo.css +1 -1
  168. package/dist/components/ProjectInfo/ProjectInfo.module.js +5 -5
  169. package/dist/components/ProjectInfo/ProjectInfo.module.js.map +1 -1
  170. package/dist/components/ProjectInfo/ProjectInfo.module.scss +2 -4
  171. package/dist/components/ProjectInfo/ProjectInfoPopover.d.ts.map +1 -1
  172. package/dist/components/ProjectInfo/ProjectInfoPopover.js +17 -16
  173. package/dist/components/ProjectInfo/ProjectInfoPopover.js.map +1 -1
  174. package/dist/components/ProjectStorage/ProjectDataAvailability.d.ts.map +1 -1
  175. package/dist/components/ProjectStorage/ProjectDataAvailability.js +16 -16
  176. package/dist/components/ProjectStorage/ProjectDataAvailability.js.map +1 -1
  177. package/dist/components/ProvenanceGraph/ProvenanceGraph.d.ts.map +1 -1
  178. package/dist/components/ProvenanceGraph/ProvenanceGraph.js +95 -95
  179. package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
  180. package/dist/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.js +2 -2
  181. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.d.ts.map +1 -1
  182. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js +120 -92
  183. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
  184. package/dist/components/StorybookComponentWrapper.d.ts.map +1 -1
  185. package/dist/components/StorybookComponentWrapper.js +1 -3
  186. package/dist/components/StorybookComponentWrapper.js.map +1 -1
  187. package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
  188. package/dist/components/SynapseChat/SynapseChat.js +40 -40
  189. package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
  190. package/dist/components/SynapseChat/SynapseChatInteraction.d.ts +3 -2
  191. package/dist/components/SynapseChat/SynapseChatInteraction.d.ts.map +1 -1
  192. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  193. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.css +1 -1
  194. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.d.ts.map +1 -1
  195. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.js +0 -7
  196. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.js.map +1 -1
  197. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.module.js +2 -2
  198. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.module.js.map +1 -1
  199. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.module.scss +12 -2
  200. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.css +1 -1
  201. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.module.js +3 -3
  202. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.module.js.map +1 -1
  203. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.module.scss +5 -1
  204. package/dist/components/TanStackTable/ColumnHeader.d.ts +7 -0
  205. package/dist/components/TanStackTable/ColumnHeader.d.ts.map +1 -1
  206. package/dist/components/TanStackTable/ColumnHeader.js +10 -9
  207. package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
  208. package/dist/components/TanStackTable/StyledVirtualTanStackTable.d.ts +8 -0
  209. package/dist/components/TanStackTable/StyledVirtualTanStackTable.d.ts.map +1 -1
  210. package/dist/components/TanStackTable/StyledVirtualTanStackTable.js +31 -22
  211. package/dist/components/TanStackTable/StyledVirtualTanStackTable.js.map +1 -1
  212. package/dist/components/TanStackTable/useFetchNextPageOnScrollToBottom.d.ts +21 -0
  213. package/dist/components/TanStackTable/useFetchNextPageOnScrollToBottom.d.ts.map +1 -0
  214. package/dist/components/TanStackTable/useFetchNextPageOnScrollToBottom.js +22 -0
  215. package/dist/components/TanStackTable/useFetchNextPageOnScrollToBottom.js.map +1 -0
  216. package/dist/components/dataaccess/AccessRequirementDashboard.d.ts.map +1 -1
  217. package/dist/components/dataaccess/AccessRequirementDashboard.js +55 -55
  218. package/dist/components/dataaccess/AccessRequirementDashboard.js.map +1 -1
  219. package/dist/components/dataaccess/EDucTemplateTable.d.ts +3 -0
  220. package/dist/components/dataaccess/EDucTemplateTable.d.ts.map +1 -0
  221. package/dist/components/dataaccess/EDucTemplateTable.js +213 -0
  222. package/dist/components/dataaccess/EDucTemplateTable.js.map +1 -0
  223. package/dist/components/dataaccess/ReviewerDashboard.d.ts.map +1 -1
  224. package/dist/components/dataaccess/ReviewerDashboard.js +44 -34
  225. package/dist/components/dataaccess/ReviewerDashboard.js.map +1 -1
  226. package/dist/components/entity/metadata/AnnotationsTable.js +2 -2
  227. package/dist/components/entity/metadata/AnnotationsTable.js.map +1 -1
  228. package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.d.ts.map +1 -1
  229. package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.js +8 -8
  230. package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.js.map +1 -1
  231. package/dist/components/entity/page/title_bar/EntityPageTitleBar.d.ts +0 -1
  232. package/dist/components/entity/page/title_bar/EntityPageTitleBar.d.ts.map +1 -1
  233. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js +22 -22
  234. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js.map +1 -1
  235. package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.d.ts.map +1 -1
  236. package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js +62 -68
  237. package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js.map +1 -1
  238. package/dist/components/styled/StyledTableContainer.d.ts +1 -0
  239. package/dist/components/styled/StyledTableContainer.d.ts.map +1 -1
  240. package/dist/components/styled/StyledTableContainer.js +3 -3
  241. package/dist/components/styled/StyledTableContainer.js.map +1 -1
  242. package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts +2 -0
  243. package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
  244. package/dist/components/widgets/facet-nav/FacetNavPanel.js +35 -40
  245. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  246. package/dist/mocks/eDuc/mockEDucTemplates.d.ts +7 -0
  247. package/dist/mocks/eDuc/mockEDucTemplates.d.ts.map +1 -0
  248. package/dist/mocks/eDuc/mockEDucTemplates.js +18 -0
  249. package/dist/mocks/eDuc/mockEDucTemplates.js.map +1 -0
  250. package/dist/mocks/jsonschema/mockJsonSchemaListing.d.ts +31 -0
  251. package/dist/mocks/jsonschema/mockJsonSchemaListing.d.ts.map +1 -0
  252. package/dist/mocks/jsonschema/mockJsonSchemaListing.js +101 -0
  253. package/dist/mocks/jsonschema/mockJsonSchemaListing.js.map +1 -0
  254. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.d.ts.map +1 -1
  255. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js +48 -23
  256. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js.map +1 -1
  257. package/dist/mocks/msw/handlers/eDucTemplateHandlers.d.ts +2 -0
  258. package/dist/mocks/msw/handlers/eDucTemplateHandlers.d.ts.map +1 -0
  259. package/dist/mocks/msw/handlers/eDucTemplateHandlers.js +14 -0
  260. package/dist/mocks/msw/handlers/eDucTemplateHandlers.js.map +1 -0
  261. package/dist/mocks/msw/handlers/jsonSchemaListingHandlers.d.ts +8 -0
  262. package/dist/mocks/msw/handlers/jsonSchemaListingHandlers.d.ts.map +1 -0
  263. package/dist/mocks/msw/handlers/jsonSchemaListingHandlers.js +30 -0
  264. package/dist/mocks/msw/handlers/jsonSchemaListingHandlers.js.map +1 -0
  265. package/dist/mocks/msw/handlers.d.ts.map +1 -1
  266. package/dist/mocks/msw/handlers.js +55 -51
  267. package/dist/mocks/msw/handlers.js.map +1 -1
  268. package/dist/style/abstracts/_cssVariables.scss +13 -0
  269. package/dist/style/components/entity_finder/_details-view.scss +0 -10
  270. package/dist/style/components/facet_nav/_facet-nav-panel.scss +0 -6
  271. package/dist/style/main.css +1 -1
  272. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  273. package/dist/synapse-client/SynapseClient.js +2 -6
  274. package/dist/synapse-client/SynapseClient.js.map +1 -1
  275. package/dist/synapse-queries/KeyFactory.d.ts +3 -0
  276. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  277. package/dist/synapse-queries/KeyFactory.js +9 -0
  278. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  279. package/dist/synapse-queries/dataaccess/useEDuc.d.ts +3 -3
  280. package/dist/synapse-queries/dataaccess/useEDuc.d.ts.map +1 -1
  281. package/dist/synapse-queries/dataaccess/useEDuc.js +40 -35
  282. package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -1
  283. package/dist/synapse-queries/entity/index.d.ts +0 -2
  284. package/dist/synapse-queries/entity/index.d.ts.map +1 -1
  285. package/dist/synapse-queries/entity/index.js +8 -10
  286. package/dist/synapse-queries/index.d.ts +1 -0
  287. package/dist/synapse-queries/index.d.ts.map +1 -1
  288. package/dist/synapse-queries/index.js +136 -128
  289. package/dist/synapse-queries/index.js.map +1 -1
  290. package/dist/synapse-queries/jsonschema/index.d.ts +6 -0
  291. package/dist/synapse-queries/jsonschema/index.d.ts.map +1 -0
  292. package/dist/synapse-queries/jsonschema/index.js +6 -0
  293. package/dist/synapse-queries/jsonschema/useEntityBoundSchema.d.ts.map +1 -0
  294. package/dist/synapse-queries/{entity → jsonschema}/useEntityBoundSchema.js +1 -1
  295. package/dist/synapse-queries/jsonschema/useEntityBoundSchema.js.map +1 -0
  296. package/dist/synapse-queries/jsonschema/useListJsonSchemaVersions.d.ts +26 -0
  297. package/dist/synapse-queries/jsonschema/useListJsonSchemaVersions.d.ts.map +1 -0
  298. package/dist/synapse-queries/jsonschema/useListJsonSchemaVersions.js +36 -0
  299. package/dist/synapse-queries/jsonschema/useListJsonSchemaVersions.js.map +1 -0
  300. package/dist/synapse-queries/jsonschema/useListJsonSchemasInfinite.d.ts +8 -0
  301. package/dist/synapse-queries/jsonschema/useListJsonSchemasInfinite.d.ts.map +1 -0
  302. package/dist/synapse-queries/jsonschema/useListJsonSchemasInfinite.js +21 -0
  303. package/dist/synapse-queries/jsonschema/useListJsonSchemasInfinite.js.map +1 -0
  304. package/dist/synapse-queries/jsonschema/useListOrganizations.d.ts +8 -0
  305. package/dist/synapse-queries/jsonschema/useListOrganizations.d.ts.map +1 -0
  306. package/dist/synapse-queries/jsonschema/useListOrganizations.js +22 -0
  307. package/dist/synapse-queries/jsonschema/useListOrganizations.js.map +1 -0
  308. package/dist/synapse-queries/jsonschema/useSchema.d.ts.map +1 -0
  309. package/dist/synapse-queries/{entity → jsonschema}/useSchema.js +1 -1
  310. package/dist/synapse-queries/jsonschema/useSchema.js.map +1 -0
  311. package/dist/testutils/VirtualizedTableTestUtils.js +17 -0
  312. package/dist/testutils/VirtualizedTableTestUtils.js.map +1 -0
  313. package/dist/theme/palette/Palettes.d.ts.map +1 -1
  314. package/dist/theme/palette/Palettes.js +13 -0
  315. package/dist/theme/palette/Palettes.js.map +1 -1
  316. package/dist/tsconfig.build.tsbuildinfo +1 -1
  317. package/dist/utils/APIConstants.d.ts +6 -0
  318. package/dist/utils/APIConstants.d.ts.map +1 -1
  319. package/dist/utils/APIConstants.js +2 -2
  320. package/dist/utils/APIConstants.js.map +1 -1
  321. package/dist/utils/hooks/useFetchBlobUrl.d.ts +9 -0
  322. package/dist/utils/hooks/useFetchBlobUrl.d.ts.map +1 -0
  323. package/dist/utils/hooks/useFetchBlobUrl.js +19 -0
  324. package/dist/utils/hooks/useFetchBlobUrl.js.map +1 -0
  325. package/package.json +3 -3
  326. package/dist/synapse-queries/entity/useEntityBoundSchema.d.ts.map +0 -1
  327. package/dist/synapse-queries/entity/useEntityBoundSchema.js.map +0 -1
  328. package/dist/synapse-queries/entity/useSchema.d.ts.map +0 -1
  329. package/dist/synapse-queries/entity/useSchema.js.map +0 -1
  330. /package/dist/synapse-queries/{entity → jsonschema}/useEntityBoundSchema.d.ts +0 -0
  331. /package/dist/synapse-queries/{entity → jsonschema}/useSchema.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseGrid.js","names":["CertificationRequirement","ExportCsvFromGridButton","GridMenuButton","UploadCsvToGridButton","useGetSchemaForGrid","SyncGridWithSourceButton","computeReplicaSelectionModel","modelRowsToGrid","SynapseErrorBoundary","SkeletonTable","useGetCurrentUserBundle","useListGridReplicas","useGetEntity","getSchemaPropertiesInfo","HelpOutline","Box","Stack","Tooltip","Typography","Grid","DataSheetGridRef","SelectionWithId","CreateGridRequest","GridSession","ClickableJsonCrdt","Ref","useCallback","useEffect","useImperativeHandle","useMemo","useRef","useState","useErrorHandler","SynapseSpinner","GridAgentChat","ValidationAlert","DataGrid","DataGridRow","GridModel","Operation","useGridReplicaUsers","useGridUndoRedo","useRemoteSelections","StartGridSession","StartGridSessionHandle","useDataGridWebSocket","applyModelChange","ModelChange","removeNoOpOperations","enrichRowsWithChangeInfo","mapOperationsToModelChanges","CurieAvatarHead","SynapseGridProps","agentRegistrationId","showDebugInfo","ref","SynapseGridHandle","initializeGrid","request","loadExistingSession","sessionId","SynapseGridInner","t0","$","_c","t1","undefined","session","setSession","replicaId","setReplicaId","chatOpen","setChatOpen","lastSelection","setLastSelection","startGridSessionRef","gridRef","data","userBundle","isLoading","t2","refetch","refetchReplicas","t3","replicas","t4","handleReplicaConnectionChange","currentUserId","userId","String","replicaUserMap","t5","t6","Symbol","for","current","handleStartSession","handleLoadSession","t7","onGridReady","onReplicaConnected","onReplicaDisconnected","isConnected","websocketInstance","hasCompletedInitialSync","isSyncing","model","modelSnapshot","connect","presignedUrl","hasSufficientData","websocketError","websocketInstanceRef","t8","t9","lastConnectParamsRef","t10","nextParams","prevParams","t11","t12","t13","t14","setActiveCell","jsonSchema","t15","sourceEntityId","t16","enabled","entityData","entityIsView","concreteType","t17","upsertKey","t18","t19","schemaPropertiesInfo","connectionStatus","remoteSelections","t20","rowValues","t21","enrichedRowValues","t22","sendPatch","commit","t23","t24","t25","model_0","modelChanges","forEach","change","applyAndCommitChanges","t26","change_0","console","error","type","applyModelChangeFromUndoRedo","undoUI","redoUI","addOperationsToUndoStack","clearRedoStack","t27","newValue","operations","length","modelChanges_0","handleChange","t28","opts","selection","replicaSelectionModel","toString","handleSelectionChange","t29","rowIndex","colIndex","col","row","handleNavigateToCell","isCertified","t30","xs","xl","t31","t32","t33","gridJsonSchema$Id","substring","color","connectedReplicas","filter","_temp","map","r_0","i","r","margin","fontSize","JSON","stringify","cursor","textDecoration","t34","t35","columnNames","columnOrder","marginBottom","justifyContent","mr","display","alignItems","gap","padding","border","maxHeight","overflowY","t36","SynapseGrid","props"],"sources":["../../../src/components/DataGrid/SynapseGrid.tsx"],"sourcesContent":["import CertificationRequirement from '@/components/AccessRequirementList/RequirementItem/CertificationRequirement'\nimport ExportCsvFromGridButton from '@/components/DataGrid/components/ExportCsvFromGridButton'\nimport GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport UploadCsvToGridButton from '@/components/DataGrid/components/UploadCsvToGridButton'\nimport useGetSchemaForGrid from '@/components/DataGrid/hooks/useGetSchemaForGrid'\nimport SyncGridWithSourceButton from '@/components/DataGrid/SyncGridWithSourceButton'\nimport computeReplicaSelectionModel from '@/components/DataGrid/utils/computeReplicaSelectionModel'\nimport modelRowsToGrid from '@/components/DataGrid/utils/modelRowsToGrid'\nimport { SynapseErrorBoundary } from '@/components/error/ErrorBanner'\nimport { SkeletonTable } from '@/components/index'\nimport { useGetCurrentUserBundle } from '@/synapse-queries'\nimport { useListGridReplicas } from '@/synapse-queries/grid/useGridSession'\nimport { useGetEntity } from '@/synapse-queries/index'\nimport { getSchemaPropertiesInfo } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport { HelpOutline } from '@mui/icons-material'\nimport { Box, Stack, Tooltip, Typography } from '@mui/material'\nimport Grid from '@mui/material/Grid'\nimport {\n DataSheetGridRef,\n SelectionWithId,\n} from '@sage-bionetworks/react-datasheet-grid'\nimport {\n CreateGridRequest,\n GridSession,\n} from '@sage-bionetworks/synapse-client'\nimport { ClickableJsonCrdt } from 'clickable-json'\nimport {\n Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport GridAgentChat from '../SynapseChat/GridAgentChat'\nimport { ValidationAlert } from './components/ValidationAlert'\nimport DataGrid from './DataGrid'\nimport { DataGridRow, GridModel, Operation } from './DataGridTypes'\nimport { useGridReplicaUsers } from './hooks/useGridReplicaUsers'\nimport { useGridUndoRedo } from './hooks/useGridUndoRedo'\nimport { useRemoteSelections } from './hooks/useRemoteSelections'\nimport { StartGridSession, StartGridSessionHandle } from './StartGridSession'\nimport { useDataGridWebSocket } from './useDataGridWebsocket'\nimport { applyModelChange, ModelChange } from './utils/applyModelChange'\nimport { removeNoOpOperations } from './utils/DataGridUtils'\nimport { enrichRowsWithChangeInfo } from './utils/enrichRowsWithChangeInfo'\nimport { mapOperationsToModelChanges } from './utils/mapOperationsToModelChanges'\nimport CurieAvatarHead from '@/assets/mui_components/CurieAvatarHead'\n\nexport type SynapseGridProps = {\n agentRegistrationId?: string\n showDebugInfo?: boolean\n ref?: Ref<SynapseGridHandle>\n}\n\nexport type SynapseGridHandle = {\n initializeGrid: (request: CreateGridRequest) => void\n loadExistingSession: (sessionId: string) => void\n}\n\nfunction SynapseGridInner({\n agentRegistrationId,\n showDebugInfo = false,\n ref,\n}: SynapseGridProps) {\n const [session, setSession] = useState<GridSession | null>(null)\n const [replicaId, setReplicaId] = useState<number | null>(null)\n const [chatOpen, setChatOpen] = useState(false)\n const [lastSelection, setLastSelection] = useState<SelectionWithId | null>(\n null,\n )\n\n const startGridSessionRef = useRef<StartGridSessionHandle | null>(null)\n const gridRef = useRef<DataSheetGridRef | null>(null)\n\n const { data: userBundle, isLoading } = useGetCurrentUserBundle()\n\n const { data: replicas = [], refetch: refetchReplicas } = useListGridReplicas(\n session?.sessionId,\n )\n\n const handleReplicaConnectionChange = useCallback(() => {\n void refetchReplicas()\n }, [refetchReplicas])\n\n // ── Attribution infrastructure ─────────────────────────────────────────\n const currentUserId =\n userBundle?.userId != null ? String(userBundle.userId) : undefined\n\n const replicaUserMap = useGridReplicaUsers(replicas, replicaId, currentUserId)\n\n useImperativeHandle(\n ref,\n () => ({\n initializeGrid: (request: CreateGridRequest) => {\n if (startGridSessionRef.current) {\n startGridSessionRef.current.handleStartSession(request)\n }\n },\n loadExistingSession: (sessionId: string) => {\n if (startGridSessionRef.current) {\n startGridSessionRef.current.handleLoadSession(sessionId)\n }\n },\n }),\n [],\n )\n\n // WebSocket state\n const {\n isConnected,\n websocketInstance,\n hasCompletedInitialSync,\n isSyncing,\n model,\n modelSnapshot,\n connect,\n presignedUrl,\n hasSufficientData,\n websocketError,\n } = useDataGridWebSocket({\n onGridReady: handleReplicaConnectionChange,\n onReplicaConnected: handleReplicaConnectionChange,\n onReplicaDisconnected: handleReplicaConnectionChange,\n })\n\n useErrorHandler(websocketError)\n\n const websocketInstanceRef = useRef<typeof websocketInstance | null>(null)\n\n useEffect(() => {\n websocketInstanceRef.current = websocketInstance\n }, [websocketInstance])\n\n // Track last connection parameters to avoid redundant connections\n const lastConnectParamsRef = useRef<{\n replicaId: number\n sessionId: string\n } | null>(null)\n\n useEffect(() => {\n if (replicaId === null || replicaId === undefined || !session?.sessionId) {\n lastConnectParamsRef.current = null\n return\n }\n\n const nextParams = {\n replicaId,\n sessionId: session.sessionId,\n }\n\n const prevParams = lastConnectParamsRef.current\n\n if (\n prevParams &&\n prevParams.replicaId === nextParams.replicaId &&\n prevParams.sessionId === nextParams.sessionId\n ) {\n return\n }\n\n lastConnectParamsRef.current = nextParams\n connect(replicaId, session.sessionId)\n }, [replicaId, session?.sessionId, connect])\n\n // Reset grid state when model is reset (new session/replica)\n useEffect(() => {\n if (model === null) {\n // Clear any grid-specific state when starting a new session\n setLastSelection(null)\n // Clear active cell if grid exists\n if (gridRef.current) {\n gridRef.current.setActiveCell(null)\n }\n }\n }, [model])\n\n const jsonSchema = useGetSchemaForGrid(session)\n\n // Grid behaves differently for views vs recordSets\n // Note for future: can get modifiedOn to refresh grid when view changes\n const { data: entityData } = useGetEntity(\n session?.sourceEntityId,\n undefined,\n {\n enabled: !!session?.sourceEntityId,\n },\n )\n\n const entityIsView =\n entityData?.concreteType ===\n 'org.sagebionetworks.repo.model.table.EntityView'\n\n // If grid source entity is a recordSet, get its upsert key(s)\n // from the entity bundle\n const upsertKey = !entityIsView\n ? (entityData as { upsertKey?: string[] } | undefined)?.upsertKey\n : []\n\n // Process schema properties once\n const schemaPropertiesInfo = useMemo(() => {\n return getSchemaPropertiesInfo(jsonSchema ?? null)\n }, [jsonSchema])\n\n const connectionStatus = isConnected ? 'Connected' : 'Disconnected'\n\n const remoteSelections = useRemoteSelections(\n modelSnapshot,\n model,\n replicas,\n replicaId,\n )\n\n // Transform the model view rows and columns to DataSheetGrid format\n const rowValues = useMemo(\n () => (modelSnapshot ? modelRowsToGrid(model, modelSnapshot) : []),\n [model, modelSnapshot],\n )\n\n // Enrich rows with per-cell change attribution for CSS indicators and tooltips\n const enrichedRowValues = useMemo(\n () =>\n enrichRowsWithChangeInfo(rowValues, model, modelSnapshot, replicaUserMap),\n [rowValues, model, modelSnapshot, replicaUserMap],\n )\n\n const commit = useCallback(() => {\n if (!isConnected || !websocketInstanceRef.current) {\n return\n }\n\n websocketInstanceRef.current.sendPatch()\n }, [isConnected, websocketInstanceRef])\n\n useEffect(() => {\n if (isConnected) {\n commit()\n }\n }, [isConnected, commit])\n\n const applyAndCommitChanges = useCallback(\n (model: GridModel, modelChanges: ModelChange[]) => {\n // Apply each change to the model\n modelChanges.forEach(change => {\n applyModelChange(model, change, schemaPropertiesInfo)\n })\n\n commit()\n },\n [commit, schemaPropertiesInfo],\n )\n\n const applyModelChangeFromUndoRedo = useCallback(\n (change: ModelChange) => {\n if (!model) {\n console.error('Model is not initialized')\n return\n }\n\n if (change.type === 'DELETE' && gridRef.current) {\n // The user may have set a cell as active that we are removing with an 'undo'. In that case, clear the active state\n gridRef.current.setActiveCell(null)\n }\n\n applyAndCommitChanges(model, [change])\n },\n [model, applyAndCommitChanges],\n )\n\n const { undoUI, redoUI, addOperationsToUndoStack, clearRedoStack } =\n useGridUndoRedo(applyModelChangeFromUndoRedo)\n\n const handleChange = useCallback(\n (newValue: DataGridRow[], operations: Operation[]) => {\n if (!model) {\n console.error('Model is not initialized')\n return\n }\n\n // Check that something changed before updating the model\n operations = removeNoOpOperations(newValue, rowValues, operations)\n\n if (operations.length > 0) {\n // Clear redo stack since new changes invalidate redo history\n clearRedoStack()\n\n // Track row creation, updates, and deletions to keep UI state and undo history in sync\n\n // Add all operations to the undo stack\n addOperationsToUndoStack(operations, rowValues, newValue)\n\n // Transform operations to model changes\n const modelChanges = mapOperationsToModelChanges(operations, newValue)\n\n applyAndCommitChanges(model, modelChanges)\n }\n },\n [\n model,\n rowValues,\n clearRedoStack,\n addOperationsToUndoStack,\n applyAndCommitChanges,\n ],\n )\n\n const handleSelectionChange = useCallback(\n (opts: { selection: SelectionWithId | null }) => {\n const { selection } = opts\n if (selection != null) {\n setLastSelection(selection)\n\n if (model != null && replicaId != null) {\n const replicaSelectionModel = computeReplicaSelectionModel(\n selection,\n model,\n )\n // insert it into the CRDT Model\n applyAndCommitChanges(model, [\n {\n type: 'SET_SELECTION',\n replicaId: replicaId.toString(),\n selection: replicaSelectionModel,\n },\n ])\n }\n }\n },\n [applyAndCommitChanges, model, replicaId],\n )\n\n const handleNavigateToCell = useCallback(\n (rowIndex: number, colIndex: number) => {\n gridRef.current?.setActiveCell({ col: colIndex, row: rowIndex })\n },\n [],\n )\n\n if (!isLoading && !userBundle?.isCertified) {\n return <CertificationRequirement />\n }\n\n return (\n <div>\n <Grid container spacing={2}>\n <Grid size={{ xs: 12, xl: 8 }}>\n <StartGridSession\n ref={startGridSessionRef}\n onSessionChange={setSession}\n onReplicaChange={setReplicaId}\n show={showDebugInfo}\n />\n </Grid>\n {/* Debug Information */}\n <Grid size={{ xs: 12, xl: 4 }}>\n {showDebugInfo && (\n <div>\n <p>Session ID: {session?.sessionId || 'No session created'}</p>\n <p>Replica ID: {replicaId || 'No replica created'}</p>\n <p>\n Source Entity ID:{' '}\n {session?.sourceEntityId || 'No source entity'}\n </p>\n <p>\n JSON Schema $id:{' '}\n {session?.gridJsonSchema$Id || 'No schema attached to session'}\n </p>\n <p>\n Presigned URL:{' '}\n {presignedUrl\n ? presignedUrl.substring(0, 30) +\n (presignedUrl.length > 30\n ? ' ... ' +\n presignedUrl.substring(presignedUrl.length - 10)\n : '')\n : 'No URL generated'}\n </p>\n <p>\n WebSocket Status:{' '}\n <span style={{ color: isConnected ? 'green' : 'red' }}>\n {connectionStatus}\n </span>\n </p>\n <p>\n {(() => {\n const connectedReplicas = replicas.filter(r => r.isConnected)\n return (\n <>\n Connected Replicas ({connectedReplicas.length} /{' '}\n {replicas.length} total):{' '}\n {connectedReplicas.length === 0\n ? 'none'\n : connectedReplicas.map((r, i) => (\n <Tooltip\n key={r.replicaId}\n title={\n <pre style={{ margin: 0, fontSize: '11px' }}>\n {JSON.stringify(r, null, 2)}\n </pre>\n }\n >\n <span\n style={{\n cursor: 'pointer',\n textDecoration: 'underline dotted',\n }}\n >\n {r.replicaId}\n {i < connectedReplicas.length - 1 ? ', ' : ''}\n </span>\n </Tooltip>\n ))}\n </>\n )\n })()}\n </p>\n </div>\n )}\n </Grid>\n\n {session && (\n <>\n {/* Grid Loading State */}\n {!hasSufficientData && (\n <Grid size={12}>\n <h3>Setting up grid...</h3>\n <div style={{ marginBottom: '10px' }}>\n {!session && <p>Creating grid session...</p>}\n {session && !replicaId && <p>Setting up real-time sync...</p>}\n {session && replicaId && !presignedUrl && (\n <p>Establishing secure connection...</p>\n )}\n {session && replicaId && presignedUrl && !isConnected && (\n <p>Connecting to server...</p>\n )}\n {isConnected && !hasCompletedInitialSync && (\n <p>Loading table data...</p>\n )}\n <SkeletonTable numRows={4} numCols={1} />\n </div>\n </Grid>\n )}\n {/* Grid */}\n {hasSufficientData && (\n <>\n <Grid size={12}>\n <ValidationAlert\n rowValues={rowValues}\n columnNames={modelSnapshot?.columnNames ?? []}\n columnOrder={modelSnapshot?.columnOrder ?? []}\n onNavigateToCell={handleNavigateToCell}\n isLoading={!hasCompletedInitialSync}\n />\n </Grid>\n <Grid size={12}>\n <Stack\n direction={'row'}\n spacing={1}\n sx={{ justifyContent: 'flex-end' }}\n >\n <GridMenuButton\n variant=\"outlined\"\n startIcon={<HelpOutline />}\n href=\"https://docs.synapse.org/synapse-docs/managing-metadata-with-curator\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{ mr: 'auto' }}\n >\n Help and Instructions\n </GridMenuButton>\n {(!hasCompletedInitialSync || isSyncing) && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n <SynapseSpinner size={16} margin=\"0\" />\n <Typography variant=\"caption\" color=\"text.secondary\">\n {hasCompletedInitialSync ? 'Syncing…' : 'Loading…'}\n </Typography>\n </Box>\n )}\n {undoUI}\n {redoUI}\n <GridMenuButton\n variant={'outlined'}\n onClick={() => setChatOpen(true)}\n startIcon={<CurieAvatarHead />}\n >\n Open Curie\n </GridMenuButton>\n <GridAgentChat\n agentRegistrationId={agentRegistrationId}\n open={chatOpen}\n onClose={() => setChatOpen(false)}\n gridSessionId={session.sessionId!}\n usersReplicaId={replicaId!}\n chatbotName=\"Curie\"\n />\n {session.sourceEntityId && (\n <UploadCsvToGridButton\n sourceEntityId={session.sourceEntityId}\n gridSessionId={session.sessionId!}\n />\n )}\n {session.sessionId && (\n <ExportCsvFromGridButton\n gridSessionId={session.sessionId}\n filename={\n 'grid-' + (session.sourceEntityId || 'export')\n }\n />\n )}\n {session.sourceEntityId && (\n <SyncGridWithSourceButton gridSession={session} />\n )}\n </Stack>\n </Grid>\n <Grid size={12}>\n <DataGrid\n gridRef={gridRef}\n rowValues={enrichedRowValues}\n columnNames={modelSnapshot?.columnNames ?? []}\n columnOrder={modelSnapshot?.columnOrder ?? []}\n schemaPropertiesInfo={schemaPropertiesInfo}\n entityIsView={entityIsView}\n jsonSchema={jsonSchema}\n lastSelection={lastSelection}\n handleChange={handleChange}\n handleSelectionChange={handleSelectionChange}\n remoteSelections={remoteSelections}\n upsertKey={upsertKey}\n />\n </Grid>\n </>\n )}\n {/* Debug Model Snapshot */}\n {showDebugInfo && (\n <Grid\n size={12}\n style={{\n margin: '10px 0',\n padding: '10px',\n border: '1px solid #ccc',\n maxHeight: '400px',\n overflowY: 'auto',\n }}\n >\n <h3>Model</h3>\n {model ? (\n <ClickableJsonCrdt model={model} />\n ) : (\n 'No model available'\n )}\n </Grid>\n )}\n </>\n )}\n </Grid>\n </div>\n )\n}\n\nfunction SynapseGrid(props: SynapseGridProps) {\n return (\n <SynapseErrorBoundary>\n <SynapseGridInner {...props} />\n </SynapseErrorBoundary>\n )\n}\n\nexport default SynapseGrid\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA,SAAA6D,EAAAC,GAAA;CAAA,IAAAC,IAAAC,GAAA,GAAA,GAA0B,EAAAX,wBAAAC,eAAAW,IAAAV,YAAAO,GAExBR,IAAAW,OAAAC,KAAAA,IAAA,KAAAD,IAGA,CAAAE,GAAAC,MAA8BrC,GAA6B,IAAI,GAC/D,CAAAsC,GAAAC,MAAkCvC,GAAwB,IAAI,GAC9D,CAAAwC,IAAAC,MAAgCzC,GAAS,EAAK,GAC9C,CAAA0C,IAAAC,MAA0C3C,GACxC,IACF,GAEA4C,IAA4B7C,GAAsC,IAAI,GACtE8C,IAAgB9C,GAAgC,IAAI,GAEpD,EAAA+C,MAAAC,IAAAC,kBAAwCrE,EAAwB,GAEhE,EAAAmE,MAAAG,GAAAC,SAAAC,OAA0DvE,GACxDwD,GAAOP,SACT,GAACuB;CAAA,AAAApB,EAAA,OAAAiB,IAF0BG,IAAApB,EAAA,MAAboB,IAAAH,MAAAd,KAAAA,IAAA,CAAA,IAAAc,GAAajB,EAAA,KAAAiB,GAAAjB,EAAA,KAAAoB;CAAb,IAAAC,IAAAD,GAAaE;CAAA,AAAAtB,EAAA,OAAAmB,KAM1BG,IAAAtB,EAAA,MAFiDsB,UAAA;EAC3CH,GAAgB;CAAC,GACvBnB,EAAA,KAAAmB,IAAAnB,EAAA,KAAAsB;CAFD,IAAAC,IAAsCD,GAQtCK,KAAuBlD,GAAoB4C,GAAUf,GAFnDS,IAAUU,UAAY,OAAtBtB,KAAAA,IAA6BuB,OAAOX,GAAUU,MAAmB,CAEU,GAACG,GAAAC;CAE9EhE,AAF8EmC,EAAA,OAAA8B,OAAAC,IAAA,2BAAA,KAI5EH,WAAO;EAAAlC,iBACWC,MAAA;GACd,AAAIiB,EAAmBoB,WACrBpB,EAAmBoB,QAAQC,mBAAoBtC,CAAO;EACvD;EACFC,sBACoBC,MAAA;GACnB,AAAIe,EAAmBoB,WACrBpB,EAAmBoB,QAAQE,kBAAmBrC,CAAS;EACxD;CAEL,IACAgC,IAAA,CAAA,GAAE7B,EAAA,KAAA4B,GAAA5B,EAAA,KAAA6B,MAAAD,IAAA5B,EAAA,IAAA6B,IAAA7B,EAAA,KAdJnC,GACE2B,IACAoC,GAYAC,CACF;CAAC,IAAAM;CAAA,AAAAnC,EAAA,OAAAuB,IAkBAY,IAAAnC,EAAA,MAJwBmC,IAAA;EAAAC,aACVb;EAA6Bc,oBACtBd;EAA6Be,uBAC1Bf;CACzB,GAACvB,EAAA,KAAAuB,GAAAvB,EAAA,KAAAmC;CAfD,IAAA,EAAAI,gBAAAC,sBAAAC,4BAAAC,eAAAC,UAAAC,kBAAAC,YAAAC,iBAAAC,sBAAAC,uBAWIlE,GAAqBqD,CAIxB;CAEDlE,GAAgB+E,EAAc;CAE9B,IAAAC,KAA6BlF,GAAwC,IAAI,GAACmF,GAAAC;CAE1EvF,AAF0EoC,EAAA,OAAAwC,KAIpDU,IAAAlD,EAAA,IAAAmD,IAAAnD,EAAA,QAFZkD,UAAA;EACRD,GAAoBjB,UAAWQ;CAAH,GAC3BW,IAAA,CAACX,CAAiB,GAACxC,EAAA,KAAAwC,GAAAxC,EAAA,KAAAkD,GAAAlD,EAAA,MAAAmD,IAFtBvF,GAAUsF,GAEPC,CAAmB;CAGtB,IAAAC,KAA6BrF,GAGnB,IAAI,GAACsF;CAAA,AAAArD,EAAA,QAAA6C,KAAA7C,EAAA,QAAAM,KAAAN,EAAA,QAAAI,KAELiD,UAAA;EACR,IAAI/C,KAAc,QAAd,CAAkDF,GAAOP,WAAW;GACtEuD,GAAoBpB,UAAW;GAAH;EAAA;EAI9B,IAAAsB,IAAmB;GAAAhD;GAAAT,WAENO,EAAOP;EACpB,GAEA0D,IAAmBH,GAAoBpB;EAGrCuB,KACAA,EAAUjD,cAAegD,EAAUhD,aACnCiD,EAAU1D,cAAeyD,EAAUzD,cAKrCuD,GAAoBpB,UAAWsB,GAC/BT,EAAQvC,GAAWF,EAAOP,SAAU;CAAC,GACtCG,EAAA,MAAA6C,GAAA7C,EAAA,MAAAM,GAAAN,EAAA,MAAAI,GAAAJ,EAAA,MAAAqD,KAAAA,IAAArD,EAAA;CAAc,IAAAwD,KAAApD,GAAOP,WAAW4D;CAvBjC7F,AAuBiCoC,EAAA,QAAA6C,KAAA7C,EAAA,QAAAM,KAAAN,EAAA,QAAAwD,MAA9BC,IAAA;EAACnD;EAAWkD;EAAoBX;CAAO,GAAC7C,EAAA,MAAA6C,GAAA7C,EAAA,MAAAM,GAAAN,EAAA,MAAAwD,IAAAxD,EAAA,MAAAyD,KAAAA,IAAAzD,EAAA,KAvB3CpC,GAAUyF,GAuBPI,CAAwC;CAAC,IAAAC,GAAAC;CAG5C/F,AAH4CoC,EAAA,QAAA2C,KAYlCe,IAAA1D,EAAA,KAAA2D,IAAA3D,EAAA,QATA0D,UAAA;EACR,AAAIf,MAAU,SAEZhC,GAAiB,IAAI,GAEjBE,EAAOmB,WACTnB,EAAOmB,QAAQ4B,cAAe,IAAI;CAErC,GACAD,IAAA,CAAChB,CAAK,GAAC3C,EAAA,MAAA2C,GAAA3C,EAAA,MAAA0D,GAAA1D,EAAA,MAAA2D,IATV/F,GAAU8F,GASPC,CAAO;CAEV,IAAAE,KAAmBxH,GAAoB+D,CAAO,GAQjC0D,KAAA,CAAC,CAAC1D,GAAO2D,gBAAgBC;CAAA,AAAAhE,EAAA,QAAA8D,KACnCE,IAAAhE,EAAA,OAFDgE,IAAA,EAAAC,SACWH,GACX,GAAC9D,EAAA,MAAA8D,IAAA9D,EAAA,MAAAgE;CALH,IAAA,EAAAlD,MAAAoD,MAA6BrH,EAC3BuD,GAAO2D,gBACP5D,KAAAA,GACA6D,CAGF,GAEAG,IACED,GAAUE,iBACV,mDAAiDC;CAAA,AAAArE,EAAA,QAAAkE,KAAAlE,EAAA,QAAAmE,KAIjCE,IAACF,IAAD,CAAA,IACbD,GAA8DI,WAC7DtE,EAAA,MAAAkE,GAAAlE,EAAA,MAAAmE,GAAAnE,EAAA,MAAAqE,KAAAA,IAAArE,EAAA;CAFN,IAAAsE,KAAkBD,GAMeE,KAAAV,MAAA,MAAkBW;CAAA,AAAAxE,EAAA,QAAAuE,KAACC,IAAAxE,EAAA,OAA3CwE,IAAA1H,GAAwByH,EAAkB,GAACvE,EAAA,MAAAuE,IAAAvE,EAAA,MAAAwE;CADpD,IAAAC,IACED,GAGFE,KAAyBnC,IAAA,cAAA,gBAEzBoC,KAAyBhG,GACvBiE,GACAD,GACAtB,GACAf,CACF,GAACsE;CAAA,AAAA5E,EAAA,QAAA2C,KAAA3C,EAAA,QAAA4C,KAIQgC,IAAAhC,IAAgBpG,GAAgBmG,GAAOC,CAAkB,IAAzD,CAAA,GAA0D5C,EAAA,MAAA2C,GAAA3C,EAAA,MAAA4C,GAAA5C,EAAA,MAAA4E,KAAAA,IAAA5E,EAAA;CADnE,IAAA6E,IACSD,GAERE;CAAA,AAAA9E,EAAA,QAAA2C,KAAA3C,EAAA,QAAA4C,KAAA5C,EAAA,QAAA2B,MAAA3B,EAAA,QAAA6E,KAKGC,IAAA5F,GAAyB2F,GAAWlC,GAAOC,GAAejB,EAAc,GAAC3B,EAAA,MAAA2C,GAAA3C,EAAA,MAAA4C,GAAA5C,EAAA,MAAA2B,IAAA3B,EAAA,MAAA6E,GAAA7E,EAAA,MAAA8E,KAAAA,IAAA9E,EAAA;CAF7E,IAAA+E,KAEID,GAEHE;CAAA,AAAAhF,EAAA,QAAAuC,IAQAyC,IAAAhF,EAAA,OAN0BgF,UAAA;EACrB,CAACzC,KAAD,CAAiBU,GAAoBjB,WAIzCiB,GAAoBjB,QAAQiD,UAAW;CAAC,GACzCjF,EAAA,MAAAuC,GAAAvC,EAAA,MAAAgF;CAND,IAAAE,IAAeF,GAMwBG,IAAAC;CAEvCxH,AAFuCoC,EAAA,QAAAkF,KAAAlF,EAAA,QAAAuC,KAE7B4C,WAAA;EACR,AAAI5C,KACF2C,EAAO;CACR,GACAE,KAAA,CAAC7C,GAAa2C,CAAM,GAAClF,EAAA,MAAAkF,GAAAlF,EAAA,MAAAuC,GAAAvC,EAAA,MAAAmF,IAAAnF,EAAA,MAAAoF,OAAAD,KAAAnF,EAAA,KAAAoF,KAAApF,EAAA,MAJxBpC,GAAUuH,IAIPC,EAAqB;CAAC,IAAAC;CAAA,AAAArF,EAAA,QAAAkF,KAAAlF,EAAA,QAAAyE,KAGvBY,MAAAC,GAAAC,MAAA;EAMEL,AAJAK,EAAYC,SAASC,MAAA;GACnB1G,GAAiB4D,GAAO8C,GAAQhB,CAAoB;EAAC,CACtD,GAEDS,EAAO;CAAC,GACTlF,EAAA,MAAAkF,GAAAlF,EAAA,MAAAyE,GAAAzE,EAAA,MAAAqF,MAAAA,KAAArF,EAAA;CARH,IAAA0F,IAA8BL,IAU7BM;CAAA,AAAA3F,EAAA,QAAA0F,KAAA1F,EAAA,QAAA2C,KAGCgD,MAAAC,MAAA;EACE,IAAI,CAACjD,GAAK;GACRkD,QAAOC,MAAO,0BAA0B;GAAC;EAAA;EAS3CJ,AALID,EAAMM,SAAU,YAAYlF,EAAOmB,WAErCnB,EAAOmB,QAAQ4B,cAAe,IAAI,GAGpC8B,EAAsB/C,GAAO,CAAC8C,CAAM,CAAC;CAAC,GACvCzF,EAAA,MAAA0F,GAAA1F,EAAA,MAAA2C,GAAA3C,EAAA,MAAA2F,MAAAA,KAAA3F,EAAA;CAIH,IAAA,EAAAiG,YAAAC,YAAAC,8BAAAC,uBACE1H,GAAgBsH,EAA4B,GAACK;CAAA,AAAArG,EAAA,QAAAmG,MAAAnG,EAAA,QAAA0F,KAAA1F,EAAA,QAAAoG,MAAApG,EAAA,QAAA2C,KAAA3C,EAAA,QAAA6E,KAG7CwB,MAAAC,GAAAC,MAAA;EACE,IAAI,CAAC5D,GAAK;GACRkD,QAAOC,MAAO,0BAA0B;GAAC;EAAA;EAO3C,AAFAS,IAAatH,GAAqBqH,GAAUzB,GAAW0B,CAAU,GAE7DA,EAAUC,SAAU,MAEtBJ,GAAe,GAKfD,GAAyBI,GAAY1B,GAAWyB,CAAQ,GAKxDZ,EAAsB/C,GAFDxD,GAA4BoH,GAAYD,CAEhCf,CAAY;CAC1C,GACFvF,EAAA,MAAAmG,IAAAnG,EAAA,MAAA0F,GAAA1F,EAAA,MAAAoG,IAAApG,EAAA,MAAA2C,GAAA3C,EAAA,MAAA6E,GAAA7E,EAAA,MAAAqG,MAAAA,KAAArG,EAAA;CAxBH,IAAA0G,KAAqBL,IAgCpBM;CAAA,AAAA3G,EAAA,QAAA0F,KAAA1F,EAAA,QAAA2C,KAAA3C,EAAA,QAAAM,KAGCqG,MAAAC,MAAA;EACE,IAAA,EAAAC,iBAAsBD;EACtB,IAAIC,KAAa,SACflG,GAAiBkG,CAAS,GAEtBlE,KAAS,QAAQrC,KAAa,OAAI;GACpC,IAAAwG,IAA8BvK,GAC5BsK,GACAlE,CACF;GAEA+C,EAAsB/C,GAAO,CAC3B;IAAAoD,MACQ;IAAezF,WACVA,EAASyG,SAAU;IAACF,WACpBC;GACb,CAAC,CACF;EAAC;CAEL,GACF9G,EAAA,MAAA0F,GAAA1F,EAAA,MAAA2C,GAAA3C,EAAA,MAAAM,GAAAN,EAAA,MAAA2G,MAAAA,KAAA3G,EAAA;CArBH,IAAAgH,KAA8BL,IAuB7BM;CAAA,AAAAjH,EAAA,QAAA8B,OAAAC,IAAA,2BAAA,KAGCkF,MAAAC,GAAAC,MAAA;EACEtG,EAAOmB,SAAuB4B,cAAC;GAAAwD,KAAOD;GAAQE,KAAOH;EAAS,CAAC;CAAC,GACjElH,EAAA,MAAAiH,MAAAA,KAAAjH,EAAA;CAHH,IAAAsH,KAA6BL;CAO7B,IAAI,CAACjG,MAAD,CAAeD,IAAUwG,aAAa;EAAA,IAAAC;EACL,OADKxH,EAAA,QAAA8B,OAAAC,IAAA,2BAAA,KACjCyF,IAAA,kBAAC,IAAD,CAAyB,CAAA,GAAGxH,EAAA,MAAAwH,KAAAA,IAAAxH,EAAA,KAA5BwH;CAA4B;CACpC,IAAAA;CAAA,AAAAxH,EAAA,QAAA8B,OAAAC,IAAA,2BAAA,KAKiByF,KAAA;EAAAC,IAAM;EAAEC,IAAM;CAAE,GAAC1H,EAAA,MAAAwH,MAAAA,KAAAxH,EAAA;CAAA,IAAA2H;CAAA,AAAA3H,EAAA,QAAAT,IAOtBoI,IAAA3H,EAAA,OAPP2H,IAAA,kBAAC,GAAD;EAAY,MAAAH;YACV,kBAAC,IAAD;GACO5G,KAAAA;GACYP,iBAAAA;GACAE,iBAAAA;GACXhB,MAAAA;EAAa,CAAA;CALlB,CAAA,GAOES,EAAA,MAAAT,GAAAS,EAAA,MAAA2H;CAAA,IAAAC;CAAA,AAAA5H,EAAA,QAAA8B,OAAAC,IAAA,2BAAA,KAEK6F,IAAA;EAAAH,IAAM;EAAEC,IAAM;CAAE,GAAC1H,EAAA,MAAA4H,KAAAA,IAAA5H,EAAA;CAAA,IAAA6H;CAAA,AAAA7H,EAAA,QAAA0E,MAAA1E,EAAA,QAAAuC,KAAAvC,EAAA,QAAA8C,KAAA9C,EAAA,QAAAM,KAAAN,EAAA,QAAAqB,KAAArB,EAAA,QAAAI,GAAA0H,qBAAA9H,EAAA,QAAAI,GAAAP,aAAAG,EAAA,QAAAI,GAAA2D,kBAAA/D,EAAA,QAAAT,KAC1BsI,IAAAtI,KACC,kBAAA,OAAA,EAAA,UAAA;EACE,kBAAA,KAAA,EAAA,UAAA,CAAG,gBAAaa,GAAOP,aAAP,oBAA+C,EAAA,CAAA;EAC/D,kBAAA,KAAA,EAAA,UAAA,CAAG,gBAAaS,KAAA,oBAAsC,EAAA,CAAA;EACtD,kBAAA,KAAA,EAAA,UAAA;GAAG;GACiB;GACjBF,GAAO2D,kBAAP;EACC,EAAA,CAAA;EACJ,kBAAA,KAAA,EAAA,UAAA;GAAG;GACgB;GAChB3D,GAAO0H,qBAAP;EACC,EAAA,CAAA;EACJ,kBAAA,KAAA,EAAA,UAAA;GAAG;GACc;GACdhF,IACGA,EAAYiF,UAAW,GAAG,EAAE,KAC3BjF,EAAY0D,SAAU,KACnB,UACA1D,EAAYiF,UAAWjF,EAAY0D,SAAU,EAAE,IAFlD,MAFJ;EAOC,EAAA,CAAA;EACJ,kBAAA,KAAA,EAAA,UAAA;GAAG;GACiB;GAClB,kBAAA,QAAA;IAAa,OAAA,EAAAwB,OAASzF,IAAA,UAAA,MAA8B;cACjDmC;GACI,CAAA;EACL,EAAA,CAAA;EACJ,kBAAA,KAAA,EAAA,iBACI;GACA,IAAAuD,IAA0B5G,EAAQ6G,OAAQC,EAAkB;GAAC,OAE3D,kBAAA,IAAA,EAAA,UAAA;IAAE;IACqBF,EAAiBzB;IAAQ;IAAG;IAChDnF,EAAQmF;IAAQ;IAAS;IACzByB,EAAiBzB,WAAY,IAA7B,SAEGyB,EAAiBG,KAAKC,GAAAC,MACpB,kBAAC,IAAD;KAGI,OAAA,kBAAA,OAAA;MAAY,OAAA;OAAAE,QAAU;OAACC,UAAY;MAAO;gBACvCC,KAAIC,UAAWJ,GAAG,MAAM,CAAC;KACtB,CAAA;eAGR,kBAAA,QAAA;MACS,OAAA;OAAAK,QACG;OAASC,gBACD;MAClB;gBAJF,CAMGN,EAACjI,WACDgI,IAAIL,EAAiBzB,SAAU,IAA/B,OAAA,EACI;;IAhBD,GACD+B,EAACjI,SADA,CAkBT;GAAC,EAAA,CAAA;EACL,GAEJ,EACD,CAAA;CACA,EAAA,CAAA,GACPN,EAAA,MAAA0E,IAAA1E,EAAA,MAAAuC,GAAAvC,EAAA,MAAA8C,GAAA9C,EAAA,MAAAM,GAAAN,EAAA,MAAAqB,GAAArB,EAAA,MAAAI,GAAA0H,mBAAA9H,EAAA,MAAAI,GAAAP,WAAAG,EAAA,MAAAI,GAAA2D,gBAAA/D,EAAA,MAAAT,GAAAS,EAAA,MAAA6H,KAAAA,IAAA7H,EAAA;CAAA,IAAA8I;CAAA,AAAA9I,EAAA,QAAA6H,IACIiB,IAAA9I,EAAA,OAhEP8I,IAAA,kBAAC,GAAD;EAAY,MAAAlB;YACTC;CADE,CAAA,GAgEE7H,EAAA,MAAA6H,GAAA7H,EAAA,MAAA8I;CAAA,IAAAC;CAAA,AAAA/I,EAAA,QAAAV,KAAAU,EAAA,QAAAQ,MAAAR,EAAA,QAAA+E,MAAA/E,EAAA,QAAAmE,KAAAnE,EAAA,QAAA0G,MAAA1G,EAAA,QAAAgH,MAAAhH,EAAA,QAAAyC,KAAAzC,EAAA,QAAA+C,KAAA/C,EAAA,QAAAuC,KAAAvC,EAAA,QAAA0C,MAAA1C,EAAA,QAAA6D,MAAA7D,EAAA,QAAAU,MAAAV,EAAA,QAAA2C,KAAA3C,EAAA,QAAA4C,GAAAoG,eAAAhJ,EAAA,QAAA4C,GAAAqG,eAAAjJ,EAAA,QAAA8C,KAAA9C,EAAA,QAAAkG,MAAAlG,EAAA,QAAA2E,MAAA3E,EAAA,QAAAM,KAAAN,EAAA,QAAA6E,KAAA7E,EAAA,QAAAyE,KAAAzE,EAAA,QAAAI,KAAAJ,EAAA,QAAAT,KAAAS,EAAA,SAAAiG,MAAAjG,EAAA,SAAAsE,MAENyE,IAAA3I,KAAA,kBAAA,IAAA,EAAA,UAAA;EAGI,CAAC2C,KACA,kBAAC,GAAD;GAAY,MAAA;aAAZ,CACE,kBAAA,MAAA,EAAA,UAAI,qBAAuB,CAAA,GAC3B,kBAAA,OAAA;IAAY,OAAA,EAAAmG,cAAgB,OAAO;cAAnC;KACG,CAAC9I,KAAW,kBAAA,KAAA,EAAA,UAAG,2BAA4B,CAAA;KAC3CA,KAAA,CAAYE,KAAa,kBAAA,KAAA,EAAA,UAAG,+BAAgC,CAAA;KAC5DF,KAAAE,KAAA,CAAyBwC,KACxB,kBAAA,KAAA,EAAA,UAAG,oCAAqC,CAAA;KAEzC1C,KAAAE,KAAAwC,KAAA,CAAyCP,KACxC,kBAAA,KAAA,EAAA,UAAG,0BAA2B,CAAA;KAE/BA,KAAA,CAAgBE,KACf,kBAAA,KAAA,EAAA,UAAG,wBAAyB,CAAA;KAE9B,kBAAC,IAAD;MAAwB,SAAA;MAAY,SAAA;KAAC,CAAA;IACjC;KAfH;;EAmBNM,KAAA,kBAAA,IAAA,EAAA,UAAA;GAEG,kBAAC,GAAD;IAAY,MAAA;cACV,kBAAC,IAAD;KACa8B;KACE,aAAAjC,GAAaoG,eAAb,CAAA;KACA,aAAApG,GAAaqG,eAAb,CAAA;KACK3B,kBAAAA;KACP,WAAA,CAAC7E;IAAuB,CAAA;GANlC,CAAA;GASL,kBAAC,GAAD;IAAY,MAAA;cACV,kBAAC,IAAD;KACa,WAAA;KACF,SAAA;KACL,IAAA,EAAA0G,gBAAkB,WAAW;eAHnC;MAKE,kBAAC,IAAD;OACU,SAAA;OACG,WAAA,kBAAC,IAAD,CAAY,CAAA;OAClB,MAAA;OACE,QAAA;OACH,KAAA;OACA,IAAA,EAAAC,IAAM,OAAO;iBAClB;MAPc,CAAA;OAUb,CAAC3G,KAADC,OACA,kBAAC,IAAD;OACM,IAAA;QAAA2G,SACO;QAAMC,YACH;QAAQC,KACf;OACP;iBALF,CAOE,kBAAC,GAAD;QAAsB,MAAA;QAAW,QAAA;OAAG,CAAA,GACpC,kBAAC,IAAD;QAAoB,SAAA;QAAgB,OAAA;kBACjC9G,IAAA,aAAA;OADQ,CAAA,CART;;MAaLwD;MACAC;MACD,kBAAC,IAAD;OACW,SAAA;OACA,eAAMzF,GAAY,EAAI;OACpB,WAAA,kBAAC,IAAD,CAAgB,CAAA;iBAC5B;MAJc,CAAA;MAOf,kBAAC,IAAD;OACuBnB;OACfkB,MAAAA;OACG,eAAMC,GAAY,EAAK;OACjB,eAAAL,EAAOP;OACNS,gBAAAA;OACJ,aAAA;MAAO,CAAA;MAEpBF,EAAO2D,kBACN,kBAAC,IAAD;OACkB,gBAAA3D,EAAO2D;OACR,eAAA3D,EAAOP;MAAU,CAAA;MAGnCO,EAAOP,aACN,kBAAC,IAAD;OACiB,eAAAO,EAAOP;OAEpB,UAAA,WAAWO,EAAO2D,kBAAP;MAAmC,CAAA;MAInD3D,EAAO2D,kBACN,kBAAC,IAAD,EAAuC3D,aAAAA,EAAO,CAAA;KA7D5C;;GADH,CAAA;GAkEL,kBAAC,GAAD;IAAY,MAAA;cACV,kBAAC,IAAD;KACWS;KACEkE,WAAAA;KACE,aAAAnC,GAAaoG,eAAb,CAAA;KACA,aAAApG,GAAaqG,eAAb,CAAA;KACSxE;KACRN;KACFN;KACGnD;KACDgG;KACSM;KACLrC;KACPL;IAAS,CAAA;GAbnB,CAAA;EAeE,EAAA,CAAA;EAIV/E,KACC,kBAAC,GAAD;GACQ,MAAA;GACC,OAAA;IAAAiJ,QACG;IAAQgB,SACP;IAAMC,QACP;IAAgBC,WACb;IAAOC,WACP;GACb;aARF,CAUE,kBAAA,MAAA,EAAA,UAAI,QAAU,CAAA,GACbhH,IACC,kBAAC,IAAD,EAA0BA,SAAK,CAAA,IADhC,oBAXE;;CAiBN,EAAA,CAAA,GAEJ3C,EAAA,MAAAV,GAAAU,EAAA,MAAAQ,IAAAR,EAAA,MAAA+E,IAAA/E,EAAA,MAAAmE,GAAAnE,EAAA,MAAA0G,IAAA1G,EAAA,MAAAgH,IAAAhH,EAAA,MAAAyC,GAAAzC,EAAA,MAAA+C,GAAA/C,EAAA,MAAAuC,GAAAvC,EAAA,MAAA0C,IAAA1C,EAAA,MAAA6D,IAAA7D,EAAA,MAAAU,IAAAV,EAAA,MAAA2C,GAAA3C,EAAA,MAAA4C,GAAAoG,aAAAhJ,EAAA,MAAA4C,GAAAqG,aAAAjJ,EAAA,MAAA8C,GAAA9C,EAAA,MAAAkG,IAAAlG,EAAA,MAAA2E,IAAA3E,EAAA,MAAAM,GAAAN,EAAA,MAAA6E,GAAA7E,EAAA,MAAAyE,GAAAzE,EAAA,MAAAI,GAAAJ,EAAA,MAAAT,GAAAS,EAAA,OAAAiG,IAAAjG,EAAA,OAAAsE,IAAAtE,EAAA,OAAA+I,KAAAA,IAAA/I,EAAA;CAAA,IAAA4J;CAEC,OAFD5J,EAAA,SAAA2H,KAAA3H,EAAA,SAAA8I,KAAA9I,EAAA,SAAA+I,KAxNLa,IAAA,kBAAA,OAAA,EAAA,UACE,kBAAC,GAAD;EAAM,WAAA;EAAmB,SAAA;YAAzB;GACEjC;GASAmB;GAkECC;EA5EE;IAyND,CAAA,GAAA/I,EAAA,OAAA2H,GAAA3H,EAAA,OAAA8I,GAAA9I,EAAA,OAAA+I,GAAA/I,EAAA,OAAA4J,KAAAA,IAAA5J,EAAA,MA1NN4J;AA0NM;AArfV,SAAAzB,GAAAI,GAAA;CAAA,OAqUiEA,EAAChG;AAAY;AAoL9E,SAAAsH,EAAAC,GAAA;CAAA,IAAA9J,IAAAC,GAAA,CAAA,GAAAF;CAI2B,OAJ3BC,EAAA,OAAA8J,IAI2B/J,IAAAC,EAAA,MAFvBD,IAAA,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAiB,GAAK+J,EAAK,CAAA,EADR,CAAA,GAEE9J,EAAA,KAAA8J,GAAA9J,EAAA,KAAAD,IAFvBA;AAEuB"}
1
+ {"version":3,"file":"SynapseGrid.js","names":["CertificationRequirement","ExportCsvFromGridButton","GridMenuButton","ReorderColumnsButton","UploadCsvToGridButton","useGetSchemaForGrid","SyncGridWithSourceButton","computeReplicaSelectionModel","modelRowsToGrid","SynapseErrorBoundary","SkeletonTable","useGetCurrentUserBundle","useListGridReplicas","useGetEntity","getSchemaPropertiesInfo","HelpOutline","Box","Stack","Tooltip","Typography","Grid","DataSheetGridRef","SelectionWithId","CreateGridRequest","GridSession","ClickableJsonCrdt","Ref","useCallback","useEffect","useImperativeHandle","useMemo","useRef","useState","useErrorHandler","SynapseSpinner","GridAgentChat","ValidationAlert","DataGrid","DataGridRow","GridModel","Operation","useGridReplicaUsers","useGridUndoRedo","useRemoteSelections","StartGridSession","StartGridSessionHandle","useDataGridWebSocket","applyModelChange","ModelChange","removeNoOpOperations","enrichRowsWithChangeInfo","mapOperationsToModelChanges","CurieAvatarHead","SynapseGridProps","agentRegistrationId","showDebugInfo","ref","SynapseGridHandle","initializeGrid","request","loadExistingSession","sessionId","SynapseGridInner","t0","$","_c","t1","undefined","session","setSession","replicaId","setReplicaId","chatOpen","setChatOpen","lastSelection","setLastSelection","startGridSessionRef","gridRef","data","userBundle","isLoading","t2","refetch","refetchReplicas","t3","replicas","t4","handleReplicaConnectionChange","currentUserId","userId","String","replicaUserMap","t5","t6","Symbol","for","current","handleStartSession","handleLoadSession","t7","onGridReady","onReplicaConnected","onReplicaDisconnected","isConnected","websocketInstance","hasCompletedInitialSync","isSyncing","model","modelSnapshot","connect","presignedUrl","hasSufficientData","websocketError","websocketInstanceRef","t8","t9","lastConnectParamsRef","t10","nextParams","prevParams","t11","t12","t13","t14","setActiveCell","jsonSchema","t15","sourceEntityId","t16","enabled","entityData","entityIsView","concreteType","t17","upsertKey","t18","t19","schemaPropertiesInfo","connectionStatus","remoteSelections","t20","rowValues","t21","enrichedRowValues","t22","sendPatch","commit","t23","t24","t25","model_0","modelChanges","forEach","change","applyAndCommitChanges","t26","change_0","console","error","type","applyModelChangeFromUndoRedo","undoUI","redoUI","addOperationsToUndoStack","clearRedoStack","t27","newValue","operations","length","modelChanges_0","handleChange","t28","opts","selection","replicaSelectionModel","toString","handleSelectionChange","t29","rowIndex","colIndex","col","row","handleNavigateToCell","t30","newColumnOrder","handleReorderColumns","isCertified","t31","xs","xl","t32","t33","t34","gridJsonSchema$Id","substring","color","connectedReplicas","filter","_temp","map","r_0","i","r","margin","fontSize","JSON","stringify","cursor","textDecoration","t35","t36","columnNames","columnOrder","marginBottom","justifyContent","display","alignItems","gap","mr","padding","border","maxHeight","overflowY","t37","SynapseGrid","props"],"sources":["../../../src/components/DataGrid/SynapseGrid.tsx"],"sourcesContent":["import CertificationRequirement from '@/components/AccessRequirementList/RequirementItem/CertificationRequirement'\nimport ExportCsvFromGridButton from '@/components/DataGrid/components/ExportCsvFromGridButton'\nimport GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport ReorderColumnsButton from '@/components/DataGrid/components/ReorderColumnsButton'\nimport UploadCsvToGridButton from '@/components/DataGrid/components/UploadCsvToGridButton'\nimport useGetSchemaForGrid from '@/components/DataGrid/hooks/useGetSchemaForGrid'\nimport SyncGridWithSourceButton from '@/components/DataGrid/SyncGridWithSourceButton'\nimport computeReplicaSelectionModel from '@/components/DataGrid/utils/computeReplicaSelectionModel'\nimport modelRowsToGrid from '@/components/DataGrid/utils/modelRowsToGrid'\nimport { SynapseErrorBoundary } from '@/components/error/ErrorBanner'\nimport { SkeletonTable } from '@/components/index'\nimport { useGetCurrentUserBundle } from '@/synapse-queries'\nimport { useListGridReplicas } from '@/synapse-queries/grid/useGridSession'\nimport { useGetEntity } from '@/synapse-queries/index'\nimport { getSchemaPropertiesInfo } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport { HelpOutline } from '@mui/icons-material'\nimport { Box, Stack, Tooltip, Typography } from '@mui/material'\nimport Grid from '@mui/material/Grid'\nimport {\n DataSheetGridRef,\n SelectionWithId,\n} from '@sage-bionetworks/react-datasheet-grid'\nimport {\n CreateGridRequest,\n GridSession,\n} from '@sage-bionetworks/synapse-client'\nimport { ClickableJsonCrdt } from 'clickable-json'\nimport {\n Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport GridAgentChat from '../SynapseChat/GridAgentChat'\nimport { ValidationAlert } from './components/ValidationAlert'\nimport DataGrid from './DataGrid'\nimport { DataGridRow, GridModel, Operation } from './DataGridTypes'\nimport { useGridReplicaUsers } from './hooks/useGridReplicaUsers'\nimport { useGridUndoRedo } from './hooks/useGridUndoRedo'\nimport { useRemoteSelections } from './hooks/useRemoteSelections'\nimport { StartGridSession, StartGridSessionHandle } from './StartGridSession'\nimport { useDataGridWebSocket } from './useDataGridWebsocket'\nimport { applyModelChange, ModelChange } from './utils/applyModelChange'\nimport { removeNoOpOperations } from './utils/DataGridUtils'\nimport { enrichRowsWithChangeInfo } from './utils/enrichRowsWithChangeInfo'\nimport { mapOperationsToModelChanges } from './utils/mapOperationsToModelChanges'\nimport CurieAvatarHead from '@/assets/mui_components/CurieAvatarHead'\n\nexport type SynapseGridProps = {\n agentRegistrationId?: string\n showDebugInfo?: boolean\n ref?: Ref<SynapseGridHandle>\n}\n\nexport type SynapseGridHandle = {\n initializeGrid: (request: CreateGridRequest) => void\n loadExistingSession: (sessionId: string) => void\n}\n\nfunction SynapseGridInner({\n agentRegistrationId,\n showDebugInfo = false,\n ref,\n}: SynapseGridProps) {\n const [session, setSession] = useState<GridSession | null>(null)\n const [replicaId, setReplicaId] = useState<number | null>(null)\n const [chatOpen, setChatOpen] = useState(false)\n const [lastSelection, setLastSelection] = useState<SelectionWithId | null>(\n null,\n )\n\n const startGridSessionRef = useRef<StartGridSessionHandle | null>(null)\n const gridRef = useRef<DataSheetGridRef | null>(null)\n\n const { data: userBundle, isLoading } = useGetCurrentUserBundle()\n\n const { data: replicas = [], refetch: refetchReplicas } = useListGridReplicas(\n session?.sessionId,\n )\n\n const handleReplicaConnectionChange = useCallback(() => {\n void refetchReplicas()\n }, [refetchReplicas])\n\n // ── Attribution infrastructure ─────────────────────────────────────────\n const currentUserId =\n userBundle?.userId != null ? String(userBundle.userId) : undefined\n\n const replicaUserMap = useGridReplicaUsers(replicas, replicaId, currentUserId)\n\n useImperativeHandle(\n ref,\n () => ({\n initializeGrid: (request: CreateGridRequest) => {\n if (startGridSessionRef.current) {\n startGridSessionRef.current.handleStartSession(request)\n }\n },\n loadExistingSession: (sessionId: string) => {\n if (startGridSessionRef.current) {\n startGridSessionRef.current.handleLoadSession(sessionId)\n }\n },\n }),\n [],\n )\n\n // WebSocket state\n const {\n isConnected,\n websocketInstance,\n hasCompletedInitialSync,\n isSyncing,\n model,\n modelSnapshot,\n connect,\n presignedUrl,\n hasSufficientData,\n websocketError,\n } = useDataGridWebSocket({\n onGridReady: handleReplicaConnectionChange,\n onReplicaConnected: handleReplicaConnectionChange,\n onReplicaDisconnected: handleReplicaConnectionChange,\n })\n\n useErrorHandler(websocketError)\n\n const websocketInstanceRef = useRef<typeof websocketInstance | null>(null)\n\n useEffect(() => {\n websocketInstanceRef.current = websocketInstance\n }, [websocketInstance])\n\n // Track last connection parameters to avoid redundant connections\n const lastConnectParamsRef = useRef<{\n replicaId: number\n sessionId: string\n } | null>(null)\n\n useEffect(() => {\n if (replicaId === null || replicaId === undefined || !session?.sessionId) {\n lastConnectParamsRef.current = null\n return\n }\n\n const nextParams = {\n replicaId,\n sessionId: session.sessionId,\n }\n\n const prevParams = lastConnectParamsRef.current\n\n if (\n prevParams &&\n prevParams.replicaId === nextParams.replicaId &&\n prevParams.sessionId === nextParams.sessionId\n ) {\n return\n }\n\n lastConnectParamsRef.current = nextParams\n connect(replicaId, session.sessionId)\n }, [replicaId, session?.sessionId, connect])\n\n // Reset grid state when model is reset (new session/replica)\n useEffect(() => {\n if (model === null) {\n // Clear any grid-specific state when starting a new session\n setLastSelection(null)\n // Clear active cell if grid exists\n if (gridRef.current) {\n gridRef.current.setActiveCell(null)\n }\n }\n }, [model])\n\n const jsonSchema = useGetSchemaForGrid(session)\n\n // Grid behaves differently for views vs recordSets\n // Note for future: can get modifiedOn to refresh grid when view changes\n const { data: entityData } = useGetEntity(\n session?.sourceEntityId,\n undefined,\n {\n enabled: !!session?.sourceEntityId,\n },\n )\n\n const entityIsView =\n entityData?.concreteType ===\n 'org.sagebionetworks.repo.model.table.EntityView'\n\n // If grid source entity is a recordSet, get its upsert key(s)\n // from the entity bundle\n const upsertKey = !entityIsView\n ? (entityData as { upsertKey?: string[] } | undefined)?.upsertKey\n : []\n\n // Process schema properties once\n const schemaPropertiesInfo = useMemo(() => {\n return getSchemaPropertiesInfo(jsonSchema ?? null)\n }, [jsonSchema])\n\n const connectionStatus = isConnected ? 'Connected' : 'Disconnected'\n\n const remoteSelections = useRemoteSelections(\n modelSnapshot,\n model,\n replicas,\n replicaId,\n )\n\n // Transform the model view rows and columns to DataSheetGrid format\n const rowValues = useMemo(\n () => (modelSnapshot ? modelRowsToGrid(model, modelSnapshot) : []),\n [model, modelSnapshot],\n )\n\n // Enrich rows with per-cell change attribution for CSS indicators and tooltips\n const enrichedRowValues = useMemo(\n () =>\n enrichRowsWithChangeInfo(rowValues, model, modelSnapshot, replicaUserMap),\n [rowValues, model, modelSnapshot, replicaUserMap],\n )\n\n const commit = useCallback(() => {\n if (!isConnected || !websocketInstanceRef.current) {\n return\n }\n\n websocketInstanceRef.current.sendPatch()\n }, [isConnected, websocketInstanceRef])\n\n useEffect(() => {\n if (isConnected) {\n commit()\n }\n }, [isConnected, commit])\n\n const applyAndCommitChanges = useCallback(\n (model: GridModel, modelChanges: ModelChange[]) => {\n // Apply each change to the model\n modelChanges.forEach(change => {\n applyModelChange(model, change, schemaPropertiesInfo)\n })\n\n commit()\n },\n [commit, schemaPropertiesInfo],\n )\n\n const applyModelChangeFromUndoRedo = useCallback(\n (change: ModelChange) => {\n if (!model) {\n console.error('Model is not initialized')\n return\n }\n\n if (change.type === 'DELETE' && gridRef.current) {\n // The user may have set a cell as active that we are removing with an 'undo'. In that case, clear the active state\n gridRef.current.setActiveCell(null)\n }\n\n applyAndCommitChanges(model, [change])\n },\n [model, applyAndCommitChanges],\n )\n\n const { undoUI, redoUI, addOperationsToUndoStack, clearRedoStack } =\n useGridUndoRedo(applyModelChangeFromUndoRedo)\n\n const handleChange = useCallback(\n (newValue: DataGridRow[], operations: Operation[]) => {\n if (!model) {\n console.error('Model is not initialized')\n return\n }\n\n // Check that something changed before updating the model\n operations = removeNoOpOperations(newValue, rowValues, operations)\n\n if (operations.length > 0) {\n // Clear redo stack since new changes invalidate redo history\n clearRedoStack()\n\n // Track row creation, updates, and deletions to keep UI state and undo history in sync\n\n // Add all operations to the undo stack\n addOperationsToUndoStack(operations, rowValues, newValue)\n\n // Transform operations to model changes\n const modelChanges = mapOperationsToModelChanges(operations, newValue)\n\n applyAndCommitChanges(model, modelChanges)\n }\n },\n [\n model,\n rowValues,\n clearRedoStack,\n addOperationsToUndoStack,\n applyAndCommitChanges,\n ],\n )\n\n const handleSelectionChange = useCallback(\n (opts: { selection: SelectionWithId | null }) => {\n const { selection } = opts\n if (selection != null) {\n setLastSelection(selection)\n\n if (model != null && replicaId != null) {\n const replicaSelectionModel = computeReplicaSelectionModel(\n selection,\n model,\n )\n // insert it into the CRDT Model\n applyAndCommitChanges(model, [\n {\n type: 'SET_SELECTION',\n replicaId: replicaId.toString(),\n selection: replicaSelectionModel,\n },\n ])\n }\n }\n },\n [applyAndCommitChanges, model, replicaId],\n )\n\n const handleNavigateToCell = useCallback(\n (rowIndex: number, colIndex: number) => {\n gridRef.current?.setActiveCell({ col: colIndex, row: rowIndex })\n },\n [],\n )\n\n const handleReorderColumns = useCallback(\n (newColumnOrder: number[]) => {\n if (!model) return\n applyAndCommitChanges(model, [\n { type: 'REORDER_COLUMNS', newColumnOrder },\n ])\n },\n [model, applyAndCommitChanges],\n )\n\n if (!isLoading && !userBundle?.isCertified) {\n return <CertificationRequirement />\n }\n\n return (\n <div>\n <Grid container spacing={2}>\n <Grid size={{ xs: 12, xl: 8 }}>\n <StartGridSession\n ref={startGridSessionRef}\n onSessionChange={setSession}\n onReplicaChange={setReplicaId}\n show={showDebugInfo}\n />\n </Grid>\n {/* Debug Information */}\n <Grid size={{ xs: 12, xl: 4 }}>\n {showDebugInfo && (\n <div>\n <p>Session ID: {session?.sessionId || 'No session created'}</p>\n <p>Replica ID: {replicaId || 'No replica created'}</p>\n <p>\n Source Entity ID:{' '}\n {session?.sourceEntityId || 'No source entity'}\n </p>\n <p>\n JSON Schema $id:{' '}\n {session?.gridJsonSchema$Id || 'No schema attached to session'}\n </p>\n <p>\n Presigned URL:{' '}\n {presignedUrl\n ? presignedUrl.substring(0, 30) +\n (presignedUrl.length > 30\n ? ' ... ' +\n presignedUrl.substring(presignedUrl.length - 10)\n : '')\n : 'No URL generated'}\n </p>\n <p>\n WebSocket Status:{' '}\n <span style={{ color: isConnected ? 'green' : 'red' }}>\n {connectionStatus}\n </span>\n </p>\n <p>\n {(() => {\n const connectedReplicas = replicas.filter(r => r.isConnected)\n return (\n <>\n Connected Replicas ({connectedReplicas.length} /{' '}\n {replicas.length} total):{' '}\n {connectedReplicas.length === 0\n ? 'none'\n : connectedReplicas.map((r, i) => (\n <Tooltip\n key={r.replicaId}\n title={\n <pre style={{ margin: 0, fontSize: '11px' }}>\n {JSON.stringify(r, null, 2)}\n </pre>\n }\n >\n <span\n style={{\n cursor: 'pointer',\n textDecoration: 'underline dotted',\n }}\n >\n {r.replicaId}\n {i < connectedReplicas.length - 1 ? ', ' : ''}\n </span>\n </Tooltip>\n ))}\n </>\n )\n })()}\n </p>\n </div>\n )}\n </Grid>\n\n {session && (\n <>\n {/* Grid Loading State */}\n {!hasSufficientData && (\n <Grid size={12}>\n <h3>Setting up grid...</h3>\n <div style={{ marginBottom: '10px' }}>\n {!session && <p>Creating grid session...</p>}\n {session && !replicaId && <p>Setting up real-time sync...</p>}\n {session && replicaId && !presignedUrl && (\n <p>Establishing secure connection...</p>\n )}\n {session && replicaId && presignedUrl && !isConnected && (\n <p>Connecting to server...</p>\n )}\n {isConnected && !hasCompletedInitialSync && (\n <p>Loading table data...</p>\n )}\n <SkeletonTable numRows={4} numCols={1} />\n </div>\n </Grid>\n )}\n {/* Grid */}\n {hasSufficientData && (\n <>\n <Grid size={12}>\n <ValidationAlert\n rowValues={rowValues}\n columnNames={modelSnapshot?.columnNames ?? []}\n columnOrder={modelSnapshot?.columnOrder ?? []}\n onNavigateToCell={handleNavigateToCell}\n isLoading={!hasCompletedInitialSync}\n />\n </Grid>\n <Grid size={12}>\n <Stack\n direction={'row'}\n spacing={1}\n sx={{ justifyContent: 'flex-end' }}\n >\n {/* Keep this sync indicator first in the stack, otherwise it will cause other buttons to shift */}\n {(!hasCompletedInitialSync || isSyncing) && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n <SynapseSpinner size={16} margin=\"0\" />\n <Typography variant=\"caption\" color=\"text.secondary\">\n {hasCompletedInitialSync ? 'Syncing…' : 'Loading…'}\n </Typography>\n </Box>\n )}\n <GridMenuButton\n variant=\"outlined\"\n startIcon={<HelpOutline />}\n href=\"https://docs.synapse.org/synapse-docs/managing-metadata-with-curator\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{ mr: 'auto' }}\n >\n Help and Instructions\n </GridMenuButton>\n {undoUI}\n {redoUI}\n <ReorderColumnsButton\n columnNames={modelSnapshot?.columnNames ?? []}\n columnOrder={modelSnapshot?.columnOrder ?? []}\n jsonSchema={jsonSchema}\n upsertKey={upsertKey}\n onReorder={handleReorderColumns}\n />\n <GridMenuButton\n variant={'outlined'}\n onClick={() => setChatOpen(true)}\n startIcon={<CurieAvatarHead />}\n >\n Open Curie\n </GridMenuButton>\n <GridAgentChat\n agentRegistrationId={agentRegistrationId}\n open={chatOpen}\n onClose={() => setChatOpen(false)}\n gridSessionId={session.sessionId!}\n usersReplicaId={replicaId!}\n chatbotName=\"Curie\"\n />\n {session.sourceEntityId && (\n <UploadCsvToGridButton\n sourceEntityId={session.sourceEntityId}\n gridSessionId={session.sessionId!}\n />\n )}\n {session.sessionId && (\n <ExportCsvFromGridButton\n gridSessionId={session.sessionId}\n filename={\n 'grid-' + (session.sourceEntityId || 'export')\n }\n />\n )}\n {session.sourceEntityId && (\n <SyncGridWithSourceButton gridSession={session} />\n )}\n </Stack>\n </Grid>\n <Grid size={12}>\n <DataGrid\n gridRef={gridRef}\n rowValues={enrichedRowValues}\n columnNames={modelSnapshot?.columnNames ?? []}\n columnOrder={modelSnapshot?.columnOrder ?? []}\n schemaPropertiesInfo={schemaPropertiesInfo}\n entityIsView={entityIsView}\n jsonSchema={jsonSchema}\n lastSelection={lastSelection}\n handleChange={handleChange}\n handleSelectionChange={handleSelectionChange}\n remoteSelections={remoteSelections}\n upsertKey={upsertKey}\n />\n </Grid>\n </>\n )}\n {/* Debug Model Snapshot */}\n {showDebugInfo && (\n <Grid\n size={12}\n style={{\n margin: '10px 0',\n padding: '10px',\n border: '1px solid #ccc',\n maxHeight: '400px',\n overflowY: 'auto',\n }}\n >\n <h3>Model</h3>\n {model ? (\n <ClickableJsonCrdt model={model} />\n ) : (\n 'No model available'\n )}\n </Grid>\n )}\n </>\n )}\n </Grid>\n </div>\n )\n}\n\nfunction SynapseGrid(props: SynapseGridProps) {\n return (\n <SynapseErrorBoundary>\n <SynapseGridInner {...props} />\n </SynapseErrorBoundary>\n )\n}\n\nexport default SynapseGrid\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { displayToast as e } from "../ToastMessage/ToastMessage.js";
2
2
  import { convertToEntityType as t } from "../../utils/functions/EntityTypeUtils.js";
3
3
  import { useGetEntity as n } from "../../synapse-queries/entity/useEntity.js";
4
- import { useGetSchemaBinding as r } from "../../synapse-queries/entity/useEntityBoundSchema.js";
5
- import { useGetFeatureFlag as i } from "../../synapse-queries/featureflags/useGetFeatureFlag.js";
4
+ import { useGetFeatureFlag as r } from "../../synapse-queries/featureflags/useGetFeatureFlag.js";
6
5
  import "../../synapse-queries/featureflags/index.js";
6
+ import { useGetSchemaBinding as i } from "../../synapse-queries/jsonschema/useEntityBoundSchema.js";
7
7
  import "../../synapse-queries/index.js";
8
8
  import { FeatureFlagEnum as a } from "../../utils/featureflag/FeatureFlags.js";
9
9
  import "../index.js";
@@ -18,7 +18,7 @@ import { c as _ } from "react/compiler-runtime";
18
18
  function v(e) {
19
19
  let d = _(19), { gridSession: f } = e, { data: p, isLoading: m } = n(f.sourceEntityId), v = !!f.sourceEntityId, w;
20
20
  d[0] === v ? w = d[1] : (w = { enabled: v }, d[0] = v, d[1] = w);
21
- let { data: T, isLoading: E } = r(f.sourceEntityId ?? "", w), D = p?.concreteType ? t(p.concreteType) : void 0, O = i(a.ENABLE_RECORDSET_SYNCHRONIZATION), k;
21
+ let { data: T, isLoading: E } = i(f.sourceEntityId ?? "", w), D = p?.concreteType ? t(p.concreteType) : void 0, O = r(a.ENABLE_RECORDSET_SYNCHRONIZATION), k;
22
22
  d[2] === Symbol.for("react.memo_cache_sentinel") ? (k = {
23
23
  onSuccess: b,
24
24
  onError: y
@@ -1 +1 @@
1
- {"version":3,"file":"SyncGridWithSourceButton.js","names":["GridMenuButton","useMergeGridWithSource","MergeGridWithSource","displayToast","useGetEntity","useGetSchemaBinding","useGetFeatureFlag","FeatureFlagEnum","convertToEntityType","CloudDownloadTwoTone","CloudSyncTwoTone","Skeleton","Tooltip","Entity","EntityType","EntityUpdateResults","GridSession","instanceOfEntityUpdateResults","instanceOfRecordSet","instanceOfUploadToTableResult","JsonSchemaObjectBinding","SynchronizeGridResponse","TableUpdateTransactionResponse","SyncType","SyncGridWithSourceButtonProps","gridSession","SyncGridWithSourceButton","props","$","_c","data","entity","isLoading","entityLoading","sourceEntityId","t0","t1","enabled","sourceEntitySchemaBinding","schemaBindingIsLoading","sourceEntityType","concreteType","undefined","enableRecordSetSync","ENABLE_RECORDSET_SYNCHRONIZATION","t2","Symbol","for","onSuccess","_temp","onError","_temp2","mutate","mergeGrid","isPending","shouldPull","shouldPullBeforePush","buttonText","tooltipText","getSyncButtonLabels","isLoadingPrerequisiteData","t3","t4","buildMergeGridVariables","t5","t6","e","message","result","variables","bb14","type","onSynchronizeSuccess","syncType","onMergeTableSuccess","sourceEntity","isPullSupported","isSourceEntityUpdated","sourceEntityVersionNumber","versionNumber","isSchemaBindingUpdated","gridJsonSchema$Id","jsonSchemaVersionInfo","$id","table","recordset","gridSessionId","sessionId","errorMessages","length","map","msg","index","title","results","updateResult","failureMessages","getEntityUpdateResultsErrorMessages","join","rowsUpdatedStr","rowsProcessed","toLocaleString","updateResults","filter","failureCode","r","entityId","failureMessage"],"sources":["../../../src/components/DataGrid/SyncGridWithSourceButton.tsx"],"sourcesContent":["import GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport useMergeGridWithSource, {\n MergeGridWithSource,\n} from '@/components/DataGrid/useMergeGridWithSource'\nimport { displayToast } from '@/components/index'\nimport { useGetEntity } from '@/synapse-queries'\nimport { useGetSchemaBinding } from '@/synapse-queries/entity/useEntityBoundSchema'\nimport { useGetFeatureFlag } from '@/synapse-queries/featureflags'\nimport { FeatureFlagEnum } from '@/utils/featureflag/FeatureFlags'\nimport { convertToEntityType } from '@/utils/functions/EntityTypeUtils'\nimport { CloudDownloadTwoTone, CloudSyncTwoTone } from '@mui/icons-material'\nimport { Skeleton, Tooltip } from '@mui/material'\nimport {\n Entity,\n EntityType,\n EntityUpdateResults,\n GridSession,\n instanceOfEntityUpdateResults,\n instanceOfRecordSet,\n instanceOfUploadToTableResult,\n JsonSchemaObjectBinding,\n SynchronizeGridResponse,\n TableUpdateTransactionResponse,\n} from '@sage-bionetworks/synapse-client'\nimport { SyncType } from '@sage-bionetworks/synapse-client/generated/models/SyncType'\n\nexport type SyncGridWithSourceButtonProps = {\n gridSession: GridSession\n}\n\nexport default function SyncGridWithSourceButton(\n props: SyncGridWithSourceButtonProps,\n) {\n const { gridSession } = props\n\n const { data: entity, isLoading: entityLoading } = useGetEntity(\n gridSession.sourceEntityId,\n )\n\n const { data: sourceEntitySchemaBinding, isLoading: schemaBindingIsLoading } =\n useGetSchemaBinding(gridSession.sourceEntityId ?? '', {\n enabled: !!gridSession.sourceEntityId,\n })\n\n const sourceEntityType = entity?.concreteType\n ? convertToEntityType(entity.concreteType)\n : undefined\n\n const enableRecordSetSync = useGetFeatureFlag(\n FeatureFlagEnum.ENABLE_RECORDSET_SYNCHRONIZATION,\n )\n\n const { mutate: mergeGrid, isPending } = useMergeGridWithSource({\n onSuccess: (result, variables) => {\n switch (result.type) {\n case 'synchronize':\n onSynchronizeSuccess(result.data, variables.syncType)\n break\n case 'tableUpdateTransaction':\n onMergeTableSuccess(result.data)\n break\n case 'recordset_overwrite':\n displayToast('Successfully updated RecordSet.', 'success')\n break\n default:\n result satisfies never\n }\n },\n onError: e => displayToast(e.message, 'danger'),\n })\n\n // At this time, only RecordSet sync supports PULL.\n // If the RecordSet source or JSON Schema has been updated since this grid was created,\n // we have the user PULL the latest changes before enabling a full PULL_PUSH, so they\n // have an opportunity to handle and fix unexpected merge outcomes.\n const shouldPull =\n enableRecordSetSync &&\n entity !== undefined &&\n sourceEntitySchemaBinding !== undefined &&\n shouldPullBeforePush(gridSession, entity, sourceEntitySchemaBinding)\n\n const { buttonText, tooltipText } = getSyncButtonLabels(\n shouldPull,\n sourceEntityType,\n enableRecordSetSync,\n )\n\n const isLoadingPrerequisiteData = entityLoading || schemaBindingIsLoading\n\n if (isLoadingPrerequisiteData) {\n return <Skeleton width=\"100px\" />\n }\n\n return (\n <Tooltip title={tooltipText} describeChild>\n <GridMenuButton\n startIcon={shouldPull ? <CloudDownloadTwoTone /> : <CloudSyncTwoTone />}\n loading={isPending}\n onClick={() => {\n mergeGrid(\n buildMergeGridVariables(gridSession, sourceEntityType, shouldPull),\n )\n }}\n variant=\"contained\"\n >\n {buttonText}\n </GridMenuButton>\n </Tooltip>\n )\n}\n\n/**\n * If the source data or JSON Schema has been updated since this grid was created, we have\n * the user PULL the latest changes before enabling a full PULL_PUSH, so they have an\n * opportunity to handle unexpected merge outcomes.\n *\n * This only applies to source types that support the PULL SyncType.\n *\n * @param gridSession The grid session to check.\n * @param sourceEntity The source entity to check.\n * @param sourceEntitySchemaBinding The source entity's schema binding to check.\n * @returns True if the user should PULL before PULL_PUSH, false otherwise.\n */\nexport function shouldPullBeforePush(\n gridSession: GridSession,\n sourceEntity: Entity | null,\n sourceEntitySchemaBinding: JsonSchemaObjectBinding | null,\n): boolean {\n // Currently, only RecordSet supports PULL\n const isPullSupported =\n sourceEntity != null && instanceOfRecordSet(sourceEntity)\n if (!isPullSupported) {\n return false\n }\n\n // Guide the user to PULL first if the source was updated since the grid was\n // created/synced, or if the JSON Schema binding has updated.\n const isSourceEntityUpdated =\n gridSession.sourceEntityVersionNumber != null &&\n sourceEntity.versionNumber != null &&\n gridSession.sourceEntityVersionNumber < sourceEntity.versionNumber\n\n const isSchemaBindingUpdated =\n sourceEntitySchemaBinding != null &&\n gridSession.gridJsonSchema$Id !==\n sourceEntitySchemaBinding.jsonSchemaVersionInfo?.$id\n\n return isSourceEntityUpdated || isSchemaBindingUpdated\n}\n\n/**\n * Determines the button label and tooltip copy for the sync button based on whether the\n * user should PULL before PULL_PUSH, and the source entity's type.\n */\nexport function getSyncButtonLabels(\n shouldPull: boolean,\n sourceEntityType: EntityType | undefined,\n enableRecordSetSync: boolean,\n): { buttonText: string; tooltipText: string } {\n if (shouldPull) {\n return {\n buttonText: 'Import latest changes',\n tooltipText:\n 'Imports any recent changes into this Curator session. Your changes will not yet be applied.',\n }\n }\n if (\n sourceEntityType === EntityType.table ||\n (sourceEntityType === EntityType.recordset && !enableRecordSetSync)\n ) {\n return {\n buttonText: 'Apply changes',\n tooltipText:\n 'Applies any changes made in this Curator session to the source',\n }\n }\n return {\n buttonText: 'Sync changes',\n tooltipText:\n 'Applies any changes made in this Curator session, and imports any recent changes into this Curator session.',\n }\n}\n\n/**\n * Builds the variables passed to the merge grid mutation for the given grid session,\n * source entity type, and whether the user should PULL before PULL_PUSH.\n */\nexport function buildMergeGridVariables(\n gridSession: GridSession,\n sourceEntityType: EntityType | undefined,\n shouldPull: boolean,\n): MergeGridWithSource {\n return {\n gridSessionId: gridSession.sessionId!,\n sourceEntityId: gridSession.sourceEntityId!,\n sourceEntityType,\n syncType: shouldPull ? 'PULL' : 'PULL_PUSH',\n }\n}\n\nexport function onSynchronizeSuccess(\n result: SynchronizeGridResponse,\n syncType?: SyncType,\n) {\n if (result.errorMessages == null || result.errorMessages.length === 0) {\n if (syncType === 'PULL') {\n displayToast('Successfully imported latest changes.', 'success')\n } else {\n displayToast('Successfully synchronized changes.', 'success')\n }\n } else {\n displayToast(\n <ul>\n {result.errorMessages.map((msg, index) => (\n <li key={index}>{msg}</li>\n ))}\n </ul>,\n 'warning',\n { title: 'Some changes could not be applied' },\n )\n }\n}\n\nfunction onMergeTableSuccess(result: TableUpdateTransactionResponse) {\n if (result.results?.length) {\n // There should only be one result since the CSV upload is done in one step\n const updateResult = result.results[0]\n if (instanceOfEntityUpdateResults(updateResult)) {\n // This is an update to the contents of a View\n const failureMessages =\n getEntityUpdateResultsErrorMessages(updateResult).join('\\n')\n\n if (failureMessages) {\n displayToast(\n `Some changes could not be applied:\\n${failureMessages}`,\n 'danger',\n )\n } else {\n displayToast('Changes applied successfully', 'success')\n }\n } else if (instanceOfUploadToTableResult(updateResult)) {\n // This is an update to a TableEntity\n const rowsUpdatedStr = updateResult.rowsProcessed?.toLocaleString()\n displayToast(`Successfully updated ${rowsUpdatedStr} rows.`, 'success')\n }\n }\n}\n\nfunction getEntityUpdateResultsErrorMessages(\n results: EntityUpdateResults,\n): string[] {\n return (\n results.updateResults\n ?.filter(e => !!e.failureCode)\n .map(\n r => `${r.entityId}: ${r.failureMessage} (code: ${r.failureCode})`,\n ) ?? []\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SyncGridWithSourceButton.js","names":["GridMenuButton","useMergeGridWithSource","MergeGridWithSource","displayToast","useGetEntity","useGetSchemaBinding","useGetFeatureFlag","FeatureFlagEnum","convertToEntityType","CloudDownloadTwoTone","CloudSyncTwoTone","Skeleton","Tooltip","Entity","EntityType","EntityUpdateResults","GridSession","instanceOfEntityUpdateResults","instanceOfRecordSet","instanceOfUploadToTableResult","JsonSchemaObjectBinding","SynchronizeGridResponse","TableUpdateTransactionResponse","SyncType","SyncGridWithSourceButtonProps","gridSession","SyncGridWithSourceButton","props","$","_c","data","entity","isLoading","entityLoading","sourceEntityId","t0","t1","enabled","sourceEntitySchemaBinding","schemaBindingIsLoading","sourceEntityType","concreteType","undefined","enableRecordSetSync","ENABLE_RECORDSET_SYNCHRONIZATION","t2","Symbol","for","onSuccess","_temp","onError","_temp2","mutate","mergeGrid","isPending","shouldPull","shouldPullBeforePush","buttonText","tooltipText","getSyncButtonLabels","isLoadingPrerequisiteData","t3","t4","buildMergeGridVariables","t5","t6","e","message","result","variables","bb14","type","onSynchronizeSuccess","syncType","onMergeTableSuccess","sourceEntity","isPullSupported","isSourceEntityUpdated","sourceEntityVersionNumber","versionNumber","isSchemaBindingUpdated","gridJsonSchema$Id","jsonSchemaVersionInfo","$id","table","recordset","gridSessionId","sessionId","errorMessages","length","map","msg","index","title","results","updateResult","failureMessages","getEntityUpdateResultsErrorMessages","join","rowsUpdatedStr","rowsProcessed","toLocaleString","updateResults","filter","failureCode","r","entityId","failureMessage"],"sources":["../../../src/components/DataGrid/SyncGridWithSourceButton.tsx"],"sourcesContent":["import GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport useMergeGridWithSource, {\n MergeGridWithSource,\n} from '@/components/DataGrid/useMergeGridWithSource'\nimport { displayToast } from '@/components/index'\nimport { useGetEntity } from '@/synapse-queries'\nimport { useGetSchemaBinding } from '@/synapse-queries/jsonschema/useEntityBoundSchema'\nimport { useGetFeatureFlag } from '@/synapse-queries/featureflags'\nimport { FeatureFlagEnum } from '@/utils/featureflag/FeatureFlags'\nimport { convertToEntityType } from '@/utils/functions/EntityTypeUtils'\nimport { CloudDownloadTwoTone, CloudSyncTwoTone } from '@mui/icons-material'\nimport { Skeleton, Tooltip } from '@mui/material'\nimport {\n Entity,\n EntityType,\n EntityUpdateResults,\n GridSession,\n instanceOfEntityUpdateResults,\n instanceOfRecordSet,\n instanceOfUploadToTableResult,\n JsonSchemaObjectBinding,\n SynchronizeGridResponse,\n TableUpdateTransactionResponse,\n} from '@sage-bionetworks/synapse-client'\nimport { SyncType } from '@sage-bionetworks/synapse-client/generated/models/SyncType'\n\nexport type SyncGridWithSourceButtonProps = {\n gridSession: GridSession\n}\n\nexport default function SyncGridWithSourceButton(\n props: SyncGridWithSourceButtonProps,\n) {\n const { gridSession } = props\n\n const { data: entity, isLoading: entityLoading } = useGetEntity(\n gridSession.sourceEntityId,\n )\n\n const { data: sourceEntitySchemaBinding, isLoading: schemaBindingIsLoading } =\n useGetSchemaBinding(gridSession.sourceEntityId ?? '', {\n enabled: !!gridSession.sourceEntityId,\n })\n\n const sourceEntityType = entity?.concreteType\n ? convertToEntityType(entity.concreteType)\n : undefined\n\n const enableRecordSetSync = useGetFeatureFlag(\n FeatureFlagEnum.ENABLE_RECORDSET_SYNCHRONIZATION,\n )\n\n const { mutate: mergeGrid, isPending } = useMergeGridWithSource({\n onSuccess: (result, variables) => {\n switch (result.type) {\n case 'synchronize':\n onSynchronizeSuccess(result.data, variables.syncType)\n break\n case 'tableUpdateTransaction':\n onMergeTableSuccess(result.data)\n break\n case 'recordset_overwrite':\n displayToast('Successfully updated RecordSet.', 'success')\n break\n default:\n result satisfies never\n }\n },\n onError: e => displayToast(e.message, 'danger'),\n })\n\n // At this time, only RecordSet sync supports PULL.\n // If the RecordSet source or JSON Schema has been updated since this grid was created,\n // we have the user PULL the latest changes before enabling a full PULL_PUSH, so they\n // have an opportunity to handle and fix unexpected merge outcomes.\n const shouldPull =\n enableRecordSetSync &&\n entity !== undefined &&\n sourceEntitySchemaBinding !== undefined &&\n shouldPullBeforePush(gridSession, entity, sourceEntitySchemaBinding)\n\n const { buttonText, tooltipText } = getSyncButtonLabels(\n shouldPull,\n sourceEntityType,\n enableRecordSetSync,\n )\n\n const isLoadingPrerequisiteData = entityLoading || schemaBindingIsLoading\n\n if (isLoadingPrerequisiteData) {\n return <Skeleton width=\"100px\" />\n }\n\n return (\n <Tooltip title={tooltipText} describeChild>\n <GridMenuButton\n startIcon={shouldPull ? <CloudDownloadTwoTone /> : <CloudSyncTwoTone />}\n loading={isPending}\n onClick={() => {\n mergeGrid(\n buildMergeGridVariables(gridSession, sourceEntityType, shouldPull),\n )\n }}\n variant=\"contained\"\n >\n {buttonText}\n </GridMenuButton>\n </Tooltip>\n )\n}\n\n/**\n * If the source data or JSON Schema has been updated since this grid was created, we have\n * the user PULL the latest changes before enabling a full PULL_PUSH, so they have an\n * opportunity to handle unexpected merge outcomes.\n *\n * This only applies to source types that support the PULL SyncType.\n *\n * @param gridSession The grid session to check.\n * @param sourceEntity The source entity to check.\n * @param sourceEntitySchemaBinding The source entity's schema binding to check.\n * @returns True if the user should PULL before PULL_PUSH, false otherwise.\n */\nexport function shouldPullBeforePush(\n gridSession: GridSession,\n sourceEntity: Entity | null,\n sourceEntitySchemaBinding: JsonSchemaObjectBinding | null,\n): boolean {\n // Currently, only RecordSet supports PULL\n const isPullSupported =\n sourceEntity != null && instanceOfRecordSet(sourceEntity)\n if (!isPullSupported) {\n return false\n }\n\n // Guide the user to PULL first if the source was updated since the grid was\n // created/synced, or if the JSON Schema binding has updated.\n const isSourceEntityUpdated =\n gridSession.sourceEntityVersionNumber != null &&\n sourceEntity.versionNumber != null &&\n gridSession.sourceEntityVersionNumber < sourceEntity.versionNumber\n\n const isSchemaBindingUpdated =\n sourceEntitySchemaBinding != null &&\n gridSession.gridJsonSchema$Id !==\n sourceEntitySchemaBinding.jsonSchemaVersionInfo?.$id\n\n return isSourceEntityUpdated || isSchemaBindingUpdated\n}\n\n/**\n * Determines the button label and tooltip copy for the sync button based on whether the\n * user should PULL before PULL_PUSH, and the source entity's type.\n */\nexport function getSyncButtonLabels(\n shouldPull: boolean,\n sourceEntityType: EntityType | undefined,\n enableRecordSetSync: boolean,\n): { buttonText: string; tooltipText: string } {\n if (shouldPull) {\n return {\n buttonText: 'Import latest changes',\n tooltipText:\n 'Imports any recent changes into this Curator session. Your changes will not yet be applied.',\n }\n }\n if (\n sourceEntityType === EntityType.table ||\n (sourceEntityType === EntityType.recordset && !enableRecordSetSync)\n ) {\n return {\n buttonText: 'Apply changes',\n tooltipText:\n 'Applies any changes made in this Curator session to the source',\n }\n }\n return {\n buttonText: 'Sync changes',\n tooltipText:\n 'Applies any changes made in this Curator session, and imports any recent changes into this Curator session.',\n }\n}\n\n/**\n * Builds the variables passed to the merge grid mutation for the given grid session,\n * source entity type, and whether the user should PULL before PULL_PUSH.\n */\nexport function buildMergeGridVariables(\n gridSession: GridSession,\n sourceEntityType: EntityType | undefined,\n shouldPull: boolean,\n): MergeGridWithSource {\n return {\n gridSessionId: gridSession.sessionId!,\n sourceEntityId: gridSession.sourceEntityId!,\n sourceEntityType,\n syncType: shouldPull ? 'PULL' : 'PULL_PUSH',\n }\n}\n\nexport function onSynchronizeSuccess(\n result: SynchronizeGridResponse,\n syncType?: SyncType,\n) {\n if (result.errorMessages == null || result.errorMessages.length === 0) {\n if (syncType === 'PULL') {\n displayToast('Successfully imported latest changes.', 'success')\n } else {\n displayToast('Successfully synchronized changes.', 'success')\n }\n } else {\n displayToast(\n <ul>\n {result.errorMessages.map((msg, index) => (\n <li key={index}>{msg}</li>\n ))}\n </ul>,\n 'warning',\n { title: 'Some changes could not be applied' },\n )\n }\n}\n\nfunction onMergeTableSuccess(result: TableUpdateTransactionResponse) {\n if (result.results?.length) {\n // There should only be one result since the CSV upload is done in one step\n const updateResult = result.results[0]\n if (instanceOfEntityUpdateResults(updateResult)) {\n // This is an update to the contents of a View\n const failureMessages =\n getEntityUpdateResultsErrorMessages(updateResult).join('\\n')\n\n if (failureMessages) {\n displayToast(\n `Some changes could not be applied:\\n${failureMessages}`,\n 'danger',\n )\n } else {\n displayToast('Changes applied successfully', 'success')\n }\n } else if (instanceOfUploadToTableResult(updateResult)) {\n // This is an update to a TableEntity\n const rowsUpdatedStr = updateResult.rowsProcessed?.toLocaleString()\n displayToast(`Successfully updated ${rowsUpdatedStr} rows.`, 'success')\n }\n }\n}\n\nfunction getEntityUpdateResultsErrorMessages(\n results: EntityUpdateResults,\n): string[] {\n return (\n results.updateResults\n ?.filter(e => !!e.failureCode)\n .map(\n r => `${r.entityId}: ${r.failureMessage} (code: ${r.failureCode})`,\n ) ?? []\n )\n}\n"],"mappings":"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"}
@@ -8,7 +8,7 @@ function i(i) {
8
8
  a[0] === o ? u = a[1] : (u = o ? n(o) : null, a[0] = o, a[1] = u);
9
9
  let d;
10
10
  a[2] !== l || a[3] !== s ? (d = (e) => {
11
- s(e == null ? null : l === "number" ? n(e).valueOf() : n(e).toISOString());
11
+ s(e == null ? null : l === "number" || l === "integer" ? n(e).valueOf() : n(e).toISOString());
12
12
  }, a[2] = l, a[3] = s, a[4] = d) : d = a[4];
13
13
  let f = c ? "none" : void 0, p;
14
14
  a[5] === Symbol.for("react.memo_cache_sentinel") ? (p = {
@@ -1 +1 @@
1
- {"version":3,"file":"DateTimeColumn.js","names":["DateTimePicker","dayjs","Dayjs","JSONSchema7Type","CellComponent","CellProps","Column","DateTimeCellProps","colType","DateTimeCell","t0","$","_c","rowData","setRowData","disabled","t1","t2","newValue","valueOf","toISOString","t3","undefined","t4","Symbol","for","height","backgroundColor","t5","pointerEvents","width","t6","DateTimeColumnProps","dateTimeColumn","Partial","component","props","copyValue","pasteValue","value","disableKeys","keepFocus"],"sources":["../../../../src/components/DataGrid/columns/DateTimeColumn.tsx"],"sourcesContent":["import DateTimePicker from '@/components/DateTimePicker/DateTimePicker'\nimport dayjs, { Dayjs } from 'dayjs'\nimport { JSONSchema7Type } from 'json-schema'\nimport {\n CellComponent,\n CellProps,\n Column,\n} from '@sage-bionetworks/react-datasheet-grid'\n\nexport type DateTimeCellProps = CellProps & {\n colType?: JSONSchema7Type\n}\n\nexport function DateTimeCell({\n rowData,\n setRowData,\n disabled,\n colType,\n}: DateTimeCellProps) {\n return (\n <DateTimePicker\n disabled={disabled}\n value={rowData ? dayjs(rowData) : null}\n onChange={(newValue: string | Dayjs | null) => {\n if (newValue == null) {\n setRowData(null)\n } else if (colType === 'number') {\n // Assume unix millisecond timestamp\n setRowData(dayjs(newValue).valueOf())\n } else {\n // colType is 'string' or unspecified, use ISO string\n setRowData(dayjs(newValue).toISOString())\n }\n }}\n sx={{\n // When disabled, allow selecting the entire cell\n pointerEvents: disabled ? 'none' : undefined,\n width: '100%',\n height: '100%',\n '& .MuiInputBase-root': {\n height: '100%',\n backgroundColor: 'inherit',\n },\n }}\n />\n )\n}\n\nexport type DateTimeColumnProps = {\n colType?: JSONSchema7Type\n}\n\nexport function dateTimeColumn({\n colType,\n}: DateTimeColumnProps): Partial<Column> {\n return {\n component: ((props: DateTimeCellProps) => (\n <DateTimeCell {...props} colType={colType} />\n )) as CellComponent,\n copyValue: ({ rowData }) => rowData,\n pasteValue: ({ value }) => value,\n disableKeys: true,\n keepFocus: true,\n }\n}\n"],"mappings":";;;;;AAaA,SAAOS,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAsB,EAAAC,YAAAC,eAAAC,aAAAP,eAAAE,GAKTM;CAAA,AAAAL,EAAA,OAAAE,IAIwBG,IAAAL,EAAA,MAA/BK,IAAAH,IAAUZ,EAAMY,CAAc,IAA9B,MAA+BF,EAAA,KAAAE,GAAAF,EAAA,KAAAK;CAAA,IAAAC;CAAA,AAAAN,EAAA,OAAAH,KAAAG,EAAA,OAAAG,KAC5BG,KAAAC,MAAA;EACR,AACEJ,EADEI,KAAY,OACH,OACFV,MAAY,WAEVP,EAAMiB,CAAQ,EAACC,QAAS,IAGxBlB,EAAMiB,CAAQ,EAACE,YAAa,CAAC;CACzC,GACFT,EAAA,KAAAH,GAAAG,EAAA,KAAAG,GAAAH,EAAA,KAAAM,KAAAA,IAAAN,EAAA;CAGgB,IAAAU,IAAAN,IAAA,SAAAO,KAAAA,GAA6BC;CAAA,AAAAZ,EAAA,OAAAa,OAAAC,IAAA,2BAAA,KAGpBF,IAAA;EAAAG,QACd;EAAMC,iBACG;CACnB,GAAChB,EAAA,KAAAY,KAAAA,IAAAZ,EAAA;CAAA,IAAAiB;CAAA,AAAAjB,EAAA,OAAAU,IACFO,IAAAjB,EAAA,MATGiB,IAAA;EAAAC,eAEaR;EAA6BS,OACrC;EAAMJ,QACL;EAAM,wBACUH;CAI1B,GAACZ,EAAA,KAAAU,GAAAV,EAAA,KAAAiB;CAAA,IAAAG;CACD,OADCpB,EAAA,OAAAI,KAAAJ,EAAA,OAAAK,KAAAL,EAAA,QAAAM,KAAAN,EAAA,QAAAiB,KAvBHG,IAAA,kBAAC,GAAD;EACYhB;EACH,OAAAC;EACG,UAAAC;EAWN,IAAAW;CASH,CAAA,GACDjB,EAAA,KAAAI,GAAAJ,EAAA,KAAAK,GAAAL,EAAA,MAAAM,GAAAN,EAAA,MAAAiB,GAAAjB,EAAA,MAAAoB,KAAAA,IAAApB,EAAA,KAxBFoB;AAwBE;AAQN,SAAgBE,EAAe,EAC7BzB,cACuC;CACvC,OAAO;EACL2B,aAAaC,MACX,kBAAC,GAAD;GAAc,GAAIA;GAAgB5B;EAAQ,CAAA;EAE5C6B,YAAY,EAAExB,iBAAcA;EAC5ByB,aAAa,EAAEC,eAAYA;EAC3BC,aAAa;EACbC,WAAW;CACb;AACF"}
1
+ {"version":3,"file":"DateTimeColumn.js","names":["DateTimePicker","dayjs","Dayjs","JSONSchema7Type","CellComponent","CellProps","Column","DateTimeCellProps","colType","DateTimeCell","t0","$","_c","rowData","setRowData","disabled","t1","t2","newValue","valueOf","toISOString","t3","undefined","t4","Symbol","for","height","backgroundColor","t5","pointerEvents","width","t6","DateTimeColumnProps","dateTimeColumn","Partial","component","props","copyValue","pasteValue","value","disableKeys","keepFocus"],"sources":["../../../../src/components/DataGrid/columns/DateTimeColumn.tsx"],"sourcesContent":["import DateTimePicker from '@/components/DateTimePicker/DateTimePicker'\nimport dayjs, { Dayjs } from 'dayjs'\nimport { JSONSchema7Type } from 'json-schema'\nimport {\n CellComponent,\n CellProps,\n Column,\n} from '@sage-bionetworks/react-datasheet-grid'\n\nexport type DateTimeCellProps = CellProps & {\n colType?: JSONSchema7Type\n}\n\nexport function DateTimeCell({\n rowData,\n setRowData,\n disabled,\n colType,\n}: DateTimeCellProps) {\n return (\n <DateTimePicker\n disabled={disabled}\n value={rowData ? dayjs(rowData) : null}\n onChange={(newValue: string | Dayjs | null) => {\n if (newValue == null) {\n setRowData(null)\n } else if (colType === 'number' || colType === 'integer') {\n // Assume unix millisecond timestamp\n setRowData(dayjs(newValue).valueOf())\n } else {\n // colType is 'string' or unspecified, use ISO string\n setRowData(dayjs(newValue).toISOString())\n }\n }}\n sx={{\n // When disabled, allow selecting the entire cell\n pointerEvents: disabled ? 'none' : undefined,\n width: '100%',\n height: '100%',\n '& .MuiInputBase-root': {\n height: '100%',\n backgroundColor: 'inherit',\n },\n }}\n />\n )\n}\n\nexport type DateTimeColumnProps = {\n colType?: JSONSchema7Type\n}\n\nexport function dateTimeColumn({\n colType,\n}: DateTimeColumnProps): Partial<Column> {\n return {\n component: ((props: DateTimeCellProps) => (\n <DateTimeCell {...props} colType={colType} />\n )) as CellComponent,\n copyValue: ({ rowData }) => rowData,\n pasteValue: ({ value }) => value,\n disableKeys: true,\n keepFocus: true,\n }\n}\n"],"mappings":";;;;;AAaA,SAAOS,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAsB,EAAAC,YAAAC,eAAAC,aAAAP,eAAAE,GAKTM;CAAA,AAAAL,EAAA,OAAAE,IAIwBG,IAAAL,EAAA,MAA/BK,IAAAH,IAAUZ,EAAMY,CAAc,IAA9B,MAA+BF,EAAA,KAAAE,GAAAF,EAAA,KAAAK;CAAA,IAAAC;CAAA,AAAAN,EAAA,OAAAH,KAAAG,EAAA,OAAAG,KAC5BG,KAAAC,MAAA;EACR,AACEJ,EADEI,KAAY,OACH,OACFV,MAAY,YAAYA,MAAY,YAElCP,EAAMiB,CAAQ,EAACC,QAAS,IAGxBlB,EAAMiB,CAAQ,EAACE,YAAa,CAAC;CACzC,GACFT,EAAA,KAAAH,GAAAG,EAAA,KAAAG,GAAAH,EAAA,KAAAM,KAAAA,IAAAN,EAAA;CAGgB,IAAAU,IAAAN,IAAA,SAAAO,KAAAA,GAA6BC;CAAA,AAAAZ,EAAA,OAAAa,OAAAC,IAAA,2BAAA,KAGpBF,IAAA;EAAAG,QACd;EAAMC,iBACG;CACnB,GAAChB,EAAA,KAAAY,KAAAA,IAAAZ,EAAA;CAAA,IAAAiB;CAAA,AAAAjB,EAAA,OAAAU,IACFO,IAAAjB,EAAA,MATGiB,IAAA;EAAAC,eAEaR;EAA6BS,OACrC;EAAMJ,QACL;EAAM,wBACUH;CAI1B,GAACZ,EAAA,KAAAU,GAAAV,EAAA,KAAAiB;CAAA,IAAAG;CACD,OADCpB,EAAA,OAAAI,KAAAJ,EAAA,OAAAK,KAAAL,EAAA,QAAAM,KAAAN,EAAA,QAAAiB,KAvBHG,IAAA,kBAAC,GAAD;EACYhB;EACH,OAAAC;EACG,UAAAC;EAWN,IAAAW;CASH,CAAA,GACDjB,EAAA,KAAAI,GAAAJ,EAAA,KAAAK,GAAAL,EAAA,MAAAM,GAAAN,EAAA,MAAAiB,GAAAjB,EAAA,MAAAoB,KAAAA,IAAApB,EAAA,KAxBFoB;AAwBE;AAQN,SAAgBE,EAAe,EAC7BzB,cACuC;CACvC,OAAO;EACL2B,aAAaC,MACX,kBAAC,GAAD;GAAc,GAAIA;GAAgB5B;EAAQ,CAAA;EAE5C6B,YAAY,EAAExB,iBAAcA;EAC5ByB,aAAa,EAAEC,eAAYA;EAC3BC,aAAa;EACbC,WAAW;CACb;AACF"}
@@ -0,0 +1,10 @@
1
+ import { JSONSchema7 } from 'json-schema';
2
+ export type ReorderColumnsButtonProps = {
3
+ columnNames: string[];
4
+ columnOrder: number[];
5
+ jsonSchema: JSONSchema7 | undefined;
6
+ upsertKey?: string[];
7
+ onReorder: (newColumnOrder: number[]) => void;
8
+ };
9
+ export default function ReorderColumnsButton(props: ReorderColumnsButtonProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=ReorderColumnsButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReorderColumnsButton.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/components/ReorderColumnsButton.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,UAAU,EAAE,WAAW,GAAG,SAAS,CAAA;IACnC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,SAAS,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CAC9C,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,2CAgC5E"}
@@ -0,0 +1,37 @@
1
+ import e from "./GridMenuButton/GridMenuButton.js";
2
+ import t from "./ReorderColumnsDialog.js";
3
+ import { useState as n } from "react";
4
+ import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ import { SwapHoriz as o } from "@mui/icons-material";
6
+ import { c as s } from "react/compiler-runtime";
7
+ //#region src/components/DataGrid/components/ReorderColumnsButton.tsx
8
+ function c(c) {
9
+ let l = s(14), { columnNames: u, columnOrder: d, jsonSchema: f, upsertKey: p, onReorder: m } = c, [h, g] = n(!1), _;
10
+ l[0] !== u || l[1] !== d || l[2] !== f || l[3] !== m || l[4] !== h || l[5] !== p ? (_ = h && /* @__PURE__ */ i(t, {
11
+ open: h,
12
+ columnNames: u,
13
+ columnOrder: d,
14
+ jsonSchema: f,
15
+ upsertKey: p,
16
+ onSave: (e) => {
17
+ m(e), g(!1);
18
+ },
19
+ onCancel: () => g(!1)
20
+ }), l[0] = u, l[1] = d, l[2] = f, l[3] = m, l[4] = h, l[5] = p, l[6] = _) : _ = l[6];
21
+ let v, y;
22
+ l[7] === Symbol.for("react.memo_cache_sentinel") ? (v = /* @__PURE__ */ i(o, {}), y = () => g(!0), l[7] = v, l[8] = y) : (v = l[7], y = l[8]);
23
+ let b = d.length < 2, x;
24
+ l[9] === b ? x = l[10] : (x = /* @__PURE__ */ i(e, {
25
+ variant: "outlined",
26
+ startIcon: v,
27
+ onClick: y,
28
+ disabled: b,
29
+ children: "Reorder Columns"
30
+ }), l[9] = b, l[10] = x);
31
+ let S;
32
+ return l[11] !== _ || l[12] !== x ? (S = /* @__PURE__ */ a(r, { children: [_, x] }), l[11] = _, l[12] = x, l[13] = S) : S = l[13], S;
33
+ }
34
+ //#endregion
35
+ export { c as default };
36
+
37
+ //# sourceMappingURL=ReorderColumnsButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReorderColumnsButton.js","names":["GridMenuButton","ReorderColumnsDialog","SwapHoriz","JSONSchema7","useState","ReorderColumnsButtonProps","columnNames","columnOrder","jsonSchema","upsertKey","onReorder","newColumnOrder","ReorderColumnsButton","props","$","_c","showDialog","setShowDialog","t0","t1","t2","Symbol","for","t3","length","t4","t5"],"sources":["../../../../src/components/DataGrid/components/ReorderColumnsButton.tsx"],"sourcesContent":["import GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport ReorderColumnsDialog from '@/components/DataGrid/components/ReorderColumnsDialog'\nimport { SwapHoriz } from '@mui/icons-material'\nimport { JSONSchema7 } from 'json-schema'\nimport { useState } from 'react'\n\nexport type ReorderColumnsButtonProps = {\n columnNames: string[]\n columnOrder: number[]\n jsonSchema: JSONSchema7 | undefined\n upsertKey?: string[]\n onReorder: (newColumnOrder: number[]) => void\n}\n\nexport default function ReorderColumnsButton(props: ReorderColumnsButtonProps) {\n const { columnNames, columnOrder, jsonSchema, upsertKey, onReorder } = props\n\n const [showDialog, setShowDialog] = useState(false)\n\n return (\n <>\n {showDialog && (\n // Explicitly unmount the dialog when it is closed so its working order resets\n <ReorderColumnsDialog\n open={showDialog}\n columnNames={columnNames}\n columnOrder={columnOrder}\n jsonSchema={jsonSchema}\n upsertKey={upsertKey}\n onSave={newColumnOrder => {\n onReorder(newColumnOrder)\n setShowDialog(false)\n }}\n onCancel={() => setShowDialog(false)}\n />\n )}\n <GridMenuButton\n variant=\"outlined\"\n startIcon={<SwapHoriz />}\n onClick={() => setShowDialog(true)}\n disabled={columnOrder.length < 2}\n >\n Reorder Columns\n </GridMenuButton>\n </>\n )\n}\n"],"mappings":";;;;;;;AAcA,SAAeY,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACb,EAAAT,gBAAAC,gBAAAC,eAAAC,cAAAC,iBAAuEG,GAEvE,CAAAG,GAAAC,KAAoCb,EAAS,EAAK,GAACc;CAAA,AAAAJ,EAAA,OAAAR,KAAAQ,EAAA,OAAAP,KAAAO,EAAA,OAAAN,KAAAM,EAAA,OAAAJ,KAAAI,EAAA,OAAAE,KAAAF,EAAA,OAAAL,KAI9CS,IAAAF,KAEC,kBAAC,GAAD;EACQA,MAAAA;EACOV;EACAC;EACDC;EACDC;EACH,SAAAE,MAAA;GAENM,AADAP,EAAUC,CAAc,GACxBM,EAAc,EAAK;EAAC;EAEZ,gBAAMA,EAAc,EAAK;CAAC,CAAA,GAEvCH,EAAA,KAAAR,GAAAQ,EAAA,KAAAP,GAAAO,EAAA,KAAAN,GAAAM,EAAA,KAAAJ,GAAAI,EAAA,KAAAE,GAAAF,EAAA,KAAAL,GAAAK,EAAA,KAAAI,KAAAA,IAAAJ,EAAA;CAAA,IAAAK,GAAAC;CAAA,AAAAN,EAAA,OAAAO,OAAAC,IAAA,2BAAA,KAGYH,IAAA,kBAAC,GAAD,CAAU,CAAA,GACZC,UAAMH,EAAc,EAAI,GAACH,EAAA,KAAAK,GAAAL,EAAA,KAAAM,MAAAD,IAAAL,EAAA,IAAAM,IAAAN,EAAA;CACxB,IAAAS,IAAAhB,EAAWiB,SAAU,GAACC;CAAA,AAAAX,EAAA,OAAAS,IAGjBE,IAAAX,EAAA,OAPjBW,IAAA,kBAAC,GAAD;EACU,SAAA;EACG,WAAAN;EACF,SAAAC;EACC,UAAAG;YACX;CALc,CAAA,GAOET,EAAA,KAAAS,GAAAT,EAAA,MAAAW;CAAA,IAAAC;CAChB,OADgBZ,EAAA,QAAAI,KAAAJ,EAAA,QAAAW,KAvBnBC,IAAA,kBAAA,GAAA,EAAA,UAAA,CACGR,GAeDO,CAOiB,EAAA,CAAA,GAChBX,EAAA,MAAAI,GAAAJ,EAAA,MAAAW,GAAAX,EAAA,MAAAY,KAAAA,IAAAZ,EAAA,KAxBHY;AAwBG"}
@@ -0,0 +1,12 @@
1
+ import { JSONSchema7 } from 'json-schema';
2
+ export type ReorderColumnsDialogProps = {
3
+ open: boolean;
4
+ columnNames: string[];
5
+ columnOrder: number[];
6
+ jsonSchema: JSONSchema7 | undefined;
7
+ upsertKey?: string[];
8
+ onSave: (newColumnOrder: number[]) => void;
9
+ onCancel: () => void;
10
+ };
11
+ export default function ReorderColumnsDialog(props: ReorderColumnsDialogProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=ReorderColumnsDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReorderColumnsDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/components/ReorderColumnsDialog.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAIzC,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,OAAO,CAAA;IACb,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,UAAU,EAAE,WAAW,GAAG,SAAS,CAAA;IACnC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,MAAM,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AASD,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,2CAkF5E"}
@@ -0,0 +1,93 @@
1
+ import { ConfirmationDialog as e } from "../../ConfirmationDialog/ConfirmationDialog.js";
2
+ import "../../ConfirmationDialog/index.js";
3
+ import { computeDefaultColumnOrder as t } from "../utils/computeDefaultColumnOrder.js";
4
+ import { useState as n } from "react";
5
+ import { Box as r, Button as i, IconButton as a, List as o, ListItem as s, ListItemText as c, Stack as l } from "@mui/material";
6
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
+ import f from "lodash-es/isEqual";
8
+ import { North as p, RestartAlt as m, South as h } from "@mui/icons-material";
9
+ import { c as g } from "react/compiler-runtime";
10
+ //#region src/components/DataGrid/components/ReorderColumnsDialog.tsx
11
+ function _(e, t, n) {
12
+ let r = [...e], [i] = r.splice(t, 1);
13
+ return r.splice(n, 0, i), r;
14
+ }
15
+ function v(v) {
16
+ let y = g(34), { open: b, columnNames: x, columnOrder: S, jsonSchema: C, upsertKey: w, onSave: T, onCancel: E } = v, [D, O] = n(S), k;
17
+ y[0] !== x || y[1] !== C || y[2] !== w ? (k = t(x, C, w), y[0] = x, y[1] = C, y[2] = w, y[3] = k) : k = y[3];
18
+ let A = k, j;
19
+ y[4] === Symbol.for("react.memo_cache_sentinel") ? (j = {
20
+ display: "flex",
21
+ justifyContent: "flex-end",
22
+ mb: 1
23
+ }, y[4] = j) : j = y[4];
24
+ let M;
25
+ y[5] === Symbol.for("react.memo_cache_sentinel") ? (M = /* @__PURE__ */ u(m, {}), y[5] = M) : M = y[5];
26
+ let N;
27
+ y[6] === A ? N = y[7] : (N = () => O(A), y[6] = A, y[7] = N);
28
+ let P;
29
+ y[8] !== A || y[9] !== D ? (P = f(D, A), y[8] = A, y[9] = D, y[10] = P) : P = y[10];
30
+ let F;
31
+ y[11] !== N || y[12] !== P ? (F = /* @__PURE__ */ u(r, {
32
+ sx: j,
33
+ children: /* @__PURE__ */ u(i, {
34
+ variant: "text",
35
+ startIcon: M,
36
+ onClick: N,
37
+ disabled: P,
38
+ children: "Reset to Default Order"
39
+ })
40
+ }), y[11] = N, y[12] = P, y[13] = F) : F = y[13];
41
+ let I;
42
+ if (y[14] !== x || y[15] !== D) {
43
+ let e;
44
+ y[17] !== x || y[18] !== D.length ? (e = (e, t) => {
45
+ let n = x[e];
46
+ return /* @__PURE__ */ u(s, {
47
+ divider: !0,
48
+ secondaryAction: /* @__PURE__ */ d(l, {
49
+ direction: "row",
50
+ spacing: .5,
51
+ children: [/* @__PURE__ */ u(a, {
52
+ "aria-label": `Move ${n} up`,
53
+ size: "small",
54
+ disabled: t === 0,
55
+ onClick: () => O((e) => _(e, t, t - 1)),
56
+ children: /* @__PURE__ */ u(p, { fontSize: "small" })
57
+ }), /* @__PURE__ */ u(a, {
58
+ "aria-label": `Move ${n} down`,
59
+ size: "small",
60
+ disabled: t === D.length - 1,
61
+ onClick: () => O((e) => _(e, t, t + 1)),
62
+ children: /* @__PURE__ */ u(h, { fontSize: "small" })
63
+ })]
64
+ }),
65
+ children: /* @__PURE__ */ u(c, { primary: n })
66
+ }, e);
67
+ }, y[17] = x, y[18] = D.length, y[19] = e) : e = y[19], I = D.map(e), y[14] = x, y[15] = D, y[16] = I;
68
+ } else I = y[16];
69
+ let L;
70
+ y[20] === I ? L = y[21] : (L = /* @__PURE__ */ u(o, {
71
+ disablePadding: !0,
72
+ children: I
73
+ }), y[20] = I, y[21] = L);
74
+ let R;
75
+ y[22] !== F || y[23] !== L ? (R = /* @__PURE__ */ d(r, { children: [F, L] }), y[22] = F, y[23] = L, y[24] = R) : R = y[24];
76
+ let z;
77
+ y[25] === Symbol.for("react.memo_cache_sentinel") ? (z = { children: "Save" }, y[25] = z) : z = y[25];
78
+ let B;
79
+ y[26] !== T || y[27] !== D ? (B = () => T(D), y[26] = T, y[27] = D, y[28] = B) : B = y[28];
80
+ let V;
81
+ return y[29] !== E || y[30] !== b || y[31] !== B || y[32] !== R ? (V = /* @__PURE__ */ u(e, {
82
+ open: b,
83
+ title: "Reorder Columns",
84
+ content: R,
85
+ confirmButtonProps: z,
86
+ onConfirm: B,
87
+ onCancel: E
88
+ }), y[29] = E, y[30] = b, y[31] = B, y[32] = R, y[33] = V) : V = y[33], V;
89
+ }
90
+ //#endregion
91
+ export { v as default };
92
+
93
+ //# sourceMappingURL=ReorderColumnsDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReorderColumnsDialog.js","names":["ConfirmationDialog","computeDefaultColumnOrder","North","RestartAlt","South","Box","Button","IconButton","List","ListItem","ListItemText","Stack","JSONSchema7","isEqual","useMemo","useState","ReorderColumnsDialogProps","open","columnNames","columnOrder","jsonSchema","upsertKey","onSave","newColumnOrder","onCancel","moveItem","order","from","to","next","moved","splice","ReorderColumnsDialog","props","$","_c","workingOrder","setWorkingOrder","t0","defaultOrder","t1","Symbol","for","display","justifyContent","mb","t2","t3","t4","t5","t6","t7","length","colIndex","displayIndex","columnName","order_0","map","t8","t9","children","t10","t11"],"sources":["../../../../src/components/DataGrid/components/ReorderColumnsDialog.tsx"],"sourcesContent":["import { ConfirmationDialog } from '@/components/ConfirmationDialog'\nimport { computeDefaultColumnOrder } from '@/components/DataGrid/utils/computeDefaultColumnOrder'\nimport { North, RestartAlt, South } from '@mui/icons-material'\nimport {\n Box,\n Button,\n IconButton,\n List,\n ListItem,\n ListItemText,\n Stack,\n} from '@mui/material'\nimport { JSONSchema7 } from 'json-schema'\nimport isEqual from 'lodash-es/isEqual'\nimport { useMemo, useState } from 'react'\n\nexport type ReorderColumnsDialogProps = {\n open: boolean\n columnNames: string[]\n columnOrder: number[]\n jsonSchema: JSONSchema7 | undefined\n upsertKey?: string[]\n onSave: (newColumnOrder: number[]) => void\n onCancel: () => void\n}\n\nfunction moveItem(order: number[], from: number, to: number): number[] {\n const next = [...order]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved)\n return next\n}\n\nexport default function ReorderColumnsDialog(props: ReorderColumnsDialogProps) {\n const {\n open,\n columnNames,\n columnOrder,\n jsonSchema,\n upsertKey,\n onSave,\n onCancel,\n } = props\n\n const [workingOrder, setWorkingOrder] = useState<number[]>(columnOrder)\n\n const defaultOrder = useMemo(\n () => computeDefaultColumnOrder(columnNames, jsonSchema, upsertKey),\n [columnNames, jsonSchema, upsertKey],\n )\n\n return (\n <ConfirmationDialog\n open={open}\n title=\"Reorder Columns\"\n content={\n <Box>\n <Box sx={{ display: 'flex', justifyContent: 'flex-end', mb: 1 }}>\n <Button\n variant=\"text\"\n startIcon={<RestartAlt />}\n onClick={() => setWorkingOrder(defaultOrder)}\n disabled={isEqual(workingOrder, defaultOrder)}\n >\n Reset to Default Order\n </Button>\n </Box>\n <List disablePadding>\n {workingOrder.map((colIndex, displayIndex) => {\n const columnName = columnNames[colIndex]\n return (\n <ListItem\n key={colIndex}\n divider\n secondaryAction={\n <Stack direction=\"row\" spacing={0.5}>\n <IconButton\n aria-label={`Move ${columnName} up`}\n size=\"small\"\n disabled={displayIndex === 0}\n onClick={() =>\n setWorkingOrder(order =>\n moveItem(order, displayIndex, displayIndex - 1),\n )\n }\n >\n <North fontSize=\"small\" />\n </IconButton>\n <IconButton\n aria-label={`Move ${columnName} down`}\n size=\"small\"\n disabled={displayIndex === workingOrder.length - 1}\n onClick={() =>\n setWorkingOrder(order =>\n moveItem(order, displayIndex, displayIndex + 1),\n )\n }\n >\n <South fontSize=\"small\" />\n </IconButton>\n </Stack>\n }\n >\n <ListItemText primary={columnName} />\n </ListItem>\n )\n })}\n </List>\n </Box>\n }\n confirmButtonProps={{ children: 'Save' }}\n onConfirm={() => onSave(workingOrder)}\n onCancel={onCancel}\n />\n )\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { useGetEntity as e } from "../../../synapse-queries/entity/useEntity.js";
2
- import { useGetSchema as t } from "../../../synapse-queries/entity/useSchema.js";
2
+ import { useGetSchema as t } from "../../../synapse-queries/jsonschema/useSchema.js";
3
3
  import "../../../synapse-queries/index.js";
4
4
  import { instanceOfEntityView as n } from "@sage-bionetworks/synapse-client";
5
5
  import r from "lodash-es/isObject";
@@ -19,6 +19,9 @@ export type ModelChange = {
19
19
  type: 'SET_SELECTION';
20
20
  replicaId: string;
21
21
  selection: ReplicaSelectionModel;
22
+ } | {
23
+ type: 'REORDER_COLUMNS';
24
+ newColumnOrder: number[];
22
25
  };
23
26
  export declare function getDefaultValueForProperty(row: DataGridRow, property: string, schemaPropertyInfo: SchemaPropertiesMap): unknown;
24
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"applyModelChange.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,qBAAqB,EACtB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAM9E;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAC9D;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,qBAAqB,CAAA;CACjC,CAAA;AAEL,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,mBAAmB,WAQxC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,WAAW,EACnB,kBAAkB,EAAE,mBAAmB,QAiExC"}
1
+ {"version":3,"file":"applyModelChange.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,qBAAqB,EACtB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAM9E;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAC9D;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,qBAAqB,CAAA;CACjC,GACD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAEzD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,mBAAmB,WAQxC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,WAAW,EACnB,kBAAkB,EAAE,mBAAmB,QA6ExC"}
@@ -41,6 +41,11 @@ function a(e, a, o) {
41
41
  case "SET_SELECTION":
42
42
  e.api.obj().has("selection") || e.api.obj().add(["selection"], r.obj({})), e.api.obj(["selection"]).set({ [a.replicaId]: r.con(a.selection) });
43
43
  break;
44
+ case "REORDER_COLUMNS": {
45
+ let t = e.api.arr(["columnOrder"]), n = t?.length() ?? 0;
46
+ n > 0 && t?.del(0, n), t?.ins(0, a.newColumnOrder.map((e) => r.con(e)));
47
+ break;
48
+ }
44
49
  }
45
50
  }
46
51
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"applyModelChange.js","names":["DataGridRow","GridModel","ReplicaSelectionModel","SchemaPropertiesMap","s","isEqual","coerceModelCellValue","getEmptyValue","ModelChange","type","rowIndex","rowData","count","updatedData","replicaId","selection","getDefaultValueForProperty","row","property","schemaPropertyInfo","info","Object","hasOwn","isRequired","applyModelChange","model","change","rowsArr","api","arr","columnNames","getSnapshot","map","name","con","ins","obj","data","vec","metadata","del","currentRowData","rows","entries","forEach","key","value","startsWith","colIndex","indexOf","coercedValue","rowVec","String","set","has","add"],"sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"sourcesContent":["import {\n DataGridRow,\n GridModel,\n ReplicaSelectionModel,\n} from '@/components/DataGrid/DataGridTypes'\nimport { SchemaPropertiesMap } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport { s } from 'json-joy/lib/json-crdt-patch'\nimport isEqual from 'lodash-es/isEqual'\nimport { coerceModelCellValue } from './schemaAwarePasteValue'\nimport { getEmptyValue } from './getEmptyValue'\n\n/**\n * Represents a change operation on the GridModel.\n */\nexport type ModelChange =\n | { type: 'CREATE'; rowIndex: number; rowData: DataGridRow }\n | { type: 'DELETE'; rowIndex: number; count?: number }\n | { type: 'UPDATE'; rowIndex: number; updatedData: DataGridRow }\n | {\n type: 'SET_SELECTION'\n replicaId: string\n selection: ReplicaSelectionModel\n }\n\nexport function getDefaultValueForProperty(\n row: DataGridRow,\n property: string,\n schemaPropertyInfo: SchemaPropertiesMap,\n) {\n const info = schemaPropertyInfo[property]\n if (Object.hasOwn(row, property)) {\n return coerceModelCellValue(row[property], info)\n }\n // Property absent from the row: derive the schema-correct blank directly.\n return getEmptyValue(info?.isRequired)\n}\n\n/**\n * Applies a single change operation (create, delete, or update) to the GridModel.\n *\n * @param model - The grid model to modify\n * @param change - The change to apply\n */\nexport function applyModelChange(\n model: GridModel,\n change: ModelChange,\n schemaPropertyInfo: SchemaPropertiesMap,\n) {\n const rowsArr = model.api.arr(['rows'])\n const { columnNames } = model.api.getSnapshot()\n\n switch (change.type) {\n case 'CREATE': {\n // Convert rowData object into a CRDT vector\n const rowData = columnNames.map(name =>\n s.con(\n getDefaultValueForProperty(change.rowData, name, schemaPropertyInfo),\n ),\n )\n // Insert a new row object at the specified index\n rowsArr?.ins(change.rowIndex, [\n s.obj({ data: s.vec(...rowData), metadata: s.obj({}) }),\n ])\n break\n }\n\n case 'DELETE':\n rowsArr?.del(change.rowIndex, change.count ?? 1)\n break\n\n case 'UPDATE': {\n const currentRowData = model.api.getSnapshot().rows[change.rowIndex]?.data\n Object.entries(change.updatedData).forEach(([key, value]) => {\n if (key.startsWith('_')) return // Skip internal properties like _rowId\n const colIndex = columnNames.indexOf(key)\n if (colIndex !== -1) {\n // Coerce empty values (null/undefined/\"\") to the schema-correct blank\n // so any path that reaches the model — paste, programmatic edits,\n // etc. — produces a value the validator can describe with its\n // standard \"<value> is not a valid …\" message format.\n const coercedValue = coerceModelCellValue(\n value,\n schemaPropertyInfo[key],\n )\n // Only write cells whose value actually changed to avoid stamping\n // the local replica's SID on unmodified cells.\n if (isEqual(currentRowData?.[colIndex], coercedValue)) return\n // Get the CRDT array of cell values for this row\n const rowVec = model.api.vec([\n 'rows',\n String(change.rowIndex),\n 'data',\n ])\n // Update the specific column with the new value\n rowVec?.set([[colIndex, s.con(coercedValue)]])\n }\n })\n break\n }\n case 'SET_SELECTION': {\n if (!model.api.obj().has('selection')) {\n // Create if not exists\n model.api.obj().add(['selection'], s.obj({}))\n }\n model.api\n .obj(['selection'])\n .set({ [change.replicaId]: s.con(change.selection) })\n\n break\n }\n }\n}\n"],"mappings":";;;;;AAwBA,SAAgBgB,EACdC,GACAC,GACAC,GACA;CACA,IAAMC,IAAOD,EAAmBD;CAKhC,OAJIG,OAAOC,OAAOL,GAAKC,CAAQ,IACtBZ,EAAqBW,EAAIC,IAAWE,CAAI,IAG1Cb,EAAca,GAAMG,UAAU;AACvC;AAQA,SAAgBC,EACdC,GACAC,GACAP,GACA;CACA,IAAMQ,IAAUF,EAAMG,IAAIC,IAAI,CAAC,MAAM,CAAC,GAChC,EAAEC,mBAAgBL,EAAMG,IAAIG,YAAY;CAE9C,QAAQL,EAAOjB,MAAf;EACE,KAAK,UAAU;GAEb,IAAME,IAAUmB,EAAYE,KAAIC,MAC9B7B,EAAE8B,IACAlB,EAA2BU,EAAOf,SAASsB,GAAMd,CAAkB,CACrE,CACF;GAEAQ,GAASQ,IAAIT,EAAOhB,UAAU,CAC5BN,EAAEgC,IAAI;IAAEC,MAAMjC,EAAEkC,IAAI,GAAG3B,CAAO;IAAG4B,UAAUnC,EAAEgC,IAAI,CAAC,CAAC;GAAE,CAAC,CAAC,CACxD;GACD;EACF;EAEA,KAAK;GACHT,GAASa,IAAId,EAAOhB,UAAUgB,EAAOd,SAAS,CAAC;GAC/C;EAEF,KAAK,UAAU;GACb,IAAM6B,IAAiBhB,EAAMG,IAAIG,YAAY,EAAEW,KAAKhB,EAAOhB,WAAW2B;GACtEhB,OAAOsB,QAAQjB,EAAOb,WAAW,EAAE+B,SAAS,CAACC,GAAKC,OAAW;IAC3D,IAAID,EAAIE,WAAW,GAAG,GAAG;IACzB,IAAMC,IAAWlB,EAAYmB,QAAQJ,CAAG;IACxC,IAAIG,MAAa,IAAI;KAKnB,IAAME,IAAe5C,EACnBwC,GACA3B,EAAmB0B,EACrB;KAGA,IAAIxC,EAAQoC,IAAiBO,IAAWE,CAAY,GAAG;KAQvDC,EANqBvB,IAAIU,IAAI;MAC3B;MACAc,OAAO1B,EAAOhB,QAAQ;MACtB;KAAM,CAGRyC,GAAQE,IAAI,CAAC,CAACL,GAAU5C,EAAE8B,IAAIgB,CAAY,CAAC,CAAC,CAAC;IAC/C;GACF,CAAC;GACD;EACF;EACA,KAAK;GAKHzB,AAJKA,EAAMG,IAAIQ,IAAI,EAAEkB,IAAI,WAAW,KAElC7B,EAAMG,IAAIQ,IAAI,EAAEmB,IAAI,CAAC,WAAW,GAAGnD,EAAEgC,IAAI,CAAC,CAAC,CAAC,GAE9CX,EAAMG,IACHQ,IAAI,CAAC,WAAW,CAAC,EACjBiB,IAAI,GAAG3B,EAAOZ,YAAYV,EAAE8B,IAAIR,EAAOX,SAAS,EAAE,CAAC;GAEtD;CAEJ;AACF"}
1
+ {"version":3,"file":"applyModelChange.js","names":["DataGridRow","GridModel","ReplicaSelectionModel","SchemaPropertiesMap","s","isEqual","coerceModelCellValue","getEmptyValue","ModelChange","type","rowIndex","rowData","count","updatedData","replicaId","selection","newColumnOrder","getDefaultValueForProperty","row","property","schemaPropertyInfo","info","Object","hasOwn","isRequired","applyModelChange","model","change","rowsArr","api","arr","columnNames","getSnapshot","map","name","con","ins","obj","data","vec","metadata","del","currentRowData","rows","entries","forEach","key","value","startsWith","colIndex","indexOf","coercedValue","rowVec","String","set","has","add","columnOrderArr","currentLength","length","index"],"sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"sourcesContent":["import {\n DataGridRow,\n GridModel,\n ReplicaSelectionModel,\n} from '@/components/DataGrid/DataGridTypes'\nimport { SchemaPropertiesMap } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport { s } from 'json-joy/lib/json-crdt-patch'\nimport isEqual from 'lodash-es/isEqual'\nimport { coerceModelCellValue } from './schemaAwarePasteValue'\nimport { getEmptyValue } from './getEmptyValue'\n\n/**\n * Represents a change operation on the GridModel.\n */\nexport type ModelChange =\n | { type: 'CREATE'; rowIndex: number; rowData: DataGridRow }\n | { type: 'DELETE'; rowIndex: number; count?: number }\n | { type: 'UPDATE'; rowIndex: number; updatedData: DataGridRow }\n | {\n type: 'SET_SELECTION'\n replicaId: string\n selection: ReplicaSelectionModel\n }\n | { type: 'REORDER_COLUMNS'; newColumnOrder: number[] }\n\nexport function getDefaultValueForProperty(\n row: DataGridRow,\n property: string,\n schemaPropertyInfo: SchemaPropertiesMap,\n) {\n const info = schemaPropertyInfo[property]\n if (Object.hasOwn(row, property)) {\n return coerceModelCellValue(row[property], info)\n }\n // Property absent from the row: derive the schema-correct blank directly.\n return getEmptyValue(info?.isRequired)\n}\n\n/**\n * Applies a single change operation (create, delete, or update) to the GridModel.\n *\n * @param model - The grid model to modify\n * @param change - The change to apply\n */\nexport function applyModelChange(\n model: GridModel,\n change: ModelChange,\n schemaPropertyInfo: SchemaPropertiesMap,\n) {\n const rowsArr = model.api.arr(['rows'])\n const { columnNames } = model.api.getSnapshot()\n\n switch (change.type) {\n case 'CREATE': {\n // Convert rowData object into a CRDT vector\n const rowData = columnNames.map(name =>\n s.con(\n getDefaultValueForProperty(change.rowData, name, schemaPropertyInfo),\n ),\n )\n // Insert a new row object at the specified index\n rowsArr?.ins(change.rowIndex, [\n s.obj({ data: s.vec(...rowData), metadata: s.obj({}) }),\n ])\n break\n }\n\n case 'DELETE':\n rowsArr?.del(change.rowIndex, change.count ?? 1)\n break\n\n case 'UPDATE': {\n const currentRowData = model.api.getSnapshot().rows[change.rowIndex]?.data\n Object.entries(change.updatedData).forEach(([key, value]) => {\n if (key.startsWith('_')) return // Skip internal properties like _rowId\n const colIndex = columnNames.indexOf(key)\n if (colIndex !== -1) {\n // Coerce empty values (null/undefined/\"\") to the schema-correct blank\n // so any path that reaches the model — paste, programmatic edits,\n // etc. — produces a value the validator can describe with its\n // standard \"<value> is not a valid …\" message format.\n const coercedValue = coerceModelCellValue(\n value,\n schemaPropertyInfo[key],\n )\n // Only write cells whose value actually changed to avoid stamping\n // the local replica's SID on unmodified cells.\n if (isEqual(currentRowData?.[colIndex], coercedValue)) return\n // Get the CRDT array of cell values for this row\n const rowVec = model.api.vec([\n 'rows',\n String(change.rowIndex),\n 'data',\n ])\n // Update the specific column with the new value\n rowVec?.set([[colIndex, s.con(coercedValue)]])\n }\n })\n break\n }\n case 'SET_SELECTION': {\n if (!model.api.obj().has('selection')) {\n // Create if not exists\n model.api.obj().add(['selection'], s.obj({}))\n }\n model.api\n .obj(['selection'])\n .set({ [change.replicaId]: s.con(change.selection) })\n\n break\n }\n case 'REORDER_COLUMNS': {\n const columnOrderArr = model.api.arr(['columnOrder'])\n const currentLength = columnOrderArr?.length() ?? 0\n if (currentLength > 0) {\n columnOrderArr?.del(0, currentLength)\n }\n columnOrderArr?.ins(\n 0,\n change.newColumnOrder.map(index => s.con(index)),\n )\n break\n }\n }\n}\n"],"mappings":";;;;;AAyBA,SAAgBiB,EACdC,GACAC,GACAC,GACA;CACA,IAAMC,IAAOD,EAAmBD;CAKhC,OAJIG,OAAOC,OAAOL,GAAKC,CAAQ,IACtBb,EAAqBY,EAAIC,IAAWE,CAAI,IAG1Cd,EAAcc,GAAMG,UAAU;AACvC;AAQA,SAAgBC,EACdC,GACAC,GACAP,GACA;CACA,IAAMQ,IAAUF,EAAMG,IAAIC,IAAI,CAAC,MAAM,CAAC,GAChC,EAAEC,mBAAgBL,EAAMG,IAAIG,YAAY;CAE9C,QAAQL,EAAOlB,MAAf;EACE,KAAK,UAAU;GAEb,IAAME,IAAUoB,EAAYE,KAAIC,MAC9B9B,EAAE+B,IACAlB,EAA2BU,EAAOhB,SAASuB,GAAMd,CAAkB,CACrE,CACF;GAEAQ,GAASQ,IAAIT,EAAOjB,UAAU,CAC5BN,EAAEiC,IAAI;IAAEC,MAAMlC,EAAEmC,IAAI,GAAG5B,CAAO;IAAG6B,UAAUpC,EAAEiC,IAAI,CAAC,CAAC;GAAE,CAAC,CAAC,CACxD;GACD;EACF;EAEA,KAAK;GACHT,GAASa,IAAId,EAAOjB,UAAUiB,EAAOf,SAAS,CAAC;GAC/C;EAEF,KAAK,UAAU;GACb,IAAM8B,IAAiBhB,EAAMG,IAAIG,YAAY,EAAEW,KAAKhB,EAAOjB,WAAW4B;GACtEhB,OAAOsB,QAAQjB,EAAOd,WAAW,EAAEgC,SAAS,CAACC,GAAKC,OAAW;IAC3D,IAAID,EAAIE,WAAW,GAAG,GAAG;IACzB,IAAMC,IAAWlB,EAAYmB,QAAQJ,CAAG;IACxC,IAAIG,MAAa,IAAI;KAKnB,IAAME,IAAe7C,EACnByC,GACA3B,EAAmB0B,EACrB;KAGA,IAAIzC,EAAQqC,IAAiBO,IAAWE,CAAY,GAAG;KAQvDC,EANqBvB,IAAIU,IAAI;MAC3B;MACAc,OAAO1B,EAAOjB,QAAQ;MACtB;KAAM,CAGR0C,GAAQE,IAAI,CAAC,CAACL,GAAU7C,EAAE+B,IAAIgB,CAAY,CAAC,CAAC,CAAC;IAC/C;GACF,CAAC;GACD;EACF;EACA,KAAK;GAKHzB,AAJKA,EAAMG,IAAIQ,IAAI,EAAEkB,IAAI,WAAW,KAElC7B,EAAMG,IAAIQ,IAAI,EAAEmB,IAAI,CAAC,WAAW,GAAGpD,EAAEiC,IAAI,CAAC,CAAC,CAAC,GAE9CX,EAAMG,IACHQ,IAAI,CAAC,WAAW,CAAC,EACjBiB,IAAI,GAAG3B,EAAOb,YAAYV,EAAE+B,IAAIR,EAAOZ,SAAS,EAAE,CAAC;GAEtD;EAEF,KAAK,mBAAmB;GACtB,IAAM0C,IAAiB/B,EAAMG,IAAIC,IAAI,CAAC,aAAa,CAAC,GAC9C4B,IAAgBD,GAAgBE,OAAO,KAAK;GAIlDF,AAHIC,IAAgB,KAClBD,GAAgBhB,IAAI,GAAGiB,CAAa,GAEtCD,GAAgBrB,IACd,GACAT,EAAOX,eAAeiB,KAAI2B,MAASxD,EAAE+B,IAAIyB,CAAK,CAAC,CACjD;GACA;EACF;CACF;AACF"}