@rivm-loculus-tools/common-frontend 0.1.0 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/_chunks/FastaDataImportDialog.js +309 -0
  2. package/dist/_chunks/FastaDataImportDialog.js.map +1 -0
  3. package/dist/_chunks/react.js +11 -0
  4. package/dist/_chunks/react.js.map +1 -0
  5. package/dist/classes/services/FastaDataEventBusService/FastaDataEventBusService.d.ts +10 -0
  6. package/dist/classes/services/FastaDataEventBusService/index.js +16 -0
  7. package/dist/classes/services/FastaDataEventBusService/index.js.map +1 -0
  8. package/dist/components/FastaDataImportDialog/FastaDataImportDialog.d.ts +12 -0
  9. package/dist/components/FastaDataImportDialog/index.js +2 -0
  10. package/dist/components/FastaDataImportDialogLoader/FastaDataImportDialogLoader.d.ts +8 -0
  11. package/dist/components/FastaDataImportDialogLoader/index.js +70 -0
  12. package/dist/components/FastaDataImportDialogLoader/index.js.map +1 -0
  13. package/dist/components/FastaNotLoaded/FastaNotLoaded.d.ts +7 -0
  14. package/dist/components/FastaNotLoaded/index.js +53 -0
  15. package/dist/components/FastaNotLoaded/index.js.map +1 -0
  16. package/dist/components/FastaPageHeaderCenterComponent/FastaPageHeaderCenterComponent.d.ts +6 -0
  17. package/dist/components/FastaPageHeaderCenterComponent/index.js +37 -0
  18. package/dist/components/FastaPageHeaderCenterComponent/index.js.map +1 -0
  19. package/dist/components/FastaPageHeaderImportButton/FastaPageHeaderImportButton.d.ts +1 -0
  20. package/dist/components/FastaPageHeaderImportButton/index.js +26 -0
  21. package/dist/components/FastaPageHeaderImportButton/index.js.map +1 -0
  22. package/dist/components/FastaPageHeaderResetButton/FastaPageHeaderResetButton.d.ts +4 -0
  23. package/dist/components/FastaPageHeaderResetButton/index.js +35 -0
  24. package/dist/components/FastaPageHeaderResetButton/index.js.map +1 -0
  25. package/dist/components/I18nWrapper/I18nWrapper.d.ts +4 -0
  26. package/dist/components/I18nWrapper/index.js +21 -0
  27. package/dist/components/I18nWrapper/index.js.map +1 -0
  28. package/dist/components/PageHeaderDocumentationButton/PageHeaderDocumentationButton.d.ts +1 -0
  29. package/dist/components/PageHeaderDocumentationButton/index.js +24 -0
  30. package/dist/components/PageHeaderDocumentationButton/index.js.map +1 -0
  31. package/dist/components/SearchBar/SearchBar.d.ts +10 -0
  32. package/dist/components/SearchBar/SearchBarNodeCounter.d.ts +4 -0
  33. package/dist/components/SearchBar/index.js +129 -0
  34. package/dist/components/SearchBar/index.js.map +1 -0
  35. package/dist/components/page/ErrorPageCommon.d.ts +4 -0
  36. package/dist/components/page/PageCommon.d.ts +8 -0
  37. package/dist/components/page/PageCommonContext.d.ts +7 -0
  38. package/dist/components/page/PageCommonContextProvider.d.ts +3 -0
  39. package/dist/components/page/PageCommonDrawer.d.ts +5 -0
  40. package/dist/components/page/PageCommonHeader.d.ts +8 -0
  41. package/dist/components/page/index.js +207 -0
  42. package/dist/components/page/index.js.map +1 -0
  43. package/dist/constants/page.d.ts +1 -0
  44. package/dist/constants/page.js +6 -0
  45. package/dist/constants/page.js.map +1 -0
  46. package/dist/models/fasta.d.ts +23 -0
  47. package/dist/models/fasta.js +8 -0
  48. package/dist/models/fasta.js.map +1 -0
  49. package/dist/models/metadata.d.ts +9 -0
  50. package/dist/stores/fastaDataStore/fastaDataStore.d.ts +32 -0
  51. package/dist/stores/fastaDataStore/index.js +57 -0
  52. package/dist/stores/fastaDataStore/index.js.map +1 -0
  53. package/dist/theme/index.js +257 -0
  54. package/dist/theme/index.js.map +1 -0
  55. package/dist/theme/theme.d.ts +1 -0
  56. package/dist/utils/DownloadUtil/DownloadUtil.d.ts +3 -0
  57. package/dist/utils/DownloadUtil/index.js +10 -0
  58. package/dist/utils/DownloadUtil/index.js.map +1 -0
  59. package/dist/utils/ErrorUtil/ErrorUtil.d.ts +3 -0
  60. package/dist/utils/ErrorUtil/index.js +10 -0
  61. package/dist/utils/ErrorUtil/index.js.map +1 -0
  62. package/dist/utils/FastaUtil/FastaUtil.d.ts +6 -0
  63. package/dist/utils/FastaUtil/index.js +63 -0
  64. package/dist/utils/FastaUtil/index.js.map +1 -0
  65. package/dist/utils/MetaDataUtil/MetaDataUtil.d.ts +20 -0
  66. package/dist/utils/MetaDataUtil/index.js +133 -0
  67. package/dist/utils/MetaDataUtil/index.js.map +1 -0
  68. package/dist/utils/UrlUtil/UrlUtil.d.ts +5 -0
  69. package/dist/utils/UrlUtil/index.js +30 -0
  70. package/dist/utils/UrlUtil/index.js.map +1 -0
  71. package/package.json +10 -7
  72. package/CHANGELOG.md +0 -8
  73. package/eslint.config.js +0 -16
  74. package/scripts/update-exports.js +0 -9
  75. package/src/classes/services/FastaDataEventBusService/FastaDataEventBusService.ts +0 -22
  76. package/src/components/FastaDataImportDialog/FastaDataImportDialog.tsx +0 -364
  77. package/src/components/FastaDataImportDialogLoader/FastaDataImportDialogLoader.tsx +0 -124
  78. package/src/components/FastaNotLoaded/FastaNotLoaded.tsx +0 -62
  79. package/src/components/FastaPageHeaderCenterComponent/FastaPageHeaderCenterComponent.tsx +0 -50
  80. package/src/components/FastaPageHeaderImportButton/FastaPageHeaderImportButton.tsx +0 -28
  81. package/src/components/FastaPageHeaderResetButton/FastaPageHeaderResetButton.tsx +0 -50
  82. package/src/components/I18nWrapper/I18nWrapper.tsx +0 -39
  83. package/src/components/PageHeaderDocumentationButton/PageHeaderDocumentationButton.tsx +0 -25
  84. package/src/components/SearchBar/SearchBar.tsx +0 -207
  85. package/src/components/SearchBar/SearchBarNodeCounter.tsx +0 -23
  86. package/src/components/page/ErrorPageCommon.tsx +0 -51
  87. package/src/components/page/PageCommon.tsx +0 -76
  88. package/src/components/page/PageCommonContext.ts +0 -15
  89. package/src/components/page/PageCommonContextProvider.tsx +0 -30
  90. package/src/components/page/PageCommonDrawer.tsx +0 -35
  91. package/src/components/page/PageCommonHeader.tsx +0 -99
  92. package/src/constants/page.ts +0 -1
  93. package/src/index.ts +0 -21
  94. package/src/models/fasta.ts +0 -22
  95. package/src/models/metadata.ts +0 -10
  96. package/src/stores/fastaDataStore/fastaDataStore.ts +0 -103
  97. package/src/theme/fonts/RobotoFlex.woff2 +0 -0
  98. package/src/theme/theme.ts +0 -368
  99. package/src/utils/DownloadUtil/DownloadUtil.ts +0 -10
  100. package/src/utils/ErrorUtil/ErrorUtil.ts +0 -5
  101. package/src/utils/FastaUtil/FastaUtil.ts +0 -109
  102. package/src/utils/MetaDataUtil/MetaDataUtil.ts +0 -292
  103. package/src/utils/UrlUtil/UrlUtil.ts +0 -35
  104. package/tsconfig.build.json +0 -14
  105. package/tsconfig.json +0 -32
  106. package/vite.config.ts +0 -137
  107. /package/{src → dist}/@types/vite-env.d.ts +0 -0
  108. /package/{src/classes/services/FastaDataEventBusService/index.ts → dist/classes/services/FastaDataEventBusService/index.d.ts} +0 -0
  109. /package/{src/components/FastaDataImportDialog/index.ts → dist/components/FastaDataImportDialog/index.d.ts} +0 -0
  110. /package/{src/components/FastaDataImportDialogLoader/index.ts → dist/components/FastaDataImportDialogLoader/index.d.ts} +0 -0
  111. /package/{src/components/FastaNotLoaded/index.ts → dist/components/FastaNotLoaded/index.d.ts} +0 -0
  112. /package/{src/components/FastaPageHeaderCenterComponent/index.ts → dist/components/FastaPageHeaderCenterComponent/index.d.ts} +0 -0
  113. /package/{src/components/FastaPageHeaderImportButton/index.ts → dist/components/FastaPageHeaderImportButton/index.d.ts} +0 -0
  114. /package/{src/components/FastaPageHeaderResetButton/index.ts → dist/components/FastaPageHeaderResetButton/index.d.ts} +0 -0
  115. /package/{src/components/I18nWrapper/index.ts → dist/components/I18nWrapper/index.d.ts} +0 -0
  116. /package/{src/components/PageHeaderDocumentationButton/index.ts → dist/components/PageHeaderDocumentationButton/index.d.ts} +0 -0
  117. /package/{src/components/SearchBar/index.ts → dist/components/SearchBar/index.d.ts} +0 -0
  118. /package/{src/components/page/index.ts → dist/components/page/index.d.ts} +0 -0
  119. /package/{src/.gitkeep → dist/models/metadata.js} +0 -0
  120. /package/{src/stores/fastaDataStore/index.ts → dist/stores/fastaDataStore/index.d.ts} +0 -0
  121. /package/{src/theme/index.ts → dist/theme/index.d.ts} +0 -0
  122. /package/{src/utils/DownloadUtil/index.ts → dist/utils/DownloadUtil/index.d.ts} +0 -0
  123. /package/{src/utils/ErrorUtil/index.ts → dist/utils/ErrorUtil/index.d.ts} +0 -0
  124. /package/{src/utils/FastaUtil/index.ts → dist/utils/FastaUtil/index.d.ts} +0 -0
  125. /package/{src/utils/MetaDataUtil/index.ts → dist/utils/MetaDataUtil/index.d.ts} +0 -0
  126. /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":[],"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&#10;ACTG...&#10;>seq2&#10;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&#9;Country&#9;Date&#10;Sample1&#9;NL&#9;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":[],"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"],"x_google_ignoreList":[0],"mappings":";;AAGA,IAAM,KAAY,MAAQ;AAC1B,SAAS,EAAS,GAAK,IAAW,GAAU;CAC1C,IAAM,IAAQ,EAAM,qBAClB,EAAI,WACJ,EAAM,kBAAkB,EAAS,EAAI,SAAS,CAAC,GAAG,CAAC,GAAK,CAAQ,CAAC,GACjE,EAAM,kBAAkB,EAAS,EAAI,gBAAgB,CAAC,GAAG,CAAC,GAAK,CAAQ,CAAC,CAC1E;CAEA,OADA,EAAM,cAAc,CAAK,GAClB;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":[],"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,IAAa,IAAb,MAAa,UAAiC,EAAwB;CACpE,OAAe;CAGf,cAAsB;EACpB,MAAM;CACR;CAEA,OAAc,cAAwC;EAEpD,OADA,EAAyB,aAAa,EAAQ,gBAAgB,4BAA4B,EAAyB,kBAAkB,IAAI,EAAyB,CAAC,GAC5J,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,2 @@
