synapse-react-client 4.0.30 → 4.0.32

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 (222) hide show
  1. package/dist/SWC.index.d.ts +4 -0
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +2 -1
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/assets/illustrations/curie_avatar.svg +52 -0
  6. package/dist/assets/illustrations/curie_avatar_head.js +91 -0
  7. package/dist/assets/illustrations/curie_avatar_head.js.map +1 -0
  8. package/dist/assets/illustrations/curie_avatar_head.svg +21 -0
  9. package/dist/assets/illustrations/discussions_illustration2.js +96 -0
  10. package/dist/assets/illustrations/discussions_illustration2.js.map +1 -0
  11. package/dist/assets/illustrations/discussions_illustration2.svg +17 -0
  12. package/dist/assets/illustrations/index.d.ts +3 -0
  13. package/dist/assets/illustrations/index.d.ts.map +1 -1
  14. package/dist/assets/illustrations/index.js +34 -32
  15. package/dist/assets/illustrations/index.js.map +1 -1
  16. package/dist/assets/mui_components/CurieAvatarHead.d.ts +5 -0
  17. package/dist/assets/mui_components/CurieAvatarHead.d.ts.map +1 -0
  18. package/dist/assets/mui_components/CurieAvatarHead.js +17 -0
  19. package/dist/assets/mui_components/CurieAvatarHead.js.map +1 -0
  20. package/dist/assets/themed_icons/Model.d.ts +3 -0
  21. package/dist/assets/themed_icons/Model.d.ts.map +1 -0
  22. package/dist/assets/themed_icons/Model.js +31 -0
  23. package/dist/assets/themed_icons/Model.js.map +1 -0
  24. package/dist/assets/themed_icons/index.d.ts +2 -1
  25. package/dist/assets/themed_icons/index.d.ts.map +1 -1
  26. package/dist/assets/themed_icons/index.js +19 -18
  27. package/dist/components/ChallengeDataDownload/ChallengeDataDownload.d.ts.map +1 -1
  28. package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js +49 -39
  29. package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
  30. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  31. package/dist/components/DataGrid/SynapseGrid.js +46 -45
  32. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  33. package/dist/components/DataGrid/utils/DataGridUtils.js +1 -1
  34. package/dist/components/DataGrid/utils/DataGridUtils.js.map +1 -1
  35. package/dist/components/EntityFinder/EntityFinder.js +127 -127
  36. package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
  37. package/dist/components/EntityFinder/details/view/DetailsView.js +53 -53
  38. package/dist/components/EntitySidebar/EntitySidebar.css +1 -1
  39. package/dist/components/EntitySidebar/EntitySidebar.module.js +11 -11
  40. package/dist/components/EntitySidebar/EntitySidebar.module.js.map +1 -1
  41. package/dist/components/EntitySidebar/EntitySidebar.module.scss +2 -2
  42. package/dist/components/EntityTreeTable/EntityTreeTable.d.ts +7 -0
  43. package/dist/components/EntityTreeTable/EntityTreeTable.d.ts.map +1 -1
  44. package/dist/components/EntityTreeTable/EntityTreeTable.js +24 -20
  45. package/dist/components/EntityTreeTable/EntityTreeTable.js.map +1 -1
  46. package/dist/components/EntityTreeTable/components/CheckboxCell.d.ts +4 -0
  47. package/dist/components/EntityTreeTable/components/CheckboxCell.d.ts.map +1 -0
  48. package/dist/components/EntityTreeTable/components/CheckboxCell.js +43 -0
  49. package/dist/components/EntityTreeTable/components/CheckboxCell.js.map +1 -0
  50. package/dist/components/EntityTreeTable/components/EntityNameCell.d.ts.map +1 -1
  51. package/dist/components/EntityTreeTable/components/EntityNameCell.js +10 -9
  52. package/dist/components/EntityTreeTable/components/EntityNameCell.js.map +1 -1
  53. package/dist/components/EntityTreeTable/components/EntityTreeTableContext.d.ts +6 -0
  54. package/dist/components/EntityTreeTable/components/EntityTreeTableContext.d.ts.map +1 -1
  55. package/dist/components/EntityTreeTable/components/EntityTreeTableContext.js.map +1 -1
  56. package/dist/components/EntityTreeTable/hooks/useTableColumns.d.ts +1 -1
  57. package/dist/components/EntityTreeTable/hooks/useTableColumns.d.ts.map +1 -1
  58. package/dist/components/EntityTreeTable/hooks/useTableColumns.js +49 -39
  59. package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
  60. package/dist/components/EntityUpload/EntityUpload.js +6 -6
  61. package/dist/components/Forum/DiscussionEmpty.css +1 -0
  62. package/dist/components/Forum/DiscussionEmpty.d.ts +6 -0
  63. package/dist/components/Forum/DiscussionEmpty.d.ts.map +1 -0
  64. package/dist/components/Forum/DiscussionEmpty.js +30 -0
  65. package/dist/components/Forum/DiscussionEmpty.js.map +1 -0
  66. package/dist/components/Forum/DiscussionEmpty.module.js +10 -0
  67. package/dist/components/Forum/DiscussionEmpty.module.js.map +1 -0
  68. package/dist/components/Forum/DiscussionEmpty.module.scss +37 -0
  69. package/dist/components/Icon/Icon.d.ts.map +1 -1
  70. package/dist/components/Icon/Icon.js +82 -80
  71. package/dist/components/Icon/Icon.js.map +1 -1
  72. package/dist/components/ProvenanceGraph/ProvenanceGraph.d.ts.map +1 -1
  73. package/dist/components/ProvenanceGraph/ProvenanceGraph.js +39 -41
  74. package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
  75. package/dist/components/SynapseChat/AccessLevelMenu.d.ts.map +1 -1
  76. package/dist/components/SynapseChat/AccessLevelMenu.js +1 -0
  77. package/dist/components/SynapseChat/AccessLevelMenu.js.map +1 -1
  78. package/dist/components/SynapseChat/GridAgentChat.d.ts.map +1 -1
  79. package/dist/components/SynapseChat/GridAgentChat.js +34 -25
  80. package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
  81. package/dist/components/SynapseChat/SynapseChat.d.ts +10 -12
  82. package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
  83. package/dist/components/SynapseChat/SynapseChat.js +106 -103
  84. package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
  85. package/dist/components/SynapseChat/SynapseChatInteraction.css +1 -0
  86. package/dist/components/SynapseChat/SynapseChatInteraction.d.ts +22 -1
  87. package/dist/components/SynapseChat/SynapseChatInteraction.d.ts.map +1 -1
  88. package/dist/components/SynapseChat/SynapseChatInteraction.js +123 -94
  89. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  90. package/dist/components/SynapseChat/SynapseChatInteraction.module.js +8 -0
  91. package/dist/components/SynapseChat/SynapseChatInteraction.module.js.map +1 -0
  92. package/dist/components/SynapseChat/SynapseChatInteraction.module.scss +25 -0
  93. package/dist/components/SynapseChat/SynapseChatMessage.d.ts +16 -1
  94. package/dist/components/SynapseChat/SynapseChatMessage.d.ts.map +1 -1
  95. package/dist/components/SynapseChat/SynapseChatMessage.js +25 -11
  96. package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
  97. package/dist/components/SynapseChat/components/AddFilesDialog/AddFilesDialog.d.ts +27 -0
  98. package/dist/components/SynapseChat/components/AddFilesDialog/AddFilesDialog.d.ts.map +1 -0
  99. package/dist/components/SynapseChat/components/AddFilesDialog/AddFilesDialog.js +79 -0
  100. package/dist/components/SynapseChat/components/AddFilesDialog/AddFilesDialog.js.map +1 -0
  101. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.css +1 -0
  102. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.d.ts +33 -0
  103. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.d.ts.map +1 -0
  104. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.js +77 -0
  105. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.js.map +1 -0
  106. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.module.js +8 -0
  107. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.module.js.map +1 -0
  108. package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.module.scss +16 -0
  109. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.css +1 -0
  110. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.d.ts +23 -0
  111. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.d.ts.map +1 -0
  112. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.js +24 -0
  113. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.js.map +1 -0
  114. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.module.js +9 -0
  115. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.module.js.map +1 -0
  116. package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.module.scss +19 -0
  117. package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.css +1 -0
  118. package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.d.ts +22 -0
  119. package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.d.ts.map +1 -0
  120. package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.js +80 -0
  121. package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.js.map +1 -0
  122. package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.module.js +9 -0
  123. package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.module.js.map +1 -0
  124. package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.module.scss +39 -0
  125. package/dist/components/SynapseChat/useChatState.d.ts +12 -4
  126. package/dist/components/SynapseChat/useChatState.d.ts.map +1 -1
  127. package/dist/components/SynapseChat/useChatState.js +38 -20
  128. package/dist/components/SynapseChat/useChatState.js.map +1 -1
  129. package/dist/components/SynapseChat/utils/constants.d.ts +8 -0
  130. package/dist/components/SynapseChat/utils/constants.d.ts.map +1 -0
  131. package/dist/components/SynapseChat/utils/constants.js +12 -0
  132. package/dist/components/SynapseChat/utils/constants.js.map +1 -0
  133. package/dist/components/SynapseChat/utils/types.d.ts +13 -0
  134. package/dist/components/SynapseChat/utils/types.d.ts.map +1 -0
  135. package/dist/components/SynapseChat/utils/types.js +0 -0
  136. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +101 -101
  137. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  138. package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts +1 -0
  139. package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts.map +1 -1
  140. package/dist/components/entity/page/action_menu/EntityActionMenu.js +8 -0
  141. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  142. package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.js +1 -1
  143. package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.js.map +1 -1
  144. package/dist/components/file/upload/BasicFileHandleUpload.d.ts +35 -4
  145. package/dist/components/file/upload/BasicFileHandleUpload.d.ts.map +1 -1
  146. package/dist/components/file/upload/BasicFileHandleUpload.js +22 -16
  147. package/dist/components/file/upload/BasicFileHandleUpload.js.map +1 -1
  148. package/dist/components/file/upload/MultiFileUploadProgress.js +6 -6
  149. package/dist/components/file/upload/UploadFilePanel.d.ts +32 -0
  150. package/dist/components/file/upload/UploadFilePanel.d.ts.map +1 -1
  151. package/dist/components/file/upload/UploadFilePanel.js +58 -42
  152. package/dist/components/file/upload/UploadFilePanel.js.map +1 -1
  153. package/dist/components/file/upload/validateFileSelection.d.ts +25 -0
  154. package/dist/components/file/upload/validateFileSelection.d.ts.map +1 -0
  155. package/dist/components/file/upload/validateFileSelection.js +18 -0
  156. package/dist/components/file/upload/validateFileSelection.js.map +1 -0
  157. package/dist/components/menu/DropdownMenu.d.ts +3 -0
  158. package/dist/components/menu/DropdownMenu.d.ts.map +1 -1
  159. package/dist/components/menu/DropdownMenu.js +108 -83
  160. package/dist/components/menu/DropdownMenu.js.map +1 -1
  161. package/dist/features/curator/dashboard/components/CurationTaskCard.css +1 -1
  162. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js +13 -13
  163. package/dist/features/curator/dashboard/components/CurationTaskCard.module.js.map +1 -1
  164. package/dist/features/curator/dashboard/components/CurationTaskCard.module.scss +2 -1
  165. package/dist/features/curator/dashboard/components/CurationTaskCardLayout.d.ts.map +1 -1
  166. package/dist/features/curator/dashboard/components/CurationTaskCardLayout.js +35 -27
  167. package/dist/features/curator/dashboard/components/CurationTaskCardLayout.js.map +1 -1
  168. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -1
  169. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +131 -131
  170. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -1
  171. package/dist/features/entity/metadata-task/create-task/useCurationTaskFormState.d.ts.map +1 -1
  172. package/dist/features/entity/metadata-task/create-task/useCurationTaskFormState.js +21 -18
  173. package/dist/features/entity/metadata-task/create-task/useCurationTaskFormState.js.map +1 -1
  174. package/dist/features/entity/metadata-task/utils/dueDate.d.ts +1 -1
  175. package/dist/features/entity/metadata-task/utils/dueDate.js.map +1 -1
  176. package/dist/mocks/chat/mockChat.d.ts +13 -1
  177. package/dist/mocks/chat/mockChat.d.ts.map +1 -1
  178. package/dist/mocks/chat/mockChat.js +34 -9
  179. package/dist/mocks/chat/mockChat.js.map +1 -1
  180. package/dist/mocks/msw/handlers/chatHandlers.d.ts +1 -1
  181. package/dist/mocks/msw/handlers/chatHandlers.d.ts.map +1 -1
  182. package/dist/mocks/msw/handlers/chatHandlers.js +21 -7
  183. package/dist/mocks/msw/handlers/chatHandlers.js.map +1 -1
  184. package/dist/synapse-client/SynapseClient.d.ts +2 -2
  185. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  186. package/dist/synapse-client/SynapseClient.js.map +1 -1
  187. package/dist/synapse-queries/KeyFactory.d.ts +10 -1
  188. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  189. package/dist/synapse-queries/KeyFactory.js +29 -2
  190. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  191. package/dist/synapse-queries/asynchronous/usePollAsynchronousJob.d.ts +2 -2
  192. package/dist/synapse-queries/asynchronous/usePollAsynchronousJob.d.ts.map +1 -1
  193. package/dist/synapse-queries/asynchronous/usePollAsynchronousJob.js +2 -1
  194. package/dist/synapse-queries/asynchronous/usePollAsynchronousJob.js.map +1 -1
  195. package/dist/synapse-queries/chat/useChat.d.ts +3 -2
  196. package/dist/synapse-queries/chat/useChat.d.ts.map +1 -1
  197. package/dist/synapse-queries/chat/useChat.js +7 -6
  198. package/dist/synapse-queries/chat/useChat.js.map +1 -1
  199. package/dist/synapse-queries/dataaccess/index.d.ts +1 -0
  200. package/dist/synapse-queries/dataaccess/index.d.ts.map +1 -1
  201. package/dist/synapse-queries/dataaccess/index.js +4 -3
  202. package/dist/synapse-queries/dataaccess/useEDuc.d.ts +44 -0
  203. package/dist/synapse-queries/dataaccess/useEDuc.d.ts.map +1 -0
  204. package/dist/synapse-queries/dataaccess/useEDuc.js +75 -0
  205. package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -0
  206. package/dist/synapse-queries/featureflags/useGetFeatureFlag.d.ts.map +1 -1
  207. package/dist/synapse-queries/featureflags/useGetFeatureFlag.js +1 -1
  208. package/dist/synapse-queries/featureflags/useGetFeatureFlag.js.map +1 -1
  209. package/dist/synapse-queries/file/useDirectUploadToS3.js +6 -6
  210. package/dist/synapse-queries/index.js +181 -172
  211. package/dist/tsconfig.build.tsbuildinfo +1 -1
  212. package/dist/utils/SynapseConstants.d.ts +2 -0
  213. package/dist/utils/SynapseConstants.d.ts.map +1 -1
  214. package/dist/utils/SynapseConstants.js +122 -120
  215. package/dist/utils/SynapseConstants.js.map +1 -1
  216. package/dist/utils/featureflag/FeatureFlags.d.ts +3 -1
  217. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
  218. package/dist/utils/featureflag/FeatureFlags.js +1 -1
  219. package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
  220. package/dist/utils/hooks/useUploadFileEntity/useUploadFileEntities.js +5 -5
  221. package/dist/utils/hooks/useUploadFileEntity/useUploadFiles.js +14 -14
  222. package/package.json +4 -4
