Chore: Edit button on cells should be guessed by the field's type (#1952)

* created custom hook to get Icon Component as per field type

* Fix conflicts

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Ayush Agrawal
2023-10-18 02:12:57 +05:30
committed by GitHub
parent 2c1ad1661a
commit a1a2309140
10 changed files with 40 additions and 38 deletions

View File

@ -169,7 +169,6 @@ export const CompanyBoardCard = () => {
Icon: viewField.Icon, Icon: viewField.Icon,
type: viewField.type, type: viewField.type,
metadata: viewField.metadata, metadata: viewField.metadata,
buttonIcon: viewField.buttonIcon,
entityChipDisplayMapper: viewField.entityChipDisplayMapper, entityChipDisplayMapper: viewField.entityChipDisplayMapper,
}, },
useUpdateEntityMutation: useUpdateOnePipelineProgressMutation, useUpdateEntityMutation: useUpdateOnePipelineProgressMutation,

View File

@ -11,7 +11,6 @@ import {
FieldURLMetadata, FieldURLMetadata,
} from '@/ui/data/field/types/FieldMetadata'; } from '@/ui/data/field/types/FieldMetadata';
import { import {
IconArrowUpRight,
IconBrandLinkedin, IconBrandLinkedin,
IconBrandX, IconBrandX,
IconBuildingSkyscraper, IconBuildingSkyscraper,
@ -19,7 +18,6 @@ import {
IconLink, IconLink,
IconMap, IconMap,
IconMoneybag, IconMoneybag,
IconPencil,
IconTarget, IconTarget,
IconUserCircle, IconUserCircle,
IconUsers, IconUsers,
@ -43,7 +41,6 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<FieldMetadata
placeHolder: 'Company Name', placeHolder: 'Company Name',
}, },
isVisible: true, isVisible: true,
buttonIcon: IconArrowUpRight,
infoTooltipContent: 'The company name.', infoTooltipContent: 'The company name.',
basePathToShowPage: '/companies/', basePathToShowPage: '/companies/',
} satisfies ColumnDefinition<FieldChipMetadata>, } satisfies ColumnDefinition<FieldChipMetadata>,
@ -59,7 +56,6 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<FieldMetadata
placeHolder: 'example.com', placeHolder: 'example.com',
}, },
isVisible: true, isVisible: true,
buttonIcon: IconPencil,
infoTooltipContent: infoTooltipContent:
'The company website URL. We use this url to fetch the company icon.', 'The company website URL. We use this url to fetch the company icon.',
} satisfies ColumnDefinition<FieldURLMetadata>, } satisfies ColumnDefinition<FieldURLMetadata>,
@ -125,7 +121,6 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<FieldMetadata
placeHolder: 'LinkedIn URL', placeHolder: 'LinkedIn URL',
}, },
isVisible: true, isVisible: true,
buttonIcon: IconPencil,
infoTooltipContent: 'The company Linkedin account.', infoTooltipContent: 'The company Linkedin account.',
} satisfies ColumnDefinition<FieldURLMetadata>, } satisfies ColumnDefinition<FieldURLMetadata>,
{ {
@ -182,7 +177,6 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<FieldMetadata
placeHolder: 'X', placeHolder: 'X',
}, },
isVisible: false, isVisible: false,
buttonIcon: IconPencil,
infoTooltipContent: 'The company Twitter account.', infoTooltipContent: 'The company Twitter account.',
} satisfies ColumnDefinition<FieldURLMetadata>, } satisfies ColumnDefinition<FieldURLMetadata>,
]; ];
@ -201,7 +195,6 @@ export const suppliersAvailableColumnDefinitions: ColumnDefinition<FieldMetadata
placeHolder: 'Company Name', placeHolder: 'Company Name',
}, },
isVisible: true, isVisible: true,
buttonIcon: IconArrowUpRight,
infoTooltipContent: 'The company name.', infoTooltipContent: 'The company name.',
basePathToShowPage: '/companies/', basePathToShowPage: '/companies/',
} satisfies ColumnDefinition<FieldTextMetadata>, } satisfies ColumnDefinition<FieldTextMetadata>,
@ -217,7 +210,6 @@ export const suppliersAvailableColumnDefinitions: ColumnDefinition<FieldMetadata
placeHolder: 'Company Name', placeHolder: 'Company Name',
}, },
isVisible: true, isVisible: true,
buttonIcon: IconArrowUpRight,
infoTooltipContent: 'The company name.', infoTooltipContent: 'The company name.',
basePathToShowPage: '/companies/', basePathToShowPage: '/companies/',
} satisfies ColumnDefinition<FieldTextMetadata>, } satisfies ColumnDefinition<FieldTextMetadata>,

