Finished relation picker for companies (#305)

* Finished relation picker for companies

* Minor fixes
This commit is contained in:
Lucas Bordeau
2023-06-15 16:53:59 +02:00
committed by GitHub
parent f0910b3fbb
commit d28a762661
10 changed files with 741 additions and 63 deletions

View File

@ -9,6 +9,7 @@ import { setContext } from '@apollo/client/link/context';
import { onError } from '@apollo/client/link/error'; import { onError } from '@apollo/client/link/error';
import { RestLink } from 'apollo-link-rest'; import { RestLink } from 'apollo-link-rest';
import { CommentThreadTarget } from './generated/graphql';
import { refreshAccessToken } from './modules/auth/services/AuthService'; import { refreshAccessToken } from './modules/auth/services/AuthService';
const apiLink = createHttpLink({ const apiLink = createHttpLink({
@ -65,7 +66,27 @@ const errorLink = onError(({ graphQLErrors, operation, forward }) => {
export const apiClient = new ApolloClient({ export const apiClient = new ApolloClient({
link: from([errorLink, withAuthHeadersLink, apiLink]), link: from([errorLink, withAuthHeadersLink, apiLink]),
cache: new InMemoryCache(), cache: new InMemoryCache({
typePolicies: {
CommentThread: {
fields: {
commentThreadTargets: {
merge(
existing: CommentThreadTarget[] = [],
incoming: CommentThreadTarget[],
) {
return [...incoming];
},
},
},
},
},
}),
defaultOptions: {
query: {
fetchPolicy: 'cache-first',
},
},
}); });
const authLink = new RestLink({ const authLink = new RestLink({

View File

@ -22,6 +22,10 @@ export type AffectedRows = {
count: Scalars['Int']; count: Scalars['Int'];
}; };
export type BoolFieldUpdateOperationsInput = {
set?: InputMaybe<Scalars['Boolean']>;
};
export type BoolFilter = { export type BoolFilter = {
equals?: InputMaybe<Scalars['Boolean']>; equals?: InputMaybe<Scalars['Boolean']>;
not?: InputMaybe<NestedBoolFilter>; not?: InputMaybe<NestedBoolFilter>;
@ -68,6 +72,20 @@ export type CommentCreateNestedManyWithoutCommentThreadInput = {
createMany?: InputMaybe<CommentCreateManyCommentThreadInputEnvelope>; createMany?: InputMaybe<CommentCreateManyCommentThreadInputEnvelope>;
}; };
export type CommentCreateOrConnectWithoutCommentThreadInput = {
create: CommentCreateWithoutCommentThreadInput;
where: CommentWhereUniqueInput;
};
export type CommentCreateWithoutCommentThreadInput = {
author: UserCreateNestedOneWithoutCommentsInput;
body: Scalars['String'];
createdAt?: InputMaybe<Scalars['DateTime']>;
deletedAt?: InputMaybe<Scalars['DateTime']>;
id: Scalars['String'];
updatedAt?: InputMaybe<Scalars['DateTime']>;
};
export type CommentListRelationFilter = { export type CommentListRelationFilter = {
every?: InputMaybe<CommentWhereInput>; every?: InputMaybe<CommentWhereInput>;
none?: InputMaybe<CommentWhereInput>; none?: InputMaybe<CommentWhereInput>;
@ -78,6 +96,19 @@ export type CommentOrderByRelationAggregateInput = {
_count?: InputMaybe<SortOrder>; _count?: InputMaybe<SortOrder>;
}; };
export type CommentScalarWhereInput = {
AND?: InputMaybe<Array<CommentScalarWhereInput>>;
NOT?: InputMaybe<Array<CommentScalarWhereInput>>;
OR?: InputMaybe<Array<CommentScalarWhereInput>>;
authorId?: InputMaybe<StringFilter>;
body?: InputMaybe<StringFilter>;
commentThreadId?: InputMaybe<StringFilter>;
createdAt?: InputMaybe<DateTimeFilter>;
deletedAt?: InputMaybe<DateTimeNullableFilter>;
id?: InputMaybe<StringFilter>;
updatedAt?: InputMaybe<DateTimeFilter>;
};
export type CommentThread = { export type CommentThread = {
__typename?: 'CommentThread'; __typename?: 'CommentThread';
commentThreadTargets?: Maybe<Array<CommentThreadTarget>>; commentThreadTargets?: Maybe<Array<CommentThreadTarget>>;
@ -153,6 +184,20 @@ export type CommentThreadTargetCreateNestedManyWithoutCommentThreadInput = {
createMany?: InputMaybe<CommentThreadTargetCreateManyCommentThreadInputEnvelope>; createMany?: InputMaybe<CommentThreadTargetCreateManyCommentThreadInputEnvelope>;
}; };
export type CommentThreadTargetCreateOrConnectWithoutCommentThreadInput = {
create: CommentThreadTargetCreateWithoutCommentThreadInput;
where: CommentThreadTargetWhereUniqueInput;
};
export type CommentThreadTargetCreateWithoutCommentThreadInput = {
commentableId: Scalars['String'];
commentableType: CommentableType;
createdAt?: InputMaybe<Scalars['DateTime']>;
deletedAt?: InputMaybe<Scalars['DateTime']>;
id: Scalars['String'];
updatedAt?: InputMaybe<Scalars['DateTime']>;
};
export type CommentThreadTargetListRelationFilter = { export type CommentThreadTargetListRelationFilter = {
every?: InputMaybe<CommentThreadTargetWhereInput>; every?: InputMaybe<CommentThreadTargetWhereInput>;
none?: InputMaybe<CommentThreadTargetWhereInput>; none?: InputMaybe<CommentThreadTargetWhereInput>;
@ -163,6 +208,67 @@ export type CommentThreadTargetOrderByRelationAggregateInput = {
_count?: InputMaybe<SortOrder>; _count?: InputMaybe<SortOrder>;
}; };
export type CommentThreadTargetScalarWhereInput = {
AND?: InputMaybe<Array<CommentThreadTargetScalarWhereInput>>;
NOT?: InputMaybe<Array<CommentThreadTargetScalarWhereInput>>;
OR?: InputMaybe<Array<CommentThreadTargetScalarWhereInput>>;
commentThreadId?: InputMaybe<StringFilter>;
commentableId?: InputMaybe<StringFilter>;
commentableType?: InputMaybe<EnumCommentableTypeFilter>;
createdAt?: InputMaybe<DateTimeFilter>;
deletedAt?: InputMaybe<DateTimeNullableFilter>;
id?: InputMaybe<StringFilter>;
updatedAt?: InputMaybe<DateTimeFilter>;
};
export type CommentThreadTargetUpdateManyMutationInput = {
commentableId?: InputMaybe<StringFieldUpdateOperationsInput>;
commentableType?: InputMaybe<EnumCommentableTypeFieldUpdateOperationsInput>;
createdAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
deletedAt?: InputMaybe<NullableDateTimeFieldUpdateOperationsInput>;
id?: InputMaybe<StringFieldUpdateOperationsInput>;
updatedAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
};
export type CommentThreadTargetUpdateManyWithWhereWithoutCommentThreadInput = {
data: CommentThreadTargetUpdateManyMutationInput;
where: CommentThreadTargetScalarWhereInput;
};
export type CommentThreadTargetUpdateManyWithoutCommentThreadNestedInput = {
connect?: InputMaybe<Array<CommentThreadTargetWhereUniqueInput>>;
connectOrCreate?: InputMaybe<Array<CommentThreadTargetCreateOrConnectWithoutCommentThreadInput>>;
create?: InputMaybe<Array<CommentThreadTargetCreateWithoutCommentThreadInput>>;
createMany?: InputMaybe<CommentThreadTargetCreateManyCommentThreadInputEnvelope>;
delete?: InputMaybe<Array<CommentThreadTargetWhereUniqueInput>>;
deleteMany?: InputMaybe<Array<CommentThreadTargetScalarWhereInput>>;
disconnect?: InputMaybe<Array<CommentThreadTargetWhereUniqueInput>>;
set?: InputMaybe<Array<CommentThreadTargetWhereUniqueInput>>;
update?: InputMaybe<Array<CommentThreadTargetUpdateWithWhereUniqueWithoutCommentThreadInput>>;
updateMany?: InputMaybe<Array<CommentThreadTargetUpdateManyWithWhereWithoutCommentThreadInput>>;
upsert?: InputMaybe<Array<CommentThreadTargetUpsertWithWhereUniqueWithoutCommentThreadInput>>;
};
export type CommentThreadTargetUpdateWithWhereUniqueWithoutCommentThreadInput = {
data: CommentThreadTargetUpdateWithoutCommentThreadInput;
where: CommentThreadTargetWhereUniqueInput;
};
export type CommentThreadTargetUpdateWithoutCommentThreadInput = {
commentableId?: InputMaybe<StringFieldUpdateOperationsInput>;
commentableType?: InputMaybe<EnumCommentableTypeFieldUpdateOperationsInput>;
createdAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
deletedAt?: InputMaybe<NullableDateTimeFieldUpdateOperationsInput>;
id?: InputMaybe<StringFieldUpdateOperationsInput>;
updatedAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
};
export type CommentThreadTargetUpsertWithWhereUniqueWithoutCommentThreadInput = {
create: CommentThreadTargetCreateWithoutCommentThreadInput;
update: CommentThreadTargetUpdateWithoutCommentThreadInput;
where: CommentThreadTargetWhereUniqueInput;
};
export type CommentThreadTargetWhereInput = { export type CommentThreadTargetWhereInput = {
AND?: InputMaybe<Array<CommentThreadTargetWhereInput>>; AND?: InputMaybe<Array<CommentThreadTargetWhereInput>>;
NOT?: InputMaybe<Array<CommentThreadTargetWhereInput>>; NOT?: InputMaybe<Array<CommentThreadTargetWhereInput>>;
@ -177,6 +283,19 @@ export type CommentThreadTargetWhereInput = {
updatedAt?: InputMaybe<DateTimeFilter>; updatedAt?: InputMaybe<DateTimeFilter>;
}; };
export type CommentThreadTargetWhereUniqueInput = {
id?: InputMaybe<Scalars['String']>;
};
export type CommentThreadUpdateInput = {
commentThreadTargets?: InputMaybe<CommentThreadTargetUpdateManyWithoutCommentThreadNestedInput>;
comments?: InputMaybe<CommentUpdateManyWithoutCommentThreadNestedInput>;
createdAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
deletedAt?: InputMaybe<NullableDateTimeFieldUpdateOperationsInput>;
id?: InputMaybe<StringFieldUpdateOperationsInput>;
updatedAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
};
export type CommentThreadWhereInput = { export type CommentThreadWhereInput = {
AND?: InputMaybe<Array<CommentThreadWhereInput>>; AND?: InputMaybe<Array<CommentThreadWhereInput>>;
NOT?: InputMaybe<Array<CommentThreadWhereInput>>; NOT?: InputMaybe<Array<CommentThreadWhereInput>>;
@ -193,6 +312,53 @@ export type CommentThreadWhereUniqueInput = {
id?: InputMaybe<Scalars['String']>; id?: InputMaybe<Scalars['String']>;
}; };
export type CommentUpdateManyMutationInput = {
body?: InputMaybe<StringFieldUpdateOperationsInput>;
createdAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
deletedAt?: InputMaybe<NullableDateTimeFieldUpdateOperationsInput>;
id?: InputMaybe<StringFieldUpdateOperationsInput>;
updatedAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
};
export type CommentUpdateManyWithWhereWithoutCommentThreadInput = {
data: CommentUpdateManyMutationInput;
where: CommentScalarWhereInput;
};
export type CommentUpdateManyWithoutCommentThreadNestedInput = {
connect?: InputMaybe<Array<CommentWhereUniqueInput>>;
connectOrCreate?: InputMaybe<Array<CommentCreateOrConnectWithoutCommentThreadInput>>;
create?: InputMaybe<Array<CommentCreateWithoutCommentThreadInput>>;
createMany?: InputMaybe<CommentCreateManyCommentThreadInputEnvelope>;
delete?: InputMaybe<Array<CommentWhereUniqueInput>>;
deleteMany?: InputMaybe<Array<CommentScalarWhereInput>>;
disconnect?: InputMaybe<Array<CommentWhereUniqueInput>>;
set?: InputMaybe<Array<CommentWhereUniqueInput>>;
update?: InputMaybe<Array<CommentUpdateWithWhereUniqueWithoutCommentThreadInput>>;
updateMany?: InputMaybe<Array<CommentUpdateManyWithWhereWithoutCommentThreadInput>>;
upsert?: InputMaybe<Array<CommentUpsertWithWhereUniqueWithoutCommentThreadInput>>;
};
export type CommentUpdateWithWhereUniqueWithoutCommentThreadInput = {
data: CommentUpdateWithoutCommentThreadInput;
where: CommentWhereUniqueInput;
};
export type CommentUpdateWithoutCommentThreadInput = {
author?: InputMaybe<UserUpdateOneRequiredWithoutCommentsNestedInput>;
body?: InputMaybe<StringFieldUpdateOperationsInput>;
createdAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
deletedAt?: InputMaybe<NullableDateTimeFieldUpdateOperationsInput>;
id?: InputMaybe<StringFieldUpdateOperationsInput>;
updatedAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
};
export type CommentUpsertWithWhereUniqueWithoutCommentThreadInput = {
create: CommentCreateWithoutCommentThreadInput;
update: CommentUpdateWithoutCommentThreadInput;
where: CommentWhereUniqueInput;
};
export type CommentWhereInput = { export type CommentWhereInput = {
AND?: InputMaybe<Array<CommentWhereInput>>; AND?: InputMaybe<Array<CommentWhereInput>>;
NOT?: InputMaybe<Array<CommentWhereInput>>; NOT?: InputMaybe<Array<CommentWhereInput>>;
@ -208,6 +374,10 @@ export type CommentWhereInput = {
updatedAt?: InputMaybe<DateTimeFilter>; updatedAt?: InputMaybe<DateTimeFilter>;
}; };
export type CommentWhereUniqueInput = {
id?: InputMaybe<Scalars['String']>;
};
export enum CommentableType { export enum CommentableType {
Company = 'Company', Company = 'Company',
Person = 'Person' Person = 'Person'
@ -244,10 +414,50 @@ export type CompanyCreateInput = {
updatedAt?: InputMaybe<Scalars['DateTime']>; updatedAt?: InputMaybe<Scalars['DateTime']>;
}; };
export type CompanyCreateManyAccountOwnerInput = {
address: Scalars['String'];
createdAt?: InputMaybe<Scalars['DateTime']>;
deletedAt?: InputMaybe<Scalars['DateTime']>;
domainName: Scalars['String'];
employees?: InputMaybe<Scalars['Int']>;
id: Scalars['String'];
name: Scalars['String'];
updatedAt?: InputMaybe<Scalars['DateTime']>;
};
export type CompanyCreateManyAccountOwnerInputEnvelope = {
data: Array<CompanyCreateManyAccountOwnerInput>;
skipDuplicates?: InputMaybe<Scalars['Boolean']>;
};
export type CompanyCreateNestedManyWithoutAccountOwnerInput = {
connect?: InputMaybe<Array<CompanyWhereUniqueInput>>;
connectOrCreate?: InputMaybe<Array<CompanyCreateOrConnectWithoutAccountOwnerInput>>;
create?: InputMaybe<Array<CompanyCreateWithoutAccountOwnerInput>>;
createMany?: InputMaybe<CompanyCreateManyAccountOwnerInputEnvelope>;
};
export type CompanyCreateNestedOneWithoutPeopleInput = { export type CompanyCreateNestedOneWithoutPeopleInput = {
connect?: InputMaybe<CompanyWhereUniqueInput>; connect?: InputMaybe<CompanyWhereUniqueInput>;
}; };
export type CompanyCreateOrConnectWithoutAccountOwnerInput = {
create: CompanyCreateWithoutAccountOwnerInput;
where: CompanyWhereUniqueInput;
};
export type CompanyCreateWithoutAccountOwnerInput = {
address: Scalars['String'];
createdAt?: InputMaybe<Scalars['DateTime']>;
deletedAt?: InputMaybe<Scalars['DateTime']>;
domainName: Scalars['String'];
employees?: InputMaybe<Scalars['Int']>;
id: Scalars['String'];
name: Scalars['String'];
people?: InputMaybe<PersonCreateNestedManyWithoutCompanyInput>;
updatedAt?: InputMaybe<Scalars['DateTime']>;
};
export type CompanyListRelationFilter = { export type CompanyListRelationFilter = {
every?: InputMaybe<CompanyWhereInput>; every?: InputMaybe<CompanyWhereInput>;
none?: InputMaybe<CompanyWhereInput>; none?: InputMaybe<CompanyWhereInput>;
@ -290,6 +500,21 @@ export enum CompanyScalarFieldEnum {
WorkspaceId = 'workspaceId' WorkspaceId = 'workspaceId'
} }
export type CompanyScalarWhereInput = {
AND?: InputMaybe<Array<CompanyScalarWhereInput>>;
NOT?: InputMaybe<Array<CompanyScalarWhereInput>>;
OR?: InputMaybe<Array<CompanyScalarWhereInput>>;
accountOwnerId?: InputMaybe<StringNullableFilter>;
address?: InputMaybe<StringFilter>;
createdAt?: InputMaybe<DateTimeFilter>;
deletedAt?: InputMaybe<DateTimeNullableFilter>;
domainName?: InputMaybe<StringFilter>;
employees?: InputMaybe<IntNullableFilter>;
id?: InputMaybe<StringFilter>;
name?: InputMaybe<StringFilter>;
updatedAt?: InputMaybe<DateTimeFilter>;
};
export type CompanyUpdateInput = { export type CompanyUpdateInput = {
accountOwner?: InputMaybe<UserUpdateOneWithoutCompaniesNestedInput>; accountOwner?: InputMaybe<UserUpdateOneWithoutCompaniesNestedInput>;
address?: InputMaybe<StringFieldUpdateOperationsInput>; address?: InputMaybe<StringFieldUpdateOperationsInput>;
@ -303,10 +528,63 @@ export type CompanyUpdateInput = {
updatedAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>; updatedAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
}; };
export type CompanyUpdateManyMutationInput = {
address?: InputMaybe<StringFieldUpdateOperationsInput>;
createdAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
deletedAt?: InputMaybe<NullableDateTimeFieldUpdateOperationsInput>;
domainName?: InputMaybe<StringFieldUpdateOperationsInput>;
employees?: InputMaybe<NullableIntFieldUpdateOperationsInput>;
id?: InputMaybe<StringFieldUpdateOperationsInput>;
name?: InputMaybe<StringFieldUpdateOperationsInput>;
updatedAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
};
export type CompanyUpdateManyWithWhereWithoutAccountOwnerInput = {
data: CompanyUpdateManyMutationInput;
where: CompanyScalarWhereInput;
};
export type CompanyUpdateManyWithoutAccountOwnerNestedInput = {
connect?: InputMaybe<Array<CompanyWhereUniqueInput>>;
connectOrCreate?: InputMaybe<Array<CompanyCreateOrConnectWithoutAccountOwnerInput>>;
create?: InputMaybe<Array<CompanyCreateWithoutAccountOwnerInput>>;
createMany?: InputMaybe<CompanyCreateManyAccountOwnerInputEnvelope>;
delete?: InputMaybe<Array<CompanyWhereUniqueInput>>;
deleteMany?: InputMaybe<Array<CompanyScalarWhereInput>>;
disconnect?: InputMaybe<Array<CompanyWhereUniqueInput>>;
set?: InputMaybe<Array<CompanyWhereUniqueInput>>;
update?: InputMaybe<Array<CompanyUpdateWithWhereUniqueWithoutAccountOwnerInput>>;
updateMany?: InputMaybe<Array<CompanyUpdateManyWithWhereWithoutAccountOwnerInput>>;
upsert?: InputMaybe<Array<CompanyUpsertWithWhereUniqueWithoutAccountOwnerInput>>;
};
export type CompanyUpdateOneWithoutPeopleNestedInput = { export type CompanyUpdateOneWithoutPeopleNestedInput = {
connect?: InputMaybe<CompanyWhereUniqueInput>; connect?: InputMaybe<CompanyWhereUniqueInput>;
}; };
export type CompanyUpdateWithWhereUniqueWithoutAccountOwnerInput = {
data: CompanyUpdateWithoutAccountOwnerInput;
where: CompanyWhereUniqueInput;
};
export type CompanyUpdateWithoutAccountOwnerInput = {
address?: InputMaybe<StringFieldUpdateOperationsInput>;
createdAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
deletedAt?: InputMaybe<NullableDateTimeFieldUpdateOperationsInput>;
domainName?: InputMaybe<StringFieldUpdateOperationsInput>;
employees?: InputMaybe<NullableIntFieldUpdateOperationsInput>;
id?: InputMaybe<StringFieldUpdateOperationsInput>;
name?: InputMaybe<StringFieldUpdateOperationsInput>;
people?: InputMaybe<PersonUpdateManyWithoutCompanyNestedInput>;
updatedAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
};
export type CompanyUpsertWithWhereUniqueWithoutAccountOwnerInput = {
create: CompanyCreateWithoutAccountOwnerInput;
update: CompanyUpdateWithoutAccountOwnerInput;
where: CompanyWhereUniqueInput;
};
export type CompanyWhereInput = { export type CompanyWhereInput = {
AND?: InputMaybe<Array<CompanyWhereInput>>; AND?: InputMaybe<Array<CompanyWhereInput>>;
NOT?: InputMaybe<Array<CompanyWhereInput>>; NOT?: InputMaybe<Array<CompanyWhereInput>>;
@ -354,6 +632,10 @@ export type DateTimeNullableFilter = {
notIn?: InputMaybe<Array<Scalars['DateTime']>>; notIn?: InputMaybe<Array<Scalars['DateTime']>>;
}; };
export type EnumCommentableTypeFieldUpdateOperationsInput = {
set?: InputMaybe<CommentableType>;
};
export type EnumCommentableTypeFilter = { export type EnumCommentableTypeFilter = {
equals?: InputMaybe<CommentableType>; equals?: InputMaybe<CommentableType>;
in?: InputMaybe<Array<CommentableType>>; in?: InputMaybe<Array<CommentableType>>;
@ -409,6 +691,7 @@ export type Mutation = {
deleteManyCompany: AffectedRows; deleteManyCompany: AffectedRows;
deleteManyPerson: AffectedRows; deleteManyPerson: AffectedRows;
deleteManyPipelineProgress: AffectedRows; deleteManyPipelineProgress: AffectedRows;
updateOneCommentThread: CommentThread;
updateOneCompany?: Maybe<Company>; updateOneCompany?: Maybe<Company>;
updateOnePerson?: Maybe<Person>; updateOnePerson?: Maybe<Person>;
updateOnePipelineProgress?: Maybe<PipelineProgress>; updateOnePipelineProgress?: Maybe<PipelineProgress>;
@ -455,6 +738,12 @@ export type MutationDeleteManyPipelineProgressArgs = {
}; };
export type MutationUpdateOneCommentThreadArgs = {
data: CommentThreadUpdateInput;
where: CommentThreadWhereUniqueInput;
};
export type MutationUpdateOneCompanyArgs = { export type MutationUpdateOneCompanyArgs = {
data: CompanyUpdateInput; data: CompanyUpdateInput;
where: CompanyWhereUniqueInput; where: CompanyWhereUniqueInput;
@ -564,6 +853,10 @@ export type NullableIntFieldUpdateOperationsInput = {
set?: InputMaybe<Scalars['Int']>; set?: InputMaybe<Scalars['Int']>;
}; };
export type NullableStringFieldUpdateOperationsInput = {
set?: InputMaybe<Scalars['String']>;
};
export type Person = { export type Person = {
__typename?: 'Person'; __typename?: 'Person';
_commentCount: Scalars['Int']; _commentCount: Scalars['Int'];
@ -1081,6 +1374,29 @@ export type UserCreateNestedOneWithoutCompaniesInput = {
connect?: InputMaybe<UserWhereUniqueInput>; connect?: InputMaybe<UserWhereUniqueInput>;
}; };
export type UserCreateOrConnectWithoutCommentsInput = {
create: UserCreateWithoutCommentsInput;
where: UserWhereUniqueInput;
};
export type UserCreateWithoutCommentsInput = {
avatarUrl?: InputMaybe<Scalars['String']>;
companies?: InputMaybe<CompanyCreateNestedManyWithoutAccountOwnerInput>;
createdAt?: InputMaybe<Scalars['DateTime']>;
deletedAt?: InputMaybe<Scalars['DateTime']>;
disabled?: InputMaybe<Scalars['Boolean']>;
displayName: Scalars['String'];
email: Scalars['String'];
emailVerified?: InputMaybe<Scalars['Boolean']>;
id: Scalars['String'];
lastSeen?: InputMaybe<Scalars['DateTime']>;
locale: Scalars['String'];
metadata?: InputMaybe<Scalars['JSON']>;
passwordHash?: InputMaybe<Scalars['String']>;
phoneNumber?: InputMaybe<Scalars['String']>;
updatedAt?: InputMaybe<Scalars['DateTime']>;
};
export type UserOrderByWithRelationInput = { export type UserOrderByWithRelationInput = {
avatarUrl?: InputMaybe<SortOrder>; avatarUrl?: InputMaybe<SortOrder>;
comments?: InputMaybe<CommentOrderByRelationAggregateInput>; comments?: InputMaybe<CommentOrderByRelationAggregateInput>;
@ -1122,10 +1438,41 @@ export enum UserScalarFieldEnum {
UpdatedAt = 'updatedAt' UpdatedAt = 'updatedAt'
} }
export type UserUpdateOneRequiredWithoutCommentsNestedInput = {
connect?: InputMaybe<UserWhereUniqueInput>;
connectOrCreate?: InputMaybe<UserCreateOrConnectWithoutCommentsInput>;
create?: InputMaybe<UserCreateWithoutCommentsInput>;
update?: InputMaybe<UserUpdateWithoutCommentsInput>;
upsert?: InputMaybe<UserUpsertWithoutCommentsInput>;
};
export type UserUpdateOneWithoutCompaniesNestedInput = { export type UserUpdateOneWithoutCompaniesNestedInput = {
connect?: InputMaybe<UserWhereUniqueInput>; connect?: InputMaybe<UserWhereUniqueInput>;
}; };
export type UserUpdateWithoutCommentsInput = {
avatarUrl?: InputMaybe<NullableStringFieldUpdateOperationsInput>;
companies?: InputMaybe<CompanyUpdateManyWithoutAccountOwnerNestedInput>;
createdAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
deletedAt?: InputMaybe<NullableDateTimeFieldUpdateOperationsInput>;
disabled?: InputMaybe<BoolFieldUpdateOperationsInput>;
displayName?: InputMaybe<StringFieldUpdateOperationsInput>;
email?: InputMaybe<StringFieldUpdateOperationsInput>;
emailVerified?: InputMaybe<BoolFieldUpdateOperationsInput>;
id?: InputMaybe<StringFieldUpdateOperationsInput>;
lastSeen?: InputMaybe<NullableDateTimeFieldUpdateOperationsInput>;
locale?: InputMaybe<StringFieldUpdateOperationsInput>;
metadata?: InputMaybe<Scalars['JSON']>;
passwordHash?: InputMaybe<NullableStringFieldUpdateOperationsInput>;
phoneNumber?: InputMaybe<NullableStringFieldUpdateOperationsInput>;
updatedAt?: InputMaybe<DateTimeFieldUpdateOperationsInput>;
};
export type UserUpsertWithoutCommentsInput = {
create: UserCreateWithoutCommentsInput;
update: UserUpdateWithoutCommentsInput;
};
export type UserWhereInput = { export type UserWhereInput = {
AND?: InputMaybe<Array<UserWhereInput>>; AND?: InputMaybe<Array<UserWhereInput>>;
NOT?: InputMaybe<Array<UserWhereInput>>; NOT?: InputMaybe<Array<UserWhereInput>>;
@ -1212,7 +1559,7 @@ export type GetCommentThreadsByTargetsQueryVariables = Exact<{
}>; }>;
export type GetCommentThreadsByTargetsQuery = { __typename?: 'Query', findManyCommentThreads: Array<{ __typename?: 'CommentThread', id: string, comments?: Array<{ __typename?: 'Comment', id: string, body: string, createdAt: string, updatedAt: string, author: { __typename?: 'User', id: string, displayName: string, avatarUrl?: string | null } }> | null, commentThreadTargets?: Array<{ __typename?: 'CommentThreadTarget', commentableId: string, commentableType: CommentableType }> | null }> }; export type GetCommentThreadsByTargetsQuery = { __typename?: 'Query', findManyCommentThreads: Array<{ __typename?: 'CommentThread', id: string, comments?: Array<{ __typename?: 'Comment', id: string, body: string, createdAt: string, updatedAt: string, author: { __typename?: 'User', id: string, displayName: string, avatarUrl?: string | null } }> | null, commentThreadTargets?: Array<{ __typename?: 'CommentThreadTarget', id: string, commentableId: string, commentableType: CommentableType }> | null }> };
export type GetCommentThreadQueryVariables = Exact<{ export type GetCommentThreadQueryVariables = Exact<{
commentThreadId: Scalars['String']; commentThreadId: Scalars['String'];
@ -1221,6 +1568,25 @@ export type GetCommentThreadQueryVariables = Exact<{
export type GetCommentThreadQuery = { __typename?: 'Query', findManyCommentThreads: Array<{ __typename?: 'CommentThread', id: string, comments?: Array<{ __typename?: 'Comment', id: string, body: string, createdAt: string, updatedAt: string, author: { __typename?: 'User', id: string, displayName: string, avatarUrl?: string | null } }> | null, commentThreadTargets?: Array<{ __typename?: 'CommentThreadTarget', commentableId: string, commentableType: CommentableType }> | null }> }; export type GetCommentThreadQuery = { __typename?: 'Query', findManyCommentThreads: Array<{ __typename?: 'CommentThread', id: string, comments?: Array<{ __typename?: 'Comment', id: string, body: string, createdAt: string, updatedAt: string, author: { __typename?: 'User', id: string, displayName: string, avatarUrl?: string | null } }> | null, commentThreadTargets?: Array<{ __typename?: 'CommentThreadTarget', commentableId: string, commentableType: CommentableType }> | null }> };
export type AddCommentThreadTargetOnCommentThreadMutationVariables = Exact<{
commentThreadId: Scalars['String'];
commentThreadTargetCreationDate: Scalars['DateTime'];
commentThreadTargetId: Scalars['String'];
commentableEntityId: Scalars['String'];
commentableEntityType: CommentableType;
}>;
export type AddCommentThreadTargetOnCommentThreadMutation = { __typename?: 'Mutation', updateOneCommentThread: { __typename?: 'CommentThread', id: string, createdAt: string, updatedAt: string, commentThreadTargets?: Array<{ __typename?: 'CommentThreadTarget', id: string, createdAt: string, updatedAt: string, commentableType: CommentableType, commentableId: string }> | null } };
export type RemoveCommentThreadTargetOnCommentThreadMutationVariables = Exact<{
commentThreadId: Scalars['String'];
commentThreadTargetId: Scalars['String'];
}>;
export type RemoveCommentThreadTargetOnCommentThreadMutation = { __typename?: 'Mutation', updateOneCommentThread: { __typename?: 'CommentThread', id: string, createdAt: string, updatedAt: string, commentThreadTargets?: Array<{ __typename?: 'CommentThreadTarget', id: string, createdAt: string, updatedAt: string, commentableType: CommentableType, commentableId: string }> | null } };
export type GetCompaniesQueryVariables = Exact<{ export type GetCompaniesQueryVariables = Exact<{
orderBy?: InputMaybe<Array<CompanyOrderByWithRelationInput> | CompanyOrderByWithRelationInput>; orderBy?: InputMaybe<Array<CompanyOrderByWithRelationInput> | CompanyOrderByWithRelationInput>;
where?: InputMaybe<CompanyWhereInput>; where?: InputMaybe<CompanyWhereInput>;
@ -1333,6 +1699,7 @@ export type EmptyQueryQuery = { __typename?: 'Query', searchResults: Array<{ __t
export type SearchCompanyQueryQueryVariables = Exact<{ export type SearchCompanyQueryQueryVariables = Exact<{
where?: InputMaybe<CompanyWhereInput>; where?: InputMaybe<CompanyWhereInput>;
limit?: InputMaybe<Scalars['Int']>; limit?: InputMaybe<Scalars['Int']>;
orderBy?: InputMaybe<Array<CompanyOrderByWithRelationInput> | CompanyOrderByWithRelationInput>;
}>; }>;
@ -1476,6 +1843,7 @@ export const GetCommentThreadsByTargetsDocument = gql`
} }
} }
commentThreadTargets { commentThreadTargets {
id
commentableId commentableId
commentableType commentableType
} }
@ -1561,6 +1929,101 @@ export function useGetCommentThreadLazyQuery(baseOptions?: Apollo.LazyQueryHookO
export type GetCommentThreadQueryHookResult = ReturnType<typeof useGetCommentThreadQuery>; export type GetCommentThreadQueryHookResult = ReturnType<typeof useGetCommentThreadQuery>;
export type GetCommentThreadLazyQueryHookResult = ReturnType<typeof useGetCommentThreadLazyQuery>; export type GetCommentThreadLazyQueryHookResult = ReturnType<typeof useGetCommentThreadLazyQuery>;
export type GetCommentThreadQueryResult = Apollo.QueryResult<GetCommentThreadQuery, GetCommentThreadQueryVariables>; export type GetCommentThreadQueryResult = Apollo.QueryResult<GetCommentThreadQuery, GetCommentThreadQueryVariables>;
export const AddCommentThreadTargetOnCommentThreadDocument = gql`
mutation AddCommentThreadTargetOnCommentThread($commentThreadId: String!, $commentThreadTargetCreationDate: DateTime!, $commentThreadTargetId: String!, $commentableEntityId: String!, $commentableEntityType: CommentableType!) {
updateOneCommentThread(
where: {id: $commentThreadId}
data: {commentThreadTargets: {connectOrCreate: {create: {id: $commentThreadTargetId, createdAt: $commentThreadTargetCreationDate, commentableType: $commentableEntityType, commentableId: $commentableEntityId}, where: {id: $commentThreadTargetId}}}}
) {
id
createdAt
updatedAt
commentThreadTargets {
id
createdAt
updatedAt
commentableType
commentableId
}
}
}
`;
export type AddCommentThreadTargetOnCommentThreadMutationFn = Apollo.MutationFunction<AddCommentThreadTargetOnCommentThreadMutation, AddCommentThreadTargetOnCommentThreadMutationVariables>;
/**
* __useAddCommentThreadTargetOnCommentThreadMutation__
*
* To run a mutation, you first call `useAddCommentThreadTargetOnCommentThreadMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useAddCommentThreadTargetOnCommentThreadMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [addCommentThreadTargetOnCommentThreadMutation, { data, loading, error }] = useAddCommentThreadTargetOnCommentThreadMutation({
* variables: {
* commentThreadId: // value for 'commentThreadId'
* commentThreadTargetCreationDate: // value for 'commentThreadTargetCreationDate'
* commentThreadTargetId: // value for 'commentThreadTargetId'
* commentableEntityId: // value for 'commentableEntityId'
* commentableEntityType: // value for 'commentableEntityType'
* },
* });
*/
export function useAddCommentThreadTargetOnCommentThreadMutation(baseOptions?: Apollo.MutationHookOptions<AddCommentThreadTargetOnCommentThreadMutation, AddCommentThreadTargetOnCommentThreadMutationVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useMutation<AddCommentThreadTargetOnCommentThreadMutation, AddCommentThreadTargetOnCommentThreadMutationVariables>(AddCommentThreadTargetOnCommentThreadDocument, options);
}
export type AddCommentThreadTargetOnCommentThreadMutationHookResult = ReturnType<typeof useAddCommentThreadTargetOnCommentThreadMutation>;
export type AddCommentThreadTargetOnCommentThreadMutationResult = Apollo.MutationResult<AddCommentThreadTargetOnCommentThreadMutation>;
export type AddCommentThreadTargetOnCommentThreadMutationOptions = Apollo.BaseMutationOptions<AddCommentThreadTargetOnCommentThreadMutation, AddCommentThreadTargetOnCommentThreadMutationVariables>;
export const RemoveCommentThreadTargetOnCommentThreadDocument = gql`
mutation RemoveCommentThreadTargetOnCommentThread($commentThreadId: String!, $commentThreadTargetId: String!) {
updateOneCommentThread(
where: {id: $commentThreadId}
data: {commentThreadTargets: {delete: {id: $commentThreadTargetId}}}
) {
id
createdAt
updatedAt
commentThreadTargets {
id
createdAt
updatedAt
commentableType
commentableId
}
}
}
`;
export type RemoveCommentThreadTargetOnCommentThreadMutationFn = Apollo.MutationFunction<RemoveCommentThreadTargetOnCommentThreadMutation, RemoveCommentThreadTargetOnCommentThreadMutationVariables>;
/**
* __useRemoveCommentThreadTargetOnCommentThreadMutation__
*
* To run a mutation, you first call `useRemoveCommentThreadTargetOnCommentThreadMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useRemoveCommentThreadTargetOnCommentThreadMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [removeCommentThreadTargetOnCommentThreadMutation, { data, loading, error }] = useRemoveCommentThreadTargetOnCommentThreadMutation({
* variables: {
* commentThreadId: // value for 'commentThreadId'
* commentThreadTargetId: // value for 'commentThreadTargetId'
* },
* });
*/
export function useRemoveCommentThreadTargetOnCommentThreadMutation(baseOptions?: Apollo.MutationHookOptions<RemoveCommentThreadTargetOnCommentThreadMutation, RemoveCommentThreadTargetOnCommentThreadMutationVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useMutation<RemoveCommentThreadTargetOnCommentThreadMutation, RemoveCommentThreadTargetOnCommentThreadMutationVariables>(RemoveCommentThreadTargetOnCommentThreadDocument, options);
}
export type RemoveCommentThreadTargetOnCommentThreadMutationHookResult = ReturnType<typeof useRemoveCommentThreadTargetOnCommentThreadMutation>;
export type RemoveCommentThreadTargetOnCommentThreadMutationResult = Apollo.MutationResult<RemoveCommentThreadTargetOnCommentThreadMutation>;
export type RemoveCommentThreadTargetOnCommentThreadMutationOptions = Apollo.BaseMutationOptions<RemoveCommentThreadTargetOnCommentThreadMutation, RemoveCommentThreadTargetOnCommentThreadMutationVariables>;
export const GetCompaniesDocument = gql` export const GetCompaniesDocument = gql`
query GetCompanies($orderBy: [CompanyOrderByWithRelationInput!], $where: CompanyWhereInput) { query GetCompanies($orderBy: [CompanyOrderByWithRelationInput!], $where: CompanyWhereInput) {
companies: findManyCompany(orderBy: $orderBy, where: $where) { companies: findManyCompany(orderBy: $orderBy, where: $where) {
@ -2085,8 +2548,8 @@ export type EmptyQueryQueryHookResult = ReturnType<typeof useEmptyQueryQuery>;
export type EmptyQueryLazyQueryHookResult = ReturnType<typeof useEmptyQueryLazyQuery>; export type EmptyQueryLazyQueryHookResult = ReturnType<typeof useEmptyQueryLazyQuery>;
export type EmptyQueryQueryResult = Apollo.QueryResult<EmptyQueryQuery, EmptyQueryQueryVariables>; export type EmptyQueryQueryResult = Apollo.QueryResult<EmptyQueryQuery, EmptyQueryQueryVariables>;
export const SearchCompanyQueryDocument = gql` export const SearchCompanyQueryDocument = gql`
query SearchCompanyQuery($where: CompanyWhereInput, $limit: Int) { query SearchCompanyQuery($where: CompanyWhereInput, $limit: Int, $orderBy: [CompanyOrderByWithRelationInput!]) {
searchResults: findManyCompany(where: $where, take: $limit) { searchResults: findManyCompany(where: $where, take: $limit, orderBy: $orderBy) {
id id
name name
domainName domainName
@ -2108,6 +2571,7 @@ export const SearchCompanyQueryDocument = gql`
* variables: { * variables: {
* where: // value for 'where' * where: // value for 'where'
* limit: // value for 'limit' * limit: // value for 'limit'
* orderBy: // value for 'orderBy'
* }, * },
* }); * });
*/ */

View File

@ -1,15 +1,16 @@
import { useState } from 'react'; import { useState } from 'react';
import { useHotkeys } from 'react-hotkeys-hook';
import { useTheme } from '@emotion/react'; import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { import {
autoUpdate, autoUpdate,
flip, flip,
offset, offset,
shift,
size, size,
useFloating, useFloating,
} from '@floating-ui/react'; } from '@floating-ui/react';
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import { v4 } from 'uuid';
import { CommentThreadForDrawer } from '@/comments/types/CommentThreadForDrawer'; import { CommentThreadForDrawer } from '@/comments/types/CommentThreadForDrawer';
import CompanyChip from '@/companies/components/CompanyChip'; import CompanyChip from '@/companies/components/CompanyChip';
@ -19,17 +20,25 @@ import { DropdownMenuItem } from '@/ui/components/menu/DropdownMenuItem';
import { DropdownMenuItemContainer } from '@/ui/components/menu/DropdownMenuItemContainer'; import { DropdownMenuItemContainer } from '@/ui/components/menu/DropdownMenuItemContainer';
import { DropdownMenuSearch } from '@/ui/components/menu/DropdownMenuSearch'; import { DropdownMenuSearch } from '@/ui/components/menu/DropdownMenuSearch';
import { DropdownMenuSeparator } from '@/ui/components/menu/DropdownMenuSeparator'; import { DropdownMenuSeparator } from '@/ui/components/menu/DropdownMenuSeparator';
import { useListenClickOutsideArrayOfRef } from '@/ui/hooks/useListenClickOutsideArrayOfRef';
import { IconArrowUpRight } from '@/ui/icons'; import { IconArrowUpRight } from '@/ui/icons';
import { Avatar } from '@/users/components/Avatar'; import { Avatar } from '@/users/components/Avatar';
import { getLogoUrlFromDomainName } from '@/utils/utils'; import { getLogoUrlFromDomainName } from '@/utils/utils';
import { QueryMode, useSearchCompanyQueryQuery } from '~/generated/graphql'; import {
CommentableType,
QueryMode,
SortOrder,
useAddCommentThreadTargetOnCommentThreadMutation,
useRemoveCommentThreadTargetOnCommentThreadMutation,
useSearchCompanyQueryQuery,
} from '~/generated/graphql';
type OwnProps = { type OwnProps = {
commentThread: CommentThreadForDrawer; commentThread: CommentThreadForDrawer;
}; };
const StyledContainer = styled.div` const StyledContainer = styled.div`
align-items: center; align-items: flex-start;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
gap: ${(props) => props.theme.spacing(2)}; gap: ${(props) => props.theme.spacing(2)};
@ -38,10 +47,23 @@ const StyledContainer = styled.div`
width: 100%; width: 100%;
`; `;
const StyledLabelContainer = styled.div`
align-items: center;
display: flex;
flex-direction: row;
gap: ${(props) => props.theme.spacing(2)};
padding-bottom: ${(props) => props.theme.spacing(2)};
padding-top: ${(props) => props.theme.spacing(2)};
`;
const StyledRelationLabel = styled.div` const StyledRelationLabel = styled.div`
color: ${(props) => props.theme.text60}; color: ${(props) => props.theme.text60};
display: flex; display: flex;
flex-direction: row; flex-direction: row;
user-select: none;
`; `;
const StyledRelationContainer = styled.div` const StyledRelationContainer = styled.div`
@ -53,43 +75,23 @@ const StyledRelationContainer = styled.div`
cursor: pointer; cursor: pointer;
display: flex; display: flex;
gap: ${(props) => props.theme.spacing(2)}; flex-wrap: wrap;
height: calc(32px - 2 * var(--vertical-padding)); gap: ${(props) => props.theme.spacing(2)};
&:hover { &:hover {
background-color: ${(props) => props.theme.secondaryBackground}; background-color: ${(props) => props.theme.secondaryBackground};
border: 1px solid ${(props) => props.theme.lightBorder}; border: 1px solid ${(props) => props.theme.lightBorder};
} }
min-height: calc(32px - 2 * var(--vertical-padding));
overflow: hidden; overflow: hidden;
padding: var(--vertical-padding) var(--horizontal-padding); padding: var(--vertical-padding) var(--horizontal-padding);
width: calc(100% - 2 * var(--horizontal-padding)); width: calc(100% - 2 * var(--horizontal-padding));
`; `;
// TODO: refactor icon button with new figma and merge
// const StyledAddButton = styled.div`
// align-items: center;
// background: ${(props) => props.theme.primaryBackgroundTransparent};
// border-radius: ${(props) => props.theme.borderRadius};
// box-shadow: ${(props) => props.theme.modalBoxShadow};
// cursor: pointer;
// display: flex;
// flex-direction: row;
// &:hover {
// background-color: ${(props) => props.theme.tertiaryBackground};
// }
// height: 20px;
// justify-content: center;
// width: 20px;
// `;
export function CommentThreadRelationPicker({ commentThread }: OwnProps) { export function CommentThreadRelationPicker({ commentThread }: OwnProps) {
const [isMenuOpen, setIsMenuOpen] = useState(false); const [isMenuOpen, setIsMenuOpen] = useState(false);
const [searchFilter, setSearchFilter] = useState(''); const [searchFilter, setSearchFilter] = useState('');
@ -98,11 +100,33 @@ export function CommentThreadRelationPicker({ commentThread }: OwnProps) {
leading: true, leading: true,
}); });
function exitEditMode() {
setIsMenuOpen(false);
setSearchFilter('');
}
useHotkeys(
['esc', 'enter'],
() => {
exitEditMode();
},
{
enableOnContentEditable: true,
enableOnFormTags: true,
},
[exitEditMode],
);
const { refs, floatingStyles } = useFloating({ const { refs, floatingStyles } = useFloating({
strategy: 'fixed', strategy: 'absolute',
middleware: [offset(), flip(), shift(), size()], middleware: [offset(), flip(), size()],
whileElementsMounted: autoUpdate, whileElementsMounted: autoUpdate,
open: isMenuOpen, open: isMenuOpen,
placement: 'bottom-start',
});
useListenClickOutsideArrayOfRef([refs.floating, refs.domReference], () => {
exitEditMode();
}); });
const theme = useTheme(); const theme = useTheme();
@ -111,29 +135,63 @@ export function CommentThreadRelationPicker({ commentThread }: OwnProps) {
?.filter((relation) => relation.commentableType === 'Company') ?.filter((relation) => relation.commentableType === 'Company')
.map((relation) => relation.commentableId); .map((relation) => relation.commentableId);
// const personIds = commentThread.commentThreadTargets const { data: selectedCompaniesData } = useSearchCompanyQueryQuery({
// ?.filter((relation) => relation.commentableType === 'Person')
// .map((relation) => relation.commentableId);
const { data: dataForChips } = useSearchCompanyQueryQuery({
variables: { variables: {
where: { where: {
id: { id: {
in: companyIds, in: companyIds,
}, },
}, },
orderBy: {
name: SortOrder.Asc,
},
}, },
}); });
const { data: dataForSelect } = useSearchCompanyQueryQuery({ const { data: filteredSelectedCompaniesData } = useSearchCompanyQueryQuery({
variables: { variables: {
where: { where: {
name: { AND: [
contains: `%${searchFilter}%`, {
mode: QueryMode.Insensitive, name: {
}, contains: `%${searchFilter}%`,
mode: QueryMode.Insensitive,
},
},
{
id: {
in: companyIds,
},
},
],
},
orderBy: {
name: SortOrder.Asc,
},
},
});
const { data: companiesToSelectData } = useSearchCompanyQueryQuery({
variables: {
where: {
AND: [
{
name: {
contains: `%${searchFilter}%`,
mode: QueryMode.Insensitive,
},
},
{
id: {
notIn: companyIds,
},
},
],
},
limit: 10,
orderBy: {
name: SortOrder.Asc,
}, },
limit: 5,
}, },
}); });
@ -145,18 +203,65 @@ export function CommentThreadRelationPicker({ commentThread }: OwnProps) {
setIsMenuOpen((isOpen) => !isOpen); setIsMenuOpen((isOpen) => !isOpen);
} }
const companiesForChips = dataForChips?.searchResults ?? []; const [addCommentThreadTargetOnCommentThread] =
const companiesForSelect = dataForSelect?.searchResults ?? []; useAddCommentThreadTargetOnCommentThreadMutation({
refetchQueries: ['GetCompanies'],
});
const [removeCommentThreadTargetOnCommentThread] =
useRemoveCommentThreadTargetOnCommentThreadMutation({
refetchQueries: ['GetCompanies'],
});
function handleCheckItemChange(newCheckedValue: boolean, itemId: string) {
if (newCheckedValue) {
addCommentThreadTargetOnCommentThread({
variables: {
commentableEntityId: itemId,
commentableEntityType: CommentableType.Company,
commentThreadId: commentThread.id,
commentThreadTargetCreationDate: new Date().toISOString(),
commentThreadTargetId: v4(),
},
});
} else {
const foundCorrespondingTarget = commentThread.commentThreadTargets?.find(
(target) => target.commentableId === itemId,
);
if (foundCorrespondingTarget) {
removeCommentThreadTargetOnCommentThread({
variables: {
commentThreadId: commentThread.id,
commentThreadTargetId: foundCorrespondingTarget.id,
},
});
}
}
}
const selectedCompanies = selectedCompaniesData?.searchResults ?? [];
const filteredSelectedCompanies =
filteredSelectedCompaniesData?.searchResults ?? [];
const companiesToSelect = companiesToSelectData?.searchResults ?? [];
const companiesInDropdown = [
...filteredSelectedCompanies,
...companiesToSelect,
];
return ( return (
<StyledContainer> <StyledContainer>
<IconArrowUpRight size={20} color={theme.text40} /> <StyledLabelContainer>
<StyledRelationLabel>Relations</StyledRelationLabel> <IconArrowUpRight size={16} color={theme.text40} />
<StyledRelationLabel>Relations</StyledRelationLabel>
</StyledLabelContainer>
<StyledRelationContainer <StyledRelationContainer
ref={refs.setReference} ref={refs.setReference}
onClick={handleChangeRelationsClick} onClick={handleChangeRelationsClick}
> >
{companiesForChips?.map((company) => ( {selectedCompanies?.map((company) => (
<CompanyChip <CompanyChip
key={company.id} key={company.id}
name={company.name} name={company.name}
@ -164,9 +269,6 @@ export function CommentThreadRelationPicker({ commentThread }: OwnProps) {
/> />
))} ))}
</StyledRelationContainer> </StyledRelationContainer>
{/* <StyledAddButton id="add-button" onClick={handleAddButtonClick}>
<IconPlus size={14} color={theme.text40} strokeWidth={1.5} />
</StyledAddButton> */}
{isMenuOpen && ( {isMenuOpen && (
<DropdownMenu ref={refs.setFloating} style={floatingStyles}> <DropdownMenu ref={refs.setFloating} style={floatingStyles}>
<DropdownMenuSearch <DropdownMenuSearch
@ -175,17 +277,17 @@ export function CommentThreadRelationPicker({ commentThread }: OwnProps) {
/> />
<DropdownMenuSeparator /> <DropdownMenuSeparator />
<DropdownMenuItemContainer> <DropdownMenuItemContainer>
{companiesForSelect?.slice(0, 5)?.map((company) => ( {companiesInDropdown?.map((company) => (
<DropdownMenuCheckableItem <DropdownMenuCheckableItem
key={company.id}
checked={ checked={
companiesForChips selectedCompanies
?.map((companyForChip) => companyForChip.id) ?.map((selectedCompany) => selectedCompany.id)
?.includes(company.id) ?? false ?.includes(company.id) ?? false
} }
onChange={(newCheckedValue) => { onChange={(newCheckedValue) =>
if (newCheckedValue) { handleCheckItemChange(newCheckedValue, company.id)
} }
}}
> >
<Avatar <Avatar
avatarUrl={getLogoUrlFromDomainName(company.domainName)} avatarUrl={getLogoUrlFromDomainName(company.domainName)}
@ -195,7 +297,7 @@ export function CommentThreadRelationPicker({ commentThread }: OwnProps) {
{company.name} {company.name}
</DropdownMenuCheckableItem> </DropdownMenuCheckableItem>
))} ))}
{companiesForSelect?.length === 0 && ( {companiesInDropdown?.length === 0 && (
<DropdownMenuItem>No result</DropdownMenuItem> <DropdownMenuItem>No result</DropdownMenuItem>
)} )}
</DropdownMenuItemContainer> </DropdownMenuItemContainer>

View File

@ -26,6 +26,7 @@ export const GET_COMMENT_THREADS_BY_TARGETS = gql`
} }
} }
commentThreadTargets { commentThreadTargets {
id
commentableId commentableId
commentableType commentableType
} }

View File

@ -0,0 +1,62 @@
import { gql } from '@apollo/client';
export const ADD_COMMENT_THREAD_TARGET = gql`
mutation AddCommentThreadTargetOnCommentThread(
$commentThreadId: String!
$commentThreadTargetCreationDate: DateTime!
$commentThreadTargetId: String!
$commentableEntityId: String!
$commentableEntityType: CommentableType!
) {
updateOneCommentThread(
where: { id: $commentThreadId }
data: {
commentThreadTargets: {
connectOrCreate: {
create: {
id: $commentThreadTargetId
createdAt: $commentThreadTargetCreationDate
commentableType: $commentableEntityType
commentableId: $commentableEntityId
}
where: { id: $commentThreadTargetId }
}
}
}
) {
id
createdAt
updatedAt
commentThreadTargets {
id
createdAt
updatedAt
commentableType
commentableId
}
}
}
`;
export const REMOVE_COMMENT_THREAD_TARGET = gql`
mutation RemoveCommentThreadTargetOnCommentThread(
$commentThreadId: String!
$commentThreadTargetId: String!
) {
updateOneCommentThread(
where: { id: $commentThreadId }
data: { commentThreadTargets: { delete: { id: $commentThreadTargetId } } }
) {
id
createdAt
updatedAt
commentThreadTargets {
id
createdAt
updatedAt
commentableType
commentableId
}
}
}
`;

View File

@ -14,6 +14,8 @@ const StyledContainer = styled.span`
color: ${(props) => props.theme.text80}; color: ${(props) => props.theme.text80};
display: inline-flex; display: inline-flex;
gap: ${(props) => props.theme.spacing(1)}; gap: ${(props) => props.theme.spacing(1)};
height: calc(20px - 2 * ${(props) => props.theme.spacing(1)});
padding: ${(props) => props.theme.spacing(1)}; padding: ${(props) => props.theme.spacing(1)};
user-select: none; user-select: none;

View File

@ -39,8 +39,16 @@ export const EMPTY_QUERY = gql`
`; `;
export const SEARCH_COMPANY_QUERY = gql` export const SEARCH_COMPANY_QUERY = gql`
query SearchCompanyQuery($where: CompanyWhereInput, $limit: Int) { query SearchCompanyQuery(
searchResults: findManyCompany(where: $where, take: $limit) { $where: CompanyWhereInput
$limit: Int
$orderBy: [CompanyOrderByWithRelationInput!]
) {
searchResults: findManyCompany(
where: $where
take: $limit
orderBy: $orderBy
) {
id id
name name
domainName domainName

View File

@ -9,6 +9,9 @@ export const DropdownMenuItemContainer = styled.div`
flex-direction: column; flex-direction: column;
gap: 2px; gap: 2px;
height: 100%; height: 100%;
max-height: 180px;
overflow-y: auto;
padding: var(--padding); padding: var(--padding);
width: calc(100% - 2 * var(--padding)); width: calc(100% - 2 * var(--padding));
`; `;

View File

@ -2,7 +2,7 @@ import React, { useEffect } from 'react';
import { isDefined } from '@/utils/type-guards/isDefined'; import { isDefined } from '@/utils/type-guards/isDefined';
export function useListenClickOutsideArrayOfRef<T extends HTMLElement>( export function useListenClickOutsideArrayOfRef<T extends Element>(
arrayOfRef: Array<React.RefObject<T>>, arrayOfRef: Array<React.RefObject<T>>,
outsideClickCallback: (event?: MouseEvent | TouchEvent) => void, outsideClickCallback: (event?: MouseEvent | TouchEvent) => void,
) { ) {

View File

@ -9,6 +9,7 @@ import { CreateOneCommentThreadArgs } from '../@generated/comment-thread/create-
import { CreateOneCommentThreadGuard } from './guards/create-one-comment-thread.guard'; import { CreateOneCommentThreadGuard } from './guards/create-one-comment-thread.guard';
import { FindManyCommentThreadArgs } from '../@generated/comment-thread/find-many-comment-thread.args'; import { FindManyCommentThreadArgs } from '../@generated/comment-thread/find-many-comment-thread.args';
import { ArgsService } from './services/args.service'; import { ArgsService } from './services/args.service';
import { UpdateOneCommentThreadArgs } from '../@generated/comment-thread/update-one-comment-thread.args';
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard)
@Resolver(() => CommentThread) @Resolver(() => CommentThread)
@ -67,6 +68,20 @@ export class CommentThreadResolver {
return createdCommentThread; return createdCommentThread;
} }
@Mutation(() => CommentThread, {
nullable: false,
})
async updateOneCommentThread(
@Args() args: UpdateOneCommentThreadArgs,
): Promise<CommentThread> {
const updatedCommentThread = await this.prismaService.commentThread.update({
data: args.data,
where: args.where,
});
return updatedCommentThread;
}
@Query(() => [CommentThread]) @Query(() => [CommentThread])
async findManyCommentThreads( async findManyCommentThreads(
@Args() args: FindManyCommentThreadArgs, @Args() args: FindManyCommentThreadArgs,