@@ -9,41 +9,42 @@ import "../index.js";
9
9
  import { getSchemaPropertiesInfo as ne } from "../../utils/jsonschema/getSchemaPropertyInfo.js";
10
10
  import { useListGridReplicas as re } from "../../synapse-queries/grid/useGridSession.js";
11
11
  import ie from "./components/GridMenuButton/GridMenuButton.js";
12
- import ae from "./components/UploadCsvToGridButton.js";
13
- import oe from "./components/ExportCsvFromGridButton.js";
12
+ import ae from "./components/ExportCsvFromGridButton.js";
13
+ import oe from "./components/UploadCsvToGridButton.js";
14
14
  import se from "./hooks/useGetSchemaForGrid.js";
15
15
  import ce from "./SyncGridWithSourceButton.js";
16
16
  import le from "./utils/computeReplicaSelectionModel.js";
17
17
  import { removeNoOpOperations as ue } from "./utils/DataGridUtils.js";
18
18
  import de from "./utils/modelRowsToGrid.js";
19
19
  import { GridAgentChat as fe } from "../SynapseChat/GridAgentChat.js";
20
- import pe from "./DataGrid.js";
21
- import { useGridUndoRedo as me } from "./hooks/useGridUndoRedo.js";
22
- import { StartGridSession as he } from "./StartGridSession.js";
23
- import { useDataGridWebSocket as ge } from "./useDataGridWebsocket.js";
24
- import { applyModelChange as _e } from "./utils/applyModelChange.js";
25
- import { mapOperationsToModelChanges as ve } from "./utils/mapOperationsToModelChanges.js";
26
- import { useGridReplicaUsers as ye } from "./hooks/useGridReplicaUsers.js";
27
- import { useRemoteSelections as be } from "./hooks/useRemoteSelections.js";
20
+ import { ValidationAlert as pe } from "./components/ValidationAlert.js";
21
+ import me from "./DataGrid.js";
22
+ import { useGridReplicaUsers as he } from "./hooks/useGridReplicaUsers.js";
23
+ import { useGridUndoRedo as ge } from "./hooks/useGridUndoRedo.js";
24
+ import { useRemoteSelections as _e } from "./hooks/useRemoteSelections.js";
25
+ import { StartGridSession as ve } from "./StartGridSession.js";
26
+ import { useDataGridWebSocket as ye } from "./useDataGridWebsocket.js";
27
+ import { applyModelChange as be } from "./utils/applyModelChange.js";
28
28
  import { enrichRowsWithChangeInfo as xe } from "./utils/enrichRowsWithChangeInfo.js";
