diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeader.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeader.tsx index 01ba0b1181..9a551191f6 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeader.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeader.tsx @@ -1,4 +1,3 @@ -import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { TABLE_Z_INDEX } from '@/object-record/record-table/constants/TableZIndex'; import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext'; import { RecordTableHeaderAddColumnButton } from '@/object-record/record-table/record-table-header/components/RecordTableHeaderAddColumnButton'; @@ -15,7 +14,6 @@ import { isRecordTableColumnHeadersReadOnlyComponentState } from '@/object-recor import { isRecordTableDragColumnHiddenComponentState } from '@/object-record/record-table/states/isRecordTableDragColumnHiddenComponentState'; import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue'; import { styled } from '@linaria/react'; -import { filterOutByProperty } from 'twenty-shared/utils'; const StyledHeaderContainer = styled.div` display: flex; @@ -27,7 +25,6 @@ const StyledHeaderContainer = styled.div` export const RecordTableHeader = () => { const { visibleRecordFields } = useRecordTableContextOrThrow(); - const { labelIdentifierFieldMetadataItem } = useRecordIndexContextOrThrow(); const isRecordTableColumnHeadersReadOnly = useAtomComponentStateValue( isRecordTableColumnHeadersReadOnlyComponentState, @@ -41,14 +38,7 @@ export const RecordTableHeader = () => { isRecordTableCheckboxColumnHiddenComponentState, ); - const recordFieldsWithoutLabelIdentifierAndFirstOne = visibleRecordFields - .filter( - filterOutByProperty( - 'fieldMetadataItemId', - labelIdentifierFieldMetadataItem?.id, - ), - ) - .slice(1); + const recordFieldsWithoutFirstTwo = visibleRecordFields.slice(2); useResizeTableHeader(); @@ -60,15 +50,13 @@ export const RecordTableHeader = () => { )} - {recordFieldsWithoutLabelIdentifierAndFirstOne.map( - (recordField, index) => ( - - ), - )} + {recordFieldsWithoutFirstTwo.map((recordField, index) => ( + + ))} {isRecordTableColumnHeadersReadOnly ? ( ) : ( diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeaderFirstScrollableCell.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeaderFirstScrollableCell.tsx index 320086b7aa..49a8923725 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeaderFirstScrollableCell.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeaderFirstScrollableCell.tsx @@ -1,5 +1,4 @@ import { type RecordField } from '@/object-record/record-field/types/RecordField'; -import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { TABLE_Z_INDEX } from '@/object-record/record-table/constants/TableZIndex'; import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext'; import { RecordTableColumnHead } from '@/object-record/record-table/record-table-header/components/RecordTableColumnHead'; @@ -21,7 +20,7 @@ import { useAtomComponentFamilyStateValue } from '@/ui/utilities/state/jotai/hoo import { useAtomComponentSelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentSelectorValue'; import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue'; import { cx } from '@linaria/core'; -import { filterOutByProperty, isDefined } from 'twenty-shared/utils'; +import { isDefined } from 'twenty-shared/utils'; export const RecordTableHeaderFirstScrollableCell = () => { const { objectMetadataItem, visibleRecordFields } = @@ -45,14 +44,7 @@ export const RecordTableHeaderFirstScrollableCell = () => { 0, ); - const { labelIdentifierFieldMetadataItem } = useRecordIndexContextOrThrow(); - - const recordField = visibleRecordFields.filter( - filterOutByProperty( - 'fieldMetadataItemId', - labelIdentifierFieldMetadataItem?.id, - ), - )[0] as RecordField | undefined; + const recordField = visibleRecordFields[1] as RecordField | undefined; const isRecordTableRowFocusActive = useAtomComponentStateValue( isRecordTableRowFocusActiveComponentState, diff --git a/packages/twenty-front/src/modules/page-layout/widgets/record-table/utils/__tests__/filterFieldsForRecordTableViewCreation.test.ts b/packages/twenty-front/src/modules/page-layout/widgets/record-table/utils/__tests__/filterFieldsForRecordTableViewCreation.test.ts new file mode 100644 index 0000000000..566cce2328 --- /dev/null +++ b/packages/twenty-front/src/modules/page-layout/widgets/record-table/utils/__tests__/filterFieldsForRecordTableViewCreation.test.ts @@ -0,0 +1,67 @@ +import { filterFieldsForRecordTableViewCreation } from '@/page-layout/widgets/record-table/utils/filterFieldsForRecordTableViewCreation'; +import { getMockFieldMetadataItemOrThrow } from '~/testing/utils/getMockFieldMetadataItemOrThrow'; +import { getMockObjectMetadataItemOrThrow } from '~/testing/utils/getMockObjectMetadataItemOrThrow'; + +describe('filterFieldsForRecordTableViewCreation', () => { + const objectMetadataItem = getMockObjectMetadataItemOrThrow('company'); + const labelIdentifierFieldMetadataId = + objectMetadataItem.labelIdentifierFieldMetadataId; + + // domainName is an active, non-system field that is not the label identifier + const nonSystemField = getMockFieldMetadataItemOrThrow({ + objectMetadataItem, + fieldName: 'domainName', + }); + // id is a hidden system field + const systemField = getMockFieldMetadataItemOrThrow({ + objectMetadataItem, + fieldName: 'id', + }); + // position is a hidden system field + const hiddenSystemField = getMockFieldMetadataItemOrThrow({ + objectMetadataItem, + fieldName: 'position', + }); + + it('should include active non-system fields', () => { + expect( + filterFieldsForRecordTableViewCreation( + nonSystemField, + labelIdentifierFieldMetadataId, + ), + ).toBe(true); + }); + + it('should exclude inactive fields', () => { + expect( + filterFieldsForRecordTableViewCreation( + { ...nonSystemField, isActive: false }, + labelIdentifierFieldMetadataId, + ), + ).toBe(false); + }); + + it('should exclude system fields that are not the label identifier', () => { + expect( + filterFieldsForRecordTableViewCreation( + systemField, + labelIdentifierFieldMetadataId, + ), + ).toBe(false); + }); + + it('should include system fields when they are the label identifier', () => { + expect( + filterFieldsForRecordTableViewCreation(systemField, systemField.id), + ).toBe(true); + }); + + it('should include hidden system fields when they are the label identifier', () => { + expect( + filterFieldsForRecordTableViewCreation( + hiddenSystemField, + hiddenSystemField.id, + ), + ).toBe(true); + }); +}); diff --git a/packages/twenty-front/src/modules/page-layout/widgets/record-table/utils/buildRecordTableWidgetViewSnapshot.ts b/packages/twenty-front/src/modules/page-layout/widgets/record-table/utils/buildRecordTableWidgetViewSnapshot.ts index db26d639dc..17401f59ee 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/record-table/utils/buildRecordTableWidgetViewSnapshot.ts +++ b/packages/twenty-front/src/modules/page-layout/widgets/record-table/utils/buildRecordTableWidgetViewSnapshot.ts @@ -33,8 +33,11 @@ export const buildRecordTableWidgetViewSnapshot = ( isActive: true, }; - const eligibleFields = objectMetadataItem.fields.filter( - filterFieldsForRecordTableViewCreation, + const eligibleFields = objectMetadataItem.fields.filter((field) => + filterFieldsForRecordTableViewCreation( + field, + objectMetadataItem.labelIdentifierFieldMetadataId, + ), ); const sortedFields = eligibleFields.toSorted( diff --git a/packages/twenty-front/src/modules/page-layout/widgets/record-table/utils/filterFieldsForRecordTableViewCreation.ts b/packages/twenty-front/src/modules/page-layout/widgets/record-table/utils/filterFieldsForRecordTableViewCreation.ts index e8499a26aa..1778fc806a 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/record-table/utils/filterFieldsForRecordTableViewCreation.ts +++ b/packages/twenty-front/src/modules/page-layout/widgets/record-table/utils/filterFieldsForRecordTableViewCreation.ts @@ -3,6 +3,11 @@ import { isHiddenSystemField } from '@/object-metadata/utils/isHiddenSystemField export const filterFieldsForRecordTableViewCreation = ( field: FieldMetadataItem, + labelIdentifierFieldMetadataId: string, ) => { - return field.isActive && !field.isSystem && !isHiddenSystemField(field); + const isLabelIdentifier = field.id === labelIdentifierFieldMetadataId; + return ( + field.isActive && + (isLabelIdentifier || (!field.isSystem && !isHiddenSystemField(field))) + ); };