View File

@ -10,7 +10,6 @@ import {
FieldURLMetadata, FieldURLMetadata,
} from '@/ui/data/field/types/FieldMetadata'; } from '@/ui/data/field/types/FieldMetadata';
import { import {
IconArrowUpRight,
IconBrandLinkedin, IconBrandLinkedin,
IconBrandX, IconBrandX,
IconBriefcase, IconBriefcase,
@ -18,7 +17,6 @@ import {
IconCalendarEvent, IconCalendarEvent,
IconMail, IconMail,
IconMap, IconMap,
IconPencil,
IconPhone, IconPhone,
IconUser, IconUser,
} from '@/ui/display/icon/index'; } from '@/ui/display/icon/index';
@ -43,7 +41,6 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<FieldMetadata>[]
avatarUrlFieldName: 'avatarUrl', avatarUrlFieldName: 'avatarUrl',
entityType: Entity.Person, entityType: Entity.Person,
}, },
buttonIcon: IconArrowUpRight,
infoTooltipContent: 'Contacts first and last name.', infoTooltipContent: 'Contacts first and last name.',
basePathToShowPage: '/person/', basePathToShowPage: '/person/',
} satisfies ColumnDefinition<FieldDoubleTextChipMetadata>, } satisfies ColumnDefinition<FieldDoubleTextChipMetadata>,
@ -58,7 +55,6 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<FieldMetadata>[]
fieldName: 'email', fieldName: 'email',
placeHolder: 'Email', // Hack: Fake character to prevent password-manager from filling the field placeHolder: 'Email', // Hack: Fake character to prevent password-manager from filling the field
}, },
buttonIcon: IconPencil,
infoTooltipContent: 'Contacts Email.', infoTooltipContent: 'Contacts Email.',
} satisfies ColumnDefinition<FieldEmailMetadata>, } satisfies ColumnDefinition<FieldEmailMetadata>,
{ {
@ -92,7 +88,6 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<FieldMetadata>[]
fieldName: 'phone', fieldName: 'phone',
placeHolder: 'Phone', // Hack: Fake character to prevent password-manager from filling the field placeHolder: 'Phone', // Hack: Fake character to prevent password-manager from filling the field
}, },
buttonIcon: IconPencil,
infoTooltipContent: 'Contacts phone number.', infoTooltipContent: 'Contacts phone number.',
} satisfies ColumnDefinition<FieldPhoneMetadata>, } satisfies ColumnDefinition<FieldPhoneMetadata>,
{ {
@ -144,7 +139,6 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<FieldMetadata>[]
fieldName: 'linkedinUrl', fieldName: 'linkedinUrl',
placeHolder: 'LinkedIn', placeHolder: 'LinkedIn',
}, },
buttonIcon: IconPencil,
infoTooltipContent: 'Contacts Linkedin account.', infoTooltipContent: 'Contacts Linkedin account.',
} satisfies ColumnDefinition<FieldURLMetadata>, } satisfies ColumnDefinition<FieldURLMetadata>,
{ {
@ -158,7 +152,6 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<FieldMetadata>[]
fieldName: 'xUrl', fieldName: 'xUrl',
placeHolder: 'X', placeHolder: 'X',
}, },
buttonIcon: IconPencil,
infoTooltipContent: 'Contacts Twitter account.', infoTooltipContent: 'Contacts Twitter account.',
} satisfies ColumnDefinition<FieldURLMetadata>, } satisfies ColumnDefinition<FieldURLMetadata>,
]; ];

View File

