Refactor board field definitions to use record fields (#14165)

This PR removes board field definitions usage in favor of record fields,
like we've already done on table with table columns.

This PR also introduces a first step in the refactoring of the
RecordIndexContext as a new way to store in-memory a normalized cache
for some states used pretty much everywhere like field metadata items or
field definition (for now but it will soon be removed).

Since most of those states do not change if we don't modify the
metadata, then we can safely store them in a context, which has the
fastest access time in React.

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Lucas Bordeau
2025-08-30 13:36:28 +02:00
committed by GitHub
parent 74eeb98293
commit db5897d4d0
28 changed files with 386 additions and 288 deletions
@@ -11,6 +11,7 @@ import { type RecordFilterGroup } from '@/object-record/record-filter-group/type
import { RecordFiltersComponentInstanceContext } from '@/object-record/record-filter/states/context/RecordFiltersComponentInstanceContext';
import { type RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { RecordIndexContextProvider } from '@/object-record/record-index/contexts/RecordIndexContext';
import { useRecordIndexFieldMetadataDerivedStates } from '@/object-record/record-index/hooks/useRecordIndexFieldMetadataDerivedStates';
import { InputLabel } from '@/ui/input/components/InputLabel';
import { WorkflowStepBody } from '@/workflow/workflow-steps/components/WorkflowStepBody';
import { WorkflowFindRecordsFilters } from '@/workflow/workflow-steps/workflow-actions/find-records-action/components/WorkflowFindRecordsFilters';
@@ -70,6 +71,7 @@ export const WorkflowEditActionFindRecords = ({
filter: action.settings.input.filter as FindRecordsActionFilter,
});
const isFormDisabled = actionOptions.readonly;
const instanceId = `workflow-edit-action-record-find-records-${action.id}-${formData.objectNameSingular}`;
const selectedObjectMetadataItem = activeNonSystemObjectMetadataItems.find(
(item) => item.nameSingular === formData.objectNameSingular,
@@ -80,6 +82,16 @@ export const WorkflowEditActionFindRecords = ({
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const {
fieldDefinitionByFieldMetadataItemId,
fieldMetadataItemByFieldMetadataItemId,
labelIdentifierFieldMetadataItem,
recordFieldByFieldMetadataItemId,
} = useRecordIndexFieldMetadataDerivedStates(
selectedObjectMetadataItem,
instanceId,
);
const saveAction = useDebouncedCallback(
async (formData: FindRecordsFormData) => {
if (actionOptions.readonly === true) {
@@ -118,7 +130,6 @@ export const WorkflowEditActionFindRecords = ({
action,
defaultTitle: 'Search Records',
});
const instanceId = `workflow-edit-action-record-find-records-${action.id}-${formData.objectNameSingular}`;
return (
<>
@@ -174,6 +185,10 @@ export const WorkflowEditActionFindRecords = ({
objectMetadataItem: selectedObjectMetadataItem,
recordIndexId: instanceId,
objectPermissionsByObjectMetadataId,
labelIdentifierFieldMetadataItem,
recordFieldByFieldMetadataItemId,
fieldDefinitionByFieldMetadataItemId,
fieldMetadataItemByFieldMetadataItemId,
}}
>
<RecordFilterGroupsComponentInstanceContext.Provider