From 5287b7c4abccbb2554dd19f1fa3772d28f105674 Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Mon, 11 Mar 2024 17:00:19 +0100 Subject: [PATCH] Add icon, position and key on View (#4413) * Add view key field * Update Prefill demo, seed dev, prefill new workspace --- .../src/generated-metadata/gql.ts | 4 +- .../src/generated-metadata/graphql.ts | 214 +++++++++++++++++- .../twenty-front/src/generated/graphql.tsx | 8 - .../modules/object-metadata/types/Position.ts | 1 + .../views/components/ViewsDropdownButton.tsx | 17 +- .../src/modules/views/types/GraphQLView.ts | 5 + .../src/modules/views/types/ViewKey.ts | 3 + .../src/testing/mock-data/metadata.ts | 2 + .../database/typeorm-seeds/workspace/views.ts | 80 ++++++- .../demo-objects-prefill-data/view.ts | 78 ++++++- .../standard-objects-prefill-data/view.ts | 78 ++++++- .../standard-objects/view.object-metadata.ts | 25 ++ 12 files changed, 472 insertions(+), 43 deletions(-) create mode 100644 packages/twenty-front/src/modules/object-metadata/types/Position.ts create mode 100644 packages/twenty-front/src/modules/views/types/ViewKey.ts diff --git a/packages/twenty-front/src/generated-metadata/gql.ts b/packages/twenty-front/src/generated-metadata/gql.ts index 00721794e..0b4cb3824 100644 --- a/packages/twenty-front/src/generated-metadata/gql.ts +++ b/packages/twenty-front/src/generated-metadata/gql.ts @@ -20,7 +20,7 @@ const documents = { "\n mutation UpdateOneObjectMetadataItem(\n $idToUpdate: ID!\n $updatePayload: UpdateObjectInput!\n ) {\n updateOneObject(input: { id: $idToUpdate, update: $updatePayload }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n": types.UpdateOneObjectMetadataItemDocument, "\n mutation DeleteOneObjectMetadataItem($idToDelete: ID!) {\n deleteOneObject(input: { id: $idToDelete }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n": types.DeleteOneObjectMetadataItemDocument, "\n mutation DeleteOneFieldMetadataItem($idToDelete: ID!) {\n deleteOneField(input: { id: $idToDelete }) {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\n }\n }\n": types.DeleteOneFieldMetadataItemDocument, - "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n": types.ObjectMetadataItemsDocument, + "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n": types.ObjectMetadataItemsDocument, }; /** @@ -68,7 +68,7 @@ export function graphql(source: "\n mutation DeleteOneFieldMetadataItem($idToDe /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function graphql(source: "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n"): (typeof documents)["\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n"]; +export function graphql(source: "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n"): (typeof documents)["\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n"]; export function graphql(source: string) { return (documents as any)[source] ?? {}; diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 596c19f4e..5ae4a8999 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -24,6 +24,16 @@ export type Scalars = { Upload: { input: any; output: any; } }; +export type ActivateWorkspaceInput = { + displayName?: InputMaybe; +}; + +export type Analytics = { + __typename?: 'Analytics'; + /** Boolean that confirms query was dispatched */ + success: Scalars['Boolean']['output']; +}; + export type ApiKeyToken = { __typename?: 'ApiKeyToken'; token: Scalars['String']['output']; @@ -55,6 +65,7 @@ export type AuthTokens = { export type Billing = { __typename?: 'Billing'; + billingFreeTrialDurationInDays?: Maybe; billingUrl: Scalars['String']['output']; isBillingEnabled: Scalars['Boolean']['output']; }; @@ -64,6 +75,18 @@ export type BooleanFieldComparison = { isNot?: InputMaybe; }; +export type ClientConfig = { + __typename?: 'ClientConfig'; + authProviders: AuthProviders; + billing: Billing; + debugMode: Scalars['Boolean']['output']; + sentry: Sentry; + signInPrefilled: Scalars['Boolean']['output']; + signUpDisabled: Scalars['Boolean']['output']; + support: Support; + telemetry: Telemetry; +}; + export type CreateFieldInput = { defaultValue?: InputMaybe; description?: InputMaybe; @@ -100,11 +123,20 @@ export type CreateOneObjectInput = { object: CreateObjectInput; }; +export type CreateOneRefreshTokenInput = { + /** The record to create */ + refreshToken: CreateRefreshTokenInput; +}; + export type CreateOneRelationInput = { /** The record to create */ relation: CreateRelationInput; }; +export type CreateRefreshTokenInput = { + expiresAt: Scalars['DateTime']['input']; +}; + export type CreateRelationInput = { description?: InputMaybe; fromDescription?: InputMaybe; @@ -152,14 +184,36 @@ export type EmailPasswordResetLink = { success: Scalars['Boolean']['output']; }; +export type FeatureFlag = { + __typename?: 'FeatureFlag'; + id: Scalars['ID']['output']; + key: Scalars['String']['output']; + value: Scalars['Boolean']['output']; + workspaceId: Scalars['String']['output']; +}; + +export type FeatureFlagFilter = { + and?: InputMaybe>; + id?: InputMaybe; + or?: InputMaybe>; +}; + +export type FeatureFlagSort = { + direction: SortDirection; + field: FeatureFlagSortFields; + nulls?: InputMaybe; +}; + +export enum FeatureFlagSortFields { + Id = 'id' +} + export type FieldConnection = { __typename?: 'FieldConnection'; /** Array of edges. */ edges: Array; /** Paging information */ pageInfo: PageInfo; - /** Fetch total count of records */ - totalCount: Scalars['Int']['output']; }; export type FieldDeleteResponse = { @@ -244,16 +298,22 @@ export type LoginToken = { export type Mutation = { __typename?: 'Mutation'; + activateWorkspace: Workspace; challenge: LoginToken; + checkoutSession: SessionEntity; + createEvent: Analytics; createOneField: Field; createOneObject: Object; + createOneRefreshToken: RefreshToken; createOneRelation: Relation; + deleteCurrentWorkspace: Workspace; deleteOneField: FieldDeleteResponse; deleteOneObject: Object; deleteOneRelation: RelationDeleteResponse; deleteUser: User; emailPasswordResetLink: EmailPasswordResetLink; generateApiKeyToken: ApiKeyToken; + generateJWT: AuthTokens; generateTransientToken: TransientToken; impersonate: Verify; renewToken: AuthTokens; @@ -261,19 +321,38 @@ export type Mutation = { updateOneField: Field; updateOneObject: Object; updatePasswordViaResetToken: InvalidatePassword; + updateWorkspace: Workspace; uploadFile: Scalars['String']['output']; uploadImage: Scalars['String']['output']; uploadProfilePicture: Scalars['String']['output']; + uploadWorkspaceLogo: Scalars['String']['output']; verify: Verify; }; +export type MutationActivateWorkspaceArgs = { + data: ActivateWorkspaceInput; +}; + + export type MutationChallengeArgs = { email: Scalars['String']['input']; password: Scalars['String']['input']; }; +export type MutationCheckoutSessionArgs = { + recurringInterval: Scalars['String']['input']; + successUrlPath?: InputMaybe; +}; + + +export type MutationCreateEventArgs = { + data: Scalars['JSON']['input']; + type: Scalars['String']['input']; +}; + + export type MutationCreateOneFieldArgs = { input: CreateOneFieldMetadataInput; }; @@ -284,6 +363,11 @@ export type MutationCreateOneObjectArgs = { }; +export type MutationCreateOneRefreshTokenArgs = { + input: CreateOneRefreshTokenInput; +}; + + export type MutationCreateOneRelationArgs = { input: CreateOneRelationInput; }; @@ -315,6 +399,11 @@ export type MutationGenerateApiKeyTokenArgs = { }; +export type MutationGenerateJwtArgs = { + workspaceId: Scalars['String']['input']; +}; + + export type MutationImpersonateArgs = { userId: Scalars['String']['input']; }; @@ -348,6 +437,11 @@ export type MutationUpdatePasswordViaResetTokenArgs = { }; +export type MutationUpdateWorkspaceArgs = { + data: UpdateWorkspaceInput; +}; + + export type MutationUploadFileArgs = { file: Scalars['Upload']['input']; fileFolder?: InputMaybe; @@ -365,6 +459,11 @@ export type MutationUploadProfilePictureArgs = { }; +export type MutationUploadWorkspaceLogoArgs = { + file: Scalars['Upload']['input']; +}; + + export type MutationVerifyArgs = { loginToken: Scalars['String']['input']; }; @@ -375,8 +474,6 @@ export type ObjectConnection = { edges: Array; /** Paging information */ pageInfo: PageInfo; - /** Fetch total count of records */ - totalCount: Scalars['Int']['output']; }; export type ObjectFieldsConnection = { @@ -385,8 +482,6 @@ export type ObjectFieldsConnection = { edges: Array; /** Paging information */ pageInfo: PageInfo; - /** Fetch total count of records */ - totalCount: Scalars['Int']['output']; }; export type PageInfo = { @@ -401,14 +496,34 @@ export type PageInfo = { startCursor?: Maybe; }; +export type ProductPriceEntity = { + __typename?: 'ProductPriceEntity'; + created: Scalars['Float']['output']; + recurringInterval: Scalars['String']['output']; + stripePriceId: Scalars['String']['output']; + unitAmount: Scalars['Float']['output']; +}; + +export type ProductPricesEntity = { + __typename?: 'ProductPricesEntity'; + productPrices: Array; + totalNumberOfPrices: Scalars['Int']['output']; +}; + export type Query = { __typename?: 'Query'; + billingPortalSession: SessionEntity; checkUserExists: UserExists; checkWorkspaceInviteHashIsValid: WorkspaceInviteHashValid; + clientConfig: ClientConfig; currentUser: User; + currentWorkspace: Workspace; field: Field; fields: FieldConnection; findWorkspaceFromInviteHash: Workspace; + getProductPrices: ProductPricesEntity; + getTimelineThreadsFromCompanyId: TimelineThreadsWithTotal; + getTimelineThreadsFromPersonId: TimelineThreadsWithTotal; object: Object; objects: ObjectConnection; relation: Relation; @@ -417,6 +532,11 @@ export type Query = { }; +export type QueryBillingPortalSessionArgs = { + returnUrlPath?: InputMaybe; +}; + + export type QueryCheckUserExistsArgs = { email: Scalars['String']['input']; }; @@ -443,6 +563,25 @@ export type QueryFindWorkspaceFromInviteHashArgs = { }; +export type QueryGetProductPricesArgs = { + product: Scalars['String']['input']; +}; + + +export type QueryGetTimelineThreadsFromCompanyIdArgs = { + companyId: Scalars['ID']['input']; + page: Scalars['Int']['input']; + pageSize: Scalars['Int']['input']; +}; + + +export type QueryGetTimelineThreadsFromPersonIdArgs = { + page: Scalars['Int']['input']; + pageSize: Scalars['Int']['input']; + personId: Scalars['ID']['input']; +}; + + export type QueryObjectArgs = { id: Scalars['ID']['input']; }; @@ -490,8 +629,6 @@ export type RelationConnection = { edges: Array; /** Paging information */ pageInfo: PageInfo; - /** Fetch total count of records */ - totalCount: Scalars['Int']['output']; }; export type RelationDeleteResponse = { @@ -518,6 +655,23 @@ export type Sentry = { dsn?: Maybe; }; +export type SessionEntity = { + __typename?: 'SessionEntity'; + url: Scalars['String']['output']; +}; + +/** Sort Directions */ +export enum SortDirection { + Asc = 'ASC', + Desc = 'DESC' +} + +/** Sort Nulls Options */ +export enum SortNulls { + NullsFirst = 'NULLS_FIRST', + NullsLast = 'NULLS_LAST' +} + export type Support = { __typename?: 'Support'; supportDriver: Scalars['String']['output']; @@ -541,6 +695,7 @@ export type TimelineThread = { participantCount: Scalars['Float']['output']; read: Scalars['Boolean']['output']; subject: Scalars['String']['output']; + visibility: Scalars['String']['output']; }; export type TimelineThreadParticipant = { @@ -554,6 +709,12 @@ export type TimelineThreadParticipant = { workspaceMemberId?: Maybe; }; +export type TimelineThreadsWithTotal = { + __typename?: 'TimelineThreadsWithTotal'; + timelineThreads: Array; + totalNumberOfThreads: Scalars['Int']['output']; +}; + export type TransientToken = { __typename?: 'TransientToken'; transientToken: AuthToken; @@ -598,11 +759,21 @@ export type UpdateOneObjectInput = { update: UpdateObjectInput; }; +export type UpdateWorkspaceInput = { + allowImpersonation?: InputMaybe; + displayName?: InputMaybe; + domainName?: InputMaybe; + inviteHash?: InputMaybe; + logo?: InputMaybe; +}; + export type User = { __typename?: 'User'; canImpersonate: Scalars['Boolean']['output']; createdAt: Scalars['DateTime']['output']; + defaultAvatarUrl?: Maybe; defaultWorkspace: Workspace; + defaultWorkspaceId: Scalars['String']['output']; deletedAt?: Maybe; disabled?: Maybe; email: Scalars['String']['output']; @@ -615,7 +786,8 @@ export type User = { passwordResetTokenExpiresAt?: Maybe; supportUserHash?: Maybe; updatedAt: Scalars['DateTime']['output']; - workspaceMember: WorkspaceMember; + workspaceMember?: Maybe; + workspaces: Array; }; export type UserEdge = { @@ -631,6 +803,18 @@ export type UserExists = { exists: Scalars['Boolean']['output']; }; +export type UserWorkspace = { + __typename?: 'UserWorkspace'; + createdAt: Scalars['DateTime']['output']; + deletedAt?: Maybe; + id: Scalars['ID']['output']; + updatedAt: Scalars['DateTime']['output']; + user: User; + userId: Scalars['String']['output']; + workspace?: Maybe; + workspaceId: Scalars['String']['output']; +}; + export type ValidatePasswordResetToken = { __typename?: 'ValidatePasswordResetToken'; email: Scalars['String']['output']; @@ -645,11 +829,13 @@ export type Verify = { export type Workspace = { __typename?: 'Workspace'; + activationStatus: Scalars['String']['output']; allowImpersonation: Scalars['Boolean']['output']; createdAt: Scalars['DateTime']['output']; deletedAt?: Maybe; displayName?: Maybe; domainName?: Maybe; + featureFlags?: Maybe>; id: Scalars['ID']['output']; inviteHash?: Maybe; logo?: Maybe; @@ -657,6 +843,12 @@ export type Workspace = { updatedAt: Scalars['DateTime']['output']; }; + +export type WorkspaceFeatureFlagsArgs = { + filter?: FeatureFlagFilter; + sorting?: Array; +}; + export type WorkspaceEdge = { __typename?: 'WorkspaceEdge'; /** Cursor for this node. */ @@ -838,7 +1030,7 @@ export type ObjectMetadataItemsQueryVariables = Exact<{ }>; -export type ObjectMetadataItemsQuery = { __typename?: 'Query', objects: { __typename?: 'ObjectConnection', totalCount: number, edges: Array<{ __typename?: 'objectEdge', node: { __typename?: 'object', id: string, dataSourceId: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, description?: string | null, icon?: string | null, isCustom: boolean, isActive: boolean, isSystem: boolean, createdAt: any, updatedAt: any, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, fields: { __typename?: 'ObjectFieldsConnection', totalCount: number, edges: Array<{ __typename?: 'fieldEdge', node: { __typename?: 'field', id: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isCustom?: boolean | null, isActive?: boolean | null, isSystem?: boolean | null, isNullable?: boolean | null, createdAt: any, updatedAt: any, defaultValue?: any | null, options?: any | null, fromRelationMetadata?: { __typename?: 'relation', id: string, relationType: RelationMetadataType, toFieldMetadataId: string, toObjectMetadata: { __typename?: 'object', id: string, dataSourceId: string, nameSingular: string, namePlural: string, isSystem: boolean } } | null, toRelationMetadata?: { __typename?: 'relation', id: string, relationType: RelationMetadataType, fromFieldMetadataId: string, fromObjectMetadata: { __typename?: 'object', id: string, dataSourceId: string, nameSingular: string, namePlural: string, isSystem: boolean } } | null } }>, pageInfo: { __typename?: 'PageInfo', hasNextPage?: boolean | null, hasPreviousPage?: boolean | null, startCursor?: any | null, endCursor?: any | null } } } }>, pageInfo: { __typename?: 'PageInfo', hasNextPage?: boolean | null, hasPreviousPage?: boolean | null, startCursor?: any | null, endCursor?: any | null } } }; +export type ObjectMetadataItemsQuery = { __typename?: 'Query', objects: { __typename?: 'ObjectConnection', edges: Array<{ __typename?: 'objectEdge', node: { __typename?: 'object', id: string, dataSourceId: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, description?: string | null, icon?: string | null, isCustom: boolean, isActive: boolean, isSystem: boolean, createdAt: any, updatedAt: any, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, fields: { __typename?: 'ObjectFieldsConnection', edges: Array<{ __typename?: 'fieldEdge', node: { __typename?: 'field', id: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isCustom?: boolean | null, isActive?: boolean | null, isSystem?: boolean | null, isNullable?: boolean | null, createdAt: any, updatedAt: any, defaultValue?: any | null, options?: any | null, fromRelationMetadata?: { __typename?: 'relation', id: string, relationType: RelationMetadataType, toFieldMetadataId: string, toObjectMetadata: { __typename?: 'object', id: string, dataSourceId: string, nameSingular: string, namePlural: string, isSystem: boolean } } | null, toRelationMetadata?: { __typename?: 'relation', id: string, relationType: RelationMetadataType, fromFieldMetadataId: string, fromObjectMetadata: { __typename?: 'object', id: string, dataSourceId: string, nameSingular: string, namePlural: string, isSystem: boolean } } | null } }>, pageInfo: { __typename?: 'PageInfo', hasNextPage?: boolean | null, hasPreviousPage?: boolean | null, startCursor?: any | null, endCursor?: any | null } } } }>, pageInfo: { __typename?: 'PageInfo', hasNextPage?: boolean | null, hasPreviousPage?: boolean | null, startCursor?: any | null, endCursor?: any | null } } }; export const CreateOneObjectMetadataItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateOneObjectMetadataItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateOneObjectInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createOneObject"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}}]}}]}}]} as unknown as DocumentNode; @@ -848,4 +1040,4 @@ export const UpdateOneFieldMetadataItemDocument = {"kind":"Document","definition export const UpdateOneObjectMetadataItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateOneObjectMetadataItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idToUpdate"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"updatePayload"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateObjectInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateOneObject"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idToUpdate"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"update"},"value":{"kind":"Variable","name":{"kind":"Name","value":"updatePayload"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}}]}}]}}]} as unknown as DocumentNode; export const DeleteOneObjectMetadataItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneObjectMetadataItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteOneObject"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}}]}}]}}]} as unknown as DocumentNode; export const DeleteOneFieldMetadataItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneFieldMetadataItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteOneField"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}}]} as unknown as DocumentNode; -export const ObjectMetadataItemsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ObjectMetadataItems"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"objectFilter"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"objectFilter"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"fieldFilter"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"fieldFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objects"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"paging"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"1000"}}]}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"objectFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"paging"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"1000"}}]}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"fieldFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"fromRelationMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"relationType"}},{"kind":"Field","name":{"kind":"Name","value":"toObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}}]}},{"kind":"Field","name":{"kind":"Name","value":"toFieldMetadataId"}}]}},{"kind":"Field","name":{"kind":"Name","value":"toRelationMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"relationType"}},{"kind":"Field","name":{"kind":"Name","value":"fromObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}}]}},{"kind":"Field","name":{"kind":"Name","value":"fromFieldMetadataId"}}]}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"hasPreviousPage"}},{"kind":"Field","name":{"kind":"Name","value":"startCursor"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}},{"kind":"Field","name":{"kind":"Name","value":"totalCount"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"hasPreviousPage"}},{"kind":"Field","name":{"kind":"Name","value":"startCursor"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}},{"kind":"Field","name":{"kind":"Name","value":"totalCount"}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file +export const ObjectMetadataItemsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ObjectMetadataItems"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"objectFilter"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"objectFilter"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"fieldFilter"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"fieldFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objects"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"paging"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"1000"}}]}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"objectFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"paging"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"1000"}}]}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"fieldFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"fromRelationMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"relationType"}},{"kind":"Field","name":{"kind":"Name","value":"toObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}}]}},{"kind":"Field","name":{"kind":"Name","value":"toFieldMetadataId"}}]}},{"kind":"Field","name":{"kind":"Name","value":"toRelationMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"relationType"}},{"kind":"Field","name":{"kind":"Name","value":"fromObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}}]}},{"kind":"Field","name":{"kind":"Name","value":"fromFieldMetadataId"}}]}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"hasPreviousPage"}},{"kind":"Field","name":{"kind":"Name","value":"startCursor"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"hasPreviousPage"}},{"kind":"Field","name":{"kind":"Name","value":"startCursor"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/packages/twenty-front/src/generated/graphql.tsx b/packages/twenty-front/src/generated/graphql.tsx index 9080adeca..b70eeddb6 100644 --- a/packages/twenty-front/src/generated/graphql.tsx +++ b/packages/twenty-front/src/generated/graphql.tsx @@ -134,8 +134,6 @@ export type FieldConnection = { edges: Array; /** Paging information */ pageInfo: PageInfo; - /** Fetch total count of records */ - totalCount: Scalars['Int']; }; export type FieldDeleteResponse = { @@ -351,8 +349,6 @@ export type ObjectConnection = { edges: Array; /** Paging information */ pageInfo: PageInfo; - /** Fetch total count of records */ - totalCount: Scalars['Int']; }; export type ObjectFieldsConnection = { @@ -361,8 +357,6 @@ export type ObjectFieldsConnection = { edges: Array; /** Paging information */ pageInfo: PageInfo; - /** Fetch total count of records */ - totalCount: Scalars['Int']; }; export type PageInfo = { @@ -474,8 +468,6 @@ export type RelationConnection = { edges: Array; /** Paging information */ pageInfo: PageInfo; - /** Fetch total count of records */ - totalCount: Scalars['Int']; }; export type RelationDeleteResponse = { diff --git a/packages/twenty-front/src/modules/object-metadata/types/Position.ts b/packages/twenty-front/src/modules/object-metadata/types/Position.ts new file mode 100644 index 000000000..d7316c41d --- /dev/null +++ b/packages/twenty-front/src/modules/object-metadata/types/Position.ts @@ -0,0 +1 @@ +export type Position = number | 'first' | 'last'; diff --git a/packages/twenty-front/src/modules/views/components/ViewsDropdownButton.tsx b/packages/twenty-front/src/modules/views/components/ViewsDropdownButton.tsx index be5dd7fe8..d85a344c8 100644 --- a/packages/twenty-front/src/modules/views/components/ViewsDropdownButton.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewsDropdownButton.tsx @@ -10,6 +10,7 @@ import { IconPlus, IconTrash, } from '@/ui/display/icon'; +import { useIcons } from '@/ui/display/icon/hooks/useIcons'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; @@ -36,11 +37,8 @@ const StyledDropdownLabelAdornments = styled.span` margin-left: ${({ theme }) => theme.spacing(1)}; `; -const StyledViewIcon = styled(IconList)` - margin-right: ${({ theme }) => theme.spacing(1)}; -`; - const StyledViewName = styled.span` + margin-left: ${({ theme }) => theme.spacing(1)}; display: inline-block; max-width: 130px; @media (max-width: 375px) { @@ -128,13 +126,20 @@ export const ViewsDropdownButton = ({ closeViewsDropdown(); }; + const { getIcon } = useIcons(); + const CurrentViewIcon = getIcon(currentView?.icon); + return ( - + {currentView && CurrentViewIcon ? ( + + ) : ( + + )} {currentView?.name ?? 'All'} ยท {entityCountInCurrentView}{' '} @@ -163,7 +168,7 @@ export const ViewsDropdownButton = ({ : null, ].filter(isDefined)} onClick={() => handleViewSelect(view.id)} - LeftIcon={IconList} + LeftIcon={getIcon(view.icon)} text={view.name} /> ))} diff --git a/packages/twenty-front/src/modules/views/types/GraphQLView.ts b/packages/twenty-front/src/modules/views/types/GraphQLView.ts index 2562079d8..4ecdde6c9 100644 --- a/packages/twenty-front/src/modules/views/types/GraphQLView.ts +++ b/packages/twenty-front/src/modules/views/types/GraphQLView.ts @@ -1,5 +1,7 @@ +import { Position } from '@/object-metadata/types/Position'; import { ViewField } from '@/views/types/ViewField'; import { ViewFilter } from '@/views/types/ViewFilter'; +import { ViewKey } from '@/views/types/ViewKey'; import { ViewSort } from '@/views/types/ViewSort'; import { ViewType } from '@/views/types/ViewType'; @@ -7,9 +9,12 @@ export type GraphQLView = { id: string; name: string; type: ViewType; + key: ViewKey | null; objectMetadataId: string; isCompact: boolean; viewFields: ViewField[]; viewFilters: ViewFilter[]; viewSorts: ViewSort[]; + position: Position; + icon: string; }; diff --git a/packages/twenty-front/src/modules/views/types/ViewKey.ts b/packages/twenty-front/src/modules/views/types/ViewKey.ts new file mode 100644 index 000000000..aff161965 --- /dev/null +++ b/packages/twenty-front/src/modules/views/types/ViewKey.ts @@ -0,0 +1,3 @@ +export enum ViewKey { + Index = 'INDEX', +} diff --git a/packages/twenty-front/src/testing/mock-data/metadata.ts b/packages/twenty-front/src/testing/mock-data/metadata.ts index 5dc810bce..bae6812fd 100644 --- a/packages/twenty-front/src/testing/mock-data/metadata.ts +++ b/packages/twenty-front/src/testing/mock-data/metadata.ts @@ -5,6 +5,7 @@ import { } from '~/generated-metadata/graphql'; export const mockedPeopleMetadata = { + cursor: '', __typename: 'objectEdge', node: { __typename: 'object', @@ -581,6 +582,7 @@ export const mockedPeopleMetadata = { export const mockedCompaniesMetadata = { __typename: 'objectEdge', + cursor: '', node: { __typename: 'object', id: '2a603764-1a2f-4043-bbfa-dea375391fad', diff --git a/packages/twenty-server/src/database/typeorm-seeds/workspace/views.ts b/packages/twenty-server/src/database/typeorm-seeds/workspace/views.ts index eaa247108..7a5915a8f 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/views.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/workspace/views.ts @@ -10,29 +10,53 @@ export const seedViews = async ( const createdViews = await workspaceDataSource .createQueryBuilder() .insert() - .into(`${schemaName}.view`, ['name', 'objectMetadataId', 'type']) + .into(`${schemaName}.view`, [ + 'name', + 'objectMetadataId', + 'type', + 'key', + 'position', + 'icon', + ]) .values([ { name: 'All Companies', objectMetadataId: objectMetadataMap['company'].id, type: 'table', + key: 'INDEX', + position: 0, + icon: 'IconBuildingSkyscraper', }, { name: 'All People', objectMetadataId: objectMetadataMap['person'].id, type: 'table', + key: 'INDEX', + position: 0, + icon: 'IconUser', + }, + { + name: 'By Stage', + objectMetadataId: objectMetadataMap['opportunity'].id, + type: 'kanban', + key: null, + position: 0, + icon: 'IconLayoutKanban', }, { name: 'All Opportunities', objectMetadataId: objectMetadataMap['opportunity'].id, - type: 'kanban', + type: 'table', + key: 'INDEX', + position: 1, + icon: 'IconTargetArrow', }, ]) .returning('*') .execute(); const viewIdMap = createdViews.raw.reduce((acc, view) => { - acc[view.name] = view.id; + acc[`${view.name}`] = view.id; return acc; }, {}); @@ -162,34 +186,78 @@ export const seedViews = async ( }, { - fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], + fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], viewId: viewIdMap['All Opportunities'], position: 0, isVisible: true, size: 150, }, { - fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], + fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], viewId: viewIdMap['All Opportunities'], position: 1, isVisible: true, size: 150, }, { - fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], + fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], viewId: viewIdMap['All Opportunities'], position: 2, isVisible: true, size: 150, }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], + viewId: viewIdMap['All Opportunities'], + position: 3, + isVisible: true, + size: 150, + }, { fieldMetadataId: objectMetadataMap['opportunity'].fields['pointOfContact'], viewId: viewIdMap['All Opportunities'], + position: 4, + isVisible: true, + size: 150, + }, + + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], + viewId: viewIdMap['By Stage'], + position: 0, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], + viewId: viewIdMap['By Stage'], + position: 1, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], + viewId: viewIdMap['By Stage'], + position: 2, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], + viewId: viewIdMap['By Stage'], position: 3, isVisible: true, size: 150, }, + { + fieldMetadataId: + objectMetadataMap['opportunity'].fields['pointOfContact'], + viewId: viewIdMap['By Stage'], + position: 4, + isVisible: true, + size: 150, + }, ]) .execute(); }; diff --git a/packages/twenty-server/src/workspace/workspace-manager/demo-objects-prefill-data/view.ts b/packages/twenty-server/src/workspace/workspace-manager/demo-objects-prefill-data/view.ts index 7e40b47ba..6ef42bf70 100644 --- a/packages/twenty-server/src/workspace/workspace-manager/demo-objects-prefill-data/view.ts +++ b/packages/twenty-server/src/workspace/workspace-manager/demo-objects-prefill-data/view.ts @@ -11,23 +11,47 @@ export const viewPrefillData = async ( const createdViews = await entityManager .createQueryBuilder() .insert() - .into(`${schemaName}.view`, ['name', 'objectMetadataId', 'type']) + .into(`${schemaName}.view`, [ + 'name', + 'objectMetadataId', + 'type', + 'key', + 'position', + 'icon', + ]) .orIgnore() .values([ { name: 'All Companies', objectMetadataId: objectMetadataMap['company'].id, type: 'table', + key: 'INDEX', + position: 0, + icon: 'IconBuildingSkyscraper', }, { name: 'All People', objectMetadataId: objectMetadataMap['person'].id, type: 'table', + key: 'INDEX', + position: 0, + icon: 'IconUser', + }, + { + name: 'By Stage', + objectMetadataId: objectMetadataMap['opportunity'].id, + type: 'kanban', + key: null, + position: 0, + icon: 'IconLayoutKanban', }, { name: 'All Opportunities', objectMetadataId: objectMetadataMap['opportunity'].id, - type: 'kanban', + type: 'table', + key: 'INDEX', + position: 1, + icon: 'IconTargetArrow', }, ]) .returning('*') @@ -168,34 +192,78 @@ export const viewPrefillData = async ( }, // Opportunity { - fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], + fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], viewId: viewIdMap['All Opportunities'], position: 0, isVisible: true, size: 150, }, { - fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], + fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], viewId: viewIdMap['All Opportunities'], position: 1, isVisible: true, size: 150, }, { - fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], + fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], viewId: viewIdMap['All Opportunities'], position: 2, isVisible: true, size: 150, }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], + viewId: viewIdMap['All Opportunities'], + position: 3, + isVisible: true, + size: 150, + }, { fieldMetadataId: objectMetadataMap['opportunity'].fields['pointOfContact'], viewId: viewIdMap['All Opportunities'], + position: 4, + isVisible: true, + size: 150, + }, + + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], + viewId: viewIdMap['By Stage'], + position: 0, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], + viewId: viewIdMap['By Stage'], + position: 1, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], + viewId: viewIdMap['By Stage'], + position: 2, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], + viewId: viewIdMap['By Stage'], position: 3, isVisible: true, size: 150, }, + { + fieldMetadataId: + objectMetadataMap['opportunity'].fields['pointOfContact'], + viewId: viewIdMap['By Stage'], + position: 4, + isVisible: true, + size: 150, + }, ]) .execute(); }; diff --git a/packages/twenty-server/src/workspace/workspace-manager/standard-objects-prefill-data/view.ts b/packages/twenty-server/src/workspace/workspace-manager/standard-objects-prefill-data/view.ts index 7e40b47ba..6ef42bf70 100644 --- a/packages/twenty-server/src/workspace/workspace-manager/standard-objects-prefill-data/view.ts +++ b/packages/twenty-server/src/workspace/workspace-manager/standard-objects-prefill-data/view.ts @@ -11,23 +11,47 @@ export const viewPrefillData = async ( const createdViews = await entityManager .createQueryBuilder() .insert() - .into(`${schemaName}.view`, ['name', 'objectMetadataId', 'type']) + .into(`${schemaName}.view`, [ + 'name', + 'objectMetadataId', + 'type', + 'key', + 'position', + 'icon', + ]) .orIgnore() .values([ { name: 'All Companies', objectMetadataId: objectMetadataMap['company'].id, type: 'table', + key: 'INDEX', + position: 0, + icon: 'IconBuildingSkyscraper', }, { name: 'All People', objectMetadataId: objectMetadataMap['person'].id, type: 'table', + key: 'INDEX', + position: 0, + icon: 'IconUser', + }, + { + name: 'By Stage', + objectMetadataId: objectMetadataMap['opportunity'].id, + type: 'kanban', + key: null, + position: 0, + icon: 'IconLayoutKanban', }, { name: 'All Opportunities', objectMetadataId: objectMetadataMap['opportunity'].id, - type: 'kanban', + type: 'table', + key: 'INDEX', + position: 1, + icon: 'IconTargetArrow', }, ]) .returning('*') @@ -168,34 +192,78 @@ export const viewPrefillData = async ( }, // Opportunity { - fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], + fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], viewId: viewIdMap['All Opportunities'], position: 0, isVisible: true, size: 150, }, { - fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], + fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], viewId: viewIdMap['All Opportunities'], position: 1, isVisible: true, size: 150, }, { - fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], + fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], viewId: viewIdMap['All Opportunities'], position: 2, isVisible: true, size: 150, }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], + viewId: viewIdMap['All Opportunities'], + position: 3, + isVisible: true, + size: 150, + }, { fieldMetadataId: objectMetadataMap['opportunity'].fields['pointOfContact'], viewId: viewIdMap['All Opportunities'], + position: 4, + isVisible: true, + size: 150, + }, + + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], + viewId: viewIdMap['By Stage'], + position: 0, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], + viewId: viewIdMap['By Stage'], + position: 1, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], + viewId: viewIdMap['By Stage'], + position: 2, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], + viewId: viewIdMap['By Stage'], position: 3, isVisible: true, size: 150, }, + { + fieldMetadataId: + objectMetadataMap['opportunity'].fields['pointOfContact'], + viewId: viewIdMap['By Stage'], + position: 4, + isVisible: true, + size: 150, + }, ]) .execute(); }; diff --git a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/view.object-metadata.ts b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/view.object-metadata.ts index 9d323f328..9ede2291c 100644 --- a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/view.object-metadata.ts +++ b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/view.object-metadata.ts @@ -41,6 +41,31 @@ export class ViewObjectMetadata extends BaseObjectMetadata { }) type: string; + @FieldMetadata({ + type: FieldMetadataType.SELECT, + label: 'Key', + description: 'View key', + options: [{ value: 'INDEX', label: 'Index', position: 0, color: 'red' }], + defaultValue: { value: 'INDEX' }, + }) + @IsNullable() + key: string; + + @FieldMetadata({ + type: FieldMetadataType.TEXT, + label: 'Icon', + description: 'View icon', + }) + icon: string; + + @FieldMetadata({ + type: FieldMetadataType.POSITION, + label: 'Position', + description: 'View position', + }) + @IsNullable() + position: number; + @FieldMetadata({ type: FieldMetadataType.BOOLEAN, label: 'Compact View',