Add field description+label translations (#9899)
Add translations for field descriptions
This commit is contained in:
@ -1,3 +1,4 @@
|
||||
import { msg } from '@lingui/core/macro';
|
||||
import { FieldMetadataType } from 'twenty-shared';
|
||||
|
||||
import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator';
|
||||
@ -10,8 +11,8 @@ export abstract class BaseWorkspaceEntity {
|
||||
@WorkspaceField({
|
||||
standardId: BASE_OBJECT_STANDARD_FIELD_IDS.id,
|
||||
type: FieldMetadataType.UUID,
|
||||
label: 'Id',
|
||||
description: 'Id',
|
||||
label: msg`Id`,
|
||||
description: msg`Id`,
|
||||
defaultValue: 'uuid',
|
||||
icon: 'Icon123',
|
||||
})
|
||||
@ -22,8 +23,8 @@ export abstract class BaseWorkspaceEntity {
|
||||
@WorkspaceField({
|
||||
standardId: BASE_OBJECT_STANDARD_FIELD_IDS.createdAt,
|
||||
type: FieldMetadataType.DATE_TIME,
|
||||
label: 'Creation date',
|
||||
description: 'Creation date',
|
||||
label: msg`Creation date`,
|
||||
description: msg`Creation date`,
|
||||
icon: 'IconCalendar',
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
@ -35,8 +36,8 @@ export abstract class BaseWorkspaceEntity {
|
||||
@WorkspaceField({
|
||||
standardId: BASE_OBJECT_STANDARD_FIELD_IDS.updatedAt,
|
||||
type: FieldMetadataType.DATE_TIME,
|
||||
label: 'Last update',
|
||||
description: 'Last time the record was changed',
|
||||
label: msg`Last update`,
|
||||
description: msg`Last time the record was changed`,
|
||||
icon: 'IconCalendarClock',
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
@ -48,8 +49,8 @@ export abstract class BaseWorkspaceEntity {
|
||||
@WorkspaceField({
|
||||
standardId: BASE_OBJECT_STANDARD_FIELD_IDS.deletedAt,
|
||||
type: FieldMetadataType.DATE_TIME,
|
||||
label: 'Deleted at',
|
||||
description: 'Date when the record was deleted',
|
||||
label: msg`Deleted at`,
|
||||
description: msg`Date when the record was deleted`,
|
||||
icon: 'IconCalendarMinus',
|
||||
settings: {
|
||||
displayAsRelativeDate: true,
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
import { msg } from '@lingui/core/macro';
|
||||
import { FieldMetadataType } from 'twenty-shared';
|
||||
|
||||
import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/constants/search-vector-field.constants';
|
||||
@ -39,8 +40,8 @@ export const SEARCH_FIELDS_FOR_CUSTOM_OBJECT: FieldTypeAndNameMetadata[] = [
|
||||
export class CustomWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
@WorkspaceField({
|
||||
standardId: CUSTOM_OBJECT_STANDARD_FIELD_IDS.name,
|
||||
label: 'Name',
|
||||
description: 'Name',
|
||||
label: msg`Name`,
|
||||
description: msg`Name`,
|
||||
type: FieldMetadataType.TEXT,
|
||||
icon: 'IconAbc',
|
||||
})
|
||||
@ -48,8 +49,8 @@ export class CustomWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
|
||||
@WorkspaceField({
|
||||
standardId: CUSTOM_OBJECT_STANDARD_FIELD_IDS.position,
|
||||
label: 'Position',
|
||||
description: 'Position',
|
||||
label: msg`Position`,
|
||||
description: msg`Position`,
|
||||
type: FieldMetadataType.POSITION,
|
||||
icon: 'IconHierarchy2',
|
||||
defaultValue: 0,
|
||||
@ -60,9 +61,9 @@ export class CustomWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
@WorkspaceField({
|
||||
standardId: CUSTOM_OBJECT_STANDARD_FIELD_IDS.createdBy,
|
||||
type: FieldMetadataType.ACTOR,
|
||||
label: 'Created by',
|
||||
label: msg`Created by`,
|
||||
icon: 'IconCreativeCommonsSa',
|
||||
description: 'The creator of the record',
|
||||
description: msg`The creator of the record`,
|
||||
defaultValue: {
|
||||
source: `'${FieldActorSource.MANUAL}'`,
|
||||
name: "''",
|
||||
@ -72,10 +73,13 @@ export class CustomWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
|
||||
@WorkspaceRelation({
|
||||
standardId: CUSTOM_OBJECT_STANDARD_FIELD_IDS.noteTargets,
|
||||
label: 'Notes',
|
||||
label: msg`Notes`,
|
||||
type: RelationMetadataType.ONE_TO_MANY,
|
||||
description: (objectMetadata) =>
|
||||
`Notes tied to the ${objectMetadata.labelSingular}`,
|
||||
description: (objectMetadata) => {
|
||||
const label = objectMetadata.labelSingular;
|
||||
|
||||
return msg`Notes tied to the ${label}`;
|
||||
},
|
||||
icon: 'IconNotes',
|
||||
inverseSideTarget: () => NoteTargetWorkspaceEntity,
|
||||
onDelete: RelationOnDeleteAction.CASCADE,
|
||||
@ -85,10 +89,13 @@ export class CustomWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
|
||||
@WorkspaceRelation({
|
||||
standardId: CUSTOM_OBJECT_STANDARD_FIELD_IDS.taskTargets,
|
||||
label: 'Tasks',
|
||||
label: msg`Tasks`,
|
||||
type: RelationMetadataType.ONE_TO_MANY,
|
||||
description: (objectMetadata) =>
|
||||
`Tasks tied to the ${objectMetadata.labelSingular}`,
|
||||
description: (objectMetadata) => {
|
||||
const label = objectMetadata.labelSingular;
|
||||
|
||||
return msg`Tasks tied to the ${label}`;
|
||||
},
|
||||
icon: 'IconCheckbox',
|
||||
inverseSideTarget: () => TaskTargetWorkspaceEntity,
|
||||
onDelete: RelationOnDeleteAction.CASCADE,
|
||||
@ -98,10 +105,13 @@ export class CustomWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
|
||||
@WorkspaceRelation({
|
||||
standardId: CUSTOM_OBJECT_STANDARD_FIELD_IDS.favorites,
|
||||
label: 'Favorites',
|
||||
label: msg`Favorites`,
|
||||
type: RelationMetadataType.ONE_TO_MANY,
|
||||
description: (objectMetadata) =>
|
||||
`Favorites tied to the ${objectMetadata.labelSingular}`,
|
||||
description: (objectMetadata) => {
|
||||
const label = objectMetadata.labelSingular;
|
||||
|
||||
return msg`Favorites tied to the ${label}`;
|
||||
},
|
||||
icon: 'IconHeart',
|
||||
inverseSideTarget: () => FavoriteWorkspaceEntity,
|
||||
onDelete: RelationOnDeleteAction.CASCADE,
|
||||
@ -112,10 +122,13 @@ export class CustomWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
|
||||
@WorkspaceRelation({
|
||||
standardId: CUSTOM_OBJECT_STANDARD_FIELD_IDS.attachments,
|
||||
label: 'Attachments',
|
||||
label: msg`Attachments`,
|
||||
type: RelationMetadataType.ONE_TO_MANY,
|
||||
description: (objectMetadata) =>
|
||||
`Attachments tied to the ${objectMetadata.labelSingular}`,
|
||||
description: (objectMetadata) => {
|
||||
const label = objectMetadata.labelSingular;
|
||||
|
||||
return msg`Attachments tied to the ${label}`;
|
||||
},
|
||||
icon: 'IconFileImport',
|
||||
inverseSideTarget: () => AttachmentWorkspaceEntity,
|
||||
onDelete: RelationOnDeleteAction.CASCADE,
|
||||
@ -125,10 +138,13 @@ export class CustomWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
|
||||
@WorkspaceRelation({
|
||||
standardId: CUSTOM_OBJECT_STANDARD_FIELD_IDS.timelineActivities,
|
||||
label: 'Timeline Activities',
|
||||
label: msg`Timeline Activities`,
|
||||
type: RelationMetadataType.ONE_TO_MANY,
|
||||
description: (objectMetadata) =>
|
||||
`Timeline Activities tied to the ${objectMetadata.labelSingular}`,
|
||||
description: (objectMetadata) => {
|
||||
const label = objectMetadata.labelSingular;
|
||||
|
||||
return msg`Timeline Activities tied to the ${label}`;
|
||||
},
|
||||
icon: 'IconIconTimelineEvent',
|
||||
inverseSideTarget: () => TimelineActivityWorkspaceEntity,
|
||||
onDelete: RelationOnDeleteAction.CASCADE,
|
||||
|
||||
@ -16,13 +16,11 @@ export interface WorkspaceFieldOptions<
|
||||
standardId: string;
|
||||
type: T;
|
||||
label:
|
||||
| string
|
||||
| MessageDescriptor
|
||||
| ((objectMetadata: ObjectMetadataEntity) => string);
|
||||
| ((objectMetadata: ObjectMetadataEntity) => MessageDescriptor);
|
||||
description?:
|
||||
| string
|
||||
| MessageDescriptor
|
||||
| ((objectMetadata: ObjectMetadataEntity) => string);
|
||||
| ((objectMetadata: ObjectMetadataEntity) => MessageDescriptor);
|
||||
icon?: string;
|
||||
defaultValue?: FieldMetadataDefaultValue<T>;
|
||||
options?: FieldMetadataOptions<T>;
|
||||
@ -80,14 +78,24 @@ export function WorkspaceField<T extends FieldMetadataType>(
|
||||
standardId: options.standardId,
|
||||
name: propertyKey.toString(),
|
||||
label:
|
||||
typeof options.label === 'object'
|
||||
? (options.label.message ?? '')
|
||||
: options.label,
|
||||
typeof options.label === 'function'
|
||||
? (objectMetadata: ObjectMetadataEntity) =>
|
||||
(
|
||||
options.label as (
|
||||
obj: ObjectMetadataEntity,
|
||||
) => MessageDescriptor
|
||||
)(objectMetadata).message ?? ''
|
||||
: (options.label.message ?? ''),
|
||||
type: options.type,
|
||||
description:
|
||||
typeof options.description === 'object'
|
||||
? (options.description.message ?? '')
|
||||
: options.description,
|
||||
typeof options.description === 'function'
|
||||
? (objectMetadata: ObjectMetadataEntity) =>
|
||||
(
|
||||
options.description as (
|
||||
obj: ObjectMetadataEntity,
|
||||
) => MessageDescriptor
|
||||
)(objectMetadata).message ?? ''
|
||||
: (options.description?.message ?? ''),
|
||||
icon: options.icon,
|
||||
defaultValue,
|
||||
options: options.options,
|
||||
|
||||
@ -1,17 +1,22 @@
|
||||
import { MessageDescriptor } from '@lingui/core';
|
||||
import { ObjectType } from 'typeorm';
|
||||
|
||||
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
||||
import {
|
||||
RelationMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
} from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
||||
import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage';
|
||||
import { TypedReflect } from 'src/utils/typed-reflect';
|
||||
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
||||
|
||||
interface WorkspaceRelationOptions<TClass> {
|
||||
standardId: string;
|
||||
label: string | ((objectMetadata: ObjectMetadataEntity) => string);
|
||||
description?: string | ((objectMetadata: ObjectMetadataEntity) => string);
|
||||
label:
|
||||
| MessageDescriptor
|
||||
| ((objectMetadata: ObjectMetadataEntity) => MessageDescriptor);
|
||||
description?:
|
||||
| MessageDescriptor
|
||||
| ((objectMetadata: ObjectMetadataEntity) => MessageDescriptor);
|
||||
icon?: string;
|
||||
type: RelationMetadataType;
|
||||
inverseSideTarget: () => ObjectType<TClass>;
|
||||
@ -51,9 +56,25 @@ export function WorkspaceRelation<TClass extends object>(
|
||||
target: object.constructor,
|
||||
standardId: options.standardId,
|
||||
name: propertyKey.toString(),
|
||||
label: options.label,
|
||||
label:
|
||||
typeof options.label === 'function'
|
||||
? (objectMetadata: ObjectMetadataEntity) =>
|
||||
(
|
||||
options.label as (
|
||||
obj: ObjectMetadataEntity,
|
||||
) => MessageDescriptor
|
||||
)(objectMetadata).message ?? ''
|
||||
: (options.label.message ?? ''),
|
||||
type: options.type,
|
||||
description: options.description,
|
||||
description:
|
||||
typeof options.description === 'function'
|
||||
? (objectMetadata: ObjectMetadataEntity) =>
|
||||
(
|
||||
options.description as (
|
||||
obj: ObjectMetadataEntity,
|
||||
) => MessageDescriptor
|
||||
)(objectMetadata).message ?? ''
|
||||
: (options.description?.message ?? ''),
|
||||
icon: options.icon,
|
||||
inverseSideTarget: options.inverseSideTarget,
|
||||
inverseSideFieldKey: options.inverseSideFieldKey as string | undefined,
|
||||
|
||||
Reference in New Issue
Block a user