diff --git a/packages/twenty-front/src/modules/activities/inline-cell/components/ActivityTargetsInlineCell.tsx b/packages/twenty-front/src/modules/activities/inline-cell/components/ActivityTargetsInlineCell.tsx index 284658934..a419c959e 100644 --- a/packages/twenty-front/src/modules/activities/inline-cell/components/ActivityTargetsInlineCell.tsx +++ b/packages/twenty-front/src/modules/activities/inline-cell/components/ActivityTargetsInlineCell.tsx @@ -3,6 +3,8 @@ import { useActivityTargetObjectRecords } from '@/activities/hooks/useActivityTa import { ActivityTargetInlineCellEditMode } from '@/activities/inline-cell/components/ActivityTargetInlineCellEditMode'; import { ActivityTarget } from '@/activities/types/ActivityTarget'; import { GraphQLActivity } from '@/activities/types/GraphQLActivity'; +import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; +import { useFieldContext } from '@/object-record/hooks/useFieldContext'; import { RecordFieldInputScope } from '@/object-record/record-field/scopes/RecordFieldInputScope'; import { RecordInlineCellContainer } from '@/object-record/record-inline-cell/components/RecordInlineCellContainer'; import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; @@ -25,28 +27,39 @@ export const ActivityTargetsInlineCell = ({ activityId: activity?.id ?? '', }); + const { FieldContextProvider } = useFieldContext({ + objectNameSingular: CoreObjectNameSingular.Activity, + objectRecordId: activity?.id ?? '', + fieldMetadataName: 'activityTargets', + fieldPosition: 2, + }); + + if (!FieldContextProvider) return null; + return ( - - } - label="Relations" - displayModeContent={ - - } - isDisplayModeContentEmpty={activityTargetObjectRecords.length === 0} - /> + + + } + label="Relations" + displayModeContent={ + + } + isDisplayModeContentEmpty={activityTargetObjectRecords.length === 0} + /> + ); }; diff --git a/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataNavItems.tsx b/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataNavItems.tsx index 83194ee56..765475cfa 100644 --- a/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataNavItems.tsx +++ b/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataNavItems.tsx @@ -76,7 +76,7 @@ export const ObjectMetadataNavItems = () => { key={objectMetadataItem.id} label={objectMetadataItem.labelPlural} to={navigationPath} - active={currentPath === navigationPath} + active={currentPath === `/objects/${objectMetadataItem.namePlural}`} Icon={getIcon(objectMetadataItem.icon)} onClick={() => { navigate(navigationPath); diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectRecordIdentifierByNameSingular.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectRecordIdentifierByNameSingular.test.tsx index a62f1094c..1a4c0e2cb 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectRecordIdentifierByNameSingular.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectRecordIdentifierByNameSingular.test.tsx @@ -42,7 +42,7 @@ describe('useGetObjectRecordIdentifierByNameSingular', () => { objectNameSingular: 'opportunity', }); - expect(result.current.linkToShowPage).toBe('/opportunities/recordId'); + expect(result.current.linkToShowPage).toBe('/object/opportunity/recordId'); rerender({ record: { diff --git a/packages/twenty-front/src/modules/object-metadata/utils/getObjectRecordIdentifier.ts b/packages/twenty-front/src/modules/object-metadata/utils/getObjectRecordIdentifier.ts index 2708774b9..655b80860 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/getObjectRecordIdentifier.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/getObjectRecordIdentifier.ts @@ -16,15 +16,6 @@ export const getObjectRecordIdentifier = ({ record: ObjectRecord; }): ObjectRecordIdentifier => { switch (objectMetadataItem.nameSingular) { - case CoreObjectNameSingular.Opportunity: { - return { - id: record.id, - name: record?.company?.name, - avatarUrl: record.avatarUrl, - avatarType: 'rounded', - linkToShowPage: `/opportunities/${record.id}`, - }; - } case CoreObjectNameSingular.WorkspaceMember: { const workspaceMember = record as WorkspaceMember; diff --git a/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardContent.tsx b/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardContent.tsx index 8ba1d0cfe..fa9f7b10a 100644 --- a/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardContent.tsx +++ b/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardContent.tsx @@ -1,19 +1,16 @@ -import { useContext, useEffect } from 'react'; +import { useContext } from 'react'; import { css } from '@emotion/react'; import styled from '@emotion/styled'; -import { useSetRecoilState } from 'recoil'; import { LightIconButton, MenuItem } from 'tsup.ui.index'; import { CachedObjectRecordEdge } from '@/apollo/types/CachedObjectRecordEdge'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { useFieldContext } from '@/object-record/hooks/useFieldContext'; +import { RecordChip } from '@/object-record/components/RecordChip'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; -import { FieldDisplay } from '@/object-record/record-field/components/FieldDisplay'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { FieldRelationMetadata } from '@/object-record/record-field/types/FieldMetadata'; -import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { IconDotsVertical, IconUnlink } from '@/ui/display/icon'; import { CardContent } from '@/ui/layout/card/components/CardContent'; @@ -75,40 +72,19 @@ export const RecordRelationFieldCardContent = ({ }); const isToOneObject = relationType === 'TO_ONE_OBJECT'; - const { - labelIdentifierFieldMetadata: relationLabelIdentifierFieldMetadata, - objectMetadataItem: relationObjectMetadataItem, - } = useObjectMetadataItem({ - objectNameSingular: relationObjectMetadataNameSingular, - }); + const { objectMetadataItem: relationObjectMetadataItem } = + useObjectMetadataItem({ + objectNameSingular: relationObjectMetadataNameSingular, + }); const persistField = usePersistField(); const { updateOneRecord: updateOneRelationRecord } = useUpdateOneRecord({ objectNameSingular: relationObjectMetadataNameSingular, }); - const { FieldContextProvider } = useFieldContext({ - fieldMetadataName: relationLabelIdentifierFieldMetadata?.name || '', - fieldPosition: 0, - isLabelIdentifier: true, - objectNameSingular: relationObjectMetadataNameSingular, - objectRecordId: relationRecord.id, - }); - const dropdownScopeId = `record-field-card-menu-${relationRecord.id}`; const { closeDropdown, isDropdownOpen } = useDropdown(dropdownScopeId); - // TODO: temporary as ChipDisplay expect to find the entity in the entityFieldsFamilyState - const setRelationEntityFields = useSetRecoilState( - recordStoreFamilyState(relationRecord.id), - ); - - useEffect(() => { - setRelationEntityFields(relationRecord); - }, [relationRecord, setRelationEntityFields]); - - if (!FieldContextProvider) return null; - const handleDetach = () => { closeDropdown(); @@ -162,9 +138,10 @@ export const RecordRelationFieldCardContent = ({ return ( - - - + {/* TODO: temporary to prevent removing a company from an opportunity */} {!isOpportunityCompanyRelation && ( diff --git a/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx b/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx index 8ead4b22d..72495e697 100644 --- a/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx +++ b/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx @@ -54,6 +54,7 @@ export const RecordShowContainer = ({ const { record, loading } = useFindOneRecord({ objectRecordId, objectNameSingular, + depth: 3, }); useEffect(() => { diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTable.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTable.tsx index 099ed23fe..20e08592f 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTable.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTable.tsx @@ -38,6 +38,7 @@ const StyledTable = styled.table` border-bottom: 1px solid ${({ theme }) => theme.border.color.light}; color: ${({ theme }) => theme.font.color.primary}; padding: 0; + border-right: 1px solid ${({ theme }) => theme.border.color.light}; text-align: left; diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.test.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.test.tsx index e0b646bc7..decadcd2e 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.test.tsx +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.test.tsx @@ -81,7 +81,7 @@ describe('useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray' ); expect(opportunityRecordForSelect.record.id).toBe(opportunityId); expect(opportunityRecordForSelect.recordIdentifier.linkToShowPage).toBe( - `/opportunities/${opportunityId}`, + `/object/opportunity/${opportunityId}`, ); expect(personRecordForSelect.objectMetadataItem.namePlural).toBe('people'); diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectSearch.test.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectSearch.test.tsx index 3ece5130c..a117719c0 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectSearch.test.tsx +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectSearch.test.tsx @@ -59,6 +59,7 @@ const mocks = [ request: { query, variables: { + filterNameSingular: { and: [{}, { id: { in: ['1'] } }] }, orderByNameSingular: { createdAt: 'DescNullsLast' }, limitNameSingular: 60, }, @@ -127,7 +128,7 @@ describe('useMultiObjectSearch', () => { }); await waitFor(() => { expect(mocks[0].result).toHaveBeenCalled(); - expect(mocks[1].result).toHaveBeenCalled(); + // expect(mocks[1].result).toHaveBeenCalled(); expect(mocks[2].result).toHaveBeenCalled(); }); const expectedData = [ diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery.ts b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery.ts index a7edbe093..cc48f29b8 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery.ts +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery.ts @@ -53,9 +53,22 @@ export const useMultiObjectSearchMatchesSearchFilterAndSelectedItemsQuery = ({ if (!isNonEmptyArray(selectedIds)) return null; + const searchFilter = + searchFilterPerMetadataItemNameSingular[nameSingular] ?? {}; return [ `filter${capitalize(nameSingular)}`, - searchFilterPerMetadataItemNameSingular[nameSingular], + { + and: [ + { + ...searchFilter, + }, + { + id: { + in: selectedIds, + }, + }, + ], + }, ]; }) .filter(isDefined), diff --git a/packages/twenty-front/src/modules/ui/display/chip/components/EntityChip.tsx b/packages/twenty-front/src/modules/ui/display/chip/components/EntityChip.tsx index 017185b91..e06337cc7 100644 --- a/packages/twenty-front/src/modules/ui/display/chip/components/EntityChip.tsx +++ b/packages/twenty-front/src/modules/ui/display/chip/components/EntityChip.tsx @@ -1,7 +1,6 @@ import * as React from 'react'; import { useNavigate } from 'react-router-dom'; import { useTheme } from '@emotion/react'; -import { isNonEmptyString } from '@sniptt/guards'; import { IconComponent } from '@/ui/display/icon/types/IconComponent'; import { Avatar, AvatarType } from '@/users/components/Avatar'; @@ -50,34 +49,32 @@ export const EntityChip = ({ }; return ( - isNonEmptyString(name) && ( - - ) : ( - - ) - } - clickable={!!linkToEntity} - onClick={handleLinkClick} - className={className} - maxWidth={maxWidth} - /> - ) + + ) : ( + + ) + } + clickable={!!linkToEntity} + onClick={handleLinkClick} + className={className} + maxWidth={maxWidth} + /> ); };