synapse-react-client 4.0.6 → 4.0.7

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 (119) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/components/CardDeck/TableQueryCardDeck.js +3 -4
  3. package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
  4. package/dist/components/ChangePassword/useChangePasswordFormState.js +2 -3
  5. package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
  6. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.css +1 -0
  7. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.d.ts +8 -0
  8. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.d.ts.map +1 -0
  9. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.js +21 -0
  10. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.js.map +1 -0
  11. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss +32 -0
  12. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss.js +14 -0
  13. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss.js.map +1 -0
  14. package/dist/components/ColoredBulletListItem/index.d.ts +5 -0
  15. package/dist/components/ColoredBulletListItem/index.d.ts.map +1 -0
  16. package/dist/components/ColoredBulletListItem/index.js +6 -0
  17. package/dist/components/ColoredBulletListItem/index.js.map +1 -0
  18. package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js +3 -4
  19. package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +1 -1
  20. package/dist/components/CreateProjectModal/CreateProjectModal.d.ts.map +1 -1
  21. package/dist/components/CreateProjectModal/CreateProjectModal.js +120 -46
  22. package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
  23. package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.d.ts +7 -0
  24. package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.d.ts.map +1 -0
  25. package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.js +132 -0
  26. package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.js.map +1 -0
  27. package/dist/components/DataGrid/DataGrid.d.ts +2 -0
  28. package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
  29. package/dist/components/DataGrid/DataGrid.js +69 -67
  30. package/dist/components/DataGrid/DataGrid.js.map +1 -1
  31. package/dist/components/DataGrid/MergeGridWithSourceTableButton.js +2 -3
  32. package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +1 -1
  33. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  34. package/dist/components/DataGrid/SynapseGrid.js +117 -111
  35. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  36. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +2 -3
  37. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
  38. package/dist/components/DataGrid/hooks/useRemoteSelections.d.ts +16 -0
  39. package/dist/components/DataGrid/hooks/useRemoteSelections.d.ts.map +1 -0
  40. package/dist/components/DataGrid/hooks/useRemoteSelections.js +30 -0
  41. package/dist/components/DataGrid/hooks/useRemoteSelections.js.map +1 -0
  42. package/dist/components/DataGrid/utils/getCellClassName.d.ts +3 -0
  43. package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
  44. package/dist/components/DataGrid/utils/getCellClassName.js +21 -12
  45. package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
  46. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.d.ts +15 -0
  47. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.d.ts.map +1 -0
  48. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.js +43 -0
  49. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.js.map +1 -0
  50. package/dist/components/DialogBase.d.ts +3 -1
  51. package/dist/components/DialogBase.d.ts.map +1 -1
  52. package/dist/components/DialogBase.js +75 -56
  53. package/dist/components/DialogBase.js.map +1 -1
  54. package/dist/components/Ecosystem/EcosystemSkeleton.js +2 -3
  55. package/dist/components/Ecosystem/EcosystemSkeleton.js.map +1 -1
  56. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +2 -3
  57. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  58. package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js +2 -3
  59. package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js.map +1 -1
  60. package/dist/components/GenericCard/GenericCard.js +3 -4
  61. package/dist/components/GenericCard/GenericCard.js.map +1 -1
  62. package/dist/components/HeaderCard.js +2 -3
  63. package/dist/components/HeaderCard.js.map +1 -1
  64. package/dist/components/IconSvg/IconSvg.d.ts +1 -1
  65. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  66. package/dist/components/IconSvg/IconSvg.js +168 -165
  67. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  68. package/dist/components/StorybookComponentWrapper.js +3 -4
  69. package/dist/components/StorybookComponentWrapper.js.map +1 -1
  70. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.d.ts +1 -0
  71. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.d.ts.map +1 -1
  72. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js +23 -16
  73. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js.map +1 -1
  74. package/dist/components/TextField/TextField.css +1 -1
  75. package/dist/components/TextField/TextField.d.ts +1 -0
  76. package/dist/components/TextField/TextField.d.ts.map +1 -1
  77. package/dist/components/TextField/TextField.js +32 -20
  78. package/dist/components/TextField/TextField.js.map +1 -1
  79. package/dist/components/TextField/TextField.module.scss +7 -0
  80. package/dist/components/TextField/TextField.module.scss.js +5 -3
  81. package/dist/components/TextField/TextField.module.scss.js.map +1 -1
  82. package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js +2 -3
  83. package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js.map +1 -1
  84. package/dist/components/index.d.ts +1 -0
  85. package/dist/components/index.d.ts.map +1 -1
  86. package/dist/components/index.js +242 -240
  87. package/dist/components/index.js.map +1 -1
  88. package/dist/components/styled/StyledFormControl.js +1 -1
  89. package/dist/components/styled/StyledFormControl.js.map +1 -1
  90. package/dist/components/table/CsvPreview/CsvPreview.js +2 -3
  91. package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
  92. package/dist/components/table/CsvPreview/CsvPreviewDialog.js +2 -3
  93. package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
  94. package/dist/features/curator/GridPage/GridPage.js +2 -3
  95. package/dist/features/curator/GridPage/GridPage.js.map +1 -1
  96. package/dist/features/curator/GridPage/components/GridPageTitle.js +2 -3
  97. package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
  98. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
  99. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +49 -180
  100. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  101. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +2 -3
  102. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  103. package/dist/index.js +306 -304
  104. package/dist/index.js.map +1 -1
  105. package/dist/style/components/_data-grid-extra.css +1 -1
  106. package/dist/style/components/_data-grid-extra.scss +16 -0
  107. package/dist/synapse-client/SynapseClient.d.ts +1 -1
  108. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  109. package/dist/synapse-client/SynapseClient.js +3 -2
  110. package/dist/synapse-client/SynapseClient.js.map +1 -1
  111. package/dist/theme/palette/Palettes.d.ts +2 -0
  112. package/dist/theme/palette/Palettes.d.ts.map +1 -1
  113. package/dist/theme/palette/Palettes.js +46 -40
  114. package/dist/theme/palette/Palettes.js.map +1 -1
  115. package/dist/tsconfig.build.tsbuildinfo +1 -1
  116. package/package.json +3 -3
  117. package/dist/assets/ArcusBioIcon.svg +0 -1
  118. package/dist/assets/ArcusBioIcon.svg.js +0 -7
  119. package/dist/assets/ArcusBioIcon.svg.js.map +0 -1
