From b9f23d9be6f57bd6ad02c0a9fe6697de13d8044a Mon Sep 17 00:00:00 2001 From: bosiraphael <71827178+bosiraphael@users.noreply.github.com> Date: Mon, 9 Oct 2023 22:38:47 +0200 Subject: [PATCH] Refactor RelationFieldDisplay to eliminate dependency on non-ui components (#1949) * job done * removed example type * removed unused temporary type --- .../companies/components/CompanyBoardCard.tsx | 1 + .../companiesAvailableColumnDefinitions.tsx | 8 +++ .../peopleAvailableColumnDefinitions.tsx | 9 +++ .../pipelineAvailableFieldDefinitions.tsx | 8 +++ .../components/RelationFieldDisplay.tsx | 64 ++++++------------- .../modules/ui/field/types/FieldDefinition.ts | 6 ++ 6 files changed, 50 insertions(+), 46 deletions(-) diff --git a/front/src/modules/companies/components/CompanyBoardCard.tsx b/front/src/modules/companies/components/CompanyBoardCard.tsx index e3fa72cbf..413174e7a 100644 --- a/front/src/modules/companies/components/CompanyBoardCard.tsx +++ b/front/src/modules/companies/components/CompanyBoardCard.tsx @@ -170,6 +170,7 @@ export const CompanyBoardCard = () => { type: viewField.type, metadata: viewField.metadata, buttonIcon: viewField.buttonIcon, + entityChipDisplayMapper: viewField.entityChipDisplayMapper, }, useUpdateEntityMutation: useUpdateOnePipelineProgressMutation, hotkeyScope: InlineCellHotkeyScope.InlineCell, diff --git a/front/src/modules/companies/constants/companiesAvailableColumnDefinitions.tsx b/front/src/modules/companies/constants/companiesAvailableColumnDefinitions.tsx index eb44dcb98..4f89964d2 100644 --- a/front/src/modules/companies/constants/companiesAvailableColumnDefinitions.tsx +++ b/front/src/modules/companies/constants/companiesAvailableColumnDefinitions.tsx @@ -25,6 +25,7 @@ import { IconUsers, } from '@/ui/icon/index'; import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect'; +import { User } from '~/generated/graphql'; export const companiesAvailableColumnDefinitions: ColumnDefinition[] = [ @@ -76,6 +77,13 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition { + return { + name: dataObject?.displayName, + pictureUrl: dataObject?.avatarUrl ?? undefined, + avatarType: 'rounded', + }; + }, } satisfies ColumnDefinition, { key: 'createdAt', diff --git a/front/src/modules/people/constants/peopleAvailableColumnDefinitions.tsx b/front/src/modules/people/constants/peopleAvailableColumnDefinitions.tsx index 23c4a9337..6a841d539 100644 --- a/front/src/modules/people/constants/peopleAvailableColumnDefinitions.tsx +++ b/front/src/modules/people/constants/peopleAvailableColumnDefinitions.tsx @@ -23,6 +23,8 @@ import { IconUser, } from '@/ui/icon/index'; import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect'; +import { Company } from '~/generated/graphql'; +import { getLogoUrlFromDomainName } from '~/utils'; export const peopleAvailableColumnDefinitions: ColumnDefinition[] = [ @@ -71,6 +73,13 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition[] relationType: Entity.Company, }, infoTooltipContent: 'Contact’s company.', + entityChipDisplayMapper: (dataObject: Company) => { + return { + name: dataObject?.name, + pictureUrl: getLogoUrlFromDomainName(dataObject?.domainName), + avatarType: 'squared', + }; + }, } satisfies ColumnDefinition, { key: 'phone', diff --git a/front/src/modules/pipeline/constants/pipelineAvailableFieldDefinitions.tsx b/front/src/modules/pipeline/constants/pipelineAvailableFieldDefinitions.tsx index 6ace5e011..32486c600 100644 --- a/front/src/modules/pipeline/constants/pipelineAvailableFieldDefinitions.tsx +++ b/front/src/modules/pipeline/constants/pipelineAvailableFieldDefinitions.tsx @@ -14,6 +14,7 @@ import { IconUser, } from '@/ui/icon'; import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect'; +import { Person } from '~/generated/graphql'; export const pipelineAvailableFieldDefinitions: BoardFieldDefinition[] = [ @@ -70,5 +71,12 @@ export const pipelineAvailableFieldDefinitions: BoardFieldDefinition { + return { + name: dataObject?.displayName, + pictureUrl: dataObject?.avatarUrl ?? undefined, + avatarType: 'rounded', + }; + }, } satisfies BoardFieldDefinition, ]; diff --git a/front/src/modules/ui/field/meta-types/display/components/RelationFieldDisplay.tsx b/front/src/modules/ui/field/meta-types/display/components/RelationFieldDisplay.tsx index 5e075c9cc..d34b714c0 100644 --- a/front/src/modules/ui/field/meta-types/display/components/RelationFieldDisplay.tsx +++ b/front/src/modules/ui/field/meta-types/display/components/RelationFieldDisplay.tsx @@ -1,52 +1,24 @@ -import { CompanyChip } from '@/companies/components/CompanyChip'; -import { PersonChip } from '@/people/components/PersonChip'; -import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect'; -import { UserChip } from '@/users/components/UserChip'; -import { getLogoUrlFromDomainName } from '~/utils'; -import { logError } from '~/utils/logError'; +import { EntityChip } from '@/ui/chip/components/EntityChip'; import { useRelationField } from '../../hooks/useRelationField'; export const RelationFieldDisplay = () => { - const { fieldDefinition, fieldValue } = useRelationField(); - - switch (fieldDefinition.metadata.relationType) { - case Entity.Person: { - return ( - - ); - } - case Entity.User: { - return ( - - ); - } - case Entity.Company: { - return ( - - ); - } - default: - logError( - `Unknown relation type: "${fieldDefinition.metadata.relationType}" - in RelationFieldDisplay`, - ); - return <> ; + const { fieldValue, fieldDefinition } = useRelationField(); + const { entityChipDisplayMapper } = fieldDefinition; + if (!entityChipDisplayMapper) { + throw new Error( + "Missing entityChipDisplayMapper in FieldContext. Please provide it in the FieldContextProvider's value prop.", + ); } + const { name, pictureUrl, avatarType } = + entityChipDisplayMapper?.(fieldValue); + + return ( + + ); }; diff --git a/front/src/modules/ui/field/types/FieldDefinition.ts b/front/src/modules/ui/field/types/FieldDefinition.ts index 867dcca73..0003bc221 100644 --- a/front/src/modules/ui/field/types/FieldDefinition.ts +++ b/front/src/modules/ui/field/types/FieldDefinition.ts @@ -1,4 +1,5 @@ import { IconComponent } from '@/ui/icon/types/IconComponent'; +import { AvatarType } from '@/users/components/Avatar'; import { FieldMetadata } from './FieldMetadata'; import { FieldType } from './FieldType'; @@ -12,4 +13,9 @@ export type FieldDefinition = { buttonIcon?: IconComponent; basePathToShowPage?: string; infoTooltipContent?: string; + entityChipDisplayMapper?: (dataObject: any) => { + name: string; + pictureUrl?: string; + avatarType: AvatarType; + }; };