synapse-react-client 4.0.1 → 4.0.2

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 (22) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts +3 -0
  3. package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
  4. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +112 -118
  5. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  6. package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.d.ts.map +1 -1
  7. package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js +30 -32
  8. package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
  9. package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.d.ts.map +1 -1
  10. package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js +27 -30
  11. package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
  12. package/dist/components/SynapseHomepageV2/SynapseSearchChips.d.ts.map +1 -1
  13. package/dist/components/SynapseHomepageV2/SynapseSearchChips.js +14 -17
  14. package/dist/components/SynapseHomepageV2/SynapseSearchChips.js.map +1 -1
  15. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
  16. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +90 -91
  17. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
  18. package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.d.ts.map +1 -1
  19. package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js +66 -64
  20. package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js.map +1 -1
  21. package/dist/tsconfig.build.tsbuildinfo +1 -1
  22. package/package.json +4 -4
package/dist/SWC.index.js CHANGED
@@ -215,7 +215,7 @@ const X = {
215
215
  sendSearchResultsReturnedEvent: c,
216
216
  sendSearchResultReturnedEvent: d,
217
217
  sendSearchResultClickedEvent: l
218
- }, $ = "4.0.1";
218
+ }, $ = "4.0.2";
219
219
  export {
220
220
  _ as Analytics,
221
221
  g as HttpClient,
@@ -1,4 +1,5 @@
1
1
  import { EntityType } from '@sage-bionetworks/synapse-client';
2
+ import { RefObject } from 'react';
2
3
  export declare const PYTHON_CLIENT_IMPORT_AND_LOGIN = "import synapseclient\nsyn = synapseclient.Synapse()\nsyn.login(authToken=\"YOUR_TOKEN_HERE\")";
3
4
  export declare const R_CLIENT_IMPORT_AND_LOGIN = "library(synapser)\nsynLogin(authToken=\"YOUR_TOKEN_HERE\")";
4
5
  declare enum DownloadAction {
@@ -13,6 +14,8 @@ export declare function EntityDownloadButton(props: {
13
14
  entityId: string;
14
15
  name: string;
15
16
  entityType: EntityType;
17
+ downloadConfirmationContainer?: RefObject<HTMLElement | null>;
18
+ disabled?: boolean;
16
19
  }): import("react/jsx-runtime").JSX.Element;
17
20
  export {};
18
21
  //# sourceMappingURL=EntityDownloadButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityDownloadButton.d.ts","sourceRoot":"","sources":["../../../src/components/EntityDownloadButton/EntityDownloadButton.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAEL,UAAU,EACX,MAAM,kCAAkC,CAAA;AAqBzC,eAAO,MAAM,8BAA8B,kGAEJ,CAAA;AAGvC,eAAO,MAAM,yBAAyB,+DACA,CAAA;AA2DtC,aAAK,cAAc;IACjB,YAAY,IAAA;IACZ,SAAS,IAAA;IACT,kBAAkB,IAAA;IAClB,wBAAwB,IAAA;IACxB,WAAW,IAAA;CACZ;AAqHD,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,UAAU,GACf,cAAc,EAAE,EAAE,CAkCpB;AA2ED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,UAAU,CAAA;CACvB,2CAuKA"}
1
+ {"version":3,"file":"EntityDownloadButton.d.ts","sourceRoot":"","sources":["../../../src/components/EntityDownloadButton/EntityDownloadButton.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAK7D,OAAO,EAAE,SAAS,EAAY,MAAM,OAAO,CAAA;AAkB3C,eAAO,MAAM,8BAA8B,kGAEJ,CAAA;AAGvC,eAAO,MAAM,yBAAyB,+DACA,CAAA;AA2DtC,aAAK,cAAc;IACjB,YAAY,IAAA;IACZ,SAAS,IAAA;IACT,kBAAkB,IAAA;IAClB,wBAAwB,IAAA;IACxB,WAAW,IAAA;CACZ;AA6FD,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,UAAU,GACf,cAAc,EAAE,EAAE,CAkCpB;AA2ED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,UAAU,CAAA;IACtB,6BAA6B,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,2CAgLA"}
@@ -1,17 +1,17 @@
1
- import { jsxs as V, Fragment as _, jsx as w } from "react/jsx-runtime";
1
+ import { jsx as u, jsxs as j, Fragment as H } from "react/jsx-runtime";
2
2
  import "../../synapse-client/SynapseClient.js";
3
3
  import "@sage-bionetworks/synapse-client/generated/models/ErrorResponseCode";
4
4
  import "@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse";
5
5
  import "@sage-bionetworks/synapse-client/util/SynapseClientError";
6
- import { FileHandleAssociateType as j } from "@sage-bionetworks/synapse-types";
7
- import { isContainerType as F, isEntityView as H, hasFilesInView as G, isDataset as U, isVersionableEntity as B, entityTypeToFriendlyName as Q } from "../../utils/functions/EntityTypeUtils.js";
6
+ import { FileHandleAssociateType as G } from "@sage-bionetworks/synapse-types";
7
+ import { isContainerType as U, isEntityView as B, hasFilesInView as Q, isDataset as Y, isVersionableEntity as z, entityTypeToFriendlyName as K } from "../../utils/functions/EntityTypeUtils.js";
8
8
  import "../../utils/SynapseConstants.js";
9
9
  import "lodash-es";
10
10
  import "@sage-bionetworks/synapse-client/util/synapseClientFetch";
11
11
  import "@tanstack/react-query";
12
12
  import "../../utils/PermissionLevelToAccessType.js";
13
- import { useState as E } from "react";
14
- import { useSynapseContext as Y } from "../../utils/context/SynapseContext.js";
13
+ import { useState as w } from "react";
14
+ import { useSynapseContext as W } from "../../utils/context/SynapseContext.js";
15
15
  import "use-deep-compare-effect";
16
16
  import "@mui/material";
17
17
  import "../../utils/hooks/useCookiePreferences.js";
@@ -27,22 +27,24 @@ import "lodash-es/isEqual";
27
27
  import "lodash-es/xorWith";
28
28
  import "react-router";
29
29
  import { EntityType as t } from "@sage-bionetworks/synapse-client";
30
- import { isFileEntity as z } from "../../utils/types/IsType.js";
31
- import { useAddFileToDownloadList as K, useAddToDownloadList as W, useGetAddToDownloadListStats as J } from "../../synapse-queries/download/useDownloadList.js";
32
- import { useGetEntity as h, useGetVersions as X } from "../../synapse-queries/entity/useEntity.js";
33
- import { useDirectDownloadHandler as Z } from "../../utils/hooks/useDirectDownloadHandler.js";
34
- import { DownloadOutlined as ee } from "@mui/icons-material";
35
- import { displayFilesWereAddedToDownloadListSuccess as D } from "../download_list/DownloadConfirmationUtils.js";
36
- import { DropdownMenu as te } from "../menu/DropdownMenu.js";
37
- import { ModalDownload as oe } from "../ModalDownload/ModalDownload.js";
38
- import { ProgrammaticInstructionsModal as se } from "../ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js";
39
- import { displayToast as f } from "../ToastMessage/ToastMessage.js";
40
- const C = `import synapseclient
30
+ import { isFileEntity as J } from "../../utils/types/IsType.js";
31
+ import { useAddFileToDownloadList as X, useGetAddToDownloadListStats as Z } from "../../synapse-queries/download/useDownloadList.js";
32
+ import { useGetEntity as F, useGetVersions as ee } from "../../synapse-queries/entity/useEntity.js";
33
+ import { useDirectDownloadHandler as te } from "../../utils/hooks/useDirectDownloadHandler.js";
34
+ import { DownloadOutlined as oe } from "@mui/icons-material";
35
+ import { createPortal as ne } from "react-dom";
36
+ import { displayFilesWereAddedToDownloadListSuccess as ie } from "../download_list/DownloadConfirmationUtils.js";
37
+ import { EntityDownloadConfirmation as ae } from "../EntityDownloadConfirmation/EntityDownloadConfirmation.js";
38
+ import { DropdownMenu as re } from "../menu/DropdownMenu.js";
39
+ import { ModalDownload as se } from "../ModalDownload/ModalDownload.js";
40
+ import { ProgrammaticInstructionsModal as de } from "../ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js";
41
+ import { displayToast as E } from "../ToastMessage/ToastMessage.js";
42
+ const h = `import synapseclient
41
43
  syn = synapseclient.Synapse()
42
44
  syn.login(authToken="YOUR_TOKEN_HERE")`, b = `library(synapser)
43
45
  synLogin(authToken="YOUR_TOKEN_HERE")`;
44
- function re(e, o, s) {
45
- const r = e === t.dataset && s ? `${o}.${s}` : o;
46
+ function le(e, o, n) {
47
+ const i = e === t.dataset && n ? `${o}.${n}` : o;
46
48
  switch (e) {
47
49
  case t.file:
48
50
  case t.folder:
@@ -54,7 +56,7 @@ function re(e, o, s) {
54
56
 
55
57
  # Download file
56
58
  synGet('${o}')`,
57
- pythonCode: `${C}
59
+ pythonCode: `${h}
58
60
 
59
61
  # Download file
60
62
  syn.get('${o}')`
@@ -76,61 +78,48 @@ docker pull docker.synapse.org/${o}/myrepo`,
76
78
  case t.virtualtable:
77
79
  case t.recordset:
78
80
  return {
79
- cliCode: `synapse get -q "SELECT * FROM ${r}"`,
81
+ cliCode: `synapse get -q "SELECT * FROM ${i}"`,
80
82
  rCode: `${b}
81
83
 
82
- query <- synTableQuery("SELECT * FROM ${r}")
84
+ query <- synTableQuery("SELECT * FROM ${i}")
83
85
  read.table(query$filepath, sep=",")`,
84
- pythonCode: `${C}
86
+ pythonCode: `${h}
85
87
 
86
- query = syn.tableQuery("SELECT * FROM ${r}")
88
+ query = syn.tableQuery("SELECT * FROM ${i}")
87
89
  query.asDataFrame()`
88
90
  };
89
91
  default:
90
92
  throw new Error(`Unhandled EntityType: ${e}`);
91
93
  }
92
94
  }
93
- function ne(e, o, s, r, d, l, c, n, m, p, u, y) {
94
- switch (r) {
95
+ function ce(e, o, n, i, s, d, l, r, y, c, p, f) {
96
+ switch (i) {
95
97
  case 0:
96
98
  return {
97
99
  text: "Download File",
98
100
  onClick: () => {
99
- u && u();
101
+ p && p();
100
102
  },
101
- tooltipText: y ? "Download this file directly" : "Sign in to download this file",
102
- disabled: !y
103
+ tooltipText: f ? "Download this file directly" : "Sign in to download this file",
104
+ disabled: !f
103
105
  };
104
106
  case 1:
105
107
  return {
106
108
  text: "Add to Download Cart",
107
- disabled: p,
108
- tooltipText: ae(s, !!p),
109
+ disabled: c,
110
+ tooltipText: me(n, !!c),
109
111
  onClick: () => {
110
- s === t.file || s === t.recordset ? c({
112
+ n === t.file || n === t.recordset ? l({
111
113
  entityId: e,
112
- entityVersionNumber: m
113
- }) : s === t.dataset ? n({
114
- parentId: e,
115
- useVersionNumber: !0,
116
- concreteType: "org.sagebionetworks.repo.model.download.AddToDownloadListRequest"
117
- }) : s === t.entityview ? n({
118
- concreteType: "org.sagebionetworks.repo.model.download.AddToDownloadListRequest",
119
- query: {
120
- sql: `SELECT * FROM ${e}`
121
- }
122
- }) : n({
123
- parentId: e,
124
- concreteType: "org.sagebionetworks.repo.model.download.AddToDownloadListRequest",
125
- recursive: F(s)
126
- });
114
+ entityVersionNumber: y
115
+ }) : r(!0);
127
116
  }
128
117
  };
129
118
  case 2:
130
119
  return {
131
120
  text: "Programmatic Access",
132
121
  onClick: () => {
133
- d(!0);
122
+ s(!0);
134
123
  },
135
124
  tooltipText: "View programmatic access options"
136
125
  };
@@ -138,7 +127,7 @@ function ne(e, o, s, r, d, l, c, n, m, p, u, y) {
138
127
  return {
139
128
  text: "Programmatic Access (Docker)",
140
129
  onClick: () => {
141
- d(!0);
130
+ s(!0);
142
131
  },
143
132
  tooltipText: "View programmatic options to pull Docker image"
144
133
  };
@@ -146,14 +135,14 @@ function ne(e, o, s, r, d, l, c, n, m, p, u, y) {
146
135
  return {
147
136
  text: "Export Table",
148
137
  onClick: () => {
149
- l(!0);
138
+ d(!0);
150
139
  },
151
140
  tooltipText: "Export table data"
152
141
  };
153
142
  }
154
143
  }
155
- const ae = (e, o) => o ? `This ${Q(e)} has no accessible files` : "Add file(s) to your download cart";
156
- function ie(e) {
144
+ const me = (e, o) => o ? `This ${K(e)} has no accessible files` : "Add file(s) to your download cart";
145
+ function ue(e) {
157
146
  switch (e) {
158
147
  case t.file:
159
148
  case t.recordset:
@@ -209,57 +198,50 @@ function ie(e) {
209
198
  throw new Error(`Unhandled EntityType: ${e}`);
210
199
  }
211
200
  }
212
- function de(e, o) {
213
- const { data: s, isLoading: r } = h(e), d = o === t.dataset, { data: l, isLoading: c } = X(
201
+ function ye(e, o) {
202
+ const { data: n, isLoading: i } = F(e), s = o === t.dataset, { data: d, isLoading: l } = ee(
214
203
  e,
215
204
  0,
216
205
  1,
217
206
  {
218
- enabled: d
207
+ enabled: s
219
208
  }
220
209
  );
221
- let n;
222
- return d ? l?.results && l.results.length > 0 ? n = l.results[0].versionNumber : n = void 0 : n = s && B(s) ? s.versionNumber : void 0, { latestVersionNumber: n, isLoading: r || c };
223
- }
224
- function le(e, o, s) {
225
210
  let r;
226
- return s === t.dataset ? r = o ? `SELECT * FROM ${e}.${o}` : `SELECT * FROM ${e}` : r = `SELECT * FROM ${e}`, {
211
+ return s ? d?.results && d.results.length > 0 ? r = d.results[0].versionNumber : r = void 0 : r = n && z(n) ? n.versionNumber : void 0, { latestVersionNumber: r, isLoading: i || l };
212
+ }
213
+ function pe(e, o, n) {
214
+ let i;
215
+ return n === t.dataset ? i = o ? `SELECT * FROM ${e}.${o}` : `SELECT * FROM ${e}` : i = `SELECT * FROM ${e}`, {
227
216
  concreteType: "org.sagebionetworks.repo.model.table.QueryBundleRequest",
228
217
  entityId: `${e}`,
229
218
  query: {
230
- sql: r
219
+ sql: i
231
220
  },
232
221
  partMask: 0
233
222
  };
234
223
  }
235
- function We(e) {
236
- const { latestVersionNumber: o } = de(
224
+ function nt(e) {
225
+ const { latestVersionNumber: o } = ye(
237
226
  e.entityId,
238
227
  e.entityType
239
- ), s = le(
228
+ ), n = pe(
240
229
  e.entityId,
241
230
  o,
242
231
  e.entityType
243
- ), { downloadCartPageUrl: r, isAuthenticated: d } = Y(), { mutate: l } = K({
244
- onSuccess: (i) => {
245
- i.numberOfFilesAdded > 0 ? D(r) : f("0 Files added to your Download Cart", "info");
246
- },
247
- onError: (i) => {
248
- f(i.reason, "danger");
249
- }
250
- }), { mutate: c } = W({
251
- onSuccess: (i) => {
252
- i.numberOfFilesAdded != null && i.numberOfFilesAdded > 0 ? D(r) : f("0 Files added to your Download Cart", "info");
232
+ ), { downloadCartPageUrl: i, isAuthenticated: s } = W(), { mutate: d } = X({
233
+ onSuccess: (m) => {
234
+ m.numberOfFilesAdded > 0 ? ie(i) : E("0 Files added to your Download Cart", "info");
253
235
  },
254
- onError: (i) => {
255
- f(i.reason, "danger");
236
+ onError: (m) => {
237
+ E(m.reason, "danger");
256
238
  }
257
- }), [n, m] = E(!1), p = () => {
258
- m(!1);
259
- }, u = F(e.entityType), {
260
- data: y,
261
- isLoading: L
262
- } = J(
239
+ }), [l, r] = w(!1), [y, c] = w(!1), [p, f] = w(!1), L = () => {
240
+ r(!1);
241
+ }, T = U(e.entityType), {
242
+ data: k,
243
+ isLoading: O
244
+ } = Z(
263
245
  {
264
246
  concreteType: "org.sagebionetworks.repo.model.download.AddToDownloadListStatsRequest",
265
247
  request: {
@@ -269,76 +251,88 @@ function We(e) {
269
251
  }
270
252
  },
271
253
  {
272
- enabled: u
254
+ enabled: T
273
255
  }
274
- ), k = u && (L || y?.fileCount === 0), { data: a } = h(e.entityId), { downloadFile: A } = Z(), g = a && z(a) ? a.dataFileHandleId : void 0, O = g ? () => {
256
+ ), $ = T && (O || k?.fileCount === 0), { data: a } = F(e.entityId), { downloadFile: A } = te(), C = a && J(a) ? a.dataFileHandleId : void 0, R = C ? () => {
275
257
  A({
276
- fileHandleId: g,
258
+ fileHandleId: C,
277
259
  associatedObjectId: e.entityId,
278
- associatedObjectType: j.FileEntity
260
+ associatedObjectType: G.FileEntity
279
261
  });
280
- } : void 0, R = a && H(a) && !G(a), $ = a && U(a) && (!a.items || a.items.length === 0), S = k || R || $, [N, T] = E(!1), v = () => {
281
- T(!1);
282
- }, q = ie(e.entityType).map(
283
- (i) => i.map(
284
- (I) => ne(
262
+ } : void 0, S = a && B(a) && !Q(a), N = a && Y(a) && (!a.items || a.items.length === 0), x = $ || S || N, [v, D] = w(!1), I = () => {
263
+ D(!1);
264
+ }, M = ue(e.entityType).map(
265
+ (m) => m.map(
266
+ (_) => ce(
285
267
  e.entityId,
286
268
  e.name,
287
269
  e.entityType,
288
- I,
289
- m,
290
- T,
291
- l,
270
+ _,
271
+ r,
272
+ D,
273
+ d,
292
274
  c,
293
275
  o,
294
- S,
295
- O,
296
- d
276
+ x,
277
+ R,
278
+ s
297
279
  )
298
280
  )
299
- ), { cliCode: x, rCode: M, pythonCode: P } = re(
281
+ ), { cliCode: P, rCode: q, pythonCode: V } = le(
300
282
  e.entityType,
301
283
  e.entityId,
302
284
  o
303
- );
304
- return /* @__PURE__ */ V(_, { children: [
305
- /* @__PURE__ */ w(
306
- te,
285
+ ), g = y ? /* @__PURE__ */ u(
286
+ ae,
287
+ {
288
+ entityId: e.entityId,
289
+ handleClose: () => c(!1),
290
+ onIsLoadingChange: f
291
+ }
292
+ ) : null;
293
+ return /* @__PURE__ */ j(H, { children: [
294
+ /* @__PURE__ */ u(
295
+ re,
307
296
  {
308
- items: q,
297
+ items: M,
309
298
  dropdownButtonText: "Download",
310
299
  buttonTooltip: "Download options for this entity",
311
300
  buttonProps: {
312
301
  variant: "outlined",
313
- startIcon: /* @__PURE__ */ w(ee, {})
302
+ startIcon: /* @__PURE__ */ u(oe, {}),
303
+ disabled: e.disabled || p
314
304
  }
315
305
  }
316
306
  ),
317
- /* @__PURE__ */ w(
318
- se,
307
+ g && (e.downloadConfirmationContainer?.current ? ne(
308
+ g,
309
+ e.downloadConfirmationContainer.current
310
+ ) : g),
311
+ /* @__PURE__ */ u(
312
+ de,
319
313
  {
320
- show: n,
314
+ show: l,
321
315
  title: `Programmatic Access: ${e.name}`,
322
- onClose: p,
323
- pythonCode: P,
324
- rCode: M,
325
- cliCode: x,
316
+ onClose: L,
317
+ pythonCode: V,
318
+ rCode: q,
319
+ cliCode: P,
326
320
  helpUrl: "https://help.synapse.org/docs/Synapse-Docker-Registry.2011037752.html#SynapseDockerRegistry-UsingDockerImagesStoredintheSynapseDockerRegistry"
327
321
  }
328
322
  ),
329
- N && /* @__PURE__ */ w(
330
- oe,
323
+ v && /* @__PURE__ */ u(
324
+ se,
331
325
  {
332
- queryBundleRequest: s,
333
- onClose: v
326
+ queryBundleRequest: n,
327
+ onClose: I
334
328
  }
335
329
  )
336
330
  ] });
337
331
  }
338
332
  export {
339
- We as EntityDownloadButton,
340
- C as PYTHON_CLIENT_IMPORT_AND_LOGIN,
333
+ nt as EntityDownloadButton,
334
+ h as PYTHON_CLIENT_IMPORT_AND_LOGIN,
341
335
  b as R_CLIENT_IMPORT_AND_LOGIN,
342
- ie as getDownloadActionsForEntityType
336
+ ue as getDownloadActionsForEntityType
343
337
  };
344
338
  //# sourceMappingURL=EntityDownloadButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityDownloadButton.js","sources":["../../../src/components/EntityDownloadButton/EntityDownloadButton.tsx"],"sourcesContent":["import { useGetEntity, useGetVersions } from '@/synapse-queries'\nimport {\n useAddFileToDownloadList,\n useAddToDownloadList,\n useGetAddToDownloadListStats,\n} from '@/synapse-queries/index'\nimport { useSynapseContext } from '@/utils'\nimport {\n entityTypeToFriendlyName,\n hasFilesInView,\n isContainerType,\n isDataset,\n isEntityView,\n isVersionableEntity,\n} from '@/utils/functions/EntityTypeUtils'\nimport { useDirectDownloadHandler } from '@/utils/hooks/useDirectDownloadHandler'\nimport { isFileEntity } from '@/utils/types/IsType'\nimport { DownloadOutlined as DownloadIcon } from '@mui/icons-material'\nimport {\n AddToDownloadListRequest,\n EntityType,\n} from '@sage-bionetworks/synapse-client'\nimport {\n FileHandleAssociateType,\n QueryBundleRequest,\n} from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport { displayFilesWereAddedToDownloadListSuccess } from '../download_list/DownloadConfirmationUtils'\nimport { DropdownMenu, DropdownMenuItem } from '../menu/DropdownMenu'\nimport { ModalDownload } from '../ModalDownload/ModalDownload'\nimport { ProgrammaticInstructionsModal } from '../ProgrammaticInstructionsModal/ProgrammaticInstructionsModal'\nimport { displayToast } from '../ToastMessage/index'\n\n// WIP\n// Per Nick Grosenbacher: For this to be reusable, I think we would also need to accept versionNumber as a prop. Where we would have the following behavior:\n// - If the version number is present, use it\n// - If the version number is null, do not use it,\n// - If the version number is undefined, then we would try to do the 'smart' thing-- get the latest version for datasets, otherwise don't use it.\n\n// Have to keep these consts outside of getProgrammaticAccessCode because\n// they are being called in ProgrammaticTableDownload.tsx\n// Python client import and login instructions\nexport const PYTHON_CLIENT_IMPORT_AND_LOGIN = `import synapseclient\nsyn = synapseclient.Synapse()\nsyn.login(authToken=\"YOUR_TOKEN_HERE\")`\n\n// R client import and login instructions\nexport const R_CLIENT_IMPORT_AND_LOGIN = `library(synapser)\nsynLogin(authToken=\"YOUR_TOKEN_HERE\")`\n\ntype ProgrammaticAccessCode = {\n cliCode: string | undefined\n rCode: string | undefined\n pythonCode: string | undefined\n}\n\n// Generate programmatic access code snippet content based on entity type\nfunction getProgrammaticAccessCode(\n type: EntityType,\n entityId: string,\n version: number | undefined,\n): ProgrammaticAccessCode {\n const id =\n type === EntityType.dataset && version ? `${entityId}.${version}` : entityId\n switch (type) {\n case EntityType.file:\n case EntityType.folder:\n case EntityType.project:\n case EntityType.link:\n return {\n cliCode: `synapse get -r ${entityId}`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsynGet('${entityId}')`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsyn.get('${entityId}')`,\n }\n case EntityType.dockerrepo:\n return {\n cliCode: `docker login -u <synapse username> -p <synapse password> docker.synapse.org \\n\ndocker pull docker.synapse.org/${entityId}/myrepo`,\n rCode: undefined,\n pythonCode: undefined,\n }\n case EntityType.dataset:\n case EntityType.entityview:\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n case EntityType.recordset:\n return {\n cliCode: `synapse get -q \"SELECT * FROM ${id}\"`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\nquery <- synTableQuery(\"SELECT * FROM ${id}\")\nread.table(query$filepath, sep=\",\")`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\nquery = syn.tableQuery(\"SELECT * FROM ${id}\")\nquery.asDataFrame()`,\n }\n default:\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\nenum DownloadAction {\n downloadFile,\n addToCart,\n programmaticAccess,\n programmaticAccessDocker,\n exportTable,\n}\n\n// Function that creates menu items for download actions\nfunction getMenuItemForAction(\n entityId: string,\n entityName: string,\n entityType: EntityType,\n downloadAction: DownloadAction,\n setShowProgrammaticAccess: (show: boolean) => void,\n setShowExportMetadata: (show: boolean) => void,\n addFileToDownloadList: (params: {\n entityId: string\n entityVersionNumber: number | undefined\n }) => void,\n addQueryToDownloadList: (request: AddToDownloadListRequest) => void,\n versionNumber?: number,\n addToCartDisabled?: boolean,\n onDownloadFile?: () => void,\n isAuthenticated?: boolean,\n): DropdownMenuItem {\n switch (downloadAction) {\n case DownloadAction.downloadFile:\n return {\n text: 'Download File',\n onClick: () => {\n if (onDownloadFile) onDownloadFile()\n },\n tooltipText: isAuthenticated\n ? 'Download this file directly'\n : 'Sign in to download this file',\n disabled: !isAuthenticated,\n }\n case DownloadAction.addToCart:\n return {\n text: 'Add to Download Cart',\n disabled: addToCartDisabled,\n tooltipText: getAddToCartTooltip(entityType, !!addToCartDisabled),\n onClick: () => {\n if (\n entityType === EntityType.file ||\n entityType === EntityType.recordset\n ) {\n addFileToDownloadList({\n entityId,\n entityVersionNumber: versionNumber,\n })\n }\n // dataset\n else if (entityType === EntityType.dataset) {\n addQueryToDownloadList({\n parentId: entityId,\n useVersionNumber: true,\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n })\n }\n // entity view\n else if (entityType === EntityType.entityview) {\n addQueryToDownloadList({\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n query: {\n sql: `SELECT * FROM ${entityId}`,\n },\n })\n } else {\n addQueryToDownloadList({\n parentId: entityId,\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n recursive: isContainerType(entityType),\n })\n }\n },\n }\n case DownloadAction.programmaticAccess:\n return {\n text: 'Programmatic Access',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic access options',\n }\n case DownloadAction.programmaticAccessDocker:\n return {\n text: 'Programmatic Access (Docker)',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic options to pull Docker image',\n }\n case DownloadAction.exportTable:\n return {\n text: 'Export Table',\n onClick: () => {\n setShowExportMetadata(true)\n },\n tooltipText: 'Export table data',\n }\n }\n}\n\n/**\n * Determines the tooltip message based on the entity type and its \"add to cart\" status.\n */\nconst getAddToCartTooltip = (\n entityType: EntityType,\n isDisabled: boolean,\n): string => {\n if (!isDisabled) {\n return 'Add file(s) to your download cart'\n }\n const entityFriendlyName = entityTypeToFriendlyName(entityType)\n return `This ${entityFriendlyName} has no accessible files`\n}\n\n// Function that returns DropdownMenuItem\nexport function getDownloadActionsForEntityType(\n type: EntityType,\n): DownloadAction[][] {\n switch (type) {\n case EntityType.file:\n case EntityType.recordset:\n return [\n [DownloadAction.downloadFile],\n [DownloadAction.addToCart, DownloadAction.programmaticAccess],\n ]\n case EntityType.project:\n case EntityType.folder:\n return [[DownloadAction.addToCart, DownloadAction.programmaticAccess]]\n case EntityType.dockerrepo:\n return [[DownloadAction.programmaticAccessDocker]]\n case EntityType.entityview:\n case EntityType.dataset:\n return [\n [\n DownloadAction.exportTable,\n DownloadAction.programmaticAccess,\n DownloadAction.addToCart,\n ],\n ]\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n return [[DownloadAction.exportTable, DownloadAction.programmaticAccess]]\n case EntityType.link:\n return [[DownloadAction.programmaticAccess]]\n default:\n // this will fail if a new EntityType is added and not handled\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\n// get the appropriate version number for download based on entity type\n// for datasets: returns the most recent released version if any exist, undefined otherwise\n// for other entities: returns the current version number\nfunction useGetLatestVersionNumber(entityId: string, entityType: EntityType) {\n // get entity data\n const { data: entityData, isLoading: entityDataLoading } =\n useGetEntity(entityId) // No version = latest\n\n // for datasets, check if any versions exist and use the most recent one\n const mustGetVersion = entityType === EntityType.dataset\n const { data: versionsData, isLoading: versionsLoading } = useGetVersions(\n entityId,\n 0,\n 1,\n {\n enabled: mustGetVersion,\n },\n )\n\n let latestVersionNumber: number | undefined\n\n if (mustGetVersion) {\n // for datasets, check if any versions exist\n if (versionsData?.results && versionsData.results.length > 0) {\n // Use the most recent released version (first in the list, since versions are returned in descending order)\n latestVersionNumber = versionsData.results[0].versionNumber\n } else {\n // no versions exist, use undefined (will use current/draft version)\n latestVersionNumber = undefined\n }\n } else {\n // for non-datasets, use the entity's version number\n latestVersionNumber =\n entityData && isVersionableEntity(entityData)\n ? entityData.versionNumber\n : undefined\n }\n\n const isLoading = entityDataLoading || versionsLoading\n\n return { latestVersionNumber, isLoading }\n}\n\n// create default queryBundleRequest with appropriate SQL\nfunction getDefaultQueryBundleRequestForEntity(\n entityId: string,\n versionNumber: number | undefined,\n entityType: EntityType,\n): QueryBundleRequest {\n let sql: string\n\n if (entityType === EntityType.dataset) {\n // for datasets:\n // - if a version number exists (released version), use it: syn123.5\n // - if no version number (no released versions), use current/draft: syn123\n sql = versionNumber\n ? `SELECT * FROM ${entityId}.${versionNumber}`\n : `SELECT * FROM ${entityId}`\n } else {\n // For non-datasets, always use entity ID without version\n sql = `SELECT * FROM ${entityId}`\n }\n\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: `${entityId}`,\n query: {\n sql: sql,\n },\n partMask: 0,\n }\n}\n\nexport function EntityDownloadButton(props: {\n entityId: string\n name: string\n entityType: EntityType\n}) {\n // get the appropriate version number for the entity\n const { latestVersionNumber } = useGetLatestVersionNumber(\n props.entityId,\n props.entityType,\n )\n // create queryBundleRequest with appropriate SQL based on entity type and version\n const defaultQueryBundleRequest = getDefaultQueryBundleRequestForEntity(\n props.entityId,\n latestVersionNumber,\n props.entityType,\n )\n\n // Get context and download functionality\n const { downloadCartPageUrl, isAuthenticated } = useSynapseContext()\n const { mutate: addFileToDownloadList } = useAddFileToDownloadList({\n onSuccess: data => {\n if (data.numberOfFilesAdded > 0) {\n displayFilesWereAddedToDownloadListSuccess(downloadCartPageUrl)\n } else {\n displayToast('0 Files added to your Download Cart', 'info')\n }\n },\n onError: error => {\n displayToast(error.reason, 'danger')\n },\n })\n\n const { mutate: addQueryToDownloadList } = useAddToDownloadList({\n onSuccess: data => {\n if (data.numberOfFilesAdded != null && data.numberOfFilesAdded > 0) {\n displayFilesWereAddedToDownloadListSuccess(downloadCartPageUrl)\n } else {\n displayToast('0 Files added to your Download Cart', 'info')\n }\n },\n onError: error => {\n displayToast(error.reason, 'danger')\n },\n })\n\n // state to manage programmatic access modal visibility\n const [showProgrammaticAccess, setShowProgrammaticAccess] =\n useState<boolean>(false)\n\n const handleCloseProgrammaticAccess = () => {\n setShowProgrammaticAccess(false)\n }\n\n const isFolderOrProject = isContainerType(props.entityType)\n\n const {\n data: folderOrProjectStats,\n isLoading: isLoadingFolderOrProjectStats,\n } = useGetAddToDownloadListStats(\n {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListStatsRequest',\n request: {\n parentId: props.entityId,\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n recursive: true,\n },\n },\n {\n enabled: isFolderOrProject,\n },\n )\n\n const folderOrProjectHasNoFiles =\n isFolderOrProject &&\n (isLoadingFolderOrProjectStats || folderOrProjectStats?.fileCount === 0)\n\n const { data: entityData } = useGetEntity(props.entityId)\n\n const { downloadFile } = useDirectDownloadHandler()\n\n const fileHandleId =\n entityData && isFileEntity(entityData)\n ? entityData.dataFileHandleId\n : undefined\n\n const onDownloadFile = fileHandleId\n ? () => {\n void downloadFile({\n fileHandleId,\n associatedObjectId: props.entityId,\n associatedObjectType: FileHandleAssociateType.FileEntity,\n })\n }\n : undefined\n\n const entityViewHasNoFiles =\n entityData && isEntityView(entityData) && !hasFilesInView(entityData)\n\n const datasetHasNoFiles =\n entityData &&\n isDataset(entityData) &&\n (!entityData.items || entityData.items.length === 0)\n\n const addToCartDisabled =\n folderOrProjectHasNoFiles || entityViewHasNoFiles || datasetHasNoFiles\n\n // state to manage export metadata modal visibility\n const [showExportMetadata, setShowExportMetadata] = useState<boolean>(false)\n\n const handleCloseExportMetadata = () => {\n setShowExportMetadata(false)\n }\n\n // Create download menu items\n const downloadActions = getDownloadActionsForEntityType(props.entityType)\n const downloadMenuItems = downloadActions.map(actionGroup =>\n actionGroup.map(action =>\n getMenuItemForAction(\n props.entityId,\n props.name,\n props.entityType,\n action,\n setShowProgrammaticAccess,\n setShowExportMetadata,\n addFileToDownloadList,\n addQueryToDownloadList,\n latestVersionNumber,\n addToCartDisabled,\n onDownloadFile,\n isAuthenticated,\n ),\n ),\n )\n\n // Return programmatic access modal content\n const { cliCode, rCode, pythonCode } = getProgrammaticAccessCode(\n props.entityType,\n props.entityId,\n latestVersionNumber,\n )\n\n return (\n <>\n <DropdownMenu\n items={downloadMenuItems}\n dropdownButtonText=\"Download\"\n buttonTooltip=\"Download options for this entity\"\n buttonProps={{\n variant: 'outlined',\n startIcon: <DownloadIcon />,\n }}\n />\n <ProgrammaticInstructionsModal\n show={showProgrammaticAccess}\n title={`Programmatic Access: ${props.name}`}\n onClose={handleCloseProgrammaticAccess}\n pythonCode={pythonCode}\n rCode={rCode}\n cliCode={cliCode}\n helpUrl=\"https://help.synapse.org/docs/Synapse-Docker-Registry.2011037752.html#SynapseDockerRegistry-UsingDockerImagesStoredintheSynapseDockerRegistry\"\n />\n {showExportMetadata && (\n <ModalDownload\n queryBundleRequest={defaultQueryBundleRequest}\n onClose={handleCloseExportMetadata}\n />\n )}\n </>\n )\n}\n"],"names":["PYTHON_CLIENT_IMPORT_AND_LOGIN","R_CLIENT_IMPORT_AND_LOGIN","getProgrammaticAccessCode","type","entityId","version","id","EntityType","getMenuItemForAction","entityName","entityType","downloadAction","setShowProgrammaticAccess","setShowExportMetadata","addFileToDownloadList","addQueryToDownloadList","versionNumber","addToCartDisabled","onDownloadFile","isAuthenticated","getAddToCartTooltip","isContainerType","isDisabled","entityTypeToFriendlyName","getDownloadActionsForEntityType","useGetLatestVersionNumber","entityData","entityDataLoading","useGetEntity","mustGetVersion","versionsData","versionsLoading","useGetVersions","latestVersionNumber","isVersionableEntity","getDefaultQueryBundleRequestForEntity","sql","EntityDownloadButton","props","defaultQueryBundleRequest","downloadCartPageUrl","useSynapseContext","useAddFileToDownloadList","data","displayFilesWereAddedToDownloadListSuccess","displayToast","error","useAddToDownloadList","showProgrammaticAccess","useState","handleCloseProgrammaticAccess","isFolderOrProject","folderOrProjectStats","isLoadingFolderOrProjectStats","useGetAddToDownloadListStats","folderOrProjectHasNoFiles","downloadFile","useDirectDownloadHandler","fileHandleId","isFileEntity","FileHandleAssociateType","entityViewHasNoFiles","isEntityView","hasFilesInView","datasetHasNoFiles","isDataset","showExportMetadata","handleCloseExportMetadata","downloadMenuItems","actionGroup","action","cliCode","rCode","pythonCode","jsxs","Fragment","jsx","DropdownMenu","DownloadIcon","ProgrammaticInstructionsModal","ModalDownload"],"mappings":"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"}
1
+ {"version":3,"file":"EntityDownloadButton.js","sources":["../../../src/components/EntityDownloadButton/EntityDownloadButton.tsx"],"sourcesContent":["import { useGetEntity, useGetVersions } from '@/synapse-queries'\nimport {\n useAddFileToDownloadList,\n useGetAddToDownloadListStats,\n} from '@/synapse-queries/index'\nimport { useSynapseContext } from '@/utils'\nimport {\n entityTypeToFriendlyName,\n hasFilesInView,\n isContainerType,\n isDataset,\n isEntityView,\n isVersionableEntity,\n} from '@/utils/functions/EntityTypeUtils'\nimport { useDirectDownloadHandler } from '@/utils/hooks/useDirectDownloadHandler'\nimport { isFileEntity } from '@/utils/types/IsType'\nimport { DownloadOutlined as DownloadIcon } from '@mui/icons-material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n FileHandleAssociateType,\n QueryBundleRequest,\n} from '@sage-bionetworks/synapse-types'\nimport { RefObject, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { displayFilesWereAddedToDownloadListSuccess } from '../download_list/DownloadConfirmationUtils'\nimport { EntityDownloadConfirmation } from '../EntityDownloadConfirmation'\nimport { DropdownMenu, DropdownMenuItem } from '../menu/DropdownMenu'\nimport { ModalDownload } from '../ModalDownload/ModalDownload'\nimport { ProgrammaticInstructionsModal } from '../ProgrammaticInstructionsModal/ProgrammaticInstructionsModal'\nimport { displayToast } from '../ToastMessage/index'\n\n// WIP\n// Per Nick Grosenbacher: For this to be reusable, I think we would also need to accept versionNumber as a prop. Where we would have the following behavior:\n// - If the version number is present, use it\n// - If the version number is null, do not use it,\n// - If the version number is undefined, then we would try to do the 'smart' thing-- get the latest version for datasets, otherwise don't use it.\n\n// Have to keep these consts outside of getProgrammaticAccessCode because\n// they are being called in ProgrammaticTableDownload.tsx\n// Python client import and login instructions\nexport const PYTHON_CLIENT_IMPORT_AND_LOGIN = `import synapseclient\nsyn = synapseclient.Synapse()\nsyn.login(authToken=\"YOUR_TOKEN_HERE\")`\n\n// R client import and login instructions\nexport const R_CLIENT_IMPORT_AND_LOGIN = `library(synapser)\nsynLogin(authToken=\"YOUR_TOKEN_HERE\")`\n\ntype ProgrammaticAccessCode = {\n cliCode: string | undefined\n rCode: string | undefined\n pythonCode: string | undefined\n}\n\n// Generate programmatic access code snippet content based on entity type\nfunction getProgrammaticAccessCode(\n type: EntityType,\n entityId: string,\n version: number | undefined,\n): ProgrammaticAccessCode {\n const id =\n type === EntityType.dataset && version ? `${entityId}.${version}` : entityId\n switch (type) {\n case EntityType.file:\n case EntityType.folder:\n case EntityType.project:\n case EntityType.link:\n return {\n cliCode: `synapse get -r ${entityId}`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsynGet('${entityId}')`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsyn.get('${entityId}')`,\n }\n case EntityType.dockerrepo:\n return {\n cliCode: `docker login -u <synapse username> -p <synapse password> docker.synapse.org \\n\ndocker pull docker.synapse.org/${entityId}/myrepo`,\n rCode: undefined,\n pythonCode: undefined,\n }\n case EntityType.dataset:\n case EntityType.entityview:\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n case EntityType.recordset:\n return {\n cliCode: `synapse get -q \"SELECT * FROM ${id}\"`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\nquery <- synTableQuery(\"SELECT * FROM ${id}\")\nread.table(query$filepath, sep=\",\")`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\nquery = syn.tableQuery(\"SELECT * FROM ${id}\")\nquery.asDataFrame()`,\n }\n default:\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\nenum DownloadAction {\n downloadFile,\n addToCart,\n programmaticAccess,\n programmaticAccessDocker,\n exportTable,\n}\n\n// Function that creates menu items for download actions\nfunction getMenuItemForAction(\n entityId: string,\n entityName: string,\n entityType: EntityType,\n downloadAction: DownloadAction,\n setShowProgrammaticAccess: (show: boolean) => void,\n setShowExportMetadata: (show: boolean) => void,\n addFileToDownloadList: (params: {\n entityId: string\n entityVersionNumber: number | undefined\n }) => void,\n setShowDownloadConfirmation: (show: boolean) => void,\n versionNumber?: number,\n addToCartDisabled?: boolean,\n onDownloadFile?: () => void,\n isAuthenticated?: boolean,\n): DropdownMenuItem {\n switch (downloadAction) {\n case DownloadAction.downloadFile:\n return {\n text: 'Download File',\n onClick: () => {\n if (onDownloadFile) onDownloadFile()\n },\n tooltipText: isAuthenticated\n ? 'Download this file directly'\n : 'Sign in to download this file',\n disabled: !isAuthenticated,\n }\n case DownloadAction.addToCart:\n return {\n text: 'Add to Download Cart',\n disabled: addToCartDisabled,\n tooltipText: getAddToCartTooltip(entityType, !!addToCartDisabled),\n onClick: () => {\n if (\n entityType === EntityType.file ||\n entityType === EntityType.recordset\n ) {\n addFileToDownloadList({\n entityId,\n entityVersionNumber: versionNumber,\n })\n } else {\n setShowDownloadConfirmation(true)\n }\n },\n }\n case DownloadAction.programmaticAccess:\n return {\n text: 'Programmatic Access',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic access options',\n }\n case DownloadAction.programmaticAccessDocker:\n return {\n text: 'Programmatic Access (Docker)',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic options to pull Docker image',\n }\n case DownloadAction.exportTable:\n return {\n text: 'Export Table',\n onClick: () => {\n setShowExportMetadata(true)\n },\n tooltipText: 'Export table data',\n }\n }\n}\n\n/**\n * Determines the tooltip message based on the entity type and its \"add to cart\" status.\n */\nconst getAddToCartTooltip = (\n entityType: EntityType,\n isDisabled: boolean,\n): string => {\n if (!isDisabled) {\n return 'Add file(s) to your download cart'\n }\n const entityFriendlyName = entityTypeToFriendlyName(entityType)\n return `This ${entityFriendlyName} has no accessible files`\n}\n\n// Function that returns DropdownMenuItem\nexport function getDownloadActionsForEntityType(\n type: EntityType,\n): DownloadAction[][] {\n switch (type) {\n case EntityType.file:\n case EntityType.recordset:\n return [\n [DownloadAction.downloadFile],\n [DownloadAction.addToCart, DownloadAction.programmaticAccess],\n ]\n case EntityType.project:\n case EntityType.folder:\n return [[DownloadAction.addToCart, DownloadAction.programmaticAccess]]\n case EntityType.dockerrepo:\n return [[DownloadAction.programmaticAccessDocker]]\n case EntityType.entityview:\n case EntityType.dataset:\n return [\n [\n DownloadAction.exportTable,\n DownloadAction.programmaticAccess,\n DownloadAction.addToCart,\n ],\n ]\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n return [[DownloadAction.exportTable, DownloadAction.programmaticAccess]]\n case EntityType.link:\n return [[DownloadAction.programmaticAccess]]\n default:\n // this will fail if a new EntityType is added and not handled\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\n// get the appropriate version number for download based on entity type\n// for datasets: returns the most recent released version if any exist, undefined otherwise\n// for other entities: returns the current version number\nfunction useGetLatestVersionNumber(entityId: string, entityType: EntityType) {\n // get entity data\n const { data: entityData, isLoading: entityDataLoading } =\n useGetEntity(entityId) // No version = latest\n\n // for datasets, check if any versions exist and use the most recent one\n const mustGetVersion = entityType === EntityType.dataset\n const { data: versionsData, isLoading: versionsLoading } = useGetVersions(\n entityId,\n 0,\n 1,\n {\n enabled: mustGetVersion,\n },\n )\n\n let latestVersionNumber: number | undefined\n\n if (mustGetVersion) {\n // for datasets, check if any versions exist\n if (versionsData?.results && versionsData.results.length > 0) {\n // Use the most recent released version (first in the list, since versions are returned in descending order)\n latestVersionNumber = versionsData.results[0].versionNumber\n } else {\n // no versions exist, use undefined (will use current/draft version)\n latestVersionNumber = undefined\n }\n } else {\n // for non-datasets, use the entity's version number\n latestVersionNumber =\n entityData && isVersionableEntity(entityData)\n ? entityData.versionNumber\n : undefined\n }\n\n const isLoading = entityDataLoading || versionsLoading\n\n return { latestVersionNumber, isLoading }\n}\n\n// create default queryBundleRequest with appropriate SQL\nfunction getDefaultQueryBundleRequestForEntity(\n entityId: string,\n versionNumber: number | undefined,\n entityType: EntityType,\n): QueryBundleRequest {\n let sql: string\n\n if (entityType === EntityType.dataset) {\n // for datasets:\n // - if a version number exists (released version), use it: syn123.5\n // - if no version number (no released versions), use current/draft: syn123\n sql = versionNumber\n ? `SELECT * FROM ${entityId}.${versionNumber}`\n : `SELECT * FROM ${entityId}`\n } else {\n // For non-datasets, always use entity ID without version\n sql = `SELECT * FROM ${entityId}`\n }\n\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: `${entityId}`,\n query: {\n sql: sql,\n },\n partMask: 0,\n }\n}\n\nexport function EntityDownloadButton(props: {\n entityId: string\n name: string\n entityType: EntityType\n downloadConfirmationContainer?: RefObject<HTMLElement | null>\n disabled?: boolean\n}) {\n // get the appropriate version number for the entity\n const { latestVersionNumber } = useGetLatestVersionNumber(\n props.entityId,\n props.entityType,\n )\n // create queryBundleRequest with appropriate SQL based on entity type and version\n const defaultQueryBundleRequest = getDefaultQueryBundleRequestForEntity(\n props.entityId,\n latestVersionNumber,\n props.entityType,\n )\n\n // Get context and download functionality\n const { downloadCartPageUrl, isAuthenticated } = useSynapseContext()\n const { mutate: addFileToDownloadList } = useAddFileToDownloadList({\n onSuccess: data => {\n if (data.numberOfFilesAdded > 0) {\n displayFilesWereAddedToDownloadListSuccess(downloadCartPageUrl)\n } else {\n displayToast('0 Files added to your Download Cart', 'info')\n }\n },\n onError: error => {\n displayToast(error.reason, 'danger')\n },\n })\n\n // state to manage programmatic access modal visibility\n const [showProgrammaticAccess, setShowProgrammaticAccess] =\n useState<boolean>(false)\n\n // state to manage download confirmation visibility and loading\n const [showDownloadConfirmation, setShowDownloadConfirmation] =\n useState<boolean>(false)\n const [downloadConfirmationLoading, setDownloadConfirmationLoading] =\n useState<boolean>(false)\n\n const handleCloseProgrammaticAccess = () => {\n setShowProgrammaticAccess(false)\n }\n\n const isFolderOrProject = isContainerType(props.entityType)\n\n const {\n data: folderOrProjectStats,\n isLoading: isLoadingFolderOrProjectStats,\n } = useGetAddToDownloadListStats(\n {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListStatsRequest',\n request: {\n parentId: props.entityId,\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n recursive: true,\n },\n },\n {\n enabled: isFolderOrProject,\n },\n )\n\n const folderOrProjectHasNoFiles =\n isFolderOrProject &&\n (isLoadingFolderOrProjectStats || folderOrProjectStats?.fileCount === 0)\n\n const { data: entityData } = useGetEntity(props.entityId)\n\n const { downloadFile } = useDirectDownloadHandler()\n\n const fileHandleId =\n entityData && isFileEntity(entityData)\n ? entityData.dataFileHandleId\n : undefined\n\n const onDownloadFile = fileHandleId\n ? () => {\n void downloadFile({\n fileHandleId,\n associatedObjectId: props.entityId,\n associatedObjectType: FileHandleAssociateType.FileEntity,\n })\n }\n : undefined\n\n const entityViewHasNoFiles =\n entityData && isEntityView(entityData) && !hasFilesInView(entityData)\n\n const datasetHasNoFiles =\n entityData &&\n isDataset(entityData) &&\n (!entityData.items || entityData.items.length === 0)\n\n const addToCartDisabled =\n folderOrProjectHasNoFiles || entityViewHasNoFiles || datasetHasNoFiles\n\n // state to manage export metadata modal visibility\n const [showExportMetadata, setShowExportMetadata] = useState<boolean>(false)\n\n const handleCloseExportMetadata = () => {\n setShowExportMetadata(false)\n }\n\n // Create download menu items\n const downloadActions = getDownloadActionsForEntityType(props.entityType)\n const downloadMenuItems = downloadActions.map(actionGroup =>\n actionGroup.map(action =>\n getMenuItemForAction(\n props.entityId,\n props.name,\n props.entityType,\n action,\n setShowProgrammaticAccess,\n setShowExportMetadata,\n addFileToDownloadList,\n setShowDownloadConfirmation,\n latestVersionNumber,\n addToCartDisabled,\n onDownloadFile,\n isAuthenticated,\n ),\n ),\n )\n\n // Return programmatic access modal content\n const { cliCode, rCode, pythonCode } = getProgrammaticAccessCode(\n props.entityType,\n props.entityId,\n latestVersionNumber,\n )\n\n const downloadConfirmation = showDownloadConfirmation ? (\n <EntityDownloadConfirmation\n entityId={props.entityId}\n handleClose={() => setShowDownloadConfirmation(false)}\n onIsLoadingChange={setDownloadConfirmationLoading}\n />\n ) : null\n\n return (\n <>\n <DropdownMenu\n items={downloadMenuItems}\n dropdownButtonText=\"Download\"\n buttonTooltip=\"Download options for this entity\"\n buttonProps={{\n variant: 'outlined',\n startIcon: <DownloadIcon />,\n disabled: props.disabled || downloadConfirmationLoading,\n }}\n />\n {downloadConfirmation &&\n (props.downloadConfirmationContainer?.current\n ? createPortal(\n downloadConfirmation,\n props.downloadConfirmationContainer.current,\n )\n : downloadConfirmation)}\n <ProgrammaticInstructionsModal\n show={showProgrammaticAccess}\n title={`Programmatic Access: ${props.name}`}\n onClose={handleCloseProgrammaticAccess}\n pythonCode={pythonCode}\n rCode={rCode}\n cliCode={cliCode}\n helpUrl=\"https://help.synapse.org/docs/Synapse-Docker-Registry.2011037752.html#SynapseDockerRegistry-UsingDockerImagesStoredintheSynapseDockerRegistry\"\n />\n {showExportMetadata && (\n <ModalDownload\n queryBundleRequest={defaultQueryBundleRequest}\n onClose={handleCloseExportMetadata}\n />\n )}\n </>\n )\n}\n"],"names":["PYTHON_CLIENT_IMPORT_AND_LOGIN","R_CLIENT_IMPORT_AND_LOGIN","getProgrammaticAccessCode","type","entityId","version","id","EntityType","getMenuItemForAction","entityName","entityType","downloadAction","setShowProgrammaticAccess","setShowExportMetadata","addFileToDownloadList","setShowDownloadConfirmation","versionNumber","addToCartDisabled","onDownloadFile","isAuthenticated","getAddToCartTooltip","isDisabled","entityTypeToFriendlyName","getDownloadActionsForEntityType","useGetLatestVersionNumber","entityData","entityDataLoading","useGetEntity","mustGetVersion","versionsData","versionsLoading","useGetVersions","latestVersionNumber","isVersionableEntity","getDefaultQueryBundleRequestForEntity","sql","EntityDownloadButton","props","defaultQueryBundleRequest","downloadCartPageUrl","useSynapseContext","useAddFileToDownloadList","data","displayFilesWereAddedToDownloadListSuccess","displayToast","error","showProgrammaticAccess","useState","showDownloadConfirmation","downloadConfirmationLoading","setDownloadConfirmationLoading","handleCloseProgrammaticAccess","isFolderOrProject","isContainerType","folderOrProjectStats","isLoadingFolderOrProjectStats","useGetAddToDownloadListStats","folderOrProjectHasNoFiles","downloadFile","useDirectDownloadHandler","fileHandleId","isFileEntity","FileHandleAssociateType","entityViewHasNoFiles","isEntityView","hasFilesInView","datasetHasNoFiles","isDataset","showExportMetadata","handleCloseExportMetadata","downloadMenuItems","actionGroup","action","cliCode","rCode","pythonCode","downloadConfirmation","jsx","EntityDownloadConfirmation","jsxs","Fragment","DropdownMenu","DownloadIcon","createPortal","ProgrammaticInstructionsModal","ModalDownload"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseHomepageChatSearch.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseHomepageV2/SynapseHomepageChatSearch.tsx"],"names":[],"mappings":"AAgBA,MAAM,MAAM,8BAA8B,GAAG;IAC3C,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC,CAAA;AAMD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,SAAS,GACV,EAAE,8BAA8B,2CA6FhC"}
1
+ {"version":3,"file":"SynapseHomepageChatSearch.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseHomepageV2/SynapseHomepageChatSearch.tsx"],"names":[],"mappings":"AAcA,MAAM,MAAM,8BAA8B,GAAG;IAC3C,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC,CAAA;AAMD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,SAAS,GACV,EAAE,8BAA8B,2CAsFhC"}