Skip to content

Commit db2b508

Browse files
authored
Merge pull request #851 from ebi-uniprot/job-state
Jobs SharedWorker
2 parents 8498e1f + 5a12613 commit db2b508

File tree

313 files changed

+1646
-1722
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

313 files changed

+1646
-1722
lines changed

__mocks__/idb.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
/* eslint-disable import/no-import-module-exports, import/no-extraneous-dependencies */
21
// structuredClone not in JSDom (as of Aug 2024)
32
import 'core-js/stable/structured-clone';
3+
// eslint-disable-next-line import/no-extraneous-dependencies
44
import 'fake-indexeddb/auto';
55

6-
export { openDB, IDBPDatabase } from 'idb';
6+
export { IDBPDatabase, openDB } from 'idb';

jest.setup.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import '@testing-library/jest-dom';
22
import 'interaction-viewer';
33
import 'swagger-ui-react';
4+
45
import { resetUuidV1 } from './__mocks__/uuid';
56

67
global.gtag = () => {
@@ -22,6 +23,12 @@ jest.mock('interaction-viewer', () => null);
2223

2324
jest.mock('/shared/custom-elements/NightingaleMSA', () => jest.fn());
2425

26+
jest.mock('/shared/workers/jobs/getJobSharedWorker', () => ({
27+
__esModule: true,
28+
default: jest.fn(),
29+
dispatchJobs: jest.fn(),
30+
}));
31+
2532
jest.mock('@nightingale-elements/nightingale-navigation', () => jest.fn());
2633

2734
jest.mock('swagger-ui-react', () => null);

src/app/components/App.tsx

Lines changed: 67 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import BaseLayout from '../../shared/components/layouts/BaseLayout';
2525
import { SingleColumnLayout } from '../../shared/components/layouts/SingleColumnLayout';
2626
import useReloadApp from '../../shared/hooks/useReloadApp';
2727
import useScrollToTop from '../../shared/hooks/useScrollToTop';
28+
import useSupportsJobs from '../../shared/hooks/useSupportsJobs';
2829
import { Namespace, SearchableNamespace } from '../../shared/types/namespaces';
2930
import history from '../../shared/utils/browserHistory';
3031
import { stringifyQuery, stringifyUrl } from '../../shared/utils/url';
@@ -211,56 +212,56 @@ const ARBAEntryPage = lazy(
211212
const BlastResult = lazy(
212213
() =>
213214
import(
214-
/* webpackChunkName: "blast-result" */ '../../tools/blast/components/results/BlastResult'
215+
/* webpackChunkName: "blast-result" */ '../../jobs/blast/components/results/BlastResult'
215216
)
216217
);
217218
const BlastForm = lazy(
218219
() =>
219220
import(
220-
/* webpackChunkName: "blast-form" */ '../../tools/blast/components/BlastForm'
221+
/* webpackChunkName: "blast-form" */ '../../jobs/blast/components/BlastForm'
221222
)
222223
);
223224
const AlignResult = lazy(
224225
() =>
225226
import(
226-
/* webpackChunkName: "align-result" */ '../../tools/align/components/results/AlignResult'
227+
/* webpackChunkName: "align-result" */ '../../jobs/align/components/results/AlignResult'
227228
)
228229
);
229230
const AlignForm = lazy(
230231
() =>
231232
import(
232-
/* webpackChunkName: "align-form" */ '../../tools/align/components/AlignForm'
233+
/* webpackChunkName: "align-form" */ '../../jobs/align/components/AlignForm'
233234
)
234235
);
235236
const IDMappingResult = lazy(
236237
() =>
237238
import(
238-
/* webpackChunkName: "id-mapping-result" */ '../../tools/id-mapping/components/results/IDMappingResult'
239+
/* webpackChunkName: "id-mapping-result" */ '../../jobs/id-mapping/components/results/IDMappingResult'
239240
)
240241
);
241242
const IDMappingForm = lazy(
242243
() =>
243244
import(
244-
/* webpackChunkName: "id-mapping-form" */ '../../tools/id-mapping/components/IDMappingForm'
245+
/* webpackChunkName: "id-mapping-form" */ '../../jobs/id-mapping/components/IDMappingForm'
245246
)
246247
);
247248
const PeptideSearchResult = lazy(
248249
() =>
249250
import(
250-
/* webpackChunkName: "peptide-search-result" */ '../../tools/peptide-search/components/results/PeptideSearchResult'
251+
/* webpackChunkName: "peptide-search-result" */ '../../jobs/peptide-search/components/results/PeptideSearchResult'
251252
)
252253
);
253254
const PeptideSearchForm = lazy(
254255
() =>
255256
import(
256-
/* webpackChunkName: "peptide-search-form" */ '../../tools/peptide-search/components/PeptideSearchForm'
257+
/* webpackChunkName: "peptide-search-form" */ '../../jobs/peptide-search/components/PeptideSearchForm'
257258
)
258259
);
259260

260261
const Dashboard = lazy(
261262
() =>
262263
import(
263-
/* webpackChunkName: "dashboard" */ '../../tools/dashboard/components/Dashboard'
264+
/* webpackChunkName: "dashboard" */ '../../jobs/dashboard/components/Dashboard'
264265
)
265266
);
266267

@@ -318,6 +319,13 @@ const ResourceNotFoundPage = lazy(
318319
)
319320
);
320321

322+
const JobsNotSupportedPage = lazy(
323+
() =>
324+
import(
325+
/* webpackChunkName: "jobs-not-supported" */ '../../shared/components/error-pages/JobsNotSupported'
326+
)
327+
);
328+
321329
const ContextualHelp = lazy(() =>
322330
sleep(1000).then(
323331
() =>
@@ -404,6 +412,11 @@ const RedirectToStarSearch = (
404412
);
405413
};
406414

415+
const IfSupportsJobs = ({ children }: React.PropsWithChildren) => {
416+
const supportsJobs = useSupportsJobs();
417+
return <>{supportsJobs ? children : <JobsNotSupportedPage />}</>;
418+
};
419+
407420
const App = () => {
408421
useScrollToTop(history);
409422
useReloadApp(history);
@@ -500,58 +513,84 @@ const App = () => {
500513
{/* Tools */}
501514
<Route
502515
path={LocationToPath[Location.BlastResult]}
503-
component={BlastResult}
516+
render={() => (
517+
<IfSupportsJobs>
518+
<BlastResult />
519+
</IfSupportsJobs>
520+
)}
504521
/>
505522
<Route
506523
path={LocationToPath[Location.Blast]}
507524
render={() => (
508-
<SingleColumnLayout>
509-
<BlastForm />
510-
</SingleColumnLayout>
525+
<IfSupportsJobs>
526+
<SingleColumnLayout>
527+
<BlastForm />
528+
</SingleColumnLayout>
529+
</IfSupportsJobs>
511530
)}
512531
/>
513532
<Route
514533
path={LocationToPath[Location.AlignResult]}
515-
component={AlignResult}
534+
render={() => (
535+
<IfSupportsJobs>
536+
<AlignResult />
537+
</IfSupportsJobs>
538+
)}
516539
/>
517540
<Route
518541
path={LocationToPath[Location.Align]}
519542
render={() => (
520-
<SingleColumnLayout>
521-
<AlignForm />
522-
</SingleColumnLayout>
543+
<IfSupportsJobs>
544+
<SingleColumnLayout>
545+
<AlignForm />
546+
</SingleColumnLayout>
547+
</IfSupportsJobs>
523548
)}
524549
/>
525550
<Route
526551
path={LocationToPath[Location.PeptideSearchResult]}
527-
component={PeptideSearchResult}
552+
render={() => (
553+
<IfSupportsJobs>
554+
<PeptideSearchResult />
555+
</IfSupportsJobs>
556+
)}
528557
/>
529558
<Route
530559
path={LocationToPath[Location.PeptideSearch]}
531560
render={() => (
532-
<SingleColumnLayout>
533-
<PeptideSearchForm />
534-
</SingleColumnLayout>
561+
<IfSupportsJobs>
562+
<SingleColumnLayout>
563+
<PeptideSearchForm />
564+
</SingleColumnLayout>
565+
</IfSupportsJobs>
535566
)}
536567
/>
537568
<Route
538569
path={LocationToPath[Location.IDMappingResult]}
539-
component={IDMappingResult}
570+
render={() => (
571+
<IfSupportsJobs>
572+
<IDMappingResult />
573+
</IfSupportsJobs>
574+
)}
540575
/>
541576
<Route
542577
path={LocationToPath[Location.IDMapping]}
543578
render={() => (
544-
<SingleColumnLayout>
545-
<IDMappingForm />
546-
</SingleColumnLayout>
579+
<IfSupportsJobs>
580+
<SingleColumnLayout>
581+
<IDMappingForm />
582+
</SingleColumnLayout>
583+
</IfSupportsJobs>
547584
)}
548585
/>
549586
<Route
550587
path={LocationToPath[Location.Dashboard]}
551588
render={() => (
552-
<SingleColumnLayout>
553-
<Dashboard />
554-
</SingleColumnLayout>
589+
<IfSupportsJobs>
590+
<SingleColumnLayout>
591+
<Dashboard />
592+
</SingleColumnLayout>
593+
</IfSupportsJobs>
555594
)}
556595
/>
557596
{/* Basket */}

src/app/components/home-page/AnalysisTools.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import AlignIllustration from '../../../images/align_illustration.img.svg';
66
import BlastIllustration from '../../../images/blast_illustration.img.svg';
77
import IDMappingIllustration from '../../../images/id-mapping_illustration.img.svg';
88
import PeptideSearchIllustration from '../../../images/peptide_search_illustration.img.svg';
9-
import { JobTypes } from '../../../tools/types/toolsJobTypes';
9+
import { JobTypes } from '../../../jobs/types/jobTypes';
1010
import { jobTypeToPath, Location, LocationToPath } from '../../config/urls';
1111
import styles from './styles/non-critical.module.scss';
1212

src/app/config/urls.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@ import { LocationDescriptorObject } from 'history';
22
import { partial } from 'lodash-es';
33
import { generatePath, matchPath } from 'react-router-dom';
44

5+
import { databaseToNamespace } from '../../jobs/blast/config/BlastFormData';
6+
import { FormParameters as BLASTFormParameters } from '../../jobs/blast/types/blastFormParameters';
7+
import { Database } from '../../jobs/blast/types/blastServerParameters';
8+
import { FormParameters as IdMappingFormParameters } from '../../jobs/id-mapping/types/idMappingFormParameters';
9+
import { JobTypes } from '../../jobs/types/jobTypes';
510
import {
611
Namespace,
712
namespaceAndToolsLabels,
813
SearchableNamespace,
914
searchableNamespaceLabels,
1015
supportingDataAndAANamespaces,
1116
} from '../../shared/types/namespaces';
12-
import { databaseToNamespace } from '../../tools/blast/config/BlastFormData';
13-
import { FormParameters as BLASTFormParameters } from '../../tools/blast/types/blastFormParameters';
14-
import { Database } from '../../tools/blast/types/blastServerParameters';
15-
import { FormParameters as IdMappingFormParameters } from '../../tools/id-mapping/types/idMappingFormParameters';
16-
import { FinishedJob, Job } from '../../tools/types/toolsJob';
17-
import { JobTypes } from '../../tools/types/toolsJobTypes';
17+
import { FinishedJob, Job } from '../../shared/workers/jobs/types/job';
1818

1919
export const IDMappingNamespaces = [
2020
Namespace.uniprotkb,

src/app/contexts/Global.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { Router } from 'react-router-dom';
55
import ErrorBoundary from '../../shared/components/error-component/ErrorBoundary';
66
import { IDMappingDetailsProvider } from '../../shared/contexts/IDMappingDetails';
77
import { MessagesProvider } from '../../shared/contexts/Messages';
8-
import { ToolsProvider } from '../../shared/contexts/Tools';
98
import { UniProtDataProvider } from '../../shared/contexts/UniProtData';
109
import history from '../../shared/utils/browserHistory';
1110

@@ -16,11 +15,9 @@ const GlobalContext: FC<React.PropsWithChildren<unknown>> = ({ children }) => (
1615
<HelmetProvider>
1716
<MessagesProvider>
1817
{/* Order is important, tools needs to be within messages */}
19-
<ToolsProvider>
20-
<UniProtDataProvider>
21-
<IDMappingDetailsProvider>{children}</IDMappingDetailsProvider>
22-
</UniProtDataProvider>
23-
</ToolsProvider>
18+
<UniProtDataProvider>
19+
<IDMappingDetailsProvider>{children}</IDMappingDetailsProvider>
20+
</UniProtDataProvider>
2421
</MessagesProvider>
2522
</HelmetProvider>
2623
</ErrorBoundary>

src/automatic-annotations/arba/config/__tests__/ARBAColumnConfiguration.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import ARBAColumnConfiguration, {
88
ARBAColumn,
99
} from '../ARBAColumnConfiguration';
1010

11-
jest.mock('../../../../tools/utils/storage');
11+
jest.mock('../../../../shared/workers/jobs/utils/storage');
1212

1313
const transformedData: ARBAUIModel = databaseConverter(data[0]);
1414

src/automatic-annotations/unirule/config/__tests__/UniRuleColumnConfiguration.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import UniRuleColumnConfiguration, {
88
UniRuleColumn,
99
} from '../UniRuleColumnConfiguration';
1010

11-
jest.mock('../../../../tools/utils/storage');
11+
jest.mock('../../../../shared/workers/jobs/utils/storage');
1212

1313
const transformedData: UniRuleUIModel = databaseConverter(data[1]);
1414

src/basket/BasketFullView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Loader, PageIntro } from 'franklin-sites';
22
import { useRouteMatch } from 'react-router-dom';
33

44
import { basketNamespaces, Location, LocationToPath } from '../app/config/urls';
5+
import { reIds } from '../jobs/utils/urls';
56
import HTMLHead from '../shared/components/HTMLHead';
67
import { SidebarLayout } from '../shared/components/layouts/SideBarLayout';
78
import ResultsButtons from '../shared/components/results/ResultsButtons';
@@ -19,7 +20,6 @@ import {
1920
searchableNamespaceLabels,
2021
} from '../shared/types/namespaces';
2122
import { SearchResults } from '../shared/types/results';
22-
import { reIds } from '../tools/utils/urls';
2323
import { updateResultsWithAccessionSubsets } from './BasketMiniView';
2424
import EmptyBasket from './EmptyBasket';
2525

src/basket/BasketMiniView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Dispatch, SetStateAction, useEffect, useMemo } from 'react';
33
import { generatePath, Link } from 'react-router-dom';
44

55
import { Location, LocationToPath } from '../app/config/urls';
6+
import { reIds } from '../jobs/utils/urls';
67
import ResultsButtons from '../shared/components/results/ResultsButtons';
78
import ResultsData from '../shared/components/results/ResultsData';
89
import useBasket, { Basket } from '../shared/hooks/useBasket';
@@ -17,7 +18,6 @@ import usePagination from '../shared/hooks/usePagination';
1718
import { APIModel } from '../shared/types/apiModel';
1819
import { Namespace } from '../shared/types/namespaces';
1920
import { getIdKeyForData } from '../shared/utils/getIdKey';
20-
import { reIds } from '../tools/utils/urls';
2121
import { UniParcColumn } from '../uniparc/config/UniParcColumnConfiguration';
2222
import { UniProtkbAPIModel } from '../uniprotkb/adapters/uniProtkbConverter';
2323
import { UniProtKBColumn } from '../uniprotkb/types/columnTypes';

0 commit comments

Comments
 (0)