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

80.64% Statements 25/31
83.33% Branches 10/12
55.55% Functions 5/9
83.33% Lines 25/30

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                                  5684x 5684x 5684x 5684x 5684x 5684x 5684x   5684x   5684x 1x 1x 1x     1x   1x 1x       5684x       5684x 1x   1x       1x 1x   1x       5684x   5684x                           1117x                                                                                  
import { useEffect, useMemo, useState } from "react";
import { useSearchParams } from "react-router-dom";
import { BugPlay, Check, Plus, Rows3, Play } from "lucide-react";
 
import {
  DropdownMenuContent,
  DropdownMenuItem,
  // DropdownMenuSeparator, // uncomment if you want a divider
} from "../../../../../ahuora-design-system/ui/dropdown-menu";
 
import { useCoreScenarioCreateMutation } from "@/api/apiStore.gen";
import { useCurrentGroup } from "@/hooks/flowsheetObjects";
import { ContentTypes } from "../LeftSideBarTabDefinitions";
import { useScenarios } from "./useScenarios";
import { useSolve } from "../../Solving/useSolve";
 
export function ScenarioDropdown() {
  const [requestSolve] = useSolve();
  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);
      Iif (id === undefined) {
        newParams.delete("scenario");
      } else {
        newParams.set("scenario", id.toString());
      }
      newParams.set("content", ContentTypes.scenarios);
      return newParams;
    });
  };
 
  const runDiagnostics = () => {
    requestSolve(selectedScenarioId, true);
  };
 
  const onAddScenario = async () => {
    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"
          >
            <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"
      >
        <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"
      >
        <BugPlay /> Run Diagnostics
      </DropdownMenuItem>
    </DropdownMenuContent>
  );
}