Fix filters + add behaviour for select (#13997)

On field selection, we need to retrieve the fieldMetadata to set the
filter type. Current code was using the current step filter
fieldMetdataId instead of the new one.

Also adding a special behaviour for Select filter: it behaves as
arrays/multiselect but the opearands are not the same.

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Thomas Trompette
2025-08-20 17:14:31 +02:00
committed by GitHub
parent f9abea2387
commit 4b66e8021a
17 changed files with 287 additions and 146 deletions
@@ -1,8 +1,9 @@
import { useFieldMetadataItemById } from '@/object-metadata/hooks/useFieldMetadataItemById';
import { useGetFieldMetadataItemByIdOrThrow } from '@/object-metadata/hooks/useGetFieldMetadataItemById';
import { SelectControl } from '@/ui/input/components/SelectControl';
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { useWorkflowVersionIdOrThrow } from '@/workflow/hooks/useWorkflowVersionIdOrThrow';
import { stepsOutputSchemaFamilySelector } from '@/workflow/states/selectors/stepsOutputSchemaFamilySelector';
import { useFilterFieldMetadataItem } from '@/workflow/workflow-steps/workflow-actions/filter-action/hooks/useFilterFieldMetadataItem';
import { useUpsertStepFilterSettings } from '@/workflow/workflow-steps/workflow-actions/filter-action/hooks/useUpsertStepFilterSettings';
import { WorkflowStepFilterContext } from '@/workflow/workflow-steps/workflow-actions/filter-action/states/context/WorkflowStepFilterContext';
import { getViewFilterOperands } from '@/workflow/workflow-steps/workflow-actions/filter-action/utils/getStepFilterOperands';
@@ -25,6 +26,8 @@ type WorkflowStepFilterFieldSelectProps = {
const NON_SELECTABLE_FIELD_TYPES = [
FieldMetadataType.ACTOR,
FieldMetadataType.RICH_TEXT_V2,
FieldMetadataType.ARRAY,
FieldMetadataType.RATING,
];
export const WorkflowStepFilterFieldSelect = ({
@@ -53,10 +56,11 @@ export const WorkflowStepFilterFieldSelect = ({
const { getIcon } = useIcons();
const {
fieldMetadataItem: filterFieldMetadataItem,
objectMetadataItem: filterObjectMetadataItem,
} = useFilterFieldMetadataItem(stepFilter.fieldMetadataId ?? '');
const { fieldMetadataItem: filterFieldMetadataItem } =
useFieldMetadataItemById(stepFilter.fieldMetadataId ?? '');
const { getFieldMetadataItemByIdOrThrow } =
useGetFieldMetadataItemByIdOrThrow();
const availableVariablesInWorkflowStep = useAvailableVariablesInWorkflowStep({
shouldDisplayRecordFields,
@@ -92,6 +96,13 @@ export const WorkflowStepFilterFieldSelect = ({
isFullRecord: false,
});
const {
fieldMetadataItem: filterFieldMetadataItem,
objectMetadataItem: filterObjectMetadataItem,
} = isDefined(fieldMetadataId)
? getFieldMetadataItemByIdOrThrow(fieldMetadataId)
: { fieldMetadataItem: undefined, objectMetadataItem: undefined };
const filterType = isDefined(fieldMetadataId)
? (filterFieldMetadataItem?.type ?? 'unknown')
: variableType;
@@ -119,11 +130,10 @@ export const WorkflowStepFilterFieldSelect = ({
});
},
[
workflowVersionId,
getFieldMetadataItemByIdOrThrow,
upsertStepFilterSettings,
stepFilter,
workflowVersionId,
filterFieldMetadataItem,
filterObjectMetadataItem,
],
);
@@ -185,25 +195,27 @@ export const WorkflowStepFilterFieldSelect = ({
}
return (
<WorkflowVariablesDropdown
instanceId={dropdownId}
onVariableSelect={handleChange}
clickableComponent={
<SelectControl
selectedOption={{
value: stepFilter.stepOutputKey,
label: label,
Icon: filterFieldMetadataItem?.icon
? getIcon(filterFieldMetadataItem.icon)
: undefined,
}}
textAccent={isSelectedFieldNotFound ? 'placeholder' : 'default'}
/>
}
shouldDisplayRecordFields={shouldDisplayRecordFields}
shouldDisplayRecordObjects={shouldDisplayRecordObjects}
shouldEnableSelectRelationObject={true}
fieldTypesToExclude={NON_SELECTABLE_FIELD_TYPES}
/>
<>
<WorkflowVariablesDropdown
instanceId={dropdownId}
onVariableSelect={handleChange}
clickableComponent={
<SelectControl
selectedOption={{
value: stepFilter.stepOutputKey,
label: label,
Icon: filterFieldMetadataItem?.icon
? getIcon(filterFieldMetadataItem.icon)
: undefined,
}}
textAccent={isSelectedFieldNotFound ? 'placeholder' : 'default'}
/>
}
shouldDisplayRecordFields={shouldDisplayRecordFields}
shouldDisplayRecordObjects={shouldDisplayRecordObjects}
shouldEnableSelectRelationObject={true}
fieldTypesToExclude={NON_SELECTABLE_FIELD_TYPES}
/>
</>
);
};
@@ -1,3 +1,4 @@
import { useFieldMetadataItemById } from '@/object-metadata/hooks/useFieldMetadataItemById';
import { configurableViewFilterOperands } from '@/object-record/object-filter-dropdown/utils/configurableViewFilterOperands';
import { FormFieldInput } from '@/object-record/record-field/ui/components/FormFieldInput';
import { FormMultiSelectFieldInput } from '@/object-record/record-field/ui/form-types/components/FormMultiSelectFieldInput';
@@ -7,7 +8,6 @@ import { FormTextFieldInput } from '@/object-record/record-field/ui/form-types/c
import { type FieldMetadata } from '@/object-record/record-field/ui/types/FieldMetadata';
import { WorkflowStepFilterValueCompositeInput } from '@/workflow/workflow-steps/workflow-actions/filter-action/components/WorkflowStepFilterValueCompositeInput';
import { useFilterFieldMetadataItem } from '@/workflow/workflow-steps/workflow-actions/filter-action/hooks/useFilterFieldMetadataItem';
import { useUpsertStepFilterSettings } from '@/workflow/workflow-steps/workflow-actions/filter-action/hooks/useUpsertStepFilterSettings';
import { WorkflowStepFilterContext } from '@/workflow/workflow-steps/workflow-actions/filter-action/states/context/WorkflowStepFilterContext';
import { WorkflowVariablePicker } from '@/workflow/workflow-variables/components/WorkflowVariablePicker';
@@ -91,7 +91,7 @@ export const WorkflowStepFilterValueInput = ({
} = stepFilter;
const { fieldMetadataItem: selectedFieldMetadataItem, objectMetadataItem } =
useFilterFieldMetadataItem(fieldMetadataId ?? '');
useFieldMetadataItemById(fieldMetadataId ?? '');
if (isDisabled || operandHasNoInput) {
return null;
@@ -1,18 +0,0 @@
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
export const useFilterFieldMetadataItem = (fieldMetadataId: string) => {
const { objectMetadataItems } = useObjectMetadataItems();
const objectMetadataItem = objectMetadataItems.find((objectMetadataItem) =>
objectMetadataItem.fields.some((field) => field.id === fieldMetadataId),
);
const fieldMetadataItem = objectMetadataItem?.fields.find(
(field) => field.id === fieldMetadataId,
);
return {
objectMetadataItem,
fieldMetadataItem,
};
};