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:
+3
-3
@@ -172,11 +172,11 @@ exports[`DataArgProcessorService failing inputs validation RELATION should throw
|
||||
|
||||
exports[`DataArgProcessorService failing inputs validation RELATION should throw for invalid input #5: "non-uuid" 1`] = `"Invalid UUID value 'non-uuid' for field "manyToOneRelationFieldId""`;
|
||||
|
||||
exports[`DataArgProcessorService failing inputs validation RICH_TEXT_V2 should throw for invalid input #1: "not-a-rich-text" 1`] = `"Invalid rich text v2 value 'not-a-rich-text' for field "richTextV2Field" - Should be an object"`;
|
||||
exports[`DataArgProcessorService failing inputs validation RICH_TEXT should throw for invalid input #1: "not-a-rich-text" 1`] = `"Invalid rich text v2 value 'not-a-rich-text' for field "richTextField" - Should be an object"`;
|
||||
|
||||
exports[`DataArgProcessorService failing inputs validation RICH_TEXT_V2 should throw for invalid input #2: 1 1`] = `"Invalid rich text v2 value 1 for field "richTextV2Field" - Should be an object"`;
|
||||
exports[`DataArgProcessorService failing inputs validation RICH_TEXT should throw for invalid input #2: 1 1`] = `"Invalid rich text v2 value 1 for field "richTextField" - Should be an object"`;
|
||||
|
||||
exports[`DataArgProcessorService failing inputs validation RICH_TEXT_V2 should throw for invalid input #3: true 1`] = `"Invalid rich text v2 value true for field "richTextV2Field" - Should be an object"`;
|
||||
exports[`DataArgProcessorService failing inputs validation RICH_TEXT should throw for invalid input #3: true 1`] = `"Invalid rich text v2 value true for field "richTextField" - Should be an object"`;
|
||||
|
||||
exports[`DataArgProcessorService failing inputs validation SELECT should throw for invalid input #1: "not-a-select-option" 1`] = `"Invalid value 'not-a-select-option' for field "selectField""`;
|
||||
|
||||
|
||||
+4
-4
@@ -150,10 +150,10 @@ export const failingInputsByFieldMetadataType: {
|
||||
{ input: { linksField: 1 } },
|
||||
{ input: { linksField: true } },
|
||||
],
|
||||
[FieldMetadataType.RICH_TEXT_V2]: [
|
||||
{ input: { richTextV2Field: 'not-a-rich-text' } },
|
||||
{ input: { richTextV2Field: 1 } },
|
||||
{ input: { richTextV2Field: true } },
|
||||
[FieldMetadataType.RICH_TEXT]: [
|
||||
{ input: { richTextField: 'not-a-rich-text' } },
|
||||
{ input: { richTextField: 1 } },
|
||||
{ input: { richTextField: true } },
|
||||
],
|
||||
[FieldMetadataType.POSITION]: [
|
||||
{ input: { position: 'not-a-position' } },
|
||||
|
||||
+3
-3
@@ -134,9 +134,9 @@ export const fieldMetadataConfigByFieldName: Record<
|
||||
type: FieldMetadataType.LINKS,
|
||||
isNullable: true,
|
||||
},
|
||||
richTextV2Field: {
|
||||
name: 'richTextV2Field',
|
||||
type: FieldMetadataType.RICH_TEXT_V2,
|
||||
richTextField: {
|
||||
name: 'richTextField',
|
||||
type: FieldMetadataType.RICH_TEXT,
|
||||
isNullable: true,
|
||||
},
|
||||
position: {
|
||||
|
||||
+5
-5
@@ -383,16 +383,16 @@ export const successfulInputsByFieldMetadataType: {
|
||||
},
|
||||
{ input: { linksField: null }, expectedOutput: { linksField: null } },
|
||||
],
|
||||
[FieldMetadataType.RICH_TEXT_V2]: [
|
||||
[FieldMetadataType.RICH_TEXT]: [
|
||||
{
|
||||
input: { richTextV2Field: { blocknote: 'test', markdown: 'test' } },
|
||||
input: { richTextField: { blocknote: 'test', markdown: 'test' } },
|
||||
expectedOutput: {
|
||||
richTextV2Field: { blocknote: 'test', markdown: 'test' },
|
||||
richTextField: { blocknote: 'test', markdown: 'test' },
|
||||
},
|
||||
},
|
||||
{
|
||||
input: { richTextV2Field: null },
|
||||
expectedOutput: { richTextV2Field: null },
|
||||
input: { richTextField: null },
|
||||
expectedOutput: { richTextField: null },
|
||||
},
|
||||
],
|
||||
[FieldMetadataType.POSITION]: [
|
||||
|
||||
+2
-2
@@ -16,9 +16,9 @@ import { successfulInputsByFieldMetadataType } from './constants/successful-inpu
|
||||
|
||||
// Mock the rich text v2 transformation to avoid BlockNote module issues
|
||||
jest.mock(
|
||||
'src/engine/core-modules/record-transformer/utils/transform-rich-text-v2.util',
|
||||
'src/engine/core-modules/record-transformer/utils/transform-rich-text.util',
|
||||
() => ({
|
||||
transformRichTextV2Value: jest.fn().mockImplementation((value) => value),
|
||||
transformRichTextValue: jest.fn().mockImplementation((value) => value),
|
||||
}),
|
||||
);
|
||||
|
||||
|
||||
+2
-3
@@ -44,7 +44,7 @@ const DEFAULT_ACTOR_FIELD_NULL_EQUIVALENT_VALUE = {
|
||||
name: DEFAULT_TEXT_FIELD_NULL_EQUIVALENT_VALUE,
|
||||
};
|
||||
|
||||
const DEFAULT_RICH_TEXT_V2_FIELD_NULL_EQUIVALENT_VALUE = {
|
||||
const DEFAULT_RICH_TEXT_FIELD_NULL_EQUIVALENT_VALUE = {
|
||||
markdown: DEFAULT_TEXT_FIELD_NULL_EQUIVALENT_VALUE,
|
||||
};
|
||||
|
||||
@@ -57,6 +57,5 @@ export const DEFAULT_COMPOSITE_FIELDS_NULL_EQUIVALENT_VALUE: Partial<
|
||||
[FieldMetadataType.PHONES]: DEFAULT_PHONES_FIELD_NULL_EQUIVALENT_VALUE,
|
||||
[FieldMetadataType.FULL_NAME]: DEFAULT_FULL_NAME_FIELD_NULL_EQUIVALENT_VALUE,
|
||||
[FieldMetadataType.ACTOR]: DEFAULT_ACTOR_FIELD_NULL_EQUIVALENT_VALUE,
|
||||
[FieldMetadataType.RICH_TEXT_V2]:
|
||||
DEFAULT_RICH_TEXT_V2_FIELD_NULL_EQUIVALENT_VALUE,
|
||||
[FieldMetadataType.RICH_TEXT]: DEFAULT_RICH_TEXT_FIELD_NULL_EQUIVALENT_VALUE,
|
||||
};
|
||||
|
||||
+5
-5
@@ -41,7 +41,7 @@ import { validateOverriddenPositionFieldOrThrow } from 'src/engine/api/common/co
|
||||
import { validatePhonesFieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-phones-field-or-throw.util';
|
||||
import { validateRatingAndSelectFieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-rating-and-select-field-or-throw.util';
|
||||
import { validateRawJsonFieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-raw-json-field-or-throw.util';
|
||||
import { validateRichTextV2FieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-rich-text-v2-field-or-throw.util';
|
||||
import { validateRichTextFieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-rich-text-field-or-throw.util';
|
||||
import { validateTextFieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-text-field-or-throw.util';
|
||||
import { validateUUIDFieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-uuid-field-or-throw.util';
|
||||
import {
|
||||
@@ -54,7 +54,7 @@ import { RecordPositionService } from 'src/engine/core-modules/record-position/s
|
||||
import { transformEmailsValue } from 'src/engine/core-modules/record-transformer/utils/transform-emails-value.util';
|
||||
import { transformLinksValue } from 'src/engine/core-modules/record-transformer/utils/transform-links-value.util';
|
||||
import { transformPhonesValue } from 'src/engine/core-modules/record-transformer/utils/transform-phones-value.util';
|
||||
import { transformRichTextV2Value } from 'src/engine/core-modules/record-transformer/utils/transform-rich-text-v2.util';
|
||||
import { transformRichTextValue } from 'src/engine/core-modules/record-transformer/utils/transform-rich-text.util';
|
||||
import { WorkspaceNotFoundDefaultError } from 'src/engine/core-modules/workspace/workspace.exception';
|
||||
import { FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
@@ -302,10 +302,10 @@ export class DataArgProcessorService {
|
||||
|
||||
return transformActorField(validatedValue);
|
||||
}
|
||||
case FieldMetadataType.RICH_TEXT_V2: {
|
||||
const validatedValue = validateRichTextV2FieldOrThrow(value, key);
|
||||
case FieldMetadataType.RICH_TEXT: {
|
||||
const validatedValue = validateRichTextFieldOrThrow(value, key);
|
||||
|
||||
return await transformRichTextV2Value(validatedValue);
|
||||
return await transformRichTextValue(validatedValue);
|
||||
}
|
||||
case FieldMetadataType.LINKS: {
|
||||
const validatedValue = validateLinksFieldOrThrow(value, key);
|
||||
|
||||
+3
-3
@@ -171,12 +171,12 @@ describe('findPostgresDefaultNullEquivalentValue', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('RICH_TEXT_V2', () => {
|
||||
describe('RICH_TEXT', () => {
|
||||
it('should return json default for blocknote', () => {
|
||||
expect(
|
||||
findPostgresDefaultNullEquivalentValue(
|
||||
{},
|
||||
FieldMetadataType.RICH_TEXT_V2,
|
||||
FieldMetadataType.RICH_TEXT,
|
||||
'blocknote',
|
||||
),
|
||||
).toBe(undefined);
|
||||
@@ -186,7 +186,7 @@ describe('findPostgresDefaultNullEquivalentValue', () => {
|
||||
expect(
|
||||
findPostgresDefaultNullEquivalentValue(
|
||||
'',
|
||||
FieldMetadataType.RICH_TEXT_V2,
|
||||
FieldMetadataType.RICH_TEXT,
|
||||
'markdown',
|
||||
),
|
||||
).toBe(POSTGRES_DEFAULT_TEXT_FIELD_NULL_EQUIVALENT_VALUE);
|
||||
|
||||
+1
-1
@@ -117,7 +117,7 @@ export const findPostgresDefaultNullEquivalentValue = (
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
case FieldMetadataType.RICH_TEXT_V2: {
|
||||
case FieldMetadataType.RICH_TEXT: {
|
||||
switch (key) {
|
||||
case 'markdown':
|
||||
return isNullEquivalentTextFieldValue(value) || value === 'NULL'
|
||||
|
||||
+9
-9
@@ -1,16 +1,16 @@
|
||||
import { validateRichTextV2FieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-rich-text-v2-field-or-throw.util';
|
||||
import { validateRichTextFieldOrThrow } from 'src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-rich-text-field-or-throw.util';
|
||||
import { CommonQueryRunnerException } from 'src/engine/api/common/common-query-runners/errors/common-query-runner.exception';
|
||||
|
||||
describe('validateRichTextV2FieldOrThrow', () => {
|
||||
describe('validateRichTextFieldOrThrow', () => {
|
||||
describe('valid inputs', () => {
|
||||
it('should return null when value is null', () => {
|
||||
const result = validateRichTextV2FieldOrThrow(null, 'testField');
|
||||
const result = validateRichTextFieldOrThrow(null, 'testField');
|
||||
|
||||
expect(result).toBeNull();
|
||||
});
|
||||
|
||||
it('should return null when value is an empty object', () => {
|
||||
const result = validateRichTextV2FieldOrThrow({}, 'testField');
|
||||
const result = validateRichTextFieldOrThrow({}, 'testField');
|
||||
|
||||
expect(result).toBeNull();
|
||||
});
|
||||
@@ -20,7 +20,7 @@ describe('validateRichTextV2FieldOrThrow', () => {
|
||||
blocknote: 'some blocknote content',
|
||||
markdown: '# Heading\nContent',
|
||||
};
|
||||
const result = validateRichTextV2FieldOrThrow(value, 'testField');
|
||||
const result = validateRichTextFieldOrThrow(value, 'testField');
|
||||
|
||||
expect(result).toEqual(value);
|
||||
});
|
||||
@@ -29,23 +29,23 @@ describe('validateRichTextV2FieldOrThrow', () => {
|
||||
describe('invalid inputs', () => {
|
||||
it('should throw when value is undefined', () => {
|
||||
expect(() =>
|
||||
validateRichTextV2FieldOrThrow(undefined, 'testField'),
|
||||
validateRichTextFieldOrThrow(undefined, 'testField'),
|
||||
).toThrow(CommonQueryRunnerException);
|
||||
});
|
||||
|
||||
it('should throw when value is a string', () => {
|
||||
expect(() =>
|
||||
validateRichTextV2FieldOrThrow('not an object', 'testField'),
|
||||
validateRichTextFieldOrThrow('not an object', 'testField'),
|
||||
).toThrow(CommonQueryRunnerException);
|
||||
});
|
||||
|
||||
it('should throw when value has invalid subfields', () => {
|
||||
const value = { invalidField: 'value' };
|
||||
|
||||
expect(() => validateRichTextV2FieldOrThrow(value, 'testField')).toThrow(
|
||||
expect(() => validateRichTextFieldOrThrow(value, 'testField')).toThrow(
|
||||
CommonQueryRunnerException,
|
||||
);
|
||||
expect(() => validateRichTextV2FieldOrThrow(value, 'testField')).toThrow(
|
||||
expect(() => validateRichTextFieldOrThrow(value, 'testField')).toThrow(
|
||||
/Should have only blocknote, markdown subfields/,
|
||||
);
|
||||
});
|
||||
+5
-5
@@ -12,7 +12,7 @@ import {
|
||||
CommonQueryRunnerExceptionCode,
|
||||
} from 'src/engine/api/common/common-query-runners/errors/common-query-runner.exception';
|
||||
|
||||
export const validateRichTextV2FieldOrThrow = (
|
||||
export const validateRichTextFieldOrThrow = (
|
||||
value: unknown,
|
||||
fieldName: string,
|
||||
): {
|
||||
@@ -29,16 +29,16 @@ export const validateRichTextV2FieldOrThrow = (
|
||||
if (Object.keys(parsedValue).length === 0) return null;
|
||||
|
||||
const subfields = Object.keys(parsedValue);
|
||||
const richTextV2Subfields = compositeTypeDefinitions
|
||||
.get(FieldMetadataType.RICH_TEXT_V2)
|
||||
const richTextSubfields = compositeTypeDefinitions
|
||||
.get(FieldMetadataType.RICH_TEXT)
|
||||
?.properties.filter(
|
||||
(prop) => prop.hidden !== true && prop.hidden !== 'input',
|
||||
)
|
||||
.map((prop) => prop.name);
|
||||
|
||||
if (!subfields.every((subfield) => richTextV2Subfields?.includes(subfield)))
|
||||
if (!subfields.every((subfield) => richTextSubfields?.includes(subfield)))
|
||||
throw new Error(
|
||||
`Should have only ${richTextV2Subfields?.join(', ')} subfields`,
|
||||
`Should have only ${richTextSubfields?.join(', ')} subfields`,
|
||||
);
|
||||
|
||||
return value as {
|
||||
+2
-2
@@ -140,9 +140,9 @@ exports[`FilterArgProcessorService failing filter inputs validation RELATION sho
|
||||
|
||||
exports[`FilterArgProcessorService failing filter inputs validation RELATION should throw for invalid filter #3: {"manyToOneRelationFieldId":{}} 1`] = `"Filter for field "manyToOneRelationFieldId" must have exactly one operator"`;
|
||||
|
||||
exports[`FilterArgProcessorService failing filter inputs validation RICH_TEXT_V2 should throw for invalid filter #1: {"richTextV2Field":{"invalidOperator":"test"}} 1`] = `"Sub field "invalidOperator" not found for composite type: RICH_TEXT_V2"`;
|
||||
exports[`FilterArgProcessorService failing filter inputs validation RICH_TEXT should throw for invalid filter #1: {"richTextField":{"invalidOperator":"test"}} 1`] = `"Sub field "invalidOperator" not found for composite type: RICH_TEXT"`;
|
||||
|
||||
exports[`FilterArgProcessorService failing filter inputs validation RICH_TEXT_V2 should throw for invalid filter #2: {"richTextV2Field":{"markdown":{"invalidOperator":"test"}}} 1`] = `"Operator "invalidOperator" is not valid for field "richTextV2Field.markdown" of type TEXT - Allowed operators: eq, neq, gt, gte, lt, lte, in, is, like, ilike, startsWith, endsWith"`;
|
||||
exports[`FilterArgProcessorService failing filter inputs validation RICH_TEXT should throw for invalid filter #2: {"richTextField":{"markdown":{"invalidOperator":"test"}}} 1`] = `"Operator "invalidOperator" is not valid for field "richTextField.markdown" of type TEXT - Allowed operators: eq, neq, gt, gte, lt, lte, in, is, like, ilike, startsWith, endsWith"`;
|
||||
|
||||
exports[`FilterArgProcessorService failing filter inputs validation SELECT should throw for invalid filter #1: {"selectField":{"invalidOperator":"OPTION_1"}} 1`] = `"Operator "invalidOperator" is not valid for field "selectField" of type SELECT - Allowed operators: eq, neq, in, containsAny, is, isEmptyArray"`;
|
||||
|
||||
|
||||
+3
-3
@@ -116,9 +116,9 @@ export const failingFilterInputsByFieldMetadataType: {
|
||||
{ filter: { filesField: { invalidOperator: 'test' } } },
|
||||
{ filter: { filesField: {} } },
|
||||
],
|
||||
[FieldMetadataType.RICH_TEXT_V2]: [
|
||||
{ filter: { richTextV2Field: { invalidOperator: 'test' } } },
|
||||
{ filter: { richTextV2Field: { markdown: { invalidOperator: 'test' } } } },
|
||||
[FieldMetadataType.RICH_TEXT]: [
|
||||
{ filter: { richTextField: { invalidOperator: 'test' } } },
|
||||
{ filter: { richTextField: { markdown: { invalidOperator: 'test' } } } },
|
||||
],
|
||||
[FieldMetadataType.ADDRESS]: [
|
||||
{ filter: { addressField: { invalidSubField: { eq: 'test' } } } },
|
||||
|
||||
+2
-2
@@ -190,8 +190,8 @@ export const successfulFilterInputsByFieldMetadataType: {
|
||||
{ filter: { filesField: { is: 'NOT_NULL' } } },
|
||||
{ filter: { filesField: { like: '%test%' } } },
|
||||
],
|
||||
[FieldMetadataType.RICH_TEXT_V2]: [
|
||||
{ filter: { richTextV2Field: { markdown: { ilike: '%test%' } } } },
|
||||
[FieldMetadataType.RICH_TEXT]: [
|
||||
{ filter: { richTextField: { markdown: { ilike: '%test%' } } } },
|
||||
],
|
||||
[FieldMetadataType.ADDRESS]: [
|
||||
{ filter: { addressField: { addressCity: { eq: 'Paris' } } } },
|
||||
|
||||
+1
-1
@@ -73,4 +73,4 @@ export const ENUM_FILTER_OPERATORS: FilterOperator[] = [
|
||||
|
||||
export const RAW_JSON_FILTER_OPERATORS: FilterOperator[] = ['is', 'like'];
|
||||
|
||||
export const RICH_TEXT_V2_FILTER_OPERATORS: FilterOperator[] = ['ilike'];
|
||||
export const RICH_TEXT_FILTER_OPERATORS: FilterOperator[] = ['ilike'];
|
||||
|
||||
+3
-3
@@ -9,7 +9,7 @@ import {
|
||||
MULTI_SELECT_FILTER_OPERATORS,
|
||||
NUMBER_FILTER_OPERATORS,
|
||||
RAW_JSON_FILTER_OPERATORS,
|
||||
RICH_TEXT_V2_FILTER_OPERATORS,
|
||||
RICH_TEXT_FILTER_OPERATORS,
|
||||
STRING_FILTER_OPERATORS,
|
||||
UUID_FILTER_OPERATORS,
|
||||
} from 'src/engine/api/common/common-args-processors/filter-arg-processor/constants/filter-operators.constant';
|
||||
@@ -53,8 +53,8 @@ export const getOperatorsForFieldType = (
|
||||
case FieldMetadataType.FILES:
|
||||
return RAW_JSON_FILTER_OPERATORS;
|
||||
|
||||
case FieldMetadataType.RICH_TEXT_V2:
|
||||
return RICH_TEXT_V2_FILTER_OPERATORS;
|
||||
case FieldMetadataType.RICH_TEXT:
|
||||
return RICH_TEXT_FILTER_OPERATORS;
|
||||
|
||||
case FieldMetadataType.TS_VECTOR:
|
||||
case FieldMetadataType.ACTOR:
|
||||
|
||||
+3
-3
@@ -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),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
+9
-9
@@ -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 = {
|
||||
+5
-5
@@ -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;
|
||||
|
||||
+6
-6
@@ -1,7 +1,7 @@
|
||||
import { GraphQLInputObjectType, GraphQLString } from 'graphql';
|
||||
|
||||
const richTextV2LeafFilter = new GraphQLInputObjectType({
|
||||
name: 'RichTextV2LeafFilter',
|
||||
const richTextLeafFilter = new GraphQLInputObjectType({
|
||||
name: 'RichTextLeafFilter',
|
||||
fields: {
|
||||
ilike: {
|
||||
type: GraphQLString,
|
||||
@@ -10,10 +10,10 @@ const richTextV2LeafFilter = new GraphQLInputObjectType({
|
||||
},
|
||||
});
|
||||
|
||||
export const RichTextV2FilterType = new GraphQLInputObjectType({
|
||||
name: 'RichTextV2Filter',
|
||||
export const RichTextFilterType = new GraphQLInputObjectType({
|
||||
name: 'RichTextFilter',
|
||||
fields: {
|
||||
blocknote: { type: richTextV2LeafFilter },
|
||||
markdown: { type: richTextV2LeafFilter },
|
||||
blocknote: { type: richTextLeafFilter },
|
||||
markdown: { type: richTextLeafFilter },
|
||||
},
|
||||
});
|
||||
|
||||
+2
-2
@@ -33,7 +33,7 @@ import {
|
||||
} from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input';
|
||||
import { FilesInputType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/files.input-type';
|
||||
import { MultiSelectFilterType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/multi-select-filter.input-type';
|
||||
import { RichTextV2FilterType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/rich-text.input-type';
|
||||
import { RichTextFilterType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/rich-text.input-type';
|
||||
import { SelectFilterType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/select-filter.input-type';
|
||||
import { TSVectorFilterType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/ts-vector-filter.input-type';
|
||||
import { UUIDFilterType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/uuid-filter.input-type';
|
||||
@@ -178,7 +178,7 @@ export class TypeMapperService {
|
||||
[FieldMetadataType.POSITION, FloatFilterType],
|
||||
[FieldMetadataType.FILES, RawJsonFilterType],
|
||||
[FieldMetadataType.RAW_JSON, RawJsonFilterType],
|
||||
[FieldMetadataType.RICH_TEXT_V2, RichTextV2FilterType],
|
||||
[FieldMetadataType.RICH_TEXT, RichTextFilterType],
|
||||
[FieldMetadataType.ARRAY, ArrayFilterType],
|
||||
[FieldMetadataType.MULTI_SELECT, MultiSelectFilterType],
|
||||
[FieldMetadataType.SELECT, SelectFilterType],
|
||||
|
||||
+1
-1
@@ -124,7 +124,7 @@ export const generateRandomFieldValue = ({
|
||||
return {};
|
||||
}
|
||||
|
||||
case FieldMetadataType.RICH_TEXT_V2: {
|
||||
case FieldMetadataType.RICH_TEXT: {
|
||||
return '';
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -28,7 +28,7 @@ export const generateFieldFilterZodSchema = (
|
||||
.describe(`Filter by ${field.name} (UUID field)`);
|
||||
|
||||
case FieldMetadataType.TEXT:
|
||||
case FieldMetadataType.RICH_TEXT_V2:
|
||||
case FieldMetadataType.RICH_TEXT:
|
||||
return z
|
||||
.object({
|
||||
eq: z.string().optional().describe('Equals'),
|
||||
|
||||
+1
-1
@@ -238,7 +238,7 @@ export const generateRecordPropertiesZodSchema = (
|
||||
});
|
||||
break;
|
||||
|
||||
case FieldMetadataType.RICH_TEXT_V2:
|
||||
case FieldMetadataType.RICH_TEXT:
|
||||
fieldSchema = z.object({
|
||||
markdown: z.string().optional(),
|
||||
blocknote: z.string().optional(),
|
||||
|
||||
+3
-3
@@ -10,7 +10,7 @@ import { isDefined } from 'twenty-shared/utils';
|
||||
import { transformEmailsValue } from 'src/engine/core-modules/record-transformer/utils/transform-emails-value.util';
|
||||
import { transformLinksValue } from 'src/engine/core-modules/record-transformer/utils/transform-links-value.util';
|
||||
import { transformPhonesValue } from 'src/engine/core-modules/record-transformer/utils/transform-phones-value.util';
|
||||
import { transformRichTextV2Value } from 'src/engine/core-modules/record-transformer/utils/transform-rich-text-v2.util';
|
||||
import { transformRichTextValue } from 'src/engine/core-modules/record-transformer/utils/transform-rich-text.util';
|
||||
import { FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
||||
@@ -78,8 +78,8 @@ export class RecordInputTransformerService {
|
||||
return value || null;
|
||||
case FieldMetadataType.NUMBER:
|
||||
return value === null ? null : Number(value);
|
||||
case FieldMetadataType.RICH_TEXT_V2:
|
||||
return await transformRichTextV2Value(value);
|
||||
case FieldMetadataType.RICH_TEXT:
|
||||
return await transformRichTextValue(value);
|
||||
case FieldMetadataType.LINKS:
|
||||
return transformLinksValue(value);
|
||||
case FieldMetadataType.EMAILS:
|
||||
|
||||
+5
-5
@@ -1,7 +1,7 @@
|
||||
import { isNonEmptyString } from '@sniptt/guards';
|
||||
import {
|
||||
type RichTextV2Metadata,
|
||||
richTextV2ValueSchema,
|
||||
type RichTextMetadata,
|
||||
richTextValueSchema,
|
||||
} from 'twenty-shared/types';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
@@ -29,12 +29,12 @@ const getServerBlockNoteEditor = async (): Promise<ServerBlockNoteEditor> => {
|
||||
return editor;
|
||||
};
|
||||
|
||||
export const transformRichTextV2Value = async (
|
||||
export const transformRichTextValue = async (
|
||||
// oxlint-disable-next-line @typescripttypescript/no-explicit-any
|
||||
richTextValue: any,
|
||||
): Promise<RichTextV2Metadata> => {
|
||||
): Promise<RichTextMetadata> => {
|
||||
const parsedValue = isNonEmptyString(richTextValue)
|
||||
? richTextV2ValueSchema.parse(richTextValue)
|
||||
? richTextValueSchema.parse(richTextValue)
|
||||
: richTextValue;
|
||||
|
||||
const serverBlockNoteEditor = await getServerBlockNoteEditor();
|
||||
+1
-1
@@ -7,7 +7,7 @@ const compositeFieldTypes = [
|
||||
FieldMetadataType.LINKS,
|
||||
FieldMetadataType.EMAILS,
|
||||
FieldMetadataType.PHONES,
|
||||
FieldMetadataType.RICH_TEXT_V2,
|
||||
FieldMetadataType.RICH_TEXT,
|
||||
FieldMetadataType.ACTOR,
|
||||
] as const;
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ describe('computeCompositeColumnName', () => {
|
||||
it('should compute composite column name for rich text v2 field', () => {
|
||||
const fieldMetadata = {
|
||||
name: 'bodyV2',
|
||||
type: FieldMetadataType.RICH_TEXT_V2,
|
||||
type: FieldMetadataType.RICH_TEXT,
|
||||
};
|
||||
|
||||
const property = {
|
||||
|
||||
+2
-2
@@ -9,7 +9,7 @@ export const isCompositeFieldMetadataType = (
|
||||
| FieldMetadataType.ACTOR
|
||||
| FieldMetadataType.EMAILS
|
||||
| FieldMetadataType.PHONES
|
||||
| FieldMetadataType.RICH_TEXT_V2 => {
|
||||
| FieldMetadataType.RICH_TEXT => {
|
||||
return [
|
||||
FieldMetadataType.CURRENCY,
|
||||
FieldMetadataType.FULL_NAME,
|
||||
@@ -18,6 +18,6 @@ export const isCompositeFieldMetadataType = (
|
||||
FieldMetadataType.ACTOR,
|
||||
FieldMetadataType.EMAILS,
|
||||
FieldMetadataType.PHONES,
|
||||
FieldMetadataType.RICH_TEXT_V2,
|
||||
FieldMetadataType.RICH_TEXT,
|
||||
].includes(type);
|
||||
};
|
||||
|
||||
+1
-1
@@ -55,7 +55,7 @@ export const NOTE_FLAT_FIELDS_MOCK = {
|
||||
bodyV2: getFlatFieldMetadataMock({
|
||||
id: 'acb2973c-7e46-4296-ac79-8b8d163b6d85',
|
||||
objectMetadataId: '1253e3e5-5b00-4a34-93b8-02f3dc6e2b7c',
|
||||
type: FieldMetadataType.RICH_TEXT_V2,
|
||||
type: FieldMetadataType.RICH_TEXT,
|
||||
name: 'bodyV2',
|
||||
label: 'Body',
|
||||
defaultValue: null,
|
||||
|
||||
+1
-1
@@ -59,7 +59,7 @@ export const TASK_FLAT_FIELDS_MOCK = {
|
||||
bodyV2: getFlatFieldMetadataMock({
|
||||
id: '161570ed-7fcd-4172-a5d1-c773cd9afe76',
|
||||
objectMetadataId: '3186920d-2a15-4b5f-96c7-2bf6567024b0',
|
||||
type: FieldMetadataType.RICH_TEXT_V2,
|
||||
type: FieldMetadataType.RICH_TEXT,
|
||||
name: 'bodyV2',
|
||||
label: 'Body',
|
||||
defaultValue: null,
|
||||
|
||||
+1
-1
@@ -71,7 +71,7 @@ export class FlatFieldMetadataTypeValidatorService {
|
||||
PHONES: DEFAULT_NO_VALIDATION,
|
||||
POSITION: validatePositionFlatFieldMetadata,
|
||||
RAW_JSON: DEFAULT_NO_VALIDATION,
|
||||
RICH_TEXT_V2: DEFAULT_NO_VALIDATION,
|
||||
RICH_TEXT: DEFAULT_NO_VALIDATION,
|
||||
TEXT: DEFAULT_NO_VALIDATION,
|
||||
TS_VECTOR: validateTsVectorFlatFieldMetadata,
|
||||
UUID: DEFAULT_NO_VALIDATION,
|
||||
|
||||
+1
-1
@@ -105,7 +105,7 @@ const _assertion: Record<string, AbstractFlatFieldMetadata> = {
|
||||
// JSON/Array types
|
||||
rawJson: {} as FlatFieldMetadata<FieldMetadataType.RAW_JSON>,
|
||||
array: {} as FlatFieldMetadata<FieldMetadataType.ARRAY>,
|
||||
richTextV2: {} as FlatFieldMetadata<FieldMetadataType.RICH_TEXT_V2>,
|
||||
richText: {} as FlatFieldMetadata<FieldMetadataType.RICH_TEXT>,
|
||||
|
||||
// Relation types
|
||||
relation: {} as FlatFieldMetadata<FieldMetadataType.RELATION>,
|
||||
|
||||
+1
-1
@@ -183,7 +183,7 @@ export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({
|
||||
case FieldMetadataType.POSITION:
|
||||
case FieldMetadataType.ADDRESS:
|
||||
case FieldMetadataType.RAW_JSON:
|
||||
case FieldMetadataType.RICH_TEXT_V2:
|
||||
case FieldMetadataType.RICH_TEXT:
|
||||
case FieldMetadataType.ACTOR:
|
||||
case FieldMetadataType.ARRAY: {
|
||||
const indexMetadatas: UniversalFlatIndexMetadata[] = [];
|
||||
|
||||
+3
-3
@@ -1,10 +1,10 @@
|
||||
import { Field, ObjectType } from '@nestjs/graphql';
|
||||
|
||||
import { IsOptional, IsString } from 'class-validator';
|
||||
import { type RichTextV2Metadata } from 'twenty-shared/types';
|
||||
import { type RichTextMetadata } from 'twenty-shared/types';
|
||||
|
||||
@ObjectType('RichTextV2Body')
|
||||
export class RichTextV2BodyDTO implements RichTextV2Metadata {
|
||||
@ObjectType('RichTextBody')
|
||||
export class RichTextBodyDTO implements RichTextMetadata {
|
||||
@Field(() => String, { nullable: true })
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
+4
-4
@@ -4,7 +4,7 @@ import { Type } from 'class-transformer';
|
||||
import { IsIn, IsNotEmpty, ValidateNested } from 'class-validator';
|
||||
import { type StandaloneRichTextConfiguration } from 'twenty-shared/types';
|
||||
|
||||
import { RichTextV2BodyDTO } from 'src/engine/metadata-modules/page-layout-widget/dtos/rich-text-v2-body.dto';
|
||||
import { RichTextBodyDTO } from 'src/engine/metadata-modules/page-layout-widget/dtos/rich-text-body.dto';
|
||||
import { WidgetConfigurationType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-configuration-type.type';
|
||||
|
||||
@ObjectType('StandaloneRichTextConfiguration')
|
||||
@@ -16,9 +16,9 @@ export class StandaloneRichTextConfigurationDTO
|
||||
@IsNotEmpty()
|
||||
configurationType: WidgetConfigurationType.STANDALONE_RICH_TEXT;
|
||||
|
||||
@Field(() => RichTextV2BodyDTO)
|
||||
@Field(() => RichTextBodyDTO)
|
||||
@ValidateNested()
|
||||
@Type(() => RichTextV2BodyDTO)
|
||||
@Type(() => RichTextBodyDTO)
|
||||
@IsNotEmpty()
|
||||
body: RichTextV2BodyDTO;
|
||||
body: RichTextBodyDTO;
|
||||
}
|
||||
|
||||
+2
-2
@@ -3,7 +3,7 @@ import { Injectable } from '@nestjs/common';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { ApplicationService } from 'src/engine/core-modules/application/application.service';
|
||||
import { transformRichTextV2Value } from 'src/engine/core-modules/record-transformer/utils/transform-rich-text-v2.util';
|
||||
import { transformRichTextValue } from 'src/engine/core-modules/record-transformer/utils/transform-rich-text.util';
|
||||
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
|
||||
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
|
||||
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
@@ -115,7 +115,7 @@ export class PageLayoutWidgetService {
|
||||
try {
|
||||
return {
|
||||
...configuration,
|
||||
body: await transformRichTextV2Value(configuration.body),
|
||||
body: await transformRichTextValue(configuration.body),
|
||||
};
|
||||
} catch {
|
||||
return configuration;
|
||||
|
||||
+1
@@ -245,6 +245,7 @@ describe('WorkspaceEntityManager', () => {
|
||||
IS_MARKETPLACE_ENABLED: false,
|
||||
IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED: false,
|
||||
IS_DRAFT_EMAIL_ENABLED: false,
|
||||
IS_RICH_TEXT_V1_MIGRATED: false,
|
||||
},
|
||||
userWorkspaceRoleMap: {},
|
||||
eventEmitterService: {
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ export const getSubfieldsForAggregateOperation = (
|
||||
'primaryPhoneCountryCode',
|
||||
'primaryPhoneCallingCode',
|
||||
];
|
||||
case FieldMetadataType.RICH_TEXT_V2:
|
||||
case FieldMetadataType.RICH_TEXT:
|
||||
return ['blocknote', 'markdown'];
|
||||
default:
|
||||
throw new Error(`Unsupported composite field type: ${fieldType}`);
|
||||
|
||||
+5
-5
@@ -23,7 +23,7 @@ import {
|
||||
type RatingFilter,
|
||||
type RawJsonFilter,
|
||||
type RecordGqlOperationFilter,
|
||||
type RichTextV2Filter,
|
||||
type RichTextFilter,
|
||||
type SelectFilter,
|
||||
type StringFilter,
|
||||
type TSVectorFilter,
|
||||
@@ -40,7 +40,7 @@ import {
|
||||
isMatchingMultiSelectFilter,
|
||||
isMatchingRatingFilter,
|
||||
isMatchingRawJsonFilter,
|
||||
isMatchingRichTextV2Filter,
|
||||
isMatchingRichTextFilter,
|
||||
isMatchingSelectFilter,
|
||||
isMatchingStringFilter,
|
||||
isMatchingTSVectorFilter,
|
||||
@@ -243,9 +243,9 @@ export const isRecordMatchingRLSRowLevelPermissionPredicate = ({
|
||||
value: recordFieldValue,
|
||||
});
|
||||
}
|
||||
case FieldMetadataType.RICH_TEXT_V2: {
|
||||
return isMatchingRichTextV2Filter({
|
||||
richTextV2Filter: filterValue as RichTextV2Filter,
|
||||
case FieldMetadataType.RICH_TEXT: {
|
||||
return isMatchingRichTextFilter({
|
||||
richTextFilter: filterValue as RichTextFilter,
|
||||
value: recordFieldValue,
|
||||
});
|
||||
}
|
||||
|
||||
+1
-1
@@ -324,7 +324,7 @@ export const convertObjectMetadataToSchemaProperties = ({
|
||||
type: 'object',
|
||||
};
|
||||
break;
|
||||
case FieldMetadataType.RICH_TEXT_V2:
|
||||
case FieldMetadataType.RICH_TEXT:
|
||||
itemProperty = {
|
||||
type: 'object',
|
||||
properties: {
|
||||
|
||||
+1
-1
@@ -151,7 +151,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({
|
||||
workspaceId,
|
||||
context: {
|
||||
fieldName: 'bodyV2',
|
||||
type: FieldMetadataType.RICH_TEXT_V2,
|
||||
type: FieldMetadataType.RICH_TEXT,
|
||||
label: 'Body',
|
||||
description: 'Note body',
|
||||
icon: 'IconFilePencil',
|
||||
|
||||
+1
-1
@@ -152,7 +152,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({
|
||||
workspaceId,
|
||||
context: {
|
||||
fieldName: 'bodyV2',
|
||||
type: FieldMetadataType.RICH_TEXT_V2,
|
||||
type: FieldMetadataType.RICH_TEXT,
|
||||
label: 'Body',
|
||||
description: 'Task body',
|
||||
icon: 'IconFilePencil',
|
||||
|
||||
+1
-1
@@ -367,7 +367,7 @@ You help users manage their workspace data model by creating, updating, and orga
|
||||
- **CURRENCY**: Monetary values
|
||||
- **RATING**: Star ratings
|
||||
- **RELATION**: Links to other objects
|
||||
- **RICH_TEXT_V2**: Formatted rich text content
|
||||
- **RICH_TEXT**: Formatted rich text content
|
||||
|
||||
## Best Practices
|
||||
|
||||
|
||||
+1
-1
@@ -63,7 +63,7 @@ describe('getTsVectorColumnExpressionFromFields', () => {
|
||||
|
||||
it('should handle rich text v2 fields', () => {
|
||||
const fields = [
|
||||
{ name: 'bodyV2', type: FieldMetadataType.RICH_TEXT_V2 },
|
||||
{ name: 'bodyV2', type: FieldMetadataType.RICH_TEXT },
|
||||
] as FieldTypeAndNameMetadata[];
|
||||
const result = getTsVectorColumnExpressionFromFields(fields);
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ const SEARCHABLE_FIELD_TYPES = [
|
||||
FieldMetadataType.ADDRESS,
|
||||
FieldMetadataType.LINKS,
|
||||
FieldMetadataType.PHONES,
|
||||
FieldMetadataType.RICH_TEXT_V2,
|
||||
FieldMetadataType.RICH_TEXT,
|
||||
FieldMetadataType.UUID,
|
||||
] as const;
|
||||
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ export const isSearchableSubfield = (
|
||||
}
|
||||
|
||||
switch (compositeFieldMetadataType) {
|
||||
case FieldMetadataType.RICH_TEXT_V2:
|
||||
case FieldMetadataType.RICH_TEXT:
|
||||
return ['markdown'].includes(subFieldName);
|
||||
case FieldMetadataType.PHONES:
|
||||
return ['primaryPhoneNumber', 'primaryPhoneCallingCode'].includes(
|
||||
|
||||
+3
-2
@@ -1,11 +1,12 @@
|
||||
import { FieldMetadataType } from 'twenty-shared/types';
|
||||
|
||||
// 'RICH_TEXT' kept as a raw string for pre-upgrade workspaces that haven't
|
||||
// yet run the 1.20 migrate-rich-text-to-text command.
|
||||
// Raw strings kept for pre-upgrade workspaces that haven't yet run
|
||||
// the 1.20 migrate-rich-text-to-text / rename-rich-text-v2 commands.
|
||||
export const isTextColumnType = (type: FieldMetadataType) => {
|
||||
return (
|
||||
type === FieldMetadataType.TEXT ||
|
||||
type === FieldMetadataType.ARRAY ||
|
||||
(type as string) === 'RICH_TEXT_V2' ||
|
||||
(type as string) === 'RICH_TEXT'
|
||||
);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user