@ -8,7 +8,6 @@ import {
import { import {
IconCalendarEvent, IconCalendarEvent,
IconCurrencyDollar, IconCurrencyDollar,
IconPencil,
IconProgressCheck, IconProgressCheck,
IconUser, IconUser,
} from '@/ui/display/icon'; } from '@/ui/display/icon';
@ -69,7 +68,6 @@ export const pipelineAvailableFieldDefinitions: BoardFieldDefinition<FieldMetada
useEditButton: true, useEditButton: true,
}, },
isVisible: true, isVisible: true,
buttonIcon: IconPencil,
infoTooltipContent: 'Primary contact within the company.', infoTooltipContent: 'Primary contact within the company.',
entityChipDisplayMapper: (dataObject: Person) => { entityChipDisplayMapper: (dataObject: Person) => {
return { return {

View File

@ -2,10 +2,12 @@ import { useContext } from 'react';
import { FieldDisplay } from '@/ui/data/field/components/FieldDisplay'; import { FieldDisplay } from '@/ui/data/field/components/FieldDisplay';
import { FieldInput } from '@/ui/data/field/components/FieldInput'; import { FieldInput } from '@/ui/data/field/components/FieldInput';
import { FieldContext } from '@/ui/data/field/contexts/FieldContext'; import { useGetButtonIcon } from '@/ui/data/field/hooks/useGetButtonIcon';
import { FieldInputEvent } from '@/ui/data/field/types/FieldInputEvent'; import { FieldInputEvent } from '@/ui/data/field/types/FieldInputEvent';
import { IconArrowUpRight } from '@/ui/display/icon';
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
import { ColumnIndexContext } from '../../contexts/ColumnIndexContext';
import { useMoveSoftFocus } from '../../hooks/useMoveSoftFocus'; import { useMoveSoftFocus } from '../../hooks/useMoveSoftFocus';
import { useTableCell } from '../hooks/useTableCell'; import { useTableCell } from '../hooks/useTableCell';
@ -16,7 +18,9 @@ export const TableCell = ({
}: { }: {
customHotkeyScope: HotkeyScope; customHotkeyScope: HotkeyScope;
}) => { }) => {
const { fieldDefinition } = useContext(FieldContext); const isFirstColumn = useContext(ColumnIndexContext) === 0;
const buttonIcon = useGetButtonIcon();
const { closeTableCell } = useTableCell(); const { closeTableCell } = useTableCell();
@ -68,7 +72,7 @@ export const TableCell = ({
/> />
} }
nonEditModeContent={<FieldDisplay />} nonEditModeContent={<FieldDisplay />}
buttonIcon={fieldDefinition.buttonIcon} buttonIcon={isFirstColumn ? IconArrowUpRight : buttonIcon}
></TableCellContainer> ></TableCellContainer>
); );
}; };

View File

@ -0,0 +1,22 @@
import { useContext } from 'react';
import { IconPencil } from '@/ui/display/icon';
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
import { FieldContext } from '../contexts/FieldContext';
import { isFieldEmail } from '../types/guards/isFieldEmail';
import { isFieldPhone } from '../types/guards/isFieldPhone';
import { isFieldRelation } from '../types/guards/isFieldRelation';
import { isFieldURL } from '../types/guards/isFieldURL';
export const useGetButtonIcon = (): IconComponent | undefined => {
const { fieldDefinition } = useContext(FieldContext);
if (
isFieldURL(fieldDefinition) ||
isFieldEmail(fieldDefinition) ||
isFieldPhone(fieldDefinition) ||
isFieldRelation(fieldDefinition)
) {
return IconPencil;
}
};

View File

