diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index eb3645af..7be83950 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -11,8 +11,10 @@ import { SvgIcon } from "@mui/material";
import SettingsIcon from "@mui/icons-material/Settings";
import { ParameterDisplayGroupsContext } from "./contexts/ParameterDisplayGroupsContext";
import { reducer, JobsContext } from "./contexts/JobsContext";
+import { reducer as jobRunsReducer, JobRunsContext } from "./contexts/JobRunsContext";
import { ParameterStoreProvider } from "./contexts/ParameterStoreContext";
import { useJobsSync } from "./hooks/useJobsSync";
+import { useJobRunsSync } from "./hooks/useJobRunsSync";
import { deviceInfoReducer, DeviceInfoContext } from "./contexts/DeviceInfoContext";
import { useDevicesSync } from "./hooks/useDevicesSync";
import { DeviceStateContext, deviceStateReducer } from "./contexts/DeviceStateContext";
@@ -74,6 +76,7 @@ export const BRANDING = {
export default function App() {
const [scheduledJobs, schedulerDispatch] = useReducer(reducer, {});
+ const [jobRuns, jobRunsDispatch] = useReducer(jobRunsReducer, {});
const [deviceInfo, deviceInfoDispatch] = useReducer(deviceInfoReducer, {});
const [deviceStates, deviceStateDispatch] = useReducer(deviceStateReducer, null);
const parameterStore = useParameterStore();
@@ -82,6 +85,7 @@ export default function App() {
const experiments = useExperiments();
useJobsSync(schedulerDispatch);
+ useJobRunsSync(jobRunsDispatch);
useDevicesSync(deviceStateDispatch, deviceInfoDispatch);
return (
@@ -91,16 +95,18 @@ export default function App() {
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/frontend/src/components/JobStatusIndicator.tsx b/frontend/src/components/JobStatusIndicator.tsx
index 76e5c7ec..196a473e 100644
--- a/frontend/src/components/JobStatusIndicator.tsx
+++ b/frontend/src/components/JobStatusIndicator.tsx
@@ -7,6 +7,7 @@ const statusColorMap: Record = {
[JobRunStatus.DONE]: "grey",
[JobRunStatus.PROCESSING]: "green",
[JobRunStatus.FAILED]: "red",
+ [JobRunStatus.PAUSED]: "orange",
};
const capitalize = (s: string | undefined) =>
diff --git a/frontend/src/components/JobView.tsx b/frontend/src/components/JobView.tsx
index 3b3eb7e1..dbcf6499 100644
--- a/frontend/src/components/JobView.tsx
+++ b/frontend/src/components/JobView.tsx
@@ -22,10 +22,12 @@ import { useJobInfo } from "../hooks/useJobInfo";
import { runMethod } from "../socket";
import { ExperimentMetadata } from "../types/ExperimentMetadata";
import { SerializedObject } from "../types/SerializedObject";
-import { JobStatus } from "../types/enums";
+import { JobRunStatus, JobStatus } from "../types/enums";
import { deserialize } from "../utils/deserializer";
import { updateJobParams } from "../utils/updateJobParams";
import { cancelJob } from "../utils/cancelJob";
+import { pauseJob } from "../utils/pauseJob";
+import { resumeJob } from "../utils/resumeJob";
import HistogramPlot from "./jobView/HistogramPlot";
import FitPanel from "./jobView/FitPanel";
@@ -226,11 +228,35 @@ export const JobView = ({
{jobInfo?.status !== JobStatus.PROCESSED && (
<>
+
+