29
- import { ValidationAlert as Se } from "./components/ValidationAlert.js";
30
- import { useEffect as Ce, useImperativeHandle as we, useRef as Te, useState as Ee } from "react";
31
- import { Box as De, Stack as Oe, Tooltip as ke, Typography as Ae } from "@mui/material";
32
- import { Fragment as je, jsx as i, jsxs as a } from "react/jsx-runtime";
33
- import { useErrorHandler as Me } from "react-error-boundary";
34
- import { HelpOutline as Ne, SmartToyTwoTone as Pe } from "@mui/icons-material";
29
+ import { mapOperationsToModelChanges as Se } from "./utils/mapOperationsToModelChanges.js";
30
+ import Ce from "../../assets/mui_components/CurieAvatarHead.js";
31
+ import { useEffect as we, useImperativeHandle as Te, useRef as Ee, useState as De } from "react";
32
+ import { Box as Oe, Stack as ke, Tooltip as Ae, Typography as je } from "@mui/material";
33
+ import { Fragment as Me, jsx as i, jsxs as a } from "react/jsx-runtime";
34
+ import { useErrorHandler as Ne } from "react-error-boundary";
35
+ import { HelpOutline as Pe } from "@mui/icons-material";
35
36
  import o from "@mui/material/Grid";
36
37
  import { c as Fe } from "react/compiler-runtime";
