import { Label, LabeledInput, LabeledSelect, Select } from "@itwin/itwinui-react"; import React, { useCallback, useMemo } from "react"; import { AssemblyCreationDropdownType } from "./TemplateModificationStepTwo"; import type { EC3ReportConfigurationLabel, ODataTable } from "@itwin/insights-client"; import type { Configuration } from "../ec3-widget-react"; import { EC3Widget } from "../EC3Widget"; import "./AssemblyItem.scss"; export interface AssemblyItemProps { assembly: EC3ReportConfigurationLabel; currentAssemblyIndex: number; template: Configuration; isLoading: boolean; editableAssemblyIndex?: number; oDataTable?: ODataTable[]; reportTables?: string[]; allAssemblies: EC3ReportConfigurationLabel[]; onAssemblyDataChange: (updatedAssembly: EC3ReportConfigurationLabel, index: number, action?: "add" | "delete") => void; setTemplate: (template: Configuration) => void; } export const AssemblyItem = (props: AssemblyItemProps) => { const getMetadataColumns = useMemo( () => (assembly: EC3ReportConfigurationLabel, optionType: AssemblyCreationDropdownType) => { const oDataTableData = props.oDataTable?.find((x) => x.name === assembly.reportTable); if (!oDataTableData) { return; } switch (optionType) { case AssemblyCreationDropdownType.elementName: { return oDataTableData.columns .filter((x) => x.type === "Edm.String" && !assembly.materials.map((p) => p.nameColumn).includes(x.name)) .map((x) => x.name); } case AssemblyCreationDropdownType.elementQuantity: { return oDataTableData.columns.filter((x) => x.type === "Edm.Double").map((x) => x.name); } case AssemblyCreationDropdownType.material: { return oDataTableData.columns.filter((x) => x.type === "Edm.String" && assembly.elementNameColumn !== x.name).map((x) => x.name); } } }, [props.oDataTable], ); const reportTableLabels = useMemo(() => { return ( props.reportTables?.map((g) => ({ label: g, value: g, })) ?? [] ); }, [props.reportTables]); // skip reportTables that have already been used in other assemblies const getReportTableOptions = useCallback( (assembly: EC3ReportConfigurationLabel) => { const existingAssembly = reportTableLabels.find((x) => x.value === assembly.reportTable); if (existingAssembly) { const allAssem = reportTableLabels.filter((x) => !props.allAssemblies?.map((p) => p.reportTable).includes(x.value)); allAssem.push(existingAssembly); return allAssem; } return reportTableLabels.filter((x) => !props.allAssemblies?.map((p) => p.reportTable).includes(x.value)); }, [reportTableLabels, props.allAssemblies], ); const onAssemblyNameChange = useCallback( (event) => { props.onAssemblyDataChange({ ...props.assembly, name: event.target.value }, props.currentAssemblyIndex); }, [props], ); const onReportTableSelectChange = useCallback( async (selectedReportTable) => { // reset all related fields props.onAssemblyDataChange( { elementNameColumn: "UserLabel", elementQuantityColumn: "", materials: [], name: props.assembly.name, reportTable: selectedReportTable, }, props.currentAssemblyIndex, ); }, [props], ); const onElementSelectChange = useCallback( (value) => { props.onAssemblyDataChange({ ...props.assembly, elementNameColumn: value }, props.currentAssemblyIndex); }, [props], ); const onElementQuantitySelectChange = useCallback( (value) => { props.onAssemblyDataChange({ ...props.assembly, elementQuantityColumn: value }, props.currentAssemblyIndex); }, [props], ); const onMaterialSelectChange = useCallback( (val, event) => { if (val) { props.onAssemblyDataChange( { ...props.assembly, materials: event === "removed" ? props.assembly.materials.filter((value) => val !== value?.nameColumn) : [...(props.assembly.materials ?? []), { nameColumn: val }], }, props.currentAssemblyIndex, ); } }, [props], ); return ( <> { return { label: x, value: x }; }) ?? [] } value={props.assembly.elementNameColumn} onChange={onElementSelectChange} disabled={props.isLoading || props.assembly.reportTable === "" || props.currentAssemblyIndex !== props.editableAssemblyIndex} placeholder={ props.isLoading ? EC3Widget.translate("elementPlaceholderLoading") : props.assembly.reportTable === "" ? EC3Widget.translate("selectReportTableFirstPlaceholder") : EC3Widget.translate("elementPlaceholderSelect") } /> { return { label: x, value: x }; }) ?? [] } value={props.assembly.elementQuantityColumn} onChange={onElementQuantitySelectChange} disabled={props.isLoading || props.assembly.reportTable === "" || props.currentAssemblyIndex !== props.editableAssemblyIndex} placeholder={ props.isLoading ? EC3Widget.translate("elementPlaceholderLoading") : props.assembly.reportTable === "" ? EC3Widget.translate("selectReportTableFirstPlaceholder") : EC3Widget.translate("elementQuantityPlaceholderSelect") } />