From 13e12e25b127e4965cc93ada0e06c231ac194c66 Mon Sep 17 00:00:00 2001 From: Noemi Frisina Date: Tue, 24 Feb 2026 11:08:42 +0000 Subject: [PATCH 1/9] Add corgotten parameter in json request for POST --- src/blueapi/blueapi.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/blueapi/blueapi.ts b/src/blueapi/blueapi.ts index aa0caad..78b44eb 100644 --- a/src/blueapi/blueapi.ts +++ b/src/blueapi/blueapi.ts @@ -79,6 +79,7 @@ function submitTask(request: BlueApiRequestBody): Promise { return blueApiCall("/tasks", "POST", { name: request.planName, params: request.planParams, + instrument_session: request.instrumentSession, }).then((res) => { if (!res.ok) { throw new Error( From cb927fad692ed8278bcdabc42267da0d861b1c9a Mon Sep 17 00:00:00 2001 From: Noemi Frisina Date: Tue, 24 Feb 2026 11:12:51 +0000 Subject: [PATCH 2/9] Add instrument session to SelectionControl --- src/components/SelectionControl.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/SelectionControl.tsx b/src/components/SelectionControl.tsx index 1f818fc..ec0ac74 100644 --- a/src/components/SelectionControl.tsx +++ b/src/components/SelectionControl.tsx @@ -3,6 +3,7 @@ import { FormControl, InputLabel, MenuItem, Select } from "@mui/material"; import { forceString, useParsedPvConnection } from "#/pv/util.ts"; import { submitAndRunPlanImmediately } from "#/blueapi/blueapi.ts"; import type { PvDescription } from "#/pv/types.ts"; +import { parseInstrumentSession, readVisitFromPv } from "#/blueapi/visit.ts"; type SelectionProps = PvDescription & { id: string; @@ -24,12 +25,17 @@ export function SelectionWithPlanRunner(props: SelectionProps) { console.log(`${props.id} current value: ${currentValue}`); const [_, updateVal] = React.useState(currentValue.toString()); + // FIXME, temporary - will be fixed by using context everywhere + const fullVisit = readVisitFromPv(); + let instrumentSession: string; + const handleChange = (newValue: typeof currentValue) => { updateVal(newValue); + instrumentSession = parseInstrumentSession(fullVisit); submitAndRunPlanImmediately({ planName: props.plan_name, planParams: { position: newValue }, - instrumentSession: "", // FIXME, temporary + instrumentSession: instrumentSession, }); }; From 742007b50d1b091540457fd6887317dfed37f6a2 Mon Sep 17 00:00:00 2001 From: Noemi Frisina Date: Tue, 24 Feb 2026 11:20:53 +0000 Subject: [PATCH 3/9] Add a prop to RunPlanButton for passing the visit --- src/blueapi/BlueapiComponents.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/blueapi/BlueapiComponents.tsx b/src/blueapi/BlueapiComponents.tsx index 37e28c4..3b4f70b 100644 --- a/src/blueapi/BlueapiComponents.tsx +++ b/src/blueapi/BlueapiComponents.tsx @@ -20,6 +20,7 @@ type RunPlanButtonProps = { btnLabel: string | ReactNode; planName: string; planParams?: object; + currentVisit?: string; title?: string; btnVariant?: VariantChoice; btnSize?: ButtonSize; @@ -36,7 +37,12 @@ export function RunPlanButton(props: RunPlanButtonProps) { const [msg, setMsg] = React.useState("Running plan..."); const [severity, setSeverity] = React.useState("info"); - const fullVisit = readVisitFromPv(); + let fullVisit: string; + if (props.currentVisit === undefined) { + fullVisit = readVisitFromPv(); + } else { + fullVisit = props.currentVisit; + } let instrumentSession: string; const params = props.planParams ? props.planParams : {}; From 1161e956946c7047a277c5e0204de2dd8ee2a58b Mon Sep 17 00:00:00 2001 From: Noemi Frisina Date: Tue, 24 Feb 2026 11:36:40 +0000 Subject: [PATCH 4/9] Pass the instrument session from JF to plan --- src/components/JungFrau/CollectionSetupJf.tsx | 16 +++++++++++----- src/routes/JungfrauRotation.tsx | 5 ++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/components/JungFrau/CollectionSetupJf.tsx b/src/components/JungFrau/CollectionSetupJf.tsx index 3323fa5..cb3ea2a 100644 --- a/src/components/JungFrau/CollectionSetupJf.tsx +++ b/src/components/JungFrau/CollectionSetupJf.tsx @@ -13,13 +13,17 @@ import React from "react"; import { useContext } from "react"; import { ParameterInput } from "../ParameterInputs"; -function fullStorageDirectory(visit: string): string { +function fullStorageDirectory(currentVisit: string): string { + return `${currentVisit}/jungfrau/`; +} + +function getCurrentVisit(instrumentSession: string): string { const date = new Date(); const year = date.getFullYear(); - return `/dls/i24/data/${year}/${visit}/jungfrau/`; + return `/dls/i24/data/${year}/${instrumentSession}`; } -function RunButtons(): JSX.Element { +function RunButtons({ currentVisit }: { currentVisit: string }): JSX.Element { const { expTime, detDist, @@ -45,6 +49,7 @@ function RunButtons(): JSX.Element { transmissions: transFract, sample_id: sampleId, }} + currentVisit={currentVisit} title="Run the jungfrau rotation scan plan" btnSize="large" /> @@ -58,7 +63,8 @@ export function CollectionSetupJf() { const theme = useTheme(); const context = useContext(JungfrauRotationContext); const { visit } = useContext(VisitContext); - const storageDirectory = fullStorageDirectory(visit); + const currentVisit = getCurrentVisit(visit); + const storageDirectory = fullStorageDirectory(currentVisit); return ( @@ -129,7 +135,7 @@ export function CollectionSetupJf() { tooltip="Request transmission value(s) for collection, expressed as a fraction. If running a single rotation, just input one value, if running multiples please pass a list." /> - + ); diff --git a/src/routes/JungfrauRotation.tsx b/src/routes/JungfrauRotation.tsx index e18bc53..d45e485 100644 --- a/src/routes/JungfrauRotation.tsx +++ b/src/routes/JungfrauRotation.tsx @@ -6,6 +6,7 @@ import { ErrorBoundary } from "react-error-boundary"; import { RoPvBox } from "#/pv/PvComponent.tsx"; import { FallbackScreen } from "#/screens/FallbackScreen.tsx"; +import { VisitProvider } from "#/context/VisitProvider.tsx"; export function JfRotation() { const theme = useTheme(); @@ -30,7 +31,9 @@ export function JfRotation() { - + + + From 0bb66a7feba6e3576cc2ebcb4872eacf19ac7a79 Mon Sep 17 00:00:00 2001 From: Noemi Frisina Date: Tue, 24 Feb 2026 11:39:05 +0000 Subject: [PATCH 5/9] Tidy up a bit and add the visit to darks too --- src/components/JungFrau/CollectDarksPanel.tsx | 9 ++++++++- src/components/JungFrau/CollectionSetupJf.tsx | 11 +---------- src/components/JungFrau/jfUtils.ts | 9 +++++++++ 3 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 src/components/JungFrau/jfUtils.ts diff --git a/src/components/JungFrau/CollectDarksPanel.tsx b/src/components/JungFrau/CollectDarksPanel.tsx index 21b39ba..8031161 100644 --- a/src/components/JungFrau/CollectDarksPanel.tsx +++ b/src/components/JungFrau/CollectDarksPanel.tsx @@ -11,10 +11,12 @@ import { Typography, useTheme, } from "@mui/material"; -import React from "react"; +import React, { useContext } from "react"; import { ParameterInput } from "../ParameterInputs"; import { GainModes } from "./constants"; import { RunPlanButton } from "#/blueapi/BlueapiComponents.tsx"; +import { VisitContext } from "#/context/VisitContext.ts"; +import { getCurrentVisit } from "./jfUtils"; export function CollectDarksPanel() { const theme = useTheme(); @@ -25,6 +27,9 @@ export function CollectDarksPanel() { const [totTriggers, setTotTriggers] = React.useState(1000); const [gainMode, setGainMode] = React.useState(GainModes[0]); + const { visit } = useContext(VisitContext); + const currentVisit = getCurrentVisit(visit); + return ( @@ -87,6 +92,7 @@ export function CollectDarksPanel() { pedestal_loops: pedestalLoops, filename: filename, }} + currentVisit={currentVisit} title="Collect pedestal darks" btnSize="large" /> @@ -139,6 +145,7 @@ export function CollectDarksPanel() { total_triggers: totTriggers, filename: filename, }} + currentVisit={currentVisit} title="Collect non pedestal darks" btnSize="large" /> diff --git a/src/components/JungFrau/CollectionSetupJf.tsx b/src/components/JungFrau/CollectionSetupJf.tsx index cb3ea2a..3799e40 100644 --- a/src/components/JungFrau/CollectionSetupJf.tsx +++ b/src/components/JungFrau/CollectionSetupJf.tsx @@ -12,16 +12,7 @@ import { import React from "react"; import { useContext } from "react"; import { ParameterInput } from "../ParameterInputs"; - -function fullStorageDirectory(currentVisit: string): string { - return `${currentVisit}/jungfrau/`; -} - -function getCurrentVisit(instrumentSession: string): string { - const date = new Date(); - const year = date.getFullYear(); - return `/dls/i24/data/${year}/${instrumentSession}`; -} +import { fullStorageDirectory, getCurrentVisit } from "./jfUtils"; function RunButtons({ currentVisit }: { currentVisit: string }): JSX.Element { const { diff --git a/src/components/JungFrau/jfUtils.ts b/src/components/JungFrau/jfUtils.ts new file mode 100644 index 0000000..bbdda63 --- /dev/null +++ b/src/components/JungFrau/jfUtils.ts @@ -0,0 +1,9 @@ +export function fullStorageDirectory(currentVisit: string): string { + return `${currentVisit}/jungfrau/`; +} + +export function getCurrentVisit(instrumentSession: string): string { + const date = new Date(); + const year = date.getFullYear(); + return `/dls/i24/data/${year}/${instrumentSession}`; +} From 0d9486874d809fffe852a6fa7389acca8d6f87f7 Mon Sep 17 00:00:00 2001 From: Noemi Frisina Date: Tue, 24 Feb 2026 11:39:53 +0000 Subject: [PATCH 6/9] Update package version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 64b374f..c62276a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "i24-daq-ui", "private": true, - "version": "0.0.7", + "version": "0.0.9", "type": "module", "scripts": { "dev": "vite", From 825a4d4ffb3214399cf8b29d6e683ee45a6855fe Mon Sep 17 00:00:00 2001 From: Noemi Frisina Date: Tue, 24 Feb 2026 11:48:02 +0000 Subject: [PATCH 7/9] Change where the slash is for reasons --- src/components/JungFrau/jfUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/JungFrau/jfUtils.ts b/src/components/JungFrau/jfUtils.ts index bbdda63..2ff1c1c 100644 --- a/src/components/JungFrau/jfUtils.ts +++ b/src/components/JungFrau/jfUtils.ts @@ -1,9 +1,9 @@ export function fullStorageDirectory(currentVisit: string): string { - return `${currentVisit}/jungfrau/`; + return `${currentVisit}jungfrau`; } export function getCurrentVisit(instrumentSession: string): string { const date = new Date(); const year = date.getFullYear(); - return `/dls/i24/data/${year}/${instrumentSession}`; + return `/dls/i24/data/${year}/${instrumentSession}/`; } From c81711467e718e4066ec6dff24a9c5ec358e0be1 Mon Sep 17 00:00:00 2001 From: Noemi Frisina Date: Tue, 24 Feb 2026 11:49:51 +0000 Subject: [PATCH 8/9] readd last slash --- src/components/JungFrau/jfUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/JungFrau/jfUtils.ts b/src/components/JungFrau/jfUtils.ts index 2ff1c1c..47038a1 100644 --- a/src/components/JungFrau/jfUtils.ts +++ b/src/components/JungFrau/jfUtils.ts @@ -1,5 +1,5 @@ export function fullStorageDirectory(currentVisit: string): string { - return `${currentVisit}jungfrau`; + return `${currentVisit}jungfrau/`; } export function getCurrentVisit(instrumentSession: string): string { From 66f6c7791e42b945c57c26630b63bec2af0cf9d2 Mon Sep 17 00:00:00 2001 From: Noemi Frisina Date: Tue, 24 Feb 2026 11:54:09 +0000 Subject: [PATCH 9/9] Add one log --- src/blueapi/BlueapiComponents.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/blueapi/BlueapiComponents.tsx b/src/blueapi/BlueapiComponents.tsx index 3b4f70b..c11fae6 100644 --- a/src/blueapi/BlueapiComponents.tsx +++ b/src/blueapi/BlueapiComponents.tsx @@ -58,6 +58,7 @@ export function RunPlanButton(props: RunPlanButtonProps) { setOpenSnackbar(true); try { instrumentSession = parseInstrumentSession(fullVisit); + console.log(`Current instrument session: ${instrumentSession}`); submitAndRunPlanImmediately({ planName: props.planName, planParams: params,