diff --git a/front/src/modules/companies/components/CompanyBoardCard.tsx b/front/src/modules/companies/components/CompanyBoardCard.tsx index 1e5f91f32..e4dacb7e2 100644 --- a/front/src/modules/companies/components/CompanyBoardCard.tsx +++ b/front/src/modules/companies/components/CompanyBoardCard.tsx @@ -239,7 +239,7 @@ export const CompanyBoardCard = () => { value={{ entityId: boardCardId, recoilScopeId: boardCardId + viewField.fieldMetadataId, - isMainIdentifier: false, + isLabelIdentifier: false, fieldDefinition: { fieldMetadataId: viewField.fieldMetadataId, label: viewField.label, diff --git a/front/src/modules/object-metadata/components/ObjectMetadataItemsRelationPickerEffect.tsx b/front/src/modules/object-metadata/components/ObjectMetadataItemsRelationPickerEffect.tsx index ee7ff6ebd..1d45807bb 100644 --- a/front/src/modules/object-metadata/components/ObjectMetadataItemsRelationPickerEffect.tsx +++ b/front/src/modules/object-metadata/components/ObjectMetadataItemsRelationPickerEffect.tsx @@ -2,9 +2,22 @@ import { useEffect } from 'react'; import { useRelationPicker } from '@/ui/input/components/internal/relation-picker/hooks/useRelationPicker'; import { IdentifiersMapper } from '@/ui/input/components/internal/relation-picker/types/IdentifiersMapper'; +import { getLogoUrlFromDomainName } from '~/utils'; export const ObjectMetadataItemsRelationPickerEffect = () => { - const { setIdentifiersMapper } = useRelationPicker(); + const { setIdentifiersMapper, setSearchQuery } = useRelationPicker(); + + const computeFilterFields = (relationPickerType: string) => { + if (relationPickerType === 'company') { + return ['name']; + } + + if (['workspaceMember', 'person'].includes(relationPickerType)) { + return ['name.firstName', 'name.lastName']; + } + + return ['name']; + }; const identifierMapper: IdentifiersMapper = ( record: any, @@ -18,13 +31,15 @@ export const ObjectMetadataItemsRelationPickerEffect = () => { return { id: record.id, name: record.name, - avatarUrl: record.avatarUrl, + avatarUrl: getLogoUrlFromDomainName(record.domainName ?? ''), avatarType: 'squared', record: record, }; } - if (objectMetadataItemSingularName === 'workspaceMember') { + if ( + ['workspaceMember', 'person'].includes(objectMetadataItemSingularName) + ) { return { id: record.id, name: record.name.firstName + ' ' + record.name.lastName, @@ -34,6 +49,16 @@ export const ObjectMetadataItemsRelationPickerEffect = () => { }; } + if (['opportunity'].includes(objectMetadataItemSingularName)) { + return { + id: record.id, + name: record.company.name, + avatarUrl: record.avatarUrl, + avatarType: 'rounded', + record: record, + }; + } + return { id: record.id, name: record.name, @@ -45,7 +70,10 @@ export const ObjectMetadataItemsRelationPickerEffect = () => { useEffect(() => { setIdentifiersMapper(() => identifierMapper); - }, [setIdentifiersMapper]); + setSearchQuery({ + computeFilterFields, + }); + }, [setIdentifiersMapper, setSearchQuery]); return <>; }; diff --git a/front/src/modules/object-metadata/hooks/useComputeDefinitionsFromFieldMetadata.ts b/front/src/modules/object-metadata/hooks/useComputeDefinitionsFromFieldMetadata.ts index 432a75386..45f884009 100644 --- a/front/src/modules/object-metadata/hooks/useComputeDefinitionsFromFieldMetadata.ts +++ b/front/src/modules/object-metadata/hooks/useComputeDefinitionsFromFieldMetadata.ts @@ -22,13 +22,16 @@ export const useComputeDefinitionsFromFieldMetadata = ( const columnDefinitions: ColumnDefinition[] = useMemo( () => - activeFieldMetadataItems.map((field, index) => - formatFieldMetadataItemAsColumnDefinition({ - position: index, - field, - }), - ), - [activeFieldMetadataItems], + objectMetadataItem + ? activeFieldMetadataItems.map((field, index) => + formatFieldMetadataItemAsColumnDefinition({ + position: index, + field, + objectMetadataItem, + }), + ) + : [], + [activeFieldMetadataItems, objectMetadataItem], ); const filterDefinitions = formatFieldMetadataItemsAsFilterDefinitions({ diff --git a/front/src/modules/object-metadata/hooks/useObjectMainIdentifier.ts b/front/src/modules/object-metadata/hooks/useObjectMainIdentifier.ts deleted file mode 100644 index d30f477cc..000000000 --- a/front/src/modules/object-metadata/hooks/useObjectMainIdentifier.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { Nullable } from '~/types/Nullable'; - -export const useObjectMainIdentifier = ( - objectMetadataItem?: Nullable, -) => { - if (!objectMetadataItem) { - return {}; - } - - const labelIdentifierFieldMetadataId = objectMetadataItem.fields.find( - ({ name }) => name === 'name', - )?.id; - - const basePathToShowPage = `/object/${objectMetadataItem.nameSingular}/`; - - return { - labelIdentifierFieldMetadataId, - basePathToShowPage, - }; -}; diff --git a/front/src/modules/object-metadata/hooks/useObjectMetadataItem.ts b/front/src/modules/object-metadata/hooks/useObjectMetadataItem.ts index c93767e34..429066e6f 100644 --- a/front/src/modules/object-metadata/hooks/useObjectMetadataItem.ts +++ b/front/src/modules/object-metadata/hooks/useObjectMetadataItem.ts @@ -56,7 +56,15 @@ export const useObjectMetadataItem = ({ objectMetadataItem, }); + const labelIdentifierFieldMetadataId = objectMetadataItem?.fields.find( + ({ name }) => name === 'name', + )?.id; + + const basePathToShowPage = `/object/${objectMetadataItem?.nameSingular}/`; + return { + labelIdentifierFieldMetadataId, + basePathToShowPage, objectMetadataItem, objectNotFoundInMetadata, findManyQuery, diff --git a/front/src/modules/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition.ts b/front/src/modules/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition.ts index 5e5ceabe8..18fd39c6c 100644 --- a/front/src/modules/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition.ts +++ b/front/src/modules/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition.ts @@ -1,3 +1,4 @@ +import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { parseFieldRelationType } from '@/object-metadata/utils/parseFieldRelationType'; import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata'; import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition'; @@ -9,9 +10,11 @@ import { parseFieldType } from './parseFieldType'; export const formatFieldMetadataItemAsColumnDefinition = ({ position, field, + objectMetadataItem, }: { position: number; field: FieldMetadataItem; + objectMetadataItem: ObjectMetadataItem; }): ColumnDefinition => { const relationObjectMetadataItem = field.toRelationMetadata?.fromObjectMetadata; @@ -26,9 +29,11 @@ export const formatFieldMetadataItemAsColumnDefinition = ({ fieldName: field.name, placeHolder: field.label, relationType: parseFieldRelationType(field), - objectMetadataNameSingular: + relationObjectMetadataNameSingular: relationObjectMetadataItem?.nameSingular ?? '', - objectMetadataNamePlural: relationObjectMetadataItem?.namePlural ?? '', + relationObjectMetadataNamePlural: + relationObjectMetadataItem?.namePlural ?? '', + objectMetadataNameSingular: objectMetadataItem.nameSingular ?? '', }, iconName: field.icon ?? 'Icon123', isVisible: true, diff --git a/front/src/modules/object-record/components/RecordShowPage.tsx b/front/src/modules/object-record/components/RecordShowPage.tsx index 03b99e0fa..b83b17c36 100644 --- a/front/src/modules/object-record/components/RecordShowPage.tsx +++ b/front/src/modules/object-record/components/RecordShowPage.tsx @@ -166,11 +166,12 @@ export const RecordShowPage = () => { value={{ entityId: object.id, recoilScopeId: object.id + metadataField.id, - isMainIdentifier: false, + isLabelIdentifier: false, fieldDefinition: formatFieldMetadataItemAsColumnDefinition({ field: metadataField, position: index, + objectMetadataItem, }), useUpdateEntityMutation: useUpdateOneObjectMutation, hotkeyScope: InlineCellHotkeyScope.InlineCell, diff --git a/front/src/modules/object-record/components/RecordTableEffect.tsx b/front/src/modules/object-record/components/RecordTableEffect.tsx index aec52c93a..1d9bc1590 100644 --- a/front/src/modules/object-record/components/RecordTableEffect.tsx +++ b/front/src/modules/object-record/components/RecordTableEffect.tsx @@ -1,7 +1,6 @@ import { useEffect } from 'react'; import { useComputeDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useComputeDefinitionsFromFieldMetadata'; -import { useObjectMainIdentifier } from '@/object-metadata/hooks/useObjectMainIdentifier'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useRecordTableContextMenuEntries } from '@/object-record/hooks/useRecordTableContextMenuEntries'; import { filterAvailableTableColumns } from '@/object-record/utils/filterAvailableTableColumns'; @@ -17,13 +16,14 @@ export const RecordTableEffect = () => { setObjectMetadataConfig, } = useRecordTable(); - const { objectMetadataItem } = useObjectMetadataItem({ + const { + objectMetadataItem, + basePathToShowPage, + labelIdentifierFieldMetadataId, + } = useObjectMetadataItem({ objectNamePlural, }); - const { basePathToShowPage, labelIdentifierFieldMetadataId } = - useObjectMainIdentifier(objectMetadataItem); - const { columnDefinitions, filterDefinitions, sortDefinitions } = useComputeDefinitionsFromFieldMetadata(objectMetadataItem); diff --git a/front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx b/front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx index f583600cf..0f3b5ed77 100644 --- a/front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx +++ b/front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx @@ -90,11 +90,12 @@ export const SettingsObjectFieldPreview = ({ objectMetadataId, }); - const { defaultValue: relationDefaultValue } = useRelationFieldPreview({ - relationObjectMetadataId, - skipDefaultValue: - fieldMetadata.type !== FieldMetadataType.Relation || hasValue, - }); + const { defaultValue: relationDefaultValue, relationObjectMetadataItem } = + useRelationFieldPreview({ + relationObjectMetadataId, + skipDefaultValue: + fieldMetadata.type !== FieldMetadataType.Relation || hasValue, + }); const defaultValue = fieldMetadata.type === FieldMetadataType.Relation @@ -137,7 +138,7 @@ export const SettingsObjectFieldPreview = ({ id === fieldMetadata.id)?.name : undefined; - const value = fieldName ? firstRecord?.[fieldName] : undefined; + const value = + fieldMetadata.type !== 'RELATION' && fieldName + ? firstRecord?.[fieldName] + : undefined; return { entityId: firstRecord?.id || `${objectMetadataId}-no-records`, diff --git a/front/src/modules/settings/data-model/hooks/useRelationFieldPreview.ts b/front/src/modules/settings/data-model/hooks/useRelationFieldPreview.ts index 9b297c3cb..b399ca204 100644 --- a/front/src/modules/settings/data-model/hooks/useRelationFieldPreview.ts +++ b/front/src/modules/settings/data-model/hooks/useRelationFieldPreview.ts @@ -1,5 +1,6 @@ import { useObjectMetadataItemForSettings } from '@/object-metadata/hooks/useObjectMetadataItemForSettings'; import { useFindManyObjectRecords } from '@/object-record/hooks/useFindManyObjectRecords'; +import { capitalize } from '~/utils/string/capitalize'; export const useRelationFieldPreview = ({ relationObjectMetadataId, @@ -20,6 +21,9 @@ export const useRelationFieldPreview = ({ }); return { - defaultValue: relationObjects?.[0], + relationObjectMetadataItem, + defaultValue: relationObjects?.[0] ?? { + name: capitalize(relationObjectMetadataItem?.nameSingular ?? ''), + }, }; }; diff --git a/front/src/modules/ui/input/components/internal/relation-picker/RelationPicker.tsx b/front/src/modules/ui/input/components/internal/relation-picker/RelationPicker.tsx index ce0d76798..53d93e974 100644 --- a/front/src/modules/ui/input/components/internal/relation-picker/RelationPicker.tsx +++ b/front/src/modules/ui/input/components/internal/relation-picker/RelationPicker.tsx @@ -37,7 +37,8 @@ export const RelationPicker = ({ }, [initialSearchFilter, setRelationPickerSearchFilter]); const { findManyQuery } = useObjectMetadataItem({ - objectNameSingular: fieldDefinition.metadata.objectMetadataNameSingular, + objectNameSingular: + fieldDefinition.metadata.relationObjectMetadataNameSingular, }); const useFindManyQuery = (options: any) => useQuery(findManyQuery, options); @@ -49,8 +50,8 @@ export const RelationPicker = ({ filters: [ { fieldNames: - searchQuery?.filterFields?.( - fieldDefinition.metadata.objectMetadataNameSingular, + searchQuery?.computeFilterFields?.( + fieldDefinition.metadata.relationObjectMetadataNameSingular, ) ?? [], filter: relationPickerSearchFilter, }, @@ -59,10 +60,10 @@ export const RelationPicker = ({ mappingFunction: (record: any) => identifiersMapper?.( record, - fieldDefinition.metadata.objectMetadataNameSingular, + fieldDefinition.metadata.relationObjectMetadataNameSingular, ), selectedIds: recordId ? [recordId] : [], - objectNamePlural: fieldDefinition.metadata.objectMetadataNamePlural, + objectNamePlural: fieldDefinition.metadata.relationObjectMetadataNamePlural, }); const handleEntitySelected = async (selectedUser: any | null | undefined) => { diff --git a/front/src/modules/ui/input/components/internal/relation-picker/types/SearchQuery.tsx b/front/src/modules/ui/input/components/internal/relation-picker/types/SearchQuery.tsx index e34cb9f56..1559ab41d 100644 --- a/front/src/modules/ui/input/components/internal/relation-picker/types/SearchQuery.tsx +++ b/front/src/modules/ui/input/components/internal/relation-picker/types/SearchQuery.tsx @@ -1,3 +1,3 @@ export type SearchQuery = { - filterFields: (relationPickerType: string) => string[]; + computeFilterFields: (relationPickerType: string) => string[]; }; diff --git a/front/src/modules/ui/object/field/components/FieldDisplay.tsx b/front/src/modules/ui/object/field/components/FieldDisplay.tsx index 76cdf788c..760456a40 100644 --- a/front/src/modules/ui/object/field/components/FieldDisplay.tsx +++ b/front/src/modules/ui/object/field/components/FieldDisplay.tsx @@ -1,5 +1,6 @@ import { useContext } from 'react'; +import { ChipFieldDisplay } from '@/ui/object/field/meta-types/display/components/ChipFieldDisplay'; import { FullNameFieldDisplay } from '@/ui/object/field/meta-types/display/components/FullNameFieldDisplay'; import { LinkFieldDisplay } from '@/ui/object/field/meta-types/display/components/LinkFieldDisplay'; import { RelationFieldDisplay } from '@/ui/object/field/meta-types/display/components/RelationFieldDisplay'; @@ -24,8 +25,14 @@ import { isFieldRelation } from '../types/guards/isFieldRelation'; import { isFieldText } from '../types/guards/isFieldText'; export const FieldDisplay = () => { - const { fieldDefinition } = useContext(FieldContext); + const { fieldDefinition, isLabelIdentifier } = useContext(FieldContext); + if ( + isLabelIdentifier && + (isFieldText(fieldDefinition) || isFieldFullName(fieldDefinition)) + ) { + return ; + } return ( <> {isFieldRelation(fieldDefinition) ? ( diff --git a/front/src/modules/ui/object/field/contexts/FieldContext.ts b/front/src/modules/ui/object/field/contexts/FieldContext.ts index 611d27ffa..f4d421a14 100644 --- a/front/src/modules/ui/object/field/contexts/FieldContext.ts +++ b/front/src/modules/ui/object/field/contexts/FieldContext.ts @@ -10,12 +10,7 @@ export type GenericFieldContextType = { entityId: string; recoilScopeId?: string; hotkeyScope: string; - isMainIdentifier: boolean; - mainIdentifierMapper?: (record: any) => { - name: string; - avatarUrl?: string; - avatarType: string; - }; + isLabelIdentifier: boolean; basePathToShowPage?: string; }; diff --git a/front/src/modules/ui/object/field/meta-types/__stories__/FieldContextProvider.tsx b/front/src/modules/ui/object/field/meta-types/__stories__/FieldContextProvider.tsx index 9c642e454..726680926 100644 --- a/front/src/modules/ui/object/field/meta-types/__stories__/FieldContextProvider.tsx +++ b/front/src/modules/ui/object/field/meta-types/__stories__/FieldContextProvider.tsx @@ -18,7 +18,7 @@ export const FieldContextProvider = ({ { - // const { avatarFieldValue, contentFieldValue, entityId } = useChipField(); - // return ( - // - // ); + const { + record, + entityId, + identifiersMapper, + objectNameSingular, + basePathToShowPage, + } = useChipField(); + + const identifiers = identifiersMapper?.(record, objectNameSingular ?? ''); + + return ( + + ); }; diff --git a/front/src/modules/ui/object/field/meta-types/display/components/DoubleTextChipFieldDisplay.tsx b/front/src/modules/ui/object/field/meta-types/display/components/DoubleTextChipFieldDisplay.tsx deleted file mode 100644 index 6c67a5712..000000000 --- a/front/src/modules/ui/object/field/meta-types/display/components/DoubleTextChipFieldDisplay.tsx +++ /dev/null @@ -1,11 +0,0 @@ -export const DoubleTextChipFieldDisplay = () => { - // const {} = useFullNameField(); - // const content = [firstValue, secondValue].filter(Boolean).join(' '); - // return ( - // - // ); -}; diff --git a/front/src/modules/ui/object/field/meta-types/display/components/RelationFieldDisplay.tsx b/front/src/modules/ui/object/field/meta-types/display/components/RelationFieldDisplay.tsx index 5d52a0a28..4495dd58d 100644 --- a/front/src/modules/ui/object/field/meta-types/display/components/RelationFieldDisplay.tsx +++ b/front/src/modules/ui/object/field/meta-types/display/components/RelationFieldDisplay.tsx @@ -13,7 +13,7 @@ export const RelationFieldDisplay = () => { const objectIdentifiers = identifiersMapper( fieldValue, - fieldDefinition.metadata.objectMetadataNameSingular, + fieldDefinition.metadata.relationObjectMetadataNameSingular, ); return ( diff --git a/front/src/modules/ui/object/field/meta-types/display/components/__stories__/DateFieldDisplay.stories.tsx b/front/src/modules/ui/object/field/meta-types/display/components/__stories__/DateFieldDisplay.stories.tsx index c37ae761d..3e2ae7bfe 100644 --- a/front/src/modules/ui/object/field/meta-types/display/components/__stories__/DateFieldDisplay.stories.tsx +++ b/front/src/modules/ui/object/field/meta-types/display/components/__stories__/DateFieldDisplay.stories.tsx @@ -26,7 +26,7 @@ const meta: Meta = { { + const { entityId, fieldDefinition, basePathToShowPage } = + useContext(FieldContext); + + const objectNameSingular = + isFieldText(fieldDefinition) || isFieldFullName(fieldDefinition) + ? fieldDefinition.metadata.objectMetadataNameSingular + : undefined; + + const record = useRecoilValue(entityFieldsFamilyState(entityId)); + + const { identifiersMapper } = useRelationPicker(); + + return { + basePathToShowPage, + entityId, + objectNameSingular, + record, + identifiersMapper, + }; +}; diff --git a/front/src/modules/ui/object/field/types/FieldMetadata.ts b/front/src/modules/ui/object/field/types/FieldMetadata.ts index fef641964..1a290e08d 100644 --- a/front/src/modules/ui/object/field/types/FieldMetadata.ts +++ b/front/src/modules/ui/object/field/types/FieldMetadata.ts @@ -9,6 +9,7 @@ export type FieldBooleanMetadata = { }; export type FieldTextMetadata = { + objectMetadataNameSingular: string; placeHolder: string; fieldName: string; }; @@ -36,6 +37,7 @@ export type FieldCurrencyMetadata = { }; export type FieldFullNameMetadata = { + objectMetadataNameSingular: string; placeHolder: string; fieldName: string; }; @@ -64,8 +66,8 @@ export type FieldRelationMetadata = { fieldName: string; useEditButton?: boolean; relationType?: FieldDefinitionRelationType; - objectMetadataNameSingular: string; - objectMetadataNamePlural: string; + relationObjectMetadataNameSingular: string; + relationObjectMetadataNamePlural: string; }; export type FieldMetadata = diff --git a/front/src/modules/ui/object/record-table/components/RecordTableCell.tsx b/front/src/modules/ui/object/record-table/components/RecordTableCell.tsx index 87ae6aff3..1acdbb528 100644 --- a/front/src/modules/ui/object/record-table/components/RecordTableCell.tsx +++ b/front/src/modules/ui/object/record-table/components/RecordTableCell.tsx @@ -60,7 +60,8 @@ export const RecordTableCell = ({ cellIndex }: { cellIndex: number }) => { fieldDefinition: columnDefinition, useUpdateEntityMutation: () => [updateEntityMutation, {}], hotkeyScope: customHotkeyScope, - isMainIdentifier: + basePathToShowPage: objectMetadataConfig?.basePathToShowPage, + isLabelIdentifier: columnDefinition.fieldMetadataId === objectMetadataConfig?.labelIdentifierFieldMetadataId, }}