Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
13755a3
Merge pull request #117 from DiamondLightSource/ePSIC
fallars May 28, 2026
38e6529
Add skeleton for unified post-processing page
yousefmoazzam Jun 24, 2026
affff04
Adding workflows Resource component to the epsic part of imaginghub
fallars Jun 24, 2026
aa23898
use new resource component in the epsic page
fallars Jun 24, 2026
9e4bf0e
attempting a fix for the linting error
fallars Jun 24, 2026
06f229e
Merge pull request #120 from DiamondLightSource/unified-page-skeleton
yousefmoazzam Jun 30, 2026
41cd98e
Add minimal session selector component
yousefmoazzam Jun 24, 2026
29ea5e1
Merge pull request #122 from DiamondLightSource/minimal-session-selector
yousefmoazzam Jul 2, 2026
282a677
Add minimal scan selector component
yousefmoazzam Jul 2, 2026
73ea0f8
Merge pull request #123 from DiamondLightSource/minimal-scan-selector
yousefmoazzam Jul 3, 2026
1422d41
Update frontend dependencies
yousefmoazzam Jul 16, 2026
826d7d6
Fix layout of workflows forms
yousefmoazzam Jul 16, 2026
84feb91
Apply code formatter
yousefmoazzam Jul 16, 2026
dac8e16
Merge pull request #124 from DiamondLightSource/update-frontend-deps
yousefmoazzam Jul 16, 2026
233fd9e
Replace `image-pixels` dependency with `fast-png`
yousefmoazzam Jul 20, 2026
f5de6a0
Merge pull request #125 from DiamondLightSource/replace-image-pixels-dep
yousefmoazzam Jul 20, 2026
6f989bf
Update `sci-react-ui` dependency to v0.6.2-alpha.1
yousefmoazzam Jul 20, 2026
3fbc4ae
Fix MUI warnings
yousefmoazzam Jul 20, 2026
0519f0d
Merge pull request #126 from DiamondLightSource/update-frontend-deps
yousefmoazzam Jul 20, 2026
3cf74b0
Update `vite` dev dependency version
yousefmoazzam Jul 20, 2026
2484aab
Merge pull request #127 from DiamondLightSource/update-frontend-vite-dep
yousefmoazzam Jul 20, 2026
0ed6fb4
Remove test data used for cropping page development
yousefmoazzam Jul 20, 2026
5416fa5
Merge pull request #128 from DiamondLightSource/remove-crop-data
yousefmoazzam Jul 20, 2026
b94db80
Merge pull request #2 from DiamondLightSource/main
fallars Jul 21, 2026
ec71175
Update backend deps which address highest priority security vulnerabi…
yousefmoazzam Jul 21, 2026
a972413
Remove duplicate pillow dep in requirements file
yousefmoazzam Jul 21, 2026
9404713
Merge pull request #129 from DiamondLightSource/update-backend-depend…
yousefmoazzam Jul 21, 2026
af2020c
Update pillow dependency to latest current version
yousefmoazzam Jul 21, 2026
c627087
Merge pull request #130 from DiamondLightSource/update-pillow-dep
yousefmoazzam Jul 21, 2026
1c97264
Pin davidia version
yousefmoazzam Jul 22, 2026
506047c
Merge pull request #131 from DiamondLightSource/pin-davidia-version
yousefmoazzam Jul 22, 2026
e6db18f
Merge branch 'DiamondLightSource:main' into main
fallars Jul 22, 2026
aa1fde9
moving the Resource component from ePSIC into newly created shared_co…
fallars Jul 22, 2026
c6f4f87
changing the type of cpus, gpus and nprocs to number instead of text.…
fallars Jul 22, 2026
b3a9148
corrected formatting
fallars Jul 22, 2026
d4d2d7c
Merge pull request #121 from fallars/main
fallars Jul 22, 2026
c33fc3f
Update version
yousefmoazzam Jul 23, 2026
661c875
Merge pull request #132 from DiamondLightSource/bump-version
yousefmoazzam Jul 23, 2026
86315e5
Add env vars for graphql endpoints
yousefmoazzam Jul 23, 2026
2411c85
Move from workflows subgraph to supergraph
yousefmoazzam Jul 23, 2026
3653c8b
Add instrument session service query through supergraph
yousefmoazzam Jul 24, 2026
e4e0f7f
Bump version
yousefmoazzam Jul 24, 2026
b5f17f3
Merge pull request #133 from DiamondLightSource/migrate-to-supergraph
yousefmoazzam Jul 24, 2026
6b780d4
Setup unit testing of non-relay react components
yousefmoazzam Jul 28, 2026
eae924b
Add basic tests for scan selector component
yousefmoazzam Jul 28, 2026
9b6c8a8
Run frontend tests in CI
yousefmoazzam Jul 28, 2026
20b3aaf
Merge pull request #135 from DiamondLightSource/non-relay-component-t…
yousefmoazzam Jul 31, 2026
b2d0be4
Add type definitions
jessicavers Jun 4, 2026
b9e4534
Add initial form data and workflow data
jessicavers Jun 4, 2026
6cfcede
Add OptionSelect component
jessicavers Jun 4, 2026
7de3c7c
Update WorkflowForm
jessicavers Jun 4, 2026
162c70f
Add Toggle for workflow categories
jessicavers Aug 4, 2026
d16ba91
Update name references for template and technique
jessicavers Aug 5, 2026
f8d8b93
Add outpath to I14 dashboard
jessicavers Jul 30, 2026
7f2ee3d
Merge pull request #136 from DiamondLightSource/wf-categories
jessicavers Aug 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/_frontend_code.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:
- main