1
+ import { t as e } from "../../_chunks/FastaDataImportDialog.js";
2
+ export { e as FastaDataImportDialog };
@@ -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":[],"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,IAAa,KAA+B,EAAE,iBAAc,eAA8C;CACxG,IAAM,IAAU,EAAS,IAAQ,MAAU,EAAM,OAAO,GAClD,IAAmB,EAAS,IAAQ,MAAU,EAAM,gBAAgB,GACpE,IAA2B,EAAwC,IAAI;CAkB7E,AAhBA,QAAgB;EACd,IAAM,IAAW,CAEf,EAAyB,YAAY,CAAC,CAAC,iBAAiB,uBAAuB,MAAiC;GAC9G,EAAyB,SAAS,KAAK,IAAsB,EAAE,uBAAoB,IAAI,KAAA,CAAS;EAClG,CAAC,GAED,EAAyB,YAAY,CAAC,CAAC,iBAAiB,6BAA6B;GACnF,EAAyB,SAAS,MAAM;EAC1C,CAAC,CACH;EACA,aAAa;GACX,EAAS,SAAS,MAAW,EAAO,CAAC;EACvC;CACF,GAAG,CAAC,CAAC,GAEL,QAAgB;EAEd,IAAM,IAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM,GACtD,IAAgB,EAAU,IAAI,aAAa,GAC3C,IAAmB,EAAU,IAAI,gBAAgB;EAyCvD,aAvCsC;GACpC,IAAI,GAAe;IACjB,EAAiB,EAAe,OAAO;IACvC,IAAI;KACF,IAAM,IAAW,MAAM,MAAM,CAAa;KAC1C,IAAI,CAAC,EAAS,IACZ,MAAU,MAAM,uBAAuB,EAAS,OAAO,EAAE;KAE3D,IAAM,IAAY,MAAM,EAAS,KAAK;KAEtC,IAAI,CAAC,EAAU,KAAK,GAElB,MADA,EAAiB,EAAe,KAAK,GAC3B,MAAM,2GAA2G;KAG7H,IAAI;KACJ,IAAI,GACF,IAAI;MACF,IAAM,IAAU,MAAM,MAAM,CAAgB;MAC5C,AAAI,EAAQ,OACV,IAAW,MAAM,EAAQ,KAAK;KAElC,SAAS,GAAS;MAChB,QAAQ,KAAK,wCAAwC,CAAO;KAC9D;KAGF,MAAM,EAAQ,GAAW,CAAQ;IACnC,SAAS,GAAU;KACjB,QAAQ,MAAM,oCAAoC,CAAQ;KAC1D,IAAM,IAAU,aAAoB,QAAQ,EAAS,UAAU;KAC/D,EAAyB,YAAY,CAAC,CAAC,KAAK,sBAAsB,CAAO;IAC3E;GACF,OAEE,EAAyB,YAAY,CAAC,CAAC,KAAK,oBAAoB;EAEpE,EAEK,CAAkB;CACzB,GAAG,CAAC,GAAS,CAAgB,CAAC;CAE9B,IAAM,IAAc,GAAa,MAAyB;EAExD,AADA,EAAyB,SAAS,MAAM,GACxC,EAAyB,YAAY,CAAC,CAAC,KAAK,sBAAsB,CAAY;CAChF,GAAG,CAAC,CAAC,GAEC,IAAe,EAAY,OAAO,GAAsB,MAA6B;EACzF,IAAI;GAEF,AADA,MAAM,EAAQ,GAAc,CAAe,GAC3C,EAAyB,SAAS,MAAM;EAC1C,SAAS,GAAG;GACV,EAAY,EAAU,gBAAgB,GAAG,eAAe,CAAC;EAC3D,UAAU;GAER,EAAQ,kBAAkB;EAC5B;CACF,GAAG,CAAC,GAAa,CAAO,CAAC,GAEnB,IAAU,GAAa,MAA0B;EACrD,EAAY,EAAU,gBAAgB,GAAc,eAAe,CAAC;CACtE,GAAG,CAAC,CAAW,CAAC;CAEhB,OACE,kBAAA,GAAA,EAAA,UACE,kBAAC,GAAD;EACgB;EACA;EACL;EACT,KAAK;CACN,CAAA,EACD,CAAA;AAEN"}
@@ -0,0 +1,7 @@
1
+ import { ReactNode } from 'react';
2
+ export type FastaNotLoadedProps = {
3
+ description: ReactNode;
4
+ icon: ReactNode;
5
+ title: ReactNode;
6
+ };
7
+ export declare const FastaNotLoaded: ({ description, icon, title }: FastaNotLoadedProps) => import('react').JSX.Element;
@@ -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":[],"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,IAAa,KAAkB,EAAE,gBAAa,SAAM,eAAiC;CACnF,IAAM,IAAkB,QAAkB;EACxC,EAAyB,YAAY,CAAC,CAAC,KAAK,oBAAoB;CAClE,GAAG,CAAC,CAAC;CAEL,OACE,kBAAC,GAAD;EACE,IAAI;GACF,YAAY;GACZ,SAAS;GACT,eAAe;GACf,KAAK;GACL,QAAQ;GACR,gBAAgB;GAChB,GAAG;GACH,OAAO;EACT;EAVF,UAAA;GAYG;GACD,kBAAC,GAAD;IACE,OAAO;IACP,IAAI,EAAE,YAAY,IAAI;IACtB,SAAS;IAER,UAAA;GACS,CAAA;GACZ,kBAAC,GAAD;IACE,OAAO;IACP,IAAI;KAAE,UAAU;KAAK,WAAW;IAAS;IACzC,SAAS;IAER,UAAA;GACS,CAAA;GACZ,kBAAC,GAAD;IACE,OAAO;IACP,SAAS;IACT,WAAW,kBAAC,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":[],"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,IAAa,KAAkC,EAAE,eAAiD;CAChG,IAAM,IAAc,EAAS,IAAQ,MAAU,EAAM,WAAW,GAC1D,IAAiB,EAAS,IAAQ,MAAU,EAAM,cAAc,GAEhE,IAAW,GAAa,WAAW,UAAU,GAC7C,IAAY,GAAgB,SAAS,UAAU;CAErD,OACE,kBAAC,GAAD;EAAK,IAAI;GAAE,YAAY;GAAU,SAAS;GAAQ,KAAK;EAAE;EAAzD,UAAA,CACG,IAAW,KACV,kBAAC,GAAD;GACE,OAAO,GAAG,EAAS;GACnB,MAAM;GACN,IAAI;IACF,iBAAiB;IACjB,OAAO;IACP,UAAU;IACV,YAAY;GACd;EACD,CAAA,GAEF,IAAY,KACX,kBAAC,GAAD;GACE,OAAO,GAAG,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;