Migrate view field to new data model - Part 2 (#2270)

* Migrate view field to new data model

* Migrate view fields to new model
This commit is contained in:
Charles Bochet
2023-10-28 19:13:48 +02:00
committed by GitHub
parent b591023eb3
commit 685d342170
168 changed files with 960 additions and 4568 deletions

View File

@ -19,7 +19,7 @@ const documents = {
"\n mutation UpdateOneMetadataObject(\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 }\n }\n": types.UpdateOneMetadataObjectDocument, "\n mutation UpdateOneMetadataObject(\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 }\n }\n": types.UpdateOneMetadataObjectDocument,
"\n mutation DeleteOneMetadataObject($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 }\n }\n": types.DeleteOneMetadataObjectDocument, "\n mutation DeleteOneMetadataObject($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 }\n }\n": types.DeleteOneMetadataObjectDocument,
"\n mutation DeleteOneMetadataField($idToDelete: ID!) {\n deleteOneField(input: { id: $idToDelete }) {\n id\n type\n name\n label\n description\n icon\n placeholder\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\n }\n }\n": types.DeleteOneMetadataFieldDocument, "\n mutation DeleteOneMetadataField($idToDelete: ID!) {\n deleteOneField(input: { id: $idToDelete }) {\n id\n type\n name\n label\n description\n icon\n placeholder\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\n }\n }\n": types.DeleteOneMetadataFieldDocument,
"\n query MetadataObjects {\n objects(paging: { first: 100 }) {\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 createdAt\n updatedAt\n fields(paging: { first: 100 }) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n placeholder\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\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.MetadataObjectsDocument, "\n query MetadataObjects {\n objects(paging: { first: 1000 }) {\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 createdAt\n updatedAt\n fields(paging: { first: 1000 }) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n placeholder\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\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.MetadataObjectsDocument,
}; };
/** /**
@ -63,7 +63,7 @@ export function graphql(source: "\n mutation DeleteOneMetadataField($idToDelete
/** /**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. * 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 MetadataObjects {\n objects(paging: { first: 100 }) {\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 createdAt\n updatedAt\n fields(paging: { first: 100 }) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n placeholder\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\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 MetadataObjects {\n objects(paging: { first: 100 }) {\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 createdAt\n updatedAt\n fields(paging: { first: 100 }) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n placeholder\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\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 MetadataObjects {\n objects(paging: { first: 1000 }) {\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 createdAt\n updatedAt\n fields(paging: { first: 1000 }) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n placeholder\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\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 MetadataObjects {\n objects(paging: { first: 1000 }) {\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 createdAt\n updatedAt\n fields(paging: { first: 1000 }) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n placeholder\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\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: string) { export function graphql(source: string) {
return (documents as any)[source] ?? {}; return (documents as any)[source] ?? {};

View File

@ -582,11 +582,11 @@ export type PipelineStage = {
color: Scalars['String']['output']; color: Scalars['String']['output'];
createdAt: Scalars['DateTime']['output']; createdAt: Scalars['DateTime']['output'];
id: Scalars['ID']['output']; id: Scalars['ID']['output'];
index?: Maybe<Scalars['Int']['output']>;
name: Scalars['String']['output']; name: Scalars['String']['output'];
pipeline: Pipeline; pipeline: Pipeline;
pipelineId: Scalars['String']['output']; pipelineId: Scalars['String']['output'];
pipelineProgresses?: Maybe<Array<PipelineProgress>>; pipelineProgresses?: Maybe<Array<PipelineProgress>>;
position?: Maybe<Scalars['Int']['output']>;
type: Scalars['String']['output']; type: Scalars['String']['output'];
updatedAt: Scalars['DateTime']['output']; updatedAt: Scalars['DateTime']['output'];
}; };
@ -700,69 +700,6 @@ export type UserSettings = {
user?: Maybe<User>; user?: Maybe<User>;
}; };
export type View = {
__typename?: 'View';
fields?: Maybe<Array<ViewField>>;
filters?: Maybe<Array<ViewFilter>>;
id: Scalars['ID']['output'];
name: Scalars['String']['output'];
objectId: Scalars['String']['output'];
sorts?: Maybe<Array<ViewSort>>;
type: ViewType;
};
export type ViewField = {
__typename?: 'ViewField';
index: Scalars['Float']['output'];
isVisible: Scalars['Boolean']['output'];
key: Scalars['String']['output'];
name: Scalars['String']['output'];
objectId: Scalars['String']['output'];
size?: Maybe<Scalars['Int']['output']>;
view: View;
viewId: Scalars['String']['output'];
};
export type ViewFilter = {
__typename?: 'ViewFilter';
displayValue: Scalars['String']['output'];
key: Scalars['String']['output'];
name: Scalars['String']['output'];
operand: ViewFilterOperand;
value: Scalars['String']['output'];
view: View;
viewId: Scalars['String']['output'];
};
export enum ViewFilterOperand {
Contains = 'Contains',
DoesNotContain = 'DoesNotContain',
GreaterThan = 'GreaterThan',
Is = 'Is',
IsNot = 'IsNot',
IsNotNull = 'IsNotNull',
LessThan = 'LessThan'
}
export type ViewSort = {
__typename?: 'ViewSort';
direction: ViewSortDirection;
key: Scalars['String']['output'];
name: Scalars['String']['output'];
view: View;
viewId: Scalars['String']['output'];
};
export enum ViewSortDirection {
Asc = 'asc',
Desc = 'desc'
}
export enum ViewType {
Pipeline = 'Pipeline',
Table = 'Table'
}
export type WebHook = { export type WebHook = {
__typename?: 'WebHook'; __typename?: 'WebHook';
createdAt: Scalars['DateTime']['output']; createdAt: Scalars['DateTime']['output'];
@ -791,10 +728,6 @@ export type Workspace = {
pipelineStages?: Maybe<Array<PipelineStage>>; pipelineStages?: Maybe<Array<PipelineStage>>;
pipelines?: Maybe<Array<Pipeline>>; pipelines?: Maybe<Array<Pipeline>>;
updatedAt: Scalars['DateTime']['output']; updatedAt: Scalars['DateTime']['output'];
viewFields?: Maybe<Array<ViewField>>;
viewFilters?: Maybe<Array<ViewFilter>>;
viewSorts?: Maybe<Array<ViewSort>>;
views?: Maybe<Array<View>>;
webHooks?: Maybe<Array<WebHook>>; webHooks?: Maybe<Array<WebHook>>;
workspaceMember?: Maybe<Array<WorkspaceMember>>; workspaceMember?: Maybe<Array<WorkspaceMember>>;
}; };
@ -929,4 +862,4 @@ export const UpdateOneMetadataFieldDocument = {"kind":"Document","definitions":[
export const UpdateOneMetadataObjectDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateOneMetadataObject"},"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"}}]}}]}}]} as unknown as DocumentNode<UpdateOneMetadataObjectMutation, UpdateOneMetadataObjectMutationVariables>; export const UpdateOneMetadataObjectDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateOneMetadataObject"},"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"}}]}}]}}]} as unknown as DocumentNode<UpdateOneMetadataObjectMutation, UpdateOneMetadataObjectMutationVariables>;
export const DeleteOneMetadataObjectDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneMetadataObject"},"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"}}]}}]}}]} as unknown as DocumentNode<DeleteOneMetadataObjectMutation, DeleteOneMetadataObjectMutationVariables>; export const DeleteOneMetadataObjectDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneMetadataObject"},"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"}}]}}]}}]} as unknown as DocumentNode<DeleteOneMetadataObjectMutation, DeleteOneMetadataObjectMutationVariables>;
export const DeleteOneMetadataFieldDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneMetadataField"},"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":"placeholder"}},{"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<DeleteOneMetadataFieldMutation, DeleteOneMetadataFieldMutationVariables>; export const DeleteOneMetadataFieldDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneMetadataField"},"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":"placeholder"}},{"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<DeleteOneMetadataFieldMutation, DeleteOneMetadataFieldMutationVariables>;
export const MetadataObjectsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataObjects"},"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":"100"}}]}}],"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":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"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":"100"}}]}}],"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":"placeholder"}},{"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"}}]}}]}},{"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<MetadataObjectsQuery, MetadataObjectsQueryVariables>; export const MetadataObjectsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataObjects"},"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"}}]}}],"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":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"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"}}]}}],"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":"placeholder"}},{"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"}}]}}]}},{"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<MetadataObjectsQuery, MetadataObjectsQueryVariables>;

File diff suppressed because it is too large Load Diff

View File

@ -23,8 +23,8 @@ export const ActivityAssigneeEditableField = ({
entityId: activity.id, entityId: activity.id,
recoilScopeId: 'assignee', recoilScopeId: 'assignee',
fieldDefinition: { fieldDefinition: {
key: 'assignee', fieldId: 'assignee',
name: 'Assignee', label: 'Assignee',
Icon: IconUserCircle, Icon: IconUserCircle,
type: 'relation', type: 'relation',
metadata: { metadata: {

View File

@ -21,8 +21,8 @@ export const ActivityEditorDateField = ({
entityId: activityId, entityId: activityId,
recoilScopeId: 'activityDueAt', recoilScopeId: 'activityDueAt',
fieldDefinition: { fieldDefinition: {
key: 'activityDueAt', fieldId: 'activityDueAt',
name: 'Due date', label: 'Due date',
Icon: IconCalendar, Icon: IconCalendar,
type: 'date', type: 'date',
metadata: { metadata: {

View File

@ -3,11 +3,8 @@ import { useRecoilState } from 'recoil';
import { currentUserState } from '@/auth/states/currentUserState'; import { currentUserState } from '@/auth/states/currentUserState';
import { turnFilterIntoWhereClause } from '@/ui/data/filter/utils/turnFilterIntoWhereClause'; import { turnFilterIntoWhereClause } from '@/ui/data/filter/utils/turnFilterIntoWhereClause';
import { import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
ActivityType, import { ActivityType, useGetActivitiesQuery } from '~/generated/graphql';
useGetActivitiesQuery,
ViewFilterOperand,
} from '~/generated/graphql';
import { parseDate } from '~/utils/date-utils'; import { parseDate } from '~/utils/date-utils';
export const useCurrentUserTaskCount = () => { export const useCurrentUserTaskCount = () => {

View File

@ -7,31 +7,31 @@ export const pipeline = {
{ {
id: 'pipeline-stage-1', id: 'pipeline-stage-1',
name: 'New', name: 'New',
index: 0, position: 0,
color: 'red', color: 'red',
}, },
{ {
id: 'pipeline-stage-2', id: 'pipeline-stage-2',
name: 'Screening', name: 'Screening',
index: 1, position: 1,
color: 'purple', color: 'purple',
}, },
{ {
id: 'pipeline-stage-3', id: 'pipeline-stage-3',
name: 'Meeting', name: 'Meeting',
index: 2, position: 2,
color: 'sky', color: 'sky',
}, },
{ {
id: 'pipeline-stage-4', id: 'pipeline-stage-4',
name: 'Proposal', name: 'Proposal',
index: 3, position: 3,
color: 'turquoise', color: 'turquoise',
}, },
{ {
id: 'pipeline-stage-5', id: 'pipeline-stage-5',
name: 'Customer', name: 'Customer',
index: 4, position: 4,
color: 'yellow', color: 'yellow',
}, },
], ],

View File

@ -222,14 +222,14 @@ export const CompanyBoardCard = () => {
<StyledBoardCardBody> <StyledBoardCardBody>
<AnimatedEaseInOut isOpen={!showCompactView}> <AnimatedEaseInOut isOpen={!showCompactView}>
{visibleBoardCardFields.map((viewField) => ( {visibleBoardCardFields.map((viewField) => (
<PreventSelectOnClickContainer key={viewField.key}> <PreventSelectOnClickContainer key={viewField.fieldId}>
<FieldContext.Provider <FieldContext.Provider
value={{ value={{
entityId: boardCardId, entityId: boardCardId,
recoilScopeId: boardCardId + viewField.key, recoilScopeId: boardCardId + viewField.fieldId,
fieldDefinition: { fieldDefinition: {
key: viewField.key, fieldId: viewField.fieldId,
name: viewField.name, label: viewField.label,
Icon: viewField.Icon, Icon: viewField.Icon,
type: viewField.type, type: viewField.type,
metadata: viewField.metadata, metadata: viewField.metadata,

View File

@ -28,11 +28,11 @@ import { User } from '~/generated/graphql';
export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[] = export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[] =
[ [
{ {
key: 'name', fieldId: 'name',
name: 'Name', label: 'Name',
Icon: IconBuildingSkyscraper, Icon: IconBuildingSkyscraper,
size: 180, size: 180,
index: 0, position: 0,
type: 'chip', type: 'chip',
metadata: { metadata: {
urlFieldName: 'domainName', urlFieldName: 'domainName',
@ -45,11 +45,11 @@ export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>
basePathToShowPage: '/companies/', basePathToShowPage: '/companies/',
} satisfies ColumnDefinition<FieldChipMetadata>, } satisfies ColumnDefinition<FieldChipMetadata>,
{ {
key: 'domainName', fieldId: 'domainName',
name: 'URL', label: 'URL',
Icon: IconLink, Icon: IconLink,
size: 100, size: 100,
index: 1, position: 1,
type: 'url', type: 'url',
metadata: { metadata: {
fieldName: 'domainName', fieldName: 'domainName',
@ -60,11 +60,11 @@ export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>
'The company website URL. We use this url to fetch the company icon.', 'The company website URL. We use this url to fetch the company icon.',
} satisfies ColumnDefinition<FieldURLMetadata>, } satisfies ColumnDefinition<FieldURLMetadata>,
{ {
key: 'accountOwner', fieldId: 'accountOwner',
name: 'Account Owner', label: 'Account Owner',
Icon: IconUserCircle, Icon: IconUserCircle,
size: 150, size: 150,
index: 2, position: 2,
type: 'relation', type: 'relation',
metadata: { metadata: {
fieldName: 'accountOwner', fieldName: 'accountOwner',
@ -82,11 +82,11 @@ export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>
}, },
} satisfies ColumnDefinition<FieldRelationMetadata>, } satisfies ColumnDefinition<FieldRelationMetadata>,
{ {
key: 'createdAt', fieldId: 'createdAt',
name: 'Creation', label: 'Creation',
Icon: IconCalendarEvent, Icon: IconCalendarEvent,
size: 150, size: 150,
index: 3, position: 3,
type: 'date', type: 'date',
metadata: { metadata: {
fieldName: 'createdAt', fieldName: 'createdAt',
@ -95,11 +95,11 @@ export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>
infoTooltipContent: "Date when the company's record was created.", infoTooltipContent: "Date when the company's record was created.",
} satisfies ColumnDefinition<FieldDateMetadata>, } satisfies ColumnDefinition<FieldDateMetadata>,
{ {
key: 'employees', fieldId: 'employees',
name: 'Employees', label: 'Employees',
Icon: IconUsers, Icon: IconUsers,
size: 150, size: 150,
index: 4, position: 4,
type: 'number', type: 'number',
metadata: { metadata: {
fieldName: 'employees', fieldName: 'employees',
@ -110,11 +110,11 @@ export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>
infoTooltipContent: 'Number of employees in the company.', infoTooltipContent: 'Number of employees in the company.',
} satisfies ColumnDefinition<FieldNumberMetadata>, } satisfies ColumnDefinition<FieldNumberMetadata>,
{ {
key: 'linkedin', fieldId: 'linkedin',
name: 'LinkedIn', label: 'LinkedIn',
Icon: IconBrandLinkedin, Icon: IconBrandLinkedin,
size: 170, size: 170,
index: 5, position: 5,
type: 'url', type: 'url',
metadata: { metadata: {
fieldName: 'linkedinUrl', fieldName: 'linkedinUrl',
@ -124,11 +124,11 @@ export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>
infoTooltipContent: 'The company Linkedin account.', infoTooltipContent: 'The company Linkedin account.',
} satisfies ColumnDefinition<FieldURLMetadata>, } satisfies ColumnDefinition<FieldURLMetadata>,
{ {
key: 'address', fieldId: 'address',
name: 'Address', label: 'Address',
Icon: IconMap, Icon: IconMap,
size: 170, size: 170,
index: 6, position: 6,
type: 'text', type: 'text',
metadata: { metadata: {
fieldName: 'address', fieldName: 'address',
@ -138,11 +138,11 @@ export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>
infoTooltipContent: 'The company address.', infoTooltipContent: 'The company address.',
} satisfies ColumnDefinition<FieldTextMetadata>, } satisfies ColumnDefinition<FieldTextMetadata>,
{ {
key: 'idealCustomerProfile', fieldId: 'idealCustomerProfile',
name: 'ICP', label: 'ICP',
Icon: IconTarget, Icon: IconTarget,
size: 150, size: 150,
index: 7, position: 7,
type: 'boolean', type: 'boolean',
metadata: { metadata: {
fieldName: 'idealCustomerProfile', fieldName: 'idealCustomerProfile',
@ -152,11 +152,11 @@ export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>
'Ideal Customer Profile: Indicates whether the company is the most suitable and valuable customer for you.', 'Ideal Customer Profile: Indicates whether the company is the most suitable and valuable customer for you.',
} satisfies ColumnDefinition<FieldBooleanMetadata>, } satisfies ColumnDefinition<FieldBooleanMetadata>,
{ {
key: 'annualRecurringRevenue', fieldId: 'annualRecurringRevenue',
name: 'ARR', label: 'ARR',
Icon: IconMoneybag, Icon: IconMoneybag,
size: 150, size: 150,
index: 8, position: 8,
type: 'moneyAmount', type: 'moneyAmount',
metadata: { metadata: {
fieldName: 'annualRecurringRevenue', fieldName: 'annualRecurringRevenue',
@ -166,11 +166,11 @@ export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>
'Annual Recurring Revenue: The actual or estimated annual revenue of the company.', 'Annual Recurring Revenue: The actual or estimated annual revenue of the company.',
} satisfies ColumnDefinition<FieldMoneyMetadata>, } satisfies ColumnDefinition<FieldMoneyMetadata>,
{ {
key: 'xUrl', fieldId: 'xUrl',
name: 'Twitter', label: 'Twitter',
Icon: IconBrandX, Icon: IconBrandX,
size: 150, size: 150,
index: 9, position: 9,
type: 'url', type: 'url',
metadata: { metadata: {
fieldName: 'xUrl', fieldName: 'xUrl',
@ -184,11 +184,11 @@ export const companiesAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>
export const suppliersAvailableColumnDefinitions: ColumnDefinition<FieldMetadata>[] = export const suppliersAvailableColumnDefinitions: ColumnDefinition<FieldMetadata>[] =
[ [
{ {
key: 'name', fieldId: 'name',
name: 'Name', label: 'Name',
Icon: IconBuildingSkyscraper, Icon: IconBuildingSkyscraper,
size: 180, size: 180,
index: 0, position: 0,
type: 'text', type: 'text',
metadata: { metadata: {
fieldName: 'name', fieldName: 'name',
@ -199,11 +199,11 @@ export const suppliersAvailableColumnDefinitions: ColumnDefinition<FieldMetadata
basePathToShowPage: '/companies/', basePathToShowPage: '/companies/',
} satisfies ColumnDefinition<FieldTextMetadata>, } satisfies ColumnDefinition<FieldTextMetadata>,
{ {
key: 'city', fieldId: 'city',
name: 'City', label: 'City',
Icon: IconBuildingSkyscraper, Icon: IconBuildingSkyscraper,
size: 180, size: 180,
index: 0, position: 0,
type: 'text', type: 'text',
metadata: { metadata: {
fieldName: 'city', fieldName: 'city',

View File

@ -92,8 +92,8 @@ export const useUpdateCompanyBoard = () =>
const pipelineStages = pipeline?.pipelineStages ?? []; const pipelineStages = pipeline?.pipelineStages ?? [];
const orderedPipelineStages = [...pipelineStages].sort((a, b) => { const orderedPipelineStages = [...pipelineStages].sort((a, b) => {
if (!a.index || !b.index) return 0; if (!a.position || !b.position) return 0;
return a.index - b.index; return a.position - b.position;
}); });
const newBoardColumns: BoardColumnDefinition[] = const newBoardColumns: BoardColumnDefinition[] =
@ -110,7 +110,7 @@ export const useUpdateCompanyBoard = () =>
colorCode: isThemeColor(pipelineStage.color) colorCode: isThemeColor(pipelineStage.color)
? pipelineStage.color ? pipelineStage.color
: undefined, : undefined,
index: pipelineStage.index ?? 0, position: pipelineStage.position ?? 0,
}; };
}); });
if (currentBoardColumns.length === 0) { if (currentBoardColumns.length === 0) {

View File

@ -1,5 +1,7 @@
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { useRecoilCallback, useSetRecoilState } from 'recoil';
import { companiesAvailableFieldDefinitions } from '@/companies/constants/companiesAvailableFieldDefinitions';
import { getCompaniesOptimisticEffectDefinition } from '@/companies/graphql/optimistic-effect-definitions/getCompaniesOptimisticEffectDefinition'; import { getCompaniesOptimisticEffectDefinition } from '@/companies/graphql/optimistic-effect-definitions/getCompaniesOptimisticEffectDefinition';
import { useCompanyTableActionBarEntries } from '@/companies/hooks/useCompanyTableActionBarEntries'; import { useCompanyTableActionBarEntries } from '@/companies/hooks/useCompanyTableActionBarEntries';
import { useCompanyTableContextMenuEntries } from '@/companies/hooks/useCompanyTableContextMenuEntries'; import { useCompanyTableContextMenuEntries } from '@/companies/hooks/useCompanyTableContextMenuEntries';
@ -9,10 +11,13 @@ import { DataTableEffect } from '@/ui/data/data-table/components/DataTableEffect
import { TableContext } from '@/ui/data/data-table/contexts/TableContext'; import { TableContext } from '@/ui/data/data-table/contexts/TableContext';
import { useUpsertDataTableItem } from '@/ui/data/data-table/hooks/useUpsertDataTableItem'; import { useUpsertDataTableItem } from '@/ui/data/data-table/hooks/useUpsertDataTableItem';
import { TableOptionsDropdown } from '@/ui/data/data-table/options/components/TableOptionsDropdown'; import { TableOptionsDropdown } from '@/ui/data/data-table/options/components/TableOptionsDropdown';
import { tableColumnsScopedState } from '@/ui/data/data-table/states/tableColumnsScopedState';
import { ViewBar } from '@/views/components/ViewBar'; import { ViewBar } from '@/views/components/ViewBar';
import { useViewFields } from '@/views/hooks/internal/useViewFields'; import { useViewFields } from '@/views/hooks/internal/useViewFields';
import { useView } from '@/views/hooks/useView'; import { useView } from '@/views/hooks/useView';
import { ViewScope } from '@/views/scopes/ViewScope'; import { ViewScope } from '@/views/scopes/ViewScope';
import { columnDefinitionsToViewFields } from '@/views/utils/columnDefinitionToViewField';
import { viewFieldsToColumnDefinitions } from '@/views/utils/viewFieldsToColumnDefinitions';
import { import {
UpdateOneCompanyMutationVariables, UpdateOneCompanyMutationVariables,
useGetCompaniesQuery, useGetCompaniesQuery,
@ -26,13 +31,18 @@ import CompanyTableEffect from './CompanyTableEffect';
export const CompanyTable = () => { export const CompanyTable = () => {
const tableViewScopeId = 'company-table'; const tableViewScopeId = 'company-table';
const setTableColumns = useSetRecoilState(
tableColumnsScopedState('companies'),
);
const [updateEntityMutation] = useUpdateOneCompanyMutation(); const [updateEntityMutation] = useUpdateOneCompanyMutation();
const upsertDataTableItem = useUpsertDataTableItem(); const upsertDataTableItem = useUpsertDataTableItem();
const [getWorkspaceMember] = useGetWorkspaceMembersLazyQuery(); const [getWorkspaceMember] = useGetWorkspaceMembersLazyQuery();
const { persistViewFields } = useViewFields(tableViewScopeId); const { persistViewFields } = useViewFields(tableViewScopeId);
const { setCurrentViewFields } = useView({ viewScopeId: tableViewScopeId }); const { setCurrentViewFields, currentViewId } = useView({
viewScopeId: tableViewScopeId,
});
const { setContextMenuEntries } = useCompanyTableContextMenuEntries(); const { setContextMenuEntries } = useCompanyTableContextMenuEntries();
const { setActionBarEntries } = useCompanyTableActionBarEntries(); const { setActionBarEntries } = useCompanyTableActionBarEntries();
@ -77,14 +87,25 @@ export const CompanyTable = () => {
`; `;
return ( return (
<ViewScope viewScopeId={tableViewScopeId}> <ViewScope
viewScopeId={tableViewScopeId}
onViewFieldsChange={(viewFields) => {
setTableColumns(
viewFieldsToColumnDefinitions(
viewFields,
companiesAvailableFieldDefinitions,
),
);
}}
onViewFiltersChange={() => {}}
>
<StyledContainer> <StyledContainer>
<TableContext.Provider <TableContext.Provider
value={{ value={{
onColumnsChange: (columns) => { onColumnsChange: useRecoilCallback(() => (columns) => {
setCurrentViewFields?.(columns); setCurrentViewFields?.(columnDefinitionsToViewFields(columns));
persistViewFields(columns); persistViewFields(columnDefinitionsToViewFields(columns));
}, }),
}} }}
> >
<ViewBar <ViewBar

View File

@ -3,13 +3,9 @@ import { useEffect } from 'react';
import { companiesAvailableFieldDefinitions } from '@/companies/constants/companiesAvailableFieldDefinitions'; import { companiesAvailableFieldDefinitions } from '@/companies/constants/companiesAvailableFieldDefinitions';
import { availableTableColumnsScopedState } from '@/ui/data/data-table/states/availableTableColumnsScopedState'; import { availableTableColumnsScopedState } from '@/ui/data/data-table/states/availableTableColumnsScopedState';
import { TableRecoilScopeContext } from '@/ui/data/data-table/states/recoil-scope-contexts/TableRecoilScopeContext'; import { TableRecoilScopeContext } from '@/ui/data/data-table/states/recoil-scope-contexts/TableRecoilScopeContext';
import { tableColumnsScopedState } from '@/ui/data/data-table/states/tableColumnsScopedState';
import { tableFiltersScopedState } from '@/ui/data/data-table/states/tableFiltersScopedState';
import { tableSortsScopedState } from '@/ui/data/data-table/states/tableSortsScopedState';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState'; import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
import { useView } from '@/views/hooks/useView'; import { useView } from '@/views/hooks/useView';
import { useViewInternalStates } from '@/views/hooks/useViewInternalStates'; import { ViewType } from '@/views/types/ViewType';
import { ViewType } from '~/generated/graphql';
import { companyAvailableFilters } from '~/pages/companies/companies-filters'; import { companyAvailableFilters } from '~/pages/companies/companies-filters';
import { companyAvailableSorts } from '~/pages/companies/companies-sorts'; import { companyAvailableSorts } from '~/pages/companies/companies-sorts';
@ -21,23 +17,6 @@ const CompanyTableEffect = () => {
setViewType, setViewType,
setViewObjectId, setViewObjectId,
} = useView(); } = useView();
const { currentViewFields, currentViewSorts, currentViewFilters } =
useViewInternalStates();
const [, setTableColumns] = useRecoilScopedState(
tableColumnsScopedState,
TableRecoilScopeContext,
);
const [, setTableSorts] = useRecoilScopedState(
tableSortsScopedState,
TableRecoilScopeContext,
);
const [, setTableFilters] = useRecoilScopedState(
tableFiltersScopedState,
TableRecoilScopeContext,
);
const [, setAvailableTableColumns] = useRecoilScopedState( const [, setAvailableTableColumns] = useRecoilScopedState(
availableTableColumnsScopedState, availableTableColumnsScopedState,
@ -57,33 +36,32 @@ const CompanyTableEffect = () => {
setAvailableFilters, setAvailableFilters,
setAvailableSorts, setAvailableSorts,
setAvailableTableColumns, setAvailableTableColumns,
setTableColumns,
setViewObjectId, setViewObjectId,
setViewType, setViewType,
]); ]);
useEffect(() => { // useEffect(() => {
if (currentViewFields) { // if (currentViewFields) {
setTableColumns([...currentViewFields].sort((a, b) => a.index - b.index)); // setTableColumns([...currentViewFields].sort((a, b) => a.index - b.index));
} // }
}, [currentViewFields, setTableColumns]); // }, [currentViewFields, setTableColumns]);
useEffect(() => { // useEffect(() => {
if (currentViewSorts) { // if (currentViewSorts) {
setTableSorts(currentViewSorts); // setTableSorts(currentViewSorts);
} // }
}, [currentViewFields, currentViewSorts, setTableColumns, setTableSorts]); // }, [currentViewFields, currentViewSorts, setTableColumns, setTableSorts]);
useEffect(() => { // useEffect(() => {
if (currentViewFilters) { // if (currentViewFilters) {
setTableFilters(currentViewFilters); // setTableFilters(currentViewFilters);
} // }
}, [ // }, [
currentViewFields, // currentViewFields,
currentViewFilters, // currentViewFilters,
setTableColumns, // setTableColumns,
setTableFilters, // setTableFilters,
setTableSorts, // setTableSorts,
]); // ]);
return <></>; return <></>;
}; };

View File

@ -1,52 +1,30 @@
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import { IconArchive } from '@/ui/display/icon';
import { IconBuildingSkyscraper } from '@/ui/display/icon'; import { IconBuildingSkyscraper } from '@/ui/display/icon';
import { Button } from '@/ui/input/button/components/Button';
import { IconButton } from '@/ui/input/button/components/IconButton';
import NavItem from '@/ui/navigation/navbar/components/NavItem'; import NavItem from '@/ui/navigation/navbar/components/NavItem';
import { capitalize } from '~/utils/string/capitalize'; import { capitalize } from '~/utils/string/capitalize';
import { useCreateNewTempsCustomObject } from '../hooks/useCreateNewTempCustomObject';
import { useDeleteOneMetadataObject } from '../hooks/useDeleteOneMetadataObject';
import { useFindManyMetadataObjects } from '../hooks/useFindManyMetadataObjects'; import { useFindManyMetadataObjects } from '../hooks/useFindManyMetadataObjects';
export const MetadataObjectNavItems = () => { export const MetadataObjectNavItems = () => {
const { metadataObjects } = useFindManyMetadataObjects(); const { metadataObjects } = useFindManyMetadataObjects();
const createNewTempCustomObject = useCreateNewTempsCustomObject();
const { deleteOneMetadataObject } = useDeleteOneMetadataObject();
const navigate = useNavigate(); const navigate = useNavigate();
return ( return (
<> <>
<Button
title="+ Create new object"
variant="secondary"
onClick={createNewTempCustomObject}
/>
{metadataObjects {metadataObjects
.filter((metadataObject) => !!metadataObject.isActive) .filter((metadataObject) => !!metadataObject.isActive)
.map((metadataObject) => ( .map((metadataObject) => (
<div style={{ display: 'flex', flexDirection: 'row', width: '60%' }}> <NavItem
<IconButton key={metadataObject.id}
Icon={IconArchive} label={capitalize(metadataObject.namePlural)}
onClick={() => { to={`/objects/${metadataObject.namePlural}`}
deleteOneMetadataObject(metadataObject.id); Icon={IconBuildingSkyscraper}
}} onClick={() => {
/> navigate(`/objects/${metadataObject.namePlural}`);
<NavItem }}
key={metadataObject.id} />
label={capitalize(metadataObject.namePlural)}
to={`/objects/${metadataObject.namePlural}`}
Icon={IconBuildingSkyscraper}
onClick={() => {
navigate(`/objects/${metadataObject.namePlural}`);
}}
/>
</div>
))} ))}
</> </>
); );

View File

@ -128,7 +128,7 @@ export const ObjectShowPage = () => {
fieldDefinition: fieldDefinition:
formatMetadataFieldAsColumnDefinition({ formatMetadataFieldAsColumnDefinition({
field: metadataField, field: metadataField,
index: index, position: index,
metadataObject: foundMetadataObject, metadataObject: foundMetadataObject,
}), }),
useUpdateEntityMutation: useUpdateOneObjectMutation, useUpdateEntityMutation: useUpdateOneObjectMutation,

View File

@ -1,15 +1,9 @@
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { useRecoilCallback } from 'recoil';
import { DataTable } from '@/ui/data/data-table/components/DataTable'; import { DataTable } from '@/ui/data/data-table/components/DataTable';
import { TableContext } from '@/ui/data/data-table/contexts/TableContext'; import { TableContext } from '@/ui/data/data-table/contexts/TableContext';
import { TableOptionsDropdown } from '@/ui/data/data-table/options/components/TableOptionsDropdown'; import { TableOptionsDropdown } from '@/ui/data/data-table/options/components/TableOptionsDropdown';
import { tableColumnsScopedState } from '@/ui/data/data-table/states/tableColumnsScopedState';
import { ColumnDefinition } from '@/ui/data/data-table/types/ColumnDefinition';
import { FieldMetadata } from '@/ui/data/field/types/FieldMetadata';
import { ViewBar } from '@/views/components/ViewBar'; import { ViewBar } from '@/views/components/ViewBar';
import { useViewFields } from '@/views/hooks/internal/useViewFields';
import { useView } from '@/views/hooks/useView';
import { ViewScope } from '@/views/scopes/ViewScope'; import { ViewScope } from '@/views/scopes/ViewScope';
import { useUpdateOneObject } from '../hooks/useUpdateOneObject'; import { useUpdateOneObject } from '../hooks/useUpdateOneObject';
@ -37,9 +31,6 @@ export const ObjectTable = ({ objectNamePlural }: ObjectTableProps) => {
const viewScopeId = objectNamePlural ?? ''; const viewScopeId = objectNamePlural ?? '';
const { persistViewFields } = useViewFields(viewScopeId);
const { setCurrentViewFields } = useView({ viewScopeId: viewScopeId });
const updateEntity = ({ const updateEntity = ({
variables, variables,
}: { }: {
@ -56,27 +47,12 @@ export const ObjectTable = ({ objectNamePlural }: ObjectTableProps) => {
}); });
}; };
const updateTableColumns = useRecoilCallback(
({ set, snapshot }) =>
(viewFields: ColumnDefinition<FieldMetadata>[]) => {
set(tableColumnsScopedState(viewScopeId), viewFields);
},
);
return ( return (
<ViewScope <ViewScope viewScopeId={viewScopeId} onViewFieldsChange={() => {}}>
viewScopeId={viewScopeId}
onViewFieldsChange={(viewFields) => {
// updateTableColumns(viewFields);
}}
>
<StyledContainer> <StyledContainer>
<TableContext.Provider <TableContext.Provider
value={{ value={{
onColumnsChange: (columns) => { onColumnsChange: () => {},
// setCurrentViewFields?.(columns);
// persistViewFields(columns);
},
}} }}
> >
<ViewBar <ViewBar

View File

@ -3,13 +3,11 @@ import { useSetRecoilState } from 'recoil';
import { availableTableColumnsScopedState } from '@/ui/data/data-table/states/availableTableColumnsScopedState'; import { availableTableColumnsScopedState } from '@/ui/data/data-table/states/availableTableColumnsScopedState';
import { useView } from '@/views/hooks/useView'; import { useView } from '@/views/hooks/useView';
import { ViewType } from '~/generated/graphql'; import { ViewType } from '@/views/types/ViewType';
import { useMetadataObjectInContext } from '../hooks/useMetadataObjectInContext'; import { useMetadataObjectInContext } from '../hooks/useMetadataObjectInContext';
export const ObjectTableEffect = () => { export const ObjectTableEffect = () => {
console.log('ObjectTableEffect');
const { const {
setAvailableSorts, setAvailableSorts,
setAvailableFilters, setAvailableFilters,

View File

@ -1,208 +0,0 @@
import { getOperationName } from '@apollo/client/utilities';
import { ColumnDefinition } from '@/ui/data/data-table/types/ColumnDefinition';
import { FieldMetadata } from '@/ui/data/field/types/FieldMetadata';
import { FieldType } from '@/ui/data/field/types/FieldType';
import { IconBrandLinkedin } from '@/ui/display/icon';
import { GET_VIEW_FIELDS } from '@/views/graphql/queries/getViewFields';
import { GET_VIEWS } from '@/views/graphql/queries/getViews';
import { toViewFieldInput } from '@/views/hooks/internal/useViewFields';
import {
useCreateViewFieldsMutation,
useCreateViewMutation,
ViewType,
} from '~/generated/graphql';
import { useCreateOneMetadataField } from './useCreateOneMetadataField';
import { useCreateOneMetadataObject } from './useCreateOneMetadataObject';
import { useUpdateOneMetadataField } from './useUpdateOneMetadataField';
import { useUpdateOneMetadataObject } from './useUpdateOneMetadataObject';
const useCreateActiveMetadataField = () => {
const { createOneMetadataField } = useCreateOneMetadataField();
const { updateOneMetadataField } = useUpdateOneMetadataField();
return async ({
objectId,
label,
name,
type,
}: {
objectId: string;
label: string;
name: string;
type: FieldType;
}) => {
const { data: createdField } = await createOneMetadataField({
objectId: objectId,
label: label,
name: name,
type: type,
description: label,
icon: 'IconMap',
});
if (!createdField || !createdField.createOneField.name) {
throw new Error('Could not create metadata field');
}
await updateOneMetadataField({
fieldIdToUpdate: createdField?.createOneField?.id ?? '',
updatePayload: {
isActive: true,
},
});
return createdField.createOneField;
};
};
export const useCreateNewTempsCustomObject = () => {
const { createOneMetadataObject } = useCreateOneMetadataObject();
const { updateOneMetadataObject } = useUpdateOneMetadataObject();
const [createViewMutation] = useCreateViewMutation();
const [createViewFieldsMutation] = useCreateViewFieldsMutation();
const createActiveMetadataField = useCreateActiveMetadataField();
return async () => {
const date = new Date().toISOString().replace(/[\/:\.\-\_]/g, '');
const { data: createdMetadataObject } = await createOneMetadataObject({
labelPlural: 'Suppliers' + date,
labelSingular: 'Supplier' + date,
nameSingular: 'supplier' + date,
namePlural: 'suppliers' + date,
description: 'Suppliers' + date,
icon: 'IconBuilding',
});
const supplierObjectId = createdMetadataObject?.createOneObject?.id ?? '';
if (!createdMetadataObject) {
throw new Error('Could not create metadata object');
}
await updateOneMetadataObject({
idToUpdate: supplierObjectId,
updatePayload: {
isActive: true,
},
});
const nameFieldData = await createActiveMetadataField({
label: 'Name',
name: 'name',
objectId: supplierObjectId,
type: 'text',
});
const cityFieldData = await createActiveMetadataField({
label: 'City',
name: 'city',
objectId: supplierObjectId,
type: 'text',
});
const emailFieldData = await createActiveMetadataField({
label: 'Email',
name: 'email',
objectId: supplierObjectId,
type: 'email',
});
const phoneFieldData = await createActiveMetadataField({
label: 'Phone',
name: 'phone',
objectId: supplierObjectId,
type: 'phone',
});
const twitterFieldData = await createActiveMetadataField({
label: 'Twitter',
name: 'twitter',
objectId: supplierObjectId,
type: 'url',
});
const booleanFieldData = await createActiveMetadataField({
label: 'Boolean example',
name: 'boolexample',
objectId: supplierObjectId,
type: 'boolean',
});
const employeesFieldData = await createActiveMetadataField({
label: 'Employees',
name: 'employees',
objectId: supplierObjectId,
type: 'number',
});
const ARRFieldData = await createActiveMetadataField({
label: 'ARR',
name: 'arr',
objectId: supplierObjectId,
type: 'money',
});
const createdAt = await createActiveMetadataField({
label: 'Created at',
name: 'createdAt',
objectId: supplierObjectId,
type: 'date',
});
const objectId = 'suppliers' + date;
const { data: newView } = await createViewMutation({
variables: {
data: {
name: 'Default',
objectId: objectId,
type: ViewType.Table,
},
},
refetchQueries: [getOperationName(GET_VIEWS) ?? ''],
});
const createdFields = [
nameFieldData,
emailFieldData,
cityFieldData,
phoneFieldData,
twitterFieldData,
booleanFieldData,
employeesFieldData,
ARRFieldData,
createdAt,
];
const tempColumnDefinitions: ColumnDefinition<FieldMetadata>[] =
createdFields.map((field, index) => ({
index,
key: field.name,
name: field.label,
size: 100,
type: field.type as FieldType,
metadata: {
fieldName: field.name,
placeHolder: field.label,
},
Icon: IconBrandLinkedin,
isVisible: true,
})) ?? [];
await createViewFieldsMutation({
variables: {
data: tempColumnDefinitions.map((column) => ({
...toViewFieldInput(objectId, column),
viewId: newView?.view.id ?? '',
})),
},
refetchQueries: [getOperationName(GET_VIEW_FIELDS) ?? ''],
});
};
};

View File

@ -6,6 +6,7 @@ import {
MetadataObjectsQuery, MetadataObjectsQuery,
MetadataObjectsQueryVariables, MetadataObjectsQueryVariables,
} from '~/generated-metadata/graphql'; } from '~/generated-metadata/graphql';
import { logError } from '~/utils/logError';
import { FIND_MANY_METADATA_OBJECTS } from '../graphql/queries'; import { FIND_MANY_METADATA_OBJECTS } from '../graphql/queries';
import { formatPagedMetadataObjectsToMetadataObjects } from '../utils/formatPagedMetadataObjectsToMetadataObjects'; import { formatPagedMetadataObjectsToMetadataObjects } from '../utils/formatPagedMetadataObjectsToMetadataObjects';
@ -29,8 +30,7 @@ export const useFindManyMetadataObjects = () => {
client: apolloMetadataClient ?? undefined, client: apolloMetadataClient ?? undefined,
skip: !apolloMetadataClient, skip: !apolloMetadataClient,
onError: (error) => { onError: (error) => {
// eslint-disable-next-line no-console logError('useFindManyMetadataObjects error : ' + error);
console.error('useFindManyMetadataObjects error : ', error);
enqueueSnackBar( enqueueSnackBar(
`Error during useFindManyMetadataObjects, ${error.message}`, `Error during useFindManyMetadataObjects, ${error.message}`,
{ {
@ -38,10 +38,7 @@ export const useFindManyMetadataObjects = () => {
}, },
); );
}, },
onCompleted: (data) => { onCompleted: () => {},
// eslint-disable-next-line no-console
//console.log('useFindManyMetadataObjects data : ', data);
},
}, },
); );

View File

@ -2,6 +2,7 @@ import { useMemo } from 'react';
import { useQuery } from '@apollo/client'; import { useQuery } from '@apollo/client';
import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar'; import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
import { logError } from '~/utils/logError';
import { MetadataObjectIdentifier } from '../types/MetadataObjectIdentifier'; import { MetadataObjectIdentifier } from '../types/MetadataObjectIdentifier';
import { PaginatedObjectType } from '../types/PaginatedObjectType'; import { PaginatedObjectType } from '../types/PaginatedObjectType';
@ -41,10 +42,8 @@ export const useFindManyObjects = <
onCompleted: (data) => onCompleted: (data) =>
objectNamePlural && onCompleted?.(data[objectNamePlural]), objectNamePlural && onCompleted?.(data[objectNamePlural]),
onError: (error) => { onError: (error) => {
// eslint-disable-next-line no-console logError(
console.error( `useFindManyObjects for "${objectNamePlural}" error : ` + error,
`useFindManyObjects for "${objectNamePlural}" error : `,
error,
); );
enqueueSnackBar( enqueueSnackBar(
`Error during useFindManyObjects for "${objectNamePlural}", ${error.message}`, `Error during useFindManyObjects for "${objectNamePlural}", ${error.message}`,

View File

@ -8,6 +8,7 @@ import { formatMetadataFieldAsColumnDefinition } from '../utils/formatMetadataFi
import { generateCreateOneObjectMutation } from '../utils/generateCreateOneObjectMutation'; import { generateCreateOneObjectMutation } from '../utils/generateCreateOneObjectMutation';
import { generateFindManyCustomObjectsQuery } from '../utils/generateFindManyCustomObjectsQuery'; import { generateFindManyCustomObjectsQuery } from '../utils/generateFindManyCustomObjectsQuery';
import { generateFindOneCustomObjectQuery } from '../utils/generateFindOneCustomObjectQuery'; import { generateFindOneCustomObjectQuery } from '../utils/generateFindOneCustomObjectQuery';
import { generateUpdateOneObjectMutation } from '../utils/generateUpdateOneObjectMutation';
import { useFindManyMetadataObjects } from './useFindManyMetadataObjects'; import { useFindManyMetadataObjects } from './useFindManyMetadataObjects';
@ -30,7 +31,7 @@ export const useFindOneMetadataObject = ({
const columnDefinitions: ColumnDefinition<FieldMetadata>[] = const columnDefinitions: ColumnDefinition<FieldMetadata>[] =
foundMetadataObject?.fields.map((field, index) => foundMetadataObject?.fields.map((field, index) =>
formatMetadataFieldAsColumnDefinition({ formatMetadataFieldAsColumnDefinition({
index, position: index,
field, field,
metadataObject: foundMetadataObject, metadataObject: foundMetadataObject,
}), }),
@ -66,6 +67,16 @@ export const useFindOneMetadataObject = ({
} }
`; `;
const updateOneMutation = foundMetadataObject
? generateUpdateOneObjectMutation({
metadataObject: foundMetadataObject,
})
: gql`
mutation EmptyMutation {
empty
}
`;
// TODO: implement backend delete // TODO: implement backend delete
const deleteOneMutation = foundMetadataObject const deleteOneMutation = foundMetadataObject
? generateCreateOneObjectMutation({ ? generateCreateOneObjectMutation({
@ -84,6 +95,7 @@ export const useFindOneMetadataObject = ({
findManyQuery, findManyQuery,
findOneQuery, findOneQuery,
createOneMutation, createOneMutation,
updateOneMutation,
deleteOneMutation, deleteOneMutation,
loading, loading,
}; };

View File

@ -1,8 +1,7 @@
import { gql, useMutation } from '@apollo/client'; import { useMutation } from '@apollo/client';
import { getOperationName } from '@apollo/client/utilities'; import { getOperationName } from '@apollo/client/utilities';
import { MetadataObjectIdentifier } from '../types/MetadataObjectIdentifier'; import { MetadataObjectIdentifier } from '../types/MetadataObjectIdentifier';
import { generateUpdateOneObjectMutation } from '../utils/generateUpdateOneObjectMutation';
import { useFindOneMetadataObject } from './useFindOneMetadataObject'; import { useFindOneMetadataObject } from './useFindOneMetadataObject';
@ -10,24 +9,18 @@ export const useUpdateOneObject = ({
objectNamePlural, objectNamePlural,
objectNameSingular, objectNameSingular,
}: MetadataObjectIdentifier) => { }: MetadataObjectIdentifier) => {
const { foundMetadataObject, objectNotFoundInMetadata, findManyQuery } = const {
useFindOneMetadataObject({ foundMetadataObject,
objectNamePlural, objectNotFoundInMetadata,
objectNameSingular, findManyQuery,
}); updateOneMutation,
} = useFindOneMetadataObject({
const generatedMutation = foundMetadataObject objectNamePlural,
? generateUpdateOneObjectMutation({ objectNameSingular,
metadataObject: foundMetadataObject, });
})
: gql`
mutation EmptyMutation {
empty
}
`;
// TODO: type this with a minimal type at least with Record<string, any> // TODO: type this with a minimal type at least with Record<string, any>
const [mutate] = useMutation(generatedMutation, { const [mutate] = useMutation(updateOneMutation, {
refetchQueries: [getOperationName(findManyQuery) ?? ''], refetchQueries: [getOperationName(findManyQuery) ?? ''],
}); });

View File

@ -18,17 +18,17 @@ const parseFieldType = (fieldType: string): FieldType => {
}; };
export const formatMetadataFieldAsColumnDefinition = ({ export const formatMetadataFieldAsColumnDefinition = ({
index, position,
field, field,
metadataObject, metadataObject,
}: { }: {
index: number; position: number;
field: MetadataObject['fields'][0]; field: MetadataObject['fields'][0];
metadataObject: Omit<MetadataObject, 'fields'>; metadataObject: Omit<MetadataObject, 'fields'>;
}): ColumnDefinition<FieldMetadata> => ({ }): ColumnDefinition<FieldMetadata> => ({
index, position,
key: field.name, fieldId: field.id,
name: field.label, label: field.label,
size: 100, size: 100,
type: parseFieldType(field.type), type: parseFieldType(field.type),
metadata: { metadata: {

View File

@ -27,11 +27,11 @@ import { getLogoUrlFromDomainName } from '~/utils';
export const peopleAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[] = export const peopleAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[] =
[ [
{ {
key: 'displayName', fieldId: 'displayName',
name: 'People', label: 'People',
Icon: IconUser, Icon: IconUser,
size: 210, size: 210,
index: 0, position: 0,
type: 'double-text-chip', type: 'double-text-chip',
metadata: { metadata: {
firstValueFieldName: 'firstName', firstValueFieldName: 'firstName',
@ -45,12 +45,12 @@ export const peopleAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[]
basePathToShowPage: '/person/', basePathToShowPage: '/person/',
} satisfies ColumnDefinition<FieldDoubleTextChipMetadata>, } satisfies ColumnDefinition<FieldDoubleTextChipMetadata>,
{ {
key: 'email', fieldId: 'email',
name: 'Email', label: 'Email',
Icon: IconMail, Icon: IconMail,
size: 150, size: 150,
type: 'email', type: 'email',
index: 1, position: 1,
metadata: { metadata: {
fieldName: 'email', fieldName: 'email',
placeHolder: 'Email', // Hack: Fake character to prevent password-manager from filling the field placeHolder: 'Email', // Hack: Fake character to prevent password-manager from filling the field
@ -58,11 +58,11 @@ export const peopleAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[]
infoTooltipContent: 'Contacts Email.', infoTooltipContent: 'Contacts Email.',
} satisfies ColumnDefinition<FieldEmailMetadata>, } satisfies ColumnDefinition<FieldEmailMetadata>,
{ {
key: 'company', fieldId: 'company',
name: 'Company', label: 'Company',
Icon: IconBuildingSkyscraper, Icon: IconBuildingSkyscraper,
size: 150, size: 150,
index: 2, position: 2,
type: 'relation', type: 'relation',
metadata: { metadata: {
fieldName: 'company', fieldName: 'company',
@ -78,11 +78,11 @@ export const peopleAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[]
}, },
} satisfies ColumnDefinition<FieldRelationMetadata>, } satisfies ColumnDefinition<FieldRelationMetadata>,
{ {
key: 'phone', fieldId: 'phone',
name: 'Phone', label: 'Phone',
Icon: IconPhone, Icon: IconPhone,
size: 150, size: 150,
index: 3, position: 3,
type: 'phone', type: 'phone',
metadata: { metadata: {
fieldName: 'phone', fieldName: 'phone',
@ -91,11 +91,11 @@ export const peopleAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[]
infoTooltipContent: 'Contacts phone number.', infoTooltipContent: 'Contacts phone number.',
} satisfies ColumnDefinition<FieldPhoneMetadata>, } satisfies ColumnDefinition<FieldPhoneMetadata>,
{ {
key: 'createdAt', fieldId: 'createdAt',
name: 'Creation', label: 'Creation',
Icon: IconCalendarEvent, Icon: IconCalendarEvent,
size: 150, size: 150,
index: 4, position: 4,
type: 'date', type: 'date',
metadata: { metadata: {
fieldName: 'createdAt', fieldName: 'createdAt',
@ -103,11 +103,11 @@ export const peopleAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[]
infoTooltipContent: 'Date when the contact was added.', infoTooltipContent: 'Date when the contact was added.',
} satisfies ColumnDefinition<FieldDateMetadata>, } satisfies ColumnDefinition<FieldDateMetadata>,
{ {
key: 'city', fieldId: 'city',
name: 'City', label: 'City',
Icon: IconMap, Icon: IconMap,
size: 150, size: 150,
index: 5, position: 5,
type: 'text', type: 'text',
metadata: { metadata: {
fieldName: 'city', fieldName: 'city',
@ -116,11 +116,11 @@ export const peopleAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[]
infoTooltipContent: 'Contacts city.', infoTooltipContent: 'Contacts city.',
} satisfies ColumnDefinition<FieldTextMetadata>, } satisfies ColumnDefinition<FieldTextMetadata>,
{ {
key: 'jobTitle', fieldId: 'jobTitle',
name: 'Job title', label: 'Job title',
Icon: IconBriefcase, Icon: IconBriefcase,
size: 150, size: 150,
index: 6, position: 6,
type: 'text', type: 'text',
metadata: { metadata: {
fieldName: 'jobTitle', fieldName: 'jobTitle',
@ -129,11 +129,11 @@ export const peopleAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[]
infoTooltipContent: 'Contacts job title.', infoTooltipContent: 'Contacts job title.',
} satisfies ColumnDefinition<FieldTextMetadata>, } satisfies ColumnDefinition<FieldTextMetadata>,
{ {
key: 'linkedin', fieldId: 'linkedin',
name: 'LinkedIn', label: 'LinkedIn',
Icon: IconBrandLinkedin, Icon: IconBrandLinkedin,
size: 150, size: 150,
index: 7, position: 7,
type: 'url', type: 'url',
metadata: { metadata: {
fieldName: 'linkedinUrl', fieldName: 'linkedinUrl',
@ -142,11 +142,11 @@ export const peopleAvailableFieldDefinitions: ColumnDefinition<FieldMetadata>[]
infoTooltipContent: 'Contacts Linkedin account.', infoTooltipContent: 'Contacts Linkedin account.',
} satisfies ColumnDefinition<FieldURLMetadata>, } satisfies ColumnDefinition<FieldURLMetadata>,
{ {
key: 'x', fieldId: 'x',
name: 'Twitter', label: 'Twitter',
Icon: IconBrandX, Icon: IconBrandX,
size: 150, size: 150,
index: 8, position: 8,
type: 'url', type: 'url',
metadata: { metadata: {
fieldName: 'xUrl', fieldName: 'xUrl',

View File

@ -11,8 +11,6 @@ import { useUpsertDataTableItem } from '@/ui/data/data-table/hooks/useUpsertData
import { TableOptionsDropdown } from '@/ui/data/data-table/options/components/TableOptionsDropdown'; import { TableOptionsDropdown } from '@/ui/data/data-table/options/components/TableOptionsDropdown';
import { ViewBar } from '@/views/components/ViewBar'; import { ViewBar } from '@/views/components/ViewBar';
import { ViewBarEffect } from '@/views/components/ViewBarEffect'; import { ViewBarEffect } from '@/views/components/ViewBarEffect';
import { useViewFields } from '@/views/hooks/internal/useViewFields';
import { useView } from '@/views/hooks/useView';
import { ViewScope } from '@/views/scopes/ViewScope'; import { ViewScope } from '@/views/scopes/ViewScope';
import { import {
UpdateOnePersonMutationVariables, UpdateOnePersonMutationVariables,
@ -30,9 +28,6 @@ export const PeopleTable = () => {
const [updateEntityMutation] = useUpdateOnePersonMutation(); const [updateEntityMutation] = useUpdateOnePersonMutation();
const upsertDataTableItem = useUpsertDataTableItem(); const upsertDataTableItem = useUpsertDataTableItem();
const { persistViewFields } = useViewFields(tableViewScopeId);
const { setCurrentViewFields } = useView({ viewScopeId: tableViewScopeId });
const { setContextMenuEntries } = usePersonTableContextMenuEntries(); const { setContextMenuEntries } = usePersonTableContextMenuEntries();
const { setActionBarEntries } = usePersonTableActionBarEntries(); const { setActionBarEntries } = usePersonTableActionBarEntries();
@ -56,10 +51,7 @@ export const PeopleTable = () => {
<StyledContainer> <StyledContainer>
<TableContext.Provider <TableContext.Provider
value={{ value={{
onColumnsChange: (columns) => { onColumnsChange: () => {},
setCurrentViewFields?.(columns);
persistViewFields(columns);
},
}} }}
> >
<ViewBarEffect /> <ViewBarEffect />

View File

@ -4,12 +4,9 @@ import { peopleAvailableFieldDefinitions } from '@/people/constants/peopleAvaila
import { availableTableColumnsScopedState } from '@/ui/data/data-table/states/availableTableColumnsScopedState'; import { availableTableColumnsScopedState } from '@/ui/data/data-table/states/availableTableColumnsScopedState';
import { TableRecoilScopeContext } from '@/ui/data/data-table/states/recoil-scope-contexts/TableRecoilScopeContext'; import { TableRecoilScopeContext } from '@/ui/data/data-table/states/recoil-scope-contexts/TableRecoilScopeContext';
import { tableColumnsScopedState } from '@/ui/data/data-table/states/tableColumnsScopedState'; import { tableColumnsScopedState } from '@/ui/data/data-table/states/tableColumnsScopedState';
import { tableFiltersScopedState } from '@/ui/data/data-table/states/tableFiltersScopedState';
import { tableSortsScopedState } from '@/ui/data/data-table/states/tableSortsScopedState';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState'; import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
import { useView } from '@/views/hooks/useView'; import { useView } from '@/views/hooks/useView';
import { useViewInternalStates } from '@/views/hooks/useViewInternalStates'; import { ViewType } from '@/views/types/ViewType';
import { ViewType } from '~/generated/graphql';
import { peopleAvailableFilters } from '~/pages/people/people-filters'; import { peopleAvailableFilters } from '~/pages/people/people-filters';
import { peopleAvailableSorts } from '~/pages/people/people-sorts'; import { peopleAvailableSorts } from '~/pages/people/people-sorts';
@ -21,24 +18,12 @@ const PeopleTableEffect = () => {
setViewType, setViewType,
setViewObjectId, setViewObjectId,
} = useView(); } = useView();
const { currentViewFields, currentViewSorts, currentViewFilters } =
useViewInternalStates();
const [, setTableColumns] = useRecoilScopedState( const [, setTableColumns] = useRecoilScopedState(
tableColumnsScopedState, tableColumnsScopedState,
TableRecoilScopeContext, TableRecoilScopeContext,
); );
const [, setTableSorts] = useRecoilScopedState(
tableSortsScopedState,
TableRecoilScopeContext,
);
const [, setTableFilters] = useRecoilScopedState(
tableFiltersScopedState,
TableRecoilScopeContext,
);
const [, setAvailableTableColumns] = useRecoilScopedState( const [, setAvailableTableColumns] = useRecoilScopedState(
availableTableColumnsScopedState, availableTableColumnsScopedState,
TableRecoilScopeContext, TableRecoilScopeContext,
@ -61,29 +46,29 @@ const PeopleTableEffect = () => {
setViewObjectId, setViewObjectId,
setViewType, setViewType,
]); ]);
useEffect(() => { // useEffect(() => {
if (currentViewFields) { // if (currentViewFields) {
setTableColumns([...currentViewFields].sort((a, b) => a.index - b.index)); // setTableColumns([...currentViewFields].sort((a, b) => a.index - b.index));
} // }
}, [currentViewFields, setTableColumns]); // }, [currentViewFields, setTableColumns]);
useEffect(() => { // useEffect(() => {
if (currentViewSorts) { // if (currentViewSorts) {
setTableSorts(currentViewSorts); // setTableSorts(currentViewSorts);
} // }
}, [currentViewFields, currentViewSorts, setTableColumns, setTableSorts]); // }, [currentViewFields, currentViewSorts, setTableColumns, setTableSorts]);
useEffect(() => { // useEffect(() => {
if (currentViewFilters) { // if (currentViewFilters) {
setTableFilters(currentViewFilters); // setTableFilters(currentViewFilters);
} // }
}, [ // }, [
currentViewFields, // currentViewFields,
currentViewFilters, // currentViewFilters,
setTableColumns, // setTableColumns,
setTableFilters, // setTableFilters,
setTableSorts, // setTableSorts,
]); // ]);
return <></>; return <></>;
}; };

View File

@ -18,10 +18,10 @@ import { Person } from '~/generated/graphql';
export const pipelineAvailableFieldDefinitions: BoardFieldDefinition<FieldMetadata>[] = export const pipelineAvailableFieldDefinitions: BoardFieldDefinition<FieldMetadata>[] =
[ [
{ {
key: 'closeDate', fieldId: 'closeDate',
name: 'Close Date', label: 'Close Date',
Icon: IconCalendarEvent, Icon: IconCalendarEvent,
index: 0, position: 0,
type: 'date', type: 'date',
metadata: { metadata: {
fieldName: 'closeDate', fieldName: 'closeDate',
@ -31,10 +31,10 @@ export const pipelineAvailableFieldDefinitions: BoardFieldDefinition<FieldMetada
'Specified date by which an opportunity must be completed.', 'Specified date by which an opportunity must be completed.',
} satisfies BoardFieldDefinition<FieldDateMetadata>, } satisfies BoardFieldDefinition<FieldDateMetadata>,
{ {
key: 'amount', fieldId: 'amount',
name: 'Amount', label: 'Amount',
Icon: IconCurrencyDollar, Icon: IconCurrencyDollar,
index: 1, position: 1,
type: 'number', type: 'number',
metadata: { metadata: {
fieldName: 'amount', fieldName: 'amount',
@ -44,10 +44,10 @@ export const pipelineAvailableFieldDefinitions: BoardFieldDefinition<FieldMetada
infoTooltipContent: 'Potential monetary value of a business opportunity.', infoTooltipContent: 'Potential monetary value of a business opportunity.',
} satisfies BoardFieldDefinition<FieldNumberMetadata>, } satisfies BoardFieldDefinition<FieldNumberMetadata>,
{ {
key: 'probability', fieldId: 'probability',
name: 'Probability', label: 'Probability',
Icon: IconProgressCheck, Icon: IconProgressCheck,
index: 2, position: 2,
type: 'probability', type: 'probability',
metadata: { metadata: {
fieldName: 'probability', fieldName: 'probability',
@ -57,10 +57,10 @@ export const pipelineAvailableFieldDefinitions: BoardFieldDefinition<FieldMetada
"Level of certainty in the lead's potential to convert into a success.", "Level of certainty in the lead's potential to convert into a success.",
} satisfies BoardFieldDefinition<FieldProbabilityMetadata>, } satisfies BoardFieldDefinition<FieldProbabilityMetadata>,
{ {
key: 'pointOfContact', fieldId: 'pointOfContact',
name: 'Point of Contact', label: 'Point of Contact',
Icon: IconUser, Icon: IconUser,
index: 3, position: 3,
type: 'relation', type: 'relation',
metadata: { metadata: {
fieldName: 'pointOfContact', fieldName: 'pointOfContact',

View File

@ -10,7 +10,7 @@ export const GET_PIPELINES = gql`
id id
name name
color color
index position
} }
} }
} }

View File

@ -24,7 +24,7 @@ export const usePipelineStages = () => {
data: { data: {
color: boardColumn.colorCode ?? 'gray', color: boardColumn.colorCode ?? 'gray',
id: boardColumn.id, id: boardColumn.id,
index: boardColumn.index, position: boardColumn.position,
name: boardColumn.title, name: boardColumn.title,
pipeline: { connect: { id: currentPipeline.id } }, pipeline: { connect: { id: currentPipeline.id } },
type: 'ongoing', type: 'ongoing',

View File

@ -44,7 +44,7 @@ export const ColumnHead = ({ column }: ColumnHeadProps) => {
<StyledIcon> <StyledIcon>
{column.Icon && <column.Icon size={theme.icon.size.md} />} {column.Icon && <column.Icon size={theme.icon.size.md} />}
</StyledIcon> </StyledIcon>
<StyledText>{column.name}</StyledText> <StyledText>{column.label}</StyledText>
</StyledTitle> </StyledTitle>
</> </>
); );

View File

@ -21,7 +21,7 @@ export const ColumnHeadWithDropdown = ({
primaryColumnKey, primaryColumnKey,
}: ColumnHeadWithDropdownProps) => { }: ColumnHeadWithDropdownProps) => {
return ( return (
<DropdownScope dropdownScopeId={column.key + '-header'}> <DropdownScope dropdownScopeId={column.fieldId + '-header'}>
<Dropdown <Dropdown
clickableComponent={<ColumnHead column={column} />} clickableComponent={<ColumnHead column={column} />}
dropdownComponents={ dropdownComponents={
@ -34,7 +34,7 @@ export const ColumnHeadWithDropdown = ({
} }
dropdownOffset={{ x: -1 }} dropdownOffset={{ x: -1 }}
dropdownPlacement="bottom-start" dropdownPlacement="bottom-start"
dropdownHotkeyScope={{ scope: column.key + '-header' }} dropdownHotkeyScope={{ scope: column.fieldId + '-header' }}
/> />
</DropdownScope> </DropdownScope>
); );

View File

@ -51,7 +51,7 @@ export const DataTableCell = ({ cellIndex }: { cellIndex: number }) => {
<td onContextMenu={(event) => handleContextMenu(event)}> <td onContextMenu={(event) => handleContextMenu(event)}>
<FieldContext.Provider <FieldContext.Provider
value={{ value={{
recoilScopeId: currentRowId + columnDefinition.name, recoilScopeId: currentRowId + columnDefinition.label,
entityId: currentRowId, entityId: currentRowId,
fieldDefinition: columnDefinition, fieldDefinition: columnDefinition,
useUpdateEntityMutation: () => [updateEntityMutation, {}], useUpdateEntityMutation: () => [updateEntityMutation, {}],

View File

@ -46,7 +46,7 @@ export const DataTableColumnDropdownMenu = ({
handleColumnVisibilityChange(column); handleColumnVisibilityChange(column);
}; };
return column.key === primaryColumnKey ? ( return column.fieldId === primaryColumnKey ? (
<></> <></>
) : ( ) : (
<DropdownMenuItemsContainer> <DropdownMenuItemsContainer>

View File

@ -6,7 +6,6 @@ import { useOptimisticEffect } from '@/apollo/optimistic-effect/hooks/useOptimis
import { OptimisticEffectDefinition } from '@/apollo/optimistic-effect/types/OptimisticEffectDefinition'; import { OptimisticEffectDefinition } from '@/apollo/optimistic-effect/types/OptimisticEffectDefinition';
import { FilterDefinition } from '@/ui/data/filter/types/FilterDefinition'; import { FilterDefinition } from '@/ui/data/filter/types/FilterDefinition';
import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedValue'; import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedValue';
import { useView } from '@/views/hooks/useView';
import { import {
SortOrder, SortOrder,
useGetCompaniesQuery, useGetCompaniesQuery,
@ -40,7 +39,6 @@ export const DataTableEffect = ({
}) => { }) => {
const setDataTableData = useSetDataTableData(); const setDataTableData = useSetDataTableData();
const { registerOptimisticEffect } = useOptimisticEffect(); const { registerOptimisticEffect } = useOptimisticEffect();
const { setCurrentViewId } = useView();
const tableSortsOrderBy = useRecoilScopedValue( const tableSortsOrderBy = useRecoilScopedValue(
tableSortsOrderByScopedSelector, tableSortsOrderByScopedSelector,

View File

@ -134,7 +134,7 @@ export const DataTableHeader = () => {
if (nextWidth !== tableColumnsByKey[resizedFieldKey].size) { if (nextWidth !== tableColumnsByKey[resizedFieldKey].size) {
const nextColumns = tableColumns.map((column) => const nextColumns = tableColumns.map((column) =>
column.key === resizedFieldKey column.fieldId === resizedFieldKey
? { ...column, size: nextWidth } ? { ...column, size: nextWidth }
: column, : column,
); );
@ -152,7 +152,9 @@ export const DataTableHeader = () => {
onMouseUp: handleResizeHandlerEnd, onMouseUp: handleResizeHandlerEnd,
}); });
const primaryColumn = visibleTableColumns[0]; const primaryColumn = visibleTableColumns.find(
(column) => column.position === 0,
);
return ( return (
<StyledTableHead data-select-disable> <StyledTableHead data-select-disable>
@ -167,30 +169,32 @@ export const DataTableHeader = () => {
<SelectAllCheckbox /> <SelectAllCheckbox />
</th> </th>
{[...visibleTableColumns] {[...visibleTableColumns]
.sort((columnA, columnB) => columnA.index - columnB.index) .sort((columnA, columnB) => columnA.position - columnB.position)
.map((column, index) => ( .map((column) => (
<StyledColumnHeaderCell <StyledColumnHeaderCell
key={column.key} key={column.fieldId}
isResizing={resizedFieldKey === column.key} isResizing={resizedFieldKey === column.fieldId}
columnWidth={Math.max( columnWidth={Math.max(
tableColumnsByKey[column.key].size + tableColumnsByKey[column.fieldId].size +
(resizedFieldKey === column.key ? resizeFieldOffset : 0), (resizedFieldKey === column.fieldId ? resizeFieldOffset : 0),
COLUMN_MIN_WIDTH, COLUMN_MIN_WIDTH,
)} )}
> >
<StyledColumnHeadContainer> <StyledColumnHeadContainer>
<ColumnHeadWithDropdown <ColumnHeadWithDropdown
column={column} column={column}
isFirstColumn={index === 1} isFirstColumn={column.position === 1}
isLastColumn={index === visibleTableColumns.length - 1} isLastColumn={
primaryColumnKey={primaryColumn.key} column.position === visibleTableColumns.length - 1
}
primaryColumnKey={primaryColumn?.fieldId || ''}
/> />
</StyledColumnHeadContainer> </StyledColumnHeadContainer>
<StyledResizeHandler <StyledResizeHandler
className="cursor-col-resize" className="cursor-col-resize"
role="separator" role="separator"
onPointerDown={() => { onPointerDown={() => {
setResizedFieldKey(column.key); setResizedFieldKey(column.fieldId);
}} }}
/> />
</StyledColumnHeaderCell> </StyledColumnHeaderCell>

View File

@ -34,7 +34,7 @@ export const DataTableHeaderPlusButtonContent = () => {
<DropdownMenuItemsContainer> <DropdownMenuItemsContainer>
{hiddenTableColumns.map((column) => ( {hiddenTableColumns.map((column) => (
<MenuItem <MenuItem
key={column.key} key={column.fieldId}
iconButtons={[ iconButtons={[
{ {
Icon: IconPlus, Icon: IconPlus,
@ -42,7 +42,7 @@ export const DataTableHeaderPlusButtonContent = () => {
}, },
]} ]}
LeftIcon={column.Icon} LeftIcon={column.Icon}
text={column.name} text={column.label}
/> />
))} ))}
</DropdownMenuItemsContainer> </DropdownMenuItemsContainer>

View File

@ -39,10 +39,10 @@ export const DataTableRow = forwardRef<HTMLTableRowElement, DataTableRowProps>(
<CheckboxCell /> <CheckboxCell />
</td> </td>
{[...visibleTableColumns] {[...visibleTableColumns]
.sort((columnA, columnB) => columnA.index - columnB.index) .sort((columnA, columnB) => columnA.position - columnB.position)
.map((column, columnIndex) => { .map((column, columnIndex) => {
return ( return (
<ColumnContext.Provider value={column} key={column.key}> <ColumnContext.Provider value={column} key={column.fieldId}>
<DataTableCell cellIndex={columnIndex} /> <DataTableCell cellIndex={columnIndex} />
</ColumnContext.Provider> </ColumnContext.Provider>
); );

View File

@ -1,5 +1,5 @@
export const useMoveViewColumns = () => { export const useMoveViewColumns = () => {
const handleColumnMove = <T extends { index: number }>( const handleColumnMove = <T extends { position: number }>(
direction: 'left' | 'right', direction: 'left' | 'right',
currentArrayindex: number, currentArrayindex: number,
targetArray: T[], targetArray: T[],
@ -19,13 +19,17 @@ export const useMoveViewColumns = () => {
newArray[currentArrayindex] = { newArray[currentArrayindex] = {
...targetEntity, ...targetEntity,
index: currentEntity.index, index: currentEntity.position,
}; };
newArray[targetArrayIndex] = { newArray[targetArrayIndex] = {
...currentEntity, ...currentEntity,
index: targetEntity.index, index: targetEntity.position,
}; };
return newArray;
return newArray.map((column, index) => ({
...column,
position: index,
}));
} }
return targetArray; return targetArray;

View File

@ -4,13 +4,14 @@ import { useSetRecoilState } from 'recoil';
import { useMoveViewColumns } from '@/ui/data/data-table/hooks/useMoveViewColumns'; import { useMoveViewColumns } from '@/ui/data/data-table/hooks/useMoveViewColumns';
import { FieldMetadata } from '@/ui/data/field/types/FieldMetadata'; import { FieldMetadata } from '@/ui/data/field/types/FieldMetadata';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState'; import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedValue';
import { useView } from '@/views/hooks/useView'; import { useView } from '@/views/hooks/useView';
import { ViewFieldForVisibility } from '@/views/types/ViewFieldForVisibility';
import { TableContext } from '../contexts/TableContext'; import { TableContext } from '../contexts/TableContext';
import { availableTableColumnsScopedState } from '../states/availableTableColumnsScopedState'; import { availableTableColumnsScopedState } from '../states/availableTableColumnsScopedState';
import { TableRecoilScopeContext } from '../states/recoil-scope-contexts/TableRecoilScopeContext'; import { TableRecoilScopeContext } from '../states/recoil-scope-contexts/TableRecoilScopeContext';
import { savedTableColumnsFamilyState } from '../states/savedTableColumnsFamilyState'; import { savedTableColumnsFamilyState } from '../states/savedTableColumnsFamilyState';
import { visibleTableColumnsScopedSelector } from '../states/selectors/visibleTableColumnsScopedSelector';
import { tableColumnsScopedState } from '../states/tableColumnsScopedState'; import { tableColumnsScopedState } from '../states/tableColumnsScopedState';
import { ColumnDefinition } from '../types/ColumnDefinition'; import { ColumnDefinition } from '../types/ColumnDefinition';
@ -32,6 +33,10 @@ export const useTableColumns = () => {
TableRecoilScopeContext, TableRecoilScopeContext,
); );
const visibleTableColumns = useRecoilScopedValue(
visibleTableColumnsScopedSelector,
TableRecoilScopeContext,
);
const { handleColumnMove } = useMoveViewColumns(); const { handleColumnMove } = useMoveViewColumns();
const handleColumnsChange = useCallback( const handleColumnsChange = useCallback(
@ -44,27 +49,18 @@ export const useTableColumns = () => {
[onColumnsChange, setSavedTableColumns, setTableColumns], [onColumnsChange, setSavedTableColumns, setTableColumns],
); );
const handleColumnReorder = useCallback(
async (columns: ColumnDefinition<FieldMetadata>[]) => {
const updatedColumns = columns.map((column, index) => ({
...column,
index,
}));
await handleColumnsChange(updatedColumns);
},
[handleColumnsChange],
);
const handleColumnVisibilityChange = useCallback( const handleColumnVisibilityChange = useCallback(
async (viewField: ViewFieldForVisibility) => { async (
viewField: Omit<ColumnDefinition<FieldMetadata>, 'size' | 'position'>,
) => {
const isNewColumn = !tableColumns.some( const isNewColumn = !tableColumns.some(
(tableColumns) => tableColumns.key === viewField.key, (tableColumns) => tableColumns.fieldId === viewField.fieldId,
); );
if (isNewColumn) { if (isNewColumn) {
const newColumn = availableTableColumns.find( const newColumn = availableTableColumns.find(
(availableTableColumn) => availableTableColumn.key === viewField.key, (availableTableColumn) =>
availableTableColumn.fieldId === viewField.fieldId,
); );
if (!newColumn) return; if (!newColumn) return;
@ -76,7 +72,7 @@ export const useTableColumns = () => {
await handleColumnsChange(nextColumns); await handleColumnsChange(nextColumns);
} else { } else {
const nextColumns = tableColumns.map((previousColumn) => const nextColumns = tableColumns.map((previousColumn) =>
previousColumn.key === viewField.key previousColumn.fieldId === viewField.fieldId
? { ...previousColumn, isVisible: !viewField.isVisible } ? { ...previousColumn, isVisible: !viewField.isVisible }
: previousColumn, : previousColumn,
); );
@ -92,18 +88,31 @@ export const useTableColumns = () => {
direction: 'left' | 'right', direction: 'left' | 'right',
column: ColumnDefinition<FieldMetadata>, column: ColumnDefinition<FieldMetadata>,
) => { ) => {
const currentColumnArrayIndex = tableColumns.findIndex( const currentColumnArrayIndex = visibleTableColumns.findIndex(
(tableColumn) => tableColumn.key === column.key, (visibleColumn) => visibleColumn.fieldId === column.fieldId,
); );
const columns = handleColumnMove( const columns = handleColumnMove(
direction, direction,
currentColumnArrayIndex, currentColumnArrayIndex,
tableColumns, visibleTableColumns,
); );
await handleColumnsChange(columns); await handleColumnsChange(columns);
}, },
[tableColumns, handleColumnMove, handleColumnsChange], [visibleTableColumns, handleColumnMove, handleColumnsChange],
);
const handleColumnReorder = useCallback(
async (columns: ColumnDefinition<FieldMetadata>[]) => {
const updatedColumns = columns.map((column, index) => ({
...column,
position: index,
}));
await handleColumnsChange(updatedColumns);
},
[handleColumnsChange],
); );
return { return {

View File

@ -59,13 +59,17 @@ export const TableOptionsDropdownContent = ({
const handleReorderField: OnDragEndResponder = useCallback( const handleReorderField: OnDragEndResponder = useCallback(
(result) => { (result) => {
if (!result.destination || result.destination.index === 0) { if (
!result.destination ||
result.destination.index === 1 ||
result.source.index === 1
) {
return; return;
} }
const reorderFields = Array.from(visibleTableColumns); const reorderFields = [...visibleTableColumns];
const [removed] = reorderFields.splice(result.source.index, 1); const [removed] = reorderFields.splice(result.source.index - 1, 1);
reorderFields.splice(result.destination.index, 0, removed); reorderFields.splice(result.destination.index - 1, 0, removed);
handleColumnReorder(reorderFields); handleColumnReorder(reorderFields);
}, },

View File

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

View File

@ -12,5 +12,5 @@ export const savedTableColumnsByKeyFamilySelector = selectorFamily({
({ get }) => ({ get }) =>
get(savedTableColumnsFamilyState(viewId)).reduce< get(savedTableColumnsFamilyState(viewId)).reduce<
Record<string, ColumnDefinition<FieldMetadata>> Record<string, ColumnDefinition<FieldMetadata>>
>((result, column) => ({ ...result, [column.key]: column }), {}), >((result, column) => ({ ...result, [column.fieldId]: column }), {}),
}); });

View File

@ -12,5 +12,5 @@ export const tableColumnsByKeyScopedSelector = selectorFamily({
({ get }) => ({ get }) =>
get(tableColumnsScopedState(scopeId)).reduce< get(tableColumnsScopedState(scopeId)).reduce<
Record<string, ColumnDefinition<FieldMetadata>> Record<string, ColumnDefinition<FieldMetadata>>
>((result, column) => ({ ...result, [column.key]: column }), {}), >((result, column) => ({ ...result, [column.fieldId]: column }), {}),
}); });

View File

@ -7,7 +7,9 @@ export const visibleTableColumnsScopedSelector = selectorFamily({
get: get:
(scopeId: string) => (scopeId: string) =>
({ get }) => ({ get }) =>
get(tableColumnsScopedState(scopeId)).filter( [
(column) => column.isVisible, ...get(tableColumnsScopedState(scopeId)).filter(
), (column) => column.isVisible,
),
].sort((a, b) => a.position - b.position),
}); });

View File

@ -3,6 +3,7 @@ import { FieldMetadata } from '@/ui/data/field/types/FieldMetadata';
export type ColumnDefinition<T extends FieldMetadata> = FieldDefinition<T> & { export type ColumnDefinition<T extends FieldMetadata> = FieldDefinition<T> & {
size: number; size: number;
index: number; position: number;
isVisible?: boolean; isVisible?: boolean;
viewFieldId?: string;
}; };

View File

@ -10,8 +10,8 @@ export const useIsFieldEmpty = () => {
const isFieldEmpty = useRecoilValue( const isFieldEmpty = useRecoilValue(
isEntityFieldEmptyFamilySelector({ isEntityFieldEmptyFamilySelector({
fieldDefinition: { fieldDefinition: {
key: fieldDefinition.key, fieldId: fieldDefinition.fieldId,
name: fieldDefinition.name, label: fieldDefinition.label,
type: fieldDefinition.type, type: fieldDefinition.type,
metadata: fieldDefinition.metadata, metadata: fieldDefinition.metadata,
}, },

View File

@ -31,8 +31,8 @@ const DateFieldDisplayWithContext = ({
return ( return (
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'date', fieldId: 'date',
name: 'Date', label: 'Date',
type: 'date', type: 'date',
metadata: { metadata: {
fieldName: 'Date', fieldName: 'Date',

View File

@ -38,8 +38,8 @@ const DoubleTextFieldDisplayWithContext = ({
return ( return (
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'double-text', fieldId: 'double-text',
name: 'Double-Text', label: 'Double-Text',
type: 'double-text', type: 'double-text',
metadata: { metadata: {
firstValueFieldName: 'First-text', firstValueFieldName: 'First-text',

View File

@ -30,8 +30,8 @@ const EmailFieldDisplayWithContext = ({
return ( return (
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'email', fieldId: 'email',
name: 'Email', label: 'Email',
type: 'email', type: 'email',
metadata: { metadata: {
fieldName: 'Email', fieldName: 'Email',

View File

@ -32,8 +32,8 @@ const MoneyFieldDisplayWithContext = ({
return ( return (
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'money', fieldId: 'money',
name: 'Money', label: 'Money',
type: 'moneyAmount', type: 'moneyAmount',
metadata: { metadata: {
fieldName: 'Amount', fieldName: 'Amount',

View File

@ -32,8 +32,8 @@ const NumberFieldDisplayWithContext = ({
return ( return (
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'number', fieldId: 'number',
name: 'Number', label: 'Number',
type: 'number', type: 'number',
metadata: { metadata: {
fieldName: 'Number', fieldName: 'Number',

View File

@ -30,8 +30,8 @@ const PhoneFieldDisplayWithContext = ({
return ( return (
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'phone', fieldId: 'phone',
name: 'Phone', label: 'Phone',
type: 'phone', type: 'phone',
metadata: { metadata: {
fieldName: 'Phone', fieldName: 'Phone',

View File

@ -32,8 +32,8 @@ const TextFieldDisplayWithContext = ({
return ( return (
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'text', fieldId: 'text',
name: 'Text', label: 'Text',
type: 'text', type: 'text',
metadata: { metadata: {
fieldName: 'Text', fieldName: 'Text',

View File

@ -30,8 +30,8 @@ const URLFieldDisplayWithContext = ({
return ( return (
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'URL', fieldId: 'URL',
name: 'URL', label: 'URL',
type: 'url', type: 'url',
metadata: { metadata: {
fieldName: 'URL', fieldName: 'URL',

View File

@ -34,8 +34,8 @@ const BooleanFieldInputWithContext = ({
return ( return (
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'boolean', fieldId: 'boolean',
name: 'Boolean', label: 'Boolean',
type: 'boolean', type: 'boolean',
metadata: { metadata: {
fieldName: 'Boolean', fieldName: 'Boolean',

View File

@ -44,8 +44,8 @@ const ChipFieldInputWithContext = ({
<div> <div>
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'chip', fieldId: 'chip',
name: 'Chip', label: 'Chip',
type: 'chip', type: 'chip',
metadata: { metadata: {
contentFieldName: 'name', contentFieldName: 'name',

View File

@ -44,8 +44,8 @@ const DateFieldInputWithContext = ({
<div> <div>
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'date', fieldId: 'date',
name: 'Date', label: 'Date',
type: 'date', type: 'date',
metadata: { metadata: {
fieldName: 'Date', fieldName: 'Date',

View File

@ -57,8 +57,8 @@ const DoubleTextChipFieldInputWithContext = ({
<div> <div>
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'double-text-chip', fieldId: 'double-text-chip',
name: 'Double-Text-Chip', label: 'Double-Text-Chip',
type: 'double-text-chip', type: 'double-text-chip',
metadata: { metadata: {
firstValueFieldName: 'First-text', firstValueFieldName: 'First-text',

View File

@ -55,8 +55,8 @@ const DoubleTextFieldInputWithContext = ({
<div> <div>
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'double-text', fieldId: 'double-text',
name: 'Double-Text', label: 'Double-Text',
type: 'double-text', type: 'double-text',
metadata: { metadata: {
firstValueFieldName: 'First-text', firstValueFieldName: 'First-text',

View File

@ -43,8 +43,8 @@ const EmailFieldInputWithContext = ({
<div> <div>
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'email', fieldId: 'email',
name: 'Email', label: 'Email',
type: 'email', type: 'email',
metadata: { metadata: {
fieldName: 'email', fieldName: 'email',

View File

@ -43,8 +43,8 @@ const MoneyFieldInputWithContext = ({
<div> <div>
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'moneyAmount', fieldId: 'moneyAmount',
name: 'MoneyAmout', label: 'MoneyAmout',
type: 'moneyAmount', type: 'moneyAmount',
metadata: { metadata: {
fieldName: 'moneyAmount', fieldName: 'moneyAmount',

View File

@ -43,8 +43,8 @@ const NumberFieldInputWithContext = ({
<div> <div>
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'number', fieldId: 'number',
name: 'Number', label: 'Number',
type: 'number', type: 'number',
metadata: { metadata: {
fieldName: 'number', fieldName: 'number',

View File

@ -43,8 +43,8 @@ const PhoneFieldInputWithContext = ({
<div> <div>
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'phone', fieldId: 'phone',
name: 'Phone', label: 'Phone',
type: 'phone', type: 'phone',
metadata: { metadata: {
fieldName: 'Phone', fieldName: 'Phone',

View File

@ -41,8 +41,8 @@ const ProbabilityFieldInputWithContext = ({
return ( return (
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'probability', fieldId: 'probability',
name: 'Probability', label: 'Probability',
type: 'probability', type: 'probability',
metadata: { metadata: {
fieldName: 'Probability', fieldName: 'Probability',

View File

@ -46,8 +46,8 @@ const RelationFieldInputWithContext = ({
<div> <div>
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'relation', fieldId: 'relation',
name: 'Relation', label: 'Relation',
type: 'relation', type: 'relation',
metadata: { metadata: {
fieldName: 'Relation', fieldName: 'Relation',

View File

@ -43,8 +43,8 @@ const TextFieldInputWithContext = ({
<div> <div>
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'text', fieldId: 'text',
name: 'Text', label: 'Text',
type: 'text', type: 'text',
metadata: { metadata: {
fieldName: 'Text', fieldName: 'Text',

View File

@ -43,8 +43,8 @@ const URLFieldInputWithContext = ({
<div> <div>
<FieldContextProvider <FieldContextProvider
fieldDefinition={{ fieldDefinition={{
key: 'url', fieldId: 'url',
name: 'URL', label: 'URL',
type: 'url', type: 'url',
metadata: { metadata: {
fieldName: 'URL', fieldName: 'URL',

View File

@ -23,7 +23,7 @@ export const isEntityFieldEmptyFamilySelector = selectorFamily({
}: { }: {
fieldDefinition: Pick< fieldDefinition: Pick<
FieldDefinition<FieldMetadata>, FieldDefinition<FieldMetadata>,
'type' | 'metadata' | 'key' | 'name' 'type' | 'metadata' | 'fieldId' | 'label'
>; >;
entityId: string; entityId: string;
}) => { }) => {

View File

@ -5,8 +5,8 @@ import { FieldMetadata } from './FieldMetadata';
import { FieldType } from './FieldType'; import { FieldType } from './FieldType';
export type FieldDefinition<T extends FieldMetadata> = { export type FieldDefinition<T extends FieldMetadata> = {
key: string; fieldId: string;
name: string; label: string;
Icon?: IconComponent; Icon?: IconComponent;
type: FieldType; type: FieldType;
metadata: T; metadata: T;

View File

@ -6,7 +6,7 @@ import { SingleEntitySelectBase } from '@/ui/input/relation-picker/components/Si
import { EntityForSelect } from '@/ui/input/relation-picker/types/EntityForSelect'; import { EntityForSelect } from '@/ui/input/relation-picker/types/EntityForSelect';
import { useRemoveFilter } from '@/views/hooks/useRemoveFilter'; import { useRemoveFilter } from '@/views/hooks/useRemoveFilter';
import { useUpsertFilter } from '@/views/hooks/useUpsertFilter'; import { useUpsertFilter } from '@/views/hooks/useUpsertFilter';
import { ViewFilterOperand } from '~/generated/graphql'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { useFilter } from '../hooks/useFilter'; import { useFilter } from '../hooks/useFilter';

View File

@ -1,6 +1,6 @@
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
import { ViewFilterOperand } from '~/generated/graphql'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { useUpsertFilter } from '../../../../views/hooks/useUpsertFilter'; import { useUpsertFilter } from '../../../../views/hooks/useUpsertFilter';
import { useFilter } from '../hooks/useFilter'; import { useFilter } from '../hooks/useFilter';

View File

@ -6,7 +6,7 @@ import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { StyledHeaderDropdownButton } from '@/ui/layout/dropdown/components/StyledHeaderDropdownButton'; import { StyledHeaderDropdownButton } from '@/ui/layout/dropdown/components/StyledHeaderDropdownButton';
import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope'; import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope';
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
import { ViewFilterOperand } from '~/generated/graphql'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { useFilter } from '../hooks/useFilter'; import { useFilter } from '../hooks/useFilter';
import { getOperandsForFilterType } from '../utils/getOperandsForFilterType'; import { getOperandsForFilterType } from '../utils/getOperandsForFilterType';

View File

@ -1,5 +1,5 @@
import { createScopedState } from '@/ui/utilities/recoil-scope/utils/createScopedState'; import { createScopedState } from '@/ui/utilities/recoil-scope/utils/createScopedState';
import { ViewFilterOperand } from '~/generated/graphql'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
export const selectedOperandInDropdownScopedState = export const selectedOperandInDropdownScopedState =
createScopedState<ViewFilterOperand | null>({ createScopedState<ViewFilterOperand | null>({

View File

@ -1,4 +1,4 @@
import { ViewFilterOperand } from '~/generated/graphql'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { FilterType } from './FilterType'; import { FilterType } from './FilterType';

View File

@ -1 +1 @@
export { ViewFilterOperand as FilterOperand } from '~/generated/graphql'; export { ViewFilterOperand as FilterOperand } from '@/views/types/ViewFilterOperand';

View File

@ -1,4 +1,4 @@
import { ViewFilterOperand } from '~/generated/graphql'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
export const getOperandLabel = ( export const getOperandLabel = (
operand: ViewFilterOperand | null | undefined, operand: ViewFilterOperand | null | undefined,

View File

@ -1,4 +1,4 @@
import { ViewFilterOperand } from '~/generated/graphql'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { FilterType } from '../types/FilterType'; import { FilterType } from '../types/FilterType';

View File

@ -1,4 +1,5 @@
import { QueryMode, ViewFilterOperand } from '~/generated/graphql'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { QueryMode } from '~/generated/graphql';
import { Filter } from '../types/Filter'; import { Filter } from '../types/Filter';

View File

@ -49,7 +49,7 @@ type BoardOptionsMenu = 'fields' | 'stage-creation' | 'stages';
type ColumnForCreate = { type ColumnForCreate = {
id: string; id: string;
colorCode: ThemeColor; colorCode: ThemeColor;
index: number; position: number;
title: string; title: string;
}; };
@ -93,7 +93,7 @@ export const BoardOptionsDropdownContent = ({
const columnToCreate: ColumnForCreate = { const columnToCreate: ColumnForCreate = {
id: v4(), id: v4(),
colorCode: 'gray', colorCode: 'gray',
index: boardColumns.length, position: boardColumns.length,
title: stageInputRef.current.value, title: stageInputRef.current.value,
}; };

View File

@ -132,7 +132,7 @@ export const EntityBoard = ({
); );
const sortedBoardColumns = [...boardColumns].sort((a, b) => { const sortedBoardColumns = [...boardColumns].sort((a, b) => {
return a.index - b.index; return a.position - b.position;
}); });
const boardRef = useRef<HTMLDivElement>(null); const boardRef = useRef<HTMLDivElement>(null);
@ -155,8 +155,9 @@ export const EntityBoard = ({
value={{ value={{
id: column.id, id: column.id,
columnDefinition: column, columnDefinition: column,
isFirstColumn: column.index === 0, isFirstColumn: column.position === 0,
isLastColumn: column.index === sortedBoardColumns.length - 1, isLastColumn:
column.position === sortedBoardColumns.length - 1,
}} }}
> >
<RecoilScope <RecoilScope

View File

@ -1,5 +1,6 @@
import { ColumnDefinition } from '@/ui/data/data-table/types/ColumnDefinition';
import { FieldMetadata } from '@/ui/data/field/types/FieldMetadata';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState'; import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
import { ViewFieldForVisibility } from '@/views/types/ViewFieldForVisibility';
import { boardCardFieldsScopedState } from '../states/boardCardFieldsScopedState'; import { boardCardFieldsScopedState } from '../states/boardCardFieldsScopedState';
@ -13,10 +14,12 @@ export const useBoardCardFields = () => {
BoardRecoilScopeContext, BoardRecoilScopeContext,
); );
const handleFieldVisibilityChange = (field: ViewFieldForVisibility) => { const handleFieldVisibilityChange = (
field: Omit<ColumnDefinition<FieldMetadata>, 'size' | 'position'>,
) => {
setBoardCardFields((previousFields) => setBoardCardFields((previousFields) =>
previousFields.map((previousField) => previousFields.map((previousField) =>
previousField.key === field.key previousField.fieldId === field.fieldId
? { ...previousField, isVisible: !field.isVisible } ? { ...previousField, isVisible: !field.isVisible }
: previousField, : previousField,
), ),

View File

@ -21,7 +21,7 @@ export const useBoardColumns = () => {
updatePipelineStageMutation({ updatePipelineStageMutation({
variables: { variables: {
data: { data: {
index: stage.index, position: stage.position,
}, },
id: stage.id, id: stage.id,
}, },

View File

@ -12,5 +12,5 @@ export const boardCardFieldsByKeyScopedSelector = selectorFamily({
({ get }) => ({ get }) =>
get(boardCardFieldsScopedState(scopeId)).reduce< get(boardCardFieldsScopedState(scopeId)).reduce<
Record<string, BoardFieldDefinition<FieldMetadata>> Record<string, BoardFieldDefinition<FieldMetadata>>
>((result, field) => ({ ...result, [field.key]: field }), {}), >((result, field) => ({ ...result, [field.fieldId]: field }), {}),
}); });

View File

@ -9,10 +9,10 @@ export const hiddenBoardCardFieldsScopedSelector = selectorFamily({
(scopeId: string) => (scopeId: string) =>
({ get }) => { ({ get }) => {
const fields = get(boardCardFieldsScopedState(scopeId)); const fields = get(boardCardFieldsScopedState(scopeId));
const fieldKeys = fields.map(({ key }) => key); const fieldKeys = fields.map(({ fieldId }) => fieldId);
const otherAvailableKeys = get( const otherAvailableKeys = get(
availableBoardCardFieldsScopedState(scopeId), availableBoardCardFieldsScopedState(scopeId),
).filter(({ key }) => !fieldKeys.includes(key)); ).filter(({ fieldId }) => !fieldKeys.includes(fieldId));
return [ return [
...fields.filter((field) => !field.isVisible), ...fields.filter((field) => !field.isVisible),

View File

@ -12,5 +12,5 @@ export const savedBoardCardFieldsByKeyFamilySelector = selectorFamily({
({ get }) => ({ get }) =>
get(savedBoardCardFieldsFamilyState(viewId)).reduce< get(savedBoardCardFieldsFamilyState(viewId)).reduce<
Record<string, BoardFieldDefinition<FieldMetadata>> Record<string, BoardFieldDefinition<FieldMetadata>>
>((result, field) => ({ ...result, [field.key]: field }), {}), >((result, field) => ({ ...result, [field.fieldId]: field }), {}),
}); });

View File

@ -3,6 +3,6 @@ import { ThemeColor } from '@/ui/theme/constants/colors';
export type BoardColumnDefinition = { export type BoardColumnDefinition = {
id: string; id: string;
title: string; title: string;
index: number; position: number;
colorCode?: ThemeColor; colorCode?: ThemeColor;
}; };

View File

@ -3,6 +3,6 @@ import { FieldMetadata } from '@/ui/data/field/types/FieldMetadata';
export type BoardFieldDefinition<T extends FieldMetadata> = export type BoardFieldDefinition<T extends FieldMetadata> =
FieldDefinition<T> & { FieldDefinition<T> & {
index: number; position: number;
isVisible?: boolean; isVisible?: boolean;
}; };

View File

@ -4,25 +4,14 @@ import { useRecoilCallback } from 'recoil';
import { useFindManyObjects } from '@/metadata/hooks/useFindManyObjects'; import { useFindManyObjects } from '@/metadata/hooks/useFindManyObjects';
import { PaginatedObjectTypeResults } from '@/metadata/types/PaginatedObjectTypeResults'; import { PaginatedObjectTypeResults } from '@/metadata/types/PaginatedObjectTypeResults';
import { ColumnDefinition } from '@/ui/data/data-table/types/ColumnDefinition';
import { FieldMetadata } from '@/ui/data/field/types/FieldMetadata';
import { Filter } from '@/ui/data/filter/types/Filter';
import { Sort } from '@/ui/data/sort/types/Sort';
import {
useGetViewFiltersQuery,
useGetViewSortsQuery,
} from '~/generated/graphql';
import { assertNotNull } from '~/utils/assert'; import { assertNotNull } from '~/utils/assert';
import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
import { useView } from '../hooks/useView'; import { useView } from '../hooks/useView';
import { useViewInternalStates } from '../hooks/useViewInternalStates'; import { useViewInternalStates } from '../hooks/useViewInternalStates';
import { availableFieldsScopedState } from '../states/availableFieldsScopedState'; import { availableFieldsScopedState } from '../states/availableFieldsScopedState';
import { availableFiltersScopedState } from '../states/availableFiltersScopedState'; import { onViewFieldsChangeScopedState } from '../states/onViewFieldsChangeScopedState';
import { availableSortsScopedState } from '../states/availableSortsScopedState';
import { savedViewFieldsScopedFamilyState } from '../states/savedViewFieldsScopedFamilyState'; import { savedViewFieldsScopedFamilyState } from '../states/savedViewFieldsScopedFamilyState';
import { savedViewFiltersScopedFamilyState } from '../states/savedViewFiltersScopedFamilyState';
import { savedViewSortsScopedFamilyState } from '../states/savedViewSortsScopedFamilyState';
import { viewsScopedState } from '../states/viewsScopedState'; import { viewsScopedState } from '../states/viewsScopedState';
import { View } from '../types/View'; import { View } from '../types/View';
import { ViewField } from '../types/ViewField'; import { ViewField } from '../types/ViewField';
@ -32,10 +21,6 @@ export const ViewBarEffect = () => {
scopeId: viewScopeId, scopeId: viewScopeId,
setCurrentViewFields, setCurrentViewFields,
setSavedViewFields, setSavedViewFields,
setCurrentViewSorts,
setSavedViewSorts,
setCurrentViewFilters,
setSavedViewFilters,
currentViewId, currentViewId,
setViews, setViews,
changeView, changeView,
@ -56,6 +41,12 @@ export const ViewBarEffect = () => {
.getLoadable(availableFieldsScopedState({ scopeId: viewScopeId })) .getLoadable(availableFieldsScopedState({ scopeId: viewScopeId }))
.getValue(); .getValue();
const onViewFieldsChange = snapshot
.getLoadable(
onViewFieldsChangeScopedState({ scopeId: viewScopeId }),
)
.getValue();
if (!availableFields || !currentViewId) { if (!availableFields || !currentViewId) {
return; return;
} }
@ -70,27 +61,13 @@ export const ViewBarEffect = () => {
.getValue(); .getValue();
const queriedViewFields = data.edges const queriedViewFields = data.edges
.map<ColumnDefinition<FieldMetadata> | null>((viewField) => { .map((viewField) => viewField.node)
const columnDefinition = availableFields.find( .filter(assertNotNull);
({ key }) => viewField.node.fieldId === key,
);
return columnDefinition
? {
...columnDefinition,
key: viewField.node.fieldId,
name: viewField.node.fieldId,
index: viewField.node.position,
size: viewField.node.size ?? columnDefinition.size,
isVisible: viewField.node.isVisible,
}
: null;
})
.filter<ColumnDefinition<FieldMetadata>>(assertNotNull);
if (!isDeeplyEqual(savedViewFields, queriedViewFields)) { if (!isDeeplyEqual(savedViewFields, queriedViewFields)) {
setCurrentViewFields?.(queriedViewFields); setCurrentViewFields?.(queriedViewFields);
setSavedViewFields?.(queriedViewFields); setSavedViewFields?.(queriedViewFields);
onViewFieldsChange?.(queriedViewFields);
} }
}, },
), ),
@ -115,108 +92,108 @@ export const ViewBarEffect = () => {
if (!nextViews.length) return; if (!nextViews.length) return;
if (!currentViewId) return setCurrentViewId(nextViews[0].id); if (!currentViewId) return changeView(nextViews[0].id);
}, },
), ),
}); });
useGetViewSortsQuery({ // useGetViewSortsQuery({
skip: !currentViewId, // skip: !currentViewId,
variables: { // variables: {
where: { // where: {
viewId: { equals: currentViewId }, // viewId: { equals: currentViewId },
}, // },
}, // },
onCompleted: useRecoilCallback(({ snapshot }) => async (data) => { // onCompleted: useRecoilCallback(({ snapshot }) => async (data) => {
const availableSorts = snapshot // const availableSorts = snapshot
.getLoadable(availableSortsScopedState({ scopeId: viewScopeId })) // .getLoadable(availableSortsScopedState({ scopeId: viewScopeId }))
.getValue(); // .getValue();
if (!availableSorts || !currentViewId) { // if (!availableSorts || !currentViewId) {
return; // return;
} // }
const savedViewSorts = snapshot // const savedViewSorts = snapshot
.getLoadable( // .getLoadable(
savedViewSortsScopedFamilyState({ // savedViewSortsScopedFamilyState({
scopeId: viewScopeId, // scopeId: viewScopeId,
familyKey: currentViewId, // familyKey: currentViewId,
}), // }),
) // )
.getValue(); // .getValue();
const queriedViewSorts = data.viewSorts // const queriedViewSorts = data.viewSorts
.map((viewSort) => { // .map((viewSort) => {
const foundCorrespondingSortDefinition = availableSorts.find( // const foundCorrespondingSortDefinition = availableSorts.find(
(sort) => sort.key === viewSort.key, // (sort) => sort.key === viewSort.key,
); // );
if (foundCorrespondingSortDefinition) { // if (foundCorrespondingSortDefinition) {
return { // return {
key: viewSort.key, // key: viewSort.key,
definition: foundCorrespondingSortDefinition, // definition: foundCorrespondingSortDefinition,
direction: viewSort.direction.toLowerCase(), // direction: viewSort.direction.toLowerCase(),
} as Sort; // } as Sort;
} else { // } else {
return undefined; // return undefined;
} // }
}) // })
.filter((sort): sort is Sort => !!sort); // .filter((sort): sort is Sort => !!sort);
if (!isDeeplyEqual(savedViewSorts, queriedViewSorts)) { // if (!isDeeplyEqual(savedViewSorts, queriedViewSorts)) {
setSavedViewSorts?.(queriedViewSorts); // setSavedViewSorts?.(queriedViewSorts);
setCurrentViewSorts?.(queriedViewSorts); // setCurrentViewSorts?.(queriedViewSorts);
} // }
}), // }),
}); // });
useGetViewFiltersQuery({ // useGetViewFiltersQuery({
skip: !currentViewId, // skip: !currentViewId,
variables: { // variables: {
where: { // where: {
viewId: { equals: currentViewId }, // viewId: { equals: currentViewId },
}, // },
}, // },
onCompleted: useRecoilCallback(({ snapshot }) => (data) => { // onCompleted: useRecoilCallback(({ snapshot }) => (data) => {
const availableFilters = snapshot // const availableFilters = snapshot
.getLoadable(availableFiltersScopedState({ scopeId: viewScopeId })) // .getLoadable(availableFiltersScopedState({ scopeId: viewScopeId }))
.getValue(); // .getValue();
if (!availableFilters || !currentViewId) { // if (!availableFilters || !currentViewId) {
return; // return;
} // }
const savedViewFilters = snapshot // const savedViewFilters = snapshot
.getLoadable( // .getLoadable(
savedViewFiltersScopedFamilyState({ // savedViewFiltersScopedFamilyState({
scopeId: viewScopeId, // scopeId: viewScopeId,
familyKey: currentViewId, // familyKey: currentViewId,
}), // }),
) // )
.getValue(); // .getValue();
const queriedViewFilters = data.viewFilters // const queriedViewFilters = data.viewFilters
.map(({ __typename, name: _name, ...viewFilter }) => { // .map(({ __typename, name: _name, ...viewFilter }) => {
const availableFilter = availableFilters.find( // const availableFilter = availableFilters.find(
(filter) => filter.key === viewFilter.key, // (filter) => filter.key === viewFilter.key,
); // );
return availableFilter // return availableFilter
? { // ? {
...viewFilter, // ...viewFilter,
displayValue: viewFilter.displayValue ?? viewFilter.value, // displayValue: viewFilter.displayValue ?? viewFilter.value,
type: availableFilter.type, // type: availableFilter.type,
} // }
: undefined; // : undefined;
}) // })
.filter((filter): filter is Filter => !!filter); // .filter((filter): filter is Filter => !!filter);
if (!isDeeplyEqual(savedViewFilters, queriedViewFilters)) { // if (!isDeeplyEqual(savedViewFilters, queriedViewFilters)) {
setSavedViewFilters?.(queriedViewFilters); // setSavedViewFilters?.(queriedViewFilters);
setCurrentViewFilters?.(queriedViewFilters); // setCurrentViewFilters?.(queriedViewFilters);
} // }
}), // }),
}); // });
const currentViewIdFromUrl = searchParams.get('view'); const currentViewIdFromUrl = searchParams.get('view');

View File

@ -6,6 +6,8 @@ import {
ResponderProvided, ResponderProvided,
} from '@hello-pangea/dnd'; } from '@hello-pangea/dnd';
import { ColumnDefinition } from '@/ui/data/data-table/types/ColumnDefinition';
import { FieldMetadata } from '@/ui/data/field/types/FieldMetadata';
import { IconMinus, IconPlus } from '@/ui/display/icon'; import { IconMinus, IconPlus } from '@/ui/display/icon';
import { AppTooltip } from '@/ui/display/tooltip/AppTooltip'; import { AppTooltip } from '@/ui/display/tooltip/AppTooltip';
import { IconInfoCircle } from '@/ui/input/constants/icons'; import { IconInfoCircle } from '@/ui/input/constants/icons';
@ -18,11 +20,11 @@ import { MenuItemDraggable } from '@/ui/navigation/menu-item/components/MenuItem
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
import { ViewFieldForVisibility } from '../types/ViewFieldForVisibility';
type ViewFieldsVisibilityDropdownSectionProps = { type ViewFieldsVisibilityDropdownSectionProps = {
fields: ViewFieldForVisibility[]; fields: Omit<ColumnDefinition<FieldMetadata>, 'size'>[];
onVisibilityChange: (field: ViewFieldForVisibility) => void; onVisibilityChange: (
field: Omit<ColumnDefinition<FieldMetadata>, 'size' | 'position'>,
) => void;
title: string; title: string;
isDraggable: boolean; isDraggable: boolean;
onDragEnd?: OnDragEndResponder; onDragEnd?: OnDragEndResponder;
@ -46,7 +48,10 @@ export const ViewFieldsVisibilityDropdownSection = ({
else setOpenToolTipIndex(index); else setOpenToolTipIndex(index);
}; };
const getIconButtons = (index: number, field: ViewFieldForVisibility) => { const getIconButtons = (
index: number,
field: Omit<ColumnDefinition<FieldMetadata>, 'size' | 'position'>,
) => {
if (field.infoTooltipContent) { if (field.infoTooltipContent) {
return [ return [
{ {
@ -88,20 +93,20 @@ export const ViewFieldsVisibilityDropdownSection = ({
onDragEnd={handleOnDrag} onDragEnd={handleOnDrag}
draggableItems={ draggableItems={
<> <>
{fields {[...fields]
.filter(({ index, size }) => index !== 0 || !size) .sort((a, b) => a.position - b.position)
.map((field, index) => ( .map((field, index) => (
<DraggableItem <DraggableItem
key={field.key} key={field.fieldId}
draggableId={field.key} draggableId={field.fieldId}
index={index + 1} index={index + 1}
itemComponent={ itemComponent={
<MenuItemDraggable <MenuItemDraggable
key={field.key} key={field.fieldId}
LeftIcon={field.Icon} LeftIcon={field.Icon}
iconButtons={getIconButtons(index + 1, field)} iconButtons={getIconButtons(index + 1, field)}
isTooltipOpen={openToolTipIndex === index + 1} isTooltipOpen={openToolTipIndex === index + 1}
text={field.name} text={field.label}
className={`${title}-draggable-item-tooltip-anchor-${ className={`${title}-draggable-item-tooltip-anchor-${
index + 1 index + 1
}`} }`}
@ -115,11 +120,11 @@ export const ViewFieldsVisibilityDropdownSection = ({
) : ( ) : (
fields.map((field, index) => ( fields.map((field, index) => (
<MenuItem <MenuItem
key={field.key} key={field.fieldId}
LeftIcon={field.Icon} LeftIcon={field.Icon}
iconButtons={getIconButtons(index, field)} iconButtons={getIconButtons(index, field)}
isTooltipOpen={openToolTipIndex === index} isTooltipOpen={openToolTipIndex === index}
text={field.name} text={field.label}
className={`${title}-fixed-item-tooltip-anchor-${index}`} className={`${title}-fixed-item-tooltip-anchor-${index}`}
/> />
)) ))

View File

@ -1,12 +0,0 @@
import { gql } from '@apollo/client';
export const VIEW_FIELD_FRAGMENT = gql`
fragment ViewFieldFragment on ViewField {
index
isVisible
key
name
size
viewId
}
`;

View File

@ -1,10 +0,0 @@
import { gql } from '@apollo/client';
export const CREATE_VIEW = gql`
mutation CreateView($data: ViewCreateInput!) {
view: createOneView(data: $data) {
id
name
}
}
`;

View File

@ -1,9 +0,0 @@
import { gql } from '@apollo/client';
export const CREATE_VIEW_FIELDS = gql`
mutation CreateViewFields($data: [ViewFieldCreateManyInput!]!) {
createManyViewField(data: $data) {
count
}
}
`;

View File

@ -1,9 +0,0 @@
import { gql } from '@apollo/client';
export const CREATE_VIEW_FILTERS = gql`
mutation CreateViewFilters($data: [ViewFilterCreateManyInput!]!) {
createManyViewFilter(data: $data) {
count
}
}
`;

View File

@ -1,9 +0,0 @@
import { gql } from '@apollo/client';
export const CREATE_VIEW_SORTS = gql`
mutation CreateViewSorts($data: [ViewSortCreateManyInput!]!) {
createManyViewSort(data: $data) {
count
}
}
`;

View File

@ -1,10 +0,0 @@
import { gql } from '@apollo/client';
export const DELETE_VIEW = gql`
mutation DeleteView($where: ViewWhereUniqueInput!) {
view: deleteOneView(where: $where) {
id
name
}
}
`;

View File

@ -1,9 +0,0 @@
import { gql } from '@apollo/client';
export const DELETE_VIEW_FILTERS = gql`
mutation DeleteViewFilters($where: ViewFilterWhereInput!) {
deleteManyViewFilter(where: $where) {
count
}
}
`;

View File

@ -1,9 +0,0 @@
import { gql } from '@apollo/client';
export const DELETE_VIEW_SORTS = gql`
mutation DeleteViewSorts($where: ViewSortWhereInput!) {
deleteManyViewSort(where: $where) {
count
}
}
`;

View File

@ -1,10 +0,0 @@
import { gql } from '@apollo/client';
export const UPDATE_VIEW = gql`
mutation UpdateView($data: ViewUpdateInput!, $where: ViewWhereUniqueInput!) {
view: updateOneView(data: $data, where: $where) {
id
name
}
}
`;

View File

@ -1,12 +0,0 @@
import { gql } from '@apollo/client';
export const UPDATE_VIEW_FIELD = gql`
mutation UpdateViewField(
$data: ViewFieldUpdateInput!
$where: ViewFieldWhereUniqueInput!
) {
updateOneViewField(data: $data, where: $where) {
...ViewFieldFragment
}
}
`;

View File

@ -1,16 +0,0 @@
import { gql } from '@apollo/client';
export const UPDATE_VIEW_FILTER = gql`
mutation UpdateViewFilter(
$data: ViewFilterUpdateInput!
$where: ViewFilterWhereUniqueInput!
) {
viewFilter: updateOneViewFilter(data: $data, where: $where) {
displayValue
key
name
operand
value
}
}
`;

View File

@ -1,14 +0,0 @@
import { gql } from '@apollo/client';
export const UPDATE_VIEW_SORT = gql`
mutation UpdateViewSort(
$data: ViewSortUpdateInput!
$where: ViewSortWhereUniqueInput!
) {
viewSort: updateOneViewSort(data: $data, where: $where) {
direction
key
name
}
}
`;

Some files were not shown because too many files have changed in this diff Show More