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}
+ />
);
};