All files / src/pages/flowsheet-page/flowsheet/LeftSideBar/Scenarios ScenarioDropdown.tsx

65.07% Statements 41/63
60.97% Branches 25/41
30% Functions 3/10
79.54% Lines 35/44

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                            9522x 9522x 9522x 9522x 9522x 9522x 9522x 9522x 10323x 9522x       9522x   9522x 1x 1x       1x   1x     10323x   9522x     38088x   9522x       1x       1x   1x   13018x   9522x                               1619x                             66654x           9522x   9522x 11270x                   11178x           9522x   9522x 28566x 47610x      
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>
  );
}