@rivm-loculus-tools/common-frontend 0.1.3 → 0.2.0
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/_chunks/FastaDataImportDialog.js +309 -0
- package/dist/_chunks/FastaDataImportDialog.js.map +1 -0
- package/dist/_chunks/react.js +11 -0
- package/dist/_chunks/react.js.map +1 -0
- package/dist/classes/services/FastaDataEventBusService/FastaDataEventBusService.d.ts +10 -0
- package/dist/classes/services/FastaDataEventBusService/index.js +16 -0
- package/dist/classes/services/FastaDataEventBusService/index.js.map +1 -0
- package/dist/components/FastaDataImportDialog/FastaDataImportDialog.d.ts +12 -0
- package/dist/components/FastaDataImportDialog/index.js +1 -0
- package/dist/components/FastaDataImportDialogLoader/FastaDataImportDialogLoader.d.ts +8 -0
- package/dist/components/FastaDataImportDialogLoader/index.js +70 -0
- package/dist/components/FastaDataImportDialogLoader/index.js.map +1 -0
- package/dist/components/FastaNotLoaded/FastaNotLoaded.d.ts +7 -0
- package/dist/components/FastaNotLoaded/index.js +53 -0
- package/dist/components/FastaNotLoaded/index.js.map +1 -0
- package/dist/components/FastaPageHeaderCenterComponent/FastaPageHeaderCenterComponent.d.ts +6 -0
- package/dist/components/FastaPageHeaderCenterComponent/index.js +37 -0
- package/dist/components/FastaPageHeaderCenterComponent/index.js.map +1 -0
- package/dist/components/FastaPageHeaderImportButton/FastaPageHeaderImportButton.d.ts +1 -0
- package/dist/components/FastaPageHeaderImportButton/index.js +26 -0
- package/dist/components/FastaPageHeaderImportButton/index.js.map +1 -0
- package/dist/components/FastaPageHeaderResetButton/FastaPageHeaderResetButton.d.ts +4 -0
- package/dist/components/FastaPageHeaderResetButton/index.js +35 -0
- package/dist/components/FastaPageHeaderResetButton/index.js.map +1 -0
- package/dist/components/I18nWrapper/I18nWrapper.d.ts +4 -0
- package/dist/components/I18nWrapper/index.js +21 -0
- package/dist/components/I18nWrapper/index.js.map +1 -0
- package/dist/components/PageHeaderDocumentationButton/PageHeaderDocumentationButton.d.ts +1 -0
- package/dist/components/PageHeaderDocumentationButton/index.js +24 -0
- package/dist/components/PageHeaderDocumentationButton/index.js.map +1 -0
- package/dist/components/SearchBar/SearchBar.d.ts +10 -0
- package/dist/components/SearchBar/SearchBarNodeCounter.d.ts +4 -0
- package/dist/components/SearchBar/index.js +129 -0
- package/dist/components/SearchBar/index.js.map +1 -0
- package/dist/components/page/ErrorPageCommon.d.ts +4 -0
- package/dist/components/page/PageCommon.d.ts +8 -0
- package/dist/components/page/PageCommonContext.d.ts +7 -0
- package/dist/components/page/PageCommonContextProvider.d.ts +3 -0
- package/dist/components/page/PageCommonDrawer.d.ts +5 -0
- package/dist/components/page/PageCommonHeader.d.ts +8 -0
- package/dist/components/page/index.js +207 -0
- package/dist/components/page/index.js.map +1 -0
- package/dist/constants/page.d.ts +1 -0
- package/dist/constants/page.js +6 -0
- package/dist/constants/page.js.map +1 -0
- package/dist/models/fasta.d.ts +23 -0
- package/dist/models/fasta.js +8 -0
- package/dist/models/fasta.js.map +1 -0
- package/dist/models/metadata.d.ts +9 -0
- package/dist/stores/fastaDataStore/fastaDataStore.d.ts +32 -0
- package/dist/stores/fastaDataStore/index.js +57 -0
- package/dist/stores/fastaDataStore/index.js.map +1 -0
- package/dist/theme/index.js +257 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme.d.ts +1 -0
- package/dist/utils/DownloadUtil/DownloadUtil.d.ts +3 -0
- package/dist/utils/DownloadUtil/index.js +10 -0
- package/dist/utils/DownloadUtil/index.js.map +1 -0
- package/dist/utils/ErrorUtil/ErrorUtil.d.ts +3 -0
- package/dist/utils/ErrorUtil/index.js +10 -0
- package/dist/utils/ErrorUtil/index.js.map +1 -0
- package/dist/utils/FastaUtil/FastaUtil.d.ts +6 -0
- package/dist/utils/FastaUtil/index.js +56 -0
- package/dist/utils/FastaUtil/index.js.map +1 -0
- package/dist/utils/MetaDataUtil/MetaDataUtil.d.ts +20 -0
- package/dist/utils/MetaDataUtil/index.js +133 -0
- package/dist/utils/MetaDataUtil/index.js.map +1 -0
- package/dist/utils/UrlUtil/UrlUtil.d.ts +5 -0
- package/dist/utils/UrlUtil/index.js +30 -0
- package/dist/utils/UrlUtil/index.js.map +1 -0
- package/package.json +27 -28
- package/CHANGELOG.md +0 -29
- package/eslint.config.js +0 -16
- package/scripts/update-exports.js +0 -9
- package/src/classes/services/FastaDataEventBusService/FastaDataEventBusService.ts +0 -22
- package/src/components/FastaDataImportDialog/FastaDataImportDialog.tsx +0 -364
- package/src/components/FastaDataImportDialogLoader/FastaDataImportDialogLoader.tsx +0 -124
- package/src/components/FastaNotLoaded/FastaNotLoaded.tsx +0 -62
- package/src/components/FastaPageHeaderCenterComponent/FastaPageHeaderCenterComponent.tsx +0 -50
- package/src/components/FastaPageHeaderImportButton/FastaPageHeaderImportButton.tsx +0 -28
- package/src/components/FastaPageHeaderResetButton/FastaPageHeaderResetButton.tsx +0 -50
- package/src/components/I18nWrapper/I18nWrapper.tsx +0 -39
- package/src/components/PageHeaderDocumentationButton/PageHeaderDocumentationButton.tsx +0 -25
- package/src/components/SearchBar/SearchBar.tsx +0 -207
- package/src/components/SearchBar/SearchBarNodeCounter.tsx +0 -23
- package/src/components/page/ErrorPageCommon.tsx +0 -51
- package/src/components/page/PageCommon.tsx +0 -76
- package/src/components/page/PageCommonContext.ts +0 -15
- package/src/components/page/PageCommonContextProvider.tsx +0 -30
- package/src/components/page/PageCommonDrawer.tsx +0 -35
- package/src/components/page/PageCommonHeader.tsx +0 -99
- package/src/constants/page.ts +0 -1
- package/src/index.ts +0 -21
- package/src/models/fasta.ts +0 -22
- package/src/models/metadata.ts +0 -10
- package/src/stores/fastaDataStore/fastaDataStore.ts +0 -103
- package/src/theme/fonts/RobotoFlex.woff2 +0 -0
- package/src/theme/theme.ts +0 -368
- package/src/utils/DownloadUtil/DownloadUtil.ts +0 -10
- package/src/utils/ErrorUtil/ErrorUtil.ts +0 -5
- package/src/utils/FastaUtil/FastaUtil.ts +0 -109
- package/src/utils/MetaDataUtil/MetaDataUtil.ts +0 -292
- package/src/utils/UrlUtil/UrlUtil.ts +0 -35
- package/tsconfig.build.json +0 -14
- package/tsconfig.json +0 -32
- package/vite.config.ts +0 -137
- /package/{src → dist}/@types/vite-env.d.ts +0 -0
- /package/{src/classes/services/FastaDataEventBusService/index.ts → dist/classes/services/FastaDataEventBusService/index.d.ts} +0 -0
- /package/{src/components/FastaDataImportDialog/index.ts → dist/components/FastaDataImportDialog/index.d.ts} +0 -0
- /package/{src/components/FastaDataImportDialogLoader/index.ts → dist/components/FastaDataImportDialogLoader/index.d.ts} +0 -0
- /package/{src/components/FastaNotLoaded/index.ts → dist/components/FastaNotLoaded/index.d.ts} +0 -0
- /package/{src/components/FastaPageHeaderCenterComponent/index.ts → dist/components/FastaPageHeaderCenterComponent/index.d.ts} +0 -0
- /package/{src/components/FastaPageHeaderImportButton/index.ts → dist/components/FastaPageHeaderImportButton/index.d.ts} +0 -0
- /package/{src/components/FastaPageHeaderResetButton/index.ts → dist/components/FastaPageHeaderResetButton/index.d.ts} +0 -0
- /package/{src/components/I18nWrapper/index.ts → dist/components/I18nWrapper/index.d.ts} +0 -0
- /package/{src/components/PageHeaderDocumentationButton/index.ts → dist/components/PageHeaderDocumentationButton/index.d.ts} +0 -0
- /package/{src/components/SearchBar/index.ts → dist/components/SearchBar/index.d.ts} +0 -0
- /package/{src/components/page/index.ts → dist/components/page/index.d.ts} +0 -0
- /package/{src/.gitkeep → dist/models/metadata.js} +0 -0
- /package/{src/stores/fastaDataStore/index.ts → dist/stores/fastaDataStore/index.d.ts} +0 -0
- /package/{src/theme/index.ts → dist/theme/index.d.ts} +0 -0
- /package/{src/utils/DownloadUtil/index.ts → dist/utils/DownloadUtil/index.d.ts} +0 -0
- /package/{src/utils/ErrorUtil/index.ts → dist/utils/ErrorUtil/index.d.ts} +0 -0
- /package/{src/utils/FastaUtil/index.ts → dist/utils/FastaUtil/index.d.ts} +0 -0
- /package/{src/utils/MetaDataUtil/index.ts → dist/utils/MetaDataUtil/index.d.ts} +0 -0
- /package/{src/utils/UrlUtil/index.ts → dist/utils/UrlUtil/index.d.ts} +0 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { Alert as e, Box as t, CircularProgress as n, Paper as r, Tab as i, Tabs as a, TextField as o, Typography as s } from "@mui/material";
|
|
2
|
+
import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback as d, useEffect as f, useState as p } from "react";
|
|
4
|
+
import m from "@mui/icons-material/Biotech";
|
|
5
|
+
import h from "@mui/icons-material/TableChart";
|
|
6
|
+
import { FileDropZone as g } from "@gen-epix/ui-core-components/components/FileDropZone";
|
|
7
|
+
import { withDialog as _ } from "@gen-epix/ui-core-components/hoc/withDialog";
|
|
8
|
+
//#region src/components/FastaDataImportDialog/FastaDataImportDialog.tsx
|
|
9
|
+
var v = _(({ extraActions: _, onActionsChange: v, onClose: y, onDataChange: b, onDisableBackdropClickChange: x, onError: S, onNoCloseButtonChange: C, openProps: w }) => {
|
|
10
|
+
let [T, E] = p(0), [D, O] = p(null), [k, A] = p(""), [j, M] = p(""), [N, ee] = p(0), [P, F] = p(null), [I, L] = p(""), [R, z] = p(""), [B, V] = p(!1), [H, U] = p(null);
|
|
11
|
+
f(() => {
|
|
12
|
+
U(w?.initialErrorMessage ?? null);
|
|
13
|
+
}, [w]), f(() => {
|
|
14
|
+
C && C(!!w?.initialErrorMessage), x && x(!!w?.initialErrorMessage);
|
|
15
|
+
}, [
|
|
16
|
+
x,
|
|
17
|
+
C,
|
|
18
|
+
w?.initialErrorMessage
|
|
19
|
+
]);
|
|
20
|
+
let W = d(() => U(null), []), G = d((e, t) => {
|
|
21
|
+
E(t);
|
|
22
|
+
}, []), K = d((e, t) => {
|
|
23
|
+
ee(t);
|
|
24
|
+
}, []), q = d((e) => O(e), []), J = d((e) => F(e), []), Y = d((e) => {
|
|
25
|
+
A(e.target.value);
|
|
26
|
+
}, []), X = d((e) => {
|
|
27
|
+
M(e.target.value);
|
|
28
|
+
}, []), Z = d((e) => {
|
|
29
|
+
L(e.target.value);
|
|
30
|
+
}, []), Q = d((e) => {
|
|
31
|
+
z(e.target.value);
|
|
32
|
+
}, []), $ = d(async () => {
|
|
33
|
+
U(null), V(!0);
|
|
34
|
+
try {
|
|
35
|
+
let e = "";
|
|
36
|
+
if (T === 0 && D) e = await D[0].text();
|
|
37
|
+
else if (T === 1 && k.trim()) {
|
|
38
|
+
let t = await fetch(k.trim());
|
|
39
|
+
if (!t.ok) throw Error(`Failed to fetch FASTA from URL (${t.status} ${t.statusText})`);
|
|
40
|
+
e = await t.text();
|
|
41
|
+
} else T === 2 && j.trim() && (e = j.trim());
|
|
42
|
+
if (!e?.trim()) throw Error("Please provide FASTA sequence data via file, URL, or paste.");
|
|
43
|
+
let t = "";
|
|
44
|
+
if (N === 0 && P) t = await P[0].text();
|
|
45
|
+
else if (N === 1 && I.trim()) {
|
|
46
|
+
let e = await fetch(I.trim());
|
|
47
|
+
if (!e.ok) throw Error(`Failed to fetch Metadata from URL (${e.status} ${e.statusText})`);
|
|
48
|
+
t = await e.text();
|
|
49
|
+
} else N === 2 && R.trim() && (t = R.trim());
|
|
50
|
+
b(e, t), y && y();
|
|
51
|
+
} catch (e) {
|
|
52
|
+
console.error("Data import failed:", e), S(e);
|
|
53
|
+
} finally {
|
|
54
|
+
V(!1);
|
|
55
|
+
}
|
|
56
|
+
}, [
|
|
57
|
+
D,
|
|
58
|
+
T,
|
|
59
|
+
j,
|
|
60
|
+
k,
|
|
61
|
+
P,
|
|
62
|
+
N,
|
|
63
|
+
R,
|
|
64
|
+
I,
|
|
65
|
+
y,
|
|
66
|
+
b,
|
|
67
|
+
S
|
|
68
|
+
]);
|
|
69
|
+
return f(() => {
|
|
70
|
+
let e = [{
|
|
71
|
+
disabled: B,
|
|
72
|
+
label: B ? "Processing..." : "Load & Calculate",
|
|
73
|
+
onClick: $,
|
|
74
|
+
startIcon: B ? /* @__PURE__ */ l(n, {
|
|
75
|
+
color: "inherit",
|
|
76
|
+
size: 18
|
|
77
|
+
}) : void 0,
|
|
78
|
+
variant: "contained"
|
|
79
|
+
}];
|
|
80
|
+
_?.length && e.unshift(..._), v && v(e);
|
|
81
|
+
}, [
|
|
82
|
+
v,
|
|
83
|
+
$,
|
|
84
|
+
B,
|
|
85
|
+
_
|
|
86
|
+
]), /* @__PURE__ */ u(c, { children: [H && /* @__PURE__ */ l(e, {
|
|
87
|
+
onClose: W,
|
|
88
|
+
severity: "error",
|
|
89
|
+
sx: { marginBottom: 2 },
|
|
90
|
+
children: H
|
|
91
|
+
}), /* @__PURE__ */ u(t, {
|
|
92
|
+
sx: {
|
|
93
|
+
display: "grid",
|
|
94
|
+
gap: 3,
|
|
95
|
+
gridTemplateColumns: {
|
|
96
|
+
md: "1fr 1fr",
|
|
97
|
+
xs: "1fr"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
children: [/* @__PURE__ */ u(r, {
|
|
101
|
+
sx: {
|
|
102
|
+
borderRadius: 2,
|
|
103
|
+
p: 2.5
|
|
104
|
+
},
|
|
105
|
+
variant: "outlined",
|
|
106
|
+
children: [
|
|
107
|
+
/* @__PURE__ */ u(t, {
|
|
108
|
+
sx: {
|
|
109
|
+
alignItems: "center",
|
|
110
|
+
display: "flex",
|
|
111
|
+
gap: 1,
|
|
112
|
+
mb: 1.5
|
|
113
|
+
},
|
|
114
|
+
children: [/* @__PURE__ */ l(m, { color: "primary" }), /* @__PURE__ */ l(s, {
|
|
115
|
+
sx: { fontWeight: 700 },
|
|
116
|
+
variant: "subtitle1",
|
|
117
|
+
children: "1. FASTA Sequences (Required)"
|
|
118
|
+
})]
|
|
119
|
+
}),
|
|
120
|
+
/* @__PURE__ */ l(s, {
|
|
121
|
+
color: "text.secondary",
|
|
122
|
+
sx: {
|
|
123
|
+
display: "block",
|
|
124
|
+
mb: 2
|
|
125
|
+
},
|
|
126
|
+
variant: "caption",
|
|
127
|
+
children: "Pre-aligned nucleotide or amino-acid sequence data."
|
|
128
|
+
}),
|
|
129
|
+
/* @__PURE__ */ u(a, {
|
|
130
|
+
onChange: G,
|
|
131
|
+
sx: {
|
|
132
|
+
mb: 2,
|
|
133
|
+
minHeight: 36
|
|
134
|
+
},
|
|
135
|
+
value: T,
|
|
136
|
+
children: [
|
|
137
|
+
/* @__PURE__ */ l(i, {
|
|
138
|
+
label: "File Upload",
|
|
139
|
+
sx: {
|
|
140
|
+
fontSize: "0.85rem",
|
|
141
|
+
py: .5
|
|
142
|
+
}
|
|
143
|
+
}),
|
|
144
|
+
/* @__PURE__ */ l(i, {
|
|
145
|
+
label: "Public URL",
|
|
146
|
+
sx: {
|
|
147
|
+
fontSize: "0.85rem",
|
|
148
|
+
py: .5
|
|
149
|
+
}
|
|
150
|
+
}),
|
|
151
|
+
/* @__PURE__ */ l(i, {
|
|
152
|
+
label: "Direct Paste",
|
|
153
|
+
sx: {
|
|
154
|
+
fontSize: "0.85rem",
|
|
155
|
+
py: .5
|
|
156
|
+
}
|
|
157
|
+
})
|
|
158
|
+
]
|
|
159
|
+
}),
|
|
160
|
+
T === 0 && /* @__PURE__ */ l(g, {
|
|
161
|
+
accept: ".fasta,.fa,.fna,.aln",
|
|
162
|
+
files: D,
|
|
163
|
+
helperText: "Drag & drop .fasta / .fa alignment file",
|
|
164
|
+
onFilesSelected: q
|
|
165
|
+
}),
|
|
166
|
+
T === 1 && /* @__PURE__ */ l(t, {
|
|
167
|
+
sx: {
|
|
168
|
+
display: "flex",
|
|
169
|
+
flexDirection: "column",
|
|
170
|
+
gap: 1.5,
|
|
171
|
+
justifyContent: "center",
|
|
172
|
+
minHeight: 180
|
|
173
|
+
},
|
|
174
|
+
children: /* @__PURE__ */ l(o, {
|
|
175
|
+
fullWidth: !0,
|
|
176
|
+
helperText: "Enter a publicly accessible URL to a FASTA alignment",
|
|
177
|
+
label: "FASTA URL",
|
|
178
|
+
onChange: Y,
|
|
179
|
+
placeholder: "https://example.com/sequences.fasta",
|
|
180
|
+
value: k,
|
|
181
|
+
variant: "outlined"
|
|
182
|
+
})
|
|
183
|
+
}),
|
|
184
|
+
T === 2 && /* @__PURE__ */ l(t, {
|
|
185
|
+
sx: { minHeight: 180 },
|
|
186
|
+
children: /* @__PURE__ */ l(o, {
|
|
187
|
+
fullWidth: !0,
|
|
188
|
+
label: "Paste FASTA Content",
|
|
189
|
+
multiline: !0,
|
|
190
|
+
onChange: X,
|
|
191
|
+
placeholder: ">seq1 ACTG... >seq2 ACTG...",
|
|
192
|
+
rows: 6,
|
|
193
|
+
sx: { fontFamily: "monospace" },
|
|
194
|
+
value: j,
|
|
195
|
+
variant: "outlined"
|
|
196
|
+
})
|
|
197
|
+
})
|
|
198
|
+
]
|
|
199
|
+
}), /* @__PURE__ */ u(r, {
|
|
200
|
+
sx: {
|
|
201
|
+
borderRadius: 2,
|
|
202
|
+
p: 2.5
|
|
203
|
+
},
|
|
204
|
+
variant: "outlined",
|
|
205
|
+
children: [
|
|
206
|
+
/* @__PURE__ */ u(t, {
|
|
207
|
+
sx: {
|
|
208
|
+
alignItems: "center",
|
|
209
|
+
display: "flex",
|
|
210
|
+
gap: 1,
|
|
211
|
+
mb: 1.5
|
|
212
|
+
},
|
|
213
|
+
children: [/* @__PURE__ */ l(h, { color: "primary" }), /* @__PURE__ */ l(s, {
|
|
214
|
+
sx: { fontWeight: 700 },
|
|
215
|
+
variant: "subtitle1",
|
|
216
|
+
children: "2. TSV Metadata (Optional)"
|
|
217
|
+
})]
|
|
218
|
+
}),
|
|
219
|
+
/* @__PURE__ */ l(s, {
|
|
220
|
+
color: "text.primary",
|
|
221
|
+
sx: {
|
|
222
|
+
display: "block",
|
|
223
|
+
mb: 2
|
|
224
|
+
},
|
|
225
|
+
variant: "caption",
|
|
226
|
+
children: "Sample attributes for coloring, search & custom leaf labels."
|
|
227
|
+
}),
|
|
228
|
+
/* @__PURE__ */ u(a, {
|
|
229
|
+
onChange: K,
|
|
230
|
+
sx: {
|
|
231
|
+
mb: 2,
|
|
232
|
+
minHeight: 36
|
|
233
|
+
},
|
|
234
|
+
value: N,
|
|
235
|
+
children: [
|
|
236
|
+
/* @__PURE__ */ l(i, {
|
|
237
|
+
label: "File Upload",
|
|
238
|
+
sx: {
|
|
239
|
+
fontSize: "0.85rem",
|
|
240
|
+
py: .5
|
|
241
|
+
}
|
|
242
|
+
}),
|
|
243
|
+
/* @__PURE__ */ l(i, {
|
|
244
|
+
label: "Public URL",
|
|
245
|
+
sx: {
|
|
246
|
+
fontSize: "0.85rem",
|
|
247
|
+
py: .5
|
|
248
|
+
}
|
|
249
|
+
}),
|
|
250
|
+
/* @__PURE__ */ l(i, {
|
|
251
|
+
label: "Direct Paste",
|
|
252
|
+
sx: {
|
|
253
|
+
fontSize: "0.85rem",
|
|
254
|
+
py: .5
|
|
255
|
+
}
|
|
256
|
+
})
|
|
257
|
+
]
|
|
258
|
+
}),
|
|
259
|
+
N === 0 && /* @__PURE__ */ l(g, {
|
|
260
|
+
accept: ".tsv,.txt,.csv",
|
|
261
|
+
files: P,
|
|
262
|
+
label: "TSV Metadata File",
|
|
263
|
+
onFilesSelected: J
|
|
264
|
+
}),
|
|
265
|
+
N === 1 && /* @__PURE__ */ l(t, {
|
|
266
|
+
sx: {
|
|
267
|
+
display: "flex",
|
|
268
|
+
flexDirection: "column",
|
|
269
|
+
gap: 1.5,
|
|
270
|
+
justifyContent: "center",
|
|
271
|
+
minHeight: 180
|
|
272
|
+
},
|
|
273
|
+
children: /* @__PURE__ */ l(o, {
|
|
274
|
+
fullWidth: !0,
|
|
275
|
+
helperText: "Enter a publicly accessible URL to a TSV metadata file",
|
|
276
|
+
label: "Metadata TSV URL",
|
|
277
|
+
onChange: Z,
|
|
278
|
+
placeholder: "https://example.com/metadata.tsv",
|
|
279
|
+
value: I,
|
|
280
|
+
variant: "outlined"
|
|
281
|
+
})
|
|
282
|
+
}),
|
|
283
|
+
N === 2 && /* @__PURE__ */ l(t, {
|
|
284
|
+
sx: { minHeight: 180 },
|
|
285
|
+
children: /* @__PURE__ */ l(o, {
|
|
286
|
+
fullWidth: !0,
|
|
287
|
+
label: "Paste TSV Content",
|
|
288
|
+
multiline: !0,
|
|
289
|
+
onChange: Q,
|
|
290
|
+
placeholder: "SampleID	Country	Date Sample1	NL	2024-01-01",
|
|
291
|
+
rows: 6,
|
|
292
|
+
sx: { fontFamily: "monospace" },
|
|
293
|
+
value: R,
|
|
294
|
+
variant: "outlined"
|
|
295
|
+
})
|
|
296
|
+
})
|
|
297
|
+
]
|
|
298
|
+
})]
|
|
299
|
+
})] });
|
|
300
|
+
}, {
|
|
301
|
+
defaultTitle: "Load Phylogenetic Data",
|
|
302
|
+
fullWidth: !0,
|
|
303
|
+
maxWidth: "xl",
|
|
304
|
+
testId: "FastaDataImportDialog"
|
|
305
|
+
});
|
|
306
|
+
//#endregion
|
|
307
|
+
export { v as t };
|
|
308
|
+
|
|
309
|
+
//# sourceMappingURL=FastaDataImportDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FastaDataImportDialog.js","names":["_Fragment","DnaIcon","TableChartIcon","FastaDataImportDialog","withDialog","fastaTab","setFastaTab","useState","fastaFile","setFastaFile","fastaUrl","setFastaUrl","fastaText","setFastaText","metadataTab","setMetadataTab","metadataFile","setMetadataFile","metadataUrl","setMetadataUrl","metadataText","setMetadataText","isLoading","setIsLoading","errorMsg","setErrorMsg","useEffect","openProps","onNoCloseButtonChange","onDisableBackdropClickChange","onCloseError","useCallback","onChangeFastaTab","value","onChangeMetadataTab","onFileSelectedFasta","file","onFileSelectedMetadata","onChangeFastaUrl","event","onChangeFastaText","onChangeMetadataUrl","onChangeMetadataText","onClickLoadData","fastaContent","res","metadataContent","onDataChange","onClose","err","onError","actions","CircularProgress","extraActions","onActionsChange","Fragment","Alert","Box","Paper","Typography","Tabs","Tab","FileDropZone","TextField"],"sources":["../../src/components/FastaDataImportDialog/FastaDataImportDialog.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n ReactElement,\n SyntheticEvent,\n} from 'react';\nimport {\n useCallback,\n useEffect,\n useState,\n} from 'react';\nimport {\n Alert,\n Box,\n CircularProgress,\n Paper,\n Tab,\n Tabs,\n TextField,\n Typography,\n} from '@mui/material';\nimport DnaIcon from '@mui/icons-material/Biotech';\nimport TableChartIcon from '@mui/icons-material/TableChart';\nimport { FileDropZone } from '@gen-epix/ui-core-components/components/FileDropZone';\nimport type {\n WithDialogRefMethods,\n WithDialogRenderProps,\n} from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { withDialog } from '@gen-epix/ui-core-components/hoc/withDialog';\nimport type { DialogAction } from '@gen-epix/ui-core-components/components/Dialog';\n\n\nenum FASTA_TAB {\n DROP = 0,\n URL = 1,\n PASTE = 2,\n}\n\nenum META_DATA_TAB {\n DROP = 0,\n URL = 1,\n PASTE = 2,\n}\n\nexport interface FastaDataImportDialogOpenProps {\n initialErrorMessage?: string;\n}\n\nexport interface FastaDataImportDialogProps extends WithDialogRenderProps<FastaDataImportDialogOpenProps> {\n extraActions?: DialogAction[];\n onDataChange: (fasta: string, metaData?: string) => void;\n onError: (error: unknown) => void;\n}\n\nexport type FastaDataImportDialogRefMethods = WithDialogRefMethods<FastaDataImportDialogProps, FastaDataImportDialogOpenProps>;\n\nexport const FastaDataImportDialog = withDialog<FastaDataImportDialogProps, FastaDataImportDialogOpenProps>((\n {\n extraActions,\n onActionsChange,\n onClose,\n onDataChange,\n onDisableBackdropClickChange,\n onError,\n onNoCloseButtonChange,\n openProps,\n }: FastaDataImportDialogProps,\n): ReactElement => {\n // FASTA state\n const [fastaTab, setFastaTab] = useState(FASTA_TAB.DROP);\n const [fastaFile, setFastaFile] = useState<FileList | null>(null);\n const [fastaUrl, setFastaUrl] = useState('');\n const [fastaText, setFastaText] = useState('');\n\n // Metadata state\n const [metadataTab, setMetadataTab] = useState(META_DATA_TAB.DROP);\n const [metadataFile, setMetadataFile] = useState<FileList | null>(null);\n const [metadataUrl, setMetadataUrl] = useState('');\n const [metadataText, setMetadataText] = useState('');\n\n const [isLoading, setIsLoading] = useState(false);\n const [errorMsg, setErrorMsg] = useState<null | string>(null);\n\n useEffect(() => {\n setErrorMsg(openProps?.initialErrorMessage ?? null);\n }, [openProps]);\n\n useEffect(() => {\n if (onNoCloseButtonChange) {\n onNoCloseButtonChange(!!openProps?.initialErrorMessage);\n }\n if (onDisableBackdropClickChange) {\n onDisableBackdropClickChange(!!openProps?.initialErrorMessage);\n }\n }, [onDisableBackdropClickChange, onNoCloseButtonChange, openProps?.initialErrorMessage]);\n\n const onCloseError = useCallback(() => setErrorMsg(null), []);\n const onChangeFastaTab = useCallback((_event: SyntheticEvent, value: number) => {\n setFastaTab(value);\n }, []);\n const onChangeMetadataTab = useCallback((_event: SyntheticEvent, value: number) => {\n setMetadataTab(value);\n }, []);\n const onFileSelectedFasta = useCallback((file: FileList) => setFastaFile(file), []);\n const onFileSelectedMetadata = useCallback((file: FileList) => setMetadataFile(file), []);\n const onChangeFastaUrl = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n setFastaUrl(event.target.value);\n }, []);\n const onChangeFastaText = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n setFastaText(event.target.value);\n }, []);\n const onChangeMetadataUrl = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n setMetadataUrl(event.target.value);\n }, []);\n const onChangeMetadataText = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n setMetadataText(event.target.value);\n }, []);\n\n const onClickLoadData = useCallback(async () => {\n setErrorMsg(null);\n setIsLoading(true);\n\n try {\n // 1. Resolve FASTA content\n let fastaContent = '';\n if (fastaTab === FASTA_TAB.DROP && fastaFile) {\n fastaContent = await fastaFile[0].text();\n } else if (fastaTab === FASTA_TAB.URL && fastaUrl.trim()) {\n const res = await fetch(fastaUrl.trim());\n if (!res.ok) {\n throw new Error(`Failed to fetch FASTA from URL (${res.status} ${res.statusText})`);\n }\n fastaContent = await res.text();\n } else if (fastaTab === FASTA_TAB.PASTE && fastaText.trim()) {\n fastaContent = fastaText.trim();\n }\n\n if (!fastaContent?.trim()) {\n throw new Error('Please provide FASTA sequence data via file, URL, or paste.');\n }\n\n // 2. Resolve Metadata content (optional)\n let metadataContent = '';\n if (metadataTab === META_DATA_TAB.DROP && metadataFile) {\n metadataContent = await metadataFile[0].text();\n } else if (metadataTab === META_DATA_TAB.URL && metadataUrl.trim()) {\n const res = await fetch(metadataUrl.trim());\n if (!res.ok) {\n throw new Error(`Failed to fetch Metadata from URL (${res.status} ${res.statusText})`);\n }\n metadataContent = await res.text();\n } else if (metadataTab === META_DATA_TAB.PASTE && metadataText.trim()) {\n metadataContent = metadataText.trim();\n }\n onDataChange(fastaContent, metadataContent);\n if (onClose) {\n onClose();\n }\n } catch (err: unknown) {\n console.error('Data import failed:', err);\n onError(err);\n } finally {\n setIsLoading(false);\n }\n }, [fastaFile, fastaTab, fastaText, fastaUrl, metadataFile, metadataTab, metadataText, metadataUrl, onClose, onDataChange, onError]);\n\n\n useEffect(() => {\n const actions: DialogAction[] = [\n {\n disabled: isLoading,\n label: isLoading ? 'Processing...' : 'Load & Calculate',\n onClick: onClickLoadData,\n startIcon: isLoading ? (\n <CircularProgress\n color={'inherit'}\n size={18}\n />\n ) : undefined,\n variant: 'contained',\n },\n ];\n if (extraActions?.length) {\n actions.unshift(...extraActions);\n }\n if (onActionsChange) {\n onActionsChange(actions);\n }\n }, [onActionsChange, onClickLoadData, isLoading, extraActions]);\n\n return (\n <>\n {errorMsg && (\n <Alert\n onClose={onCloseError}\n severity={'error'}\n sx={{\n marginBottom: 2,\n }}\n >\n {errorMsg}\n </Alert>\n )}\n <Box sx={{ display: 'grid', gap: 3, gridTemplateColumns: { md: '1fr 1fr', xs: '1fr' } }}>\n {/* FASTA Sequences Group */}\n <Paper\n sx={{ borderRadius: 2, p: 2.5 }}\n variant={'outlined'}\n >\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1, mb: 1.5 }}>\n <DnaIcon color={'primary'} />\n <Typography\n sx={{ fontWeight: 700 }}\n variant={'subtitle1'}\n >\n {'1. FASTA Sequences (Required)'}\n </Typography>\n </Box>\n <Typography\n color={'text.secondary'}\n sx={{ display: 'block', mb: 2 }}\n variant={'caption'}\n >\n {'Pre-aligned nucleotide or amino-acid sequence data.'}\n </Typography>\n <Tabs\n onChange={onChangeFastaTab}\n sx={{ mb: 2, minHeight: 36 }}\n value={fastaTab}\n >\n <Tab\n label={'File Upload'}\n sx={{ fontSize: '0.85rem', py: 0.5 }}\n />\n <Tab\n label={'Public URL'}\n sx={{ fontSize: '0.85rem', py: 0.5 }}\n />\n <Tab\n label={'Direct Paste'}\n sx={{ fontSize: '0.85rem', py: 0.5 }}\n />\n </Tabs>\n {fastaTab === FASTA_TAB.DROP && (\n <FileDropZone\n accept={'.fasta,.fa,.fna,.aln'}\n files={fastaFile}\n helperText={'Drag & drop .fasta / .fa alignment file'}\n onFilesSelected={onFileSelectedFasta}\n />\n )}\n {fastaTab === FASTA_TAB.URL && (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1.5, justifyContent: 'center', minHeight: 180 }}>\n <TextField\n fullWidth\n helperText={'Enter a publicly accessible URL to a FASTA alignment'}\n label={'FASTA URL'}\n onChange={onChangeFastaUrl}\n placeholder={'https://example.com/sequences.fasta'}\n value={fastaUrl}\n variant={'outlined'}\n />\n </Box>\n )}\n {fastaTab === FASTA_TAB.PASTE && (\n <Box sx={{ minHeight: 180 }}>\n <TextField\n fullWidth\n label={'Paste FASTA Content'}\n multiline\n onChange={onChangeFastaText}\n placeholder={'>seq1 ACTG... >seq2 ACTG...'}\n rows={6}\n sx={{ fontFamily: 'monospace' }}\n value={fastaText}\n variant={'outlined'}\n />\n </Box>\n )}\n </Paper>\n {/* TSV Metadata Group */}\n <Paper\n sx={{ borderRadius: 2, p: 2.5 }}\n variant={'outlined'}\n >\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1, mb: 1.5 }}>\n <TableChartIcon color={'primary'} />\n <Typography\n sx={{ fontWeight: 700 }}\n variant={'subtitle1'}\n >\n {'2. TSV Metadata (Optional)'}\n </Typography>\n </Box>\n <Typography\n color={'text.primary'}\n sx={{ display: 'block', mb: 2 }}\n variant={'caption'}\n >\n {'Sample attributes for coloring, search & custom leaf labels.'}\n </Typography>\n <Tabs\n onChange={onChangeMetadataTab}\n sx={{ mb: 2, minHeight: 36 }}\n value={metadataTab}\n >\n <Tab\n label={'File Upload'}\n sx={{ fontSize: '0.85rem', py: 0.5 }}\n />\n <Tab\n label={'Public URL'}\n sx={{ fontSize: '0.85rem', py: 0.5 }}\n />\n <Tab\n label={'Direct Paste'}\n sx={{ fontSize: '0.85rem', py: 0.5 }}\n />\n </Tabs>\n {metadataTab === META_DATA_TAB.DROP && (\n <FileDropZone\n accept={'.tsv,.txt,.csv'}\n files={metadataFile}\n label={'TSV Metadata File'}\n onFilesSelected={onFileSelectedMetadata}\n />\n )}\n {metadataTab === META_DATA_TAB.URL && (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1.5, justifyContent: 'center', minHeight: 180 }}>\n <TextField\n fullWidth\n helperText={'Enter a publicly accessible URL to a TSV metadata file'}\n label={'Metadata TSV URL'}\n onChange={onChangeMetadataUrl}\n placeholder={'https://example.com/metadata.tsv'}\n value={metadataUrl}\n variant={'outlined'}\n />\n </Box>\n )}\n {metadataTab === META_DATA_TAB.PASTE && (\n <Box sx={{ minHeight: 180 }}>\n <TextField\n fullWidth\n label={'Paste TSV Content'}\n multiline\n onChange={onChangeMetadataText}\n placeholder={'SampleID	Country	Date Sample1	NL	2024-01-01'}\n rows={6}\n sx={{ fontFamily: 'monospace' }}\n value={metadataText}\n variant={'outlined'}\n />\n </Box>\n )}\n </Paper>\n </Box>\n </>\n );\n}, {\n defaultTitle: 'Load Phylogenetic Data',\n fullWidth: true,\n maxWidth: 'xl',\n testId: 'FastaDataImportDialog',\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import e from "react";
|
|
2
|
+
//#region ../../../node_modules/.pnpm/zustand@5.0.15_@types+react@19.3.0_react@19.3.0_use-sync-external-store@1.7.0_react@19.3.0_/node_modules/zustand/esm/react.mjs
|
|
3
|
+
var t = (e) => e;
|
|
4
|
+
function n(n, r = t) {
|
|
5
|
+
let i = e.useSyncExternalStore(n.subscribe, e.useCallback(() => r(n.getState()), [n, r]), e.useCallback(() => r(n.getInitialState()), [n, r]));
|
|
6
|
+
return e.useDebugValue(i), i;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { n as t };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","names":["React","identity","arg","useStore","slice","api","selector"],"sources":["../../../../../node_modules/.pnpm/zustand@5.0.15_@types+react@19.3.0_react@19.3.0_use-sync-external-store@1.7.0_react@19.3.0_/node_modules/zustand/esm/react.mjs"],"sourcesContent":["import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createState ? createImpl(createState) : createImpl);\n\nexport { create, useStore };\n"],"ignoreList":[0],"mappings":";;AAGA,IAAMC,KAAY,MAAQC;AAC1B,SAASC,EAAS,GAAK,IAAWF,GAAU;CAC1C,IAAMG,IAAQJ,EAAM,qBAClBK,EAAI,WACJL,EAAM,kBAAkBM,EAASD,EAAI,SAAS,CAAC,GAAG,CAACA,GAAKC,CAAQ,CAAC,GACjEN,EAAM,kBAAkBM,EAASD,EAAI,gBAAgB,CAAC,GAAG,CAACA,GAAKC,CAAQ,CAAC,CAC1E;CAEA,OADAN,EAAM,cAAcI,CAAK,GAClBA;AACT"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { EventBusAbstract } from '@gen-epix/ui-core/classes/abstracts/EventBusAbstract';
|
|
2
|
+
export type Event = {
|
|
3
|
+
onCloseImportDialog: undefined;
|
|
4
|
+
onShowImportDialog: string | undefined;
|
|
5
|
+
};
|
|
6
|
+
export declare class FastaDataEventBusService extends EventBusAbstract<Event> {
|
|
7
|
+
private static __instance;
|
|
8
|
+
private constructor();
|
|
9
|
+
static getInstance(): FastaDataEventBusService;
|
|
10
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EventBusAbstract as e } from "@gen-epix/ui-core/classes/abstracts/EventBusAbstract";
|
|
2
|
+
import { HmrUtil as t } from "@gen-epix/ui-core/utils/HmrUtil";
|
|
3
|
+
//#region src/classes/services/FastaDataEventBusService/FastaDataEventBusService.ts
|
|
4
|
+
var n = class n extends e {
|
|
5
|
+
static __instance;
|
|
6
|
+
constructor() {
|
|
7
|
+
super();
|
|
8
|
+
}
|
|
9
|
+
static getInstance() {
|
|
10
|
+
return n.__instance = t.getHmrSingleton("fastaDataEventBusService", n.__instance, () => new n()), n.__instance;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { n as FastaDataEventBusService };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["FastaDataEventBusService","EventBusAbstract","HmrUtil"],"sources":["../../../../src/classes/services/FastaDataEventBusService/FastaDataEventBusService.ts"],"sourcesContent":["import { EventBusAbstract } from '@gen-epix/ui-core/classes/abstracts/EventBusAbstract';\nimport { HmrUtil } from '@gen-epix/ui-core/utils/HmrUtil';\n\n\nexport type Event = {\n onCloseImportDialog: undefined;\n onShowImportDialog: string | undefined;\n};\n\nexport class FastaDataEventBusService extends EventBusAbstract<Event> {\n private static __instance: FastaDataEventBusService;\n\n\n private constructor() {\n super();\n }\n\n public static getInstance(): FastaDataEventBusService {\n FastaDataEventBusService.__instance = HmrUtil.getHmrSingleton('fastaDataEventBusService', FastaDataEventBusService.__instance, () => new FastaDataEventBusService());\n return FastaDataEventBusService.__instance;\n }\n}\n"],"mappings":";;;AASA,IAAaA,IAAb,MAAaA,UAAiCC,EAAwB;CACpE,OAAe;CAGf,cAAsB;EACpB,MAAM;CACR;CAEA,OAAc,cAAwC;EAEpD,OADA,EAAyB,aAAaC,EAAQ,gBAAgB,4BAA4BF,EAAyB,kBAAkB,IAAIA,EAAyB,CAAC,GAC5JA,EAAyB;CAClC;AACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { WithDialogRefMethods, WithDialogRenderProps } from '@gen-epix/ui-core-components/hoc/withDialog';
|
|
2
|
+
import { DialogAction } from '@gen-epix/ui-core-components/components/Dialog';
|
|
3
|
+
export interface FastaDataImportDialogOpenProps {
|
|
4
|
+
initialErrorMessage?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface FastaDataImportDialogProps extends WithDialogRenderProps<FastaDataImportDialogOpenProps> {
|
|
7
|
+
extraActions?: DialogAction[];
|
|
8
|
+
onDataChange: (fasta: string, metaData?: string) => void;
|
|
9
|
+
onError: (error: unknown) => void;
|
|
10
|
+
}
|
|
11
|
+
export type FastaDataImportDialogRefMethods = WithDialogRefMethods<FastaDataImportDialogProps, FastaDataImportDialogOpenProps>;
|
|
12
|
+
export declare const FastaDataImportDialog: import('react').ComponentClass<FastaDataImportDialogProps, import('@gen-epix/ui-core-components/hoc/withDialog').WithDialogState<FastaDataImportDialogOpenProps>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { t as FastaDataImportDialog } from "../../_chunks/FastaDataImportDialog.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DialogAction } from '@gen-epix/ui-core-components/components/Dialog';
|
|
2
|
+
import { StoreApi } from 'zustand';
|
|
3
|
+
import { FastaDataStore } from '../../stores/fastaDataStore';
|
|
4
|
+
export type FastaDataImportDialogLoaderProps = {
|
|
5
|
+
extraActions: DialogAction[];
|
|
6
|
+
store: StoreApi<FastaDataStore>;
|
|
7
|
+
};
|
|
8
|
+
export declare const FastaDataImportDialogLoader: ({ extraActions, store }: FastaDataImportDialogLoaderProps) => import('react').JSX.Element;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { UrlUtil as e } from "../../utils/UrlUtil/index.js";
|
|
2
|
+
import { ErrorUtil as t } from "../../utils/ErrorUtil/index.js";
|
|
3
|
+
import { LOADING_STATUS as n } from "../../models/fasta.js";
|
|
4
|
+
import { FastaDataEventBusService as r } from "../../classes/services/FastaDataEventBusService/index.js";
|
|
5
|
+
import { t as i } from "../../_chunks/react.js";
|
|
6
|
+
import { t as a } from "../../_chunks/FastaDataImportDialog.js";
|
|
7
|
+
import { Fragment as o, jsx as s } from "react/jsx-runtime";
|
|
8
|
+
import { useCallback as c, useEffect as l, useRef as u } from "react";
|
|
9
|
+
//#region src/components/FastaDataImportDialogLoader/FastaDataImportDialogLoader.tsx
|
|
10
|
+
var d = ({ extraActions: d, store: f }) => {
|
|
11
|
+
let p = i(f, (e) => e.setData), m = i(f, (e) => e.setLoadingStatus), h = u(null);
|
|
12
|
+
l(() => {
|
|
13
|
+
let e = [r.getInstance().addEventListener("onShowImportDialog", (e) => {
|
|
14
|
+
h.current?.open(e ? { initialErrorMessage: e } : void 0);
|
|
15
|
+
}), r.getInstance().addEventListener("onCloseImportDialog", () => {
|
|
16
|
+
h.current?.close();
|
|
17
|
+
})];
|
|
18
|
+
return () => {
|
|
19
|
+
e.forEach((e) => e());
|
|
20
|
+
};
|
|
21
|
+
}, []), l(() => {
|
|
22
|
+
let e = new URLSearchParams(window.location.search), t = e.get("input-fasta"), i = e.get("input-metadata");
|
|
23
|
+
(async () => {
|
|
24
|
+
if (t) {
|
|
25
|
+
m(n.LOADING);
|
|
26
|
+
try {
|
|
27
|
+
let e = await fetch(t);
|
|
28
|
+
if (!e.ok) throw Error(`FASTA fetch failed (${e.status})`);
|
|
29
|
+
let r = await e.text();
|
|
30
|
+
if (!r.trim()) throw m(n.ERROR), Error("The input-fasta URL returned no sequence data. Check that the URL and requested accession(s) are correct.");
|
|
31
|
+
let a;
|
|
32
|
+
if (i) try {
|
|
33
|
+
let e = await fetch(i);
|
|
34
|
+
e.ok && (a = await e.text());
|
|
35
|
+
} catch (e) {
|
|
36
|
+
console.warn("[App] Failed to auto-fetch metadata:", e);
|
|
37
|
+
}
|
|
38
|
+
await p(r, a);
|
|
39
|
+
} catch (e) {
|
|
40
|
+
console.error("[App] Failed to auto-load FASTA:", e);
|
|
41
|
+
let t = e instanceof Error ? e.message : "Failed to auto-load FASTA from the provided URL.";
|
|
42
|
+
r.getInstance().emit("onShowImportDialog", t);
|
|
43
|
+
}
|
|
44
|
+
} else r.getInstance().emit("onShowImportDialog");
|
|
45
|
+
})();
|
|
46
|
+
}, [p, m]);
|
|
47
|
+
let g = c((e) => {
|
|
48
|
+
h.current?.close(), r.getInstance().emit("onShowImportDialog", e);
|
|
49
|
+
}, []), _ = c(async (n, r) => {
|
|
50
|
+
try {
|
|
51
|
+
await p(n, r), h.current?.close();
|
|
52
|
+
} catch (e) {
|
|
53
|
+
g(t.getErrorMessage(e, "Unknown error"));
|
|
54
|
+
} finally {
|
|
55
|
+
e.clearSearchParams();
|
|
56
|
+
}
|
|
57
|
+
}, [g, p]), v = c((e) => {
|
|
58
|
+
g(t.getErrorMessage(e, "Unknown error"));
|
|
59
|
+
}, [g]);
|
|
60
|
+
return /* @__PURE__ */ s(o, { children: /* @__PURE__ */ s(a, {
|
|
61
|
+
extraActions: d,
|
|
62
|
+
onDataChange: _,
|
|
63
|
+
onError: v,
|
|
64
|
+
ref: h
|
|
65
|
+
}) });
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
export { d as FastaDataImportDialogLoader };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_Fragment","useStore","FastaDataImportDialog","FastaDataImportDialogLoader","setData","store","state","setLoadingStatus","fastaDataImportDialogRef","useRef","useEffect","removers","FastaDataEventBusService","initialErrorMessage","remove","urlParams","inputFastaUrl","inputMetadataUrl","LOADING_STATUS","fastaRes","fastaText","metaText","metaRes","metaErr","fastaErr","message","handleError","useCallback","errorMessage","onDataChange","fastaContent","metadataContent","ErrorUtil","onError","Fragment"],"sources":["../../../src/components/FastaDataImportDialogLoader/FastaDataImportDialogLoader.tsx"],"sourcesContent":["import type { DialogAction } from '@gen-epix/ui-core-components/components/Dialog';\nimport {\n useCallback,\n useEffect,\n useRef,\n} from 'react';\nimport type { StoreApi } from 'zustand';\nimport { useStore } from 'zustand';\n\nimport { FastaDataEventBusService } from '../../classes/services/FastaDataEventBusService';\nimport { LOADING_STATUS } from '../../models/fasta';\nimport type { FastaDataStore } from '../../stores/fastaDataStore';\nimport { UrlUtil } from '../../utils/UrlUtil';\nimport type { FastaDataImportDialogRefMethods } from '../FastaDataImportDialog/FastaDataImportDialog';\nimport { FastaDataImportDialog } from '../FastaDataImportDialog/FastaDataImportDialog';\nimport { ErrorUtil } from '../../utils/ErrorUtil';\n\n\nexport type FastaDataImportDialogLoaderProps = {\n extraActions: DialogAction[];\n store: StoreApi<FastaDataStore>;\n};\n\nexport const FastaDataImportDialogLoader = ({ extraActions, store }: FastaDataImportDialogLoaderProps) => {\n const setData = useStore(store, (state) => state.setData);\n const setLoadingStatus = useStore(store, (state) => state.setLoadingStatus);\n const fastaDataImportDialogRef = useRef<FastaDataImportDialogRefMethods>(null);\n\n useEffect(() => {\n const removers = [\n // eslint-disable-next-line @eslint-react/web-api-no-leaked-event-listener\n FastaDataEventBusService.getInstance().addEventListener('onShowImportDialog', (initialErrorMessage?: string) => {\n fastaDataImportDialogRef.current?.open(initialErrorMessage ? { initialErrorMessage } : undefined);\n }),\n // eslint-disable-next-line @eslint-react/web-api-no-leaked-event-listener\n FastaDataEventBusService.getInstance().addEventListener('onCloseImportDialog', () => {\n fastaDataImportDialogRef.current?.close();\n }),\n ];\n return () => {\n removers.forEach((remove) => remove());\n };\n }, []);\n\n useEffect(() => {\n // Scan URL parameters for deep-linking\n const urlParams = new URLSearchParams(window.location.search);\n const inputFastaUrl = urlParams.get('input-fasta');\n const inputMetadataUrl = urlParams.get('input-metadata');\n\n const handleDeepLinking = async () => {\n if (inputFastaUrl) {\n setLoadingStatus(LOADING_STATUS.LOADING);\n try {\n const fastaRes = await fetch(inputFastaUrl);\n if (!fastaRes.ok) {\n throw new Error(`FASTA fetch failed (${fastaRes.status})`);\n }\n const fastaText = await fastaRes.text();\n\n if (!fastaText.trim()) {\n setLoadingStatus(LOADING_STATUS.ERROR);\n throw new Error('The input-fasta URL returned no sequence data. Check that the URL and requested accession(s) are correct.');\n }\n\n let metaText: string | undefined;\n if (inputMetadataUrl) {\n try {\n const metaRes = await fetch(inputMetadataUrl);\n if (metaRes.ok) {\n metaText = await metaRes.text();\n }\n } catch (metaErr) {\n console.warn('[App] Failed to auto-fetch metadata:', metaErr);\n }\n }\n\n await setData(fastaText, metaText);\n } catch (fastaErr) {\n console.error('[App] Failed to auto-load FASTA:', fastaErr);\n const message = fastaErr instanceof Error ? fastaErr.message : 'Failed to auto-load FASTA from the provided URL.';\n FastaDataEventBusService.getInstance().emit('onShowImportDialog', message);\n }\n } else {\n // PV1-02: Show data loading modal if no data provided via URL query params\n FastaDataEventBusService.getInstance().emit('onShowImportDialog');\n }\n };\n\n void handleDeepLinking();\n }, [setData, setLoadingStatus]);\n\n const handleError = useCallback((errorMessage: string) => {\n fastaDataImportDialogRef.current?.close();\n FastaDataEventBusService.getInstance().emit('onShowImportDialog', errorMessage);\n }, []);\n\n const onDataChange = useCallback(async (fastaContent: string, metadataContent?: string) => {\n try {\n await setData(fastaContent, metadataContent);\n fastaDataImportDialogRef.current?.close();\n } catch (e) {\n handleError(ErrorUtil.getErrorMessage(e, 'Unknown error'));\n } finally {\n // clear any search params from the URL\n UrlUtil.clearSearchParams();\n }\n }, [handleError, setData]);\n\n const onError = useCallback((errorMessage: unknown) => {\n handleError(ErrorUtil.getErrorMessage(errorMessage, 'Unknown error'));\n }, [handleError]);\n\n return (\n <>\n <FastaDataImportDialog\n extraActions={extraActions}\n onDataChange={onDataChange}\n onError={onError}\n ref={fastaDataImportDialogRef}\n />\n </>\n );\n};\n"],"mappings":";;;;;;;;;AAuBA,IAAaG,KAA+B,EAAE,iBAAc,eAA8C;CACxG,IAAMC,IAAUH,EAASI,IAAQ,MAAUC,EAAM,OAAO,GAClDC,IAAmBN,EAASI,IAAQ,MAAUC,EAAM,gBAAgB,GACpEE,IAA2BC,EAAwC,IAAI;CAkB7E,AAhBAC,QAAgB;EACd,IAAMC,IAAW,CAEfC,EAAyB,YAAY,CAAC,CAAC,iBAAiB,uBAAuB,MAAiC;GAC9G,EAAyB,SAAS,KAAKC,IAAsB,EAAE,uBAAoB,IAAI,KAAA,CAAS;EAClG,CAAC,GAEDD,EAAyB,YAAY,CAAC,CAAC,iBAAiB,6BAA6B;GACnF,EAAyB,SAAS,MAAM;EAC1C,CAAC,CACH;EACA,aAAa;GACX,EAAS,SAAS,MAAWE,EAAO,CAAC;EACvC;CACF,GAAG,CAAC,CAAC,GAELJ,QAAgB;EAEd,IAAMK,IAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM,GACtDC,IAAgBD,EAAU,IAAI,aAAa,GAC3CE,IAAmBF,EAAU,IAAI,gBAAgB;EAyCvD,aAvCsC;GACpC,IAAIC,GAAe;IACjB,EAAiBE,EAAe,OAAO;IACvC,IAAI;KACF,IAAMC,IAAW,MAAM,MAAMH,CAAa;KAC1C,IAAI,CAACG,EAAS,IACZ,MAAU,MAAM,uBAAuBA,EAAS,OAAO,EAAE;KAE3D,IAAMC,IAAY,MAAMD,EAAS,KAAK;KAEtC,IAAI,CAACC,EAAU,KAAK,GAElB,MADAb,EAAiBW,EAAe,KAAK,GAC3B,MAAM,2GAA2G;KAG7H,IAAIG;KACJ,IAAIJ,GACF,IAAI;MACF,IAAMK,IAAU,MAAM,MAAML,CAAgB;MAC5C,AAAIK,EAAQ,OACV,IAAW,MAAMA,EAAQ,KAAK;KAElC,SAASC,GAAS;MAChB,QAAQ,KAAK,wCAAwCA,CAAO;KAC9D;KAGF,MAAMnB,EAAQgB,GAAWC,CAAQ;IACnC,SAASG,GAAU;KACjB,QAAQ,MAAM,oCAAoCA,CAAQ;KAC1D,IAAMC,IAAUD,aAAoB,QAAQA,EAAS,UAAU;KAC/D,EAAyB,YAAY,CAAC,CAAC,KAAK,sBAAsBC,CAAO;IAC3E;GACF,OAEE,EAAyB,YAAY,CAAC,CAAC,KAAK,oBAAoB;EAEpE,EAEK,CAAkB;CACzB,GAAG,CAACrB,GAASG,CAAgB,CAAC;CAE9B,IAAMmB,IAAcC,GAAa,MAAyB;EAExD,AADAnB,EAAyB,SAAS,MAAM,GACxCI,EAAyB,YAAY,CAAC,CAAC,KAAK,sBAAsBgB,CAAY;CAChF,GAAG,CAAC,CAAC,GAECC,IAAeF,EAAY,OAAO,GAAsB,MAA6B;EACzF,IAAI;GAEF,AADA,MAAMvB,EAAQ0B,GAAcC,CAAe,GAC3CvB,EAAyB,SAAS,MAAM;EAC1C,SAAS,GAAG;GACV,EAAYwB,EAAU,gBAAgB,GAAG,eAAe,CAAC;EAC3D,UAAU;GAER,EAAQ,kBAAkB;EAC5B;CACF,GAAG,CAACN,GAAatB,CAAO,CAAC,GAEnB6B,IAAUN,GAAa,MAA0B;EACrD,EAAYK,EAAU,gBAAgBJ,GAAc,eAAe,CAAC;CACtE,GAAG,CAACF,CAAW,CAAC;CAEhB,OACE,kBAAA1B,GAAA,EAAA,UACE,kBAACE,GAAD;EACgB;EACA;EACL;EACT,KAAKM;CACN,CAAA,EACD,CAAA;AAEN"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { FastaDataEventBusService as e } from "../../classes/services/FastaDataEventBusService/index.js";
|
|
2
|
+
import { Box as t, Button as n, Typography as r } from "@mui/material";
|
|
3
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
4
|
+
import { useCallback as o } from "react";
|
|
5
|
+
import s from "@mui/icons-material/FileUploadOutlined";
|
|
6
|
+
//#region src/components/FastaNotLoaded/FastaNotLoaded.tsx
|
|
7
|
+
var c = ({ description: c, icon: l, title: u }) => {
|
|
8
|
+
let d = o(() => {
|
|
9
|
+
e.getInstance().emit("onShowImportDialog");
|
|
10
|
+
}, []);
|
|
11
|
+
return /* @__PURE__ */ a(t, {
|
|
12
|
+
sx: {
|
|
13
|
+
alignItems: "center",
|
|
14
|
+
display: "flex",
|
|
15
|
+
flexDirection: "column",
|
|
16
|
+
gap: 2,
|
|
17
|
+
height: "100%",
|
|
18
|
+
justifyContent: "center",
|
|
19
|
+
p: 3,
|
|
20
|
+
width: "100%"
|
|
21
|
+
},
|
|
22
|
+
children: [
|
|
23
|
+
l,
|
|
24
|
+
/* @__PURE__ */ i(r, {
|
|
25
|
+
color: "text.secondary",
|
|
26
|
+
sx: { fontWeight: 600 },
|
|
27
|
+
variant: "h6",
|
|
28
|
+
children: u
|
|
29
|
+
}),
|
|
30
|
+
/* @__PURE__ */ i(r, {
|
|
31
|
+
color: "text.secondary",
|
|
32
|
+
sx: {
|
|
33
|
+
maxWidth: 450,
|
|
34
|
+
textAlign: "center"
|
|
35
|
+
},
|
|
36
|
+
variant: "body2",
|
|
37
|
+
children: c
|
|
38
|
+
}),
|
|
39
|
+
/* @__PURE__ */ i(n, {
|
|
40
|
+
color: "primary",
|
|
41
|
+
onClick: d,
|
|
42
|
+
startIcon: /* @__PURE__ */ i(s, {}),
|
|
43
|
+
sx: { mt: 1 },
|
|
44
|
+
variant: "contained",
|
|
45
|
+
children: "Load Data"
|
|
46
|
+
})
|
|
47
|
+
]
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
//#endregion
|
|
51
|
+
export { c as FastaNotLoaded };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["FileUploadOutlinedIcon","FastaNotLoaded","onClickLoadData","useCallback","Box","icon","Typography","title","description","Button"],"sources":["../../../src/components/FastaNotLoaded/FastaNotLoaded.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Typography,\n} from '@mui/material';\nimport FileUploadOutlinedIcon from '@mui/icons-material/FileUploadOutlined';\nimport type { ReactNode } from 'react';\nimport { useCallback } from 'react';\n\nimport { FastaDataEventBusService } from '../../classes/services/FastaDataEventBusService';\n\nexport type FastaNotLoadedProps = {\n description: ReactNode;\n icon: ReactNode;\n title: ReactNode;\n};\n\nexport const FastaNotLoaded = ({ description, icon, title }: FastaNotLoadedProps) => {\n const onClickLoadData = useCallback(() => {\n FastaDataEventBusService.getInstance().emit('onShowImportDialog');\n }, []);\n\n return (\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n height: '100%',\n justifyContent: 'center',\n p: 3,\n width: '100%',\n }}\n >\n {icon}\n <Typography\n color={'text.secondary'}\n sx={{ fontWeight: 600 }}\n variant={'h6'}\n >\n {title}\n </Typography>\n <Typography\n color={'text.secondary'}\n sx={{ maxWidth: 450, textAlign: 'center' }}\n variant={'body2'}\n >\n {description}\n </Typography>\n <Button\n color={'primary'}\n onClick={onClickLoadData}\n startIcon={<FileUploadOutlinedIcon />}\n sx={{ mt: 1 }}\n variant={'contained'}\n >\n {'Load Data'}\n </Button>\n </Box>\n );\n};\n"],"mappings":";;;;;;AAiBA,IAAaC,KAAkB,EAAE,gBAAa,SAAM,eAAiC;CACnF,IAAMC,IAAkBC,QAAkB;EACxC,EAAyB,YAAY,CAAC,CAAC,KAAK,oBAAoB;CAClE,GAAG,CAAC,CAAC;CAEL,OACE,kBAACC,GAAD;EACE,IAAI;GACF,YAAY;GACZ,SAAS;GACT,eAAe;GACf,KAAK;GACL,QAAQ;GACR,gBAAgB;GAChB,GAAG;GACH,OAAO;EACT;EAVF,UAAA;GAYGC;GACD,kBAACC,GAAD;IACE,OAAO;IACP,IAAI,EAAE,YAAY,IAAI;IACtB,SAAS;IAER,UAAAC;GACS,CAAA;GACZ,kBAACD,GAAD;IACE,OAAO;IACP,IAAI;KAAE,UAAU;KAAK,WAAW;IAAS;IACzC,SAAS;IAER,UAAAE;GACS,CAAA;GACZ,kBAACC,GAAD;IACE,OAAO;IACP,SAASP;IACT,WAAW,kBAACF,GAAD,CAAyB,CAAA;IACpC,IAAI,EAAE,IAAI,EAAE;IACZ,SAAS;IAER,UAAA;GACK,CAAA;EACL;;AAET"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { StoreApi } from 'zustand';
|
|
2
|
+
import { FastaDataStore } from '../../stores/fastaDataStore';
|
|
3
|
+
export type FastaPageHeaderCenterComponentProps = {
|
|
4
|
+
store: StoreApi<FastaDataStore>;
|
|
5
|
+
};
|
|
6
|
+
export declare const FastaPageHeaderCenterComponent: ({ store }: FastaPageHeaderCenterComponentProps) => import('react').JSX.Element;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { t as e } from "../../_chunks/react.js";
|
|
2
|
+
import { Box as t, Chip as n } from "@mui/material";
|
|
3
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/FastaPageHeaderCenterComponent/FastaPageHeaderCenterComponent.tsx
|
|
5
|
+
var a = ({ store: a }) => {
|
|
6
|
+
let o = e(a, (e) => e.parsedFasta), s = e(a, (e) => e.parsedMetadata), c = o?.sequences?.length || 0, l = s?.records?.length || 0;
|
|
7
|
+
return /* @__PURE__ */ i(t, {
|
|
8
|
+
sx: {
|
|
9
|
+
alignItems: "center",
|
|
10
|
+
display: "flex",
|
|
11
|
+
gap: 1
|
|
12
|
+
},
|
|
13
|
+
children: [c > 0 && /* @__PURE__ */ r(n, {
|
|
14
|
+
label: `${c} Sequences`,
|
|
15
|
+
size: "small",
|
|
16
|
+
sx: {
|
|
17
|
+
backgroundColor: "rgba(255, 255, 255, 0.2)",
|
|
18
|
+
color: "#FFFFFF",
|
|
19
|
+
fontSize: "0.75rem",
|
|
20
|
+
fontWeight: 600
|
|
21
|
+
}
|
|
22
|
+
}), l > 0 && /* @__PURE__ */ r(n, {
|
|
23
|
+
label: `${l} Metadata Records`,
|
|
24
|
+
size: "small",
|
|
25
|
+
sx: {
|
|
26
|
+
backgroundColor: "rgba(255, 255, 255, 0.2)",
|
|
27
|
+
color: "#FFFFFF",
|
|
28
|
+
fontSize: "0.75rem",
|
|
29
|
+
fontWeight: 600
|
|
30
|
+
}
|
|
31
|
+
})]
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
//#endregion
|
|
35
|
+
export { a as FastaPageHeaderCenterComponent };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["useStore","FastaPageHeaderCenterComponent","parsedFasta","store","state","parsedMetadata","seqCount","metaCount","Box","Chip"],"sources":["../../../src/components/FastaPageHeaderCenterComponent/FastaPageHeaderCenterComponent.tsx"],"sourcesContent":["import {\n Box,\n Chip,\n} from '@mui/material';\nimport type { StoreApi } from 'zustand';\nimport { useStore } from 'zustand';\n\nimport type { FastaDataStore } from '../../stores/fastaDataStore';\n\n\nexport type FastaPageHeaderCenterComponentProps = {\n store: StoreApi<FastaDataStore>;\n};\n\nexport const FastaPageHeaderCenterComponent = ({ store }: FastaPageHeaderCenterComponentProps) => {\n const parsedFasta = useStore(store, (state) => state.parsedFasta);\n const parsedMetadata = useStore(store, (state) => state.parsedMetadata);\n\n const seqCount = parsedFasta?.sequences?.length || 0;\n const metaCount = parsedMetadata?.records?.length || 0;\n\n return (\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1 }}>\n {seqCount > 0 && (\n <Chip\n label={`${seqCount} Sequences`}\n size={'small'}\n sx={{\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n color: '#FFFFFF',\n fontSize: '0.75rem',\n fontWeight: 600,\n }}\n />\n )}\n {metaCount > 0 && (\n <Chip\n label={`${metaCount} Metadata Records`}\n size={'small'}\n sx={{\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n color: '#FFFFFF',\n fontSize: '0.75rem',\n fontWeight: 600,\n }}\n />\n )}\n </Box>\n );\n};\n"],"mappings":";;;;AAcA,IAAaC,KAAkC,EAAE,eAAiD;CAChG,IAAMC,IAAcF,EAASG,IAAQ,MAAUC,EAAM,WAAW,GAC1DC,IAAiBL,EAASG,IAAQ,MAAUC,EAAM,cAAc,GAEhEE,IAAWJ,GAAa,WAAW,UAAU,GAC7CK,IAAYF,GAAgB,SAAS,UAAU;CAErD,OACE,kBAACG,GAAD;EAAK,IAAI;GAAE,YAAY;GAAU,SAAS;GAAQ,KAAK;EAAE;EAAzD,UAAA,CACGF,IAAW,KACV,kBAACG,GAAD;GACE,OAAO,GAAGH,EAAS;GACnB,MAAM;GACN,IAAI;IACF,iBAAiB;IACjB,OAAO;IACP,UAAU;IACV,YAAY;GACd;EACD,CAAA,GAEFC,IAAY,KACX,kBAACE,GAAD;GACE,OAAO,GAAGF,EAAU;GACpB,MAAM;GACN,IAAI;IACF,iBAAiB;IACjB,OAAO;IACP,UAAU;IACV,YAAY;GACd;EACD,CAAA,CAEA;;AAET"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const FastaPageHeaderImportButton: () => import('react').JSX.Element;
|