37
38
  import { ClickableJsonCrdt as Ie } from "clickable-json";
38
39
  //#region src/components/DataGrid/SynapseGrid.tsx
39
40
  function s(e) {
40
- let s = Fe(107), { agentRegistrationId: c, showDebugInfo: Re, ref: ze } = e, l = Re === void 0 ? !1 : Re, [u, Be] = Ee(null), [d, Ve] = Ee(null), [He, Ue] = Ee(!1), [We, Ge] = Ee(null), f = Te(null), p = Te(null), { data: Ke, isLoading: qe } = r(), { data: m, refetch: Je } = re(u?.sessionId), h;
41
+ let s = Fe(107), { agentRegistrationId: c, showDebugInfo: Re, ref: ze } = e, l = Re === void 0 ? !1 : Re, [u, Be] = De(null), [d, Ve] = De(null), [He, Ue] = De(!1), [We, Ge] = De(null), f = Ee(null), p = Ee(null), { data: Ke, isLoading: qe } = r(), { data: m, refetch: Je } = re(u?.sessionId), h;
41
42
  s[0] === m ? h = s[1] : (h = m === void 0 ? [] : m, s[0] = m, s[1] = h);
42
43
  let g = h, _;
43
44
  s[2] === Je ? _ = s[3] : (_ = () => {
44
45
  Je();
45
46
  }, s[2] = Je, s[3] = _);
46
- let v = _, Ye = ye(g, d, Ke?.userId == null ? void 0 : String(Ke.userId)), y, b;
47
+ let v = _, Ye = he(g, d, Ke?.userId == null ? void 0 : String(Ke.userId)), y, b;
47
48
  s[4] === Symbol.for("react.memo_cache_sentinel") ? (y = () => ({
48
49
  initializeGrid: (e) => {
49
50
  f.current && f.current.handleStartSession(e);
@@ -51,20 +52,20 @@ function s(e) {
51
52
  loadExistingSession: (e) => {
52
53
  f.current && f.current.handleLoadSession(e);
53
54
  }
54
- }), b = [], s[4] = y, s[5] = b) : (y = s[4], b = s[5]), we(ze, y, b);
55
+ }), b = [], s[4] = y, s[5] = b) : (y = s[4], b = s[5]), Te(ze, y, b);
55
56
  let x;
56
57
  s[6] === v ? x = s[7] : (x = {
57
58
  onGridReady: v,
58
59
  onReplicaConnected: v,
59
60
  onReplicaDisconnected: v
60
61
  }, s[6] = v, s[7] = x);
61
- let { isConnected: S, websocketInstance: C, hasCompletedInitialSync: w, isSyncing: Xe, model: T, modelSnapshot: E, connect: D, presignedUrl: O, hasSufficientData: k, websocketError: Ze } = ge(x);
62
- Me(Ze);
63
- let Qe = Te(null), A, j;
62
+ let { isConnected: S, websocketInstance: C, hasCompletedInitialSync: w, isSyncing: Xe, model: T, modelSnapshot: E, connect: D, presignedUrl: O, hasSufficientData: k, websocketError: Ze } = ye(x);
63
+ Ne(Ze);
64
+ let Qe = Ee(null), A, j;
64
65
  s[8] === C ? (A = s[9], j = s[10]) : (A = () => {
65
66
  Qe.current = C;
66
- }, j = [C], s[8] = C, s[9] = A, s[10] = j), Ce(A, j);
67
- let $e = Te(null), M;
67
+ }, j = [C], s[8] = C, s[9] = A, s[10] = j), we(A, j);
68
+ let $e = Ee(null), M;
68
69
  s[11] !== D || s[12] !== d || s[13] !== u ? (M = () => {
69
70
  if (d == null || !u?.sessionId) {
70
71
  $e.current = null;
@@ -81,18 +82,18 @@ function s(e) {
81
82
  d,
82
83
  et,
83
84
  D
84
- ], s[15] = D, s[16] = d, s[17] = et, s[18] = N) : N = s[18], Ce(M, N);
85
+ ], s[15] = D, s[16] = d, s[17] = et, s[18] = N) : N = s[18], we(M, N);
85
86
  let P, F;
86
87
  s[19] === T ? (P = s[20], F = s[21]) : (P = () => {
87
88
  T === null && (Ge(null), p.current && p.current.setActiveCell(null));
88
- }, F = [T], s[19] = T, s[20] = P, s[21] = F), Ce(P, F);
89
+ }, F = [T], s[19] = T, s[20] = P, s[21] = F), we(P, F);
89
90
  let tt = se(u), nt = !!u?.sourceEntityId, I;
90
91
  s[22] === nt ? I = s[23] : (I = { enabled: nt }, s[22] = nt, s[23] = I);
91
92
  let { data: L } = n(u?.sourceEntityId, void 0, I), R = L?.concreteType === "org.sagebionetworks.repo.model.table.EntityView", z;
92
93
  s[24] !== L || s[25] !== R ? (z = R ? [] : L?.upsertKey, s[24] = L, s[25] = R, s[26] = z) : z = s[26];
93
94
  let rt = z, it = tt ?? null, B;
94
95
  s[27] === it ? B = s[28] : (B = ne(it), s[27] = it, s[28] = B);
95
- let V = B, at = S ? "Connected" : "Disconnected", ot = be(E, T, g, d), H;
96
+ let V = B, at = S ? "Connected" : "Disconnected", ot = _e(E, T, g, d), H;
96
97
  s[29] !== T || s[30] !== E ? (H = E ? de(T, E) : [], s[29] = T, s[30] = E, s[31] = H) : H = s[31];
97
98
  let U = H, W;
