refactor: index ViewField by viewId and key (#1416)

* refactor: index ViewField by viewId and key

Closes #1413

* refactor: rename ViewField properties
This commit is contained in:
Thaïs
2023-09-04 10:55:03 +02:00
committed by GitHub
parent c3c5cb4d1f
commit ae072b6ce5
35 changed files with 463 additions and 447 deletions

View File

@ -2458,34 +2458,34 @@ export type ViewCreateNestedOneWithoutFieldsInput = {
export type ViewField = { export type ViewField = {
__typename?: 'ViewField'; __typename?: 'ViewField';
fieldName: Scalars['String'];
id: Scalars['ID'];
index: Scalars['Int']; index: Scalars['Int'];
isVisible: Scalars['Boolean']; isVisible: Scalars['Boolean'];
objectName: Scalars['String']; key: Scalars['String'];
sizeInPx: Scalars['Int']; name: Scalars['String'];
view?: Maybe<View>; objectId: Scalars['String'];
viewId?: Maybe<Scalars['String']>; size: Scalars['Int'];
view: View;
viewId: Scalars['String'];
}; };
export type ViewFieldCreateInput = { export type ViewFieldCreateInput = {
fieldName: Scalars['String'];
id?: InputMaybe<Scalars['String']>;
index: Scalars['Int']; index: Scalars['Int'];
isVisible: Scalars['Boolean']; isVisible: Scalars['Boolean'];
objectName: Scalars['String']; key: Scalars['String'];
sizeInPx: Scalars['Int']; name: Scalars['String'];
view?: InputMaybe<ViewCreateNestedOneWithoutFieldsInput>; objectId: Scalars['String'];
size: Scalars['Int'];
view: ViewCreateNestedOneWithoutFieldsInput;
}; };
export type ViewFieldCreateManyInput = { export type ViewFieldCreateManyInput = {
fieldName: Scalars['String'];
id?: InputMaybe<Scalars['String']>;
index: Scalars['Int']; index: Scalars['Int'];
isVisible: Scalars['Boolean']; isVisible: Scalars['Boolean'];
objectName: Scalars['String']; key: Scalars['String'];
sizeInPx: Scalars['Int']; name: Scalars['String'];
viewId?: InputMaybe<Scalars['String']>; objectId: Scalars['String'];
size: Scalars['Int'];
viewId: Scalars['String'];
}; };
export type ViewFieldCreateNestedManyWithoutViewInput = { export type ViewFieldCreateNestedManyWithoutViewInput = {
@ -2503,35 +2503,35 @@ export type ViewFieldOrderByRelationAggregateInput = {
}; };
export type ViewFieldOrderByWithRelationInput = { export type ViewFieldOrderByWithRelationInput = {
fieldName?: InputMaybe<SortOrder>;
id?: InputMaybe<SortOrder>;
index?: InputMaybe<SortOrder>; index?: InputMaybe<SortOrder>;
isVisible?: InputMaybe<SortOrder>; isVisible?: InputMaybe<SortOrder>;
objectName?: InputMaybe<SortOrder>; key?: InputMaybe<SortOrder>;
sizeInPx?: InputMaybe<SortOrder>; name?: InputMaybe<SortOrder>;
objectId?: InputMaybe<SortOrder>;
size?: InputMaybe<SortOrder>;
view?: InputMaybe<ViewOrderByWithRelationInput>; view?: InputMaybe<ViewOrderByWithRelationInput>;
viewId?: InputMaybe<SortOrder>; viewId?: InputMaybe<SortOrder>;
}; };
export enum ViewFieldScalarFieldEnum { export enum ViewFieldScalarFieldEnum {
FieldName = 'fieldName',
Id = 'id',
Index = 'index', Index = 'index',
IsVisible = 'isVisible', IsVisible = 'isVisible',
ObjectName = 'objectName', Key = 'key',
SizeInPx = 'sizeInPx', Name = 'name',
ObjectId = 'objectId',
Size = 'size',
ViewId = 'viewId', ViewId = 'viewId',
WorkspaceId = 'workspaceId' WorkspaceId = 'workspaceId'
} }
export type ViewFieldUpdateInput = { export type ViewFieldUpdateInput = {
fieldName?: InputMaybe<Scalars['String']>;
id?: InputMaybe<Scalars['String']>;
index?: InputMaybe<Scalars['Int']>; index?: InputMaybe<Scalars['Int']>;
isVisible?: InputMaybe<Scalars['Boolean']>; isVisible?: InputMaybe<Scalars['Boolean']>;
objectName?: InputMaybe<Scalars['String']>; key?: InputMaybe<Scalars['String']>;
sizeInPx?: InputMaybe<Scalars['Int']>; name?: InputMaybe<Scalars['String']>;
view?: InputMaybe<ViewUpdateOneWithoutFieldsNestedInput>; objectId?: InputMaybe<Scalars['String']>;
size?: InputMaybe<Scalars['Int']>;
view?: InputMaybe<ViewUpdateOneRequiredWithoutFieldsNestedInput>;
}; };
export type ViewFieldUpdateManyWithoutViewNestedInput = { export type ViewFieldUpdateManyWithoutViewNestedInput = {
@ -2546,29 +2546,27 @@ export type ViewFieldUpdateManyWithoutWorkspaceNestedInput = {
set?: InputMaybe<Array<ViewFieldWhereUniqueInput>>; set?: InputMaybe<Array<ViewFieldWhereUniqueInput>>;
}; };
export type ViewFieldViewIdKeyCompoundUniqueInput = {
key: Scalars['String'];
viewId: Scalars['String'];
};
export type ViewFieldWhereInput = { export type ViewFieldWhereInput = {
AND?: InputMaybe<Array<ViewFieldWhereInput>>; AND?: InputMaybe<Array<ViewFieldWhereInput>>;
NOT?: InputMaybe<Array<ViewFieldWhereInput>>; NOT?: InputMaybe<Array<ViewFieldWhereInput>>;
OR?: InputMaybe<Array<ViewFieldWhereInput>>; OR?: InputMaybe<Array<ViewFieldWhereInput>>;
fieldName?: InputMaybe<StringFilter>;
id?: InputMaybe<StringFilter>;
index?: InputMaybe<IntFilter>; index?: InputMaybe<IntFilter>;
isVisible?: InputMaybe<BoolFilter>; isVisible?: InputMaybe<BoolFilter>;
objectName?: InputMaybe<StringFilter>; key?: InputMaybe<StringFilter>;
sizeInPx?: InputMaybe<IntFilter>; name?: InputMaybe<StringFilter>;
objectId?: InputMaybe<StringFilter>;
size?: InputMaybe<IntFilter>;
view?: InputMaybe<ViewRelationFilter>; view?: InputMaybe<ViewRelationFilter>;
viewId?: InputMaybe<StringNullableFilter>; viewId?: InputMaybe<StringFilter>;
}; };
export type ViewFieldWhereUniqueInput = { export type ViewFieldWhereUniqueInput = {
id?: InputMaybe<Scalars['String']>; viewId_key?: InputMaybe<ViewFieldViewIdKeyCompoundUniqueInput>;
workspaceId_viewId_objectName_fieldName?: InputMaybe<ViewFieldWorkspaceIdViewIdObjectNameFieldNameCompoundUniqueInput>;
};
export type ViewFieldWorkspaceIdViewIdObjectNameFieldNameCompoundUniqueInput = {
fieldName: Scalars['String'];
objectName: Scalars['String'];
viewId: Scalars['String'];
}; };
export type ViewFilter = { export type ViewFilter = {
@ -2811,6 +2809,10 @@ export type ViewUpdateManyWithoutWorkspaceNestedInput = {
set?: InputMaybe<Array<ViewWhereUniqueInput>>; set?: InputMaybe<Array<ViewWhereUniqueInput>>;
}; };
export type ViewUpdateOneRequiredWithoutFieldsNestedInput = {
connect?: InputMaybe<ViewWhereUniqueInput>;
};
export type ViewUpdateOneRequiredWithoutFiltersNestedInput = { export type ViewUpdateOneRequiredWithoutFiltersNestedInput = {
connect?: InputMaybe<ViewWhereUniqueInput>; connect?: InputMaybe<ViewWhereUniqueInput>;
}; };
@ -2819,11 +2821,6 @@ export type ViewUpdateOneRequiredWithoutSortsNestedInput = {
connect?: InputMaybe<ViewWhereUniqueInput>; connect?: InputMaybe<ViewWhereUniqueInput>;
}; };
export type ViewUpdateOneWithoutFieldsNestedInput = {
connect?: InputMaybe<ViewWhereUniqueInput>;
disconnect?: InputMaybe<Scalars['Boolean']>;
};
export type ViewWhereInput = { export type ViewWhereInput = {
AND?: InputMaybe<Array<ViewWhereInput>>; AND?: InputMaybe<Array<ViewWhereInput>>;
NOT?: InputMaybe<Array<ViewWhereInput>>; NOT?: InputMaybe<Array<ViewWhereInput>>;
@ -3477,7 +3474,7 @@ export type UpdateViewFieldMutationVariables = Exact<{
}>; }>;
export type UpdateViewFieldMutation = { __typename?: 'Mutation', updateOneViewField: { __typename?: 'ViewField', id: string, fieldName: string, isVisible: boolean, sizeInPx: number, index: number } }; export type UpdateViewFieldMutation = { __typename?: 'Mutation', updateOneViewField: { __typename?: 'ViewField', index: number, isVisible: boolean, key: string, name: string, size: number } };
export type UpdateViewFilterMutationVariables = Exact<{ export type UpdateViewFilterMutationVariables = Exact<{
data: ViewFilterUpdateInput; data: ViewFilterUpdateInput;
@ -3501,7 +3498,7 @@ export type GetViewFieldsQueryVariables = Exact<{
}>; }>;
export type GetViewFieldsQuery = { __typename?: 'Query', viewFields: Array<{ __typename?: 'ViewField', id: string, fieldName: string, isVisible: boolean, sizeInPx: number, index: number }> }; export type GetViewFieldsQuery = { __typename?: 'Query', viewFields: Array<{ __typename?: 'ViewField', index: number, isVisible: boolean, key: string, name: string, size: number }> };
export type GetViewFiltersQueryVariables = Exact<{ export type GetViewFiltersQueryVariables = Exact<{
where?: InputMaybe<ViewFilterWhereInput>; where?: InputMaybe<ViewFilterWhereInput>;
@ -6413,11 +6410,11 @@ export type UpdateViewMutationOptions = Apollo.BaseMutationOptions<UpdateViewMut
export const UpdateViewFieldDocument = gql` export const UpdateViewFieldDocument = gql`
mutation UpdateViewField($data: ViewFieldUpdateInput!, $where: ViewFieldWhereUniqueInput!) { mutation UpdateViewField($data: ViewFieldUpdateInput!, $where: ViewFieldWhereUniqueInput!) {
updateOneViewField(data: $data, where: $where) { updateOneViewField(data: $data, where: $where) {
id
fieldName
isVisible
sizeInPx
index index
isVisible
key
name
size
} }
} }
`; `;
@ -6525,11 +6522,11 @@ export type UpdateViewSortMutationOptions = Apollo.BaseMutationOptions<UpdateVie
export const GetViewFieldsDocument = gql` export const GetViewFieldsDocument = gql`
query GetViewFields($where: ViewFieldWhereInput, $orderBy: [ViewFieldOrderByWithRelationInput!]) { query GetViewFields($where: ViewFieldWhereInput, $orderBy: [ViewFieldOrderByWithRelationInput!]) {
viewFields: findManyViewField(where: $where, orderBy: $orderBy) { viewFields: findManyViewField(where: $where, orderBy: $orderBy) {
id
fieldName
isVisible
sizeInPx
index index
isVisible
key
name
size
} }
} }
`; `;

View File

@ -162,11 +162,11 @@ export function CompanyBoardCard() {
<EditableFieldEntityIdContext.Provider value={boardCardId}> <EditableFieldEntityIdContext.Provider value={boardCardId}>
{viewFieldsDefinitions.map((viewField) => { {viewFieldsDefinitions.map((viewField) => {
return ( return (
<PreventSelectOnClickContainer key={viewField.id}> <PreventSelectOnClickContainer key={viewField.key}>
<EditableFieldDefinitionContext.Provider <EditableFieldDefinitionContext.Provider
value={{ value={{
id: viewField.id, key: viewField.key,
label: viewField.label, name: viewField.name,
icon: viewField.icon, icon: viewField.icon,
type: viewField.metadata.type, type: viewField.metadata.type,
metadata: viewField.metadata, metadata: viewField.metadata,

View File

@ -27,11 +27,11 @@ import type { ColumnDefinition } from '@/ui/table/types/ColumnDefinition';
export const companiesAvailableColumnDefinitions: ColumnDefinition<ViewFieldMetadata>[] = export const companiesAvailableColumnDefinitions: ColumnDefinition<ViewFieldMetadata>[] =
[ [
{ {
id: 'name', key: 'name',
label: 'Name', name: 'Name',
icon: <IconBuildingSkyscraper />, icon: <IconBuildingSkyscraper />,
size: 180, size: 180,
order: 1, index: 0,
metadata: { metadata: {
type: 'chip', type: 'chip',
urlFieldName: 'domainName', urlFieldName: 'domainName',
@ -41,11 +41,11 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<ViewFieldMeta
isVisible: true, isVisible: true,
} as ColumnDefinition<ViewFieldChipMetadata>, } as ColumnDefinition<ViewFieldChipMetadata>,
{ {
id: 'domainName', key: 'domainName',
label: 'URL', name: 'URL',
icon: <IconLink />, icon: <IconLink />,
size: 100, size: 100,
order: 2, index: 1,
metadata: { metadata: {
type: 'url', type: 'url',
fieldName: 'domainName', fieldName: 'domainName',
@ -54,11 +54,11 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<ViewFieldMeta
isVisible: true, isVisible: true,
} as ColumnDefinition<ViewFieldURLMetadata>, } as ColumnDefinition<ViewFieldURLMetadata>,
{ {
id: 'accountOwner', key: 'accountOwner',
label: 'Account Owner', name: 'Account Owner',
icon: <IconUserCircle />, icon: <IconUserCircle />,
size: 150, size: 150,
order: 3, index: 2,
metadata: { metadata: {
type: 'relation', type: 'relation',
fieldName: 'accountOwner', fieldName: 'accountOwner',
@ -67,11 +67,11 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<ViewFieldMeta
isVisible: true, isVisible: true,
} satisfies ColumnDefinition<ViewFieldRelationMetadata>, } satisfies ColumnDefinition<ViewFieldRelationMetadata>,
{ {
id: 'createdAt', key: 'createdAt',
label: 'Creation', name: 'Creation',
icon: <IconCalendarEvent />, icon: <IconCalendarEvent />,
size: 150, size: 150,
order: 4, index: 3,
metadata: { metadata: {
type: 'date', type: 'date',
fieldName: 'createdAt', fieldName: 'createdAt',
@ -79,11 +79,11 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<ViewFieldMeta
isVisible: true, isVisible: true,
} satisfies ColumnDefinition<ViewFieldDateMetadata>, } satisfies ColumnDefinition<ViewFieldDateMetadata>,
{ {
id: 'employees', key: 'employees',
label: 'Employees', name: 'Employees',
icon: <IconUsers />, icon: <IconUsers />,
size: 150, size: 150,
order: 5, index: 4,
metadata: { metadata: {
type: 'number', type: 'number',
fieldName: 'employees', fieldName: 'employees',
@ -92,11 +92,11 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<ViewFieldMeta
isVisible: true, isVisible: true,
} satisfies ColumnDefinition<ViewFieldNumberMetadata>, } satisfies ColumnDefinition<ViewFieldNumberMetadata>,
{ {
id: 'linkedin', key: 'linkedin',
label: 'LinkedIn', name: 'LinkedIn',
icon: <IconBrandLinkedin />, icon: <IconBrandLinkedin />,
size: 170, size: 170,
order: 6, index: 5,
metadata: { metadata: {
type: 'url', type: 'url',
fieldName: 'linkedinUrl', fieldName: 'linkedinUrl',
@ -105,11 +105,11 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<ViewFieldMeta
isVisible: true, isVisible: true,
} satisfies ColumnDefinition<ViewFieldURLMetadata>, } satisfies ColumnDefinition<ViewFieldURLMetadata>,
{ {
id: 'address', key: 'address',
label: 'Address', name: 'Address',
icon: <IconMap />, icon: <IconMap />,
size: 170, size: 170,
order: 7, index: 6,
metadata: { metadata: {
type: 'text', type: 'text',
fieldName: 'address', fieldName: 'address',
@ -118,11 +118,11 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<ViewFieldMeta
isVisible: true, isVisible: true,
} satisfies ColumnDefinition<ViewFieldTextMetadata>, } satisfies ColumnDefinition<ViewFieldTextMetadata>,
{ {
id: 'idealCustomerProfile', key: 'idealCustomerProfile',
label: 'ICP', name: 'ICP',
icon: <IconTarget />, icon: <IconTarget />,
size: 150, size: 150,
order: 8, index: 7,
metadata: { metadata: {
type: 'boolean', type: 'boolean',
fieldName: 'idealCustomerProfile', fieldName: 'idealCustomerProfile',
@ -130,22 +130,22 @@ export const companiesAvailableColumnDefinitions: ColumnDefinition<ViewFieldMeta
isVisible: false, isVisible: false,
} satisfies ColumnDefinition<ViewFieldBooleanMetadata>, } satisfies ColumnDefinition<ViewFieldBooleanMetadata>,
{ {
id: 'annualRecurringRevenue', key: 'annualRecurringRevenue',
label: 'ARR', name: 'ARR',
icon: <IconMoneybag />, icon: <IconMoneybag />,
size: 150, size: 150,
order: 8, index: 8,
metadata: { metadata: {
type: 'moneyAmount', type: 'moneyAmount',
fieldName: 'annualRecurringRevenue', fieldName: 'annualRecurringRevenue',
}, },
} satisfies ColumnDefinition<ViewFieldMoneyMetadata>, } satisfies ColumnDefinition<ViewFieldMoneyMetadata>,
{ {
id: 'xUrl', key: 'xUrl',
label: 'Twitter', name: 'Twitter',
icon: <IconBrandX />, icon: <IconBrandX />,
size: 150, size: 150,
order: 8, index: 9,
metadata: { metadata: {
type: 'url', type: 'url',
fieldName: 'xUrl', fieldName: 'xUrl',

View File

@ -25,11 +25,11 @@ import type { ColumnDefinition } from '@/ui/table/types/ColumnDefinition';
export const peopleAvailableColumnDefinitions: ColumnDefinition<ViewFieldMetadata>[] = export const peopleAvailableColumnDefinitions: ColumnDefinition<ViewFieldMetadata>[] =
[ [
{ {
id: 'displayName', key: 'displayName',
label: 'People', name: 'People',
icon: <IconUser />, icon: <IconUser />,
size: 210, size: 210,
order: 1, index: 0,
metadata: { metadata: {
type: 'double-text-chip', type: 'double-text-chip',
firstValueFieldName: 'firstName', firstValueFieldName: 'firstName',
@ -41,11 +41,11 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<ViewFieldMetadat
}, },
} satisfies ColumnDefinition<ViewFieldDoubleTextChipMetadata>, } satisfies ColumnDefinition<ViewFieldDoubleTextChipMetadata>,
{ {
id: 'email', key: 'email',
label: 'Email', name: 'Email',
icon: <IconMail />, icon: <IconMail />,
size: 150, size: 150,
order: 2, index: 1,
metadata: { metadata: {
type: 'email', type: 'email',
fieldName: 'email', fieldName: 'email',
@ -53,11 +53,11 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<ViewFieldMetadat
}, },
} satisfies ColumnDefinition<ViewFieldEmailMetadata>, } satisfies ColumnDefinition<ViewFieldEmailMetadata>,
{ {
id: 'company', key: 'company',
label: 'Company', name: 'Company',
icon: <IconBuildingSkyscraper />, icon: <IconBuildingSkyscraper />,
size: 150, size: 150,
order: 3, index: 2,
metadata: { metadata: {
type: 'relation', type: 'relation',
fieldName: 'company', fieldName: 'company',
@ -65,11 +65,11 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<ViewFieldMetadat
}, },
} satisfies ColumnDefinition<ViewFieldRelationMetadata>, } satisfies ColumnDefinition<ViewFieldRelationMetadata>,
{ {
id: 'phone', key: 'phone',
label: 'Phone', name: 'Phone',
icon: <IconPhone />, icon: <IconPhone />,
size: 150, size: 150,
order: 4, index: 3,
metadata: { metadata: {
type: 'phone', type: 'phone',
fieldName: 'phone', fieldName: 'phone',
@ -77,22 +77,22 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<ViewFieldMetadat
}, },
} satisfies ColumnDefinition<ViewFieldPhoneMetadata>, } satisfies ColumnDefinition<ViewFieldPhoneMetadata>,
{ {
id: 'createdAt', key: 'createdAt',
label: 'Creation', name: 'Creation',
icon: <IconCalendarEvent />, icon: <IconCalendarEvent />,
size: 150, size: 150,
order: 5, index: 4,
metadata: { metadata: {
type: 'date', type: 'date',
fieldName: 'createdAt', fieldName: 'createdAt',
}, },
} satisfies ColumnDefinition<ViewFieldDateMetadata>, } satisfies ColumnDefinition<ViewFieldDateMetadata>,
{ {
id: 'city', key: 'city',
label: 'City', name: 'City',
icon: <IconMap />, icon: <IconMap />,
size: 150, size: 150,
order: 6, index: 5,
metadata: { metadata: {
type: 'text', type: 'text',
fieldName: 'city', fieldName: 'city',
@ -100,11 +100,11 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<ViewFieldMetadat
}, },
} satisfies ColumnDefinition<ViewFieldTextMetadata>, } satisfies ColumnDefinition<ViewFieldTextMetadata>,
{ {
id: 'jobTitle', key: 'jobTitle',
label: 'Job title', name: 'Job title',
icon: <IconBriefcase />, icon: <IconBriefcase />,
size: 150, size: 150,
order: 7, index: 6,
metadata: { metadata: {
type: 'text', type: 'text',
fieldName: 'jobTitle', fieldName: 'jobTitle',
@ -112,11 +112,11 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<ViewFieldMetadat
}, },
} satisfies ColumnDefinition<ViewFieldTextMetadata>, } satisfies ColumnDefinition<ViewFieldTextMetadata>,
{ {
id: 'linkedin', key: 'linkedin',
label: 'LinkedIn', name: 'LinkedIn',
icon: <IconBrandLinkedin />, icon: <IconBrandLinkedin />,
size: 150, size: 150,
order: 8, index: 7,
metadata: { metadata: {
type: 'url', type: 'url',
fieldName: 'linkedinUrl', fieldName: 'linkedinUrl',
@ -124,11 +124,11 @@ export const peopleAvailableColumnDefinitions: ColumnDefinition<ViewFieldMetadat
}, },
} satisfies ColumnDefinition<ViewFieldURLMetadata>, } satisfies ColumnDefinition<ViewFieldURLMetadata>,
{ {
id: 'x', key: 'x',
label: 'Twitter', name: 'Twitter',
icon: <IconBrandX />, icon: <IconBrandX />,
size: 150, size: 150,
order: 9, index: 8,
metadata: { metadata: {
type: 'url', type: 'url',
fieldName: 'xUrl', fieldName: 'xUrl',

View File

@ -17,8 +17,8 @@ import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect';
export const pipelineAvailableFieldDefinitions: ViewFieldDefinition<ViewFieldMetadata>[] = export const pipelineAvailableFieldDefinitions: ViewFieldDefinition<ViewFieldMetadata>[] =
[ [
{ {
id: 'closeDate', key: 'closeDate',
label: 'Close Date', name: 'Close Date',
icon: <IconCalendarEvent />, icon: <IconCalendarEvent />,
metadata: { metadata: {
type: 'date', type: 'date',
@ -27,8 +27,8 @@ export const pipelineAvailableFieldDefinitions: ViewFieldDefinition<ViewFieldMet
isVisible: true, isVisible: true,
} satisfies ViewFieldDefinition<ViewFieldDateMetadata>, } satisfies ViewFieldDefinition<ViewFieldDateMetadata>,
{ {
id: 'amount', key: 'amount',
label: 'Amount', name: 'Amount',
icon: <IconCurrencyDollar />, icon: <IconCurrencyDollar />,
metadata: { metadata: {
type: 'number', type: 'number',
@ -37,8 +37,8 @@ export const pipelineAvailableFieldDefinitions: ViewFieldDefinition<ViewFieldMet
isVisible: true, isVisible: true,
} satisfies ViewFieldDefinition<ViewFieldNumberMetadata>, } satisfies ViewFieldDefinition<ViewFieldNumberMetadata>,
{ {
id: 'probability', key: 'probability',
label: 'Probability', name: 'Probability',
icon: <IconProgressCheck />, icon: <IconProgressCheck />,
metadata: { metadata: {
type: 'probability', type: 'probability',
@ -47,8 +47,8 @@ export const pipelineAvailableFieldDefinitions: ViewFieldDefinition<ViewFieldMet
isVisible: true, isVisible: true,
} satisfies ViewFieldDefinition<ViewFieldProbabilityMetadata>, } satisfies ViewFieldDefinition<ViewFieldProbabilityMetadata>,
{ {
id: 'pointOfContact', key: 'pointOfContact',
label: 'Point of Contact', name: 'Point of Contact',
icon: <IconUser />, icon: <IconUser />,
metadata: { metadata: {
type: 'relation', type: 'relation',

View File

@ -1,8 +1,8 @@
import { FieldMetadata, FieldType } from './FieldMetadata'; import { FieldMetadata, FieldType } from './FieldMetadata';
export type FieldDefinition<T extends FieldMetadata | unknown> = { export type FieldDefinition<T extends FieldMetadata | unknown> = {
id: string; key: string;
label: string; name: string;
icon?: JSX.Element; icon?: JSX.Element;
type: FieldType; type: FieldType;
metadata: T; metadata: T;

View File

@ -116,8 +116,8 @@ export type ViewFieldMetadata = { type: ViewFieldType } & (
); );
export type ViewFieldDefinition<T extends ViewFieldMetadata | unknown> = { export type ViewFieldDefinition<T extends ViewFieldMetadata | unknown> = {
id: string; key: string;
label: string; name: string;
icon?: JSX.Element; icon?: JSX.Element;
isVisible?: boolean; isVisible?: boolean;
metadata: T; metadata: T;

View File

@ -58,10 +58,10 @@ export const EntityTableColumnMenu = ({
<StyledDropdownMenuItemsContainer> <StyledDropdownMenuItemsContainer>
{hiddenColumns.map((column) => ( {hiddenColumns.map((column) => (
<DropdownMenuItem <DropdownMenuItem
key={column.id} key={column.key}
actions={[ actions={[
<IconButton <IconButton
key={`add-${column.id}`} key={`add-${column.key}`}
icon={<IconPlus size={theme.icon.size.sm} />} icon={<IconPlus size={theme.icon.size.sm} />}
onClick={() => handleAddColumn(column)} onClick={() => handleAddColumn(column)}
/>, />,
@ -71,7 +71,7 @@ export const EntityTableColumnMenu = ({
cloneElement(column.icon, { cloneElement(column.icon, {
size: theme.icon.size.md, size: theme.icon.size.md,
})} })}
{column.label} {column.name}
</DropdownMenuItem> </DropdownMenuItem>
))} ))}
</StyledDropdownMenuItemsContainer> </StyledDropdownMenuItemsContainer>

View File

@ -11,7 +11,7 @@ import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoi
import { TableRecoilScopeContext } from '../states/recoil-scope-contexts/TableRecoilScopeContext'; import { TableRecoilScopeContext } from '../states/recoil-scope-contexts/TableRecoilScopeContext';
import { resizeFieldOffsetState } from '../states/resizeFieldOffsetState'; import { resizeFieldOffsetState } from '../states/resizeFieldOffsetState';
import { hiddenTableColumnsScopedSelector } from '../states/selectors/hiddenTableColumnsScopedSelector'; import { hiddenTableColumnsScopedSelector } from '../states/selectors/hiddenTableColumnsScopedSelector';
import { tableColumnsByIdScopedSelector } from '../states/selectors/tableColumnsByIdScopedSelector'; import { tableColumnsByKeyScopedSelector } from '../states/selectors/tableColumnsByKeyScopedSelector';
import { visibleTableColumnsScopedSelector } from '../states/selectors/visibleTableColumnsScopedSelector'; import { visibleTableColumnsScopedSelector } from '../states/selectors/visibleTableColumnsScopedSelector';
import { tableColumnsScopedState } from '../states/tableColumnsScopedState'; import { tableColumnsScopedState } from '../states/tableColumnsScopedState';
@ -76,8 +76,8 @@ export function EntityTableHeader() {
tableColumnsScopedState, tableColumnsScopedState,
TableRecoilScopeContext, TableRecoilScopeContext,
); );
const columnsById = useRecoilScopedValue( const columnsByKey = useRecoilScopedValue(
tableColumnsByIdScopedSelector, tableColumnsByKeyScopedSelector,
TableRecoilScopeContext, TableRecoilScopeContext,
); );
const hiddenColumns = useRecoilScopedValue( const hiddenColumns = useRecoilScopedValue(
@ -92,7 +92,7 @@ export function EntityTableHeader() {
const [initialPointerPositionX, setInitialPointerPositionX] = useState< const [initialPointerPositionX, setInitialPointerPositionX] = useState<
number | null number | null
>(null); >(null);
const [resizedFieldId, setResizedFieldId] = useState<string | null>(null); const [resizedFieldKey, setResizedFieldKey] = useState<string | null>(null);
const [isColumnMenuOpen, setIsColumnMenuOpen] = useState(false); const [isColumnMenuOpen, setIsColumnMenuOpen] = useState(false);
const handleResizeHandlerStart = useCallback((positionX: number) => { const handleResizeHandlerStart = useCallback((positionX: number) => {
@ -110,19 +110,19 @@ export function EntityTableHeader() {
const handleResizeHandlerEnd = useRecoilCallback( const handleResizeHandlerEnd = useRecoilCallback(
({ snapshot, set }) => ({ snapshot, set }) =>
() => { () => {
if (!resizedFieldId) return; if (!resizedFieldKey) return;
const nextWidth = Math.round( const nextWidth = Math.round(
Math.max( Math.max(
columnsById[resizedFieldId].size + columnsByKey[resizedFieldKey].size +
snapshot.getLoadable(resizeFieldOffsetState).valueOrThrow(), snapshot.getLoadable(resizeFieldOffsetState).valueOrThrow(),
COLUMN_MIN_WIDTH, COLUMN_MIN_WIDTH,
), ),
); );
if (nextWidth !== columnsById[resizedFieldId].size) { if (nextWidth !== columnsByKey[resizedFieldKey].size) {
const nextColumns = columns.map((column) => const nextColumns = columns.map((column) =>
column.id === resizedFieldId column.key === resizedFieldKey
? { ...column, size: nextWidth } ? { ...column, size: nextWidth }
: column, : column,
); );
@ -132,13 +132,13 @@ export function EntityTableHeader() {
set(resizeFieldOffsetState, 0); set(resizeFieldOffsetState, 0);
setInitialPointerPositionX(null); setInitialPointerPositionX(null);
setResizedFieldId(null); setResizedFieldKey(null);
}, },
[resizedFieldId, columnsById, columns, setColumns], [resizedFieldKey, columnsByKey, columns, setColumns],
); );
useTrackPointer({ useTrackPointer({
shouldTrackPointer: resizedFieldId !== null, shouldTrackPointer: resizedFieldKey !== null,
onMouseDown: handleResizeHandlerStart, onMouseDown: handleResizeHandlerStart,
onMouseMove: handleResizeHandlerMove, onMouseMove: handleResizeHandlerMove,
onMouseUp: handleResizeHandlerEnd, onMouseUp: handleResizeHandlerEnd,
@ -163,20 +163,20 @@ export function EntityTableHeader() {
{visibleColumns.map((column) => ( {visibleColumns.map((column) => (
<StyledColumnHeaderCell <StyledColumnHeaderCell
key={column.id} key={column.key}
isResizing={resizedFieldId === column.id} isResizing={resizedFieldKey === column.key}
columnWidth={Math.max( columnWidth={Math.max(
columnsById[column.id].size + columnsByKey[column.key].size +
(resizedFieldId === column.id ? offset : 0), (resizedFieldKey === column.key ? offset : 0),
COLUMN_MIN_WIDTH, COLUMN_MIN_WIDTH,
)} )}
> >
<ColumnHead viewName={column.label} viewIcon={column.icon} /> <ColumnHead viewName={column.name} viewIcon={column.icon} />
<StyledResizeHandler <StyledResizeHandler
className="cursor-col-resize" className="cursor-col-resize"
role="separator" role="separator"
onPointerDown={() => { onPointerDown={() => {
setResizedFieldId(column.id); setResizedFieldKey(column.key);
}} }}
/> />
</StyledColumnHeaderCell> </StyledColumnHeaderCell>

View File

@ -33,7 +33,7 @@ export function EntityTableRow({ rowId }: { rowId: string }) {
</td> </td>
{columns.map((column, columnIndex) => { {columns.map((column, columnIndex) => {
return ( return (
<ColumnContext.Provider value={column} key={column.id}> <ColumnContext.Provider value={column} key={column.key}>
<EntityTableCell cellIndex={columnIndex} /> <EntityTableCell cellIndex={columnIndex} />
</ColumnContext.Provider> </ColumnContext.Provider>
); );

View File

@ -5,7 +5,7 @@ import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoi
import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedValue'; import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedValue';
import { TableRecoilScopeContext } from '../states/recoil-scope-contexts/TableRecoilScopeContext'; import { TableRecoilScopeContext } from '../states/recoil-scope-contexts/TableRecoilScopeContext';
import { tableColumnsByIdScopedSelector } from '../states/selectors/tableColumnsByIdScopedSelector'; import { tableColumnsByKeyScopedSelector } from '../states/selectors/tableColumnsByKeyScopedSelector';
import { tableColumnsScopedState } from '../states/tableColumnsScopedState'; import { tableColumnsScopedState } from '../states/tableColumnsScopedState';
import type { ColumnDefinition } from '../types/ColumnDefinition'; import type { ColumnDefinition } from '../types/ColumnDefinition';
@ -14,26 +14,26 @@ export const useTableColumns = () => {
tableColumnsScopedState, tableColumnsScopedState,
TableRecoilScopeContext, TableRecoilScopeContext,
); );
const tableColumnsById = useRecoilScopedValue( const tableColumnsByKey = useRecoilScopedValue(
tableColumnsByIdScopedSelector, tableColumnsByKeyScopedSelector,
TableRecoilScopeContext, TableRecoilScopeContext,
); );
const handleColumnVisibilityChange = useCallback( const handleColumnVisibilityChange = useCallback(
(column: ColumnDefinition<ViewFieldMetadata>) => { (column: ColumnDefinition<ViewFieldMetadata>) => {
const nextColumns = tableColumnsById[column.id] const nextColumns = tableColumnsByKey[column.key]
? tableColumns.map((previousColumn) => ? tableColumns.map((previousColumn) =>
previousColumn.id === column.id previousColumn.key === column.key
? { ...previousColumn, isVisible: !column.isVisible } ? { ...previousColumn, isVisible: !column.isVisible }
: previousColumn, : previousColumn,
) )
: [...tableColumns, { ...column, isVisible: true }].sort( : [...tableColumns, { ...column, isVisible: true }].sort(
(columnA, columnB) => columnA.order - columnB.order, (columnA, columnB) => columnA.index - columnB.index,
); );
setTableColumns(nextColumns); setTableColumns(nextColumns);
}, },
[setTableColumns, tableColumns, tableColumnsById], [setTableColumns, tableColumns, tableColumnsByKey],
); );
return { handleColumnVisibilityChange }; return { handleColumnVisibilityChange };

View File

@ -95,7 +95,7 @@ export function TableOptionsDropdownContent({
!column.isVisible || visibleColumns.length > 1 !column.isVisible || visibleColumns.length > 1
? [ ? [
<IconButton <IconButton
key={`action-${column.id}`} key={`action-${column.key}`}
icon={ icon={
column.isVisible ? ( column.isVisible ? (
<IconMinus size={theme.icon.size.sm} /> <IconMinus size={theme.icon.size.sm} />

View File

@ -31,12 +31,12 @@ export function TableOptionsDropdownSection({
<StyledDropdownMenuSubheader>{title}</StyledDropdownMenuSubheader> <StyledDropdownMenuSubheader>{title}</StyledDropdownMenuSubheader>
<StyledDropdownMenuItemsContainer> <StyledDropdownMenuItemsContainer>
{columns.map((column) => ( {columns.map((column) => (
<DropdownMenuItem key={column.id} actions={renderActions(column)}> <DropdownMenuItem key={column.key} actions={renderActions(column)}>
{column.icon && {column.icon &&
cloneElement(column.icon, { cloneElement(column.icon, {
size: theme.icon.size.md, size: theme.icon.size.md,
})} })}
{column.label} {column.name}
</DropdownMenuItem> </DropdownMenuItem>
))} ))}
</StyledDropdownMenuItemsContainer> </StyledDropdownMenuItemsContainer>

View File

@ -9,10 +9,10 @@ export const hiddenTableColumnsScopedSelector = selectorFamily({
(scopeId: string) => (scopeId: string) =>
({ get }) => { ({ get }) => {
const columns = get(tableColumnsScopedState(scopeId)); const columns = get(tableColumnsScopedState(scopeId));
const columnLabels = columns.map(({ label }) => label); const columnKeys = columns.map(({ key }) => key);
const otherAvailableColumns = get( const otherAvailableColumns = get(
availableTableColumnsScopedState(scopeId), availableTableColumnsScopedState(scopeId),
).filter(({ label }) => !columnLabels.includes(label)); ).filter(({ key }) => !columnKeys.includes(key));
return [ return [
...columns.filter((column) => !column.isVisible), ...columns.filter((column) => !column.isVisible),

View File

@ -5,12 +5,12 @@ import type { ViewFieldMetadata } from '@/ui/editable-field/types/ViewField';
import type { ColumnDefinition } from '../../types/ColumnDefinition'; import type { ColumnDefinition } from '../../types/ColumnDefinition';
import { savedTableColumnsScopedState } from '../savedTableColumnsScopedState'; import { savedTableColumnsScopedState } from '../savedTableColumnsScopedState';
export const savedTableColumnsByIdScopedSelector = selectorFamily({ export const savedTableColumnsByKeyScopedSelector = selectorFamily({
key: 'savedTableColumnsByIdScopedSelector', key: 'savedTableColumnsByKeyScopedSelector',
get: get:
(viewId: string | undefined) => (viewId: string | undefined) =>
({ get }) => ({ get }) =>
get(savedTableColumnsScopedState(viewId)).reduce< get(savedTableColumnsScopedState(viewId)).reduce<
Record<string, ColumnDefinition<ViewFieldMetadata>> Record<string, ColumnDefinition<ViewFieldMetadata>>
>((result, column) => ({ ...result, [column.id]: column }), {}), >((result, column) => ({ ...result, [column.key]: column }), {}),
}); });

View File

@ -5,12 +5,12 @@ import type { ViewFieldMetadata } from '@/ui/editable-field/types/ViewField';
import type { ColumnDefinition } from '../../types/ColumnDefinition'; import type { ColumnDefinition } from '../../types/ColumnDefinition';
import { tableColumnsScopedState } from '../tableColumnsScopedState'; import { tableColumnsScopedState } from '../tableColumnsScopedState';
export const tableColumnsByIdScopedSelector = selectorFamily({ export const tableColumnsByKeyScopedSelector = selectorFamily({
key: 'tableColumnsByIdScopedSelector', key: 'tableColumnsByKeyScopedSelector',
get: get:
(scopeId: string) => (scopeId: string) =>
({ get }) => ({ get }) =>
get(tableColumnsScopedState(scopeId)).reduce< get(tableColumnsScopedState(scopeId)).reduce<
Record<string, ColumnDefinition<ViewFieldMetadata>> Record<string, ColumnDefinition<ViewFieldMetadata>>
>((result, column) => ({ ...result, [column.id]: column }), {}), >((result, column) => ({ ...result, [column.key]: column }), {}),
}); });

View File

@ -6,5 +6,5 @@ import type {
export type ColumnDefinition<T extends ViewFieldMetadata | unknown> = export type ColumnDefinition<T extends ViewFieldMetadata | unknown> =
ViewFieldDefinition<T> & { ViewFieldDefinition<T> & {
size: number; size: number;
order: number; index: number;
}; };

View File

@ -6,11 +6,11 @@ export const UPDATE_VIEW_FIELD = gql`
$where: ViewFieldWhereUniqueInput! $where: ViewFieldWhereUniqueInput!
) { ) {
updateOneViewField(data: $data, where: $where) { updateOneViewField(data: $data, where: $where) {
id
fieldName
isVisible
sizeInPx
index index
isVisible
key
name
size
} }
} }
`; `;

View File

@ -6,11 +6,11 @@ export const GET_VIEW_FIELDS = gql`
$orderBy: [ViewFieldOrderByWithRelationInput!] $orderBy: [ViewFieldOrderByWithRelationInput!]
) { ) {
viewFields: findManyViewField(where: $where, orderBy: $orderBy) { viewFields: findManyViewField(where: $where, orderBy: $orderBy) {
id
fieldName
isVisible
sizeInPx
index index
isVisible
key
name
size
} }
} }
`; `;

View File

@ -8,7 +8,7 @@ import type {
import { availableTableColumnsScopedState } from '@/ui/table/states/availableTableColumnsScopedState'; import { availableTableColumnsScopedState } from '@/ui/table/states/availableTableColumnsScopedState';
import { TableRecoilScopeContext } from '@/ui/table/states/recoil-scope-contexts/TableRecoilScopeContext'; import { TableRecoilScopeContext } from '@/ui/table/states/recoil-scope-contexts/TableRecoilScopeContext';
import { savedTableColumnsScopedState } from '@/ui/table/states/savedTableColumnsScopedState'; import { savedTableColumnsScopedState } from '@/ui/table/states/savedTableColumnsScopedState';
import { savedTableColumnsByIdScopedSelector } from '@/ui/table/states/selectors/savedTableColumnsByIdScopedSelector'; import { savedTableColumnsByKeyScopedSelector } from '@/ui/table/states/selectors/savedTableColumnsByKeyScopedSelector';
import { tableColumnsScopedState } from '@/ui/table/states/tableColumnsScopedState'; import { tableColumnsScopedState } from '@/ui/table/states/tableColumnsScopedState';
import { currentTableViewIdState } from '@/ui/table/states/tableViewsState'; import { currentTableViewIdState } from '@/ui/table/states/tableViewsState';
import type { ColumnDefinition } from '@/ui/table/types/ColumnDefinition'; import type { ColumnDefinition } from '@/ui/table/types/ColumnDefinition';
@ -29,21 +29,22 @@ const DEFAULT_VIEW_FIELD_METADATA: ViewFieldTextMetadata = {
}; };
const toViewFieldInput = ( const toViewFieldInput = (
objectName: 'company' | 'person', objectId: 'company' | 'person',
fieldDefinition: ColumnDefinition<ViewFieldMetadata>, fieldDefinition: ColumnDefinition<ViewFieldMetadata>,
) => ({ ) => ({
fieldName: fieldDefinition.label, key: fieldDefinition.key,
index: fieldDefinition.order, name: fieldDefinition.name,
index: fieldDefinition.index,
isVisible: fieldDefinition.isVisible ?? true, isVisible: fieldDefinition.isVisible ?? true,
objectName, objectId,
sizeInPx: fieldDefinition.size, size: fieldDefinition.size,
}); });
export const useTableViewFields = ({ export const useTableViewFields = ({
objectName, objectId,
columnDefinitions, columnDefinitions,
}: { }: {
objectName: 'company' | 'person'; objectId: 'company' | 'person';
columnDefinitions: ColumnDefinition<ViewFieldMetadata>[]; columnDefinitions: ColumnDefinition<ViewFieldMetadata>[];
}) => { }) => {
const currentTableViewId = useRecoilScopedValue( const currentTableViewId = useRecoilScopedValue(
@ -62,8 +63,8 @@ export const useTableViewFields = ({
const setSavedTableColumns = useSetRecoilState( const setSavedTableColumns = useSetRecoilState(
savedTableColumnsScopedState(currentTableViewId), savedTableColumnsScopedState(currentTableViewId),
); );
const savedTableColumnsById = useRecoilValue( const savedTableColumnsByKey = useRecoilValue(
savedTableColumnsByIdScopedSelector(currentTableViewId), savedTableColumnsByKeyScopedSelector(currentTableViewId),
); );
const [createViewFieldsMutation] = useCreateViewFieldsMutation(); const [createViewFieldsMutation] = useCreateViewFieldsMutation();
@ -79,13 +80,13 @@ export const useTableViewFields = ({
return createViewFieldsMutation({ return createViewFieldsMutation({
variables: { variables: {
data: columns.map((column) => ({ data: columns.map((column) => ({
...toViewFieldInput(objectName, column), ...toViewFieldInput(objectId, column),
viewId, viewId,
})), })),
}, },
}); });
}, },
[createViewFieldsMutation, currentTableViewId, objectName], [createViewFieldsMutation, currentTableViewId, objectId],
); );
const updateViewFields = useCallback( const updateViewFields = useCallback(
@ -98,9 +99,11 @@ export const useTableViewFields = ({
variables: { variables: {
data: { data: {
isVisible: column.isVisible, isVisible: column.isVisible,
sizeInPx: column.size, size: column.size,
},
where: {
viewId_key: { key: column.key, viewId: currentTableViewId },
}, },
where: { id: column.id },
}, },
}), }),
), ),
@ -114,8 +117,8 @@ export const useTableViewFields = ({
variables: { variables: {
orderBy: { index: SortOrder.Asc }, orderBy: { index: SortOrder.Asc },
where: { where: {
objectName: { equals: objectName }, objectId: { equals: objectId },
viewId: { equals: currentTableViewId ?? null }, viewId: { equals: currentTableViewId },
}, },
}, },
onCompleted: async (data) => { onCompleted: async (data) => {
@ -128,13 +131,13 @@ export const useTableViewFields = ({
const nextColumns = data.viewFields.map< const nextColumns = data.viewFields.map<
ColumnDefinition<ViewFieldMetadata> ColumnDefinition<ViewFieldMetadata>
>((viewField) => ({ >((viewField) => ({
...(columnDefinitions.find( ...(columnDefinitions.find(({ key }) => viewField.key === key) || {
({ label: columnLabel }) => viewField.fieldName === columnLabel, metadata: DEFAULT_VIEW_FIELD_METADATA,
) || { metadata: DEFAULT_VIEW_FIELD_METADATA }), }),
id: viewField.id, key: viewField.key,
label: viewField.fieldName, name: viewField.name,
order: viewField.index, index: viewField.index,
size: viewField.sizeInPx, size: viewField.size,
isVisible: viewField.isVisible, isVisible: viewField.isVisible,
})); }));
@ -153,15 +156,15 @@ export const useTableViewFields = ({
if (!currentTableViewId) return; if (!currentTableViewId) return;
const viewFieldsToCreate = tableColumns.filter( const viewFieldsToCreate = tableColumns.filter(
(column) => !savedTableColumnsById[column.id], (column) => !savedTableColumnsByKey[column.key],
); );
await createViewFields(viewFieldsToCreate); await createViewFields(viewFieldsToCreate);
const viewFieldsToUpdate = tableColumns.filter( const viewFieldsToUpdate = tableColumns.filter(
(column) => (column) =>
savedTableColumnsById[column.id] && savedTableColumnsByKey[column.key] &&
(savedTableColumnsById[column.id].size !== column.size || (savedTableColumnsByKey[column.key].size !== column.size ||
savedTableColumnsById[column.id].isVisible !== column.isVisible), savedTableColumnsByKey[column.key].isVisible !== column.isVisible),
); );
await updateViewFields(viewFieldsToUpdate); await updateViewFields(viewFieldsToUpdate);
@ -170,7 +173,7 @@ export const useTableViewFields = ({
createViewFields, createViewFields,
currentTableViewId, currentTableViewId,
refetch, refetch,
savedTableColumnsById, savedTableColumnsByKey,
tableColumns, tableColumns,
updateViewFields, updateViewFields,
]); ]);

View File

@ -45,7 +45,7 @@ export const useTableViews = <Entity, SortField>({
); );
const { createViewFields, persistColumns } = useTableViewFields({ const { createViewFields, persistColumns } = useTableViewFields({
objectName: objectId, objectId,
columnDefinitions, columnDefinitions,
}); });
const { createViewFilters, persistFilters } = useViewFilters({ const { createViewFilters, persistFilters } = useViewFilters({

View File

@ -95,7 +95,7 @@ export function CompanyShow() {
return ( return (
<EditableFieldDefinitionContext.Provider <EditableFieldDefinitionContext.Provider
value={fieldDefinition} value={fieldDefinition}
key={fieldDefinition.id} key={fieldDefinition.key}
> >
<GenericEditableField /> <GenericEditableField />
</EditableFieldDefinitionContext.Provider> </EditableFieldDefinitionContext.Provider>

View File

@ -21,8 +21,8 @@ import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect';
export const companyShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [ export const companyShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
{ {
id: 'domainName', key: 'domainName',
label: 'Domain name', name: 'Domain name',
icon: <IconLink />, icon: <IconLink />,
type: 'url', type: 'url',
metadata: { metadata: {
@ -31,8 +31,8 @@ export const companyShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldURLMetadata>, } satisfies FieldDefinition<FieldURLMetadata>,
{ {
id: 'accountOwner', key: 'accountOwner',
label: 'Account owner', name: 'Account owner',
icon: <IconUserCircle />, icon: <IconUserCircle />,
type: 'relation', type: 'relation',
metadata: { metadata: {
@ -41,8 +41,8 @@ export const companyShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldRelationMetadata>, } satisfies FieldDefinition<FieldRelationMetadata>,
{ {
id: 'employees', key: 'employees',
label: 'Employees', name: 'Employees',
icon: <IconUsers />, icon: <IconUsers />,
type: 'number', type: 'number',
metadata: { metadata: {
@ -51,8 +51,8 @@ export const companyShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldNumberMetadata>, } satisfies FieldDefinition<FieldNumberMetadata>,
{ {
id: 'address', key: 'address',
label: 'Address', name: 'Address',
icon: <IconMap />, icon: <IconMap />,
type: 'text', type: 'text',
metadata: { metadata: {
@ -61,8 +61,8 @@ export const companyShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldTextMetadata>, } satisfies FieldDefinition<FieldTextMetadata>,
{ {
id: 'createdAt', key: 'createdAt',
label: 'Created at', name: 'Created at',
icon: <IconCalendar />, icon: <IconCalendar />,
type: 'date', type: 'date',
metadata: { metadata: {
@ -70,8 +70,8 @@ export const companyShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldDateMetadata>, } satisfies FieldDefinition<FieldDateMetadata>,
{ {
id: 'idealCustomerProfile', key: 'idealCustomerProfile',
label: 'ICP', name: 'ICP',
icon: <IconTarget />, icon: <IconTarget />,
type: 'boolean', type: 'boolean',
metadata: { metadata: {
@ -79,8 +79,8 @@ export const companyShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldBooleanMetadata>, } satisfies FieldDefinition<FieldBooleanMetadata>,
{ {
id: 'xUrl', key: 'xUrl',
label: 'Twitter', name: 'Twitter',
icon: <IconBrandX />, icon: <IconBrandX />,
type: 'url', type: 'url',
metadata: { metadata: {

View File

@ -116,7 +116,7 @@ export function PersonShow() {
return ( return (
<EditableFieldDefinitionContext.Provider <EditableFieldDefinitionContext.Provider
value={fieldDefinition} value={fieldDefinition}
key={fieldDefinition.id} key={fieldDefinition.key}
> >
<GenericEditableField /> <GenericEditableField />
</EditableFieldDefinitionContext.Provider> </EditableFieldDefinitionContext.Provider>

View File

@ -21,8 +21,8 @@ import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect';
export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
{ {
id: 'email', key: 'email',
label: 'Email', name: 'Email',
icon: <IconMail />, icon: <IconMail />,
type: 'text', type: 'text',
metadata: { metadata: {
@ -31,8 +31,8 @@ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldTextMetadata>, } satisfies FieldDefinition<FieldTextMetadata>,
{ {
id: 'company', key: 'company',
label: 'Company', name: 'Company',
icon: <IconBuildingSkyscraper />, icon: <IconBuildingSkyscraper />,
type: 'relation', type: 'relation',
metadata: { metadata: {
@ -42,8 +42,8 @@ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldRelationMetadata>, } satisfies FieldDefinition<FieldRelationMetadata>,
{ {
id: 'phone', key: 'phone',
label: 'Phone', name: 'Phone',
icon: <IconPhone />, icon: <IconPhone />,
type: 'phone', type: 'phone',
metadata: { metadata: {
@ -52,8 +52,8 @@ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldPhoneMetadata>, } satisfies FieldDefinition<FieldPhoneMetadata>,
{ {
id: 'createdAt', key: 'createdAt',
label: 'Created at', name: 'Created at',
icon: <IconCalendar />, icon: <IconCalendar />,
type: 'date', type: 'date',
metadata: { metadata: {
@ -61,8 +61,8 @@ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldDateMetadata>, } satisfies FieldDefinition<FieldDateMetadata>,
{ {
id: 'city', key: 'city',
label: 'City', name: 'City',
icon: <IconMap />, icon: <IconMap />,
type: 'text', type: 'text',
metadata: { metadata: {
@ -71,8 +71,8 @@ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldTextMetadata>, } satisfies FieldDefinition<FieldTextMetadata>,
{ {
id: 'jobTitle', key: 'jobTitle',
label: 'Job Title', name: 'Job Title',
icon: <IconBriefcase />, icon: <IconBriefcase />,
type: 'text', type: 'text',
metadata: { metadata: {
@ -81,8 +81,8 @@ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldTextMetadata>, } satisfies FieldDefinition<FieldTextMetadata>,
{ {
id: 'linkedinUrl', key: 'linkedinUrl',
label: 'Linkedin URL', name: 'Linkedin URL',
icon: <IconBrandLinkedin />, icon: <IconBrandLinkedin />,
type: 'url', type: 'url',
metadata: { metadata: {
@ -91,8 +91,8 @@ export const personShowFieldDefinition: FieldDefinition<FieldMetadata>[] = [
}, },
} satisfies FieldDefinition<FieldURLMetadata>, } satisfies FieldDefinition<FieldURLMetadata>,
{ {
id: 'xUrl', key: 'xUrl',
label: 'X URL', name: 'X URL',
icon: <IconBrandX />, icon: <IconBrandX />,
type: 'url', type: 'url',
metadata: { metadata: {

View File

@ -32,12 +32,16 @@ import { mockedActivities, mockedTasks } from './mock-data/activities';
import { import {
mockedCompaniesData, mockedCompaniesData,
mockedCompanyViewFields, mockedCompanyViewFields,
mockedCompanyViews,
} from './mock-data/companies'; } from './mock-data/companies';
import { mockedPeopleData, mockedPersonViewFields } from './mock-data/people'; import {
mockedPeopleData,
mockedPersonViewFields,
mockedPersonViews,
} from './mock-data/people';
import { mockedPipelineProgressData } from './mock-data/pipeline-progress'; import { mockedPipelineProgressData } from './mock-data/pipeline-progress';
import { mockedPipelinesData } from './mock-data/pipelines'; import { mockedPipelinesData } from './mock-data/pipelines';
import { mockedUsersData } from './mock-data/users'; import { mockedUsersData } from './mock-data/users';
import { mockedViews } from './mock-data/views';
import { import {
fetchOneFromData, fetchOneFromData,
filterAndSortData, filterAndSortData,
@ -229,17 +233,30 @@ export const graphqlMocks = [
}), }),
); );
}), }),
graphql.query(getOperationName(GET_VIEWS) ?? '', (req, res, ctx) => {
const {
where: {
objectId: { equals: objectId },
},
} = req.variables;
return res(
ctx.data({
views: objectId === 'company' ? mockedCompanyViews : mockedPersonViews,
}),
);
}),
graphql.query(getOperationName(GET_VIEW_FIELDS) ?? '', (req, res, ctx) => { graphql.query(getOperationName(GET_VIEW_FIELDS) ?? '', (req, res, ctx) => {
const { const {
where: { where: {
objectName: { equals: objectName }, objectId: { equals: objectId },
}, },
} = req.variables; } = req.variables;
return res( return res(
ctx.data({ ctx.data({
viewFields: viewFields:
objectName === 'company' objectId === 'company'
? mockedCompanyViewFields ? mockedCompanyViewFields
: mockedPersonViewFields, : mockedPersonViewFields,
}), }),
@ -255,11 +272,4 @@ export const graphqlMocks = [
); );
}, },
), ),
graphql.query(getOperationName(GET_VIEWS) ?? '', (req, res, ctx) => {
return res(
ctx.data({
views: mockedViews,
}),
);
}),
]; ];

View File

@ -1,5 +1,5 @@
import { companiesAvailableColumnDefinitions } from '@/companies/constants/companiesAvailableColumnDefinitions'; import { companiesAvailableColumnDefinitions } from '@/companies/constants/companiesAvailableColumnDefinitions';
import { Company, User, ViewField } from '~/generated/graphql'; import { Company, User, View, ViewField, ViewType } from '~/generated/graphql';
type MockedCompany = Pick< type MockedCompany = Pick<
Company, Company,
@ -144,13 +144,25 @@ export const mockedCompaniesData: Array<MockedCompany> = [
}, },
]; ];
export const mockedCompanyViewFields = export const mockedCompanyViews: View[] = [
companiesAvailableColumnDefinitions.map<ViewField>((viewFieldDefinition) => ({ {
__typename: 'ViewField', __typename: 'View',
fieldName: viewFieldDefinition.label, id: 'e6a2232d-ca6c-42df-b78e-ca0343f545a9',
id: viewFieldDefinition.id, name: 'All companies',
index: viewFieldDefinition.order, objectId: 'company',
isVisible: true, type: ViewType.Table,
objectName: 'company', },
sizeInPx: viewFieldDefinition.size, ];
}));
export const mockedCompanyViewFields = companiesAvailableColumnDefinitions.map<
Omit<ViewField, 'view'>
>((viewFieldDefinition) => ({
__typename: 'ViewField',
name: viewFieldDefinition.name,
index: viewFieldDefinition.index,
isVisible: true,
key: viewFieldDefinition.key,
objectId: 'company',
size: viewFieldDefinition.size,
viewId: 'e6a2232d-ca6c-42df-b78e-ca0343f545a9',
}));

View File

@ -1,5 +1,11 @@
import { peopleAvailableColumnDefinitions } from '@/people/constants/peopleAvailableColumnDefinitions'; import { peopleAvailableColumnDefinitions } from '@/people/constants/peopleAvailableColumnDefinitions';
import { Company, Person, ViewField } from '~/generated/graphql'; import {
Company,
Person,
View,
ViewField,
ViewType,
} from '~/generated/graphql';
type RequiredAndNotNull<T> = { type RequiredAndNotNull<T> = {
[P in keyof T]-?: Exclude<T[P], null | undefined>; [P in keyof T]-?: Exclude<T[P], null | undefined>;
@ -123,13 +129,32 @@ export const mockedPeopleData: MockedPerson[] = [
}, },
]; ];
export const mockedPersonViewFields = export const mockedPersonViews: View[] = [
peopleAvailableColumnDefinitions.map<ViewField>((viewFieldDefinition) => ({ {
__typename: 'ViewField', __typename: 'View',
fieldName: viewFieldDefinition.label, id: 'afd7737a-bf1d-41a3-8863-c277b56a657b',
id: viewFieldDefinition.id, name: 'All people',
index: viewFieldDefinition.order, objectId: 'person',
isVisible: true, type: ViewType.Table,
objectName: 'person', },
sizeInPx: viewFieldDefinition.size, {
})); __typename: 'View',
id: '89bb825c-171e-4bcc-9cf7-43448d6fb230a',
name: 'View example 1',
objectId: 'person',
type: ViewType.Table,
},
];
export const mockedPersonViewFields = peopleAvailableColumnDefinitions.map<
Omit<ViewField, 'view'>
>((viewFieldDefinition) => ({
__typename: 'ViewField',
name: viewFieldDefinition.name,
index: viewFieldDefinition.index,
isVisible: true,
key: viewFieldDefinition.key,
objectId: 'person',
size: viewFieldDefinition.size,
viewId: 'afd7737a-bf1d-41a3-8863-c277b56a657b',
}));

View File

@ -1,14 +0,0 @@
import { View } from '~/generated/graphql';
type MockedView = Pick<View, 'id' | 'name'>;
export const mockedViews: Array<MockedView> = [
{
id: '89bb825c-171e-4bcc-9cf7-43448d6fb230a',
name: 'All',
},
{
id: '89bb825c-171e-4bcc-9cf7-43448d6fb230a',
name: 'View example 1',
},
];

View File

@ -5,54 +5,44 @@
"type": "Table", "type": "Table",
"fields": [ "fields": [
{ {
"fieldName": "Name", "key": "name",
"sizeInPx": 180, "name": "Name",
"isVisible": true "size": 180
}, },
{ {
"fieldName": "URL", "key": "domainName",
"sizeInPx": 100, "name": "URL",
"isVisible": true "size": 100
}, },
{ {
"fieldName": "Account Owner", "key": "accountOwner",
"sizeInPx": 150, "name": "Account Owner",
"isVisible": true "size": 150
}, },
{ {
"fieldName": "Creation", "key": "createdAt",
"sizeInPx": 150, "name": "Creation",
"isVisible": true "size": 150
}, },
{ {
"fieldName": "Employees", "key": "employees",
"sizeInPx": 150, "name": "Employees",
"isVisible": true "size": 150
}, },
{ {
"fieldName": "LinkedIn", "key": "linkedin",
"sizeInPx": 170, "name": "LinkedIn",
"isVisible": true "size": 170
}, },
{ {
"fieldName": "Address", "key": "address",
"sizeInPx": 170, "name": "Address",
"isVisible": true "size": 170
}, },
{ {
"fieldName": "ICP", "key": "annualRecurringRevenue",
"sizeInPx": 150, "name": "ARR",
"isVisible": false "size": 150
},
{
"fieldName": "ARR",
"sizeInPx": 150,
"isVisible": true
},
{
"fieldName": "Twitter",
"sizeInPx": 150,
"isVisible": false
} }
] ]
}, },
@ -62,50 +52,50 @@
"type": "Table", "type": "Table",
"fields": [ "fields": [
{ {
"fieldName": "People", "key": "displayName",
"sizeInPx": 210, "name": "People",
"isVisible": true "size": 210
}, },
{ {
"fieldName": "Email", "key": "email",
"sizeInPx": 150, "name": "Email",
"isVisible": true "size": 150
}, },
{ {
"fieldName": "Company", "key": "company",
"sizeInPx": 150, "name": "Company",
"isVisible": true "size": 150
}, },
{ {
"fieldName": "Phone", "key": "phone",
"sizeInPx": 150, "name": "Phone",
"isVisible": true "size": 150
}, },
{ {
"fieldName": "Creation", "key": "createdAt",
"sizeInPx": 150, "name": "Creation",
"isVisible": true "size": 150
}, },
{ {
"fieldName": "City", "key": "city",
"sizeInPx": 150, "name": "City",
"isVisible": true "size": 150
}, },
{ {
"fieldName": "Job title", "key": "jobTitle",
"sizeInPx": 150, "name": "Job title",
"isVisible": true "size": 150
}, },
{ {
"fieldName": "LinkedIn", "key": "linkedin",
"sizeInPx": 150, "name": "LinkedIn",
"isVisible": true "size": 150
}, },
{ {
"fieldName": "Twitter", "key": "x",
"sizeInPx": 150, "name": "Twitter",
"isVisible": true "size": 150
} }
] ]
} }
] ]

View File

@ -55,8 +55,9 @@ export class ViewService {
await this.prismaService.client.viewField.createMany({ await this.prismaService.client.viewField.createMany({
data: fields.map((viewField, index) => ({ data: fields.map((viewField, index) => ({
...viewField, ...viewField,
objectName: view.objectId, index,
index: index + 1, isVisible: true,
objectId: view.objectId,
viewId: view.id, viewId: view.id,
workspaceId, workspaceId,
})), })),

View File

@ -0,0 +1,18 @@
/*
Warnings:
- The primary key for the `viewFields` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `id` on the `viewFields` table. All the data in the column will be lost.
- Added the required column `key` to the `viewFields` table without a default value. This is not possible if the table is not empty.
- Made the column `viewId` on table `viewFields` required. This step will fail if there are existing NULL values in that column.
*/
-- DropIndex
DROP INDEX "viewFields_workspaceId_viewId_objectName_fieldName_key";
-- AlterTable
ALTER TABLE "viewFields" DROP CONSTRAINT "viewFields_pkey",
DROP COLUMN "id",
ADD COLUMN "key" TEXT NOT NULL,
ALTER COLUMN "viewId" SET NOT NULL,
ADD CONSTRAINT "viewFields_pkey" PRIMARY KEY ("viewId", "key");

View File

@ -0,0 +1,4 @@
-- AlterTable
ALTER TABLE "viewFields" RENAME COLUMN "fieldName" TO "name";
ALTER TABLE "viewFields" RENAME COLUMN "objectName" TO "objectId";
ALTER TABLE "viewFields" RENAME COLUMN "sizeInPx" TO "size";

View File

@ -657,24 +657,21 @@ model ViewSort {
} }
model ViewField { model ViewField {
/// @Validator.IsString() index Int
/// @Validator.IsOptional() isVisible Boolean
id String @id @default(uuid()) key String
name String
objectId String
size Int
fieldName String view View @relation(fields: [viewId], references: [id], onDelete: Cascade)
index Int viewId String
isVisible Boolean
objectName String
sizeInPx Int
view View? @relation(fields: [viewId], references: [id], onDelete: Cascade)
viewId String?
/// @TypeGraphQL.omit(input: true, output: true) /// @TypeGraphQL.omit(input: true, output: true)
workspace Workspace @relation(fields: [workspaceId], references: [id]) workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true) /// @TypeGraphQL.omit(input: true, output: true)
workspaceId String workspaceId String
@@unique([workspaceId, viewId, objectName, fieldName]) @@id([viewId, key])
@@map("viewFields") @@map("viewFields")
} }

View File

@ -20,73 +20,54 @@ export const seedViews = async (prisma: PrismaClient) => {
await Promise.all( await Promise.all(
[ [
{ {
id: 'twenty-388833ba-1343-49d7-9092-065f92e0e5fa', key: 'name',
fieldName: 'Name', name: 'Name',
sizeInPx: 180, size: 180,
isVisible: true,
}, },
{ {
id: 'twenty-fdbb7a60-18ac-4d52-83b8-399eb6055ec6', key: 'domainName',
fieldName: 'URL', name: 'URL',
sizeInPx: 100, size: 100,
isVisible: true,
}, },
{ {
id: 'twenty-cc77beef-af99-4cd2-86dd-0230f8565ed5', key: 'accountOwner',
fieldName: 'Account Owner', name: 'Account Owner',
sizeInPx: 150, size: 150,
isVisible: true,
}, },
{ {
id: 'twenty-28537b67-8b78-4885-903d-f749f34883b1', key: 'createdAt',
fieldName: 'Creation', name: 'Creation',
sizeInPx: 150, size: 150,
isVisible: true,
}, },
{ {
id: 'twenty-59e6624d-9a4d-492d-a0f2-52f51f69d004', key: 'employees',
fieldName: 'Employees', name: 'Employees',
sizeInPx: 150, size: 150,
isVisible: true,
}, },
{ {
id: 'twenty-2c4ee8b9-aacd-42dd-b422-22eca03aab5a', key: 'linkedin',
fieldName: 'LinkedIn', name: 'LinkedIn',
sizeInPx: 170, size: 170,
isVisible: true,
}, },
{ {
id: 'twenty-b83e299f-7098-4748-a39e-431cca2907ab', key: 'address',
fieldName: 'Address', name: 'Address',
sizeInPx: 170, size: 170,
isVisible: true,
}, },
{ {
id: 'twenty-acef1246-8461-4e34-96b9-f326d598d655', key: 'annualRecurringRevenue',
fieldName: 'ICP', name: 'ARR',
sizeInPx: 150, size: 150,
isVisible: false,
},
{
id: 'twenty-971828c5-8167-4997-ae13-3b7895faa6f2',
fieldName: 'ARR',
sizeInPx: 150,
isVisible: true,
},
{
id: 'twenty-90977d8a-328d-4f69-98e8-8c69723c5a18',
fieldName: 'Twitter',
sizeInPx: 150,
isVisible: false,
}, },
].map((viewField, index) => ].map((viewField, index) =>
prisma.viewField.upsert({ prisma.viewField.upsert({
where: { id: viewField.id }, where: { viewId_key: { key: viewField.key, viewId: companyViewId } },
update: {}, update: {},
create: { create: {
...viewField, ...viewField,
index: index + 1, index,
objectName: 'company', isVisible: true,
objectId: 'company',
viewId: companyViewId, viewId: companyViewId,
workspaceId, workspaceId,
}, },
@ -109,67 +90,59 @@ export const seedViews = async (prisma: PrismaClient) => {
await Promise.all( await Promise.all(
[ [
{ {
id: 'twenty-fc3461b4-661d-492e-8907-61004a41cca6', key: 'displayName',
fieldName: 'People', name: 'People',
sizeInPx: 210, size: 210,
isVisible: true,
}, },
{ {
id: 'twenty-4724d413-4343-4528-b8c4-4431910722f8', key: 'email',
fieldName: 'Email', name: 'Email',
sizeInPx: 150, size: 150,
isVisible: true,
}, },
{ {
id: 'twenty-fbb16b08-5a58-4a69-8bd0-a6d267994042', key: 'company',
fieldName: 'Company', name: 'Company',
sizeInPx: 150, size: 150,
isVisible: true,
}, },
{ {
id: 'twenty-1bad57bb-6627-40f8-8c75-bb5902892273', key: 'phone',
fieldName: 'Phone', name: 'Phone',
sizeInPx: 150, size: 150,
isVisible: true,
}, },
{ {
id: 'twenty-3544d797-740b-4e0b-8226-134bf38da256', key: 'createdAt',
fieldName: 'Creation', name: 'Creation',
sizeInPx: 150, size: 150,
isVisible: true,
}, },
{ {
id: 'twenty-4b6d48fb-17e2-4071-8565-d512f84656d5', key: 'city',
fieldName: 'City', name: 'City',
sizeInPx: 150, size: 150,
isVisible: true,
}, },
{ {
id: 'twenty-418849cc-aa5c-4835-822b-c0dfb076106b', key: 'jobTitle',
fieldName: 'Job title', name: 'Job title',
sizeInPx: 150, size: 150,
isVisible: true,
}, },
{ {
id: 'twenty-7591af5d-e081-4afa-94bb-09bd0e517850', key: 'linkedin',
fieldName: 'LinkedIn', name: 'LinkedIn',
sizeInPx: 150, size: 150,
isVisible: true,
}, },
{ {
id: 'twenty-e7baeb3d-8ef3-4e61-89d6-60f64b1d52c5', key: 'x',
fieldName: 'Twitter', name: 'Twitter',
sizeInPx: 150, size: 150,
isVisible: true,
}, },
].map((viewField, index) => ].map((viewField, index) =>
prisma.viewField.upsert({ prisma.viewField.upsert({
where: { id: viewField.id }, where: { viewId_key: { key: viewField.key, viewId: personViewId } },
update: {}, update: {},
create: { create: {
...viewField, ...viewField,
index: index + 1, index,
objectName: 'person', isVisible: true,
objectId: 'person',
viewId: personViewId, viewId: personViewId,
workspaceId, workspaceId,
}, },