Skip to content

Commit f2aa966

Browse files
committed
feat(frontend): added a science group template filter
1 parent 6e8b212 commit f2aa966

File tree

5 files changed

+115
-9
lines changed

5 files changed

+115
-9
lines changed

frontend/dashboard/src/routes/TemplatesListPage.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
import { Suspense } from "react";
1+
import { Suspense, useState } from "react";
22
import { Link } from "react-router-dom";
33
import { Container, Box, Typography } from "@mui/material";
44
import { Breadcrumbs } from "@diamondlightsource/sci-react-ui";
5-
import { WorkflowsNavbar } from "workflows-lib";
5+
import { WorkflowsNavbar, WorkflowTemplatesFilter } from "workflows-lib";
66
import TemplatesListView from "relay-workflows-lib/lib/views/TemplatesListView";
77
import WorkflowErrorBoundaryWithRetry from "workflows-lib/lib/components/workflow/WorkflowErrorBoundaryWithRetry";
88

99
const TemplatesListPage: React.FC = () => {
10+
const [workflowTemplatesFilter, setWorkflowTemplatesFilter] = useState<
11+
WorkflowTemplatesFilter | undefined
12+
>(undefined);
1013
return (
1114
<>
1215
<WorkflowsNavbar />
@@ -25,7 +28,12 @@ const TemplatesListPage: React.FC = () => {
2528
}
2629
>
2730
<Box mt={2} mb={2}>
28-
<TemplatesListView />
31+
<TemplatesListView
32+
filter={workflowTemplatesFilter}
33+
setFilter={(newFilter: WorkflowTemplatesFilter) => {
34+
setWorkflowTemplatesFilter(newFilter);
35+
}}
36+
/>
2937
</Box>
3038
</Suspense>
3139
)}

frontend/relay-workflows-lib/lib/views/TemplatesListView.tsx

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import { useState, ChangeEvent, useMemo, useEffect } from "react";
22
import { graphql, useLazyLoadQuery } from "react-relay";
3-
import { Box, Pagination } from "@mui/material";
3+
import { Box, Pagination, Stack } from "@mui/material";
44
import { useClientSidePagination } from "../utils/coreUtils";
55
import TemplateSearchField from "workflows-lib/lib/components/template/TemplateSearchField";
66
import type { TemplatesListViewQuery as TemplatesListViewQueryType } from "./__generated__/TemplatesListViewQuery.graphql";
77
import TemplateCard from "../components/TemplateCard";
88
import { templateMatchesSearch } from "../utils/useTemplateMatchesSearch";
9+
import { ScienceGroupSelector, WorkflowTemplatesFilter } from "workflows-lib";
910