98
99
  s[32] !== T || s[33] !== E || s[34] !== Ye || s[35] !== U ? (W = xe(U, T, E, Ye), s[32] = T, s[33] = E, s[34] = Ye, s[35] = U, s[36] = W) : W = s[36];
@@ -103,11 +104,11 @@ function s(e) {
103
104
  let K = G, ct, lt;
104
105
  s[39] !== K || s[40] !== S ? (ct = () => {
105
106
  S && K();
106
- }, lt = [S, K], s[39] = K, s[40] = S, s[41] = ct, s[42] = lt) : (ct = s[41], lt = s[42]), Ce(ct, lt);
107
+ }, lt = [S, K], s[39] = K, s[40] = S, s[41] = ct, s[42] = lt) : (ct = s[41], lt = s[42]), we(ct, lt);
107
108
  let ut;
108
109
  s[43] !== K || s[44] !== V ? (ut = (e, t) => {
109
110
  t.forEach((t) => {
110
- _e(e, t, V);
111
+ be(e, t, V);
111
112
  }), K();
112
113
  }, s[43] = K, s[44] = V, s[45] = ut) : ut = s[45];
113
114
  let q = ut, dt;
@@ -118,13 +119,13 @@ function s(e) {
118
119
  }
119
120
  e.type === "DELETE" && p.current && p.current.setActiveCell(null), q(T, [e]);
120
121
  }, s[46] = q, s[47] = T, s[48] = dt) : dt = s[48];
121
- let { undoUI: ft, redoUI: pt, addOperationsToUndoStack: mt, clearRedoStack: ht } = me(dt), gt;
122
+ let { undoUI: ft, redoUI: pt, addOperationsToUndoStack: mt, clearRedoStack: ht } = ge(dt), gt;
122
123
  s[49] !== mt || s[50] !== q || s[51] !== ht || s[52] !== T || s[53] !== U ? (gt = (e, t) => {
123
124
  if (!T) {
124
125
  console.error("Model is not initialized");
125
126
  return;
126
127
  }
127
- t = ue(e, U, t), t.length > 0 && (ht(), mt(t, U, e), q(T, ve(t, e)));
128
+ t = ue(e, U, t), t.length > 0 && (ht(), mt(t, U, e), q(T, Se(t, e)));
128
129
  }, s[49] = mt, s[50] = q, s[51] = ht, s[52] = T, s[53] = U, s[54] = gt) : gt = s[54];
129
130
  let _t = gt, vt;