@ -10,7 +10,6 @@ export type FieldDefinition<T extends FieldMetadata> = {
Icon?: IconComponent; Icon?: IconComponent;
type: FieldType; type: FieldType;
metadata: T; metadata: T;
buttonIcon?: IconComponent;
basePathToShowPage?: string; basePathToShowPage?: string;
infoTooltipContent?: string; infoTooltipContent?: string;
entityChipDisplayMapper?: (dataObject: any) => { entityChipDisplayMapper?: (dataObject: any) => {

View File

@ -1,14 +1,15 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { FieldDisplay } from '@/ui/data/field/components/FieldDisplay';
import { FieldInput } from '@/ui/data/field/components/FieldInput';
import { FieldContext } from '@/ui/data/field/contexts/FieldContext';
import { useIsFieldEmpty } from '@/ui/data/field/hooks/useIsFieldEmpty';
import { useIsFieldInputOnly } from '@/ui/data/field/hooks/useIsFieldInputOnly';
import { FieldInputEvent } from '@/ui/data/field/types/FieldInputEvent';
import { isFieldRelation } from '@/ui/data/field/types/guards/isFieldRelation';
import { RelationPickerHotkeyScope } from '@/ui/input/relation-picker/types/RelationPickerHotkeyScope'; import { RelationPickerHotkeyScope } from '@/ui/input/relation-picker/types/RelationPickerHotkeyScope';
import { FieldDisplay } from '../../field/components/FieldDisplay';
import { FieldInput } from '../../field/components/FieldInput';
import { FieldContext } from '../../field/contexts/FieldContext';
import { useGetButtonIcon } from '../../field/hooks/useGetButtonIcon';
import { useIsFieldEmpty } from '../../field/hooks/useIsFieldEmpty';
import { useIsFieldInputOnly } from '../../field/hooks/useIsFieldInputOnly';
import { FieldInputEvent } from '../../field/types/FieldInputEvent';
import { isFieldRelation } from '../../field/types/guards/isFieldRelation';
import { useInlineCell } from '../hooks/useInlineCell'; import { useInlineCell } from '../hooks/useInlineCell';
import { InlineCellContainer } from './InlineCellContainer'; import { InlineCellContainer } from './InlineCellContainer';
@ -16,6 +17,8 @@ import { InlineCellContainer } from './InlineCellContainer';
export const InlineCell = () => { export const InlineCell = () => {
const { fieldDefinition } = useContext(FieldContext); const { fieldDefinition } = useContext(FieldContext);
const buttonIcon = useGetButtonIcon();
const isFieldEmpty = useIsFieldEmpty(); const isFieldEmpty = useIsFieldEmpty();
const isFieldInputOnly = useIsFieldInputOnly(); const isFieldInputOnly = useIsFieldInputOnly();
@ -57,7 +60,7 @@ export const InlineCell = () => {
return ( return (
<InlineCellContainer <InlineCellContainer
buttonIcon={fieldDefinition.buttonIcon} buttonIcon={buttonIcon}
customEditHotkeyScope={ customEditHotkeyScope={
isFieldRelation(fieldDefinition) isFieldRelation(fieldDefinition)
? { ? {

View File

@ -13,7 +13,6 @@ import {
IconCalendar, IconCalendar,
IconLink, IconLink,
IconMap, IconMap,
IconPencil,
IconTarget, IconTarget,
IconUserCircle, IconUserCircle,
IconUsers, IconUsers,
@ -31,7 +30,6 @@ export const companyShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
fieldName: 'domainName', fieldName: 'domainName',
placeHolder: 'URL', placeHolder: 'URL',
}, },
buttonIcon: IconPencil,
} satisfies FieldDefinition<FieldURLMetadata>, } satisfies FieldDefinition<FieldURLMetadata>,
{ {
key: 'accountOwner', key: 'accountOwner',
@ -88,7 +86,6 @@ export const companyShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
fieldName: 'xUrl', fieldName: 'xUrl',
placeHolder: 'X', placeHolder: 'X',
}, },
buttonIcon: IconPencil,
} satisfies FieldDefinition<FieldURLMetadata>, } satisfies FieldDefinition<FieldURLMetadata>,
{ {
key: 'createdAt', key: 'createdAt',

View File

@ -15,7 +15,6 @@ import {
IconCalendar, IconCalendar,
IconMail, IconMail,
IconMap, IconMap,
IconPencil,
IconPhone, IconPhone,
} from '@/ui/display/icon'; } from '@/ui/display/icon';
import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect'; import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect';
@ -38,7 +37,6 @@ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
name: 'Company', name: 'Company',
Icon: IconBuildingSkyscraper, Icon: IconBuildingSkyscraper,
type: 'relation', type: 'relation',
buttonIcon: IconPencil,
metadata: { metadata: {
fieldName: 'company', fieldName: 'company',
relationType: Entity.Company, relationType: Entity.Company,
@ -60,7 +58,6 @@ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
fieldName: 'phone', fieldName: 'phone',
placeHolder: 'Phone', placeHolder: 'Phone',
}, },
buttonIcon: IconPencil,
} satisfies FieldDefinition<FieldPhoneMetadata>, } satisfies FieldDefinition<FieldPhoneMetadata>,
{ {
key: 'jobTitle', key: 'jobTitle',
@ -91,7 +88,6 @@ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
fieldName: 'linkedinUrl', fieldName: 'linkedinUrl',
placeHolder: 'Linkedin URL', placeHolder: 'Linkedin URL',
}, },
buttonIcon: IconPencil,
} satisfies FieldDefinition<FieldURLMetadata>, } satisfies FieldDefinition<FieldURLMetadata>,
{ {
key: 'xUrl', key: 'xUrl',
@ -102,7 +98,6 @@ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
fieldName: 'xUrl', fieldName: 'xUrl',
placeHolder: 'X URL', placeHolder: 'X URL',
}, },
buttonIcon: IconPencil,
} satisfies FieldDefinition<FieldURLMetadata>, } satisfies FieldDefinition<FieldURLMetadata>,
{ {
key: 'createdAt', key: 'createdAt',