Skip to content

Commit d8a86d2

Browse files
Merge pull request #614 from bcgsc/develop
Update release branch v7.0.1
2 parents 602cc4a + 4f03c1b commit d8a86d2

File tree

8 files changed

+226
-55
lines changed

8 files changed

+226
-55
lines changed

app/App.tsx

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/**
22
* @module /App
33
*/
4+
import { QueryClientProvider, QueryClient } from 'react-query';
45
import { SnackbarProvider } from 'notistack';
56
import CssBaseline from '@mui/material/CssBaseline';
67
import { ThemeProvider, StyledEngineProvider } from '@mui/material/styles';
@@ -23,6 +24,16 @@ import '@ag-grid-community/core/dist/styles/ag-theme-material.min.css';
2324
import '@fontsource/roboto';
2425
import './styles/ag-grid.scss';
2526

27+
const queryClient = new QueryClient({
28+
defaultOptions: {
29+
queries: {
30+
staleTime: 15 * 60 * 1000, // 15m
31+
refetchOnWindowFocus: false,
32+
refetchOnMount: false,
33+
},
34+
},
35+
});
36+
2637
ModuleRegistry.registerModules([
2738
ClientSideRowModelModule,
2839
CsvExportModule,
@@ -42,15 +53,17 @@ function App() {
4253
return (
4354
<StyledEngineProvider injectFirst>
4455
<ThemeProvider theme={theme}>
45-
<SnackbarProvider anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}>
46-
<SnackbarUtilsConfigurator />
47-
<CssBaseline />
48-
<BrowserRouter basename={basename}>
49-
<CacheBuster>
50-
<MainView />
51-
</CacheBuster>
52-
</BrowserRouter>
53-
</SnackbarProvider>
56+
<QueryClientProvider client={queryClient}>
57+
<SnackbarProvider anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}>
58+
<SnackbarUtilsConfigurator />
59+
<CssBaseline />
60+
<BrowserRouter basename={basename}>
61+
<CacheBuster>
62+
<MainView />
63+
</CacheBuster>
64+
</BrowserRouter>
65+
</SnackbarProvider>
66+
</QueryClientProvider>
5467
</ThemeProvider>
5568
</StyledEngineProvider>
5669
);

app/utils/getGeneProp.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
const getGeneProp = (params, property) => {
22
const { data: { variant, variantType } } = params;
33
if (variantType === 'sv') {
4-
return variant.gene1?.[property] || variant.gene2?.[property] || false;
4+
return variant?.gene1?.[property] || variant.gene2?.[property] || false;
55
}
6-
return variant.gene?.[property] || false;
6+
return variant?.gene?.[property] || false;
77
};
88

99
export default getGeneProp;

app/views/ReportView/components/CancerPredisposition/columnDefs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ const columnDefs: ColDef[] = [{
129129
hide: true,
130130
valueGetter: (params: ValueGetterParams): string => {
131131
const { data: { variant } } = params;
132-
return variant.zygosity;
132+
return variant?.zygosity;
133133
},
134134
}, {
135135
headerName: 'Oncogene',

app/views/ReportView/components/KbMatches/columnDefs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ const columnDefs: ColDef[] = [
115115
hide: true,
116116
valueGetter: (params) => {
117117
const { data: { variant } } = params;
118-
return variant.zygosity;
118+
return variant?.zygosity;
119119
},
120120
}, {
121121
headerName: 'Oncogene',

app/views/ReportView/components/Pharmacogenomic/columnDefs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ const columnDefs: ColDef[] = [{
106106
hide: true,
107107
valueGetter: (params: ValueGetterParams): string => {
108108
const { data: { variant } } = params;
109-
return variant.zygosity;
109+
return variant?.zygosity;
110110
},
111111
}, {
112112
headerName: 'Oncogene',

app/views/TemplateView/index.tsx

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,39 @@
1-
import React, { useState, useEffect, useCallback } from 'react';
2-
import { useSnackbar } from 'notistack';
1+
import React, { useState, useCallback } from 'react';
2+
import { useQuery, useMutation, useQueryClient } from 'react-query';
3+
import snackbar from '@/services/SnackbarUtils';
34

45
import DataTable from '@/components/DataTable';
56
import api from '@/services/api';
67
import AddEditTemplate from './components/AddEditTemplate';
78
import columnDefs from './columnDefs';
89

10+
const fetchTemplates = async () => api.get('/templates', {}).request();
11+
12+
const deleteTemplate = async (ident: string) => {
13+
await api.del(`/templates/${ident}/signature-types`, {}, {}).request();
14+
return api.del(`/templates/${ident}`, {}, {}).request();
15+
};
16+
917
const TemplateView = (): JSX.Element => {
1018
const [showDialog, setShowDialog] = useState(false);
11-
const [templates, setTemplates] = useState([]);
1219
const [selectedRow, setSelectedRow] = useState();
20+
const queryClient = useQueryClient();
1321

14-
const snackbar = useSnackbar();
22+
const { data: templates = [] } = useQuery({
23+
queryKey: ['templates'],
24+
queryFn: fetchTemplates,
25+
});
1526

16-
useEffect(() => {
17-
const getData = async () => {
18-
const templatesResp = await api.get('/templates', {}).request();
19-
setTemplates(templatesResp);
20-
};
21-
getData();
22-
}, []);
27+
const deleteMutation = useMutation({
28+
mutationFn: deleteTemplate,
29+
onSuccess: () => {
30+
queryClient.invalidateQueries({ queryKey: ['templates'] });
31+
snackbar.success('Template deleted');
32+
},
33+
onError: (err) => {
34+
snackbar.error(`Error deleting template: ${err}`);
35+
},
36+
});
2337

2438
const handleEditStart = (rowData) => {
2539
setShowDialog(true);
@@ -31,28 +45,19 @@ const TemplateView = (): JSX.Element => {
3145
const handleDialogClose = useCallback((newData) => {
3246
setShowDialog(false);
3347
if (newData) {
34-
const templateIndex = templates.findIndex((template) => template.ident === newData.ident);
35-
if (templateIndex !== -1) {
36-
const newTemplates = [...templates];
37-
newTemplates[templateIndex] = newData;
38-
setTemplates(newTemplates);
39-
} else {
40-
setTemplates((prevVal) => [...prevVal, newData]);
41-
}
48+
queryClient.invalidateQueries({ queryKey: ['templates'] });
4249
}
4350
setSelectedRow(null);
44-
}, [templates]);
51+
}, [queryClient]);
4552

4653
const handleDelete = useCallback(async (rowData) => {
4754
try {
48-
await api.del(`/templates/${rowData.ident}/signature-types`, {}, {}).request();
49-
await api.del(`/templates/${rowData.ident}`, {}, {}).request();
50-
setTemplates((prevVal) => prevVal.filter((template) => template.ident !== rowData.ident));
51-
snackbar.enqueueSnackbar('Template deleted');
55+
deleteMutation.mutate(rowData.ident);
56+
snackbar.success('Template deleted');
5257
} catch (err) {
53-
snackbar.enqueueSnackbar(`Error deleting template: ${err}`);
58+
snackbar.error(`Error deleting template: ${err}`);
5459
}
55-
}, [snackbar]);
60+
}, [deleteMutation]);
5661

5762
return (
5863
<div>

0 commit comments

Comments
 (0)