synapse-react-client 4.0.21 → 4.0.23

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 (191) hide show
  1. package/dist/SWC.index.d.ts +1 -0
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +2 -1
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/assets/icons/GeneticsIcon.d.ts +3 -0
  6. package/dist/assets/icons/GeneticsIcon.d.ts.map +1 -0
  7. package/dist/assets/icons/GeneticsIcon.js +14 -0
  8. package/dist/assets/icons/GeneticsIcon.js.map +1 -0
  9. package/dist/components/CardContainer/CardContainer.d.ts.map +1 -1
  10. package/dist/components/CardContainer/CardContainer.js +43 -49
  11. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  12. package/dist/components/CardContainerLogic/CardContainerLogic.d.ts +13 -0
  13. package/dist/components/CardContainerLogic/CardContainerLogic.d.ts.map +1 -1
  14. package/dist/components/CardContainerLogic/CardContainerLogic.js +64 -40
  15. package/dist/components/CardContainerLogic/CardContainerLogic.js.map +1 -1
  16. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js +1 -1
  17. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
  18. package/dist/components/DataExplorer/DataExplorer.css +1 -1
  19. package/dist/components/DataExplorer/DataExplorer.module.js +16 -16
  20. package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -1
  21. package/dist/components/DataExplorer/DataExplorer.module.scss +0 -1
  22. package/dist/components/DataGrid/DataGrid.d.ts +1 -0
  23. package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
  24. package/dist/components/DataGrid/DataGrid.js +72 -72
  25. package/dist/components/DataGrid/DataGrid.js.map +1 -1
  26. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  27. package/dist/components/DataGrid/SynapseGrid.js +209 -206
  28. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  29. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.d.ts +2 -1
  30. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.d.ts.map +1 -1
  31. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js +51 -42
  32. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js.map +1 -1
  33. package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
  34. package/dist/components/DataGrid/useDataGridWebsocket.js +68 -67
  35. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  36. package/dist/components/DataGrid/utils/columnFactory.d.ts +1 -0
  37. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  38. package/dist/components/DataGrid/utils/columnFactory.js +4 -3
  39. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  40. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts +1 -1
  41. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
  42. package/dist/components/DataGrid/utils/modelColsToGrid.js +15 -14
  43. package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
  44. package/dist/components/DataGrid/utils/normalizeWebsocketError.d.ts +7 -0
  45. package/dist/components/DataGrid/utils/normalizeWebsocketError.d.ts.map +1 -0
  46. package/dist/components/DataGrid/utils/normalizeWebsocketError.js +8 -0
  47. package/dist/components/DataGrid/utils/normalizeWebsocketError.js.map +1 -0
  48. package/dist/components/EntityCitation/EntityCitation.d.ts.map +1 -1
  49. package/dist/components/EntityCitation/EntityCitation.js +23 -8
  50. package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
  51. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.d.ts +18 -0
  52. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.d.ts.map +1 -0
  53. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js +112 -0
  54. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js.map +1 -0
  55. package/dist/components/GenericCard/DuoTermTags/duoTerms.d.ts +31 -0
  56. package/dist/components/GenericCard/DuoTermTags/duoTerms.d.ts.map +1 -0
  57. package/dist/components/GenericCard/DuoTermTags/duoTerms.js +198 -0
  58. package/dist/components/GenericCard/DuoTermTags/duoTerms.js.map +1 -0
  59. package/dist/components/GenericCard/SynapseCardLabel.d.ts.map +1 -1
  60. package/dist/components/GenericCard/SynapseCardLabel.js +4 -8
  61. package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
  62. package/dist/components/GenericCard/TableRowGenericCard.d.ts +6 -0
  63. package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
  64. package/dist/components/GenericCard/TableRowGenericCard.js +168 -153
  65. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  66. package/dist/components/Goals/Goals.d.ts +8 -0
  67. package/dist/components/Goals/Goals.d.ts.map +1 -1
  68. package/dist/components/Goals/Goals.js +54 -40
  69. package/dist/components/Goals/Goals.js.map +1 -1
  70. package/dist/components/IconSvg/IconSvg.d.ts +1 -1
  71. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  72. package/dist/components/IconSvg/IconSvg.js +19 -18
  73. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  74. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.d.ts +9 -0
  75. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.d.ts.map +1 -0
  76. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.js +69 -0
  77. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.js.map +1 -0
  78. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.d.ts +13 -0
  79. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.d.ts.map +1 -0
  80. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.js +11 -0
  81. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.js.map +1 -0
  82. package/dist/components/ProjectVisibilityChip/index.d.ts +5 -0
  83. package/dist/components/ProjectVisibilityChip/index.d.ts.map +1 -0
  84. package/dist/components/ProjectVisibilityChip/index.js +7 -0
  85. package/dist/components/ProjectVisibilityChip/index.js.map +1 -0
  86. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.d.ts +21 -0
  87. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.d.ts.map +1 -1
  88. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.js.map +1 -1
  89. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts +10 -0
  90. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
  91. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +66 -60
  92. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  93. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -1
  94. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  95. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +2 -0
  96. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  97. package/dist/components/QueryWrapperPlotNav/RowSetView.d.ts.map +1 -1
  98. package/dist/components/QueryWrapperPlotNav/RowSetView.js +9 -12
  99. package/dist/components/QueryWrapperPlotNav/RowSetView.js.map +1 -1
  100. package/dist/components/RssFeedCards/RssFeedCards.d.ts +7 -15
  101. package/dist/components/RssFeedCards/RssFeedCards.d.ts.map +1 -1
  102. package/dist/components/RssFeedCards/RssFeedCards.js +114 -123
  103. package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
  104. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +33 -6
  105. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
  106. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +93 -55
  107. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  108. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts +3 -0
  109. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts.map +1 -1
  110. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js +39 -37
  111. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js.map +1 -1
  112. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +3 -1
  113. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -1
  114. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +4 -0
  115. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -1
  116. package/dist/components/UserCardList/UserCardList.d.ts +2 -20
  117. package/dist/components/UserCardList/UserCardList.d.ts.map +1 -1
  118. package/dist/components/UserCardList/UserCardList.js +49 -72
  119. package/dist/components/UserCardList/UserCardList.js.map +1 -1
  120. package/dist/components/UserCardList/UserCardListRotate.d.ts +13 -0
  121. package/dist/components/UserCardList/UserCardListRotate.d.ts.map +1 -1
  122. package/dist/components/UserCardList/UserCardListRotate.js +82 -57
  123. package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
  124. package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts +5 -2
  125. package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts.map +1 -1
  126. package/dist/components/entity/page/action_menu/EntityActionMenu.js +68 -51
  127. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  128. package/dist/components/index.d.ts +1 -0
  129. package/dist/components/index.d.ts.map +1 -1
  130. package/dist/components/menu/ComplexMenu.d.ts +8 -1
  131. package/dist/components/menu/ComplexMenu.d.ts.map +1 -1
  132. package/dist/components/menu/ComplexMenu.js +50 -20
  133. package/dist/components/menu/ComplexMenu.js.map +1 -1
  134. package/dist/components/widgets/facet-nav/FacetValueChip.d.ts +25 -0
  135. package/dist/components/widgets/facet-nav/FacetValueChip.d.ts.map +1 -0
  136. package/dist/components/widgets/facet-nav/FacetValueChip.js +40 -0
  137. package/dist/components/widgets/facet-nav/FacetValueChip.js.map +1 -0
  138. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.d.ts +10 -5
  139. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.d.ts.map +1 -1
  140. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.js +10 -17
  141. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.js.map +1 -1
  142. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.d.ts.map +1 -1
  143. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js +11 -10
  144. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
  145. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
  146. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +70 -54
  147. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  148. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts +2 -1
  149. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts.map +1 -1
  150. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js +17 -1
  151. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js.map +1 -1
  152. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts +2 -0
  153. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts.map +1 -1
  154. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js +7 -7
  155. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
  156. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -1
  157. package/dist/features/curator/dashboard/components/CurationTaskCard.js +99 -45
  158. package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -1
  159. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -1
  160. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +174 -149
  161. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -1
  162. package/dist/features/entity/metadata-task/utils/constants.d.ts +6 -0
  163. package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -1
  164. package/dist/features/entity/metadata-task/utils/constants.js +19 -2
  165. package/dist/features/entity/metadata-task/utils/constants.js.map +1 -1
  166. package/dist/style/abstracts/_cssVariables.scss +1 -0
  167. package/dist/style/components/_total-query-results.scss +10 -34
  168. package/dist/style/main.css +1 -1
  169. package/dist/synapse-queries/KeyFactory.d.ts +1 -0
  170. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  171. package/dist/synapse-queries/KeyFactory.js +3 -0
  172. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  173. package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
  174. package/dist/synapse-queries/curation/task/useCurationTask.js +1 -1
  175. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  176. package/dist/synapse-queries/index.js +46 -44
  177. package/dist/synapse-queries/user/index.js +3 -3
  178. package/dist/synapse-queries/user/useUserBundle.d.ts +12 -0
  179. package/dist/synapse-queries/user/useUserBundle.d.ts.map +1 -1
  180. package/dist/synapse-queries/user/useUserBundle.js +50 -36
  181. package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
  182. package/dist/tsconfig.build.tsbuildinfo +1 -1
  183. package/dist/utils/AppUtils/session/SessionInitializedGuard.d.ts +10 -5
  184. package/dist/utils/AppUtils/session/SessionInitializedGuard.d.ts.map +1 -1
  185. package/dist/utils/AppUtils/session/SessionInitializedGuard.js +13 -9
  186. package/dist/utils/AppUtils/session/SessionInitializedGuard.js.map +1 -1
  187. package/dist/utils/functions/SqlFunctions.d.ts +1 -1
  188. package/dist/utils/functions/SqlFunctions.d.ts.map +1 -1
  189. package/dist/utils/functions/SqlFunctions.js +1 -1
  190. package/dist/utils/functions/SqlFunctions.js.map +1 -1
  191. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseGrid.js","names":["GridMenuButton","UploadCsvToGridButton","ExportCsvFromGridButton","useGetSchemaForGrid","MergeGridWithSourceTableButton","computeReplicaSelectionModel","modelRowsToGrid","SkeletonTable","useGetEntity","getSchemaPropertiesInfo","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","t18","schemaPropertiesInfo","connectionStatus","remoteSelections","t19","rowValues","t20","enrichedRowValues","t21","sendPatch","commit","t22","t23","t24","model_0","modelChanges","forEach","change","applyAndCommitChanges","t25","change_0","console","error","type","applyModelChangeFromUndoRedo","undoUI","redoUI","addOperationsToUndoStack","clearRedoStack","t26","newValue","operations","length","modelChanges_0","handleChange","t27","opts","selection","replicaSelectionModel","toString","handleSelectionChange","t28","rowIndex","colIndex","col","row","handleNavigateToCell","isCertified","t29","xs","xl","t30","t31","t32","gridJsonSchema$Id","substring","color","connectedReplicas","filter","_temp","map","r_0","i","r","margin","fontSize","JSON","stringify","cursor","textDecoration","t33","t34","columnNames","columnOrder","marginBottom","justifyContent","display","alignItems","gap","mr","padding","border","maxHeight","overflowY","t35","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 MergeGridWithSourceTableButton from '@/components/DataGrid/MergeGridWithSourceTableButton'\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 { 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 // 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 {(!hasCompletedInitialSync || isSyncing) && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n mr: 'auto',\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 <MergeGridWithSourceTableButton\n sourceEntityId={session.sourceEntityId}\n gridSessionId={session.sessionId!}\n />\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 />\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":["GridMenuButton","UploadCsvToGridButton","ExportCsvFromGridButton","useGetSchemaForGrid","MergeGridWithSourceTableButton","computeReplicaSelectionModel","modelRowsToGrid","SkeletonTable","useGetEntity","getSchemaPropertiesInfo","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","display","alignItems","gap","mr","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 MergeGridWithSourceTableButton from '@/components/DataGrid/MergeGridWithSourceTableButton'\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 { 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 {(!hasCompletedInitialSync || isSyncing) && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n mr: 'auto',\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 <MergeGridWithSourceTableButton\n sourceEntityId={session.sourceEntityId}\n gridSessionId={session.sessionId!}\n />\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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"}
@@ -2,6 +2,7 @@ type ColumnHeaderWithTooltipProps = {
2
2
  name: string;
3
3
  description?: string;
4
4
  isRequired?: boolean;
5
+ isUpsertKey?: boolean;
5
6
  showPinIcon?: boolean;
6
7
  isPinned?: boolean;
7
8
  onTogglePin?: () => void;
@@ -11,6 +12,6 @@ type ColumnHeaderWithTooltipProps = {
11
12
  * name shows it as a native tooltip; otherwise the column name is shown (useful
12
13
  * for truncated headers). An optional pin icon is shown on the right.
13
14
  */
14
- export declare function ColumnHeaderWithTooltip({ name, description, isRequired, showPinIcon, isPinned, onTogglePin, }: ColumnHeaderWithTooltipProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function ColumnHeaderWithTooltip({ name, description, isRequired, isUpsertKey, showPinIcon, isPinned, onTogglePin, }: ColumnHeaderWithTooltipProps): import("react/jsx-runtime").JSX.Element;
15
16
  export {};
16
17
  //# sourceMappingURL=ColumnHeaderWithTooltip.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ColumnHeaderWithTooltip.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/components/ColumnHeaderWithTooltip.tsx"],"names":[],"mappings":"AAIA,KAAK,4BAA4B,GAAG;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;CACzB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,WAAW,EACX,UAAkB,EAClB,WAAmB,EACnB,QAAgB,EAChB,WAAW,GACZ,EAAE,4BAA4B,2CAqE9B"}
1
+ {"version":3,"file":"ColumnHeaderWithTooltip.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/components/ColumnHeaderWithTooltip.tsx"],"names":[],"mappings":"AAIA,KAAK,4BAA4B,GAAG;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;CACzB,CAAA;AAKD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,WAAW,EACX,UAAkB,EAClB,WAAmB,EACnB,WAAmB,EACnB,QAAgB,EAChB,WAAW,GACZ,EAAE,4BAA4B,2CAgF9B"}
@@ -1,81 +1,90 @@
1
1
  import "../../SynapseTable/SynapseTableConstants.js";
2
2
  import { Box as e, IconButton as t, Tooltip as n } from "@mui/material";
3
3
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
- import { PushPin as a, PushPinOutlined as o } from "@mui/icons-material";
5
- import { c as s } from "react/compiler-runtime";
4
+ import { Key as a, PushPin as o, PushPinOutlined as s } from "@mui/icons-material";
5
+ import { c } from "react/compiler-runtime";
6
6
  //#region src/components/DataGrid/components/ColumnHeaderWithTooltip.tsx
7
- function c(c) {
8
- let l = s(19), { name: u, description: d, isRequired: f, showPinIcon: p, isPinned: m, onTogglePin: h } = c, g = f === void 0 ? !1 : f, _ = p === void 0 ? !1 : p, v = m === void 0 ? !1 : m, y;
9
- l[0] === Symbol.for("react.memo_cache_sentinel") ? (y = {
7
+ var l = "This property field is the primary key. It is used to match the existing rows when applying updates. If a value already exists the row is updated; if not, a new row is added. If multiple primary keys are defined, all primary key values must match for an existing row to be updated.";
8
+ function u(u) {
9
+ let d = c(22), { name: f, description: p, isRequired: m, isUpsertKey: h, showPinIcon: g, isPinned: _, onTogglePin: v } = u, y = m === void 0 ? !1 : m, b = h === void 0 ? !1 : h, x = g === void 0 ? !1 : g, S = _ === void 0 ? !1 : _, C;
10
+ d[0] === Symbol.for("react.memo_cache_sentinel") ? (C = {
10
11
  display: "grid",
11
12
  gridTemplateColumns: "minmax(0, 1fr) auto",
12
13
  gap: .5,
13
14
  width: "100%",
14
15
  alignItems: "center",
15
16
  minWidth: 0
16
- }, l[0] = y) : y = l[0];
17
- let b;
18
- l[1] === Symbol.for("react.memo_cache_sentinel") ? (b = {
17
+ }, d[0] = C) : C = d[0];
18
+ let w;
19
+ d[1] === Symbol.for("react.memo_cache_sentinel") ? (w = {
19
20
  overflow: "hidden",
20
21
  textOverflow: "ellipsis",
21
22
  whiteSpace: "nowrap",
22
23
  minWidth: 0
23
- }, l[1] = b) : b = l[1];
24
- let x = d || u, S;
25
- l[2] === g ? S = l[3] : (S = g && /* @__PURE__ */ r(e, {
24
+ }, d[1] = w) : w = d[1];
25
+ let T = p || f, E;
26
+ d[2] === y ? E = d[3] : (E = y && /* @__PURE__ */ r(e, {
26
27
  component: "span",
27
28
  sx: {
28
29
  color: "error.main",
29
30
  ml: .25
30
31
  },
31
32
  children: "*"
32
- }), l[2] = g, l[3] = S);
33
- let C;
34
- l[4] !== u || l[5] !== x || l[6] !== S ? (C = /* @__PURE__ */ i(e, {
33
+ }), d[2] = y, d[3] = E);
34
+ let D;
35
+ d[4] !== f || d[5] !== T || d[6] !== E ? (D = /* @__PURE__ */ i(e, {
35
36
  component: "span",
36
- sx: b,
37
- title: x,
38
- children: [u, S]
39
- }), l[4] = u, l[5] = x, l[6] = S, l[7] = C) : C = l[7];
40
- let w;
41
- l[8] === Symbol.for("react.memo_cache_sentinel") ? (w = {
37
+ sx: w,
38
+ title: T,
39
+ children: [f, E]
40
+ }), d[4] = f, d[5] = T, d[6] = E, d[7] = D) : D = d[7];
41
+ let O;
42
+ d[8] === Symbol.for("react.memo_cache_sentinel") ? (O = {
42
43
  display: "flex",
43
44
  gap: .5,
44
- flexShrink: 0
45
- }, l[8] = w) : w = l[8];
46
- let T;
47
- l[9] !== v || l[10] !== h || l[11] !== _ ? (T = _ && h && /* @__PURE__ */ r(n, {
48
- title: v ? "Unpin column" : "Pin column",
45
+ flexShrink: 0,
46
+ alignItems: "center"
47
+ }, d[8] = O) : O = d[8];
48
+ let k;
49
+ d[9] === b ? k = d[10] : (k = b && /* @__PURE__ */ r(n, {
50
+ title: l,
51
+ placement: "top",
52
+ enterNextDelay: 500,
53
+ children: /* @__PURE__ */ r(a, { sx: { fontSize: "1em" } })
54
+ }), d[9] = b, d[10] = k);
55
+ let A;
56
+ d[11] !== S || d[12] !== v || d[13] !== x ? (A = x && v && /* @__PURE__ */ r(n, {
57
+ title: S ? "Unpin column" : "Pin column",
49
58
  placement: "top",
50
59
  enterNextDelay: 500,
51
60
  children: /* @__PURE__ */ r(t, {
52
61
  size: "small",
53
62
  color: "inherit",
54
- "aria-label": v ? "Unpin column" : "Pin column",
63
+ "aria-label": S ? "Unpin column" : "Pin column",
55
64
  onMouseDown: (e) => {
56
- e.stopPropagation(), h();
65
+ e.stopPropagation(), v();
57
66
  },
58
67
  sx: {
59
68
  color: "inherit",
60
- opacity: v ? 1 : .7,
69
+ opacity: S ? 1 : .7,
61
70
  "&:hover": { opacity: 1 }
62
71
  },
63
- children: r(v ? a : o, { fontSize: "inherit" })
72
+ children: r(S ? o : s, { fontSize: "inherit" })
64
73
  })
65
- }), l[9] = v, l[10] = h, l[11] = _, l[12] = T) : T = l[12];
66
- let E;
67
- l[13] === T ? E = l[14] : (E = /* @__PURE__ */ r(e, {
68
- sx: w,
69
- children: T
70
- }), l[13] = T, l[14] = E);
71
- let D;
72
- return l[15] !== u || l[16] !== E || l[17] !== C ? (D = /* @__PURE__ */ i(e, {
73
- "data-column-id": u,
74
- sx: y,
75
- children: [C, E]
76
- }), l[15] = u, l[16] = E, l[17] = C, l[18] = D) : D = l[18], D;
74
+ }), d[11] = S, d[12] = v, d[13] = x, d[14] = A) : A = d[14];
75
+ let j;
76
+ d[15] !== k || d[16] !== A ? (j = /* @__PURE__ */ i(e, {
77
+ sx: O,
78
+ children: [k, A]
79
+ }), d[15] = k, d[16] = A, d[17] = j) : j = d[17];
80
+ let M;
81
+ return d[18] !== f || d[19] !== j || d[20] !== D ? (M = /* @__PURE__ */ i(e, {
82
+ "data-column-id": f,
83
+ sx: C,
84
+ children: [D, j]
85
+ }), d[18] = f, d[19] = j, d[20] = D, d[21] = M) : M = d[21], M;
77
86
  }
78
87
  //#endregion
79
- export { c as ColumnHeaderWithTooltip };
88
+ export { u as ColumnHeaderWithTooltip };
80
89
 
81
90
  //# sourceMappingURL=ColumnHeaderWithTooltip.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ColumnHeaderWithTooltip.js","names":["Box","IconButton","Tooltip","PushPin","PushPinOutlined","TOOLTIP_DELAY_SHOW","ColumnHeaderWithTooltipProps","name","description","isRequired","showPinIcon","isPinned","onTogglePin","ColumnHeaderWithTooltip","t0","$","_c","t1","t2","t3","undefined","t4","Symbol","for","display","gridTemplateColumns","gap","width","alignItems","minWidth","t5","overflow","textOverflow","whiteSpace","t6","t7","color","ml","t8","t9","flexShrink","t10","e","stopPropagation","opacity","t11","t12"],"sources":["../../../../src/components/DataGrid/components/ColumnHeaderWithTooltip.tsx"],"sourcesContent":["import { Box, IconButton, Tooltip } from '@mui/material'\nimport { PushPin, PushPinOutlined } from '@mui/icons-material'\nimport { TOOLTIP_DELAY_SHOW } from '@/components/SynapseTable/SynapseTableConstants'\n\ntype ColumnHeaderWithTooltipProps = {\n name: string\n description?: string\n isRequired?: boolean\n showPinIcon?: boolean\n isPinned?: boolean\n onTogglePin?: () => void\n}\n\n/**\n * Renders a column header. When a description is provided, hovering the column\n * name shows it as a native tooltip; otherwise the column name is shown (useful\n * for truncated headers). An optional pin icon is shown on the right.\n */\nexport function ColumnHeaderWithTooltip({\n name,\n description,\n isRequired = false,\n showPinIcon = false,\n isPinned = false,\n onTogglePin,\n}: ColumnHeaderWithTooltipProps) {\n return (\n <Box\n data-column-id={name}\n sx={{\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) auto',\n gap: 0.5,\n width: '100%',\n alignItems: 'center',\n minWidth: 0,\n }}\n >\n {/* Text area - shrinks first */}\n <Box\n component=\"span\"\n sx={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n minWidth: 0,\n }}\n title={description || name}\n >\n {name}\n {isRequired && (\n <Box component=\"span\" sx={{ color: 'error.main', ml: 0.25 }}>\n *\n </Box>\n )}\n </Box>\n\n {/* Icons area - fixed size, never shrinks */}\n <Box sx={{ display: 'flex', gap: 0.5, flexShrink: 0 }}>\n {showPinIcon && onTogglePin && (\n <Tooltip\n title={isPinned ? 'Unpin column' : 'Pin column'}\n placement=\"top\"\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n >\n <IconButton\n size=\"small\"\n color=\"inherit\"\n aria-label={isPinned ? 'Unpin column' : 'Pin column'}\n // Use onMouseDown instead of onClick to prevent column selection\n // when clicking the pin icon. stopPropagation prevents event bubbling.\n onMouseDown={e => {\n e.stopPropagation()\n onTogglePin()\n }}\n sx={{\n color: 'inherit',\n opacity: isPinned ? 1 : 0.7,\n '&:hover': {\n opacity: 1,\n },\n }}\n >\n {isPinned ? (\n <PushPin fontSize=\"inherit\" />\n ) : (\n <PushPinOutlined fontSize=\"inherit\" />\n )}\n </IconButton>\n </Tooltip>\n )}\n </Box>\n </Box>\n )\n}\n"],"mappings":";;;;;;AAkBA,SAAOa,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAiC,EAAAT,SAAAC,gBAAAC,YAAAQ,GAAAP,aAAAQ,GAAAP,UAAAQ,GAAAP,mBAAAE,GAGtCL,IAAAQ,MAAAG,KAAAA,IAAA,KAAAH,GACAP,IAAAQ,MAAAE,KAAAA,IAAA,KAAAF,GACAP,IAAAQ,MAAAC,KAAAA,IAAA,KAAAD,GAAgBE;CAAA,AAAAN,EAAA,OAAAO,OAAAC,IAAA,2BAAA,KAMRF,IAAA;EAAAG,SACO;EAAMC,qBACM;EAAqBC,KACrC;EAAGC,OACD;EAAMC,YACD;EAAQC,UACV;CACZ,GAACd,EAAA,KAAAM,KAAAA,IAAAN,EAAA;CAAA,IAAAe;CAAA,AAAAf,EAAA,OAAAO,OAAAC,IAAA,2BAAA,KAKKO,IAAA;EAAAC,UACQ;EAAQC,cACJ;EAAUC,YACZ;EAAQJ,UACV;CACZ,GAACd,EAAA,KAAAe,KAAAA,IAAAf,EAAA;CACM,IAAAmB,IAAA1B,KAAAD,GAAmB4B;CAAA,AAAApB,EAAA,OAAAN,IAOzB0B,IAAApB,EAAA,MAJAoB,IAAA1B,KACC,kBAAC,GAAD;EAAe,WAAA;EAAW,IAAA;GAAA2B,OAAS;GAAYC,IAAM;EAAK;YAAG;CAAzD,CAAA,GAGLtB,EAAA,KAAAN,GAAAM,EAAA,KAAAoB;CAAA,IAAAG;CAAA,AAAAvB,EAAA,OAAAR,KAAAQ,EAAA,OAAAmB,KAAAnB,EAAA,OAAAoB,KAfHG,IAAA,kBAAC,GAAD;EACY,WAAA;EACN,IAAAR;EAMG,OAAAI;YART,CAUG3B,GACA4B,CAXC;KAgBEpB,EAAA,KAAAR,GAAAQ,EAAA,KAAAmB,GAAAnB,EAAA,KAAAoB,GAAApB,EAAA,KAAAuB,KAAAA,IAAAvB,EAAA;CAAA,IAAAwB;CAAA,AAAAxB,EAAA,OAAAO,OAAAC,IAAA,2BAAA,KAGGgB,IAAA;EAAAf,SAAW;EAAME,KAAO;EAAGc,YAAc;CAAE,GAACzB,EAAA,KAAAwB,KAAAA,IAAAxB,EAAA;CAAA,IAAA0B;CAAA,AAAA1B,EAAA,OAAAJ,KAAAI,EAAA,QAAAH,KAAAG,EAAA,QAAAL,KAClD+B,IAAA/B,KAAAE,KACC,kBAAC,GAAD;EACS,OAAAD,IAAA,iBAAA;EACG,WAAA;EACMN,gBAAAA;YAEhB,kBAAC,GAAD;GACO,MAAA;GACC,OAAA;GACM,cAAAM,IAAA,iBAAA;GAGC,cAAA+B,MAAA;IAEX9B,AADA8B,EAACC,gBAAiB,GAClB/B,EAAY;GAAC;GAEX,IAAA;IAAAwB,OACK;IAASQ,SACPjC,IAAA,IAAA;IAAkB,WAChB,EAAAiC,SACA,EACX;GACF;aAGE,EADDjC,IACE,IAEA,GAFD,EAAkB,UAAA,UAAS,CAEQ;EArB5B,CAAA;CALL,CAAA,GA8BTI,EAAA,KAAAJ,GAAAI,EAAA,MAAAH,GAAAG,EAAA,MAAAL,GAAAK,EAAA,MAAA0B,KAAAA,IAAA1B,EAAA;CAAA,IAAA8B;CAAA,AAAA9B,EAAA,QAAA0B,IACGI,IAAA9B,EAAA,OAjCN8B,IAAA,kBAAC,GAAD;EAAS,IAAAN;YACNE;CADC,CAAA,GAiCE1B,EAAA,MAAA0B,GAAA1B,EAAA,MAAA8B;CAAA,IAAAC;CACF,OADE/B,EAAA,QAAAR,KAAAQ,EAAA,QAAA8B,KAAA9B,EAAA,QAAAuB,KAhERQ,IAAA,kBAAC,GAAD;EACkBvC,kBAAAA;EACZ,IAAAc;YAFN,CAYEiB,GAmBAO,CA/BE;KAiEE9B,EAAA,MAAAR,GAAAQ,EAAA,MAAA8B,GAAA9B,EAAA,MAAAuB,GAAAvB,EAAA,MAAA+B,KAAAA,IAAA/B,EAAA,KAjEN+B;AAiEM"}
1
+ {"version":3,"file":"ColumnHeaderWithTooltip.js","names":["Box","IconButton","Tooltip","Key","PushPin","PushPinOutlined","TOOLTIP_DELAY_SHOW","ColumnHeaderWithTooltipProps","name","description","isRequired","isUpsertKey","showPinIcon","isPinned","onTogglePin","UPSERT_KEY_TOOLTIP_TEXT","ColumnHeaderWithTooltip","t0","$","_c","t1","t2","t3","t4","undefined","t5","Symbol","for","display","gridTemplateColumns","gap","width","alignItems","minWidth","t6","overflow","textOverflow","whiteSpace","t7","t8","color","ml","t9","t10","flexShrink","t11","fontSize","t12","e","stopPropagation","opacity","t13","t14"],"sources":["../../../../src/components/DataGrid/components/ColumnHeaderWithTooltip.tsx"],"sourcesContent":["import { Box, IconButton, Tooltip } from '@mui/material'\nimport { Key, PushPin, PushPinOutlined } from '@mui/icons-material'\nimport { TOOLTIP_DELAY_SHOW } from '@/components/SynapseTable/SynapseTableConstants'\n\ntype ColumnHeaderWithTooltipProps = {\n name: string\n description?: string\n isRequired?: boolean\n isUpsertKey?: boolean\n showPinIcon?: boolean\n isPinned?: boolean\n onTogglePin?: () => void\n}\n\nconst UPSERT_KEY_TOOLTIP_TEXT =\n 'This property field is the primary key. It is used to match the existing rows when applying updates. If a value already exists the row is updated; if not, a new row is added. If multiple primary keys are defined, all primary key values must match for an existing row to be updated.'\n\n/**\n * Renders a column header. When a description is provided, hovering the column\n * name shows it as a native tooltip; otherwise the column name is shown (useful\n * for truncated headers). An optional pin icon is shown on the right.\n */\nexport function ColumnHeaderWithTooltip({\n name,\n description,\n isRequired = false,\n isUpsertKey = false,\n showPinIcon = false,\n isPinned = false,\n onTogglePin,\n}: ColumnHeaderWithTooltipProps) {\n return (\n <Box\n data-column-id={name}\n sx={{\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) auto',\n gap: 0.5,\n width: '100%',\n alignItems: 'center',\n minWidth: 0,\n }}\n >\n {/* Text area - shrinks first */}\n <Box\n component=\"span\"\n sx={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n minWidth: 0,\n }}\n title={description || name}\n >\n {name}\n {isRequired && (\n <Box component=\"span\" sx={{ color: 'error.main', ml: 0.25 }}>\n *\n </Box>\n )}\n </Box>\n\n {/* Icons area - fixed size, never shrinks */}\n <Box\n sx={{ display: 'flex', gap: 0.5, flexShrink: 0, alignItems: 'center' }}\n >\n {isUpsertKey && (\n <Tooltip\n title={UPSERT_KEY_TOOLTIP_TEXT}\n placement=\"top\"\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n >\n <Key sx={{ fontSize: '1em' }} />\n </Tooltip>\n )}\n {showPinIcon && onTogglePin && (\n <Tooltip\n title={isPinned ? 'Unpin column' : 'Pin column'}\n placement=\"top\"\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n >\n <IconButton\n size=\"small\"\n color=\"inherit\"\n aria-label={isPinned ? 'Unpin column' : 'Pin column'}\n // Use onMouseDown instead of onClick to prevent column selection\n // when clicking the pin icon. stopPropagation prevents event bubbling.\n onMouseDown={e => {\n e.stopPropagation()\n onTogglePin()\n }}\n sx={{\n color: 'inherit',\n opacity: isPinned ? 1 : 0.7,\n '&:hover': {\n opacity: 1,\n },\n }}\n >\n {isPinned ? (\n <PushPin fontSize=\"inherit\" />\n ) : (\n <PushPinOutlined fontSize=\"inherit\" />\n )}\n </IconButton>\n </Tooltip>\n )}\n </Box>\n </Box>\n )\n}\n"],"mappings":";;;;;;AAcA,IAAMe,IACJ;AAOF,SAAOC,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAiC,EAAAX,SAAAC,gBAAAC,YAAAU,GAAAT,aAAAU,GAAAT,aAAAU,GAAAT,UAAAU,GAAAT,mBAAAG,GAGtCP,IAAAU,MAAAI,KAAAA,IAAA,KAAAJ,GACAT,IAAAU,MAAAG,KAAAA,IAAA,KAAAH,GACAT,IAAAU,MAAAE,KAAAA,IAAA,KAAAF,GACAT,IAAAU,MAAAC,KAAAA,IAAA,KAAAD,GAAgBE;CAAA,AAAAP,EAAA,OAAAQ,OAAAC,IAAA,2BAAA,KAMRF,IAAA;EAAAG,SACO;EAAMC,qBACM;EAAqBC,KACrC;EAAGC,OACD;EAAMC,YACD;EAAQC,UACV;CACZ,GAACf,EAAA,KAAAO,KAAAA,IAAAP,EAAA;CAAA,IAAAgB;CAAA,AAAAhB,EAAA,OAAAQ,OAAAC,IAAA,2BAAA,KAKKO,IAAA;EAAAC,UACQ;EAAQC,cACJ;EAAUC,YACZ;EAAQJ,UACV;CACZ,GAACf,EAAA,KAAAgB,KAAAA,IAAAhB,EAAA;CACM,IAAAoB,IAAA7B,KAAAD,GAAmB+B;CAAA,AAAArB,EAAA,OAAAR,IAOzB6B,IAAArB,EAAA,MAJAqB,IAAA7B,KACC,kBAAC,GAAD;EAAe,WAAA;EAAW,IAAA;GAAA8B,OAAS;GAAYC,IAAM;EAAK;YAAG;CAAzD,CAAA,GAGLvB,EAAA,KAAAR,GAAAQ,EAAA,KAAAqB;CAAA,IAAAG;CAAA,AAAAxB,EAAA,OAAAV,KAAAU,EAAA,OAAAoB,KAAApB,EAAA,OAAAqB,KAfHG,IAAA,kBAAC,GAAD;EACY,WAAA;EACN,IAAAR;EAMG,OAAAI;YART,CAUG9B,GACA+B,CAXC;KAgBErB,EAAA,KAAAV,GAAAU,EAAA,KAAAoB,GAAApB,EAAA,KAAAqB,GAAArB,EAAA,KAAAwB,KAAAA,IAAAxB,EAAA;CAAA,IAAAyB;CAAA,AAAAzB,EAAA,OAAAQ,OAAAC,IAAA,2BAAA,KAIAgB,IAAA;EAAAf,SAAW;EAAME,KAAO;EAAGc,YAAc;EAACZ,YAAc;CAAS,GAACd,EAAA,KAAAyB,KAAAA,IAAAzB,EAAA;CAAA,IAAA2B;CAAA,AAAA3B,EAAA,OAAAP,IAUrEkC,IAAA3B,EAAA,OARA2B,IAAAlC,KACC,kBAAC,GAAD;EACSI,OAAAA;EACG,WAAA;EACMT,gBAAAA;YAEhB,kBAAC,GAAD,EAAS,IAAA,EAAAwC,UAAY,MAAM,EAAC,CAAA;CALtB,CAAA,GAOT5B,EAAA,KAAAP,GAAAO,EAAA,MAAA2B;CAAA,IAAAE;CAAA,AAAA7B,EAAA,QAAAL,KAAAK,EAAA,QAAAJ,KAAAI,EAAA,QAAAN,KACAmC,IAAAnC,KAAAE,KACC,kBAAC,GAAD;EACS,OAAAD,IAAA,iBAAA;EACG,WAAA;EACMP,gBAAAA;YAEhB,kBAAC,GAAD;GACO,MAAA;GACC,OAAA;GACM,cAAAO,IAAA,iBAAA;GAGC,cAAAmC,MAAA;IAEXlC,AADAkC,EAACC,gBAAiB,GAClBnC,EAAY;GAAC;GAEX,IAAA;IAAA0B,OACK;IAASU,SACPrC,IAAA,IAAA;IAAkB,WAChB,EAAAqC,SACA,EACX;GACF;aAGE,EADDrC,IACE,IAEA,GAFD,EAAkB,UAAA,UAAS,CAEQ;EArB5B,CAAA;CALL,CAAA,GA8BTK,EAAA,MAAAL,GAAAK,EAAA,MAAAJ,GAAAI,EAAA,MAAAN,GAAAM,EAAA,MAAA6B,KAAAA,IAAA7B,EAAA;CAAA,IAAAiC;CAAA,AAAAjC,EAAA,QAAA2B,KAAA3B,EAAA,QAAA6B,KA3CHI,IAAA,kBAAC,GAAD;EACM,IAAAR;YADN,CAGGE,GASAE,CAZC;KA4CE7B,EAAA,MAAA2B,GAAA3B,EAAA,MAAA6B,GAAA7B,EAAA,MAAAiC,KAAAA,IAAAjC,EAAA;CAAA,IAAAkC;CACF,OADElC,EAAA,QAAAV,KAAAU,EAAA,QAAAiC,KAAAjC,EAAA,QAAAwB,KA3ERU,IAAA,kBAAC,GAAD;EACkB5C,kBAAAA;EACZ,IAAAiB;YAFN,CAYEiB,GAmBAS,CA/BE;KA4EEjC,EAAA,MAAAV,GAAAU,EAAA,MAAAiC,GAAAjC,EAAA,MAAAwB,GAAAxB,EAAA,MAAAkC,KAAAA,IAAAlC,EAAA,KA5ENkC;AA4EM"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDataGridWebsocket.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/useDataGridWebsocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAKvD,UAAU,cAAc;IACtB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB;;;OAGG;IACH,uBAAuB,EAAE,OAAO,CAAA;IAChC;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,YAAY,EAAE,OAAO,CAAA;IACrB,gBAAgB,EAAE;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,IAAI,CAAA;IACR,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC3C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,eAAe,EAAE,OAAO,CAAA;IACxB,cAAc,EAAE,OAAO,CAAA;CACxB;AAgHD,eAAO,MAAM,qBAAqB,EAAE,cAWnC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,2BAA2B;IAC1C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC/B,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAA;CACnC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAsD1D,MAAM,aAAa,MAAM;;;;;EA+IxC"}
1
+ {"version":3,"file":"useDataGridWebsocket.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/useDataGridWebsocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAI/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAKvD,UAAU,cAAc;IACtB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB;;;OAGG;IACH,uBAAuB,EAAE,OAAO,CAAA;IAChC;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,YAAY,EAAE,OAAO,CAAA;IACrB,gBAAgB,EAAE;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,IAAI,CAAA;IACR,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC3C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,eAAe,EAAE,OAAO,CAAA;IACxB,cAAc,EAAE,OAAO,CAAA;CACxB;AAgHD,eAAO,MAAM,qBAAqB,EAAE,cAWnC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,2BAA2B;IAC1C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC/B,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAA;CACnC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAyD1D,MAAM,aAAa,MAAM;;;;;EA+IxC"}
@@ -1,9 +1,10 @@
1
1
  import { useEstablishWebsocketConnection as e } from "../../synapse-queries/grid/useEstablishWebsocketConnection.js";
2
2
  import { useCRDTModelView as t } from "./useCRDTModelView.js";
3
- import { useCallback as n, useEffect as r, useMemo as i, useReducer as a, useRef as o } from "react";
4
- import { useDocumentVisibility as s } from "@react-hookz/web";
3
+ import { normalizeWebsocketError as n } from "./utils/normalizeWebsocketError.js";
4
+ import { useCallback as r, useEffect as i, useMemo as a, useReducer as o, useRef as s } from "react";
5
+ import { useDocumentVisibility as c } from "@react-hookz/web";
5
6
  //#region src/components/DataGrid/useDataGridWebsocket.ts
6
- function c(e, t) {
7
+ function l(e, t) {
7
8
  switch (t.type) {
8
9
  case "CONNECT_REQUESTED": {
9
10
  let n = e.connectionParams && e.connectionParams.replicaId === t.payload.replicaId && e.connectionParams.sessionId === t.payload.sessionId;
@@ -66,7 +67,7 @@ function c(e, t) {
66
67
  default: return e;
67
68
  }
68
69
  }
69
- var l = {
70
+ var u = {
70
71
  model: null,
71
72
  hasCompletedInitialSync: !1,
72
73
  isSyncing: !1,
@@ -78,35 +79,35 @@ var l = {
78
79
  connectionError: null,
79
80
  websocketError: null
80
81
  };
81
- function u(u) {
82
- let [d, f] = a(c, l), p = o(0), m = o(null), h = t(d.model), g = s(), { mutateAsync: _, isPending: v, error: y, presignedUrl: b, reset: x, clearPresignedUrl: S } = e(), C = n((e) => {
83
- f({
82
+ function d(d) {
83
+ let [f, p] = o(l, u), m = s(0), h = s(null), g = t(f.model), _ = c(), { mutateAsync: v, isPending: y, error: b, presignedUrl: x, reset: S, clearPresignedUrl: C } = e(), w = r((e) => {
84
+ p({
84
85
  type: "MODEL_CREATED",
85
86
  payload: e
86
87
  });
87
- }, [f]), w = i(() => ({
88
+ }, [p]), T = a(() => ({
88
89
  onGridReady: () => {
89
- f({ type: "GRID_READY" }), u?.onGridReady?.();
90
+ p({ type: "GRID_READY" }), d?.onGridReady?.();
90
91
  },
91
- onStatusChange: (e) => f({ type: e ? "CONNECTION_OPENED" : "CONNECTION_CLOSED" }),
92
- onModelCreate: C,
93
- onReplicaConnected: u?.onReplicaConnected,
94
- onReplicaDisconnected: u?.onReplicaDisconnected,
95
- onSyncStart: () => f({ type: "SYNC_STARTED" }),
96
- onSyncEnd: () => f({ type: "SYNC_ENDED" }),
97
- onError: (e) => f({
92
+ onStatusChange: (e) => p({ type: e ? "CONNECTION_OPENED" : "CONNECTION_CLOSED" }),
93
+ onModelCreate: w,
94
+ onReplicaConnected: d?.onReplicaConnected,
95
+ onReplicaDisconnected: d?.onReplicaDisconnected,
96
+ onSyncStart: () => p({ type: "SYNC_STARTED" }),
97
+ onSyncEnd: () => p({ type: "SYNC_ENDED" }),
98
+ onError: (e) => p({
98
99
  type: "WEBSOCKET_ERROR",
99
- payload: e
100
+ payload: n(e)
100
101
  })
101
102
  }), [
102
- C,
103
- u?.onGridReady,
104
- u?.onReplicaConnected,
105
- u?.onReplicaDisconnected
106
- ]), T = n((e, t) => {
107
- x(), (!d.connectionParams || d.connectionParams.replicaId !== e || d.connectionParams.sessionId !== t) && S(), p.current += 1;
108
- let n = p.current;
109
- f({
103
+ w,
104
+ d?.onGridReady,
105
+ d?.onReplicaConnected,
106
+ d?.onReplicaDisconnected
107
+ ]), E = r((e, t) => {
108
+ S(), (!f.connectionParams || f.connectionParams.replicaId !== e || f.connectionParams.sessionId !== t) && C(), m.current += 1;
109
+ let n = m.current;
110
+ p({
110
111
  type: "CONNECT_REQUESTED",
111
112
  payload: {
112
113
  replicaId: e,
@@ -115,75 +116,75 @@ function u(u) {
115
116
  }
116
117
  });
117
118
  }, [
118
- f,
119
- d.connectionParams,
120
- x,
119
+ p,
120
+ f.connectionParams,
121
121
  S,
122
- p
122
+ C,
123
+ m
123
124
  ]);
124
- r(() => {
125
- let { connectionParams: e, connectionAttemptId: t } = d;
126
- !e || t === null || d.isConnected || d.isConnecting || v || y || d.connectionError || !g || (m.current = t, _({
125
+ i(() => {
126
+ let { connectionParams: e, connectionAttemptId: t } = f;
127
+ !e || t === null || f.isConnected || f.isConnecting || y || b || f.connectionError || !_ || (h.current = t, v({
127
128
  replicaId: e.replicaId,
128
129
  sessionId: e.sessionId,
129
130
  websocketOptions: {
130
- ...w,
131
- model: d.model
131
+ ...T,
132
+ model: f.model
132
133
  }
133
134
  }).then((e) => {
134
- if (m.current !== t) {
135
+ if (h.current !== t) {
135
136
  e.disconnect();
136
137
  return;
137
138
  }
138
- f({
139
+ p({
139
140
  type: "CONNECTION_ESTABLISHED",
140
141
  payload: e
141
142
  });
142
143
  }).catch((e) => {
143
- f({
144
+ p({
144
145
  type: "CONNECTION_ERROR",
145
146
  payload: e
146
147
  }), console.error("Failed to establish WebSocket", e);
147
148
  }));
148
149
  }, [
149
- d,
150
- d.connectionParams,
151
- d.connectionAttemptId,
152
- d.isConnected,
153
- d.isConnecting,
154
- v,
150
+ f,
151
+ f.connectionParams,
152
+ f.connectionAttemptId,
153
+ f.isConnected,
154
+ f.isConnecting,
155
155
  y,
156
- g,
156
+ b,
157
157
  _,
158
- w
158
+ v,
159
+ T
159
160
  ]);
160
- let E = o(null);
161
- r(() => {
162
- let e = E.current, t = d.connectionParams;
163
- e && t && (e.replicaId !== t.replicaId || e.sessionId !== t.sessionId) && d.websocketInstance?.disconnect(), E.current = t;
164
- }, [d.connectionParams, d.websocketInstance]), r(() => () => {
165
- d.websocketInstance?.disconnect(), m.current = null;
166
- }, [d.websocketInstance]);
167
- function D(e) {
168
- if (!e || !e.api.getSnapshot() || !h) return !1;
169
- let { columnNames: t, columnOrder: n, rows: r } = h, i = t.length >= 1, a = n.length >= 1, o = r.length >= 0;
161
+ let D = s(null);
162
+ i(() => {
163
+ let e = D.current, t = f.connectionParams;
164
+ e && t && (e.replicaId !== t.replicaId || e.sessionId !== t.sessionId) && f.websocketInstance?.disconnect(), D.current = t;
165
+ }, [f.connectionParams, f.websocketInstance]), i(() => () => {
166
+ f.websocketInstance?.disconnect(), h.current = null;
167
+ }, [f.websocketInstance]);
168
+ function O(e) {
169
+ if (!e || !e.api.getSnapshot() || !g) return !1;
170
+ let { columnNames: t, columnOrder: n, rows: r } = g, i = t.length >= 1, a = n.length >= 1, o = r.length >= 0;
170
171
  return i && a && o;
171
172
  }
172
173
  return {
173
- isConnected: d.isConnected,
174
- websocketInstance: d.websocketInstance,
175
- hasCompletedInitialSync: d.hasCompletedInitialSync,
176
- isSyncing: d.isSyncing,
177
- model: d.model,
178
- modelSnapshot: h,
179
- connect: T,
180
- presignedUrl: b,
181
- errorEstablishingWebsocketConnection: d.connectionError ?? y,
182
- websocketError: d.websocketError,
183
- hasSufficientData: D(d.model)
174
+ isConnected: f.isConnected,
175
+ websocketInstance: f.websocketInstance,
176
+ hasCompletedInitialSync: f.hasCompletedInitialSync,
177
+ isSyncing: f.isSyncing,
178
+ model: f.model,
179
+ modelSnapshot: g,
180
+ connect: E,
181
+ presignedUrl: x,
182
+ errorEstablishingWebsocketConnection: f.connectionError ?? b,
183
+ websocketError: f.websocketError,
184
+ hasSufficientData: O(f.model)
184
185
  };
185
186
  }
186
187
  //#endregion
187
- export { l as initialWebSocketState, u as useDataGridWebSocket };
188
+ export { u as initialWebSocketState, d as useDataGridWebSocket };
188
189
 
189
190
  //# sourceMappingURL=useDataGridWebsocket.js.map