1011
export const TemplatesListViewQuery = graphql`
11-
query TemplatesListViewQuery {
12-
workflowTemplates {
12+
query TemplatesListViewQuery($filter: WorkflowTemplatesFilter) {
13+
workflowTemplates(filter: $filter) {
1314
nodes {
1415
name
1516
title
@@ -20,10 +21,16 @@ export const TemplatesListViewQuery = graphql`
2021
}
2122
`;
2223

23-
export default function TemplatesListView() {
24+
export default function TemplatesListView({
25+
filter,
26+
setFilter,
27+
}: {
28+
filter?: WorkflowTemplatesFilter;
29+
setFilter: (filter: WorkflowTemplatesFilter) => void;
30+
}) {
2431
const data = useLazyLoadQuery<TemplatesListViewQueryType>(
2532
TemplatesListViewQuery,
26-
{},
33+
{ filter },
2734
);
2835
const [search, setSearch] = useState("");
2936

@@ -57,7 +64,10 @@ export default function TemplatesListView() {
5764

5865
return (
5966
<>
60-
<TemplateSearchField handleSearch={handleSearch} />
67+
<Stack direction="row" spacing={1}>
68+
<TemplateSearchField handleSearch={handleSearch} />
69+
<ScienceGroupSelector setFilter={setFilter} />
70+
</Stack>
6171
<Box
6272
display="flex"
6373
flexDirection="column"
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { useState } from "react";
2+
import { ScienceGroup, WorkflowTemplatesFilter } from "../../types";
3+
import {
4+
Button,
5+
FormControl,
6+
InputLabel,
7+
MenuItem,
8+
OutlinedInput,
9+
Select,
10+
SelectChangeEvent,
11+
Stack,
12+
} from "@mui/material";
13+
14+
const scienceGroups = [
15+
{ label: "MX", value: ScienceGroup.MX },
16+
{ label: "Examples", value: ScienceGroup.Examples },
17+
{ label: "Magnetic Materials", value: ScienceGroup.MagneticMaterials },
18+
{ label: "Soft Condensed Matter", value: ScienceGroup.CondensedMatter },
19+
{ label: "Imaging and Microscopy", value: ScienceGroup.Imaging },
20+
{ label: "Biological Cryo-Imaging", value: ScienceGroup.BioCryoImaging },
21+
{ label: "Structures and Surfaces", value: ScienceGroup.Surfaces },
22+
{ label: "Crystallography", value: ScienceGroup.Crystallography },
23+
{ label: "Spectroscopy", value: ScienceGroup.Spectroscopy },
24+
];
25+
26+
export default function ScienceGroupSelector({
27+
setFilter,
28+
}: {
29+
setFilter: (filter: WorkflowTemplatesFilter) => void;
30+
}) {
31+
const [scienceGroup, setScienceGroup] = useState<ScienceGroup[]>([]);
32+
33+
const handleSelect = (event: SelectChangeEvent) => {
34+
if (event.target.value == "") {
35+
setScienceGroup([]);
36+
} else {
37+
setScienceGroup([event.target.value as ScienceGroup]);
38+
}
39+
};
40+
41+
const handleClick = () => {
42+
setFilter({ scienceGroup } as WorkflowTemplatesFilter);
43+
};
44+
45+
return (
46+
<>
47+
<Stack direction="row" spacing={1}>
48+
<FormControl sx={{ width: 300 }}>
49+
<InputLabel>Science Group</InputLabel>
50+
<Select
51+
onChange={handleSelect}
52+
value={scienceGroup[0] ?? ""}
53+
input={<OutlinedInput label="Science Group" />}
54+
>
55+
<MenuItem key="No Group" value="">
56+
No Group
57+
</MenuItem>
58+
{scienceGroups.map((item) => (
59+
<MenuItem key={item.value} value={item.value}>
60+
{item.label}
61+
</MenuItem>
62+
))}
63+
</Select>
64+
</FormControl>
65+
<Button variant="contained" onClick={handleClick}>
66+
Apply
67+
</Button>
68+
</Stack>
69+
</>
70+
);
71+
}

frontend/workflows-lib/lib/main.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ export { default as FileUploadButton } from "./components/template/controls/File
88
export { default as ScanRangeInput } from "./components/template/controls/ScanRangeInput";
99
export { default as JsonFormsFileUploadRenderer } from "./components/template/jsonforms/JsonFormsFileUploadRenderer";
1010
export { default as JsonFormsScanRangeRenderer } from "./components/template/jsonforms/JsonFormsScanRangeRenderer";
11+
export { default as ScienceGroupSelector } from "./components/template/ScienceGroupSelector";
1112
export * from "./types";

frontend/workflows-lib/lib/types.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,22 @@ export interface WorkflowQueryFilter {
6767
workflowStatusFilter?: WorkflowStatusBool;
6868
}
6969

70+
export enum ScienceGroup {
71+
MX = "MX",
72+
Examples = "EXAMPLES",
73+
MagneticMaterials = "MAGNETIC_MATERIALS",
74+
CondensedMatter = "CONDENSED_MATTER",
75+
Imaging = "IMAGING",
76+
BioCryoImaging = "BIO_CRYO_IMAGING",
77+
Surfaces = "SURFACES",
78+
Crystallography = "CRYSTALLOGRAPHY",
79+
Spectroscopy = "SPECTROSCOPY",
80+
}
81+
82+
export interface WorkflowTemplatesFilter {
83+
scienceGroup?: ScienceGroup[];
84+
}
85+
7086
export interface WorkflowStatusBool {
7187
pending?: boolean;
7288
running?: boolean;

0 commit comments

Comments
 (0)