Feat/object metadata item identifiers (#2865)
* Moved pure UI object fields to ui folder * Moved pure UI object fields to ui folder 2 * Updated graphql metadata schema and fixed typing issues * Added a new hook to create a record identifier mapper * Fixed merge main
This commit is contained in:
@ -13,14 +13,14 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/
|
|||||||
* Therefore it is highly recommended to use the babel or swc plugin for production.
|
* Therefore it is highly recommended to use the babel or swc plugin for production.
|
||||||
*/
|
*/
|
||||||
const documents = {
|
const documents = {
|
||||||
"\n mutation CreateOneObjectMetadataItem($input: CreateOneObjectInput!) {\n createOneObject(input: $input) {\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.CreateOneObjectMetadataItemDocument,
|
"\n mutation CreateOneObjectMetadataItem($input: CreateOneObjectInput!) {\n createOneObject(input: $input) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n": types.CreateOneObjectMetadataItemDocument,
|
||||||
"\n mutation CreateOneFieldMetadataItem($input: CreateOneFieldMetadataInput!) {\n createOneField(input: $input) {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\n defaultValue\n options\n }\n }\n": types.CreateOneFieldMetadataItemDocument,
|
"\n mutation CreateOneFieldMetadataItem($input: CreateOneFieldMetadataInput!) {\n createOneField(input: $input) {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\n defaultValue\n options\n }\n }\n": types.CreateOneFieldMetadataItemDocument,
|
||||||
"\n mutation CreateOneRelationMetadata($input: CreateOneRelationInput!) {\n createOneRelation(input: $input) {\n id\n relationType\n fromObjectMetadataId\n toObjectMetadataId\n fromFieldMetadataId\n toFieldMetadataId\n createdAt\n updatedAt\n }\n }\n": types.CreateOneRelationMetadataDocument,
|
"\n mutation CreateOneRelationMetadata($input: CreateOneRelationInput!) {\n createOneRelation(input: $input) {\n id\n relationType\n fromObjectMetadataId\n toObjectMetadataId\n fromFieldMetadataId\n toFieldMetadataId\n createdAt\n updatedAt\n }\n }\n": types.CreateOneRelationMetadataDocument,
|
||||||
"\n mutation UpdateOneFieldMetadataItem(\n $idToUpdate: ID!\n $updatePayload: UpdateFieldInput!\n ) {\n updateOneField(input: { id: $idToUpdate, update: $updatePayload }) {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\n }\n }\n": types.UpdateOneFieldMetadataItemDocument,
|
"\n mutation UpdateOneFieldMetadataItem(\n $idToUpdate: ID!\n $updatePayload: UpdateFieldInput!\n ) {\n updateOneField(input: { id: $idToUpdate, update: $updatePayload }) {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\n }\n }\n": types.UpdateOneFieldMetadataItemDocument,
|
||||||
"\n mutation UpdateOneObjectMetadataItem(\n $idToUpdate: ID!\n $updatePayload: UpdateObjectInput!\n ) {\n updateOneObject(input: { id: $idToUpdate, update: $updatePayload }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n }\n }\n": types.UpdateOneObjectMetadataItemDocument,
|
"\n mutation UpdateOneObjectMetadataItem(\n $idToUpdate: ID!\n $updatePayload: UpdateObjectInput!\n ) {\n updateOneObject(input: { id: $idToUpdate, update: $updatePayload }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n": types.UpdateOneObjectMetadataItemDocument,
|
||||||
"\n mutation DeleteOneObjectMetadataItem($idToDelete: ID!) {\n deleteOneObject(input: { id: $idToDelete }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n }\n }\n": types.DeleteOneObjectMetadataItemDocument,
|
"\n mutation DeleteOneObjectMetadataItem($idToDelete: ID!) {\n deleteOneObject(input: { id: $idToDelete }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n": types.DeleteOneObjectMetadataItemDocument,
|
||||||
"\n mutation DeleteOneFieldMetadataItem($idToDelete: ID!) {\n deleteOneField(input: { id: $idToDelete }) {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\n }\n }\n": types.DeleteOneFieldMetadataItemDocument,
|
"\n mutation DeleteOneFieldMetadataItem($idToDelete: ID!) {\n deleteOneField(input: { id: $idToDelete }) {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\n }\n }\n": types.DeleteOneFieldMetadataItemDocument,
|
||||||
"\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n": types.ObjectMetadataItemsDocument,
|
"\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n": types.ObjectMetadataItemsDocument,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,7 +40,7 @@ export function graphql(source: string): unknown;
|
|||||||
/**
|
/**
|
||||||
* 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 mutation CreateOneObjectMetadataItem($input: CreateOneObjectInput!) {\n createOneObject(input: $input) {\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"): (typeof documents)["\n mutation CreateOneObjectMetadataItem($input: CreateOneObjectInput!) {\n createOneObject(input: $input) {\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"];
|
export function graphql(source: "\n mutation CreateOneObjectMetadataItem($input: CreateOneObjectInput!) {\n createOneObject(input: $input) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n"): (typeof documents)["\n mutation CreateOneObjectMetadataItem($input: CreateOneObjectInput!) {\n createOneObject(input: $input) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n"];
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
*/
|
*/
|
||||||
@ -56,11 +56,11 @@ export function graphql(source: "\n mutation UpdateOneFieldMetadataItem(\n $
|
|||||||
/**
|
/**
|
||||||
* 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 mutation UpdateOneObjectMetadataItem(\n $idToUpdate: ID!\n $updatePayload: UpdateObjectInput!\n ) {\n updateOneObject(input: { id: $idToUpdate, update: $updatePayload }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n }\n }\n"): (typeof documents)["\n mutation UpdateOneObjectMetadataItem(\n $idToUpdate: ID!\n $updatePayload: UpdateObjectInput!\n ) {\n updateOneObject(input: { id: $idToUpdate, update: $updatePayload }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n }\n }\n"];
|
export function graphql(source: "\n mutation UpdateOneObjectMetadataItem(\n $idToUpdate: ID!\n $updatePayload: UpdateObjectInput!\n ) {\n updateOneObject(input: { id: $idToUpdate, update: $updatePayload }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n"): (typeof documents)["\n mutation UpdateOneObjectMetadataItem(\n $idToUpdate: ID!\n $updatePayload: UpdateObjectInput!\n ) {\n updateOneObject(input: { id: $idToUpdate, update: $updatePayload }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n"];
|
||||||
/**
|
/**
|
||||||
* 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 mutation DeleteOneObjectMetadataItem($idToDelete: ID!) {\n deleteOneObject(input: { id: $idToDelete }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n }\n }\n"): (typeof documents)["\n mutation DeleteOneObjectMetadataItem($idToDelete: ID!) {\n deleteOneObject(input: { id: $idToDelete }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n }\n }\n"];
|
export function graphql(source: "\n mutation DeleteOneObjectMetadataItem($idToDelete: ID!) {\n deleteOneObject(input: { id: $idToDelete }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n"): (typeof documents)["\n mutation DeleteOneObjectMetadataItem($idToDelete: ID!) {\n deleteOneObject(input: { id: $idToDelete }) {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n }\n }\n"];
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
*/
|
*/
|
||||||
@ -68,7 +68,7 @@ export function graphql(source: "\n mutation DeleteOneFieldMetadataItem($idToDe
|
|||||||
/**
|
/**
|
||||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||||
*/
|
*/
|
||||||
export function graphql(source: "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n"): (typeof documents)["\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n"];
|
export function graphql(source: "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n"): (typeof documents)["\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n }\n"];
|
||||||
|
|
||||||
export function graphql(source: string) {
|
export function graphql(source: string) {
|
||||||
return (documents as any)[source] ?? {};
|
return (documents as any)[source] ?? {};
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -300,9 +300,11 @@ export type ObjectDeleteResponse = {
|
|||||||
description?: Maybe<Scalars['String']>;
|
description?: Maybe<Scalars['String']>;
|
||||||
icon?: Maybe<Scalars['String']>;
|
icon?: Maybe<Scalars['String']>;
|
||||||
id?: Maybe<Scalars['ID']>;
|
id?: Maybe<Scalars['ID']>;
|
||||||
|
imageIdentifierFieldMetadataId?: Maybe<Scalars['String']>;
|
||||||
isActive?: Maybe<Scalars['Boolean']>;
|
isActive?: Maybe<Scalars['Boolean']>;
|
||||||
isCustom?: Maybe<Scalars['Boolean']>;
|
isCustom?: Maybe<Scalars['Boolean']>;
|
||||||
isSystem?: Maybe<Scalars['Boolean']>;
|
isSystem?: Maybe<Scalars['Boolean']>;
|
||||||
|
labelIdentifierFieldMetadataId?: Maybe<Scalars['String']>;
|
||||||
labelPlural?: Maybe<Scalars['String']>;
|
labelPlural?: Maybe<Scalars['String']>;
|
||||||
labelSingular?: Maybe<Scalars['String']>;
|
labelSingular?: Maybe<Scalars['String']>;
|
||||||
namePlural?: Maybe<Scalars['String']>;
|
namePlural?: Maybe<Scalars['String']>;
|
||||||
@ -566,9 +568,11 @@ export type Object = {
|
|||||||
fields: ObjectFieldsConnection;
|
fields: ObjectFieldsConnection;
|
||||||
icon?: Maybe<Scalars['String']>;
|
icon?: Maybe<Scalars['String']>;
|
||||||
id: Scalars['ID'];
|
id: Scalars['ID'];
|
||||||
|
imageIdentifierFieldMetadataId?: Maybe<Scalars['String']>;
|
||||||
isActive: Scalars['Boolean'];
|
isActive: Scalars['Boolean'];
|
||||||
isCustom: Scalars['Boolean'];
|
isCustom: Scalars['Boolean'];
|
||||||
isSystem: Scalars['Boolean'];
|
isSystem: Scalars['Boolean'];
|
||||||
|
labelIdentifierFieldMetadataId?: Maybe<Scalars['String']>;
|
||||||
labelPlural: Scalars['String'];
|
labelPlural: Scalars['String'];
|
||||||
labelSingular: Scalars['String'];
|
labelSingular: Scalars['String'];
|
||||||
namePlural: Scalars['String'];
|
namePlural: Scalars['String'];
|
||||||
|
|||||||
@ -82,6 +82,9 @@ export const useOpenCreateActivityDrawer = () => {
|
|||||||
setActivityTargetableEntityArray,
|
setActivityTargetableEntityArray,
|
||||||
setHotkeyScope,
|
setHotkeyScope,
|
||||||
setViewableActivityId,
|
setViewableActivityId,
|
||||||
|
createOneActivity,
|
||||||
|
createOneActivityTarget,
|
||||||
|
currentWorkspaceMember,
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -15,6 +15,8 @@ export const CREATE_ONE_OBJECT_METADATA_ITEM = gql`
|
|||||||
isActive
|
isActive
|
||||||
createdAt
|
createdAt
|
||||||
updatedAt
|
updatedAt
|
||||||
|
labelIdentifierFieldMetadataId
|
||||||
|
imageIdentifierFieldMetadataId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
@ -93,6 +95,8 @@ export const UPDATE_ONE_OBJECT_METADATA_ITEM = gql`
|
|||||||
isActive
|
isActive
|
||||||
createdAt
|
createdAt
|
||||||
updatedAt
|
updatedAt
|
||||||
|
labelIdentifierFieldMetadataId
|
||||||
|
imageIdentifierFieldMetadataId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
@ -112,6 +116,8 @@ export const DELETE_ONE_OBJECT_METADATA_ITEM = gql`
|
|||||||
isActive
|
isActive
|
||||||
createdAt
|
createdAt
|
||||||
updatedAt
|
updatedAt
|
||||||
|
labelIdentifierFieldMetadataId
|
||||||
|
imageIdentifierFieldMetadataId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@ -21,6 +21,8 @@ export const FIND_MANY_OBJECT_METADATA_ITEMS = gql`
|
|||||||
isSystem
|
isSystem
|
||||||
createdAt
|
createdAt
|
||||||
updatedAt
|
updatedAt
|
||||||
|
labelIdentifierFieldMetadataId
|
||||||
|
imageIdentifierFieldMetadataId
|
||||||
fields(paging: { first: 1000 }, filter: $fieldFilter) {
|
fields(paging: { first: 1000 }, filter: $fieldFilter) {
|
||||||
edges {
|
edges {
|
||||||
node {
|
node {
|
||||||
|
|||||||
@ -2,10 +2,10 @@ import { ApolloClient, useMutation } from '@apollo/client';
|
|||||||
import { getOperationName } from '@apollo/client/utilities';
|
import { getOperationName } from '@apollo/client/utilities';
|
||||||
|
|
||||||
import { FieldType } from '@/object-record/field/types/FieldType';
|
import { FieldType } from '@/object-record/field/types/FieldType';
|
||||||
import { FieldMetadataType } from '~/generated/graphql';
|
|
||||||
import {
|
import {
|
||||||
CreateOneFieldMetadataItemMutation,
|
CreateOneFieldMetadataItemMutation,
|
||||||
CreateOneFieldMetadataItemMutationVariables,
|
CreateOneFieldMetadataItemMutationVariables,
|
||||||
|
FieldMetadataType,
|
||||||
} from '~/generated-metadata/graphql';
|
} from '~/generated-metadata/graphql';
|
||||||
|
|
||||||
import { CREATE_ONE_FIELD_METADATA_ITEM } from '../graphql/mutations';
|
import { CREATE_ONE_FIELD_METADATA_ITEM } from '../graphql/mutations';
|
||||||
|
|||||||
@ -0,0 +1,68 @@
|
|||||||
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||||
|
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||||
|
import { ObjectRecordIdentifier } from '@/object-record/types/ObjectRecordIdentifier';
|
||||||
|
import { getLogoUrlFromDomainName } from '~/utils';
|
||||||
|
|
||||||
|
export const useMapToObjectRecordIdentifier = ({
|
||||||
|
objectMetadataItem,
|
||||||
|
}: {
|
||||||
|
objectMetadataItem: ObjectMetadataItem;
|
||||||
|
}) => {
|
||||||
|
return (record: any): ObjectRecordIdentifier => {
|
||||||
|
switch (objectMetadataItem.nameSingular) {
|
||||||
|
case CoreObjectNameSingular.WorkspaceMember:
|
||||||
|
case CoreObjectNameSingular.Person:
|
||||||
|
return {
|
||||||
|
id: record.id,
|
||||||
|
name:
|
||||||
|
(record.name?.firstName ?? '') +
|
||||||
|
' ' +
|
||||||
|
(record.name?.lastName ?? ''),
|
||||||
|
avatarUrl: record.avatarUrl,
|
||||||
|
avatarType: 'rounded',
|
||||||
|
};
|
||||||
|
case CoreObjectNameSingular.Opportunity:
|
||||||
|
return {
|
||||||
|
id: record.id,
|
||||||
|
name: record?.company?.name,
|
||||||
|
avatarUrl: record.avatarUrl,
|
||||||
|
avatarType: 'rounded',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const labelIdentifierFieldMetadata = objectMetadataItem.fields.find(
|
||||||
|
(field) =>
|
||||||
|
field.id === objectMetadataItem.labelIdentifierFieldMetadataId ||
|
||||||
|
field.name === 'name',
|
||||||
|
);
|
||||||
|
|
||||||
|
const labelIdentifierFieldValue = labelIdentifierFieldMetadata
|
||||||
|
? record[labelIdentifierFieldMetadata.name]
|
||||||
|
: null;
|
||||||
|
|
||||||
|
const imageIdentifierFieldMetadata = objectMetadataItem.fields.find(
|
||||||
|
(field) => field.id === objectMetadataItem.imageIdentifierFieldMetadataId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const imageIdentifierFieldValue = imageIdentifierFieldMetadata
|
||||||
|
? (record[imageIdentifierFieldMetadata.name] as string)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
const avatarType =
|
||||||
|
objectMetadataItem.nameSingular === CoreObjectNameSingular.Company
|
||||||
|
? 'squared'
|
||||||
|
: 'rounded';
|
||||||
|
|
||||||
|
const avatarUrl =
|
||||||
|
objectMetadataItem.nameSingular === CoreObjectNameSingular.Company
|
||||||
|
? getLogoUrlFromDomainName(imageIdentifierFieldValue ?? '')
|
||||||
|
: imageIdentifierFieldValue ?? null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: record.id,
|
||||||
|
name: labelIdentifierFieldValue,
|
||||||
|
avatarUrl,
|
||||||
|
avatarType,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
@ -3,6 +3,7 @@ import { useRecoilValue } from 'recoil';
|
|||||||
|
|
||||||
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
|
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
|
||||||
import { ObjectMetadataItemNotFoundError } from '@/object-metadata/errors/ObjectMetadataNotFoundError';
|
import { ObjectMetadataItemNotFoundError } from '@/object-metadata/errors/ObjectMetadataNotFoundError';
|
||||||
|
import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier';
|
||||||
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
|
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
|
||||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||||
@ -12,9 +13,7 @@ import { useGenerateFindOneRecordQuery } from '@/object-record/hooks/useGenerate
|
|||||||
import { useGenerateUpdateOneRecordMutation } from '@/object-record/hooks/useGenerateUpdateOneRecordMutation';
|
import { useGenerateUpdateOneRecordMutation } from '@/object-record/hooks/useGenerateUpdateOneRecordMutation';
|
||||||
import { useGetRecordFromCache } from '@/object-record/hooks/useGetRecordFromCache';
|
import { useGetRecordFromCache } from '@/object-record/hooks/useGetRecordFromCache';
|
||||||
import { useModifyRecordFromCache } from '@/object-record/hooks/useModifyRecordFromCache';
|
import { useModifyRecordFromCache } from '@/object-record/hooks/useModifyRecordFromCache';
|
||||||
import { ObjectRecordIdentifier } from '@/object-record/types/ObjectRecordIdentifier';
|
|
||||||
import { generateDeleteOneRecordMutation } from '@/object-record/utils/generateDeleteOneRecordMutation';
|
import { generateDeleteOneRecordMutation } from '@/object-record/utils/generateDeleteOneRecordMutation';
|
||||||
import { getLogoUrlFromDomainName } from '~/utils';
|
|
||||||
import { isDefined } from '~/utils/isDefined';
|
import { isDefined } from '~/utils/isDefined';
|
||||||
|
|
||||||
import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier';
|
import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier';
|
||||||
@ -63,42 +62,9 @@ export const useObjectMetadataItem = (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapToObjectRecordIdentifier = (record: any): ObjectRecordIdentifier => {
|
const mapToObjectRecordIdentifier = useMapToObjectRecordIdentifier({
|
||||||
if (objectNameSingular === 'company') {
|
objectMetadataItem,
|
||||||
return {
|
});
|
||||||
id: record.id,
|
|
||||||
name: record.name,
|
|
||||||
avatarUrl: getLogoUrlFromDomainName(record.domainName ?? ''),
|
|
||||||
avatarType: 'squared',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (['workspaceMember', 'person'].includes(objectNameSingular)) {
|
|
||||||
return {
|
|
||||||
id: record.id,
|
|
||||||
name:
|
|
||||||
(record.name?.firstName ?? '') + ' ' + (record.name?.lastName ?? ''),
|
|
||||||
avatarUrl: record.avatarUrl,
|
|
||||||
avatarType: 'rounded',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (['opportunity'].includes(objectNameSingular)) {
|
|
||||||
return {
|
|
||||||
id: record.id,
|
|
||||||
name: record?.company?.name,
|
|
||||||
avatarUrl: record.avatarUrl,
|
|
||||||
avatarType: 'rounded',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
id: record.id,
|
|
||||||
name: record.name,
|
|
||||||
avatarUrl: record.avatarUrl,
|
|
||||||
avatarType: 'rounded',
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
const getRecordFromCache = useGetRecordFromCache({
|
const getRecordFromCache = useGetRecordFromCache({
|
||||||
objectMetadataItem,
|
objectMetadataItem,
|
||||||
|
|||||||
@ -0,0 +1,6 @@
|
|||||||
|
export enum CoreObjectNameSingular {
|
||||||
|
Company = 'company',
|
||||||
|
Person = 'person',
|
||||||
|
WorkspaceMember = 'workspaceMember',
|
||||||
|
Opportunity = 'opportunity',
|
||||||
|
}
|
||||||
@ -3,6 +3,6 @@ import { AvatarType } from '@/users/components/Avatar';
|
|||||||
export type ObjectRecordIdentifier = {
|
export type ObjectRecordIdentifier = {
|
||||||
id: string;
|
id: string;
|
||||||
name: string;
|
name: string;
|
||||||
avatarUrl?: string;
|
avatarUrl?: string | null;
|
||||||
avatarType?: AvatarType;
|
avatarType?: AvatarType | null;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -7,8 +7,7 @@ import { FieldContext } from '@/object-record/field/contexts/FieldContext';
|
|||||||
import { BooleanFieldInput } from '@/object-record/field/meta-types/input/components/BooleanFieldInput';
|
import { BooleanFieldInput } from '@/object-record/field/meta-types/input/components/BooleanFieldInput';
|
||||||
import { RatingFieldInput } from '@/object-record/field/meta-types/input/components/RatingFieldInput';
|
import { RatingFieldInput } from '@/object-record/field/meta-types/input/components/RatingFieldInput';
|
||||||
import { Tag } from '@/ui/display/tag/components/Tag';
|
import { Tag } from '@/ui/display/tag/components/Tag';
|
||||||
import { Field } from '~/generated/graphql';
|
import { Field, FieldMetadataType } from '~/generated-metadata/graphql';
|
||||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
|
||||||
|
|
||||||
import { SettingsObjectFieldPreviewValueEffect } from '../components/SettingsObjectFieldPreviewValueEffect';
|
import { SettingsObjectFieldPreviewValueEffect } from '../components/SettingsObjectFieldPreviewValueEffect';
|
||||||
import { useFieldPreview } from '../hooks/useFieldPreview';
|
import { useFieldPreview } from '../hooks/useFieldPreview';
|
||||||
|
|||||||
@ -19,9 +19,11 @@ import { FieldMetadataType } from '~/generated-metadata/graphql';
|
|||||||
const defaultDateValue = new Date();
|
const defaultDateValue = new Date();
|
||||||
defaultDateValue.setFullYear(defaultDateValue.getFullYear() + 2);
|
defaultDateValue.setFullYear(defaultDateValue.getFullYear() + 2);
|
||||||
|
|
||||||
export const settingsFieldMetadataTypes: Record<
|
export const settingsFieldMetadataTypes: Partial<
|
||||||
FieldMetadataType,
|
Record<
|
||||||
{ label: string; Icon: IconComponent; defaultValue?: unknown }
|
FieldMetadataType,
|
||||||
|
{ label: string; Icon: IconComponent; defaultValue?: unknown }
|
||||||
|
>
|
||||||
> = {
|
> = {
|
||||||
[FieldMetadataType.Uuid]: {
|
[FieldMetadataType.Uuid]: {
|
||||||
label: 'Unique ID',
|
label: 'Unique ID',
|
||||||
|
|||||||
@ -44,7 +44,8 @@ export const useFieldPreview = ({
|
|||||||
skip: fieldMetadata.type !== FieldMetadataType.Relation,
|
skip: fieldMetadata.type !== FieldMetadataType.Relation,
|
||||||
});
|
});
|
||||||
|
|
||||||
const { defaultValue } = settingsFieldMetadataTypes[fieldMetadata.type];
|
const settingsFieldMetadataType =
|
||||||
|
settingsFieldMetadataTypes[fieldMetadata.type];
|
||||||
|
|
||||||
const defaultSelectValue = selectOptions?.[0];
|
const defaultSelectValue = selectOptions?.[0];
|
||||||
const selectValue =
|
const selectValue =
|
||||||
@ -67,6 +68,6 @@ export const useFieldPreview = ({
|
|||||||
? relationValue
|
? relationValue
|
||||||
: fieldMetadata.type === FieldMetadataType.Select
|
: fieldMetadata.type === FieldMetadataType.Select
|
||||||
? selectValue || defaultSelectValue
|
? selectValue || defaultSelectValue
|
||||||
: firstRecordFieldValue || defaultValue,
|
: firstRecordFieldValue || settingsFieldMetadataType?.defaultValue,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -13,7 +13,7 @@ import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope';
|
|||||||
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
|
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
|
||||||
|
|
||||||
type SettingsObjectFieldActiveActionDropdownProps = {
|
type SettingsObjectFieldActiveActionDropdownProps = {
|
||||||
isCustomField: boolean;
|
isCustomField?: boolean;
|
||||||
onDisable: () => void;
|
onDisable: () => void;
|
||||||
onEdit: () => void;
|
onEdit: () => void;
|
||||||
scopeKey: string;
|
scopeKey: string;
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { css, useTheme } from '@emotion/react';
|
import { css, useTheme } from '@emotion/react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
|
import { IconTwentyStar } from '@/ui/display/icon/components/IconTwentyStar';
|
||||||
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
|
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
|
||||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||||
|
|
||||||
@ -49,8 +50,8 @@ const StyledLabelContainer = styled.div`
|
|||||||
export const SettingsObjectFieldDataType = ({
|
export const SettingsObjectFieldDataType = ({
|
||||||
onClick,
|
onClick,
|
||||||
value,
|
value,
|
||||||
Icon = settingsFieldMetadataTypes[value].Icon,
|
Icon = settingsFieldMetadataTypes[value]?.Icon ?? IconTwentyStar,
|
||||||
label = settingsFieldMetadataTypes[value].label,
|
label = settingsFieldMetadataTypes[value]?.label,
|
||||||
}: SettingsObjectFieldDataTypeProps) => {
|
}: SettingsObjectFieldDataTypeProps) => {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope';
|
|||||||
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
|
import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem';
|
||||||
|
|
||||||
type SettingsObjectFieldDisabledActionDropdownProps = {
|
type SettingsObjectFieldDisabledActionDropdownProps = {
|
||||||
isCustomField: boolean;
|
isCustomField?: boolean;
|
||||||
onActivate: () => void;
|
onActivate: () => void;
|
||||||
onErase: () => void;
|
onErase: () => void;
|
||||||
scopeKey: string;
|
scopeKey: string;
|
||||||
|
|||||||
@ -2,6 +2,8 @@ import { DataSource } from 'typeorm';
|
|||||||
|
|
||||||
import { SeedWorkspaceId } from 'src/database/typeorm-seeds/core/workspaces';
|
import { SeedWorkspaceId } from 'src/database/typeorm-seeds/core/workspaces';
|
||||||
import { SeedDataSourceId } from 'src/database/typeorm-seeds/metadata/data-source';
|
import { SeedDataSourceId } from 'src/database/typeorm-seeds/metadata/data-source';
|
||||||
|
import { SeedCompanyFieldMetadataIds } from 'src/database/typeorm-seeds/metadata/field-metadata/company';
|
||||||
|
import { SeedPersonFieldMetadataIds } from 'src/database/typeorm-seeds/metadata/field-metadata/person';
|
||||||
|
|
||||||
const tableName = 'objectMetadata';
|
const tableName = 'objectMetadata';
|
||||||
|
|
||||||
@ -44,6 +46,8 @@ export const seedObjectMetadata = async (
|
|||||||
'workspaceId',
|
'workspaceId',
|
||||||
'isActive',
|
'isActive',
|
||||||
'isSystem',
|
'isSystem',
|
||||||
|
'labelIdentifierFieldMetadataId',
|
||||||
|
'imageIdentifierFieldMetadataId',
|
||||||
])
|
])
|
||||||
.orIgnore()
|
.orIgnore()
|
||||||
.values([
|
.values([
|
||||||
@ -60,6 +64,8 @@ export const seedObjectMetadata = async (
|
|||||||
workspaceId: SeedWorkspaceId,
|
workspaceId: SeedWorkspaceId,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
isSystem: false,
|
isSystem: false,
|
||||||
|
labelIdentifierFieldMetadataId: SeedCompanyFieldMetadataIds.Name,
|
||||||
|
imageIdentifierFieldMetadataId: SeedCompanyFieldMetadataIds.DomainName,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: SeedObjectMetadataIds.Person,
|
id: SeedObjectMetadataIds.Person,
|
||||||
@ -74,7 +80,31 @@ export const seedObjectMetadata = async (
|
|||||||
workspaceId: SeedWorkspaceId,
|
workspaceId: SeedWorkspaceId,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
isSystem: false,
|
isSystem: false,
|
||||||
|
labelIdentifierFieldMetadataId: SeedPersonFieldMetadataIds.Email,
|
||||||
|
imageIdentifierFieldMetadataId: SeedPersonFieldMetadataIds.AvatarUrl,
|
||||||
},
|
},
|
||||||
|
])
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
await workspaceDataSource
|
||||||
|
.createQueryBuilder()
|
||||||
|
.insert()
|
||||||
|
.into(`${schemaName}.${tableName}`, [
|
||||||
|
'id',
|
||||||
|
'nameSingular',
|
||||||
|
'namePlural',
|
||||||
|
'labelSingular',
|
||||||
|
'labelPlural',
|
||||||
|
'targetTableName',
|
||||||
|
'description',
|
||||||
|
'icon',
|
||||||
|
'dataSourceId',
|
||||||
|
'workspaceId',
|
||||||
|
'isActive',
|
||||||
|
'isSystem',
|
||||||
|
])
|
||||||
|
.orIgnore()
|
||||||
|
.values([
|
||||||
{
|
{
|
||||||
id: SeedObjectMetadataIds.Opportunity,
|
id: SeedObjectMetadataIds.Opportunity,
|
||||||
nameSingular: 'opportunity',
|
nameSingular: 'opportunity',
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { Field, HideField, InputType } from '@nestjs/graphql';
|
import { Field, HideField, InputType } from '@nestjs/graphql';
|
||||||
|
|
||||||
import { BeforeCreateOne } from '@ptc-org/nestjs-query-graphql';
|
import { BeforeCreateOne } from '@ptc-org/nestjs-query-graphql';
|
||||||
import { IsNotEmpty, IsOptional, IsString } from 'class-validator';
|
import { IsNotEmpty, IsOptional, IsString, IsUUID } from 'class-validator';
|
||||||
|
|
||||||
import { BeforeCreateOneObject } from 'src/metadata/object-metadata/hooks/before-create-one-object.hook';
|
import { BeforeCreateOneObject } from 'src/metadata/object-metadata/hooks/before-create-one-object.hook';
|
||||||
|
|
||||||
@ -43,4 +43,14 @@ export class CreateObjectInput {
|
|||||||
|
|
||||||
@HideField()
|
@HideField()
|
||||||
workspaceId: string;
|
workspaceId: string;
|
||||||
|
|
||||||
|
@IsUUID()
|
||||||
|
@IsOptional()
|
||||||
|
@Field({ nullable: true })
|
||||||
|
labelIdentifierFieldMetadataId?: string;
|
||||||
|
|
||||||
|
@IsUUID()
|
||||||
|
@IsOptional()
|
||||||
|
@Field({ nullable: true })
|
||||||
|
imageIdentifierFieldMetadataId?: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -67,4 +67,10 @@ export class ObjectMetadataDTO {
|
|||||||
|
|
||||||
@Field()
|
@Field()
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
|
|
||||||
|
@Field({ nullable: true })
|
||||||
|
labelIdentifierFieldMetadataId: string;
|
||||||
|
|
||||||
|
@Field({ nullable: true })
|
||||||
|
imageIdentifierFieldMetadataId: string;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user