All files / src/pages/flowsheet-page/flowsheet/PropertiesSidebar/components PropertySelectionSummary.tsx

62.29% Statements 38/61
31.03% Branches 9/29
38.46% Functions 5/13
77.14% Lines 27/35

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                                      5x 7x     5x       5x 7x   5x     14x     5x     5x       10x     5x     5x   5x 14x 14x     14x 14x   14x     14x 36x         7x           7x         20x     5x                     5x     5x                               10x      
// File: src/pages/flowsheet-page/flowsheet/RightSideBar/components/PropertySelectionSummary.tsx
 
import { ColumnDef } from "@tanstack/react-table";
import { DataTable } from "@/ahuora-design-system/ui/data-table";
import { useFlowsheetObjectsIdMap } from "@/hooks/flowsheetObjects";
import { useSimulationObjectPropertySet } from "@/hooks/properties";
import { SelectedPropertyInfo } from "../ObjectDetailsPanel";
 
interface PropertySelectionSummaryProps {
  selectedProperties: SelectedPropertyInfo[];
}
 
interface UnitProperty {
  unitOpId: number;
  unitOpName: string;
  propertyNames: string;
}
 
function usePropertySets(unitOpIds: number[]) {
  const propertySets = unitOpIds.map((id) => {
    return useSimulationObjectPropertySet(id);
  });
 
  const map = new Map<
    number,
    ReturnType<typeof useSimulationObjectPropertySet>
  >();
  unitOpIds.forEach((id, index) => {
    map.set(id, propertySets[index]);
  });
  return map;
}
 
export function PropertySelectionSummary({
  selectedProperties,
}: PropertySelectionSummaryProps) {
  const flowsheetObjectIdMap = useFlowsheetObjectsIdMap();
 
  // Get unique IDs first
  const uniqueUnitOpIds = [
    ...new Set(selectedProperties.map((prop) => prop.unitOpId ?? prop.unitOp)),
  ]
    .filter((id): id is number => id != null)
    .sort((a, b) => a - b);
 
  // Use the custom hook instead of direct mapping
  const propertySets = usePropertySets(uniqueUnitOpIds);
 
  // Prepare data for the DataTable
  const unitPropertyMap: Record<number, UnitProperty> = {};
 
  selectedProperties.forEach((propertyInfo) => {
    const unitOpId = propertyInfo.unitOpId ?? propertyInfo.unitOp;
    const propertyId = propertyInfo.propertyId ?? propertyInfo.property;
    Iif (unitOpId == null || propertyId == null) return;
 
    const unitOp = flowsheetObjectIdMap.get(unitOpId);
    const unitOpName = unitOp?.componentName || "Unknown Unit Op";
 
    const propertySet = propertySets.get(unitOpId);
    Iif (!propertySet) return;
 
    const propertyDetails = propertySet.ContainedProperties?.find(
      (prop) => prop.id === propertyId,
    );
    Iif (!propertyDetails) return;
 
    if (!unitPropertyMap[unitOpId]) {
      unitPropertyMap[unitOpId] = {
        unitOpId,
        unitOpName,
        propertyNames: propertyDetails.displayName,
      };
    } else {
      unitPropertyMap[unitOpId].propertyNames +=
        `, ${propertyDetails.displayName}`;
    }
  });
 
  const data = Object.values(unitPropertyMap);
 
  // Define columns for the DataTable
  const columns: ColumnDef<UnitProperty>[] = [
    {
      accessorKey: "unitOpName",
      header: "Unit Name",
      cell: (info) => info.getValue(),
    },
    {
      accessorKey: "propertyNames",
      header: "Properties",
      cell: (info) => info.getValue(),
    },
  ];
 
  return (
    <div className="lg:h-[55vh] md:h-[55vh] sm:h-[30vh] w-[50vw]">
      {data.length > 0 ? (
        <div className="h-full pb-2">
          <DataTable
            columns={columns}
            data={data}
            rowSelection={{}}
            handleRowClick={() => {}}
            withBorder={true}
          />
        </div>
      ) : (
        <div className="flex-1 flex items-center justify-center">
          <p className="text-gray-400 italic">No properties selected</p>
        </div>
      )}
    </div>
  );
}