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

70.96% Statements 22/31
72.72% Branches 8/11
40% Functions 2/5
78.57% Lines 22/28

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 126                                12816x 12816x 12816x 12816x 12816x 12816x 12816x 12816x 12816x       12816x     1x 1x       1x   1x 1x                   1x 1x   1x       1x   1x       12816x                               2003x                                                                                              
import { BugPlay, Check, Play, Plus, Rows3 } from "lucide-react";
import { useEffect, useMemo, useState } from "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>
  );
}