From bdefd6e3f7c474db0008a305f6098b78863b2b78 Mon Sep 17 00:00:00 2001 From: Elscrux Date: Tue, 3 Sep 2024 22:07:02 +0200 Subject: [PATCH 1/2] feat: Add solver settings --- src/api/ToolboxAPI.ts | 48 ++--- src/api/data-model/MetaSolverSettings.ts | 30 --- src/api/data-model/ProblemDto.ts | 3 + src/api/data-model/SolverSettings.ts | 33 ++++ .../solvers/Graph/ProblemDetails.tsx | 23 ++- src/components/solvers/SettingsView.tsx | 179 ------------------ .../solvers/settings/CheckboxSettingView.tsx | 21 ++ .../solvers/settings/DoubleSettingView.tsx | 49 +++++ .../solvers/settings/IntegerSettingView.tsx | 36 ++++ .../solvers/settings/SelectSettingView.tsx | 25 +++ .../solvers/settings/SettingProps.tsx | 6 + .../solvers/settings/SettingsView.tsx | 132 +++++++++++++ .../solvers/settings/TextSettingView.tsx | 21 ++ 13 files changed, 371 insertions(+), 235 deletions(-) delete mode 100644 src/api/data-model/MetaSolverSettings.ts create mode 100644 src/api/data-model/SolverSettings.ts delete mode 100644 src/components/solvers/SettingsView.tsx create mode 100644 src/components/solvers/settings/CheckboxSettingView.tsx create mode 100644 src/components/solvers/settings/DoubleSettingView.tsx create mode 100644 src/components/solvers/settings/IntegerSettingView.tsx create mode 100644 src/components/solvers/settings/SelectSettingView.tsx create mode 100644 src/components/solvers/settings/SettingProps.tsx create mode 100644 src/components/solvers/settings/SettingsView.tsx create mode 100644 src/components/solvers/settings/TextSettingView.tsx diff --git a/src/api/ToolboxAPI.ts b/src/api/ToolboxAPI.ts index b856c01..d9a392c 100644 --- a/src/api/ToolboxAPI.ts +++ b/src/api/ToolboxAPI.ts @@ -1,6 +1,7 @@ import { getInvalidProblemDto, ProblemDto } from "./data-model/ProblemDto"; import { ProblemSolverInfo } from "./data-model/ProblemSolverInfo"; import { ProblemState } from "./data-model/ProblemState"; +import { SolverSetting } from "./data-model/SolverSettings"; import { SubRoutineDefinitionDto } from "./data-model/SubRoutineDefinitionDto"; /** @@ -61,11 +62,14 @@ export async function postProblem( export async function patchProblem( problemTypeId: string, problemId: string, - updateParameters: { input?: any; solverId?: string; state?: ProblemState } + updateParameters: { + input?: any; + solverId?: string; + state?: ProblemState; + solverSettings?: SolverSetting[]; + } ): Promise> { - let url = `${baseUrl()}/problems/${problemTypeId}/${problemId}`; - console.log(url); - return fetch(url, { + return fetch(`${baseUrl()}/problems/${problemTypeId}/${problemId}`, { method: "PATCH", headers: { "Content-Type": "application/json", @@ -105,9 +109,7 @@ export async function fetchSubRoutines( solverId: string ): Promise { return fetch( - `${baseUrl()}/sub-routines/${problemTypeId}?${new URLSearchParams({ - id: solverId, - })}`, + `${baseUrl()}/solvers/${problemTypeId}/${solverId}/sub-routines`, { method: "GET", headers: { @@ -123,18 +125,20 @@ export async function fetchSubRoutines( }); } -// export async function fetchMetaSolverSettings( -// problemTypeId: string -// ): Promise { -// return fetch(`${baseUrl()}/meta-solver/settings/${problemTypeId}`, { -// method: "GET", -// headers: { -// "Content-Type": "application/json", -// }, -// }) -// .then((response) => response.json()) -// .catch((reason) => { -// console.log(reason); -// return []; -// }); -// } +export async function fetchSolverSettings( + problemTypeId: string, + solverId: string +): Promise<[]> { + return fetch(`${baseUrl()}/solvers/${problemTypeId}/${solverId}/settings`, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }) + .then((response) => response.json()) + .catch((reason) => { + console.error(reason); + alert(`Could not retrieve subroutines of solver ${solverId}.`); + return []; + }); +} diff --git a/src/api/data-model/MetaSolverSettings.ts b/src/api/data-model/MetaSolverSettings.ts deleted file mode 100644 index f2471a9..0000000 --- a/src/api/data-model/MetaSolverSettings.ts +++ /dev/null @@ -1,30 +0,0 @@ -export enum MetaSolverSettingType { - RANGE = "RANGE", - CHECKBOX = "CHECKBOX", - TEXT = "TEXT", - SELECT = "SELECT", -} - -export interface MetaSolverSetting { - name: string; - type: MetaSolverSettingType; -} - -export interface RangeSetting extends MetaSolverSetting { - min: number; - max: number; - value: number; -} - -export interface CheckboxSetting extends MetaSolverSetting { - state: boolean; -} - -export interface TextSetting extends MetaSolverSetting { - text: string; -} - -export interface SelectSetting extends MetaSolverSetting { - options: string[]; - selectedOption: string; -} diff --git a/src/api/data-model/ProblemDto.ts b/src/api/data-model/ProblemDto.ts index 5d59260..5af02f8 100644 --- a/src/api/data-model/ProblemDto.ts +++ b/src/api/data-model/ProblemDto.ts @@ -1,5 +1,6 @@ import { ProblemState } from "./ProblemState"; import { getInvalidSolutionObject, SolutionObject } from "./SolutionObject"; +import { SolverSetting } from "./SolverSettings"; import { SubRoutineReferenceDto } from "./SubRoutineReferenceDto"; export interface ProblemDto { @@ -9,6 +10,7 @@ export interface ProblemDto { solution: SolutionObject; state: ProblemState; solverId?: string; + solverSettings: SolverSetting[]; subProblems: SubRoutineReferenceDto[]; error: string; } @@ -20,6 +22,7 @@ export function getInvalidProblemDto(): ProblemDto { input: {} as T, solution: getInvalidSolutionObject(), solverId: "", + solverSettings: [], state: ProblemState.READY_TO_SOLVE, subProblems: [], typeId: "", diff --git a/src/api/data-model/SolverSettings.ts b/src/api/data-model/SolverSettings.ts new file mode 100644 index 0000000..f8bd877 --- /dev/null +++ b/src/api/data-model/SolverSettings.ts @@ -0,0 +1,33 @@ +export enum SolverSettingType { + INTEGER = "INTEGER", + DOUBLE = "DOUBLE", + CHECKBOX = "CHECKBOX", + TEXT = "TEXT", + SELECT = "SELECT", +} + +export interface SolverSetting { + name: string; + description: string; + type: SolverSettingType; + required: boolean; +} + +export interface RangeSetting extends SolverSetting { + min: number; + max: number; + value: number; +} + +export interface CheckboxSetting extends SolverSetting { + state: boolean; +} + +export interface TextSetting extends SolverSetting { + text: string; +} + +export interface SelectSetting extends SolverSetting { + options: string[]; + selectedOption: string; +} diff --git a/src/components/solvers/Graph/ProblemDetails.tsx b/src/components/solvers/Graph/ProblemDetails.tsx index 81f1fb7..2d5ebfc 100644 --- a/src/components/solvers/Graph/ProblemDetails.tsx +++ b/src/components/solvers/Graph/ProblemDetails.tsx @@ -12,7 +12,9 @@ import { import { ReactNode } from "react"; import { ProblemDto } from "../../../api/data-model/ProblemDto"; import { ProblemState } from "../../../api/data-model/ProblemState"; +import { SettingsView } from "../settings/SettingsView"; import { SolutionView } from "../SolutionView"; +import { useGraphUpdates } from "./ProblemGraphView"; import { useSolvers } from "./SolverProvider"; function getHumanReadableState(state: ProblemState) { @@ -46,10 +48,15 @@ function getAccordionItem(label: string, content: ReactNode) { export const ProblemDetails = (props: { problemDto: ProblemDto }) => { const { solvers, getSolvers } = useSolvers(); + const { updateProblem } = useGraphUpdates(); // Update solvers in case they are not loaded yet if (!solvers[props.problemDto.typeId]) getSolvers(props.problemDto.typeId); + const solver = solvers[props.problemDto.typeId]?.find( + (s) => s.id === props.problemDto.solverId + ); + return (