@@ -1,17 +1,17 @@
1
- import { jsx as t, jsxs as n, Fragment as T } from "react/jsx-runtime";
2
- import et from "./components/GridMenuButton/GridMenuButton.js";
3
- import nt from "./components/UploadCsvToGridButton.js";
1
+ import { jsx as t, jsxs as n, Fragment as w } from "react/jsx-runtime";
2
+ import nt from "./components/GridMenuButton/GridMenuButton.js";
3
+ import mt from "./components/UploadCsvToGridButton.js";
4
4
  import pt from "./components/ExportCsvFromGridButton.js";
5
- import mt from "./hooks/useGetSchemaForGrid.js";
6
- import st from "./MergeGridWithSourceTableButton.js";
7
- import ct from "./utils/computeReplicaSelectionModel.js";
8
- import lt from "./utils/modelRowsToGrid.js";
5
+ import st from "./hooks/useGetSchemaForGrid.js";
6
+ import ct from "./MergeGridWithSourceTableButton.js";
7
+ import lt from "./utils/computeReplicaSelectionModel.js";
8
+ import dt from "./utils/modelRowsToGrid.js";
9
9
  import "../../assets/icons/error_page/maintenance.svg.js";
10
10
  import "../../assets/icons/error_page/no-access.svg.js";
11
11
  import "../../assets/icons/error_page/unavailable.svg.js";
12
12
  import "../../utils/PermissionLevelToAccessType.js";
13
13
  import "../../utils/SynapseConstants.js";
14
- import { forwardRef as dt, useState as I, useRef as S, useCallback as d, useImperativeHandle as at, useEffect as R, useMemo as P } from "react";
14
+ import { forwardRef as at, useState as S, useRef as I, useCallback as d, useImperativeHandle as ut, useEffect as R, useMemo as P } from "react";
15
15
  import "../../synapse-client/SynapseClient.js";
16
16
  import "@sage-bionetworks/synapse-client/generated/models/ErrorResponseCode";
17
17
  import "@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse";
@@ -27,11 +27,11 @@ import "@tanstack/query-core";
27
27
  import "lodash-es/isEmpty";
28
28
  import "lodash-es/isEqual";
29
29
  import "lodash-es/xorWith";
30
- import { Tooltip as ut, Stack as ht } from "@mui/material";
30
+ import { Tooltip as ht, Stack as ft } from "@mui/material";
31
31
  import "@sage-bionetworks/synapse-client";
32
- import { useGetEntity as ft } from "../../synapse-queries/entity/useEntity.js";
32
+ import { useGetEntity as gt } from "../../synapse-queries/entity/useEntity.js";
33
33
  import "../../utils/types/IsType.js";
34
- import { useGetCurrentUserBundle as gt } from "../../synapse-queries/user/useUserBundle.js";
34
+ import { useGetCurrentUserBundle as St } from "../../synapse-queries/user/useUserBundle.js";
35
35
  import "../../utils/hooks/useCookiePreferences.js";
36
36
  import "../../utils/hooks/useSourceAppConfigs.js";
37
37
  import "universal-cookie";
@@ -58,7 +58,6 @@ import "../../assets/icons/account-validated.svg.js";
58
58
  import "../../utils/functions/DateFormatter.js";
59
59
  import "@react-hookz/web";
60
60
  import "dayjs";
61
- import "../../assets/ArcusBioIcon.svg.js";
62
61
  import "@mui/material/SvgIcon";
63
62
  import "../../assets/icons/AccessPending.svg.js";
64
63
  import "../../assets/icons/AccessPendingCloud.svg.js";
@@ -115,7 +114,7 @@ import "../QueryContext/QueryContext.js";
115
114
  import "../QueryVisualizationWrapper/QueryVisualizationContext.js";
116
115
  import "react-share";
117
116
  import "../GenericCard/GenericCard.js";
118
- import { SkeletonTable as St } from "../Skeleton/SkeletonTable.js";
117
+ import { SkeletonTable as Ct } from "../Skeleton/SkeletonTable.js";
119
118
  import "@mui/system";
120
119
  import "../GenericCard/Linkify.js";
121
120
  import "jotai";
@@ -223,110 +222,116 @@ import s from "@mui/material/Grid";
223
222
  import "@mui/icons-material/ArrowForwardIos";
224
223
  import "../PortalAclEditor/PortalAclEditor.js";
225
224
  import "../SynapseHomepageV2/HomepageStyles.js";