jobs:
lint:
checks:
runs-on: ubuntu-latest
steps:
- name: Checkout repository code
Expand All @@ -27,3 +27,7 @@ jobs:
- name: Check Formatting of TypeScript Code
working-directory: frontend
run: npm run format:check

- name: Run Tests
working-directory: frontend
run: npm run test
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ VITE_KEYCLOAK_URL = "https://identity-test.diamond.ac.uk"
VITE_KEYCLOAK_REALM = "dls"
VITE_KEYCLOAK_CLIENT_ID = "ImagingHubDev"
VITE_KEYCLOAK_SCOPE = "openid profile posix-uid email"
VITE_GRAPHQL_HTTP_ENDPOINT = "https://graph-nightly.diamond.ac.uk/graphql"
VITE_GRAPHQL_WS_ENDPOINT = "wss://graph-nightly.diamond.ac.uk/graphql/ws"
```

#### Install dependencies and generate code from GraphQL schema
Expand Down
13 changes: 6 additions & 7 deletions backend/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ certifi==2024.12.14
click==8.1.8
dnspython==2.7.0
email_validator==2.2.0
fastapi==0.115.6
fastapi==0.137.2
fastapi-cli==0.0.7
h11==0.14.0
h11==0.16.0
httomolib
httpcore==1.0.7
httpcore==1.0.9
httptools==0.6.4
httpx==0.28.1
idna==3.10
Expand All @@ -22,12 +22,12 @@ mdurl==0.1.2
networkx==3.4.2
numpy==2.2.2
packaging==24.2
pillow==11.1.0
pillow==12.3.0
pydantic==2.10.5
pydantic_core==2.27.2
Pygments==2.19.1
python-dotenv==1.0.1
python-multipart==0.0.20
python-multipart==0.0.31
PyWavelets==1.9.0
PyYAML==6.0.2
rich==13.9.4
Expand All @@ -36,11 +36,10 @@ scikit-image==0.25.0
scipy==1.15.1
shellingham==1.5.4
sniffio==1.3.1
starlette==0.41.3
starlette==1.3.1
tifffile==2025.1.10
typer==0.15.1
typing_extensions==4.12.2
uvicorn==0.34.0
uvloop==0.21.0
watchfiles==1.0.4
Pillow>=10.0.0
2 changes: 2 additions & 0 deletions frontend/.env.production
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ VITE_KEYCLOAK_URL = "https://identity.diamond.ac.uk"
VITE_KEYCLOAK_REALM = "dls"
VITE_KEYCLOAK_CLIENT_ID = "ImagingHub"
VITE_KEYCLOAK_SCOPE = "openid profile posix-uid email"
VITE_GRAPHQL_HTTP_ENDPOINT = "https://graph.diamond.ac.uk/graphql"
VITE_GRAPHQL_WS_ENDPOINT = "wss://graph.diamond.ac.uk/graphql/ws"
6 changes: 3 additions & 3 deletions frontend/dashboard/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
CardContent,
Container,
Divider,
Grid2,
Grid,
Typography,
} from "@mui/material";
import { Link } from "react-router-dom";
Expand Down Expand Up @@ -38,7 +38,7 @@ const Dashboard: React.FC = () => {
<Typography fontSize={30} display="flex" justifyContent="center">
ImagingHub
</Typography>
<Grid2 display="flex">
<Grid display="flex">
<AppCard
name="Tomography"
desc="Web app for HTTomo"
Expand All @@ -50,7 +50,7 @@ const Dashboard: React.FC = () => {
desc="ePSIC workflow submission"
linkTarget="ePSIC"
/>
</Grid2>
</Grid>
</Container>
</>
);
Expand Down
2 changes: 2 additions & 0 deletions frontend/ePSIC/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { WorkflowForm } from "./components/workflows/WorkflowForm";
import { ResourceForm } from "../../shared_components/ResourceForm";

export const App: React.FC = () => {
return (
<>
<WorkflowForm />
<ResourceForm />
</>
);
};
112 changes: 55 additions & 57 deletions frontend/ePSIC/src/components/workflows/WorkflowForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,67 +60,65 @@ export const WorkflowForm: FC = () => {
);

return (
<Grid container justifyContent="center" spacing={1}>
<Grid size={3}>
<Typography variant="h4">ePSIC Workflows</Typography>
<Stack>
<Typography variant="h4">ePSIC Workflows</Typography>

<form
onSubmit={(e) => {
e.preventDefault();
openLink();
}}
>
<Stack direction="column" spacing={2}>
<InputLabel size="small" id="workflow-select-label">
Workflow
</InputLabel>
<Grid>
<Select
labelId="workflow-select-label"
label="Workflow"
variant="outlined"
size="small"
name="workflow"
value={data.workflow}
onChange={(e: SelectChangeEvent<string>) =>
setData((prev) => ({ ...prev, workflow: e.target.value }))
}
>
{workflowOptions.map((opt) => (
<MenuItem key={opt.value} value={opt.value}>
{opt.label}
</MenuItem>
))}
</Select>
<Tooltip title={option.desc}>
<IconButton>
<InfoIcon />
</IconButton>
</Tooltip>
</Grid>
<TextField
name="visit"
label="Visit"
<form
onSubmit={(e) => {
e.preventDefault();
openLink();
}}
>
<Stack direction="column" spacing={2}>
<InputLabel size="small" id="workflow-select-label">
Workflow
</InputLabel>
<Grid>
<Select
labelId="workflow-select-label"
label="Workflow"
variant="outlined"
size="small"
placeholder="Visit"
type="text"
value={data.visit}
onChange={(e: ChangeEvent<HTMLInputElement>) => {
const value = e.target.value;
setData((prev) => ({ ...prev, visit: value }));
}}
helperText={visitMatch ? "" : "Expected format: xx12345-1"}
error={!visitMatch}
/>
name="workflow"
value={data.workflow}
onChange={(e: SelectChangeEvent<string>) =>
setData((prev) => ({ ...prev, workflow: e.target.value }))
}
>
{workflowOptions.map((opt) => (
<MenuItem key={opt.value} value={opt.value}>
{opt.label}
</MenuItem>
))}
</Select>
<Tooltip title={option.desc}>
<IconButton>
<InfoIcon />
</IconButton>
</Tooltip>
</Grid>
<TextField
name="visit"
label="Visit"
variant="outlined"
size="small"
placeholder="Visit"
type="text"
value={data.visit}
onChange={(e: ChangeEvent<HTMLInputElement>) => {
const value = e.target.value;
setData((prev) => ({ ...prev, visit: value }));
}}
helperText={visitMatch ? "" : "Expected format: xx12345-1"}
error={!visitMatch}
/>

<Button variant="contained" type="submit" disabled={!visitMatch}>
Submit
</Button>
</Stack>
</form>
</Grid>
</Grid>
<Button variant="contained" type="submit" disabled={!visitMatch}>
Submit
</Button>
</Stack>
</form>
</Stack>
);
};

Expand Down
51 changes: 51 additions & 0 deletions frontend/i14/src/components/workflows/OptionSelect.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import React, { FC } from "react";
import {
FormControl,
InputLabel,
Select,
IconButton,
Tooltip,
Grid,
} from "@mui/material";
import InfoIcon from "@mui/icons-material/Info";
import type { SelectChangeEvent } from "@mui/material/Select";
import type { Option } from "../../types/workflowFields";

type Props = {
label: string;
value: string;
options: Option[];
onChange: (e: SelectChangeEvent<string>) => void;
};

const OptionSelect: FC<Props> = ({ label, value, options, onChange }) => {
const selected = options.find((o) => o.value === value);

return (
<FormControl>
<InputLabel shrink>{label}</InputLabel>
<Grid>
<Select
native
label={label}
size="small"
value={value}
onChange={onChange}
>
{options.map((opt) => (
<option key={opt.value} value={opt.value}>
{opt.label}
</option>
))}
</Select>
<Tooltip title={selected?.desc ?? ""}>
<IconButton>
<InfoIcon />
</IconButton>
</Tooltip>
</Grid>
</FormControl>
);
};

export default OptionSelect;
Loading
Loading