feat: Add ElementData component to manage UI element data binding and selection for the simulation dashboard.

This commit is contained in:
2025-12-22 10:49:33 +05:30
parent 518ceec423
commit e35eaa5348

View File

@@ -65,6 +65,25 @@ const ElementData: React.FC<ElementDataProps> = ({
}
};
const getFilteredOptions = (allOptions: Array<{ id: string; label: string }>, currentValues: string | string[] | undefined, currentIndex: number) => {
const valuesArray = Array.isArray(currentValues) ? currentValues : currentValues ? [currentValues] : [];
return allOptions.filter((option) => {
// Include logic:
// 1. If this option is the one currently selected for this index, keep it.
// 2. If this option is selected in another index, exclude it.
const isSelectedHere = valuesArray[currentIndex] === option.id;
const isSelectedElsewhere = valuesArray.includes(option.id) && !isSelectedHere;
return !isSelectedElsewhere;
});
};
const assetDropdownItems = getAssetDropdownItems();
const labelValueDropdownSections = getLableValueDropdownItems(element?.dataBinding?.dataSource as string | undefined);
const totalValueOptions = labelValueDropdownSections.flatMap((s) => s.items).length;
const totalAssetOptions = assetDropdownItems.length;
return (
<div className="data-details">
{element?.type === "label-value" && (
@@ -177,7 +196,7 @@ const ElementData: React.FC<ElementDataProps> = ({
<DataSourceSelector
key={field.id}
label={field.label}
options={field.options}
options={getFilteredOptions(field.options, element.dataBinding?.dataValue, index)}
selected={field.options.find((option) => option.id === element.dataBinding?.dataValue?.[index])?.label ?? ""}
onSelect={(value) => {
const currentDataValue = Array.isArray(element.dataBinding?.dataValue)
@@ -208,12 +227,14 @@ const ElementData: React.FC<ElementDataProps> = ({
/>
))}
<div className="add-field" onClick={addField}>
<div className="icon">
<AddIcon />
{singleValueFields.length < totalValueOptions && (
<div className="add-field" onClick={addField}>
<div className="icon">
<AddIcon />
</div>
<div className="label">Add Field</div>
</div>
<div className="label">Add Field</div>
</div>
)}
</div>
)}
@@ -238,7 +259,7 @@ const ElementData: React.FC<ElementDataProps> = ({
<DataSourceSelector
key={field.id}
label={field.label}
options={field.options}
options={getFilteredOptions(field.options, element.dataBinding?.dataSource, index)}
selected={getEventByModelUuid(selectedProduct.productUuid, (element.dataBinding?.dataSource as string[])?.[index] || "")?.modelName ?? ""}
onSelect={(value) => {
const current = Array.isArray(element.dataBinding?.dataSource)
@@ -269,12 +290,14 @@ const ElementData: React.FC<ElementDataProps> = ({
/>
))}
<div className="add-field" onClick={addField}>
<div className="icon">
<AddIcon />
{multipleSourceFields.length < totalAssetOptions && (
<div className="add-field" onClick={addField}>
<div className="icon">
<AddIcon />
</div>
<div className="label">Add Field</div>
</div>
<div className="label">Add Field</div>
</div>
)}
</div>
)}
</div>