@rivm-loculus-tools/common-frontend 0.1.4 → 0.3.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/EmotionCacheService.js +33 -0
- package/dist/_chunks/EmotionCacheService.js.map +1 -0
- package/dist/_chunks/decorate.js +9 -0
- package/dist/_chunks/react.js.map +1 -1
- package/dist/classes/services/EmotionCacheService/EmotionCacheService.d.ts +7 -0
- package/dist/classes/services/EmotionCacheService/index.d.ts +1 -0
- package/dist/classes/services/EmotionCacheService/index.js +1 -0
- package/dist/classes/services/FastaDataEventBusService/FastaDataEventBusService.d.ts +1 -3
- package/dist/classes/services/FastaDataEventBusService/index.js +6 -8
- package/dist/classes/services/FastaDataEventBusService/index.js.map +1 -1
- package/dist/components/SearchBar/index.js.map +1 -1
- package/dist/components/app/App/App.d.ts +6 -0
- package/dist/components/app/App/index.d.ts +1 -0
- package/dist/components/app/App/index.js +101 -0
- package/dist/components/app/App/index.js.map +1 -0
- package/dist/{_chunks/FastaDataImportDialog.js → components/fasta/FastaDataImportDialog/index.js} +3 -3
- package/dist/components/fasta/FastaDataImportDialog/index.js.map +1 -0
- package/dist/components/{FastaDataImportDialogLoader → fasta/FastaDataImportDialogLoader}/FastaDataImportDialogLoader.d.ts +1 -1
- package/dist/components/fasta/FastaDataImportDialogLoader/index.js +71 -0
- package/dist/components/fasta/FastaDataImportDialogLoader/index.js.map +1 -0
- package/dist/components/fasta/FastaNotLoaded/index.js +54 -0
- package/dist/components/fasta/FastaNotLoaded/index.js.map +1 -0
- package/dist/components/{FastaPageHeaderCenterComponent → fasta/FastaPageHeaderCenterComponent}/FastaPageHeaderCenterComponent.d.ts +1 -1
- package/dist/components/{FastaPageHeaderCenterComponent → fasta/FastaPageHeaderCenterComponent}/index.js +2 -2
- package/dist/components/fasta/FastaPageHeaderCenterComponent/index.js.map +1 -0
- package/dist/components/fasta/FastaPageHeaderImportButton/index.js +27 -0
- package/dist/components/fasta/FastaPageHeaderImportButton/index.js.map +1 -0
- package/dist/components/{FastaPageHeaderResetButton → fasta/FastaPageHeaderResetButton}/index.js +1 -1
- package/dist/components/fasta/FastaPageHeaderResetButton/index.js.map +1 -0
- package/dist/components/ui/GenericErrorMessage/GenericErrorMessage.d.ts +4 -0
- package/dist/components/ui/GenericErrorMessage/index.d.ts +1 -0
- package/dist/components/ui/GenericErrorMessage/index.js +44 -0
- package/dist/components/ui/GenericErrorMessage/index.js.map +1 -0
- package/dist/components/ui/I18nWrapper/index.js +21 -0
- package/dist/components/ui/I18nWrapper/index.js.map +1 -0
- package/dist/components/ui/PageCommon/PageCommon.d.ts +7 -0
- package/dist/components/ui/PageCommon/index.d.ts +1 -0
- package/dist/components/ui/PageCommon/index.js +54 -0
- package/dist/components/ui/PageCommon/index.js.map +1 -0
- package/dist/components/ui/PageCommonDrawer/index.d.ts +1 -0
- package/dist/components/ui/PageCommonDrawer/index.js +29 -0
- package/dist/components/ui/PageCommonDrawer/index.js.map +1 -0
- package/dist/components/ui/PageCommonHeader/index.d.ts +1 -0
- package/dist/components/ui/PageCommonHeader/index.js +98 -0
- package/dist/components/ui/PageCommonHeader/index.js.map +1 -0
- package/dist/components/{PageHeaderDocumentationButton → ui/PageHeaderDocumentationButton}/index.js +1 -1
- package/dist/components/ui/PageHeaderDocumentationButton/index.js.map +1 -0
- package/dist/constants/config.constants.d.ts +9 -0
- package/dist/constants/config.constants.js +6 -0
- package/dist/constants/config.constants.js.map +1 -0
- package/dist/constants/page.constants.js +6 -0
- package/dist/constants/page.constants.js.map +1 -0
- package/dist/context/commonConfigContext/CommonConfigContext.d.ts +9 -0
- package/dist/context/commonConfigContext/CommonConfigContextProvider.d.ts +6 -0
- package/dist/context/commonConfigContext/index.d.ts +3 -0
- package/dist/context/commonConfigContext/index.js +34 -0
- package/dist/context/commonConfigContext/index.js.map +1 -0
- package/dist/context/commonConfigContext/useCommonConfigContext.d.ts +3 -0
- package/dist/context/pageCommonContext/index.d.ts +2 -0
- package/dist/context/pageCommonContext/index.js +24 -0
- package/dist/context/pageCommonContext/index.js.map +1 -0
- package/dist/hooks/useConfig/index.d.ts +1 -0
- package/dist/hooks/useConfig/index.js +7 -0
- package/dist/hooks/useConfig/index.js.map +1 -0
- package/dist/hooks/useConfig/useConfig.d.ts +2 -0
- package/dist/hooks/useUpdateDocumentTitle/index.d.ts +1 -0
- package/dist/hooks/useUpdateDocumentTitle/index.js +13 -0
- package/dist/hooks/useUpdateDocumentTitle/index.js.map +1 -0
- package/dist/hooks/useUpdateDocumentTitle/useUpdateDocumentTitle.d.ts +1 -0
- package/dist/models/config.models.d.ts +19 -0
- package/dist/models/{fasta.js → fasta.models.js} +2 -2
- package/dist/models/fasta.models.js.map +1 -0
- package/dist/models/metadata.models.js +0 -0
- package/dist/pages/ErrorPage/ErrorPage.d.ts +4 -0
- package/dist/pages/ErrorPage/index.d.ts +1 -0
- package/dist/pages/ErrorPage/index.js +17 -0
- package/dist/pages/ErrorPage/index.js.map +1 -0
- package/dist/stores/fastaDataStore/fastaDataStore.d.ts +2 -2
- package/dist/stores/fastaDataStore/index.js +17 -15
- package/dist/stores/fastaDataStore/index.js.map +1 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/utils/DependencyContainerUtil/DependencyContainerUtil.d.ts +6 -0
- package/dist/utils/DependencyContainerUtil/index.d.ts +1 -0
- package/dist/utils/DependencyContainerUtil/index.js +18 -0
- package/dist/utils/DependencyContainerUtil/index.js.map +1 -0
- package/dist/utils/DownloadUtil/index.js.map +1 -1
- package/dist/utils/ErrorUtil/index.js.map +1 -1
- package/dist/utils/FastaUtil/FastaUtil.d.ts +1 -1
- package/dist/utils/FastaUtil/index.js +12 -19
- package/dist/utils/FastaUtil/index.js.map +1 -1
- package/dist/utils/MetaDataUtil/MetaDataUtil.d.ts +1 -1
- package/dist/utils/MetaDataUtil/index.js.map +1 -1
- package/dist/utils/StandardConfigUtil/StandardConfigUtil.d.ts +4 -0
- package/dist/utils/StandardConfigUtil/index.d.ts +1 -0
- package/dist/utils/StandardConfigUtil/index.js +17 -0
- package/dist/utils/StandardConfigUtil/index.js.map +1 -0
- package/dist/utils/UrlUtil/index.js +6 -5
- package/dist/utils/UrlUtil/index.js.map +1 -1
- package/package.json +122 -62
- package/dist/_chunks/FastaDataImportDialog.js.map +0 -1
- package/dist/components/FastaDataImportDialog/index.js +0 -2
- package/dist/components/FastaDataImportDialogLoader/index.js +0 -70
- package/dist/components/FastaDataImportDialogLoader/index.js.map +0 -1
- package/dist/components/FastaNotLoaded/index.js +0 -53
- package/dist/components/FastaNotLoaded/index.js.map +0 -1
- package/dist/components/FastaPageHeaderCenterComponent/index.js.map +0 -1
- package/dist/components/FastaPageHeaderImportButton/index.js +0 -26
- package/dist/components/FastaPageHeaderImportButton/index.js.map +0 -1
- package/dist/components/FastaPageHeaderResetButton/index.js.map +0 -1
- package/dist/components/I18nWrapper/index.js +0 -21
- package/dist/components/I18nWrapper/index.js.map +0 -1
- package/dist/components/PageHeaderDocumentationButton/index.js.map +0 -1
- package/dist/components/page/ErrorPageCommon.d.ts +0 -4
- package/dist/components/page/PageCommon.d.ts +0 -8
- package/dist/components/page/index.d.ts +0 -6
- package/dist/components/page/index.js +0 -207
- package/dist/components/page/index.js.map +0 -1
- package/dist/constants/page.js +0 -6
- package/dist/constants/page.js.map +0 -1
- package/dist/models/fasta.js.map +0 -1
- /package/dist/components/{FastaDataImportDialog → fasta/FastaDataImportDialog}/FastaDataImportDialog.d.ts +0 -0
- /package/dist/components/{FastaDataImportDialog → fasta/FastaDataImportDialog}/index.d.ts +0 -0
- /package/dist/components/{FastaDataImportDialogLoader → fasta/FastaDataImportDialogLoader}/index.d.ts +0 -0
- /package/dist/components/{FastaNotLoaded → fasta/FastaNotLoaded}/FastaNotLoaded.d.ts +0 -0
- /package/dist/components/{FastaNotLoaded → fasta/FastaNotLoaded}/index.d.ts +0 -0
- /package/dist/components/{FastaPageHeaderCenterComponent → fasta/FastaPageHeaderCenterComponent}/index.d.ts +0 -0
- /package/dist/components/{FastaPageHeaderImportButton → fasta/FastaPageHeaderImportButton}/FastaPageHeaderImportButton.d.ts +0 -0
- /package/dist/components/{FastaPageHeaderImportButton → fasta/FastaPageHeaderImportButton}/index.d.ts +0 -0
- /package/dist/components/{FastaPageHeaderResetButton → fasta/FastaPageHeaderResetButton}/FastaPageHeaderResetButton.d.ts +0 -0
- /package/dist/components/{FastaPageHeaderResetButton → fasta/FastaPageHeaderResetButton}/index.d.ts +0 -0
- /package/dist/components/{I18nWrapper → ui/I18nWrapper}/I18nWrapper.d.ts +0 -0
- /package/dist/components/{I18nWrapper → ui/I18nWrapper}/index.d.ts +0 -0
- /package/dist/components/{page → ui/PageCommonDrawer}/PageCommonDrawer.d.ts +0 -0
- /package/dist/components/{page → ui/PageCommonHeader}/PageCommonHeader.d.ts +0 -0
- /package/dist/components/{PageHeaderDocumentationButton → ui/PageHeaderDocumentationButton}/PageHeaderDocumentationButton.d.ts +0 -0
- /package/dist/components/{PageHeaderDocumentationButton → ui/PageHeaderDocumentationButton}/index.d.ts +0 -0
- /package/dist/constants/{page.d.ts → page.constants.d.ts} +0 -0
- /package/dist/{components/page → context/pageCommonContext}/PageCommonContext.d.ts +0 -0
- /package/dist/{components/page → context/pageCommonContext}/PageCommonContextProvider.d.ts +0 -0
- /package/dist/models/{metadata.js → config.models.js} +0 -0
- /package/dist/models/{fasta.d.ts → fasta.models.d.ts} +0 -0
- /package/dist/models/{metadata.d.ts → metadata.models.d.ts} +0 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { CONFIG_TOKEN as e, WINDOW_SERVICE_TOKEN as t } from "../constants/config.constants.js";
|
|
2
|
+
import { t as n } from "./decorate.js";
|
|
3
|
+
import { inject as r, singleton as i } from "tsyringe";
|
|
4
|
+
import a from "@emotion/cache";
|
|
5
|
+
//#region \0@oxc-project+runtime@0.153.0/helpers/esm/decorateParam.js
|
|
6
|
+
function o(e, t) {
|
|
7
|
+
return function(n, r) {
|
|
8
|
+
t(n, r, e);
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/classes/services/EmotionCacheService/EmotionCacheService.ts
|
|
13
|
+
var s = class {
|
|
14
|
+
emotionCache;
|
|
15
|
+
constructor(e, t) {
|
|
16
|
+
this.emotionCache = a({
|
|
17
|
+
container: t.document.head,
|
|
18
|
+
key: "loculus-tools",
|
|
19
|
+
nonce: e.nonce,
|
|
20
|
+
prepend: !!e.nonce,
|
|
21
|
+
stylisPlugins: []
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
s = n([
|
|
26
|
+
i(),
|
|
27
|
+
o(0, r(e)),
|
|
28
|
+
o(1, r(t))
|
|
29
|
+
], s);
|
|
30
|
+
//#endregion
|
|
31
|
+
export { s as t };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=EmotionCacheService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmotionCacheService.js","names":["_decorate","_decorateParam","__decorate","createCache","__decorateParam","target","key","paramIndex","EmotionCacheService","windowService","config","singleton","inject","CONFIG_TOKEN","WINDOW_SERVICE_TOKEN"],"sources":["../../src/classes/services/EmotionCacheService/EmotionCacheService.ts"],"sourcesContent":["import type { EmotionCache } from '@emotion/cache';\nimport createCache from '@emotion/cache';\nimport {\n inject,\n singleton,\n} from 'tsyringe';\nimport type { WindowService } from '@gen-epix/ui-core/classes/services/WindowService';\n\nimport {\n CONFIG_TOKEN,\n WINDOW_SERVICE_TOKEN,\n} from '../../../constants/config.constants';\nimport type { ConfigBase } from '../../../models/config.models';\n\n\n@singleton()\nexport class EmotionCacheService {\n public readonly emotionCache: EmotionCache;\n\n public constructor(\n @inject(CONFIG_TOKEN) config: ConfigBase,\n @inject(WINDOW_SERVICE_TOKEN) windowService: WindowService,\n ) {\n this.emotionCache = createCache({\n container: windowService.document.head,\n key: 'loculus-tools',\n nonce: config.nonce,\n prepend: !!config.nonce,\n stylisPlugins: [],\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;AAgBO,IAAMQ,IAAN,MAA0B;CAC/B;CAEA,YACE,GACA,GACA;EACA,KAAK,eAAeL,EAAY;GAC9B,WAAWM,EAAc,SAAS;GAClC,KAAK;GACL,OAAOC,EAAO;GACd,SAAS,CAAC,CAACA,EAAO;GAClB,eAAe,CAAC;EAClB,CAAC;CACH;AACF;;CAhBCC,EAAU;CAKNV,EAAA,GAAAW,EAAOC,CAAY,CAAA;CACnBZ,EAAA,GAAAW,EAAOE,CAAoB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region \0@oxc-project+runtime@0.153.0/helpers/esm/decorate.js
|
|
2
|
+
function e(e, t, n, r) {
|
|
3
|
+
var i = arguments.length, a = i < 3 ? t : r === null ? r = Object.getOwnPropertyDescriptor(t, n) : r, o;
|
|
4
|
+
if (typeof Reflect == "object" && typeof Reflect.decorate == "function") a = Reflect.decorate(e, t, n, r);
|
|
5
|
+
else for (var s = e.length - 1; s >= 0; s--) (o = e[s]) && (a = (i < 3 ? o(a) : i > 3 ? o(t, n, a) : o(t, n)) || a);
|
|
6
|
+
return i > 3 && a && Object.defineProperty(t, n, a), a;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { e as t };
|
|
@@ -1 +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"],"
|
|
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,7 @@
|
|
|
1
|
+
import { EmotionCache } from '@emotion/cache';
|
|
2
|
+
import { WindowService } from '@gen-epix/ui-core/classes/services/WindowService';
|
|
3
|
+
import { ConfigBase } from '../../../models/config.models';
|
|
4
|
+
export declare class EmotionCacheService {
|
|
5
|
+
readonly emotionCache: EmotionCache;
|
|
6
|
+
constructor(config: ConfigBase, windowService: WindowService);
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './EmotionCacheService';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { t as EmotionCacheService } from "../../../_chunks/EmotionCacheService.js";
|
|
@@ -4,7 +4,5 @@ export type Event = {
|
|
|
4
4
|
onShowImportDialog: string | undefined;
|
|
5
5
|
};
|
|
6
6
|
export declare class FastaDataEventBusService extends EventBusAbstract<Event> {
|
|
7
|
-
|
|
8
|
-
private constructor();
|
|
9
|
-
static getInstance(): FastaDataEventBusService;
|
|
7
|
+
constructor();
|
|
10
8
|
}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { t as e } from "../../../_chunks/decorate.js";
|
|
2
|
+
import { singleton as t } from "tsyringe";
|
|
3
|
+
import { EventBusAbstract as n } from "@gen-epix/ui-core/classes/abstracts/EventBusAbstract";
|
|
3
4
|
//#region src/classes/services/FastaDataEventBusService/FastaDataEventBusService.ts
|
|
4
|
-
var
|
|
5
|
-
static __instance;
|
|
5
|
+
var r = class extends n {
|
|
6
6
|
constructor() {
|
|
7
7
|
super();
|
|
8
8
|
}
|
|
9
|
-
static getInstance() {
|
|
10
|
-
return n.__instance = t.getHmrSingleton("fastaDataEventBusService", n.__instance, () => new n()), n.__instance;
|
|
11
|
-
}
|
|
12
9
|
};
|
|
10
|
+
r = e([t()], r);
|
|
13
11
|
//#endregion
|
|
14
|
-
export {
|
|
12
|
+
export { r as FastaDataEventBusService };
|
|
15
13
|
|
|
16
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +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 {
|
|
1
|
+
{"version":3,"file":"index.js","names":["_decorate","__decorate","FastaDataEventBusService","EventBusAbstract","singleton"],"sources":["../../../../src/classes/services/FastaDataEventBusService/FastaDataEventBusService.ts"],"sourcesContent":["import { EventBusAbstract } from '@gen-epix/ui-core/classes/abstracts/EventBusAbstract';\nimport { singleton } from 'tsyringe';\n\n\nexport type Event = {\n onCloseImportDialog: undefined;\n onShowImportDialog: string | undefined;\n};\n\n@singleton()\nexport class FastaDataEventBusService extends EventBusAbstract<Event> {\n public constructor() {\n super();\n }\n}\n"],"mappings":";;;;AAUO,IAAME,IAAN,cAAuCC,EAAwB;CACpE,cAAqB;EACnB,MAAM;CACR;AACF;AALC,IAAAH,EAAA,CAAAI,EAAU,CAAA,GAAAF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/SearchBar/SearchBar.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n KeyboardEvent,\n} from 'react';\nimport {\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport {\n Box,\n FilledInput,\n IconButton,\n InputAdornment,\n useTheme,\n} from '@mui/material';\nimport SearchIcon from '@mui/icons-material/Search';\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport CloseIcon from '@mui/icons-material/Close';\n\n\nexport type SearchBarProps = {\n allowNavigation?: boolean;\n highlightedIndex?: null | number;\n numResults?: number;\n onHighlightedIndexChange?: (index: number) => void;\n onSearchQueryChange: (query: string) => void;\n searchQuery: string;\n truncated?: boolean;\n};\n\nexport const SearchBar = ({ allowNavigation, highlightedIndex, numResults = 0, onHighlightedIndexChange, onSearchQueryChange, searchQuery, truncated }: SearchBarProps) => {\n const theme = useTheme();\n const inputRef = useRef<HTMLInputElement>(null);\n const arrowUpButtonRef = useRef<HTMLButtonElement>(null);\n const arrowDownButtonRef = useRef<HTMLButtonElement>(null);\n\n const onTextInputChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n const nextSearchText = event.target.value;\n onSearchQueryChange(nextSearchText);\n }, [onSearchQueryChange]);\n\n const onClearButtonClick = useCallback(() => {\n onSearchQueryChange('');\n inputRef.current?.focus();\n }, [onSearchQueryChange]);\n\n const onTextInputKeyDown = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n // on enter press, highlight the first result and focus the down arrow button\n if (event.key === 'Enter') {\n if (!numResults) {\n return;\n }\n event.preventDefault();\n onHighlightedIndexChange?.(0);\n arrowDownButtonRef.current?.focus();\n }\n }, [numResults, onHighlightedIndexChange]);\n\n const onUpArrowButtonClick = useCallback(() => {\n // goto previous result\n if (!numResults) {\n return;\n }\n const newHighlightedIndex = highlightedIndex === null || highlightedIndex === undefined || Number.isNaN(highlightedIndex) || highlightedIndex <= 0 ? numResults - 1 : highlightedIndex - 1;\n\n onHighlightedIndexChange?.(newHighlightedIndex);\n }, [numResults, highlightedIndex, onHighlightedIndexChange]);\n\n const onDownArrowButtonClick = useCallback(() => {\n // goto next result\n if (!numResults) {\n return;\n }\n const newHighlightedIndex = highlightedIndex === null || highlightedIndex === undefined || Number.isNaN(highlightedIndex) || highlightedIndex >= numResults - 1 ? 0 : highlightedIndex + 1;\n onHighlightedIndexChange?.(newHighlightedIndex);\n }, [numResults, highlightedIndex, onHighlightedIndexChange]);\n\n const onGenericKeyDown = useCallback((event: KeyboardEvent<HTMLButtonElement>) => {\n // arrow right, focus the next focusable element\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n const nextFocusableElement = event.currentTarget.nextElementSibling as HTMLElement;\n if (nextFocusableElement) {\n nextFocusableElement.focus();\n }\n }\n // arrow left, focus the previous focusable element\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n if (event.target === arrowUpButtonRef.current) {\n inputRef.current?.focus();\n return;\n }\n const previousFocusableElement = event.currentTarget.previousElementSibling as HTMLElement;\n if (previousFocusableElement) {\n previousFocusableElement.focus();\n }\n }\n }, []);\n\n const searchResultStatusText = useMemo(() => {\n if (!searchQuery) {\n return '';\n }\n if (searchQuery && (Number.isNaN(numResults) || numResults <= 0)) {\n return 'No results';\n } else if (highlightedIndex === null || highlightedIndex === undefined || Number.isNaN(highlightedIndex) || highlightedIndex < 0 || !allowNavigation) {\n return `${numResults}${truncated ? '+' : ''} results`;\n } else if (allowNavigation) {\n return `${highlightedIndex + 1}/${numResults}${truncated ? '+' : ''} results`;\n }\n return '';\n }, [searchQuery, numResults, highlightedIndex, allowNavigation, truncated]);\n\n\n return (\n <FilledInput\n endAdornment={(\n <InputAdornment position={'end'}>\n {searchResultStatusText && (\n <Box\n aria-atomic={'true'}\n aria-live={'polite'}\n role={'status'}\n sx={{\n fontSize: '1rem',\n }}\n >\n {searchResultStatusText}\n </Box>\n )}\n {numResults > 0 && allowNavigation && (\n <>\n <IconButton\n aria-label={'Goto previous search result'}\n disabled={!numResults}\n edge={'end'}\n onClick={onUpArrowButtonClick}\n onKeyDown={onGenericKeyDown}\n ref={arrowUpButtonRef}\n sx={{ color: theme.palette.primary.main }}\n >\n <KeyboardArrowUpIcon />\n </IconButton>\n <IconButton\n aria-label={'Goto next search result'}\n disabled={!numResults}\n edge={'end'}\n onClick={onDownArrowButtonClick}\n onKeyDown={onGenericKeyDown}\n ref={arrowDownButtonRef}\n sx={{ color: theme.palette.primary.main }}\n >\n <KeyboardArrowDownIcon />\n </IconButton>\n </>\n )}\n {searchQuery && (\n <IconButton\n aria-label={'Clear'}\n edge={'end'}\n onClick={onClearButtonClick}\n onKeyDown={onGenericKeyDown}\n >\n <CloseIcon />\n </IconButton>\n )}\n </InputAdornment>\n )}\n fullWidth\n inputRef={inputRef}\n name={'Search'}\n onChange={onTextInputChange}\n onKeyDown={onTextInputKeyDown}\n placeholder={'Search'}\n size={'small'}\n slotProps={{\n input: {\n 'aria-label': 'Search',\n sx: {\n '&::-webkit-search-cancel-button': {\n display: 'none',\n },\n fontSize: '1rem',\n height: theme.spacing(4),\n outline: 'none !important',\n paddingBottom: '0 !important',\n paddingTop: '0 !important',\n },\n },\n }}\n startAdornment={(\n <InputAdornment position={'start'}>\n <SearchIcon fontSize={'small'} />\n </InputAdornment>\n )}\n sx={{\n backgroundColor: theme.palette.background.paper,\n height: theme.spacing(4),\n }}\n type={'search'}\n value={searchQuery}\n />\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_Fragment","SearchIcon","KeyboardArrowUpIcon","KeyboardArrowDownIcon","CloseIcon","SearchBar","theme","useTheme","inputRef","useRef","arrowUpButtonRef","arrowDownButtonRef","onTextInputChange","useCallback","nextSearchText","event","onSearchQueryChange","onClearButtonClick","onTextInputKeyDown","numResults","onHighlightedIndexChange","onUpArrowButtonClick","newHighlightedIndex","highlightedIndex","onDownArrowButtonClick","onGenericKeyDown","nextFocusableElement","previousFocusableElement","searchResultStatusText","useMemo","searchQuery","allowNavigation","truncated","FilledInput","InputAdornment","Box","Fragment","IconButton"],"sources":["../../../src/components/SearchBar/SearchBar.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n KeyboardEvent,\n} from 'react';\nimport {\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport {\n Box,\n FilledInput,\n IconButton,\n InputAdornment,\n useTheme,\n} from '@mui/material';\nimport SearchIcon from '@mui/icons-material/Search';\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport CloseIcon from '@mui/icons-material/Close';\n\n\nexport type SearchBarProps = {\n allowNavigation?: boolean;\n highlightedIndex?: null | number;\n numResults?: number;\n onHighlightedIndexChange?: (index: number) => void;\n onSearchQueryChange: (query: string) => void;\n searchQuery: string;\n truncated?: boolean;\n};\n\nexport const SearchBar = ({ allowNavigation, highlightedIndex, numResults = 0, onHighlightedIndexChange, onSearchQueryChange, searchQuery, truncated }: SearchBarProps) => {\n const theme = useTheme();\n const inputRef = useRef<HTMLInputElement>(null);\n const arrowUpButtonRef = useRef<HTMLButtonElement>(null);\n const arrowDownButtonRef = useRef<HTMLButtonElement>(null);\n\n const onTextInputChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n const nextSearchText = event.target.value;\n onSearchQueryChange(nextSearchText);\n }, [onSearchQueryChange]);\n\n const onClearButtonClick = useCallback(() => {\n onSearchQueryChange('');\n inputRef.current?.focus();\n }, [onSearchQueryChange]);\n\n const onTextInputKeyDown = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n // on enter press, highlight the first result and focus the down arrow button\n if (event.key === 'Enter') {\n if (!numResults) {\n return;\n }\n event.preventDefault();\n onHighlightedIndexChange?.(0);\n arrowDownButtonRef.current?.focus();\n }\n }, [numResults, onHighlightedIndexChange]);\n\n const onUpArrowButtonClick = useCallback(() => {\n // goto previous result\n if (!numResults) {\n return;\n }\n const newHighlightedIndex = highlightedIndex === null || highlightedIndex === undefined || Number.isNaN(highlightedIndex) || highlightedIndex <= 0 ? numResults - 1 : highlightedIndex - 1;\n\n onHighlightedIndexChange?.(newHighlightedIndex);\n }, [numResults, highlightedIndex, onHighlightedIndexChange]);\n\n const onDownArrowButtonClick = useCallback(() => {\n // goto next result\n if (!numResults) {\n return;\n }\n const newHighlightedIndex = highlightedIndex === null || highlightedIndex === undefined || Number.isNaN(highlightedIndex) || highlightedIndex >= numResults - 1 ? 0 : highlightedIndex + 1;\n onHighlightedIndexChange?.(newHighlightedIndex);\n }, [numResults, highlightedIndex, onHighlightedIndexChange]);\n\n const onGenericKeyDown = useCallback((event: KeyboardEvent<HTMLButtonElement>) => {\n // arrow right, focus the next focusable element\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n const nextFocusableElement = event.currentTarget.nextElementSibling as HTMLElement;\n if (nextFocusableElement) {\n nextFocusableElement.focus();\n }\n }\n // arrow left, focus the previous focusable element\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n if (event.target === arrowUpButtonRef.current) {\n inputRef.current?.focus();\n return;\n }\n const previousFocusableElement = event.currentTarget.previousElementSibling as HTMLElement;\n if (previousFocusableElement) {\n previousFocusableElement.focus();\n }\n }\n }, []);\n\n const searchResultStatusText = useMemo(() => {\n if (!searchQuery) {\n return '';\n }\n if (searchQuery && (Number.isNaN(numResults) || numResults <= 0)) {\n return 'No results';\n } else if (highlightedIndex === null || highlightedIndex === undefined || Number.isNaN(highlightedIndex) || highlightedIndex < 0 || !allowNavigation) {\n return `${numResults}${truncated ? '+' : ''} results`;\n } else if (allowNavigation) {\n return `${highlightedIndex + 1}/${numResults}${truncated ? '+' : ''} results`;\n }\n return '';\n }, [searchQuery, numResults, highlightedIndex, allowNavigation, truncated]);\n\n\n return (\n <FilledInput\n endAdornment={(\n <InputAdornment position={'end'}>\n {searchResultStatusText && (\n <Box\n aria-atomic={'true'}\n aria-live={'polite'}\n role={'status'}\n sx={{\n fontSize: '1rem',\n }}\n >\n {searchResultStatusText}\n </Box>\n )}\n {numResults > 0 && allowNavigation && (\n <>\n <IconButton\n aria-label={'Goto previous search result'}\n disabled={!numResults}\n edge={'end'}\n onClick={onUpArrowButtonClick}\n onKeyDown={onGenericKeyDown}\n ref={arrowUpButtonRef}\n sx={{ color: theme.palette.primary.main }}\n >\n <KeyboardArrowUpIcon />\n </IconButton>\n <IconButton\n aria-label={'Goto next search result'}\n disabled={!numResults}\n edge={'end'}\n onClick={onDownArrowButtonClick}\n onKeyDown={onGenericKeyDown}\n ref={arrowDownButtonRef}\n sx={{ color: theme.palette.primary.main }}\n >\n <KeyboardArrowDownIcon />\n </IconButton>\n </>\n )}\n {searchQuery && (\n <IconButton\n aria-label={'Clear'}\n edge={'end'}\n onClick={onClearButtonClick}\n onKeyDown={onGenericKeyDown}\n >\n <CloseIcon />\n </IconButton>\n )}\n </InputAdornment>\n )}\n fullWidth\n inputRef={inputRef}\n name={'Search'}\n onChange={onTextInputChange}\n onKeyDown={onTextInputKeyDown}\n placeholder={'Search'}\n size={'small'}\n slotProps={{\n input: {\n 'aria-label': 'Search',\n sx: {\n '&::-webkit-search-cancel-button': {\n display: 'none',\n },\n fontSize: '1rem',\n height: theme.spacing(4),\n outline: 'none !important',\n paddingBottom: '0 !important',\n paddingTop: '0 !important',\n },\n },\n }}\n startAdornment={(\n <InputAdornment position={'start'}>\n <SearchIcon fontSize={'small'} />\n </InputAdornment>\n )}\n sx={{\n backgroundColor: theme.palette.background.paper,\n height: theme.spacing(4),\n }}\n type={'search'}\n value={searchQuery}\n />\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DependencyContainer } from 'tsyringe';
|
|
2
|
+
import { PropsWithChildren } from 'react';
|
|
3
|
+
export type AppProps = PropsWithChildren<{
|
|
4
|
+
readonly container: DependencyContainer;
|
|
5
|
+
}>;
|
|
6
|
+
export declare const App: ({ children, container }: AppProps) => import('react').JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './App';
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { DependencyContainerUtil as e } from "../../../utils/DependencyContainerUtil/index.js";
|
|
2
|
+
import { PageCommonContextProvider as t } from "../../../context/pageCommonContext/index.js";
|
|
3
|
+
import { CommonConfigContextProvider as n } from "../../../context/commonConfigContext/index.js";
|
|
4
|
+
import { ErrorPage as r } from "../../../pages/ErrorPage/index.js";
|
|
5
|
+
import { I18nWrapper as i } from "../../ui/I18nWrapper/index.js";
|
|
6
|
+
import { t as a } from "../../../_chunks/EmotionCacheService.js";
|
|
7
|
+
import { CssBaseline as o, ThemeProvider as s } from "@mui/material";
|
|
8
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
9
|
+
import { Component as u, createContext as d, createElement as f, useMemo as p } from "react";
|
|
10
|
+
import { CacheProvider as m } from "@emotion/react";
|
|
11
|
+
//#region ../../../node_modules/.pnpm/react-error-boundary@6.1.6_@types+react@19.3.0_react@19.3.0/node_modules/react-error-boundary/dist/react-error-boundary.js
|
|
12
|
+
var h = d(null);
|
|
13
|
+
function g({ children: e, didCatch: t, error: n, resetErrorBoundary: r }) {
|
|
14
|
+
let i = p(() => ({
|
|
15
|
+
didCatch: t,
|
|
16
|
+
error: n,
|
|
17
|
+
resetErrorBoundary: r
|
|
18
|
+
}), [
|
|
19
|
+
t,
|
|
20
|
+
n,
|
|
21
|
+
r
|
|
22
|
+
]);
|
|
23
|
+
return f(h.Provider, { value: i }, e);
|
|
24
|
+
}
|
|
25
|
+
var _ = {
|
|
26
|
+
didCatch: !1,
|
|
27
|
+
error: null
|
|
28
|
+
}, v = class extends u {
|
|
29
|
+
constructor(e) {
|
|
30
|
+
super(e), this.resetErrorBoundary = this.resetErrorBoundary.bind(this), this.state = _;
|
|
31
|
+
}
|
|
32
|
+
static getDerivedStateFromError(e) {
|
|
33
|
+
return {
|
|
34
|
+
didCatch: !0,
|
|
35
|
+
error: e
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
resetErrorBoundary(...e) {
|
|
39
|
+
let { didCatch: t } = this.state;
|
|
40
|
+
t && (this.props.onReset?.({
|
|
41
|
+
args: e,
|
|
42
|
+
reason: "imperative-api"
|
|
43
|
+
}), this.setState(_));
|
|
44
|
+
}
|
|
45
|
+
componentDidCatch(e, t) {
|
|
46
|
+
this.props.onError?.(e, t);
|
|
47
|
+
}
|
|
48
|
+
componentDidUpdate(e, t) {
|
|
49
|
+
let { didCatch: n } = this.state, { resetKeys: r } = this.props;
|
|
50
|
+
n && t.didCatch && y(e.resetKeys, r) && (this.props.onReset?.({
|
|
51
|
+
next: r,
|
|
52
|
+
prev: e.resetKeys,
|
|
53
|
+
reason: "keys"
|
|
54
|
+
}), this.setState(_));
|
|
55
|
+
}
|
|
56
|
+
render() {
|
|
57
|
+
let { children: e, fallbackRender: t, FallbackComponent: n, fallback: r } = this.props, { didCatch: i, error: a } = this.state, o = e;
|
|
58
|
+
if (i) {
|
|
59
|
+
let e = {
|
|
60
|
+
error: a,
|
|
61
|
+
resetErrorBoundary: this.resetErrorBoundary
|
|
62
|
+
};
|
|
63
|
+
if (typeof t == "function") o = t(e);
|
|
64
|
+
else if (n) o = f(n, e);
|
|
65
|
+
else if ("fallback" in this.props) o = r;
|
|
66
|
+
else throw a;
|
|
67
|
+
}
|
|
68
|
+
return f(g, {
|
|
69
|
+
didCatch: i,
|
|
70
|
+
error: a,
|
|
71
|
+
resetErrorBoundary: this.resetErrorBoundary
|
|
72
|
+
}, o);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
function y(e = [], t = []) {
|
|
76
|
+
return e.length !== t.length || e.some((e, n) => !Object.is(e, t[n]));
|
|
77
|
+
}
|
|
78
|
+
//#endregion
|
|
79
|
+
//#region src/components/app/App/App.tsx
|
|
80
|
+
var b = ({ children: u, container: d }) => {
|
|
81
|
+
let f = e.resolveConfig(d), p = f.getTouchIconUrl();
|
|
82
|
+
p && document.querySelector("link[rel=\"icon\"]")?.setAttribute("href", p);
|
|
83
|
+
let h = d.resolve(a).emotionCache;
|
|
84
|
+
return /* @__PURE__ */ c(n, {
|
|
85
|
+
container: d,
|
|
86
|
+
children: /* @__PURE__ */ c(m, {
|
|
87
|
+
value: h,
|
|
88
|
+
children: /* @__PURE__ */ l(s, {
|
|
89
|
+
theme: f.theme,
|
|
90
|
+
children: [/* @__PURE__ */ c(o, {}), /* @__PURE__ */ c(v, {
|
|
91
|
+
FallbackComponent: r,
|
|
92
|
+
children: /* @__PURE__ */ c(i, { children: /* @__PURE__ */ c(t, { children: u }) })
|
|
93
|
+
})]
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
//#endregion
|
|
99
|
+
export { b as App };
|
|
100
|
+
|
|
101
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["l","h","i","y","ErrorBoundary","EmotionCacheService","f","createContext","m","r","e","t","o","n","useMemo","createElement","d","C","Component","g","s","c","u","App","config","DependencyContainerUtil","container","touchIconUrl","emotionCache","CommonConfigContextProvider","CacheProvider","ThemeProvider","CssBaseline","ErrorPage","I18nWrapper","PageCommonContextProvider"],"sources":["../../../../../../../node_modules/.pnpm/react-error-boundary@6.1.6_@types+react@19.3.0_react@19.3.0/node_modules/react-error-boundary/dist/react-error-boundary.js","../../../../src/components/app/App/App.tsx"],"sourcesContent":["\"use client\";\nimport { createContext as l, useMemo as h, createElement as i, Component as y, useContext as p, useState as E, forwardRef as B } from \"react\";\nconst f = l(null);\nfunction m({\n children: r,\n didCatch: e,\n error: t,\n resetErrorBoundary: o\n}) {\n const n = h(\n () => ({ didCatch: e, error: t, resetErrorBoundary: o }),\n [e, t, o]\n );\n return i(f.Provider, { value: n }, r);\n}\nconst d = {\n didCatch: !1,\n error: null\n};\nclass C extends y {\n constructor(e) {\n super(e), this.resetErrorBoundary = this.resetErrorBoundary.bind(this), this.state = d;\n }\n static getDerivedStateFromError(e) {\n return { didCatch: !0, error: e };\n }\n resetErrorBoundary(...e) {\n const { didCatch: t } = this.state;\n t && (this.props.onReset?.({\n args: e,\n reason: \"imperative-api\"\n }), this.setState(d));\n }\n componentDidCatch(e, t) {\n this.props.onError?.(e, t);\n }\n componentDidUpdate(e, t) {\n const { didCatch: o } = this.state, { resetKeys: n } = this.props;\n o && t.didCatch && g(e.resetKeys, n) && (this.props.onReset?.({\n next: n,\n prev: e.resetKeys,\n reason: \"keys\"\n }), this.setState(d));\n }\n render() {\n const { children: e, fallbackRender: t, FallbackComponent: o, fallback: n } = this.props, { didCatch: s, error: a } = this.state;\n let c = e;\n if (s) {\n const u = {\n error: a,\n resetErrorBoundary: this.resetErrorBoundary\n };\n if (typeof t == \"function\")\n c = t(u);\n else if (o)\n c = i(o, u);\n else if (\"fallback\" in this.props)\n c = n;\n else\n throw a;\n }\n return i(\n m,\n {\n didCatch: s,\n error: a,\n resetErrorBoundary: this.resetErrorBoundary\n },\n c\n );\n }\n}\nfunction g(r = [], e = []) {\n return r.length !== e.length || r.some((t, o) => !Object.is(t, e[o]));\n}\nfunction x(r) {\n return r !== null && typeof r == \"object\" && \"didCatch\" in r && typeof r.didCatch == \"boolean\" && \"error\" in r && \"resetErrorBoundary\" in r && typeof r.resetErrorBoundary == \"function\";\n}\nfunction b(r) {\n if (!x(r))\n throw new Error(\"ErrorBoundaryContext not found\");\n}\nfunction S() {\n const r = p(f);\n b(r);\n const { error: e, resetErrorBoundary: t } = r, [o, n] = E({\n error: null,\n hasError: !1\n }), s = h(\n () => ({\n error: e,\n resetBoundary: () => {\n t(), n({ error: null, hasError: !1 });\n },\n showBoundary: (a) => n({\n error: a,\n hasError: !0\n })\n }),\n [e, t]\n );\n if (o.hasError)\n throw o.error;\n return s;\n}\nfunction w(r) {\n switch (typeof r) {\n case \"object\": {\n if (r !== null && \"message\" in r && typeof r.message == \"string\")\n return r.message;\n break;\n }\n case \"string\":\n return r;\n }\n}\nfunction R(r, e) {\n const t = B(\n (n, s) => i(\n C,\n e,\n i(r, { ...n, ref: s })\n )\n ), o = r.displayName || r.name || \"Unknown\";\n return t.displayName = `withErrorBoundary(${o})`, t;\n}\nexport {\n C as ErrorBoundary,\n f as ErrorBoundaryContext,\n w as getErrorMessage,\n S as useErrorBoundary,\n R as withErrorBoundary\n};\n//# sourceMappingURL=react-error-boundary.js.map\n","import type { DependencyContainer } from 'tsyringe';\nimport { CacheProvider } from '@emotion/react';\nimport {\n CssBaseline,\n ThemeProvider,\n} from '@mui/material';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport type { PropsWithChildren } from 'react';\n\nimport { EmotionCacheService } from '../../../classes/services/EmotionCacheService';\nimport type { ConfigBase } from '../../../models/config.models';\nimport { DependencyContainerUtil } from '../../../utils/DependencyContainerUtil';\nimport { CommonConfigContextProvider } from '../../../context/commonConfigContext';\nimport { ErrorPage } from '../../../pages/ErrorPage';\nimport { I18nWrapper } from '../../ui/I18nWrapper';\nimport { PageCommonContextProvider } from '../../../context/pageCommonContext';\n\nexport type AppProps = PropsWithChildren<{\n readonly container: DependencyContainer;\n}>;\n\nexport const App = ({ children, container }: AppProps) => {\n const config = DependencyContainerUtil.resolveConfig<ConfigBase>(container);\n\n const touchIconUrl = config.getTouchIconUrl();\n if (touchIconUrl) {\n document.querySelector('link[rel=\"icon\"]')?.setAttribute('href', touchIconUrl);\n }\n\n const emotionCache = container.resolve(EmotionCacheService).emotionCache;\n\n return (\n <CommonConfigContextProvider container={container}>\n <CacheProvider value={emotionCache}>\n <ThemeProvider theme={config.theme}>\n <CssBaseline />\n <ErrorBoundary FallbackComponent={ErrorPage}>\n <I18nWrapper>\n <PageCommonContextProvider>\n {children}\n </PageCommonContextProvider>\n </I18nWrapper>\n </ErrorBoundary>\n </ThemeProvider>\n </CacheProvider>\n </CommonConfigContextProvider>\n );\n};\n"],"ignoreList":[0],"mappings":";;;;;;;;;;;AAEA,IAAMM,IAAIN,EAAE,IAAI;AAChB,SAASQ,EAAE,EACT,UAAUC,GACV,UAAUC,GACV,OAAOC,GACP,oBAAoBC,KACnB;CACD,IAAMC,IAAIZ,SACD;EAAE,UAAUS;EAAG,OAAOC;EAAG,oBAAoBC;CAAE,IACtD;EAACF;EAAGC;EAAGC;CAAC,CACV;CACA,OAAOV,EAAEI,EAAE,UAAU,EAAE,OAAOO,EAAE,GAAGJ,CAAC;AACtC;AACA,IAAMO,IAAI;CACR,UAAU,CAAC;CACX,OAAO;AACT,GACMC,IAAN,cAAgBd,EAAE;CAChB,YAAY,GAAG;EACb,MAAM,CAAC,GAAG,KAAK,qBAAqB,KAAK,mBAAmB,KAAK,IAAI,GAAG,KAAK,QAAQa;CACvF;CACA,OAAO,yBAAyB,GAAG;EACjC,OAAO;GAAE,UAAU,CAAC;GAAG,OAAO;EAAE;CAClC;CACA,mBAAmB,GAAG,GAAG;EACvB,IAAM,EAAE,UAAU,MAAM,KAAK;EAC7B,MAAM,KAAK,MAAM,UAAU;GACzB,MAAM;GACN,QAAQ;EACV,CAAC,GAAG,KAAK,SAASA,CAAC;CACrB;CACA,kBAAkB,GAAG,GAAG;EACtB,KAAK,MAAM,UAAU,GAAG,CAAC;CAC3B;CACA,mBAAmB,GAAG,GAAG;EACvB,IAAM,EAAE,UAAUJ,MAAM,KAAK,OAAO,EAAE,WAAWC,MAAM,KAAK;EAC5D,KAAK,EAAE,YAAYM,EAAE,EAAE,WAAWN,CAAC,MAAM,KAAK,MAAM,UAAU;GAC5D,MAAMA;GACN,MAAM,EAAE;GACR,QAAQ;EACV,CAAC,GAAG,KAAK,SAASG,CAAC;CACrB;CACA,SAAS;EACP,IAAM,EAAE,UAAU,GAAG,gBAAgB,GAAG,mBAAmBJ,GAAG,UAAUC,MAAM,KAAK,OAAO,EAAE,UAAUO,GAAG,OAAO,MAAM,KAAK,OACvHC,IAAI;EACR,IAAID,GAAG;GACL,IAAME,IAAI;IACR,OAAO;IACP,oBAAoB,KAAK;GAC3B;GACA,IAAI,OAAO,KAAK,YACd,IAAI,EAAEA,CAAC;QACJ,IAAIV,GACP,IAAIV,EAAEU,GAAGU,CAAC;QACP,IAAI,cAAc,KAAK,OAC1B,IAAIT;QAEJ,MAAM;EACV;EACA,OAAOX,EACLM,GACA;GACE,UAAUY;GACV,OAAO;GACP,oBAAoB,KAAK;EAC3B,GACAC,CACF;CACF;AACF;AACA,SAASF,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;CACzB,OAAOV,EAAE,WAAWC,EAAE,UAAUD,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,GAAGE,GAAGD,EAAEE,EAAE,CAAC;AACtE;;;ACrDA,IAAaW,KAAO,EAAE,aAAU,mBAA0B;CACxD,IAAMC,IAASC,EAAwB,cAA0BC,CAAS,GAEpEC,IAAeH,EAAO,gBAAgB;CAC5C,AAAIG,KACF,SAAS,cAAc,oBAAkB,CAAC,EAAE,aAAa,QAAQA,CAAY;CAG/E,IAAMC,IAAeF,EAAU,QAAQrB,CAAmB,CAAC,CAAC;CAE5D,OACE,kBAACwB,GAAD;EAAwC;EACtC,UAAA,kBAACC,GAAD;GAAe,OAAOF;GACpB,UAAA,kBAACG,GAAD;IAAe,OAAOP,EAAO;IAA7B,UAAA,CACE,kBAACQ,GAAD,CAAc,CAAA,GACd,kBAAC5B,GAAD;KAAe,mBAAmB6B;KAChC,UAAA,kBAACC,GAAD,EAAA,UACE,kBAACC,GAAD,EACG,YACwB,CAAA,EAChB,CAAA;IACA,CAAA,CACF;;EACF,CAAA;CACY,CAAA;AAEjC"}
|
package/dist/{_chunks/FastaDataImportDialog.js → components/fasta/FastaDataImportDialog/index.js}
RENAMED
|
@@ -5,7 +5,7 @@ import m from "@mui/icons-material/Biotech";
|
|
|
5
5
|
import h from "@mui/icons-material/TableChart";
|
|
6
6
|
import { FileDropZone as g } from "@gen-epix/ui-core-components/components/FileDropZone";
|
|
7
7
|
import { withDialog as _ } from "@gen-epix/ui-core-components/hoc/withDialog";
|
|
8
|
-
//#region src/components/FastaDataImportDialog/FastaDataImportDialog.tsx
|
|
8
|
+
//#region src/components/fasta/FastaDataImportDialog/FastaDataImportDialog.tsx
|
|
9
9
|
var v = _(({ extraActions: _, onActionsChange: v, onClose: y, onDataChange: b, onDisableBackdropClickChange: x, onError: S, onNoCloseButtonChange: C, openProps: w }) => {
|
|
10
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
11
|
f(() => {
|
|
@@ -304,6 +304,6 @@ var v = _(({ extraActions: _, onActionsChange: v, onClose: y, onDataChange: b, o
|
|
|
304
304
|
testId: "FastaDataImportDialog"
|
|
305
305
|
});
|
|
306
306
|
//#endregion
|
|
307
|
-
export { v as
|
|
307
|
+
export { v as FastaDataImportDialog };
|
|
308
308
|
|
|
309
|
-
//# sourceMappingURL=
|
|
309
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.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/fasta/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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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DialogAction } from '@gen-epix/ui-core-components/components/Dialog';
|
|
2
2
|
import { StoreApi } from 'zustand';
|
|
3
|
-
import { FastaDataStore } from '
|
|
3
|
+
import { FastaDataStore } from '../../../stores/fastaDataStore';
|
|
4
4
|
export type FastaDataImportDialogLoaderProps = {
|
|
5
5
|
extraActions: DialogAction[];
|
|
6
6
|
store: StoreApi<FastaDataStore>;
|
|
@@ -0,0 +1,71 @@
|
|
|
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.models.js";
|
|
4
|
+
import { FastaDataEventBusService as r } from "../../../classes/services/FastaDataEventBusService/index.js";
|
|
5
|
+
import { t as i } from "../../../_chunks/react.js";
|
|
6
|
+
import { FastaDataImportDialog as a } from "../FastaDataImportDialog/index.js";
|
|
7
|
+
import { container as o } from "tsyringe";
|
|
8
|
+
import { Fragment as s, jsx as c } from "react/jsx-runtime";
|
|
9
|
+
import { useCallback as l, useEffect as u, useRef as d } from "react";
|
|
10
|
+
//#region src/components/fasta/FastaDataImportDialogLoader/FastaDataImportDialogLoader.tsx
|
|
11
|
+
var f = ({ extraActions: f, store: p }) => {
|
|
12
|
+
let m = i(p, (e) => e.setData), h = i(p, (e) => e.setLoadingStatus), g = d(null);
|
|
13
|
+
u(() => {
|
|
14
|
+
let e = [o.resolve(r).addEventListener("onShowImportDialog", (e) => {
|
|
15
|
+
g.current?.open(e ? { initialErrorMessage: e } : void 0);
|
|
16
|
+
}), o.resolve(r).addEventListener("onCloseImportDialog", () => {
|
|
17
|
+
g.current?.close();
|
|
18
|
+
})];
|
|
19
|
+
return () => {
|
|
20
|
+
e.forEach((e) => e());
|
|
21
|
+
};
|
|
22
|
+
}, []), u(() => {
|
|
23
|
+
let e = new URLSearchParams(window.location.search), t = e.get("input-fasta"), i = e.get("input-metadata");
|
|
24
|
+
(async () => {
|
|
25
|
+
if (t) {
|
|
26
|
+
h(n.LOADING);
|
|
27
|
+
try {
|
|
28
|
+
let e = await fetch(t);
|
|
29
|
+
if (!e.ok) throw Error(`FASTA fetch failed (${e.status})`);
|
|
30
|
+
let r = await e.text();
|
|
31
|
+
if (!r.trim()) throw h(n.ERROR), Error("The input-fasta URL returned no sequence data. Check that the URL and requested accession(s) are correct.");
|
|
32
|
+
let a;
|
|
33
|
+
if (i) try {
|
|
34
|
+
let e = await fetch(i);
|
|
35
|
+
e.ok && (a = await e.text());
|
|
36
|
+
} catch (e) {
|
|
37
|
+
console.warn("[App] Failed to auto-fetch metadata:", e);
|
|
38
|
+
}
|
|
39
|
+
await m(r, a);
|
|
40
|
+
} catch (e) {
|
|
41
|
+
console.error("[App] Failed to auto-load FASTA:", e);
|
|
42
|
+
let t = e instanceof Error ? e.message : "Failed to auto-load FASTA from the provided URL.";
|
|
43
|
+
o.resolve(r).emit("onShowImportDialog", t);
|
|
44
|
+
}
|
|
45
|
+
} else o.resolve(r).emit("onShowImportDialog");
|
|
46
|
+
})();
|
|
47
|
+
}, [m, h]);
|
|
48
|
+
let _ = l((e) => {
|
|
49
|
+
g.current?.close(), o.resolve(r).emit("onShowImportDialog", e);
|
|
50
|
+
}, []), v = l(async (n, r) => {
|
|
51
|
+
try {
|
|
52
|
+
await m(n, r), g.current?.close();
|
|
53
|
+
} catch (e) {
|
|
54
|
+
_(t.getErrorMessage(e, "Unknown error"));
|
|
55
|
+
} finally {
|
|
56
|
+
e.clearSearchParams();
|
|
57
|
+
}
|
|
58
|
+
}, [_, m]), y = l((e) => {
|
|
59
|
+
_(t.getErrorMessage(e, "Unknown error"));
|
|
60
|
+
}, [_]);
|
|
61
|
+
return /* @__PURE__ */ c(s, { children: /* @__PURE__ */ c(a, {
|
|
62
|
+
extraActions: f,
|
|
63
|
+
onDataChange: v,
|
|
64
|
+
onError: y,
|
|
65
|
+
ref: g
|
|
66
|
+
}) });
|
|
67
|
+
};
|
|
68
|
+
//#endregion
|
|
69
|
+
export { f as FastaDataImportDialogLoader };
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_Fragment","useStore","FastaDataImportDialogLoader","setData","store","state","setLoadingStatus","fastaDataImportDialogRef","useRef","useEffect","removers","container","FastaDataEventBusService","initialErrorMessage","remove","urlParams","inputFastaUrl","inputMetadataUrl","LOADING_STATUS","fastaRes","fastaText","metaText","metaRes","metaErr","fastaErr","message","handleError","useCallback","errorMessage","onDataChange","fastaContent","metadataContent","ErrorUtil","onError","Fragment","FastaDataImportDialog"],"sources":["../../../../src/components/fasta/FastaDataImportDialogLoader/FastaDataImportDialogLoader.tsx"],"sourcesContent":["import { container } from 'tsyringe';\nimport 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.models';\nimport type { FastaDataStore } from '../../../stores/fastaDataStore';\nimport { UrlUtil } from '../../../utils/UrlUtil';\nimport type { FastaDataImportDialogRefMethods } from '../FastaDataImportDialog';\nimport { FastaDataImportDialog } from '../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 container.resolve(FastaDataEventBusService).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 container.resolve(FastaDataEventBusService).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 container.resolve(FastaDataEventBusService).emit('onShowImportDialog', message);\n }\n } else {\n // PV1-02: Show data loading modal if no data provided via URL query params\n container.resolve(FastaDataEventBusService).emit('onShowImportDialog');\n }\n };\n\n void handleDeepLinking();\n }, [setData, setLoadingStatus]);\n\n const handleError = useCallback((errorMessage: string) => {\n fastaDataImportDialogRef.current?.close();\n container.resolve(FastaDataEventBusService).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":";;;;;;;;;;AAwBA,IAAaE,KAA+B,EAAE,iBAAc,eAA8C;CACxG,IAAMC,IAAUF,EAASG,IAAQ,MAAUC,EAAM,OAAO,GAClDC,IAAmBL,EAASG,IAAQ,MAAUC,EAAM,gBAAgB,GACpEE,IAA2BC,EAAwC,IAAI;CAkB7E,AAhBAC,QAAgB;EACd,IAAMC,IAAW,CAEfC,EAAU,QAAQC,CAAwB,CAAC,CAAC,iBAAiB,uBAAuB,MAAiC;GACnH,EAAyB,SAAS,KAAKC,IAAsB,EAAE,uBAAoB,IAAI,KAAA,CAAS;EAClG,CAAC,GAEDF,EAAU,QAAQC,CAAwB,CAAC,CAAC,iBAAiB,6BAA6B;GACxF,EAAyB,SAAS,MAAM;EAC1C,CAAC,CACH;EACA,aAAa;GACX,EAAS,SAAS,MAAWE,EAAO,CAAC;EACvC;CACF,GAAG,CAAC,CAAC,GAELL,QAAgB;EAEd,IAAMM,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,MADAd,EAAiBY,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,MAAMpB,EAAQiB,GAAWC,CAAQ;IACnC,SAASG,GAAU;KACjB,QAAQ,MAAM,oCAAoCA,CAAQ;KAC1D,IAAMC,IAAUD,aAAoB,QAAQA,EAAS,UAAU;KAC/D,EAAU,QAAQZ,CAAwB,CAAC,CAAC,KAAK,sBAAsBa,CAAO;IAChF;GACF,OAEE,EAAU,QAAQb,CAAwB,CAAC,CAAC,KAAK,oBAAoB;EAEzE,EAEK,CAAkB;CACzB,GAAG,CAACT,GAASG,CAAgB,CAAC;CAE9B,IAAMoB,IAAcC,GAAa,MAAyB;EAExD,AADApB,EAAyB,SAAS,MAAM,GACxCI,EAAU,QAAQC,CAAwB,CAAC,CAAC,KAAK,sBAAsBgB,CAAY;CACrF,GAAG,CAAC,CAAC,GAECC,IAAeF,EAAY,OAAO,GAAsB,MAA6B;EACzF,IAAI;GAEF,AADA,MAAMxB,EAAQ2B,GAAcC,CAAe,GAC3CxB,EAAyB,SAAS,MAAM;EAC1C,SAAS,GAAG;GACV,EAAYyB,EAAU,gBAAgB,GAAG,eAAe,CAAC;EAC3D,UAAU;GAER,EAAQ,kBAAkB;EAC5B;CACF,GAAG,CAACN,GAAavB,CAAO,CAAC,GAEnB8B,IAAUN,GAAa,MAA0B;EACrD,EAAYK,EAAU,gBAAgBJ,GAAc,eAAe,CAAC;CACtE,GAAG,CAACF,CAAW,CAAC;CAEhB,OACE,kBAAA1B,GAAA,EAAA,UACE,kBAACmC,GAAD;EACgB;EACA;EACL;EACT,KAAK5B;CACN,CAAA,EACD,CAAA;AAEN"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { FastaDataEventBusService as e } from "../../../classes/services/FastaDataEventBusService/index.js";
|
|
2
|
+
import { container as t } from "tsyringe";
|
|
3
|
+
import { Box as n, Button as r, Typography as i } from "@mui/material";
|
|
4
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
|
+
import { useCallback as s } from "react";
|
|
6
|
+
import c from "@mui/icons-material/FileUploadOutlined";
|
|
7
|
+
//#region src/components/fasta/FastaNotLoaded/FastaNotLoaded.tsx
|
|
8
|
+
var l = ({ description: l, icon: u, title: d }) => {
|
|
9
|
+
let f = s(() => {
|
|
10
|
+
t.resolve(e).emit("onShowImportDialog");
|
|
11
|
+
}, []);
|
|
12
|
+
return /* @__PURE__ */ o(n, {
|
|
13
|
+
sx: {
|
|
14
|
+
alignItems: "center",
|
|
15
|
+
display: "flex",
|
|
16
|
+
flexDirection: "column",
|
|
17
|
+
gap: 2,
|
|
18
|
+
height: "100%",
|
|
19
|
+
justifyContent: "center",
|
|
20
|
+
p: 3,
|
|
21
|
+
width: "100%"
|
|
22
|
+
},
|
|
23
|
+
children: [
|
|
24
|
+
u,
|
|
25
|
+
/* @__PURE__ */ a(i, {
|
|
26
|
+
color: "text.secondary",
|
|
27
|
+
sx: { fontWeight: 600 },
|
|
28
|
+
variant: "h6",
|
|
29
|
+
children: d
|
|
30
|
+
}),
|
|
31
|
+
/* @__PURE__ */ a(i, {
|
|
32
|
+
color: "text.secondary",
|
|
33
|
+
sx: {
|
|
34
|
+
maxWidth: 450,
|
|
35
|
+
textAlign: "center"
|
|
36
|
+
},
|
|
37
|
+
variant: "body2",
|
|
38
|
+
children: l
|
|
39
|
+
}),
|
|
40
|
+
/* @__PURE__ */ a(r, {
|
|
41
|
+
color: "primary",
|
|
42
|
+
onClick: f,
|
|
43
|
+
startIcon: /* @__PURE__ */ a(c, {}),
|
|
44
|
+
sx: { mt: 1 },
|
|
45
|
+
variant: "contained",
|
|
46
|
+
children: "Load Data"
|
|
47
|
+
})
|
|
48
|
+
]
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
//#endregion
|
|
52
|
+
export { l as FastaNotLoaded };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["FileUploadOutlinedIcon","FastaNotLoaded","onClickLoadData","useCallback","FastaDataEventBusService","Box","icon","Typography","title","description","Button"],"sources":["../../../../src/components/fasta/FastaNotLoaded/FastaNotLoaded.tsx"],"sourcesContent":["import { container } from 'tsyringe';\nimport {\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 container.resolve(FastaDataEventBusService).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":";;;;;;;AAkBA,IAAaC,KAAkB,EAAE,gBAAa,SAAM,eAAiC;CACnF,IAAMC,IAAkBC,QAAkB;EACxC,EAAU,QAAQC,CAAwB,CAAC,CAAC,KAAK,oBAAoB;CACvE,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,SAASR;IACT,WAAW,kBAACF,GAAD,CAAyB,CAAA;IACpC,IAAI,EAAE,IAAI,EAAE;IACZ,SAAS;IAER,UAAA;GACK,CAAA;EACL;;AAET"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as e } from "
|
|
1
|
+
import { t as e } from "../../../_chunks/react.js";
|
|
2
2
|
import { Box as t, Chip as n } from "@mui/material";
|
|
3
3
|
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
|
-
//#region src/components/FastaPageHeaderCenterComponent/FastaPageHeaderCenterComponent.tsx
|
|
4
|
+
//#region src/components/fasta/FastaPageHeaderCenterComponent/FastaPageHeaderCenterComponent.tsx
|
|
5
5
|
var a = ({ store: a }) => {
|
|
6
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
7
|
return /* @__PURE__ */ i(t, {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["useStore","FastaPageHeaderCenterComponent","parsedFasta","store","state","parsedMetadata","seqCount","metaCount","Box","Chip"],"sources":["../../../../src/components/fasta/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,27 @@
|
|
|
1
|
+
import { FastaDataEventBusService as e } from "../../../classes/services/FastaDataEventBusService/index.js";
|
|
2
|
+
import { container as t } from "tsyringe";
|
|
3
|
+
import { Button as n } from "@mui/material";
|
|
4
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
5
|
+
import { useCallback as i } from "react";
|
|
6
|
+
import a from "@mui/icons-material/FileUploadOutlined";
|
|
7
|
+
//#region src/components/fasta/FastaPageHeaderImportButton/FastaPageHeaderImportButton.tsx
|
|
8
|
+
var o = () => {
|
|
9
|
+
let o = i(() => t.resolve(e).emit("onShowImportDialog"), []);
|
|
10
|
+
return /* @__PURE__ */ r(n, {
|
|
11
|
+
color: "inherit",
|
|
12
|
+
onClick: o,
|
|
13
|
+
size: "small",
|
|
14
|
+
startIcon: /* @__PURE__ */ r(a, {}),
|
|
15
|
+
sx: {
|
|
16
|
+
"&:hover": { backgroundColor: "rgba(255, 255, 255, 0.25)" },
|
|
17
|
+
backgroundColor: "rgba(255, 255, 255, 0.15)",
|
|
18
|
+
color: "#FFFFFF"
|
|
19
|
+
},
|
|
20
|
+
variant: "contained",
|
|
21
|
+
children: "Import Data"
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
//#endregion
|
|
25
|
+
export { o as FastaPageHeaderImportButton };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["FileUploadOutlinedIcon","FastaPageHeaderImportButton","onImportDataButtonClick","useCallback","container","FastaDataEventBusService","Button"],"sources":["../../../../src/components/fasta/FastaPageHeaderImportButton/FastaPageHeaderImportButton.tsx"],"sourcesContent":["import { container } from 'tsyringe';\nimport FileUploadOutlinedIcon from '@mui/icons-material/FileUploadOutlined';\nimport { Button } from '@mui/material';\nimport { useCallback } from 'react';\n\nimport { FastaDataEventBusService } from '../../../classes/services/FastaDataEventBusService';\n\nexport const FastaPageHeaderImportButton = () => {\n const onImportDataButtonClick = useCallback(() => container.resolve(FastaDataEventBusService).emit('onShowImportDialog'), []);\n\n return (\n <Button\n color={'inherit'}\n onClick={onImportDataButtonClick}\n size={'small'}\n startIcon={<FileUploadOutlinedIcon />}\n sx={{\n '&:hover': {\n backgroundColor: 'rgba(255, 255, 255, 0.25)',\n },\n backgroundColor: 'rgba(255, 255, 255, 0.15)',\n color: '#FFFFFF',\n }}\n variant={'contained'}\n >\n {'Import Data'}\n </Button>\n );\n};\n"],"mappings":";;;;;;;AAOA,IAAaC,UAAoC;CAC/C,IAAMC,IAA0BC,QAAkBC,EAAU,QAAQC,CAAwB,CAAC,CAAC,KAAK,oBAAoB,GAAG,CAAC,CAAC;CAE5H,OACE,kBAACC,GAAD;EACE,OAAO;EACP,SAASJ;EACT,MAAM;EACN,WAAW,kBAACF,GAAD,CAAyB,CAAA;EACpC,IAAI;GACF,WAAW,EACT,iBAAiB,4BACnB;GACA,iBAAiB;GACjB,OAAO;EACT;EACA,SAAS;EAER,UAAA;CACK,CAAA;AAEZ"}
|
package/dist/components/{FastaPageHeaderResetButton → fasta/FastaPageHeaderResetButton}/index.js
RENAMED
|
@@ -4,7 +4,7 @@ import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
|
4
4
|
import { useCallback as o, useRef as s } from "react";
|
|
5
5
|
import c from "@mui/icons-material/RestartAlt";
|
|
6
6
|
import { Confirmation as l } from "@gen-epix/ui-core-components/components/Confirmation";
|
|
7
|
-
//#region src/components/FastaPageHeaderResetButton/FastaPageHeaderResetButton.tsx
|
|
7
|
+
//#region src/components/fasta/FastaPageHeaderResetButton/FastaPageHeaderResetButton.tsx
|
|
8
8
|
var u = ({ onReset: u }) => {
|
|
9
9
|
let d = s(null), f = o(() => {
|
|
10
10
|
d.current?.open();
|