feat: rename RICH_TEXT_V2 → RICH_TEXT in codebase (keep DB value) (#18628)

## Summary

- Renames the `FieldMetadataType` enum key from `RICH_TEXT_V2` to
`RICH_TEXT` across the entire codebase, while keeping the underlying
string value as `'RICH_TEXT_V2'` to maintain PostgreSQL database
compatibility
- Renames all related types, guards, hooks, components, and files from
`*RichTextV2*` / `*rich-text-v2*` to `*RichText*` / `*rich-text*` (e.g.
`FormRichTextV2FieldInput` → `FormRichTextFieldInput`,
`isFieldRichTextV2` → `isFieldRichText`)
- Updates generated files (GraphQL schema, SDK types) to use the new key
while preserving the `RICH_TEXT_V2` string value for DB/API layer
- Updates i18n locale files, test snapshots, and integration tests to
reflect the rename

## Context

The legacy `RICH_TEXT` (V1) field type was deprecated and migrated to
`TEXT` in a previous PR (#18623). With V1 gone, the `RICH_TEXT_V2`
naming is no longer necessary — `RICH_TEXT` is now the canonical name.
The DB enum value stays `'RICH_TEXT_V2'` to avoid confusion with the
just-deprecated V1 type and to prevent a database migration.

## Test plan

- [x] `twenty-server` typecheck passes
- [x] `twenty-front` typecheck passes (only pre-existing Apollo client
errors remain)
- [x] `twenty-server` lint passes
- [x] `twenty-front` lint passes
- [x] `twenty-shared` build passes
- [ ] CI passes


Made with [Cursor](https://cursor.com)
This commit is contained in:
Charles Bochet
2026-03-13 19:07:55 +01:00
committed by GitHub
parent 3054679411
commit d9eb317bb5
129 changed files with 452 additions and 401 deletions
@@ -11,7 +11,7 @@ import { type QueryResultFieldValue } from 'src/engine/api/graphql/workspace-que
import { type QueryResultGetterHandlerInterface } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-getter-handler.interface';
import { FilesFieldQueryResultGetterHandler } from 'src/engine/api/common/common-result-getters/handlers/field-handlers/files-field-query-result-getter.handler';
import { RichTextV2FieldQueryResultGetterHandler } from 'src/engine/api/common/common-result-getters/handlers/field-handlers/rich-text-v2-field-query-result-getter.handler';
import { RichTextFieldQueryResultGetterHandler } from 'src/engine/api/common/common-result-getters/handlers/field-handlers/rich-text-field-query-result-getter.handler';
import { AttachmentQueryResultGetterHandler } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/handlers/attachment-query-result-getter.handler';
import { PersonQueryResultGetterHandler } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/handlers/person-query-result-getter.handler';
import { WorkspaceMemberQueryResultGetterHandler } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/handlers/workspace-member-query-result-getter.handler';
@@ -68,8 +68,8 @@ export class CommonResultGettersService {
new FilesFieldQueryResultGetterHandler(this.fileUrlService),
],
[
FieldMetadataType.RICH_TEXT_V2,
new RichTextV2FieldQueryResultGetterHandler(this.fileUrlService),
FieldMetadataType.RICH_TEXT,
new RichTextFieldQueryResultGetterHandler(this.fileUrlService),
],
]);
}
@@ -1,6 +1,6 @@
import { FieldMetadataType, type ObjectRecord } from 'twenty-shared/types';
import { RichTextV2FieldQueryResultGetterHandler } from 'src/engine/api/common/common-result-getters/handlers/field-handlers/rich-text-v2-field-query-result-getter.handler';
import { RichTextFieldQueryResultGetterHandler } from 'src/engine/api/common/common-result-getters/handlers/field-handlers/rich-text-field-query-result-getter.handler';
import { type FileUrlService } from 'src/engine/core-modules/file/file-url/file-url.service';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
@@ -13,7 +13,7 @@ const baseRecord: ObjectRecord = {
const richTextFieldMetadata = [
{
type: FieldMetadataType.RICH_TEXT_V2,
type: FieldMetadataType.RICH_TEXT,
name: 'bodyV2',
},
] as FlatFieldMetadata[];
@@ -23,12 +23,12 @@ const mockFileUrlService = {
signFileByIdUrl: jest.fn().mockReturnValue('signed-path'),
} as unknown as FileUrlService;
describe('RichTextV2FieldQueryResultGetterHandler', () => {
let handler: RichTextV2FieldQueryResultGetterHandler;
describe('RichTextFieldQueryResultGetterHandler', () => {
let handler: RichTextFieldQueryResultGetterHandler;
beforeEach(() => {
process.env.SERVER_URL = 'https://my-domain.twenty.com';
handler = new RichTextV2FieldQueryResultGetterHandler(mockFileUrlService);
handler = new RichTextFieldQueryResultGetterHandler(mockFileUrlService);
});
afterEach(() => {
@@ -37,7 +37,7 @@ describe('RichTextV2FieldQueryResultGetterHandler', () => {
});
describe('should return record unchanged', () => {
it('when no RICH_TEXT_V2 field metadata is present', async () => {
it('when no RICH_TEXT field metadata is present', async () => {
const record = {
...baseRecord,
bodyV2: { blocknote: '[]', markdown: null },
@@ -156,11 +156,11 @@ describe('RichTextV2FieldQueryResultGetterHandler', () => {
});
});
describe('should handle multiple RICH_TEXT_V2 fields', () => {
describe('should handle multiple RICH_TEXT fields', () => {
it('when record has multiple rich text fields', async () => {
const multiFieldMetadata = [
{ type: FieldMetadataType.RICH_TEXT_V2, name: 'bodyV2' },
{ type: FieldMetadataType.RICH_TEXT_V2, name: 'description' },
{ type: FieldMetadataType.RICH_TEXT, name: 'bodyV2' },
{ type: FieldMetadataType.RICH_TEXT, name: 'description' },
] as FlatFieldMetadata[];
const record = {
@@ -30,7 +30,7 @@ const parseBlocknoteJsonSafely = (
}
};
export class RichTextV2FieldQueryResultGetterHandler
export class RichTextFieldQueryResultGetterHandler
implements QueryResultGetterHandlerInterface
{
constructor(private readonly fileUrlService: FileUrlService) {}
@@ -40,15 +40,15 @@ export class RichTextV2FieldQueryResultGetterHandler
workspaceId: string,
flatFieldMetadata: FlatFieldMetadata[],
): Promise<ObjectRecord> {
const richTextV2Fields = flatFieldMetadata.filter(
(field) => field.type === FieldMetadataType.RICH_TEXT_V2,
const richTextFields = flatFieldMetadata.filter(
(field) => field.type === FieldMetadataType.RICH_TEXT,
);
if (richTextV2Fields.length === 0) {
if (richTextFields.length === 0) {
return record;
}
for (const field of richTextV2Fields) {
for (const field of richTextFields) {
const fieldValue = record[field.name];
const blocknoteJson = fieldValue?.blocknote;