Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | 12643x 12643x 12643x 12643x 12643x 12643x 12643x 12643x 13554x 12643x 12643x 12643x 1x 1x 1x 1x 13558x 12643x 50572x 12643x 1x 1x 1x 16695x 12643x 1642x 88501x 12643x 12643x 14669x 14543x 12643x 12643x 37929x 63215x | import { BugPlay, Check, Play, Plus, Rows3 } from "lucide-react";
import { useSearchParams } from "react-router-dom";
import { useCoreScenarioCreateMutation } from "@/api/apiStore.gen";
import { useFlowsheetAccess } from "@/hooks/flowsheetAccess";
import { useCurrentGroup } from "@/hooks/flowsheetObjects";
import {
DropdownMenuContent,
DropdownMenuItem,
// DropdownMenuSeparator, // uncomment if you want a divider
} from "../../../../../ahuora-design-system/ui/dropdown-menu";
import { useSolve } from "../../Solving/useSolve";
import { ContentTypes } from "../LeftSideBarTabDefinitions";
import { useScenarios } from "./useScenarios";
export function ScenarioDropdown() {
const [requestSolve] = useSolve();
const access = useFlowsheetAccess();
const canMutate = access?.can_edit ?? true;
const currentGroup = useCurrentGroup();
const rootObjectId = currentGroup?.simulationObject;
const scenarios = useScenarios() as any;
const [searchParams, setSearchParams] = useSearchParams();
const scenarioIdParam = searchParams.get("scenario");
const selectedScenarioId = scenarioIdParam
? Number(scenarioIdParam)
: undefined;
const [addScenario] = useCoreScenarioCreateMutation();
const goToScenario = (id?: number) => {
setSearchParams((params) => {
const newParams = new URLSearchParams(params);
if (id === undefined) {
newParams.delete("scenario");
} else {
newParams.set("scenario", id.toString());
}
newParams.set("content", ContentTypes.scenarios);
return newParams;
});
};
const runDiagnostics = () => {
Iif (!canMutate) return;
requestSolve(selectedScenarioId, true);
};
const onAddScenario = async () => {
Iif (!canMutate) return;
Iif (!rootObjectId) return;
const result = await addScenario({
scenario: { simulationObject: rootObjectId },
} as any);
const newScenario = (result as any)?.data;
if (newScenario?.id) {
goToScenario(newScenario.id);
}
};
const hasScenarios = scenarios?.length > 0;
return (
<DropdownMenuContent align="end">
{hasScenarios && (
<div className="flex flex-col gap-2">
<DropdownMenuItem
className="gap-2"
onClick={() => requestSolve(undefined)}
aria-label="Run Without Scenario"
disabled={!canMutate}
>
<Play /> Run without scenario
</DropdownMenuItem>
{scenarios?.map((scenario) => (
<DropdownMenuItem
className="gap-2"
key={scenario.id}
onClick={() => goToScenario(scenario.id)}
aria-label={`Select ${scenario.displayName}`}
>
{scenario.id === selectedScenarioId ? (
<Check />
) : (
<div className="w-4" />
)}
{scenario.displayName}
</DropdownMenuItem>
))}
</div>
)}
<DropdownMenuItem
className="gap-2"
onClick={onAddScenario}
aria-label="Add New Scenario"
disabled={!canMutate}
>
<Plus /> Add new scenario
</DropdownMenuItem>
{hasScenarios && (
<DropdownMenuItem
className="gap-2"
onClick={() => goToScenario(undefined)}
aria-label="Show All Scenarios"
>
<Rows3 /> Show All Scenarios
</DropdownMenuItem>
)}
<DropdownMenuItem
className="gap-2"
onClick={runDiagnostics}
aria-label="Run Diagnostics"
disabled={!canMutate}
>
<BugPlay /> Run Diagnostics
</DropdownMenuItem>
</DropdownMenuContent>
);
}
|