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.
- package/dist/SWC.index.js +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts +3 -0
- package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +112 -118
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js +30 -32
- package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js +27 -30
- package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseSearchChips.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseSearchChips.js +14 -17
- package/dist/components/SynapseHomepageV2/SynapseSearchChips.js.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +90 -91
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.d.ts.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js +66 -64
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -4
package/dist/SWC.index.js
CHANGED
|
@@ -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":"
|
|
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 {
|
|
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
|
|
7
|
-
import { isContainerType as
|
|
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
|
|
14
|
-
import { useSynapseContext as
|
|
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
|
|
31
|
-
import { useAddFileToDownloadList as
|
|
32
|
-
import { useGetEntity as
|
|
33
|
-
import { useDirectDownloadHandler as
|
|
34
|
-
import { DownloadOutlined as
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
|
|
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
|
|
45
|
-
const
|
|
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: `${
|
|
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 ${
|
|
81
|
+
cliCode: `synapse get -q "SELECT * FROM ${i}"`,
|
|
80
82
|
rCode: `${b}
|
|
81
83
|
|
|
82
|
-
query <- synTableQuery("SELECT * FROM ${
|
|
84
|
+
query <- synTableQuery("SELECT * FROM ${i}")
|
|
83
85
|
read.table(query$filepath, sep=",")`,
|
|
84
|
-
pythonCode: `${
|
|
86
|
+
pythonCode: `${h}
|
|
85
87
|
|
|
86
|
-
query = syn.tableQuery("SELECT * FROM ${
|
|
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
|
|
94
|
-
switch (
|
|
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
|
-
|
|
101
|
+
p && p();
|
|
100
102
|
},
|
|
101
|
-
tooltipText:
|
|
102
|
-
disabled: !
|
|
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:
|
|
108
|
-
tooltipText:
|
|
109
|
+
disabled: c,
|
|
110
|
+
tooltipText: me(n, !!c),
|
|
109
111
|
onClick: () => {
|
|
110
|
-
|
|
112
|
+
n === t.file || n === t.recordset ? l({
|
|
111
113
|
entityId: e,
|
|
112
|
-
entityVersionNumber:
|
|
113
|
-
}) :
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
138
|
+
d(!0);
|
|
150
139
|
},
|
|
151
140
|
tooltipText: "Export table data"
|
|
152
141
|
};
|
|
153
142
|
}
|
|
154
143
|
}
|
|
155
|
-
const
|
|
156
|
-
function
|
|
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
|
|
213
|
-
const { data:
|
|
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:
|
|
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
|
|
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:
|
|
219
|
+
sql: i
|
|
231
220
|
},
|
|
232
221
|
partMask: 0
|
|
233
222
|
};
|
|
234
223
|
}
|
|
235
|
-
function
|
|
236
|
-
const { latestVersionNumber: o } =
|
|
224
|
+
function nt(e) {
|
|
225
|
+
const { latestVersionNumber: o } = ye(
|
|
237
226
|
e.entityId,
|
|
238
227
|
e.entityType
|
|
239
|
-
),
|
|
228
|
+
), n = pe(
|
|
240
229
|
e.entityId,
|
|
241
230
|
o,
|
|
242
231
|
e.entityType
|
|
243
|
-
), { downloadCartPageUrl:
|
|
244
|
-
onSuccess: (
|
|
245
|
-
|
|
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: (
|
|
255
|
-
|
|
236
|
+
onError: (m) => {
|
|
237
|
+
E(m.reason, "danger");
|
|
256
238
|
}
|
|
257
|
-
}), [
|
|
258
|
-
|
|
259
|
-
},
|
|
260
|
-
data:
|
|
261
|
-
isLoading:
|
|
262
|
-
} =
|
|
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:
|
|
254
|
+
enabled: T
|
|
273
255
|
}
|
|
274
|
-
),
|
|
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:
|
|
258
|
+
fileHandleId: C,
|
|
277
259
|
associatedObjectId: e.entityId,
|
|
278
|
-
associatedObjectType:
|
|
260
|
+
associatedObjectType: G.FileEntity
|
|
279
261
|
});
|
|
280
|
-
} : void 0,
|
|
281
|
-
|
|
282
|
-
},
|
|
283
|
-
(
|
|
284
|
-
(
|
|
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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
270
|
+
_,
|
|
271
|
+
r,
|
|
272
|
+
D,
|
|
273
|
+
d,
|
|
292
274
|
c,
|
|
293
275
|
o,
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
276
|
+
x,
|
|
277
|
+
R,
|
|
278
|
+
s
|
|
297
279
|
)
|
|
298
280
|
)
|
|
299
|
-
), { cliCode:
|
|
281
|
+
), { cliCode: P, rCode: q, pythonCode: V } = le(
|
|
300
282
|
e.entityType,
|
|
301
283
|
e.entityId,
|
|
302
284
|
o
|
|
303
|
-
)
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
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:
|
|
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__ */
|
|
302
|
+
startIcon: /* @__PURE__ */ u(oe, {}),
|
|
303
|
+
disabled: e.disabled || p
|
|
314
304
|
}
|
|
315
305
|
}
|
|
316
306
|
),
|
|
317
|
-
|
|
318
|
-
|
|
307
|
+
g && (e.downloadConfirmationContainer?.current ? ne(
|
|
308
|
+
g,
|
|
309
|
+
e.downloadConfirmationContainer.current
|
|
310
|
+
) : g),
|
|
311
|
+
/* @__PURE__ */ u(
|
|
312
|
+
de,
|
|
319
313
|
{
|
|
320
|
-
show:
|
|
314
|
+
show: l,
|
|
321
315
|
title: `Programmatic Access: ${e.name}`,
|
|
322
|
-
onClose:
|
|
323
|
-
pythonCode:
|
|
324
|
-
rCode:
|
|
325
|
-
cliCode:
|
|
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
|
-
|
|
330
|
-
|
|
323
|
+
v && /* @__PURE__ */ u(
|
|
324
|
+
se,
|
|
331
325
|
{
|
|
332
|
-
queryBundleRequest:
|
|
333
|
-
onClose:
|
|
326
|
+
queryBundleRequest: n,
|
|
327
|
+
onClose: I
|
|
334
328
|
}
|
|
335
329
|
)
|
|
336
330
|
] });
|
|
337
331
|
}
|
|
338
332
|
export {
|
|
339
|
-
|
|
340
|
-
|
|
333
|
+
nt as EntityDownloadButton,
|
|
334
|
+
h as PYTHON_CLIENT_IMPORT_AND_LOGIN,
|
|
341
335
|
b as R_CLIENT_IMPORT_AND_LOGIN,
|
|
342
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCO,MAAMA,IAAiC;AAAA;AAAA,yCAKjCC,IAA4B;AAAA;AAUzC,SAASC,GACPC,GACAC,GACAC,GACwB;AACxB,QAAMC,IACJH,MAASI,EAAW,WAAWF,IAAU,GAAGD,CAAQ,IAAIC,CAAO,KAAKD;AACtE,UAAQD,GAAA;AAAA,IACN,KAAKI,EAAW;AAAA,IAChB,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AACd,aAAO;AAAA,QACL,SAAS,kBAAkBH,CAAQ;AAAA,QACnC,OAAO,GAAGH,CAAyB;AAAA;AAAA;AAAA,UAEjCG,CAAQ;AAAA,QACV,YAAY,GAAGJ,CAA8B;AAAA;AAAA;AAAA,WAE1CI,CAAQ;AAAA,MAAA;AAAA,IAEf,KAAKG,EAAW;AACd,aAAO;AAAA,QACL,SAAS;AAAA;AAAA,iCACgBH,CAAQ;AAAA,QACjC,OAAO;AAAA,QACP,YAAY;AAAA,MAAA;AAAA,IAEhB,KAAKG,EAAW;AAAA,IAChB,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AACd,aAAO;AAAA,QACL,SAAS,iCAAiCD,CAAE;AAAA,QAC5C,OAAO,GAAGL,CAAyB;AAAA;AAAA,wCACHK,CAAE;AAAA;AAAA,QAElC,YAAY,GAAGN,CAA8B;AAAA;AAAA,wCACbM,CAAE;AAAA;AAAA,MAAA;AAAA,IAGtC;AACE,YAAM,IAAI,MAAM,yBAAyBH,CAAI,EAAE;AAAA,EAAA;AAErD;AAWA,SAASK,GACPJ,GACAK,GACAC,GACAC,GACAC,GACAC,GACAC,GAIAC,GACAC,GACAC,GACAC,GACAC,GACkB;AAClB,UAAQR,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM;AACb,UAAIO,KAAgBA,EAAA;AAAA,QACtB;AAAA,QACA,aAAaC,IACT,gCACA;AAAA,QACJ,UAAU,CAACA;AAAA,MAAA;AAAA,IAEf,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAUF;AAAA,QACV,aAAaG,GAAoBV,GAAY,CAAC,CAACO,CAAiB;AAAA,QAChE,SAAS,MAAM;AACb,UACEP,MAAeH,EAAW,QAC1BG,MAAeH,EAAW,YAE1BO,EAAsB;AAAA,YACpB,UAAAV;AAAA,YACA,qBAAqBY;AAAA,UAAA,CACtB,IAEDD,EAA4B,EAAI;AAAA,QAEpC;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM;AACb,UAAAH,EAA0B,EAAI;AAAA,QAChC;AAAA,QACA,aAAa;AAAA,MAAA;AAAA,IAEjB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM;AACb,UAAAA,EAA0B,EAAI;AAAA,QAChC;AAAA,QACA,aAAa;AAAA,MAAA;AAAA,IAEjB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM;AACb,UAAAC,EAAsB,EAAI;AAAA,QAC5B;AAAA,QACA,aAAa;AAAA,MAAA;AAAA,EACf;AAEN;AAKA,MAAMO,KAAsB,CAC1BV,GACAW,MAEKA,IAIE,QADoBC,EAAyBZ,CAAU,CAC7B,6BAHxB;AAOJ,SAASa,GACdpB,GACoB;AACpB,UAAQA,GAAA;AAAA,IACN,KAAKI,EAAW;AAAA,IAChB,KAAKA,EAAW;AACd,aAAO;AAAA,QACL;AAAA,UAAC;AAAA;AAAA,QAAA;AAAA,QACD;AAAA,UAAC;AAAA,UAA0B;AAAA;AAAA,QAAA;AAAA,MAAiC;AAAA,IAEhE,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AACd,aAAO,CAAC;AAAA,QAAC;AAAA,QAA0B;AAAA;AAAA,OAAkC;AAAA,IACvE,KAAKA,EAAW;AACd,aAAO,CAAC;AAAA,QAAC;AAAA;AAAA,OAAwC;AAAA,IACnD,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AACd,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAEJ,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AAAA,IAChB,KAAKA,EAAW;AACd,aAAO,CAAC;AAAA,QAAC;AAAA,QAA4B;AAAA;AAAA,OAAkC;AAAA,IACzE,KAAKA,EAAW;AACd,aAAO,CAAC;AAAA,QAAC;AAAA;AAAA,OAAkC;AAAA,IAC7C;AAEE,YAAM,IAAI,MAAM,yBAAyBJ,CAAI,EAAE;AAAA,EAAA;AAErD;AAKA,SAASqB,GAA0BpB,GAAkBM,GAAwB;AAE3E,QAAM,EAAE,MAAMe,GAAY,WAAWC,EAAA,IACnCC,EAAavB,CAAQ,GAGjBwB,IAAiBlB,MAAeH,EAAW,SAC3C,EAAE,MAAMsB,GAAc,WAAWC,MAAoBC;AAAA,IACzD3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAASwB;AAAA,IAAA;AAAA,EACX;AAGF,MAAII;AAEJ,SAAIJ,IAEEC,GAAc,WAAWA,EAAa,QAAQ,SAAS,IAEzDG,IAAsBH,EAAa,QAAQ,CAAC,EAAE,gBAG9CG,IAAsB,SAIxBA,IACEP,KAAcQ,EAAoBR,CAAU,IACxCA,EAAW,gBACX,QAKD,EAAE,qBAAAO,GAAqB,WAFZN,KAAqBI,EAET;AAChC;AAGA,SAASI,GACP9B,GACAY,GACAN,GACoB;AACpB,MAAIyB;AAEJ,SAAIzB,MAAeH,EAAW,UAI5B4B,IAAMnB,IACF,iBAAiBZ,CAAQ,IAAIY,CAAa,KAC1C,iBAAiBZ,CAAQ,KAG7B+B,IAAM,iBAAiB/B,CAAQ,IAG1B;AAAA,IACL,cAAc;AAAA,IACd,UAAU,GAAGA,CAAQ;AAAA,IACrB,OAAO;AAAA,MACL,KAAA+B;AAAA,IAAA;AAAA,IAEF,UAAU;AAAA,EAAA;AAEd;AAEO,SAASC,GAAqBC,GAMlC;AAED,QAAM,EAAE,qBAAAL,MAAwBR;AAAA,IAC9Ba,EAAM;AAAA,IACNA,EAAM;AAAA,EAAA,GAGFC,IAA4BJ;AAAA,IAChCG,EAAM;AAAA,IACNL;AAAA,IACAK,EAAM;AAAA,EAAA,GAIF,EAAE,qBAAAE,GAAqB,iBAAApB,EAAA,IAAoBqB,EAAA,GAC3C,EAAE,QAAQ1B,EAAA,IAA0B2B,EAAyB;AAAA,IACjE,WAAW,CAAAC,MAAQ;AACjB,MAAIA,EAAK,qBAAqB,IAC5BC,GAA2CJ,CAAmB,IAE9DK,EAAa,uCAAuC,MAAM;AAAA,IAE9D;AAAA,IACA,SAAS,CAAAC,MAAS;AAChB,MAAAD,EAAaC,EAAM,QAAQ,QAAQ;AAAA,IACrC;AAAA,EAAA,CACD,GAGK,CAACC,GAAwBlC,CAAyB,IACtDmC,EAAkB,EAAK,GAGnB,CAACC,GAA0BjC,CAA2B,IAC1DgC,EAAkB,EAAK,GACnB,CAACE,GAA6BC,CAA8B,IAChEH,EAAkB,EAAK,GAEnBI,IAAgC,MAAM;AAC1C,IAAAvC,EAA0B,EAAK;AAAA,EACjC,GAEMwC,IAAoBC,EAAgBhB,EAAM,UAAU,GAEpD;AAAA,IACJ,MAAMiB;AAAA,IACN,WAAWC;AAAA,EAAA,IACTC;AAAA,IACF;AAAA,MACE,cACE;AAAA,MACF,SAAS;AAAA,QACP,UAAUnB,EAAM;AAAA,QAChB,cACE;AAAA,QACF,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,IAEF;AAAA,MACE,SAASe;AAAA,IAAA;AAAA,EACX,GAGIK,IACJL,MACCG,KAAiCD,GAAsB,cAAc,IAElE,EAAE,MAAM7B,EAAA,IAAeE,EAAaU,EAAM,QAAQ,GAElD,EAAE,cAAAqB,EAAA,IAAiBC,GAAA,GAEnBC,IACJnC,KAAcoC,EAAapC,CAAU,IACjCA,EAAW,mBACX,QAEAP,IAAiB0C,IACnB,MAAM;AACJ,IAAKF,EAAa;AAAA,MAChB,cAAAE;AAAA,MACA,oBAAoBvB,EAAM;AAAA,MAC1B,sBAAsByB,EAAwB;AAAA,IAAA,CAC/C;AAAA,EACH,IACA,QAEEC,IACJtC,KAAcuC,EAAavC,CAAU,KAAK,CAACwC,EAAexC,CAAU,GAEhEyC,IACJzC,KACA0C,EAAU1C,CAAU,MACnB,CAACA,EAAW,SAASA,EAAW,MAAM,WAAW,IAE9CR,IACJwC,KAA6BM,KAAwBG,GAGjD,CAACE,GAAoBvD,CAAqB,IAAIkC,EAAkB,EAAK,GAErEsB,IAA4B,MAAM;AACtC,IAAAxD,EAAsB,EAAK;AAAA,EAC7B,GAIMyD,IADkB/C,GAAgCc,EAAM,UAAU,EAC9B;AAAA,IAAI,OAC5CkC,EAAY;AAAA,MAAI,CAAAC,MACdhE;AAAA,QACE6B,EAAM;AAAA,QACNA,EAAM;AAAA,QACNA,EAAM;AAAA,QACNmC;AAAA,QACA5D;AAAA,QACAC;AAAA,QACAC;AAAA,QACAC;AAAA,QACAiB;AAAA,QACAf;AAAA,QACAC;AAAA,QACAC;AAAA,MAAA;AAAA,IACF;AAAA,EACF,GAII,EAAE,SAAAsD,GAAS,OAAAC,GAAO,YAAAC,EAAA,IAAezE;AAAA,IACrCmC,EAAM;AAAA,IACNA,EAAM;AAAA,IACNL;AAAA,EAAA,GAGI4C,IAAuB5B,IAC3B,gBAAA6B;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,UAAUzC,EAAM;AAAA,MAChB,aAAa,MAAMtB,EAA4B,EAAK;AAAA,MACpD,mBAAmBmC;AAAA,IAAA;AAAA,EAAA,IAEnB;AAEJ,SACE,gBAAA6B,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAH;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,OAAOX;AAAA,QACP,oBAAmB;AAAA,QACnB,eAAc;AAAA,QACd,aAAa;AAAA,UACX,SAAS;AAAA,UACT,6BAAYY,IAAA,EAAa;AAAA,UACzB,UAAU7C,EAAM,YAAYY;AAAA,QAAA;AAAA,MAC9B;AAAA,IAAA;AAAA,IAED2B,MACEvC,EAAM,+BAA+B,UAClC8C;AAAA,MACEP;AAAA,MACAvC,EAAM,8BAA8B;AAAA,IAAA,IAEtCuC;AAAA,IACN,gBAAAC;AAAA,MAACO;AAAA,MAAA;AAAA,QACC,MAAMtC;AAAA,QACN,OAAO,wBAAwBT,EAAM,IAAI;AAAA,QACzC,SAASc;AAAA,QACT,YAAAwB;AAAA,QACA,OAAAD;AAAA,QACA,SAAAD;AAAA,QACA,SAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,IAETL,KACC,gBAAAS;AAAA,MAACQ;AAAA,MAAA;AAAA,QACC,oBAAoB/C;AAAA,QACpB,SAAS+B;AAAA,MAAA;AAAA,IAAA;AAAA,EACX,GAEJ;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SynapseHomepageChatSearch.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseHomepageV2/SynapseHomepageChatSearch.tsx"],"names":[],"mappings":"
|
|
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"}
|