130
131
  s[55] !== q || s[56] !== T || s[57] !== d ? (vt = (e) => {
@@ -158,7 +159,7 @@ function s(e) {
158
159
  let J;
159
160
  s[62] === l ? J = s[63] : (J = /* @__PURE__ */ i(o, {
160
161
  size: St,
161
- children: /* @__PURE__ */ i(he, {
162
+ children: /* @__PURE__ */ i(ve, {
162
163
  ref: f,
163
164
  onSessionChange: Be,
164
165
  onReplicaChange: Ve,
@@ -199,7 +200,7 @@ function s(e) {
199
200
  ] }),
200
201
  /* @__PURE__ */ i("p", { children: (() => {
201
202
  let e = g.filter(Le);
202
- return /* @__PURE__ */ a(je, { children: [
203
+ return /* @__PURE__ */ a(Me, { children: [
203
204
  "Connected Replicas (",
204
205
  e.length,
205
206
  " /",
@@ -207,7 +208,7 @@ function s(e) {
207
208
  g.length,
208
209
  " total):",
209
210
  " ",
210
- e.length === 0 ? "none" : e.map((t, n) => /* @__PURE__ */ i(ke, {
211
+ e.length === 0 ? "none" : e.map((t, n) => /* @__PURE__ */ i(Ae, {
211
212
  title: /* @__PURE__ */ i("pre", {
212
213
  style: {
213
214
  margin: 0,
@@ -232,7 +233,7 @@ function s(e) {
232
233
  children: X
233
234
  }), s[75] = X, s[76] = Z);
234
235
  let Q;
235
- s[77] !== c || s[78] !== He || s[79] !== st || s[80] !== R || s[81] !== _t || s[82] !== yt || s[83] !== w || s[84] !== k || s[85] !== S || s[86] !== Xe || s[87] !== tt || s[88] !== We || s[89] !== T || s[90] !== E?.columnNames || s[91] !== E?.columnOrder || s[92] !== O || s[93] !== pt || s[94] !== ot || s[95] !== d || s[96] !== U || s[97] !== V || s[98] !== u || s[99] !== l || s[100] !== ft || s[101] !== rt ? (Q = u && /* @__PURE__ */ a(je, { children: [
236
+ s[77] !== c || s[78] !== He || s[79] !== st || s[80] !== R || s[81] !== _t || s[82] !== yt || s[83] !== w || s[84] !== k || s[85] !== S || s[86] !== Xe || s[87] !== tt || s[88] !== We || s[89] !== T || s[90] !== E?.columnNames || s[91] !== E?.columnOrder || s[92] !== O || s[93] !== pt || s[94] !== ot || s[95] !== d || s[96] !== U || s[97] !== V || s[98] !== u || s[99] !== l || s[100] !== ft || s[101] !== rt ? (Q = u && /* @__PURE__ */ a(Me, { children: [
236
237
  !k && /* @__PURE__ */ a(o, {
237
238
  size: 12,
238
239
  children: [/* @__PURE__ */ i("h3", { children: "Setting up grid..." }), /* @__PURE__ */ a("div", {
@@ -250,10 +251,10 @@ function s(e) {
250
251
  ]
251
252
  })]
252
253
  }),
253
- k && /* @__PURE__ */ a(je, { children: [
254
+ k && /* @__PURE__ */ a(Me, { children: [
254
255
  /* @__PURE__ */ i(o, {
255
256
  size: 12,
256
- children: /* @__PURE__ */ i(Se, {
257
+ children: /* @__PURE__ */ i(pe, {
257
258
  rowValues: U,
258
259
  columnNames: E?.columnNames ?? [],
259
260
  columnOrder: E?.columnOrder ?? [],
@@ -263,21 +264,21 @@ function s(e) {
263
264
  }),
264
265
  /* @__PURE__ */ i(o, {
265
266
  size: 12,
266
- children: /* @__PURE__ */ a(Oe, {
267
+ children: /* @__PURE__ */ a(ke, {
267
268
  direction: "row",
268
269
  spacing: 1,
269
270
  sx: { justifyContent: "flex-end" },
270
271
  children: [
271
272
  /* @__PURE__ */ i(ie, {
272
273
  variant: "outlined",
273
- startIcon: /* @__PURE__ */ i(Ne, {}),
274
+ startIcon: /* @__PURE__ */ i(Pe, {}),
274
275
  href: "https://docs.synapse.org/synapse-docs/managing-metadata-with-curator",
275
276
  target: "_blank",
276
277
  rel: "noopener noreferrer",
277
278
  sx: { mr: "auto" },
278
279
  children: "Help and Instructions"
279
280
  }),
280
- (!w || Xe) && /* @__PURE__ */ a(De, {
281
+ (!w || Xe) && /* @__PURE__ */ a(Oe, {
281
282
  sx: {
282
283
  display: "flex",
283
284
  alignItems: "center",
@@ -286,7 +287,7 @@ function s(e) {
286
287
  children: [/* @__PURE__ */ i(t, {
287
288
  size: 16,
288
289
  margin: "0"
289
- }), /* @__PURE__ */ i(Ae, {
290
+ }), /* @__PURE__ */ i(je, {
290
291
  variant: "caption",
291
292
  color: "text.secondary",
292
293
  children: w ? "Syncing…" : "Loading…"
@@ -297,7 +298,7 @@ function s(e) {
297
298
  /* @__PURE__ */ i(ie, {
298
299
  variant: "outlined",
299
300
  onClick: () => Ue(!0),
300
- startIcon: /* @__PURE__ */ i(Pe, {}),
301
+ startIcon: /* @__PURE__ */ i(Ce, {}),
301
302
  children: "Open Curie"
302
303
  }),
303
304
  /* @__PURE__ */ i(fe, {
@@ -308,11 +309,11 @@ function s(e) {
308
309
  usersReplicaId: d,
309
310
  chatbotName: "Curie"
310
311
  }),
311
- u.sourceEntityId && /* @__PURE__ */ i(ae, {
312
+ u.sourceEntityId && /* @__PURE__ */ i(oe, {
312
313
  sourceEntityId: u.sourceEntityId,
313
314
  gridSessionId: u.sessionId
314
315
  }),
315
- u.sessionId && /* @__PURE__ */ i(oe, {
316
+ u.sessionId && /* @__PURE__ */ i(ae, {
316
317
  gridSessionId: u.sessionId,
317
318
  filename: "grid-" + (u.sourceEntityId || "export")
318
319
  }),
@@ -322,7 +323,7 @@ function s(e) {
322
323
  }),
323
324
  /* @__PURE__ */ i(o, {
324
325
  size: 12,
325
- children: /* @__PURE__ */ i(pe, {
326
+ children: /* @__PURE__ */ i(me, {
326
327
  gridRef: p,
327
328
  rowValues: st,
328
329
  columnNames: E?.columnNames ?? [],
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseGrid.js","names":["GridMenuButton","UploadCsvToGridButton","ExportCsvFromGridButton","useGetSchemaForGrid","SyncGridWithSourceButton","computeReplicaSelectionModel","modelRowsToGrid","SkeletonTable","useGetEntity","getSchemaPropertiesInfo","HelpOutline","SmartToyTwoTone","Box","Stack","Tooltip","Typography","SynapseSpinner","Grid","CreateGridRequest","GridSession","ClickableJsonCrdt","Ref","useCallback","useEffect","useImperativeHandle","useMemo","useRef","useState","DataSheetGridRef","SelectionWithId","GridAgentChat","DataGrid","DataGridRow","GridModel","Operation","useGridUndoRedo","StartGridSession","StartGridSessionHandle","useDataGridWebSocket","applyModelChange","ModelChange","removeNoOpOperations","mapOperationsToModelChanges","useGetCurrentUserBundle","useListGridReplicas","useGridReplicaUsers","useRemoteSelections","enrichRowsWithChangeInfo","CertificationRequirement","ValidationAlert","SynapseErrorBoundary","useErrorHandler","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 GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport UploadCsvToGridButton from '@/components/DataGrid/components/UploadCsvToGridButton'\nimport ExportCsvFromGridButton from '@/components/DataGrid/components/ExportCsvFromGridButton'\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 { SkeletonTable } from '@/components/index'\nimport { useGetEntity } from '@/synapse-queries/index'\nimport { getSchemaPropertiesInfo } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport { HelpOutline, SmartToyTwoTone } from '@mui/icons-material'\nimport { Box, Stack, Tooltip, Typography } from '@mui/material'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport Grid from '@mui/material/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 { DataSheetGridRef } from '@sage-bionetworks/react-datasheet-grid'\nimport { SelectionWithId } from '@sage-bionetworks/react-datasheet-grid'\nimport GridAgentChat from '../SynapseChat/GridAgentChat'\nimport DataGrid from './DataGrid'\nimport { DataGridRow, GridModel, Operation } from './DataGridTypes'\nimport { useGridUndoRedo } from './hooks/useGridUndoRedo'\nimport { StartGridSession, StartGridSessionHandle } from './StartGridSession'\nimport { useDataGridWebSocket } from './useDataGridWebsocket'\nimport { applyModelChange, ModelChange } from './utils/applyModelChange'\nimport { removeNoOpOperations } from './utils/DataGridUtils'\nimport { mapOperationsToModelChanges } from './utils/mapOperationsToModelChanges'\nimport { useGetCurrentUserBundle } from '@/synapse-queries'\nimport { useListGridReplicas } from '@/synapse-queries/grid/useGridSession'\nimport { useGridReplicaUsers } from './hooks/useGridReplicaUsers'\nimport { useRemoteSelections } from './hooks/useRemoteSelections'\nimport { enrichRowsWithChangeInfo } from './utils/enrichRowsWithChangeInfo'\nimport CertificationRequirement from '@/components/AccessRequirementList/RequirementItem/CertificationRequirement'\nimport { ValidationAlert } from './components/ValidationAlert'\nimport { SynapseErrorBoundary } from '@/components/error/ErrorBanner'\nimport { useErrorHandler } from 'react-error-boundary'\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={<SmartToyTwoTone />}\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
+ {"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":"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"}
@@ -8,7 +8,7 @@ var t = "__rowKey", n = (t) => {
8
8
  } : e.test(n) ? {
9
9
  type: "recordSetId",
10
10
  input: n
11
- } : /^[A-Za-z]\w*=+$/.test(n) ? {
11
+ } : /^[A-Za-z]\w*=*$/.test(n) ? {
12
12
  type: "sessionId",
13
13
  input: n
14
14
  } : {
@@ -1 +1 @@
1
- {"version":3,"file":"DataGridUtils.js","names":["SYNAPSE_ENTITY_ID_REGEX","DataGridRow","Operation","QueryInput","GRID_ROW_REACT_KEY_PROPERTY","parseQueryInput","input","trimmedInput","trim","type","toUpperCase","startsWith","test","rowsAreIdentical","a","b","isDataKey","key","aKeys","Object","keys","filter","bKeys","length","aVal","bVal","isNullish","v","undefined","is","removeNoOpOperations","newValue","rowValues","operations","isNoop","operation","oldVal","slice","fromRowIndex","toRowIndex","newVal","comparisonResults","map","oldItem","idx","every","Boolean","op"],"sources":["../../../../src/components/DataGrid/utils/DataGridUtils.ts"],"sourcesContent":["import { SYNAPSE_ENTITY_ID_REGEX } from '@/utils/functions/RegularExpressions'\nimport { DataGridRow, Operation, QueryInput } from '../DataGridTypes'\n\n// We embed a value into the in row data passed to react-datasheet-grid for use as a render optimization\nexport const GRID_ROW_REACT_KEY_PROPERTY = '__rowKey'\n\n// Query Input can either be an empty string, a SQL query, or a session ID\nexport const parseQueryInput = (input: string): QueryInput => {\n const trimmedInput = input.trim()\n if (!trimmedInput) {\n return { type: 'empty', input: '' }\n } else if (trimmedInput.toUpperCase().startsWith('SELECT')) {\n return { type: 'sql', input: trimmedInput }\n } else if (SYNAPSE_ENTITY_ID_REGEX.test(trimmedInput)) {\n return { type: 'recordSetId', input: trimmedInput }\n } else if (/^[A-Za-z]\\w*=+$/.test(trimmedInput)) {\n return { type: 'sessionId', input: trimmedInput }\n }\n return { type: 'unknown', input: trimmedInput }\n}\n\nexport function rowsAreIdentical(a: DataGridRow, b: DataGridRow): boolean {\n const isDataKey = (key: string) => !key.startsWith('__')\n const aKeys = Object.keys(a).filter(isDataKey)\n const bKeys = Object.keys(b).filter(isDataKey)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n const aVal = a[key] as string | number | boolean | null | undefined\n const bVal = b[key] as string | number | boolean | null | undefined\n // Treat null, undefined, and empty string as equivalent\n const isNullish = (v: unknown) => v === null || v === undefined || v === ''\n if (isNullish(aVal) && isNullish(bVal)) continue\n if (!Object.is(aVal, bVal)) return false\n }\n return true\n}\n\n/**\n * Remove no-op operations created by react-datasheet-grid that would result in invalid or undesired changes to the json-joy CRDT model\n * @param newValue\n * @param rowValues\n * @param operations\n */\nexport function removeNoOpOperations(\n newValue: DataGridRow[],\n rowValues: DataGridRow[],\n operations: Operation[],\n) {\n function isNoop(operation: Operation): boolean {\n if (operation.type === 'UPDATE') {\n const oldVal = rowValues.slice(\n operation.fromRowIndex,\n operation.toRowIndex,\n )\n const newVal = newValue.slice(\n operation.fromRowIndex,\n operation.toRowIndex,\n )\n\n const comparisonResults = oldVal.map((oldItem, idx) =>\n rowsAreIdentical(oldItem, newVal[idx]),\n )\n return comparisonResults.every(Boolean)\n }\n return false\n }\n\n return operations.filter(op => !isNoop(op))\n}\n"],"mappings":";;AAIA,IAAaI,IAA8B,YAG9BC,KAAmBC,MAA8B;CAC5D,IAAMC,IAAeD,EAAME,KAAK;CAUhC,OATKD,IAEMA,EAAaG,YAAY,EAAEC,WAAW,QAAQ,IAChD;EAAEF,MAAM;EAAOH,OAAOC;CAAa,IACjCP,EAAwBY,KAAKL,CAAY,IAC3C;EAAEE,MAAM;EAAeH,OAAOC;CAAa,IACzC,kBAAkBK,KAAKL,CAAY,IACrC;EAAEE,MAAM;EAAaH,OAAOC;CAAa,IAE3C;EAAEE,MAAM;EAAWH,OAAOC;CAAa,IARrC;EAAEE,MAAM;EAASH,OAAO;CAAG;AAStC;AAEA,SAAgBO,EAAiBC,GAAgBC,GAAyB;CACxE,IAAMC,KAAaC,MAAgB,CAACA,EAAIN,WAAW,IAAI,GACjDO,IAAQC,OAAOC,KAAKN,CAAC,EAAEO,OAAOL,CAAS,GACvCM,IAAQH,OAAOC,KAAKL,CAAC,EAAEM,OAAOL,CAAS;CAC7C,IAAIE,EAAMK,WAAWD,EAAMC,QAAQ,OAAO;CAC1C,KAAK,IAAMN,KAAOC,GAAO;EACvB,IAAMM,IAAOV,EAAEG,IACTQ,IAAOV,EAAEE,IAETS,KAAaC,MAAeA,KAAM,QAA2BA,MAAM;EACrED,QAAUF,CAAI,KAAKE,EAAUD,CAAI,MACjC,CAACN,OAAOU,GAAGL,GAAMC,CAAI,GAAG,OAAO;CACrC;CACA,OAAO;AACT;AAQA,SAAgBK,EACdC,GACAC,GACAC,GACA;CACA,SAASC,EAAOC,GAA+B;EAC7C,IAAIA,EAAU1B,SAAS,UAAU;GAC/B,IAAM2B,IAASJ,EAAUK,MACvBF,EAAUG,cACVH,EAAUI,UACZ,GACMC,IAAST,EAASM,MACtBF,EAAUG,cACVH,EAAUI,UACZ;GAKA,OAH0BH,EAAOM,KAAKC,GAASC,MAC7C/B,EAAiB8B,GAASH,EAAOI,EAAI,CAEhCH,EAAkBI,MAAMC,OAAO;EACxC;EACA,OAAO;CACT;CAEA,OAAOb,EAAWZ,QAAO0B,MAAM,CAACb,EAAOa,CAAE,CAAC;AAC5C"}
1
+ {"version":3,"file":"DataGridUtils.js","names":["SYNAPSE_ENTITY_ID_REGEX","DataGridRow","Operation","QueryInput","GRID_ROW_REACT_KEY_PROPERTY","parseQueryInput","input","trimmedInput","trim","type","toUpperCase","startsWith","test","rowsAreIdentical","a","b","isDataKey","key","aKeys","Object","keys","filter","bKeys","length","aVal","bVal","isNullish","v","undefined","is","removeNoOpOperations","newValue","rowValues","operations","isNoop","operation","oldVal","slice","fromRowIndex","toRowIndex","newVal","comparisonResults","map","oldItem","idx","every","Boolean","op"],"sources":["../../../../src/components/DataGrid/utils/DataGridUtils.ts"],"sourcesContent":["import { SYNAPSE_ENTITY_ID_REGEX } from '@/utils/functions/RegularExpressions'\nimport { DataGridRow, Operation, QueryInput } from '../DataGridTypes'\n\n// We embed a value into the in row data passed to react-datasheet-grid for use as a render optimization\nexport const GRID_ROW_REACT_KEY_PROPERTY = '__rowKey'\n\n// Query Input can either be an empty string, a SQL query, or a session ID\nexport const parseQueryInput = (input: string): QueryInput => {\n const trimmedInput = input.trim()\n if (!trimmedInput) {\n return { type: 'empty', input: '' }\n } else if (trimmedInput.toUpperCase().startsWith('SELECT')) {\n return { type: 'sql', input: trimmedInput }\n } else if (SYNAPSE_ENTITY_ID_REGEX.test(trimmedInput)) {\n return { type: 'recordSetId', input: trimmedInput }\n } else if (/^[A-Za-z]\\w*=*$/.test(trimmedInput)) {\n return { type: 'sessionId', input: trimmedInput }\n }\n return { type: 'unknown', input: trimmedInput }\n}\n\nexport function rowsAreIdentical(a: DataGridRow, b: DataGridRow): boolean {\n const isDataKey = (key: string) => !key.startsWith('__')\n const aKeys = Object.keys(a).filter(isDataKey)\n const bKeys = Object.keys(b).filter(isDataKey)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n const aVal = a[key] as string | number | boolean | null | undefined\n const bVal = b[key] as string | number | boolean | null | undefined\n // Treat null, undefined, and empty string as equivalent\n const isNullish = (v: unknown) => v === null || v === undefined || v === ''\n if (isNullish(aVal) && isNullish(bVal)) continue\n if (!Object.is(aVal, bVal)) return false\n }\n return true\n}\n\n/**\n * Remove no-op operations created by react-datasheet-grid that would result in invalid or undesired changes to the json-joy CRDT model\n * @param newValue\n * @param rowValues\n * @param operations\n */\nexport function removeNoOpOperations(\n newValue: DataGridRow[],\n rowValues: DataGridRow[],\n operations: Operation[],\n) {\n function isNoop(operation: Operation): boolean {\n if (operation.type === 'UPDATE') {\n const oldVal = rowValues.slice(\n operation.fromRowIndex,\n operation.toRowIndex,\n )\n const newVal = newValue.slice(\n operation.fromRowIndex,\n operation.toRowIndex,\n )\n\n const comparisonResults = oldVal.map((oldItem, idx) =>\n rowsAreIdentical(oldItem, newVal[idx]),\n )\n return comparisonResults.every(Boolean)\n }\n return false\n }\n\n return operations.filter(op => !isNoop(op))\n}\n"],"mappings":";;AAIA,IAAaI,IAA8B,YAG9BC,KAAmBC,MAA8B;CAC5D,IAAMC,IAAeD,EAAME,KAAK;CAUhC,OATKD,IAEMA,EAAaG,YAAY,EAAEC,WAAW,QAAQ,IAChD;EAAEF,MAAM;EAAOH,OAAOC;CAAa,IACjCP,EAAwBY,KAAKL,CAAY,IAC3C;EAAEE,MAAM;EAAeH,OAAOC;CAAa,IACzC,kBAAkBK,KAAKL,CAAY,IACrC;EAAEE,MAAM;EAAaH,OAAOC;CAAa,IAE3C;EAAEE,MAAM;EAAWH,OAAOC;CAAa,IARrC;EAAEE,MAAM;EAASH,OAAO;CAAG;AAStC;AAEA,SAAgBO,EAAiBC,GAAgBC,GAAyB;CACxE,IAAMC,KAAaC,MAAgB,CAACA,EAAIN,WAAW,IAAI,GACjDO,IAAQC,OAAOC,KAAKN,CAAC,EAAEO,OAAOL,CAAS,GACvCM,IAAQH,OAAOC,KAAKL,CAAC,EAAEM,OAAOL,CAAS;CAC7C,IAAIE,EAAMK,WAAWD,EAAMC,QAAQ,OAAO;CAC1C,KAAK,IAAMN,KAAOC,GAAO;EACvB,IAAMM,IAAOV,EAAEG,IACTQ,IAAOV,EAAEE,IAETS,KAAaC,MAAeA,KAAM,QAA2BA,MAAM;EACrED,QAAUF,CAAI,KAAKE,EAAUD,CAAI,MACjC,CAACN,OAAOU,GAAGL,GAAMC,CAAI,GAAG,OAAO;CACrC;CACA,OAAO;AACT;AAQA,SAAgBK,EACdC,GACAC,GACAC,GACA;CACA,SAASC,EAAOC,GAA+B;EAC7C,IAAIA,EAAU1B,SAAS,UAAU;GAC/B,IAAM2B,IAASJ,EAAUK,MACvBF,EAAUG,cACVH,EAAUI,UACZ,GACMC,IAAST,EAASM,MACtBF,EAAUG,cACVH,EAAUI,UACZ;GAKA,OAH0BH,EAAOM,KAAKC,GAASC,MAC7C/B,EAAiB8B,GAASH,EAAOI,EAAI,CAEhCH,EAAkBI,MAAMC,OAAO;EACxC;EACA,OAAO;CACT;CAEA,OAAOb,EAAWZ,QAAO0B,MAAM,CAACb,EAAOa,CAAE,CAAC;AAC5C"}