226
- import { getSchemaPropertiesInfo as Ct } from "../../utils/jsonschema/getSchemaPropertyInfo.js";
227
- import { ClickableJsonCrdt as yt } from "clickable-json";
228
- import { GridAgentChat as Rt } from "../SynapseChat/GridAgentChat.js";
229
- import Et from "./DataGrid.js";
230
- import { useGridUndoRedo as xt } from "./hooks/useGridUndoRedo.js";
231
- import { StartGridSession as Gt } from "./StartGridSession.js";
232
- import { useDataGridWebSocket as vt } from "./useDataGridWebsocket.js";
233
- import { applyModelChange as bt } from "./utils/applyModelChange.js";
234
- import { removeNoOpOperations as Tt } from "./utils/DataGridUtils.js";
235
- import { mapOperationsToModelChanges as wt } from "./utils/mapOperationsToModelChanges.js";
236
- import { useListGridReplicas as Nt } from "../../synapse-queries/grid/useGridSession.js";
237
- import kt from "../AccessRequirementList/RequirementItem/CertificationRequirement.js";
238
- import { ValidationAlert as Ot } from "./components/ValidationAlert.js";
239
- const on = dt(
225
+ import { getSchemaPropertiesInfo as yt } from "../../utils/jsonschema/getSchemaPropertyInfo.js";
226
+ import { ClickableJsonCrdt as Rt } from "clickable-json";
227
+ import { GridAgentChat as Et } from "../SynapseChat/GridAgentChat.js";
228
+ import xt from "./DataGrid.js";
229
+ import { useGridUndoRedo as Gt } from "./hooks/useGridUndoRedo.js";
230
+ import { StartGridSession as vt } from "./StartGridSession.js";
231
+ import { useDataGridWebSocket as bt } from "./useDataGridWebsocket.js";
232
+ import { applyModelChange as Tt } from "./utils/applyModelChange.js";
233
+ import { removeNoOpOperations as wt } from "./utils/DataGridUtils.js";
234
+ import { mapOperationsToModelChanges as Nt } from "./utils/mapOperationsToModelChanges.js";
235
+ import { useListGridReplicas as kt } from "../../synapse-queries/grid/useGridSession.js";
236
+ import { useRemoteSelections as Ot } from "./hooks/useRemoteSelections.js";
237
+ import zt from "../AccessRequirementList/RequirementItem/CertificationRequirement.js";
238
+ import { ValidationAlert as Mt } from "./components/ValidationAlert.js";
239
+ const en = at(
240
240
  ({ agentRegistrationId: A, showDebugInfo: E = !1 }, j) => {
241
- const [o, F] = I(null), [p, J] = I(null), [W, w] = I(!1), [H, N] = I(
241
+ const [o, F] = S(null), [m, J] = S(null), [W, N] = S(!1), [H, k] = S(
242
242
  null
243
- ), u = S(null), h = S(null), { data: V, isLoading: _ } = gt(), { data: k = [], refetch: O } = Nt(o?.sessionId), x = d(() => {
243
+ ), h = I(null), f = I(null), { data: V, isLoading: _ } = St(), { data: x = [], refetch: O } = kt(o?.sessionId), G = d(() => {
244
244
  O();
245
245
  }, [O]);
246
- at(
246
+ ut(
247
247
  j,
248
248
  () => ({
249
249
  initializeGrid: (i) => {
250
- u.current && u.current.handleStartSession(i);
250
+ h.current && h.current.handleStartSession(i);
251
251
  },
252
252
  loadExistingSession: (i) => {
253
- u.current && u.current.handleLoadSession(i);
253
+ h.current && h.current.handleLoadSession(i);
254
254
  }
255
255
  }),
256
256
  []
257
257
  );
258
258
  const {
259
- isConnected: m,
259
+ isConnected: p,
260
260
  websocketInstance: z,
261
261
  hasCompletedInitialSync: $,
262
262
  model: e,
263
- modelSnapshot: f,
263
+ modelSnapshot: a,
264
264
  connect: M,
265
265
  presignedUrl: c,
266
266
  hasSufficientData: U
267
- } = vt({
268
- onGridReady: x,
269
- onReplicaConnected: x,
270
- onReplicaDisconnected: x
271
- }), C = S(null);
267
+ } = bt({
268
+ onGridReady: G,
269
+ onReplicaConnected: G,
270
+ onReplicaDisconnected: G
271
+ }), C = I(null);
272
272
  R(() => {
273
273
  C.current = z;
274
274
  }, [z]);
275
- const G = S(null);
275
+ const v = I(null);
276
276
  R(() => {
277
- if (p == null || !o?.sessionId) {
278
- G.current = null;
277
+ if (m == null || !o?.sessionId) {
278
+ v.current = null;
279
279
  return;
280
280
  }
281
281
  const i = {
282
- replicaId: p,
282
+ replicaId: m,
283
283
  sessionId: o.sessionId
284
- }, r = G.current;
285
- r && r.replicaId === i.replicaId && r.sessionId === i.sessionId || (G.current = i, M(p, o.sessionId));
286
- }, [p, o?.sessionId, M]), R(() => {
287
- e === null && (N(null), h.current && h.current.setActiveCell(null));
284
+ }, r = v.current;
285
+ r && r.replicaId === i.replicaId && r.sessionId === i.sessionId || (v.current = i, M(m, o.sessionId));
286
+ }, [m, o?.sessionId, M]), R(() => {
287
+ e === null && (k(null), f.current && f.current.setActiveCell(null));
288
288
  }, [e]);
289
- const v = mt(o), { data: q } = ft(
289
+ const b = st(o), { data: q } = gt(
290
290
  o?.sourceEntityId,
291
291
  void 0,
292
292
  {
293
293
  enabled: !!o?.sourceEntityId
294
294
  }
295
- ), Y = q?.concreteType === "org.sagebionetworks.repo.model.table.EntityView", b = P(() => Ct(v ?? null), [v]), K = m ? "Connected" : "Disconnected", g = P(
296
- () => f ? lt(e, f) : [],
297
- [e, f]
295
+ ), Y = q?.concreteType === "org.sagebionetworks.repo.model.table.EntityView", T = P(() => yt(b ?? null), [b]), K = p ? "Connected" : "Disconnected", Q = Ot(
296
+ a,
297
+ e,
298
+ x,
299
+ m
300
+ ), g = P(
301
+ () => a ? dt(e, a) : [],
302
+ [e, a]
298
303
  ), y = d(() => {
299
- !m || !C.current || C.current.sendPatch();
300
- }, [m, C]);
304
+ !p || !C.current || C.current.sendPatch();
305
+ }, [p, C]);
301
306
  R(() => {
302
- m && y();
303
- }, [m, y]);
304
- const a = d(
307
+ p && y();
308
+ }, [p, y]);
309
+ const u = d(
305
310
  (i, r) => {
306
311
  r.forEach((l) => {
307
- bt(i, l, b);
312
+ Tt(i, l, T);
308
313
  }), y();
309
314
  },
310
- [y, b]
311
- ), Q = d(
315
+ [y, T]
316
+ ), X = d(
312
317
  (i) => {
313
318
  if (!e) {
314
319
  console.error("Model is not initialized");
315
320
  return;
316
321
  }
317
- i.type === "DELETE" && h.current && h.current.setActiveCell(null), a(e, [i]);
322
+ i.type === "DELETE" && f.current && f.current.setActiveCell(null), u(e, [i]);
318
323
  },
319
- [e, a]
320
- ), { undoUI: X, redoUI: Z, addOperationsToUndoStack: D, clearRedoStack: L } = xt(Q), tt = d(
324
+ [e, u]
325
+ ), { undoUI: Z, redoUI: tt, addOperationsToUndoStack: D, clearRedoStack: L } = Gt(X), ot = d(
321
326
  (i, r) => {
322
327
  if (!e) {
323
328
  console.error("Model is not initialized");
324
329
  return;
325
330
  }
326
- if (r = Tt(i, g, r), r.length > 0) {
331
+ if (r = wt(i, g, r), r.length > 0) {
327
332
  L(), D(r, g, i);
328
- const l = wt(r, i);
329
- a(e, l);
333
+ const l = Nt(r, i);
334
+ u(e, l);
330
335
  }
331
336
  },
332
337
  [
@@ -334,37 +339,37 @@ const on = dt(
334
339
  g,
335
340
  L,
336
341
  D,
337
- a
342
+ u
338
343
  ]
339
- ), ot = d(
344
+ ), it = d(
340
345
  (i) => {
341
346
  const { selection: r } = i;
342
- if (r != null && (N(r), e != null && p != null)) {
343
- const l = ct(
347
+ if (r != null && (k(r), e != null && m != null)) {
348
+ const l = lt(
344
349
  r,
345
350
  e
346
351
  );
347
- a(e, [
352
+ u(e, [
348
353
  {
349
354
  type: "SET_SELECTION",
350
- replicaId: p.toString(),
355
+ replicaId: m.toString(),
351
356
  selection: l
352
357
  }
353
358
  ]);
354
359
  }
355
360
  },
356
- [a, e, p]
357
- ), B = S(null), [, it] = I({}), rt = d(
361
+ [u, e, m]
362
+ ), B = I(null), [, rt] = S({}), et = d(
358
363
  (i, r) => {
359
- i !== null && (B.current = i, it({}));
364
+ i !== null && (B.current = i, rt({}));
360
365
  },
361
366
  []
362
367
  );
363
- return !_ && !V?.isCertified ? /* @__PURE__ */ t(kt, {}) : /* @__PURE__ */ t("div", { children: /* @__PURE__ */ n(s, { container: !0, spacing: 2, children: [
368
+ return !_ && !V?.isCertified ? /* @__PURE__ */ t(zt, {}) : /* @__PURE__ */ t("div", { children: /* @__PURE__ */ n(s, { container: !0, spacing: 2, children: [
364
369
  /* @__PURE__ */ t(s, { size: { xs: 12, xl: 8 }, children: /* @__PURE__ */ t(
365
- Gt,
370
+ vt,
366
371
  {
367
- ref: u,
372
+ ref: h,
368
373
  onSessionChange: F,
369
374
  onReplicaChange: J,
370
375
  show: E
@@ -377,7 +382,7 @@ const on = dt(
377
382
  ] }),
378
383
  /* @__PURE__ */ n("p", { children: [
379
384
  "Replica ID: ",
380
- p || "No replica created"
385
+ m || "No replica created"
381
386
  ] }),
382
387
  /* @__PURE__ */ n("p", { children: [
383
388
  "Source Entity ID:",
@@ -397,22 +402,22 @@ const on = dt(
397
402
  /* @__PURE__ */ n("p", { children: [
398
403
  "WebSocket Status:",
399
404
  " ",
400
- /* @__PURE__ */ t("span", { style: { color: m ? "green" : "red" }, children: K })
405
+ /* @__PURE__ */ t("span", { style: { color: p ? "green" : "red" }, children: K })
401
406
  ] }),
402
407
  /* @__PURE__ */ t("p", { children: (() => {
403
- const i = k.filter(
408
+ const i = x.filter(
404
409
  (r) => r.isConnected
405
410
  );
406
- return /* @__PURE__ */ n(T, { children: [
411
+ return /* @__PURE__ */ n(w, { children: [
407
412
  "Connected Replicas (",
408
413
  i.length,
409
414
  " /",
410
415
  " ",
411
- k.length,
416
+ x.length,
412
417
  " total):",
413
418
  " ",
414
419
  i.length === 0 ? "none" : i.map((r, l) => /* @__PURE__ */ t(
415
- ut,
420
+ ht,
416
421
  {
417
422
  title: /* @__PURE__ */ t("pre", { style: { margin: 0, fontSize: "11px" }, children: JSON.stringify(r, null, 2) }),
418
423
  children: /* @__PURE__ */ n(
@@ -434,50 +439,50 @@ const on = dt(
434
439
  ] });
435
440
  })() })
436
441
  ] }) }),
437
- o && /* @__PURE__ */ n(T, { children: [
442
+ o && /* @__PURE__ */ n(w, { children: [
438
443
  !U && /* @__PURE__ */ n(s, { size: 12, children: [
439
444
  /* @__PURE__ */ t("h3", { children: "Setting up grid..." }),
440
445
  /* @__PURE__ */ n("div", { style: { marginBottom: "10px" }, children: [
441
446
  !o && /* @__PURE__ */ t("p", { children: "Creating grid session..." }),
442
- o && !p && /* @__PURE__ */ t("p", { children: "Setting up real-time sync..." }),
443
- o && p && !c && /* @__PURE__ */ t("p", { children: "Establishing secure connection..." }),
444
- o && p && c && !m && /* @__PURE__ */ t("p", { children: "Connecting to server..." }),
445
- m && !$ && /* @__PURE__ */ t("p", { children: "Loading table data..." }),
446
- /* @__PURE__ */ t(St, { numRows: 4, numCols: 1 })
447
+ o && !m && /* @__PURE__ */ t("p", { children: "Setting up real-time sync..." }),
448
+ o && m && !c && /* @__PURE__ */ t("p", { children: "Establishing secure connection..." }),
449
+ o && m && c && !p && /* @__PURE__ */ t("p", { children: "Connecting to server..." }),
450
+ p && !$ && /* @__PURE__ */ t("p", { children: "Loading table data..." }),
451
+ /* @__PURE__ */ t(Ct, { numRows: 4, numCols: 1 })
447
452
  ] })
448
453
  ] }),
449
- U && /* @__PURE__ */ n(T, { children: [
454
+ U && /* @__PURE__ */ n(w, { children: [
450
455
  /* @__PURE__ */ t(s, { size: 12, children: /* @__PURE__ */ n(
451
- ht,
456
+ ft,
452
457
  {
453
458
  direction: "row",
454
459
  spacing: 1,
455
460
  sx: { justifyContent: "flex-end" },
456
461
  children: [
457
- X,
458
462
  Z,
463
+ tt,
459
464
  /* @__PURE__ */ t(
460
- et,
465
+ nt,
461
466
  {
462
467
  variant: "outlined",
463
- onClick: () => w(!0),
468
+ onClick: () => N(!0),
464
469
  startIcon: /* @__PURE__ */ t(It, {}),
465
470
  children: "Open chat"
466
471
  }
467
472
  ),
468
473
  /* @__PURE__ */ t(
469
- Rt,
474
+ Et,
470
475
  {
471
476
  agentRegistrationId: A,
472
477
  open: W,
473
- onClose: () => w(!1),
478
+ onClose: () => N(!1),
474
479
  gridSessionId: o.sessionId,
475
- usersReplicaId: p,
480
+ usersReplicaId: m,
476
481
  chatbotName: "Grid Assistant"
477
482
  }
478
483
  ),
479
484
  o.sourceEntityId && /* @__PURE__ */ t(
480
- nt,
485
+ mt,
481
486
  {
482
487
  sourceEntityId: o.sourceEntityId,
483
488
  gridSessionId: o.sessionId
@@ -491,7 +496,7 @@ const on = dt(
491
496
  }
492
497
  ),
493
498
  o.sourceEntityId && /* @__PURE__ */ t(
494
- st,
499
+ ct,
495
500
  {
496
501
  sourceEntityId: o.sourceEntityId,
497
502
  gridSessionId: o.sessionId
@@ -501,23 +506,24 @@ const on = dt(
501
506
  }
502
507
  ) }),
503
508
  /* @__PURE__ */ t(s, { size: 12, children: /* @__PURE__ */ t(
504
- Et,
509
+ xt,
505
510
  {
506
- gridRef: h,
511
+ gridRef: f,
507
512
  rowValues: g,
508
- columnNames: f?.columnNames ?? [],
509
- columnOrder: f?.columnOrder ?? [],
510
- schemaPropertiesInfo: b,
513
+ columnNames: a?.columnNames ?? [],
514
+ columnOrder: a?.columnOrder ?? [],
515
+ schemaPropertiesInfo: T,
511
516
  entityIsView: Y,
512
- jsonSchema: v,
517
+ jsonSchema: b,
513
518
  lastSelection: H,
514
- handleChange: tt,
515
- handleSelectionChange: ot,
516
- onSelectedRowChange: rt
519
+ handleChange: ot,
520
+ handleSelectionChange: it,
521
+ onSelectedRowChange: et,
522
+ remoteSelections: Q
517
523
  }
518
524
  ) }),
519
525
  /* @__PURE__ */ t(s, { size: 12, children: /* @__PURE__ */ t(
520
- Ot,
526
+ Mt,
521
527
  {
522
528
  selectedRowIndex: B.current,
523
529
  rowValues: g
@@ -537,7 +543,7 @@ const on = dt(
537
543
  },
538
544
  children: [
539
545
  /* @__PURE__ */ t("h3", { children: "Model" }),
540
- e ? /* @__PURE__ */ t(yt, { model: e }) : "No model available"
546
+ e ? /* @__PURE__ */ t(Rt, { model: e }) : "No model available"
541
547
  ]
542
548
  }
543
549
  )
@@ -546,6 +552,6 @@ const on = dt(
546
552
  }
547
553
  );
548
554
  export {
549
- on as default
555
+ en as default
550
556
  };
551
557
  //# sourceMappingURL=SynapseGrid.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseGrid.js","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 { Stack, Tooltip } from '@mui/material'\nimport Grid from '@mui/material/Grid'\nimport {\n CreateGridRequest,\n GridSession,\n} from '@sage-bionetworks/synapse-client'\nimport { ClickableJsonCrdt } from 'clickable-json'\nimport {\n forwardRef,\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 CertificationRequirement from '@/components/AccessRequirementList/RequirementItem/CertificationRequirement'\nimport { ValidationAlert } from './components/ValidationAlert'\n\nexport type SynapseGridProps = {\n agentRegistrationId?: string\n showDebugInfo?: boolean\n}\n\nexport type SynapseGridHandle = {\n initializeGrid: (request: CreateGridRequest) => void\n loadExistingSession: (sessionId: string) => void\n}\n\nconst SynapseGrid = forwardRef<SynapseGridHandle, SynapseGridProps>(\n ({ agentRegistrationId, showDebugInfo = false }, ref) => {\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 } =\n useListGridReplicas(session?.sessionId)\n\n const handleReplicaConnectionChange = useCallback(() => {\n void refetchReplicas()\n }, [refetchReplicas])\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 model,\n modelSnapshot,\n connect,\n presignedUrl,\n hasSufficientData,\n } = useDataGridWebSocket({\n onGridReady: handleReplicaConnectionChange,\n onReplicaConnected: handleReplicaConnectionChange,\n onReplicaDisconnected: handleReplicaConnectionChange,\n })\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 (\n replicaId === null ||\n replicaId === undefined ||\n !session?.sessionId\n ) {\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 // 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 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 // Track selected row index for validation display\n const selectedRowIndexRef = useRef<number | null>(null)\n const [, forceUpdate] = useState({})\n\n const handleSelectedRowChange = useCallback(\n (rowIndex: number | null, _row: DataGridRow | null) => {\n // Only update when a real row is selected — don't clear on blur/click-away\n // so the ValidationAlert stays open while the user interacts with it.\n if (rowIndex !== null) {\n selectedRowIndexRef.current = rowIndex\n forceUpdate({})\n }\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 ||\n '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(\n r => r.isConnected,\n )\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 && (\n <p>Setting up real-time sync...</p>\n )}\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 <Stack\n direction={'row'}\n spacing={1}\n sx={{ justifyContent: 'flex-end' }}\n >\n {undoUI}\n {redoUI}\n <GridMenuButton\n variant={'outlined'}\n onClick={() => setChatOpen(true)}\n startIcon={<SmartToyTwoTone />}\n >\n Open chat\n </GridMenuButton>\n <GridAgentChat\n agentRegistrationId={agentRegistrationId}\n open={chatOpen}\n onClose={() => setChatOpen(false)}\n gridSessionId={session.sessionId!}\n usersReplicaId={replicaId!}\n chatbotName=\"Grid Assistant\"\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={rowValues}\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 onSelectedRowChange={handleSelectedRowChange}\n />\n </Grid>\n <Grid size={12}>\n <ValidationAlert\n selectedRowIndex={selectedRowIndexRef.current}\n rowValues={rowValues}\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)\n\nexport default SynapseGrid\n"],"names":["SynapseGrid","forwardRef","agentRegistrationId","showDebugInfo","ref","session","setSession","useState","replicaId","setReplicaId","chatOpen","setChatOpen","lastSelection","setLastSelection","startGridSessionRef","useRef","gridRef","userBundle","isLoading","useGetCurrentUserBundle","replicas","refetchReplicas","useListGridReplicas","handleReplicaConnectionChange","useCallback","useImperativeHandle","request","sessionId","isConnected","websocketInstance","hasCompletedInitialSync","model","modelSnapshot","connect","presignedUrl","hasSufficientData","useDataGridWebSocket","websocketInstanceRef","useEffect","lastConnectParamsRef","nextParams","prevParams","jsonSchema","useGetSchemaForGrid","entityData","useGetEntity","entityIsView","schemaPropertiesInfo","useMemo","getSchemaPropertiesInfo","connectionStatus","rowValues","modelRowsToGrid","commit","applyAndCommitChanges","modelChanges","change","applyModelChange","applyModelChangeFromUndoRedo","undoUI","redoUI","addOperationsToUndoStack","clearRedoStack","useGridUndoRedo","handleChange","newValue","operations","removeNoOpOperations","mapOperationsToModelChanges","handleSelectionChange","opts","selection","replicaSelectionModel","computeReplicaSelectionModel","selectedRowIndexRef","forceUpdate","handleSelectedRowChange","rowIndex","_row","CertificationRequirement","jsxs","Grid","jsx","StartGridSession","connectedReplicas","Fragment","i","Tooltip","SkeletonTable","Stack","GridMenuButton","SmartToyTwoTone","GridAgentChat","UploadCsvToGridButton","ExportCsvFromGridButton","MergeGridWithSourceTableButton","DataGrid","ValidationAlert","ClickableJsonCrdt"],"mappings":"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"}
1
+ {"version":3,"file":"SynapseGrid.js","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 { Stack, Tooltip } from '@mui/material'\nimport Grid from '@mui/material/Grid'\nimport {\n CreateGridRequest,\n GridSession,\n} from '@sage-bionetworks/synapse-client'\nimport { ClickableJsonCrdt } from 'clickable-json'\nimport {\n forwardRef,\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 { useRemoteSelections } from './hooks/useRemoteSelections'\nimport CertificationRequirement from '@/components/AccessRequirementList/RequirementItem/CertificationRequirement'\nimport { ValidationAlert } from './components/ValidationAlert'\n\nexport type SynapseGridProps = {\n agentRegistrationId?: string\n showDebugInfo?: boolean\n}\n\nexport type SynapseGridHandle = {\n initializeGrid: (request: CreateGridRequest) => void\n loadExistingSession: (sessionId: string) => void\n}\n\nconst SynapseGrid = forwardRef<SynapseGridHandle, SynapseGridProps>(\n ({ agentRegistrationId, showDebugInfo = false }, ref) => {\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 } =\n useListGridReplicas(session?.sessionId)\n\n const handleReplicaConnectionChange = useCallback(() => {\n void refetchReplicas()\n }, [refetchReplicas])\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 model,\n modelSnapshot,\n connect,\n presignedUrl,\n hasSufficientData,\n } = useDataGridWebSocket({\n onGridReady: handleReplicaConnectionChange,\n onReplicaConnected: handleReplicaConnectionChange,\n onReplicaDisconnected: handleReplicaConnectionChange,\n })\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 (\n replicaId === null ||\n replicaId === undefined ||\n !session?.sessionId\n ) {\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 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 // Track selected row index for validation display\n const selectedRowIndexRef = useRef<number | null>(null)\n const [, forceUpdate] = useState({})\n\n const handleSelectedRowChange = useCallback(\n (rowIndex: number | null, _row: DataGridRow | null) => {\n // Only update when a real row is selected — don't clear on blur/click-away\n // so the ValidationAlert stays open while the user interacts with it.\n if (rowIndex !== null) {\n selectedRowIndexRef.current = rowIndex\n forceUpdate({})\n }\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 ||\n '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(\n r => r.isConnected,\n )\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 && (\n <p>Setting up real-time sync...</p>\n )}\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 <Stack\n direction={'row'}\n spacing={1}\n sx={{ justifyContent: 'flex-end' }}\n >\n {undoUI}\n {redoUI}\n <GridMenuButton\n variant={'outlined'}\n onClick={() => setChatOpen(true)}\n startIcon={<SmartToyTwoTone />}\n >\n Open chat\n </GridMenuButton>\n <GridAgentChat\n agentRegistrationId={agentRegistrationId}\n open={chatOpen}\n onClose={() => setChatOpen(false)}\n gridSessionId={session.sessionId!}\n usersReplicaId={replicaId!}\n chatbotName=\"Grid Assistant\"\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={rowValues}\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 onSelectedRowChange={handleSelectedRowChange}\n remoteSelections={remoteSelections}\n />\n </Grid>\n <Grid size={12}>\n <ValidationAlert\n selectedRowIndex={selectedRowIndexRef.current}\n rowValues={rowValues}\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)\n\nexport default SynapseGrid\n"],"names":["SynapseGrid","forwardRef","agentRegistrationId","showDebugInfo","ref","session","setSession","useState","replicaId","setReplicaId","chatOpen","setChatOpen","lastSelection","setLastSelection","startGridSessionRef","useRef","gridRef","userBundle","isLoading","useGetCurrentUserBundle","replicas","refetchReplicas","useListGridReplicas","handleReplicaConnectionChange","useCallback","useImperativeHandle","request","sessionId","isConnected","websocketInstance","hasCompletedInitialSync","model","modelSnapshot","connect","presignedUrl","hasSufficientData","useDataGridWebSocket","websocketInstanceRef","useEffect","lastConnectParamsRef","nextParams","prevParams","jsonSchema","useGetSchemaForGrid","entityData","useGetEntity","entityIsView","schemaPropertiesInfo","useMemo","getSchemaPropertiesInfo","connectionStatus","remoteSelections","useRemoteSelections","rowValues","modelRowsToGrid","commit","applyAndCommitChanges","modelChanges","change","applyModelChange","applyModelChangeFromUndoRedo","undoUI","redoUI","addOperationsToUndoStack","clearRedoStack","useGridUndoRedo","handleChange","newValue","operations","removeNoOpOperations","mapOperationsToModelChanges","handleSelectionChange","opts","selection","replicaSelectionModel","computeReplicaSelectionModel","selectedRowIndexRef","forceUpdate","handleSelectedRowChange","rowIndex","_row","CertificationRequirement","jsxs","Grid","jsx","StartGridSession","connectedReplicas","Fragment","i","Tooltip","SkeletonTable","Stack","GridMenuButton","SmartToyTwoTone","GridAgentChat","UploadCsvToGridButton","ExportCsvFromGridButton","MergeGridWithSourceTableButton","DataGrid","ValidationAlert","ClickableJsonCrdt"],"mappings":"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"}
@@ -48,7 +48,6 @@ import "../../../assets/icons/account-validated.svg.js";
48
48
  import "../../../utils/functions/DateFormatter.js";
49
49
  import "@react-hookz/web";
50
50
  import "dayjs";
51
- import "../../../assets/ArcusBioIcon.svg.js";
52
51
  import "@mui/material/SvgIcon";
53
52
  import "../../../assets/icons/AccessPending.svg.js";
54
53
  import "../../../assets/icons/AccessPendingCloud.svg.js";
@@ -224,7 +223,7 @@ function u({
224
223
  let o = "";
225
224
  return i > 0 && (o += `created ${i.toLocaleString()} rows`), i > 0 && r > 0 ? o += " and " : r == 0 && (o += "."), r > 0 && (o += `updated ${r.toLocaleString()} rows.`), I(o);
226
225
  }
227
- function yt(i) {
226
+ function St(i) {
228
227
  const { gridSessionId: r, open: o, onClose: m, onComplete: p } = i, {
229
228
  mutate: e,
230
229
  isPending: s,
@@ -256,7 +255,7 @@ function yt(i) {
256
255
  );
257
256
  }
258
257
  export {
259
- yt as default,
258
+ St as default,
260
259
  u as getUpdateMessage
261
260
  };
262
261
  //# sourceMappingURL=UploadCsvToGridDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UploadCsvToGridDialog.js","sources":["../../../../src/components/DataGrid/components/UploadCsvToGridDialog.tsx"],"sourcesContent":["import { displayToast } from '@/components/index'\nimport CsvPreviewDialog from '@/components/table/CsvPreview/CsvPreviewDialog'\nimport { useImportCsvIntoGrid } from '@/synapse-queries/grid/useImportCsvIntoGrid'\nimport { GridCsvImportResponse } from '@sage-bionetworks/synapse-client'\nimport upperFirst from 'lodash-es/upperFirst'\n\ntype UploadCsvToGridDialogProps = {\n gridSessionId: string\n open: boolean\n onClose: () => void\n onComplete: () => void\n}\n\nexport function getUpdateMessage({\n createdCount = 0,\n updatedCount = 0,\n}: GridCsvImportResponse): string {\n let message = ''\n if (createdCount > 0) {\n message += `created ${createdCount.toLocaleString()} rows`\n }\n if (createdCount > 0 && updatedCount > 0) {\n message += ' and '\n } else if (updatedCount == 0) {\n message += '.'\n }\n if (updatedCount > 0) {\n message += `updated ${updatedCount.toLocaleString()} rows.`\n }\n return upperFirst(message)\n}\n\nexport default function UploadCsvToGridDialog(\n props: UploadCsvToGridDialogProps,\n) {\n const { gridSessionId, open, onClose, onComplete } = props\n\n const {\n mutate: importCsvIntoGrid,\n isPending,\n error,\n } = useImportCsvIntoGrid({\n onSuccess: result => {\n displayToast(getUpdateMessage(result), 'success', {\n title: 'Data imported successfully',\n })\n onComplete()\n },\n })\n\n return (\n <CsvPreviewDialog\n open={open}\n onClose={onClose}\n onConfirm={(fileHandleId, schema, csvDescriptor) => {\n importCsvIntoGrid({\n concreteType:\n 'org.sagebionetworks.repo.model.grid.GridCsvImportRequest',\n sessionId: gridSessionId,\n fileHandleId,\n csvDescriptor,\n schema,\n })\n }}\n errorMessage={error?.message}\n confirmIsPending={isPending}\n />\n )\n}\n"],"names":["getUpdateMessage","createdCount","updatedCount","message","upperFirst","UploadCsvToGridDialog","props","gridSessionId","open","onClose","onComplete","importCsvIntoGrid","isPending","error","useImportCsvIntoGrid","result","displayToast","jsx","CsvPreviewDialog","fileHandleId","schema","csvDescriptor"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,SAASA,EAAiB;AAAA,EAC/B,cAAAC,IAAe;AAAA,EACf,cAAAC,IAAe;AACjB,GAAkC;AAChC,MAAIC,IAAU;AACd,SAAIF,IAAe,MACjBE,KAAW,WAAWF,EAAa,eAAA,CAAgB,UAEjDA,IAAe,KAAKC,IAAe,IACrCC,KAAW,UACFD,KAAgB,MACzBC,KAAW,MAETD,IAAe,MACjBC,KAAW,WAAWD,EAAa,eAAA,CAAgB,WAE9CE,EAAWD,CAAO;AAC3B;AAEA,SAAwBE,GACtBC,GACA;AACA,QAAM,EAAE,eAAAC,GAAe,MAAAC,GAAM,SAAAC,GAAS,YAAAC,MAAeJ,GAE/C;AAAA,IACJ,QAAQK;AAAA,IACR,WAAAC;AAAA,IACA,OAAAC;AAAA,EAAA,IACEC,EAAqB;AAAA,IACvB,WAAW,CAAAC,MAAU;AACnB,MAAAC,EAAahB,EAAiBe,CAAM,GAAG,WAAW;AAAA,QAChD,OAAO;AAAA,MAAA,CACR,GACDL,EAAA;AAAA,IACF;AAAA,EAAA,CACD;AAED,SACE,gBAAAO;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAV;AAAA,MACA,SAAAC;AAAA,MACA,WAAW,CAACU,GAAcC,GAAQC,MAAkB;AAClD,QAAAV,EAAkB;AAAA,UAChB,cACE;AAAA,UACF,WAAWJ;AAAA,UACX,cAAAY;AAAA,UACA,eAAAE;AAAA,UACA,QAAAD;AAAA,QAAA,CACD;AAAA,MACH;AAAA,MACA,cAAcP,GAAO;AAAA,MACrB,kBAAkBD;AAAA,IAAA;AAAA,EAAA;AAGxB;"}
1
+ {"version":3,"file":"UploadCsvToGridDialog.js","sources":["../../../../src/components/DataGrid/components/UploadCsvToGridDialog.tsx"],"sourcesContent":["import { displayToast } from '@/components/index'\nimport CsvPreviewDialog from '@/components/table/CsvPreview/CsvPreviewDialog'\nimport { useImportCsvIntoGrid } from '@/synapse-queries/grid/useImportCsvIntoGrid'\nimport { GridCsvImportResponse } from '@sage-bionetworks/synapse-client'\nimport upperFirst from 'lodash-es/upperFirst'\n\ntype UploadCsvToGridDialogProps = {\n gridSessionId: string\n open: boolean\n onClose: () => void\n onComplete: () => void\n}\n\nexport function getUpdateMessage({\n createdCount = 0,\n updatedCount = 0,\n}: GridCsvImportResponse): string {\n let message = ''\n if (createdCount > 0) {\n message += `created ${createdCount.toLocaleString()} rows`\n }\n if (createdCount > 0 && updatedCount > 0) {\n message += ' and '\n } else if (updatedCount == 0) {\n message += '.'\n }\n if (updatedCount > 0) {\n message += `updated ${updatedCount.toLocaleString()} rows.`\n }\n return upperFirst(message)\n}\n\nexport default function UploadCsvToGridDialog(\n props: UploadCsvToGridDialogProps,\n) {\n const { gridSessionId, open, onClose, onComplete } = props\n\n const {\n mutate: importCsvIntoGrid,\n isPending,\n error,\n } = useImportCsvIntoGrid({\n onSuccess: result => {\n displayToast(getUpdateMessage(result), 'success', {\n title: 'Data imported successfully',\n })\n onComplete()\n },\n })\n\n return (\n <CsvPreviewDialog\n open={open}\n onClose={onClose}\n onConfirm={(fileHandleId, schema, csvDescriptor) => {\n importCsvIntoGrid({\n concreteType:\n 'org.sagebionetworks.repo.model.grid.GridCsvImportRequest',\n sessionId: gridSessionId,\n fileHandleId,\n csvDescriptor,\n schema,\n })\n }}\n errorMessage={error?.message}\n confirmIsPending={isPending}\n />\n )\n}\n"],"names":["getUpdateMessage","createdCount","updatedCount","message","upperFirst","UploadCsvToGridDialog","props","gridSessionId","open","onClose","onComplete","importCsvIntoGrid","isPending","error","useImportCsvIntoGrid","result","displayToast","jsx","CsvPreviewDialog","fileHandleId","schema","csvDescriptor"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,SAASA,EAAiB;AAAA,EAC/B,cAAAC,IAAe;AAAA,EACf,cAAAC,IAAe;AACjB,GAAkC;AAChC,MAAIC,IAAU;AACd,SAAIF,IAAe,MACjBE,KAAW,WAAWF,EAAa,eAAA,CAAgB,UAEjDA,IAAe,KAAKC,IAAe,IACrCC,KAAW,UACFD,KAAgB,MACzBC,KAAW,MAETD,IAAe,MACjBC,KAAW,WAAWD,EAAa,eAAA,CAAgB,WAE9CE,EAAWD,CAAO;AAC3B;AAEA,SAAwBE,GACtBC,GACA;AACA,QAAM,EAAE,eAAAC,GAAe,MAAAC,GAAM,SAAAC,GAAS,YAAAC,MAAeJ,GAE/C;AAAA,IACJ,QAAQK;AAAA,IACR,WAAAC;AAAA,IACA,OAAAC;AAAA,EAAA,IACEC,EAAqB;AAAA,IACvB,WAAW,CAAAC,MAAU;AACnB,MAAAC,EAAahB,EAAiBe,CAAM,GAAG,WAAW;AAAA,QAChD,OAAO;AAAA,MAAA,CACR,GACDL,EAAA;AAAA,IACF;AAAA,EAAA,CACD;AAED,SACE,gBAAAO;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAV;AAAA,MACA,SAAAC;AAAA,MACA,WAAW,CAACU,GAAcC,GAAQC,MAAkB;AAClD,QAAAV,EAAkB;AAAA,UAChB,cACE;AAAA,UACF,WAAWJ;AAAA,UACX,cAAAY;AAAA,UACA,eAAAE;AAAA,UACA,QAAAD;AAAA,QAAA,CACD;AAAA,MACH;AAAA,MACA,cAAcP,GAAO;AAAA,MACrB,kBAAkBD;AAAA,IAAA;AAAA,EAAA;AAGxB;"}