All files / src/pages/flowsheet-page/flowsheet/PropertiesSidebar/PropertyPackages CustomPackageChooser.tsx

88.23% Statements 15/17
75% Branches 3/4
100% Functions 6/6
88.23% Lines 15/17

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                                              11x 11x   11x 1x 1x               11x           4x                                                           12x 12x   12x 1x   1x         1x     12x                   1x                  
import React from "react";
import SelectInput from "../../../../../ahuora-design-system/inputs/SelectInput";
import { Button } from "../../../../../ahuora-design-system/ui/button";
import {
  Dialog,
  DialogContent,
  DialogTitle,
} from "../../../../../ahuora-design-system/ui/dialog";
import { Input } from "../../../../../ahuora-design-system/ui/input";
import { Label } from "../../../../../ahuora-design-system/ui/label";
import {
  useCoreCustomPropertyPackagesCreateMutation,
  useCoreCustomPropertyPackagesListQuery,
} from "../../../../../api/apiStore.gen";
import { useProjectId } from "../../../../../hooks/project";
 
export function CustomPackageChooser({
  customPackageId,
  onCustomPackageChange,
}: {
  customPackageId?: number;
  onCustomPackageChange: (newCustomPackageId: number) => void;
}) {
  const { data: customPackages } = useCoreCustomPropertyPackagesListQuery({});
  const [isDialogOpen, setIsDialogOpen] = React.useState(false);
 
  const onOptionChange = (newValue: string) => {
    if (newValue === "ADD_PACKAGE") {
      setIsDialogOpen(true);
      // TODO
    } else E{
      const newCustomPackageId = parseInt(newValue);
      onCustomPackageChange(newCustomPackageId);
    }
  };
 
  return (
    <>
      <SelectInput
        ariaLabel="Select custom Package"
        title="Select custom package"
        data={[
          ...(customPackages?.map((pkg) => ({
            label: pkg.name,
            value: pkg.id + "",
          })) || []),
          {
            label: "Add New..",
            value: "ADD_PACKAGE",
          },
        ]}
        value={customPackageId + ""}
        handleChange={onOptionChange}
      />
      <CustomPackageCreator
        open={isDialogOpen}
        onOpenChange={setIsDialogOpen}
        onPackageCreated={onCustomPackageChange}
      />
    </>
  );
}
 
export function CustomPackageCreator({
  open,
  onOpenChange,
  onPackageCreated,
}: {
  open: boolean;
  onOpenChange: (open: boolean) => void;
  onPackageCreated: (newCustomPackageId: number) => void;
}) {
  const [createPackage] = useCoreCustomPropertyPackagesCreateMutation();
  const [name, setName] = React.useState("");
 
  const onCreate = async () => {
    onOpenChange(false);
 
    const result = await createPackage({
      customPropertyPackage: {
        name: name,
      },
    }).unwrap();
    onPackageCreated(result.id);
  };
 
  return (
    <Dialog open={open} onOpenChange={onOpenChange}>
      <DialogContent>
        <div className="flex flex-col gap-4">
          <DialogTitle>Create Custom Property Package</DialogTitle>
          <div className="flex flex-col gap-2">
            <Label>Name</Label>
            <Input
              aria-label="Custom Package Name"
              value={name}
              onChange={(e) => setName(e.target.value)}
            />
          </div>
          <Button onClick={onCreate}>Create</Button>
        </div>
      </DialogContent>
    </Dialog>
  );
}