From d9eb317bb5e5510087e5e6ef4bc3ee184e2abc2e Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Fri, 13 Mar 2026 19:07:55 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20rename=20RICH=5FTEXT=5FV2=20=E2=86=92?= =?UTF-8?q?=20RICH=5FTEXT=20in=20codebase=20(keep=20DB=20value)=20(#18628)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 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) --- .../ai-meeting-transcriptor/src/index.ts | 6 +- .../process-transcript/src/index.ts | 6 +- .../src/objects/call-recording.ts | 4 +- .../skills/call-transcript-summarization.ts | 2 +- .../src/generated-metadata/graphql.ts | 23 +++--- .../filterSortableFieldMetadataItems.test.ts | 6 +- .../utils/mapFieldMetadataToGraphQLQuery.ts | 2 +- .../hooks/useFieldListFieldMetadataItems.ts | 2 +- .../ui/components/FieldDisplay.tsx | 8 +-- .../record-field/ui/components/FieldInput.tsx | 4 +- .../ui/components/FormFieldInput.tsx | 12 ++-- ...ldInput.tsx => FormRichTextFieldInput.tsx} | 20 +++--- ...tsx => FormRichTextFieldInput.stories.tsx} | 10 +-- .../record-field/ui/hooks/usePersistField.ts | 12 ++-- ...ldDisplay.tsx => RichTextFieldDisplay.tsx} | 6 +- ...dDisplay.ts => useRichTextFieldDisplay.ts} | 12 ++-- .../input/components/RichTextFieldInput.tsx | 4 +- .../RichTextFieldInput.stories.tsx | 2 +- .../record-field/ui/types/FieldMetadata.ts | 6 +- .../ui/types/guards/assertFieldMetadata.ts | 6 +- ...sFieldRichTextV2.ts => isFieldRichText.ts} | 8 +-- .../ui/types/guards/isFieldRichTextValue.ts | 12 ++++ .../ui/types/guards/isFieldRichTextValueV2.ts | 12 ---- .../ui/utils/isFieldValueEmpty.ts | 8 +-- .../utils/isRecordMatchingFilter.ts | 10 +-- .../utils/buildValueFromFilter.ts | 2 +- .../hooks/useBuildSpreadSheetImportFields.ts | 2 +- ...ildRecordFromImportedStructuredRow.test.ts | 2 +- .../buildRecordFromImportedStructuredRow.ts | 4 +- .../utils/generateEmptyFieldValue.ts | 2 +- ...reatePageLayoutStandaloneRichTextWidget.ts | 4 +- .../createDefaultStandaloneRichTextWidget.ts | 4 +- .../constants/CompositeFieldSubFieldLabel.ts | 2 +- .../SettingsCompositeFieldTypeConfigs.ts | 14 ++-- .../data-model/types/CompositeFieldType.ts | 2 +- .../types/SettingsExcludedFieldType.ts | 2 +- .../__tests__/getSortIconForFieldType.test.ts | 4 +- .../hooks/useDownloadFakeRecords.ts | 2 +- .../WorkflowStepFilterFieldSelect.tsx | 2 +- .../WorkflowStepFilterValueInput.tsx | 2 +- .../utils/shouldDisplayFormField.ts | 2 +- .../constants/DefaultIconsByFieldType.ts | 2 +- .../SettingsObjectNewFieldSelect.tsx | 2 +- .../generated/data/notes/mock-notes-data.ts | 20 +++--- .../generated/data/tasks/mock-tasks-data.ts | 20 +++--- .../metadata/objects/mock-objects-metadata.ts | 4 +- .../clients/generated/metadata/schema.graphql | 7 +- .../src/clients/generated/metadata/schema.ts | 27 +++---- .../src/clients/generated/metadata/types.ts | 2 +- .../src/sdk/fields/composite-fields.ts | 2 +- .../1-20-migrate-rich-text-to-text.command.ts | 70 +++++++++++++++---- .../data-arg-processor.service.spec.ts.snap | 6 +- ...-inputs-by-field-metadata-type.constant.ts | 8 +-- ...-metadata-config-by-field-name.constant.ts | 6 +- ...-inputs-by-field-metadata-type.constant.ts | 10 +-- .../data-arg-processor.service.spec.ts | 4 +- .../null-equivalent-values.constant.ts | 5 +- .../data-arg-processor.service.ts | 10 +-- ...default-null-equivalent-value.util.spec.ts | 6 +- ...gres-default-null-equivalent-value.util.ts | 2 +- ...ate-rich-text-field-or-throw.util.spec.ts} | 18 ++--- ...validate-rich-text-field-or-throw.util.ts} | 10 +-- .../filter-arg-processor.service.spec.ts.snap | 4 +- ...-inputs-by-field-metadata-type.constant.ts | 6 +- ...-inputs-by-field-metadata-type.constant.ts | 4 +- .../constants/filter-operators.constant.ts | 2 +- .../get-operators-for-field-type.util.ts | 6 +- .../common-result-getters.service.ts | 6 +- ...field-query-result-getter.handler.spec.ts} | 18 ++--- ...text-field-query-result-getter.handler.ts} | 10 +-- .../input/rich-text.input-type.ts | 12 ++-- .../services/type-mapper.service.ts | 4 +- .../utils/generate-random-field-value.util.ts | 2 +- .../zod-schemas/field-filters.zod-schema.ts | 2 +- .../record-properties.zod-schema.ts | 2 +- .../record-input-transformer.service.ts | 6 +- ...v2.util.ts => transform-rich-text.util.ts} | 10 +-- .../composite-field-metadata-type.type.ts | 2 +- .../__tests__/compute-column-name.spec.ts | 2 +- .../is-composite-field-metadata-type.util.ts | 4 +- .../__mocks__/note-flat-fields.mock.ts | 2 +- .../__mocks__/task-flat-fields.mock.ts | 2 +- ...t-field-metadata-type-validator.service.ts | 2 +- .../flat-field-metadata.test-type.ts | 2 +- ...-to-flat-field-metadatas-to-create.util.ts | 2 +- ...t-v2-body.dto.ts => rich-text-body.dto.ts} | 6 +- .../standalone-rich-text-configuration.dto.ts | 8 +-- .../services/page-layout-widget.service.ts | 4 +- .../workspace-entity-manager.spec.ts | 1 + ...-subfields-for-aggregate-operation.util.ts | 2 +- ...rls-row-level-permission-predicate.util.ts | 10 +-- ...ject-metadata-to-schema-properties.util.ts | 2 +- ...-note-standard-flat-field-metadata.util.ts | 2 +- ...-task-standard-flat-field-metadata.util.ts | 2 +- ...reate-standard-flat-skill-metadata.util.ts | 2 +- ...ts-vectors-column-expression.utils.spec.ts | 2 +- .../utils/is-searchable-field.util.ts | 2 +- .../utils/is-searchable-subfield.util.ts | 2 +- .../utils/is-text-column-type.util.ts | 5 +- .../standard-objects/note.workspace-entity.ts | 6 +- .../standard-objects/task.workspace-entity.ts | 6 +- ...resolve-rich-text-fields-in-record.util.ts | 2 +- ...default-null-equivalent-value.util.spec.ts | 6 +- ...find-default-null-equivalent-value.util.ts | 2 +- .../test-object-gql-fields.constant.ts | 2 +- ...-input-validation.integration-spec.ts.snap | 5 ++ ...-input-validation.integration-spec.ts.snap | 5 -- ...e-input-by-field-metadata-type.constant.ts | 4 +- ...e-input-by-field-metadata-type.constant.ts | 8 +-- ...eate-input-validation.integration-spec.ts} | 2 +- .../types/field-metadata-type-to-test.ts | 2 +- ...get-field-metadata-creation-inputs.util.ts | 8 +-- ...h-text-field-metadata.integration-spec.ts} | 6 +- ...h-text-field-metadata.integration-spec.ts} | 6 +- .../CompositeFieldTypeSubFieldsNames.ts | 2 +- .../twenty-shared/src/types/FeatureFlagKey.ts | 1 + .../src/types/FieldMetadataDefaultValue.ts | 4 +- .../src/types/FieldMetadataType.ts | 2 +- .../src/types/RecordGqlOperationFilter.ts | 10 +-- .../composite-type-definitions.ts | 4 +- ...te-type.ts => rich-text.composite-type.ts} | 8 +-- packages/twenty-shared/src/types/index.ts | 14 ++-- .../__tests__/isFieldMetadataTextKind.test.ts | 2 +- .../fieldMetadata/isFieldMetadataTextKind.ts | 2 +- .../twenty-shared/src/utils/filter/index.ts | 2 +- ...st.ts => isMatchingRichTextFilter.test.ts} | 22 +++--- .../filter/utils/isMatchingRichTextFilter.ts | 25 +++++++ .../utils/isMatchingRichTextV2Filter.ts | 25 ------- packages/twenty-shared/src/utils/index.ts | 2 +- 129 files changed, 452 insertions(+), 401 deletions(-) rename packages/twenty-front/src/modules/object-record/record-field/ui/form-types/components/{FormRichTextV2FieldInput.tsx => FormRichTextFieldInput.tsx} (71%) rename packages/twenty-front/src/modules/object-record/record-field/ui/form-types/components/__stories__/{FormRichTextV2FieldInput.stories.tsx => FormRichTextFieldInput.stories.tsx} (95%) rename packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/display/components/{RichTextV2FieldDisplay.tsx => RichTextFieldDisplay.tsx} (70%) rename packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/hooks/{useRichTextV2FieldDisplay.ts => useRichTextFieldDisplay.ts} (63%) rename packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/{isFieldRichTextV2.ts => isFieldRichText.ts} (64%) create mode 100644 packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichTextValue.ts delete mode 100644 packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichTextValueV2.ts rename packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/__tests__/{validate-rich-text-v2-field-or-throw.util.spec.ts => validate-rich-text-field-or-throw.util.spec.ts} (61%) rename packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/{validate-rich-text-v2-field-or-throw.util.ts => validate-rich-text-field-or-throw.util.ts} (82%) rename packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/__tests__/{rich-text-v2-field-query-result-getter.handler.spec.ts => rich-text-field-query-result-getter.handler.spec.ts} (86%) rename packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/{rich-text-v2-field-query-result-getter.handler.ts => rich-text-field-query-result-getter.handler.ts} (91%) rename packages/twenty-server/src/engine/core-modules/record-transformer/utils/{transform-rich-text-v2.util.ts => transform-rich-text.util.ts} (92%) rename packages/twenty-server/src/engine/metadata-modules/page-layout-widget/dtos/{rich-text-v2-body.dto.ts => rich-text-body.dto.ts} (66%) create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-field-create-input-validation.integration-spec.ts.snap delete mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-v2-field-create-input-validation.integration-spec.ts.snap rename packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/{rich-text-v2-field-create-input-validation.integration-spec.ts => rich-text-field-create-input-validation.integration-spec.ts} (98%) rename packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/{successful-create-rich-text-v2-field-metadata.integration-spec.ts => successful-create-rich-text-field-metadata.integration-spec.ts} (96%) rename packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/{successful-update-rich-text-v2-field-metadata.integration-spec.ts => successful-update-rich-text-field-metadata.integration-spec.ts} (96%) rename packages/twenty-shared/src/types/composite-types/{rich-text-v2.composite-type.ts => rich-text.composite-type.ts} (73%) rename packages/twenty-shared/src/utils/filter/utils/__tests__/{isMatchingRichTextV2Filter.test.ts => isMatchingRichTextFilter.test.ts} (52%) create mode 100644 packages/twenty-shared/src/utils/filter/utils/isMatchingRichTextFilter.ts delete mode 100644 packages/twenty-shared/src/utils/filter/utils/isMatchingRichTextV2Filter.ts diff --git a/packages/twenty-apps/community/ai-meeting-transcript/serverlessFunctions/ai-meeting-transcriptor/src/index.ts b/packages/twenty-apps/community/ai-meeting-transcript/serverlessFunctions/ai-meeting-transcriptor/src/index.ts index b301835cef5..16b637776ee 100644 --- a/packages/twenty-apps/community/ai-meeting-transcript/serverlessFunctions/ai-meeting-transcriptor/src/index.ts +++ b/packages/twenty-apps/community/ai-meeting-transcript/serverlessFunctions/ai-meeting-transcriptor/src/index.ts @@ -30,7 +30,7 @@ type AnalysisResult = { commitments: Commitment[]; }; -type RichTextV2Data = { +type RichTextData = { markdown: string; blocknote: null; }; @@ -123,7 +123,7 @@ const createNoteInTwenty = async ( bodyV2: { markdown: noteBodyMarkdown, blocknote: null, - } satisfies RichTextV2Data, + } satisfies RichTextData, }; try { @@ -159,7 +159,7 @@ const createTaskInTwenty = async ( const taskData: { title: string; - bodyV2: RichTextV2Data; + bodyV2: RichTextData; dueAt?: string; } = { title: actionItem.title, diff --git a/packages/twenty-apps/community/meeting-transcript/serverlessFunctions/process-transcript/src/index.ts b/packages/twenty-apps/community/meeting-transcript/serverlessFunctions/process-transcript/src/index.ts index 59c1eda9d7f..6812e2afacf 100644 --- a/packages/twenty-apps/community/meeting-transcript/serverlessFunctions/process-transcript/src/index.ts +++ b/packages/twenty-apps/community/meeting-transcript/serverlessFunctions/process-transcript/src/index.ts @@ -32,7 +32,7 @@ type AnalysisResult = { commitments: Commitment[]; }; -type RichTextV2Data = { +type RichTextData = { markdown: string; blocknote: null; }; @@ -362,7 +362,7 @@ const createNoteInTwenty = async ( bodyV2: { markdown: noteBodyMarkdown, blocknote: null, - } satisfies RichTextV2Data, + } satisfies RichTextData, }; try { @@ -451,7 +451,7 @@ const createTaskInTwenty = async ( const taskData: { title: string; - bodyV2: RichTextV2Data; + bodyV2: RichTextData; dueAt?: string; assigneeId?: string; } = { diff --git a/packages/twenty-apps/internal/call-recording/src/objects/call-recording.ts b/packages/twenty-apps/internal/call-recording/src/objects/call-recording.ts index d1e6fdbc997..df51232615f 100644 --- a/packages/twenty-apps/internal/call-recording/src/objects/call-recording.ts +++ b/packages/twenty-apps/internal/call-recording/src/objects/call-recording.ts @@ -81,7 +81,7 @@ export default defineObject({ }, { universalIdentifier: TRANSCRIPT_FIELD_UNIVERSAL_IDENTIFIER, - type: FieldType.RICH_TEXT_V2, + type: FieldType.RICH_TEXT, name: 'transcript', label: 'Transcript', description: 'Human-readable transcript of the call', @@ -114,7 +114,7 @@ export default defineObject({ }, { universalIdentifier: SUMMARY_FIELD_UNIVERSAL_IDENTIFIER, - type: FieldType.RICH_TEXT_V2, + type: FieldType.RICH_TEXT, name: 'summary', label: 'Summary', description: 'AI-generated summary of the call', diff --git a/packages/twenty-apps/internal/call-recording/src/skills/call-transcript-summarization.ts b/packages/twenty-apps/internal/call-recording/src/skills/call-transcript-summarization.ts index 284df1d8f22..a6bbf04261b 100644 --- a/packages/twenty-apps/internal/call-recording/src/skills/call-transcript-summarization.ts +++ b/packages/twenty-apps/internal/call-recording/src/skills/call-transcript-summarization.ts @@ -16,7 +16,7 @@ Use this skill when a user asks you to summarize, analyze, or extract insights f ## How to Access the Data 1. Use \`find_one_callRecording\` to fetch the call recording by its ID. -2. Read the \`transcript\` field (RICH_TEXT_V2, markdown format) which contains the full conversation. +2. Read the \`transcript\` field (RICH_TEXT, markdown format) which contains the full conversation. 3. The transcript uses the format: **Speaker Name:** spoken text ## What to Produce diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index c9022dc057f..0d1f306dacf 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -1738,6 +1738,7 @@ export enum FeatureFlagKey { IS_NOTE_TARGET_MIGRATED = 'IS_NOTE_TARGET_MIGRATED', IS_PUBLIC_DOMAIN_ENABLED = 'IS_PUBLIC_DOMAIN_ENABLED', IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED = 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED', + IS_RICH_TEXT_V1_MIGRATED = 'IS_RICH_TEXT_V1_MIGRATED', IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED = 'IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED', IS_TASK_TARGET_MIGRATED = 'IS_TASK_TARGET_MIGRATED', IS_UNIQUE_INDEXES_ENABLED = 'IS_UNIQUE_INDEXES_ENABLED' @@ -1825,7 +1826,7 @@ export enum FieldMetadataType { RATING = 'RATING', RAW_JSON = 'RAW_JSON', RELATION = 'RELATION', - RICH_TEXT_V2 = 'RICH_TEXT_V2', + RICH_TEXT = 'RICH_TEXT', SELECT = 'SELECT', TEXT = 'TEXT', TS_VECTOR = 'TS_VECTOR', @@ -4586,8 +4587,8 @@ export type RevokeApiKeyInput = { id: Scalars['UUID']; }; -export type RichTextV2Body = { - __typename?: 'RichTextV2Body'; +export type RichTextBody = { + __typename?: 'RichTextBody'; blocknote?: Maybe; markdown?: Maybe; }; @@ -4792,7 +4793,7 @@ export enum SortNulls { export type StandaloneRichTextConfiguration = { __typename?: 'StandaloneRichTextConfiguration'; - body: RichTextV2Body; + body: RichTextBody; configurationType: WidgetConfigurationType; }; @@ -6247,9 +6248,9 @@ export type FindManyCommandMenuItemsQueryVariables = Exact<{ [key: string]: neve export type FindManyCommandMenuItemsQuery = { __typename?: 'Query', commandMenuItems: Array<{ __typename?: 'CommandMenuItem', id: string, workflowVersionId?: string | null, frontComponentId?: string | null, engineComponentKey?: EngineComponentKey | null, label: string, icon?: string | null, shortLabel?: string | null, position: number, isPinned: boolean, conditionalAvailabilityExpression?: string | null, availabilityType: CommandMenuItemAvailabilityType, availabilityObjectMetadataId?: string | null, frontComponent?: { __typename?: 'FrontComponent', id: string, name: string, isHeadless: boolean } | null }> }; -export type PageLayoutFragmentFragment = { __typename?: 'PageLayout', id: string, name: string, objectMetadataId?: string | null, type: PageLayoutType, defaultTabToFocusOnMobileAndSidePanelId?: string | null, createdAt: string, updatedAt: string, tabs?: Array<{ __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextV2Body', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }> | null }; +export type PageLayoutFragmentFragment = { __typename?: 'PageLayout', id: string, name: string, objectMetadataId?: string | null, type: PageLayoutType, defaultTabToFocusOnMobileAndSidePanelId?: string | null, createdAt: string, updatedAt: string, tabs?: Array<{ __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextBody', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }> | null }; -export type PageLayoutTabFragmentFragment = { __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextV2Body', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }; +export type PageLayoutTabFragmentFragment = { __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextBody', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }; export type DuplicateDashboardMutationVariables = Exact<{ id: Scalars['UUID']; @@ -6263,7 +6264,7 @@ export type FindOnePageLayoutQueryVariables = Exact<{ }>; -export type FindOnePageLayoutQuery = { __typename?: 'Query', getPageLayout?: { __typename?: 'PageLayout', id: string, name: string, objectMetadataId?: string | null, type: PageLayoutType, defaultTabToFocusOnMobileAndSidePanelId?: string | null, createdAt: string, updatedAt: string, tabs?: Array<{ __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextV2Body', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }> | null } | null }; +export type FindOnePageLayoutQuery = { __typename?: 'Query', getPageLayout?: { __typename?: 'PageLayout', id: string, name: string, objectMetadataId?: string | null, type: PageLayoutType, defaultTabToFocusOnMobileAndSidePanelId?: string | null, createdAt: string, updatedAt: string, tabs?: Array<{ __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextBody', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }> | null } | null }; export type UploadFilesFieldFileMutationVariables = Exact<{ file: Scalars['Upload']; @@ -6488,7 +6489,7 @@ export type SkipSyncEmailOnboardingStepMutationVariables = Exact<{ [key: string] export type SkipSyncEmailOnboardingStepMutation = { __typename?: 'Mutation', skipSyncEmailOnboardingStep: { __typename?: 'OnboardingStepSuccess', success: boolean } }; -export type PageLayoutWidgetFragmentFragment = { __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextV2Body', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }; +export type PageLayoutWidgetFragmentFragment = { __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextBody', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }; export type UpdatePageLayoutWithTabsAndWidgetsMutationVariables = Exact<{ id: Scalars['String']; @@ -6496,7 +6497,7 @@ export type UpdatePageLayoutWithTabsAndWidgetsMutationVariables = Exact<{ }>; -export type UpdatePageLayoutWithTabsAndWidgetsMutation = { __typename?: 'Mutation', updatePageLayoutWithTabsAndWidgets: { __typename?: 'PageLayout', id: string, name: string, type: PageLayoutType, objectMetadataId?: string | null, defaultTabToFocusOnMobileAndSidePanelId?: string | null, createdAt: string, updatedAt: string, deletedAt?: string | null, tabs?: Array<{ __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextV2Body', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }> | null } }; +export type UpdatePageLayoutWithTabsAndWidgetsMutation = { __typename?: 'Mutation', updatePageLayoutWithTabsAndWidgets: { __typename?: 'PageLayout', id: string, name: string, type: PageLayoutType, objectMetadataId?: string | null, defaultTabToFocusOnMobileAndSidePanelId?: string | null, createdAt: string, updatedAt: string, deletedAt?: string | null, tabs?: Array<{ __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextBody', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }> | null } }; export type UpsertFieldsWidgetMutationVariables = Exact<{ input: UpsertFieldsWidgetInput; @@ -6508,12 +6509,12 @@ export type UpsertFieldsWidgetMutation = { __typename?: 'Mutation', upsertFields export type FindAllPageLayoutsQueryVariables = Exact<{ [key: string]: never; }>; -export type FindAllPageLayoutsQuery = { __typename?: 'Query', getPageLayouts: Array<{ __typename?: 'PageLayout', id: string, name: string, objectMetadataId?: string | null, type: PageLayoutType, defaultTabToFocusOnMobileAndSidePanelId?: string | null, createdAt: string, updatedAt: string, tabs?: Array<{ __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextV2Body', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }> | null }> }; +export type FindAllPageLayoutsQuery = { __typename?: 'Query', getPageLayouts: Array<{ __typename?: 'PageLayout', id: string, name: string, objectMetadataId?: string | null, type: PageLayoutType, defaultTabToFocusOnMobileAndSidePanelId?: string | null, createdAt: string, updatedAt: string, tabs?: Array<{ __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextBody', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }> | null }> }; export type FindAllRecordPageLayoutsQueryVariables = Exact<{ [key: string]: never; }>; -export type FindAllRecordPageLayoutsQuery = { __typename?: 'Query', getPageLayouts: Array<{ __typename?: 'PageLayout', id: string, name: string, objectMetadataId?: string | null, type: PageLayoutType, defaultTabToFocusOnMobileAndSidePanelId?: string | null, createdAt: string, updatedAt: string, tabs?: Array<{ __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextV2Body', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }> | null }> }; +export type FindAllRecordPageLayoutsQuery = { __typename?: 'Query', getPageLayouts: Array<{ __typename?: 'PageLayout', id: string, name: string, objectMetadataId?: string | null, type: PageLayoutType, defaultTabToFocusOnMobileAndSidePanelId?: string | null, createdAt: string, updatedAt: string, tabs?: Array<{ __typename?: 'PageLayoutTab', id: string, applicationId: string, title: string, icon?: string | null, position: number, layoutMode?: PageLayoutTabLayoutMode | null, isOverridden: boolean, pageLayoutId: string, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: string, title: string, type: WidgetType, objectMetadataId?: string | null, isOverridden: boolean, createdAt: string, updatedAt: string, deletedAt?: string | null, conditionalDisplay?: any | null, pageLayoutTabId: string, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, position?: { __typename?: 'PageLayoutWidgetCanvasPosition', layoutMode: PageLayoutTabLayoutMode } | { __typename?: 'PageLayoutWidgetGridPosition', layoutMode: PageLayoutTabLayoutMode, row: number, column: number, rowSpan: number, columnSpan: number } | { __typename?: 'PageLayoutWidgetVerticalListPosition', layoutMode: PageLayoutTabLayoutMode, index: number } | null, configuration: { __typename?: 'AggregateChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, label?: string | null, displayDataLabel?: boolean | null, format?: string | null, description?: string | null, filter?: any | null, prefix?: string | null, suffix?: string | null, timezone?: string | null, firstDayOfTheWeek?: number | null, ratioAggregateConfig?: { __typename?: 'RatioAggregateConfig', fieldMetadataId: string, optionValue: string } | null } | { __typename?: 'BarChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null, layout: BarChartLayout, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'CalendarConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'EmailsConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldRichTextConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FieldsConfiguration', configurationType: WidgetConfigurationType, viewId?: string | null, newFieldDefaultVisibility?: boolean | null, shouldAllowUserToSeeHiddenFields?: boolean | null } | { __typename?: 'FilesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'FrontComponentConfiguration', configurationType: WidgetConfigurationType, frontComponentId: string } | { __typename?: 'GaugeChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'IframeConfiguration', configurationType: WidgetConfigurationType, url?: string | null } | { __typename?: 'LineChartConfiguration', configurationType: WidgetConfigurationType, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: string, primaryAxisGroupBySubFieldName?: string | null, primaryAxisDateGranularity?: ObjectRecordGroupByDateGranularity | null, primaryAxisOrderBy?: GraphOrderBy | null, primaryAxisManualSortOrder?: Array | null, secondaryAxisGroupByFieldMetadataId?: string | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisGroupByDateGranularity?: ObjectRecordGroupByDateGranularity | null, secondaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisManualSortOrder?: Array | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, displayLegend?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, isStacked?: boolean | null, isCumulative?: boolean | null, splitMultiValueFields?: boolean | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'NotesConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'PieChartConfiguration', configurationType: WidgetConfigurationType, groupByFieldMetadataId: string, aggregateFieldMetadataId: string, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, dateGranularity?: ObjectRecordGroupByDateGranularity | null, orderBy?: GraphOrderBy | null, manualSortOrder?: Array | null, displayDataLabel?: boolean | null, showCenterMetric?: boolean | null, displayLegend?: boolean | null, hideEmptyCategory?: boolean | null, splitMultiValueFields?: boolean | null, color?: string | null, description?: string | null, filter?: any | null, timezone?: string | null, firstDayOfTheWeek?: number | null } | { __typename?: 'StandaloneRichTextConfiguration', configurationType: WidgetConfigurationType, body: { __typename?: 'RichTextBody', blocknote?: string | null, markdown?: string | null } } | { __typename?: 'TasksConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'TimelineConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'ViewConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowRunConfiguration', configurationType: WidgetConfigurationType } | { __typename?: 'WorkflowVersionConfiguration', configurationType: WidgetConfigurationType } }> | null }> | null }> }; export type BarChartDataQueryVariables = Exact<{ input: BarChartDataInput; diff --git a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/filterSortableFieldMetadataItems.test.ts b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/filterSortableFieldMetadataItems.test.ts index 94e7c35ccf4..4e8686db661 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/filterSortableFieldMetadataItems.test.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/filterSortableFieldMetadataItems.test.ts @@ -96,12 +96,12 @@ describe('filterSortableFieldMetadataItems', () => { expect(filterSortableFieldMetadataItems(field)).toBe(false); }); - it('should NOT allow unsortable field types like RICH_TEXT_V2', () => { + it('should NOT allow unsortable field types like RICH_TEXT', () => { const field = { - type: FieldMetadataType.RICH_TEXT_V2, + type: FieldMetadataType.RICH_TEXT, isSystem: false, isActive: true, - name: 'richTextV2', + name: 'richText', }; expect(filterSortableFieldMetadataItems(field)).toBe(false); diff --git a/packages/twenty-front/src/modules/object-metadata/utils/mapFieldMetadataToGraphQLQuery.ts b/packages/twenty-front/src/modules/object-metadata/utils/mapFieldMetadataToGraphQLQuery.ts index 16de49cb565..d8937b524ab 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/mapFieldMetadataToGraphQLQuery.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/mapFieldMetadataToGraphQLQuery.ts @@ -310,7 +310,7 @@ ${mapObjectMetadataToGraphQLQuery({ }`; } - if (fieldType === FieldMetadataType.RICH_TEXT_V2) { + if (fieldType === FieldMetadataType.RICH_TEXT) { return `${gqlField} { blocknote diff --git a/packages/twenty-front/src/modules/object-record/record-field-list/hooks/useFieldListFieldMetadataItems.ts b/packages/twenty-front/src/modules/object-record/record-field-list/hooks/useFieldListFieldMetadataItems.ts index 725e3375c79..36ecc5c57f6 100644 --- a/packages/twenty-front/src/modules/object-record/record-field-list/hooks/useFieldListFieldMetadataItems.ts +++ b/packages/twenty-front/src/modules/object-record/record-field-list/hooks/useFieldListFieldMetadataItems.ts @@ -65,7 +65,7 @@ export const useFieldListFieldMetadataItems = ({ ) .filter( (fieldMetadataItem) => - fieldMetadataItem.type !== FieldMetadataType.RICH_TEXT_V2, + fieldMetadataItem.type !== FieldMetadataType.RICH_TEXT, ), (fieldMetadataItem) => fieldMetadataItem.type === FieldMetadataType.RELATION || diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/components/FieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/ui/components/FieldDisplay.tsx index 1bccc73ab92..9d03c6aa26c 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/components/FieldDisplay.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/components/FieldDisplay.tsx @@ -10,7 +10,7 @@ import { LinksFieldDisplay } from '@/object-record/record-field/ui/meta-types/di import { PhonesFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/PhonesFieldDisplay'; import { RatingFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/RatingFieldDisplay'; import { RelationFromManyFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/RelationFromManyFieldDisplay'; -import { RichTextV2FieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/RichTextV2FieldDisplay'; +import { RichTextFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/RichTextFieldDisplay'; import { isFieldIdentifierDisplay } from '@/object-record/record-field/ui/meta-types/display/utils/isFieldIdentifierDisplay'; import { isFieldActor } from '@/object-record/record-field/ui/types/guards/isFieldActor'; import { isFieldArray } from '@/object-record/record-field/ui/types/guards/isFieldArray'; @@ -20,7 +20,7 @@ import { isFieldFiles } from '@/object-record/record-field/ui/types/guards/isFie import { isFieldLinks } from '@/object-record/record-field/ui/types/guards/isFieldLinks'; import { isFieldPhones } from '@/object-record/record-field/ui/types/guards/isFieldPhones'; import { isFieldRating } from '@/object-record/record-field/ui/types/guards/isFieldRating'; -import { isFieldRichTextV2 } from '@/object-record/record-field/ui/types/guards/isFieldRichTextV2'; +import { isFieldRichText } from '@/object-record/record-field/ui/types/guards/isFieldRichText'; import { MorphRelationManyToOneFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/MorphRelationManyToOneFieldDisplay'; import { MorphRelationOneToManyFieldDisplay } from '@/object-record/record-field/ui/meta-types/display/components/MorphRelationOneToManyFieldDisplay'; @@ -110,8 +110,8 @@ export const FieldDisplay = () => { ) : isFieldRating(fieldDefinition) ? ( - ) : isFieldRichTextV2(fieldDefinition) ? ( - + ) : isFieldRichText(fieldDefinition) ? ( + ) : isFieldActor(fieldDefinition) ? ( ) : isFieldArray(fieldDefinition) ? ( diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/components/FieldInput.tsx b/packages/twenty-front/src/modules/object-record/record-field/ui/components/FieldInput.tsx index 3cfaf0fc362..867c11a8902 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/components/FieldInput.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/components/FieldInput.tsx @@ -36,7 +36,7 @@ import { isFieldRating } from '@/object-record/record-field/ui/types/guards/isFi import { isFieldRawJson } from '@/object-record/record-field/ui/types/guards/isFieldRawJson'; import { isFieldRelationManyToOne } from '@/object-record/record-field/ui/types/guards/isFieldRelationManyToOne'; import { isFieldRelationOneToMany } from '@/object-record/record-field/ui/types/guards/isFieldRelationOneToMany'; -import { isFieldRichTextV2 } from '@/object-record/record-field/ui/types/guards/isFieldRichTextV2'; +import { isFieldRichText } from '@/object-record/record-field/ui/types/guards/isFieldRichText'; import { isFieldSelect } from '@/object-record/record-field/ui/types/guards/isFieldSelect'; import { FieldContext } from '@/object-record/record-field/ui/contexts/FieldContext'; import { BooleanFieldInput } from '@/object-record/record-field/ui/meta-types/input/components/BooleanFieldInput'; @@ -94,7 +94,7 @@ export const FieldInput = () => { ) : isFieldArray(fieldDefinition) ? ( - ) : isFieldRichTextV2(fieldDefinition) ? ( + ) : isFieldRichText(fieldDefinition) ? ( ) : ( <> diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/components/FormFieldInput.tsx b/packages/twenty-front/src/modules/object-record/record-field/ui/components/FormFieldInput.tsx index 8e8f09ba7b0..fbbcaf5f10e 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/components/FormFieldInput.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/components/FormFieldInput.tsx @@ -13,7 +13,7 @@ import { FormNumberFieldInput } from '@/object-record/record-field/ui/form-types import { FormPhoneFieldInput } from '@/object-record/record-field/ui/form-types/components/FormPhoneFieldInput'; import { FormRawJsonFieldInput } from '@/object-record/record-field/ui/form-types/components/FormRawJsonFieldInput'; import { FormRelationToOneFieldInput } from '@/object-record/record-field/ui/form-types/components/FormRelationToOneFieldInput'; -import { FormRichTextV2FieldInput } from '@/object-record/record-field/ui/form-types/components/FormRichTextV2FieldInput'; +import { FormRichTextFieldInput } from '@/object-record/record-field/ui/form-types/components/FormRichTextFieldInput'; import { FormSelectFieldInput } from '@/object-record/record-field/ui/form-types/components/FormSelectFieldInput'; import { FormTextFieldInput } from '@/object-record/record-field/ui/form-types/components/FormTextFieldInput'; import { FormUuidFieldInput } from '@/object-record/record-field/ui/form-types/components/FormUuidFieldInput'; @@ -30,7 +30,7 @@ import { type FieldPhonesValue, type FieldRelationToOneValue, type FieldRelationValue, - type FieldRichTextV2Value, + type FieldRichTextValue, type FormFieldCurrencyValue, } from '@/object-record/record-field/ui/types/FieldMetadata'; import { isFieldAddress } from '@/object-record/record-field/ui/types/guards/isFieldAddress'; @@ -48,7 +48,7 @@ import { isFieldNumber } from '@/object-record/record-field/ui/types/guards/isFi import { isFieldPhones } from '@/object-record/record-field/ui/types/guards/isFieldPhones'; import { isFieldRawJson } from '@/object-record/record-field/ui/types/guards/isFieldRawJson'; import { isFieldRelationManyToOne } from '@/object-record/record-field/ui/types/guards/isFieldRelationManyToOne'; -import { isFieldRichTextV2 } from '@/object-record/record-field/ui/types/guards/isFieldRichTextV2'; +import { isFieldRichText } from '@/object-record/record-field/ui/types/guards/isFieldRichText'; import { isFieldSelect } from '@/object-record/record-field/ui/types/guards/isFieldSelect'; import { isFieldText } from '@/object-record/record-field/ui/types/guards/isFieldText'; import { isFieldUuid } from '@/object-record/record-field/ui/types/guards/isFieldUuid'; @@ -220,10 +220,10 @@ export const FormFieldInput = ({ VariablePicker={VariablePicker} readonly={readonly} /> - ) : isFieldRichTextV2(field) ? ( - void; + defaultValue: FieldRichTextValue | undefined; + onChange: (value: FieldRichTextValue) => void; onBlur?: () => void; readonly?: boolean; placeholder?: string; VariablePicker?: VariablePickerComponent; }; -const RICH_TEXT_V2_EDITOR_MIN_HEIGHT = 340; +const RICH_TEXT_EDITOR_MIN_HEIGHT = 340; -const RICH_TEXT_V2_EDITOR_MAX_WIDTH = 600; +const RICH_TEXT_EDITOR_MAX_WIDTH = 600; const mapTipTapToBlockNote = (tiptapJson: string): string => { try { @@ -30,7 +30,7 @@ const mapTipTapToBlockNote = (tiptapJson: string): string => { } }; -export const FormRichTextV2FieldInput = ({ +export const FormRichTextFieldInput = ({ label, error, hint, @@ -39,7 +39,7 @@ export const FormRichTextV2FieldInput = ({ onChange, readonly, VariablePicker, -}: FormRichTextV2FieldInputProps) => { +}: FormRichTextFieldInputProps) => { const handleChange = (value: string) => { onChange({ blocknote: mapTipTapToBlockNote(value), @@ -57,8 +57,8 @@ export const FormRichTextV2FieldInput = ({ onChange={handleChange} readonly={readonly} VariablePicker={VariablePicker} - minHeight={RICH_TEXT_V2_EDITOR_MIN_HEIGHT} - maxWidth={RICH_TEXT_V2_EDITOR_MAX_WIDTH} + minHeight={RICH_TEXT_EDITOR_MIN_HEIGHT} + maxWidth={RICH_TEXT_EDITOR_MAX_WIDTH} /> ); }; diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/form-types/components/__stories__/FormRichTextV2FieldInput.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/ui/form-types/components/__stories__/FormRichTextFieldInput.stories.tsx similarity index 95% rename from packages/twenty-front/src/modules/object-record/record-field/ui/form-types/components/__stories__/FormRichTextV2FieldInput.stories.tsx rename to packages/twenty-front/src/modules/object-record/record-field/ui/form-types/components/__stories__/FormRichTextFieldInput.stories.tsx index bb2676eb087..32db4d05f27 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/form-types/components/__stories__/FormRichTextV2FieldInput.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/form-types/components/__stories__/FormRichTextFieldInput.stories.tsx @@ -1,4 +1,4 @@ -import { FormRichTextV2FieldInput } from '@/object-record/record-field/ui/form-types/components/FormRichTextV2FieldInput'; +import { FormRichTextFieldInput } from '@/object-record/record-field/ui/form-types/components/FormRichTextFieldInput'; import { type Meta, type StoryObj } from '@storybook/react-vite'; import { expect, @@ -12,9 +12,9 @@ import { getUserDevice } from 'twenty-ui/utilities'; import { WorkflowStepDecorator } from '~/testing/decorators/WorkflowStepDecorator'; import { MOCKED_STEP_ID } from '~/testing/mock-data/workflow'; -const meta: Meta = { - title: 'UI/Data/Field/Form/Input/FormRichTextV2FieldInput', - component: FormRichTextV2FieldInput, +const meta: Meta = { + title: 'UI/Data/Field/Form/Input/FormRichTextFieldInput', + component: FormRichTextFieldInput, args: {}, argTypes: {}, decorators: [WorkflowStepDecorator], @@ -22,7 +22,7 @@ const meta: Meta = { export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Default: Story = { args: { diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/usePersistField.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/usePersistField.ts index 0fe2eb7f23c..3ad25496f55 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/usePersistField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/usePersistField.ts @@ -49,8 +49,8 @@ import { isFieldRating } from '@/object-record/record-field/ui/types/guards/isFi import { isFieldRatingValue } from '@/object-record/record-field/ui/types/guards/isFieldRatingValue'; import { isFieldRelationManyToOne } from '@/object-record/record-field/ui/types/guards/isFieldRelationManyToOne'; import { isFieldRelationManyToOneValue } from '@/object-record/record-field/ui/types/guards/isFieldRelationManyToOneValue'; -import { isFieldRichTextV2 } from '@/object-record/record-field/ui/types/guards/isFieldRichTextV2'; -import { isFieldRichTextV2Value } from '@/object-record/record-field/ui/types/guards/isFieldRichTextValueV2'; +import { isFieldRichText } from '@/object-record/record-field/ui/types/guards/isFieldRichText'; +import { isFieldRichTextValue } from '@/object-record/record-field/ui/types/guards/isFieldRichTextValue'; import { isFieldText } from '@/object-record/record-field/ui/types/guards/isFieldText'; import { isFieldTextValue } from '@/object-record/record-field/ui/types/guards/isFieldTextValue'; import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore'; @@ -143,9 +143,9 @@ export const usePersistField = ({ const fieldIsRawJson = isFieldRawJson(fieldDefinition) && isFieldRawJsonValue(valueToPersist); - const fieldIsRichTextV2 = - isFieldRichTextV2(fieldDefinition) && - isFieldRichTextV2Value(valueToPersist); + const fieldIsRichText = + isFieldRichText(fieldDefinition) && + isFieldRichTextValue(valueToPersist); const fieldIsArray = isFieldArray(fieldDefinition) && isFieldArrayValue(valueToPersist); @@ -179,7 +179,7 @@ export const usePersistField = ({ fieldIsRawJson || fieldIsArray || fieldIsFiles || - fieldIsRichTextV2; + fieldIsRichText; if (isValuePersistable) { const fieldName = fieldDefinition.metadata.fieldName; diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/display/components/RichTextV2FieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/display/components/RichTextFieldDisplay.tsx similarity index 70% rename from packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/display/components/RichTextV2FieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/display/components/RichTextFieldDisplay.tsx index 9cc21f07c7d..9aa3b04e891 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/display/components/RichTextV2FieldDisplay.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/display/components/RichTextFieldDisplay.tsx @@ -1,11 +1,11 @@ -import { useRichTextV2FieldDisplay } from '@/object-record/record-field/ui/meta-types/hooks/useRichTextV2FieldDisplay'; +import { useRichTextFieldDisplay } from '@/object-record/record-field/ui/meta-types/hooks/useRichTextFieldDisplay'; import { getFirstNonEmptyLineOfRichText } from '@/blocknote-editor/utils/getFirstNonEmptyLineOfRichText'; import type { PartialBlock } from '@blocknote/core'; import { isNonEmptyString } from '@sniptt/guards'; import { isDefined, parseJson } from 'twenty-shared/utils'; -export const RichTextV2FieldDisplay = () => { - const { fieldValue } = useRichTextV2FieldDisplay(); +export const RichTextFieldDisplay = () => { + const { fieldValue } = useRichTextFieldDisplay(); const blocks = isDefined(fieldValue) && isNonEmptyString(fieldValue.blocknote) diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/hooks/useRichTextV2FieldDisplay.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/hooks/useRichTextFieldDisplay.ts similarity index 63% rename from packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/hooks/useRichTextV2FieldDisplay.ts rename to packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/hooks/useRichTextFieldDisplay.ts index ef36cde0e74..ae384a44c71 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/hooks/useRichTextV2FieldDisplay.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/hooks/useRichTextFieldDisplay.ts @@ -1,24 +1,24 @@ import { useContext } from 'react'; -import { type FieldRichTextV2Value } from '@/object-record/record-field/ui/types/FieldMetadata'; +import { type FieldRichTextValue } from '@/object-record/record-field/ui/types/FieldMetadata'; import { assertFieldMetadata } from '@/object-record/record-field/ui/types/guards/assertFieldMetadata'; -import { isFieldRichTextV2 } from '@/object-record/record-field/ui/types/guards/isFieldRichTextV2'; +import { isFieldRichText } from '@/object-record/record-field/ui/types/guards/isFieldRichText'; import { useRecordFieldValue } from '@/object-record/record-store/hooks/useRecordFieldValue'; import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldContext } from '@/object-record/record-field/ui/contexts/FieldContext'; -export const useRichTextV2FieldDisplay = () => { +export const useRichTextFieldDisplay = () => { const { recordId, fieldDefinition } = useContext(FieldContext); assertFieldMetadata( - FieldMetadataType.RICH_TEXT_V2, - isFieldRichTextV2, + FieldMetadataType.RICH_TEXT, + isFieldRichText, fieldDefinition, ); const fieldName = fieldDefinition.metadata.fieldName; - const fieldValue = useRecordFieldValue( + const fieldValue = useRecordFieldValue( recordId, fieldName, fieldDefinition, diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/input/components/RichTextFieldInput.tsx b/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/input/components/RichTextFieldInput.tsx index 9100a70caa9..0a69020ee35 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/input/components/RichTextFieldInput.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/input/components/RichTextFieldInput.tsx @@ -7,7 +7,7 @@ import { RecordFieldComponentInstanceContext } from '@/object-record/record-fiel import { FieldContext } from '@/object-record/record-field/ui/contexts/FieldContext'; import { FieldInputEventContext } from '@/object-record/record-field/ui/contexts/FieldInputEventContext'; -import { type FieldRichTextV2Metadata } from '@/object-record/record-field/ui/types/FieldMetadata'; +import { type FieldRichTextMetadata } from '@/object-record/record-field/ui/types/FieldMetadata'; import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow'; import { styled } from '@linaria/react'; import { Suspense, lazy, useContext, useRef } from 'react'; @@ -59,7 +59,7 @@ export const RichTextFieldInput = () => { id: recordId, targetObjectNameSingular: ( fieldDefinition as { - metadata: FieldRichTextV2Metadata; + metadata: FieldRichTextMetadata; } ).metadata.objectMetadataNameSingular as | CoreObjectNameSingular.Note diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/input/components/__stories__/RichTextFieldInput.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/input/components/__stories__/RichTextFieldInput.stories.tsx index 1134d3a7c7e..d1940f7f507 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/input/components/__stories__/RichTextFieldInput.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/meta-types/input/components/__stories__/RichTextFieldInput.stories.tsx @@ -65,7 +65,7 @@ const RichTextFieldInputWithContext = () => { fieldDefinition: { fieldMetadataId: 'richText', label: 'Rich Text', - type: FieldMetadataType.RICH_TEXT_V2, + type: FieldMetadataType.RICH_TEXT, iconName: 'IconRichText', metadata: { fieldName: 'richText', diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldMetadata.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldMetadata.ts index 922b73b19a2..b51dabdf9b6 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldMetadata.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/types/FieldMetadata.ts @@ -131,7 +131,7 @@ export type FieldRawJsonMetadata = BaseFieldMetadata & { settings?: null; }; -export type FieldRichTextV2Metadata = BaseFieldMetadata & { +export type FieldRichTextMetadata = BaseFieldMetadata & { settings?: null; }; @@ -225,7 +225,7 @@ export type FieldMetadata = | FieldArrayMetadata | FieldTsVectorMetadata | FieldRawJsonMetadata - | FieldRichTextV2Metadata; + | FieldRichTextMetadata; export type FieldTextValue = string; export type FieldUUidValue = string; // TODO: can we replace with a template literal type, or maybe overkill ? @@ -279,7 +279,7 @@ export type FieldRelationValue< export type Json = ZodHelperLiteral | { [key: string]: Json } | Json[]; export type FieldJsonValue = Record | Json[] | null; -export type FieldRichTextV2Value = { +export type FieldRichTextValue = { blocknote: string | null; markdown: string | null; }; diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/assertFieldMetadata.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/assertFieldMetadata.ts index 7afe1bfb716..e10fd44eafa 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/assertFieldMetadata.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/assertFieldMetadata.ts @@ -24,7 +24,7 @@ import { type FieldRatingMetadata, type FieldRawJsonMetadata, type FieldRelationMetadata, - type FieldRichTextV2Metadata, + type FieldRichTextMetadata, type FieldSelectMetadata, type FieldTextMetadata, type FieldUuidMetadata, @@ -74,8 +74,8 @@ type AssertFieldMetadataFunction = < ? FieldAddressMetadata : E extends 'RAW_JSON' ? FieldRawJsonMetadata - : E extends 'RICH_TEXT_V2' - ? FieldRichTextV2Metadata + : E extends 'RICH_TEXT' + ? FieldRichTextMetadata : E extends 'ACTOR' ? FieldActorMetadata : E extends 'ARRAY' diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichTextV2.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichText.ts similarity index 64% rename from packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichTextV2.ts rename to packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichText.ts index e8b521d3b42..13fada8e50e 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichTextV2.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichText.ts @@ -3,10 +3,10 @@ import { FieldMetadataType } from '~/generated-metadata/graphql'; import { type FieldDefinition } from '@/object-record/record-field/ui/types/FieldDefinition'; import { type FieldMetadata, - type FieldRichTextV2Metadata, + type FieldRichTextMetadata, } from '@/object-record/record-field/ui/types/FieldMetadata'; -export const isFieldRichTextV2 = ( +export const isFieldRichText = ( field: Pick, 'type'>, -): field is FieldDefinition => - field.type === FieldMetadataType.RICH_TEXT_V2; +): field is FieldDefinition => + field.type === FieldMetadataType.RICH_TEXT; diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichTextValue.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichTextValue.ts new file mode 100644 index 00000000000..bb19b9f986e --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichTextValue.ts @@ -0,0 +1,12 @@ +import { type FieldRichTextValue } from '@/object-record/record-field/ui/types/FieldMetadata'; +import { z } from 'zod'; + +export const richTextSchema: z.ZodType = z.object({ + blocknote: z.string().nullable(), + markdown: z.string().nullable(), +}); + +export const isFieldRichTextValue = ( + fieldValue: unknown, +): fieldValue is FieldRichTextValue => + richTextSchema.safeParse(fieldValue).success; diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichTextValueV2.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichTextValueV2.ts deleted file mode 100644 index cdbb352aa67..00000000000 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldRichTextValueV2.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { type FieldRichTextV2Value } from '@/object-record/record-field/ui/types/FieldMetadata'; -import { z } from 'zod'; - -export const richTextV2Schema: z.ZodType = z.object({ - blocknote: z.string().nullable(), - markdown: z.string().nullable(), -}); - -export const isFieldRichTextV2Value = ( - fieldValue: unknown, -): fieldValue is FieldRichTextV2Value => - richTextV2Schema.safeParse(fieldValue).success; diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/utils/isFieldValueEmpty.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/utils/isFieldValueEmpty.ts index a7fca56f654..01316c0d3d5 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/utils/isFieldValueEmpty.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/utils/isFieldValueEmpty.ts @@ -32,8 +32,8 @@ import { isFieldPosition } from '@/object-record/record-field/ui/types/guards/is import { isFieldRating } from '@/object-record/record-field/ui/types/guards/isFieldRating'; import { isFieldRawJson } from '@/object-record/record-field/ui/types/guards/isFieldRawJson'; import { isFieldRelation } from '@/object-record/record-field/ui/types/guards/isFieldRelation'; -import { isFieldRichTextV2 } from '@/object-record/record-field/ui/types/guards/isFieldRichTextV2'; -import { isFieldRichTextV2Value } from '@/object-record/record-field/ui/types/guards/isFieldRichTextValueV2'; +import { isFieldRichText } from '@/object-record/record-field/ui/types/guards/isFieldRichText'; +import { isFieldRichTextValue } from '@/object-record/record-field/ui/types/guards/isFieldRichTextValue'; import { isFieldSelect } from '@/object-record/record-field/ui/types/guards/isFieldSelect'; import { isFieldSelectValue } from '@/object-record/record-field/ui/types/guards/isFieldSelectValue'; import { isFieldText } from '@/object-record/record-field/ui/types/guards/isFieldText'; @@ -177,9 +177,9 @@ export const isFieldValueEmpty = ({ return false; } - if (isFieldRichTextV2(fieldDefinition)) { + if (isFieldRichText(fieldDefinition)) { return ( - !isFieldRichTextV2Value(fieldValue) || isValueEmpty(fieldValue?.markdown) + !isFieldRichTextValue(fieldValue) || isValueEmpty(fieldValue?.markdown) ); } diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts index 72ba06ad493..8ad64057ed9 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.ts @@ -22,7 +22,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, @@ -235,9 +235,9 @@ export const isRecordMatchingFilter = ({ value: record[filterKey], }); } - case FieldMetadataType.RICH_TEXT_V2: { - return isMatchingRichTextV2Filter({ - richTextV2Filter: filterValue as RichTextV2Filter, + case FieldMetadataType.RICH_TEXT: { + return isMatchingRichTextFilter({ + richTextFilter: filterValue as RichTextFilter, value: record[filterKey], }); } diff --git a/packages/twenty-front/src/modules/object-record/record-table/utils/buildValueFromFilter.ts b/packages/twenty-front/src/modules/object-record/record-table/utils/buildValueFromFilter.ts index b5bb2ece067..5d1cd894eec 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/utils/buildValueFromFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/utils/buildValueFromFilter.ts @@ -375,7 +375,7 @@ const SUPPORTED_COMPOSITE_FIELD_TYPES: FieldMetadataType[] = [ FieldMetadataType.EMAILS, FieldMetadataType.PHONES, FieldMetadataType.ACTOR, - FieldMetadataType.RICH_TEXT_V2, + FieldMetadataType.RICH_TEXT, ]; const computeValueFromSubFieldType = ({ diff --git a/packages/twenty-front/src/modules/object-record/spreadsheet-import/hooks/useBuildSpreadSheetImportFields.ts b/packages/twenty-front/src/modules/object-record/spreadsheet-import/hooks/useBuildSpreadSheetImportFields.ts index e66676373e0..fc8c4e17a61 100644 --- a/packages/twenty-front/src/modules/object-record/spreadsheet-import/hooks/useBuildSpreadSheetImportFields.ts +++ b/packages/twenty-front/src/modules/object-record/spreadsheet-import/hooks/useBuildSpreadSheetImportFields.ts @@ -48,7 +48,7 @@ export const useBuildSpreadsheetImportFields = () => { case FieldMetadataType.FULL_NAME: case FieldMetadataType.LINKS: case FieldMetadataType.PHONES: - case FieldMetadataType.RICH_TEXT_V2: + case FieldMetadataType.RICH_TEXT: return handleCompositeFields({ fieldMetadataItem, fieldType: fieldMetadataItem.type, diff --git a/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/__tests__/buildRecordFromImportedStructuredRow.test.ts b/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/__tests__/buildRecordFromImportedStructuredRow.test.ts index 1d3ed13a192..8307a0eca2f 100644 --- a/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/__tests__/buildRecordFromImportedStructuredRow.test.ts +++ b/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/__tests__/buildRecordFromImportedStructuredRow.test.ts @@ -251,7 +251,7 @@ describe('buildRecordFromImportedStructuredRow', () => { universalIdentifier: '16', name: 'richTextField', label: 'Rich Text Field', - type: FieldMetadataType.RICH_TEXT_V2, + type: FieldMetadataType.RICH_TEXT, isNullable: true, isActive: true, isCustom: false, diff --git a/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/buildRecordFromImportedStructuredRow.ts b/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/buildRecordFromImportedStructuredRow.ts index 628513d0a15..97f730dd356 100644 --- a/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/buildRecordFromImportedStructuredRow.ts +++ b/packages/twenty-front/src/modules/object-record/spreadsheet-import/utils/buildRecordFromImportedStructuredRow.ts @@ -196,7 +196,7 @@ export const buildRecordFromImportedStructuredRow = ({ additionalPhones: phoneArrayJSONSchema.parse, }, - [FieldMetadataType.RICH_TEXT_V2]: { + [FieldMetadataType.RICH_TEXT]: { blocknote: castToString, markdown: castToString, }, @@ -222,7 +222,7 @@ export const buildRecordFromImportedStructuredRow = ({ case FieldMetadataType.CURRENCY: case FieldMetadataType.ADDRESS: case FieldMetadataType.LINKS: - case FieldMetadataType.RICH_TEXT_V2: + case FieldMetadataType.RICH_TEXT: case FieldMetadataType.EMAILS: case FieldMetadataType.FULL_NAME: { const compositeData = buildCompositeFieldRecord( diff --git a/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts b/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts index f50a22ee7db..74952c48f0f 100644 --- a/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts +++ b/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts @@ -95,7 +95,7 @@ export const generateEmptyFieldValue = ({ case FieldMetadataType.RAW_JSON: { return null; } - case FieldMetadataType.RICH_TEXT_V2: { + case FieldMetadataType.RICH_TEXT: { return { blocknote: null, markdown: null, diff --git a/packages/twenty-front/src/modules/page-layout/hooks/useCreatePageLayoutStandaloneRichTextWidget.ts b/packages/twenty-front/src/modules/page-layout/hooks/useCreatePageLayoutStandaloneRichTextWidget.ts index 9f33c1f87ff..67444858133 100644 --- a/packages/twenty-front/src/modules/page-layout/hooks/useCreatePageLayoutStandaloneRichTextWidget.ts +++ b/packages/twenty-front/src/modules/page-layout/hooks/useCreatePageLayoutStandaloneRichTextWidget.ts @@ -17,7 +17,7 @@ import { isDefined } from 'twenty-shared/utils'; import { v4 as uuidv4 } from 'uuid'; import { type PageLayoutWidget, - type RichTextV2Body, + type RichTextBody, WidgetType, } from '~/generated-metadata/graphql'; @@ -48,7 +48,7 @@ export const useCreatePageLayoutStandaloneRichTextWidget = ( ); const createPageLayoutStandaloneRichTextWidget = useCallback( - (body: RichTextV2Body): PageLayoutWidget => { + (body: RichTextBody): PageLayoutWidget => { const activeTabId = store.get( activeTabIdComponentState.atomFamily({ instanceId: tabListInstanceId, diff --git a/packages/twenty-front/src/modules/page-layout/utils/createDefaultStandaloneRichTextWidget.ts b/packages/twenty-front/src/modules/page-layout/utils/createDefaultStandaloneRichTextWidget.ts index 025c04bf066..5c00c4ad160 100644 --- a/packages/twenty-front/src/modules/page-layout/utils/createDefaultStandaloneRichTextWidget.ts +++ b/packages/twenty-front/src/modules/page-layout/utils/createDefaultStandaloneRichTextWidget.ts @@ -2,7 +2,7 @@ import { type GridPosition, PageLayoutTabLayoutMode, type PageLayoutWidget, - type RichTextV2Body, + type RichTextBody, WidgetConfigurationType, WidgetType, } from '~/generated-metadata/graphql'; @@ -10,7 +10,7 @@ import { export const createDefaultStandaloneRichTextWidget = ( id: string, pageLayoutTabId: string, - body: RichTextV2Body, + body: RichTextBody, gridPosition: GridPosition, objectMetadataId?: string | null, ): PageLayoutWidget => { diff --git a/packages/twenty-front/src/modules/settings/data-model/constants/CompositeFieldSubFieldLabel.ts b/packages/twenty-front/src/modules/settings/data-model/constants/CompositeFieldSubFieldLabel.ts index 2bd43325229..6a372075d98 100644 --- a/packages/twenty-front/src/modules/settings/data-model/constants/CompositeFieldSubFieldLabel.ts +++ b/packages/twenty-front/src/modules/settings/data-model/constants/CompositeFieldSubFieldLabel.ts @@ -43,7 +43,7 @@ export const COMPOSITE_FIELD_SUB_FIELD_LABELS: { workspaceMemberId: 'Workspace Member', context: 'Context', }, - [FieldMetadataType.RICH_TEXT_V2]: { + [FieldMetadataType.RICH_TEXT]: { blocknote: 'BlockNote', markdown: 'Markdown', }, diff --git a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts index 19f2ee496c9..7cd02af8cca 100644 --- a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts +++ b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts @@ -6,7 +6,7 @@ import { type FieldFullNameValue, type FieldLinksValue, type FieldPhonesValue, - type FieldRichTextV2Value, + type FieldRichTextValue, } from '@/object-record/record-field/ui/types/FieldMetadata'; import { COMPOSITE_FIELD_SUB_FIELD_LABELS } from '@/settings/data-model/constants/CompositeFieldSubFieldLabel'; import { type SettingsFieldTypeConfig } from '@/settings/data-model/constants/SettingsNonCompositeFieldTypeConfigs'; @@ -499,17 +499,17 @@ export const SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS = { }, ], } as const satisfies SettingsCompositeFieldTypeConfig, - [FieldMetadataType.RICH_TEXT_V2]: { + [FieldMetadataType.RICH_TEXT]: { label: 'Rich Text', Icon: IllustrationIconText, category: 'Basic', subFields: [ { subFieldName: - COMPOSITE_FIELD_TYPE_SUB_FIELDS_NAMES[FieldMetadataType.RICH_TEXT_V2] + COMPOSITE_FIELD_TYPE_SUB_FIELDS_NAMES[FieldMetadataType.RICH_TEXT] .blocknote, subFieldLabel: - COMPOSITE_FIELD_SUB_FIELD_LABELS[FieldMetadataType.RICH_TEXT_V2] + COMPOSITE_FIELD_SUB_FIELD_LABELS[FieldMetadataType.RICH_TEXT] .blocknote, isImportable: false, isFilterable: false, @@ -517,10 +517,10 @@ export const SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS = { }, { subFieldName: - COMPOSITE_FIELD_TYPE_SUB_FIELDS_NAMES[FieldMetadataType.RICH_TEXT_V2] + COMPOSITE_FIELD_TYPE_SUB_FIELDS_NAMES[FieldMetadataType.RICH_TEXT] .markdown, subFieldLabel: - COMPOSITE_FIELD_SUB_FIELD_LABELS[FieldMetadataType.RICH_TEXT_V2] + COMPOSITE_FIELD_SUB_FIELD_LABELS[FieldMetadataType.RICH_TEXT] .markdown, isImportable: true, isFilterable: false, @@ -541,5 +541,5 @@ export const SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS = { markdown: '# Hello Again', }, ], - } as const satisfies SettingsCompositeFieldTypeConfig, + } as const satisfies SettingsCompositeFieldTypeConfig, } as const satisfies SettingsCompositeFieldTypeConfigArray; diff --git a/packages/twenty-front/src/modules/settings/data-model/types/CompositeFieldType.ts b/packages/twenty-front/src/modules/settings/data-model/types/CompositeFieldType.ts index 8e1fbb8eec0..ce36d13f937 100644 --- a/packages/twenty-front/src/modules/settings/data-model/types/CompositeFieldType.ts +++ b/packages/twenty-front/src/modules/settings/data-model/types/CompositeFieldType.ts @@ -10,7 +10,7 @@ export const COMPOSITE_FIELD_TYPES = [ 'PHONES', 'FULL_NAME', 'ACTOR', - 'RICH_TEXT_V2', + 'RICH_TEXT', ] as const; type CompositeFieldTypeBaseLiteral = (typeof COMPOSITE_FIELD_TYPES)[number]; diff --git a/packages/twenty-front/src/modules/settings/data-model/types/SettingsExcludedFieldType.ts b/packages/twenty-front/src/modules/settings/data-model/types/SettingsExcludedFieldType.ts index 49204ec0533..627215b6339 100644 --- a/packages/twenty-front/src/modules/settings/data-model/types/SettingsExcludedFieldType.ts +++ b/packages/twenty-front/src/modules/settings/data-model/types/SettingsExcludedFieldType.ts @@ -3,5 +3,5 @@ import { type PickLiteral } from '~/types/PickLiteral'; export type SettingsExcludedFieldType = PickLiteral< FieldType, - 'POSITION' | 'TS_VECTOR' | 'RICH_TEXT_V2' | 'NUMERIC' + 'POSITION' | 'TS_VECTOR' | 'RICH_TEXT' | 'NUMERIC' >; diff --git a/packages/twenty-front/src/modules/side-panel/pages/page-layout/utils/__tests__/getSortIconForFieldType.test.ts b/packages/twenty-front/src/modules/side-panel/pages/page-layout/utils/__tests__/getSortIconForFieldType.test.ts index 7a9fb9914ce..d812436d629 100644 --- a/packages/twenty-front/src/modules/side-panel/pages/page-layout/utils/__tests__/getSortIconForFieldType.test.ts +++ b/packages/twenty-front/src/modules/side-panel/pages/page-layout/utils/__tests__/getSortIconForFieldType.test.ts @@ -51,10 +51,10 @@ describe('getSortIconForFieldType', () => { ).toBe(IconSortDescendingLetters); }); - it('should return IconSortAscendingLetters for RICH_TEXT_V2 field ascending', () => { + it('should return IconSortAscendingLetters for RICH_TEXT field ascending', () => { expect( getSortIconForFieldType({ - fieldType: FieldMetadataType.RICH_TEXT_V2, + fieldType: FieldMetadataType.RICH_TEXT, orderBy: GraphOrderBy.FIELD_ASC, }), ).toBe(IconSortAscendingLetters); diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/hooks/useDownloadFakeRecords.ts b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/hooks/useDownloadFakeRecords.ts index f85edba34a1..a2bc81d3b4f 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/hooks/useDownloadFakeRecords.ts +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/hooks/useDownloadFakeRecords.ts @@ -41,7 +41,7 @@ export const useDownloadFakeRecords = () => { break; } - case FieldMetadataType.RICH_TEXT_V2: + case FieldMetadataType.RICH_TEXT: case FieldMetadataType.ACTOR: case FieldMetadataType.EMAILS: case FieldMetadataType.CURRENCY: diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterFieldSelect.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterFieldSelect.tsx index cfb975aa004..9c9ab0cf4c4 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterFieldSelect.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterFieldSelect.tsx @@ -22,7 +22,7 @@ type WorkflowStepFilterFieldSelectProps = { }; const NON_SELECTABLE_FIELD_TYPES = [ - FieldMetadataType.RICH_TEXT_V2, + FieldMetadataType.RICH_TEXT, FieldMetadataType.RATING, ]; diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterValueInput.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterValueInput.tsx index 0b721f278ab..d1236e71b82 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterValueInput.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterValueInput.tsx @@ -59,7 +59,7 @@ const isFilterableFieldType = ( FieldMetadataType.SELECT, FieldMetadataType.MULTI_SELECT, FieldMetadataType.RAW_JSON, - FieldMetadataType.RICH_TEXT_V2, + FieldMetadataType.RICH_TEXT, FieldMetadataType.ARRAY, FieldMetadataType.UUID, FieldMetadataType.RELATION, diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/utils/shouldDisplayFormField.ts b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/utils/shouldDisplayFormField.ts index 605bb1aacab..d2a4baa739c 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/utils/shouldDisplayFormField.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/utils/shouldDisplayFormField.ts @@ -22,7 +22,7 @@ const SUPPORTED_FORM_FIELD_TYPES = [ FieldMetadataType.UUID, FieldMetadataType.ARRAY, FieldMetadataType.RELATION, - FieldMetadataType.RICH_TEXT_V2, + FieldMetadataType.RICH_TEXT, ]; export const shouldDisplayFormField = ({ diff --git a/packages/twenty-front/src/pages/settings/data-model/constants/DefaultIconsByFieldType.ts b/packages/twenty-front/src/pages/settings/data-model/constants/DefaultIconsByFieldType.ts index da6fb232fdd..f60766482f2 100644 --- a/packages/twenty-front/src/pages/settings/data-model/constants/DefaultIconsByFieldType.ts +++ b/packages/twenty-front/src/pages/settings/data-model/constants/DefaultIconsByFieldType.ts @@ -24,6 +24,6 @@ export const DEFAULT_ICONS_BY_FIELD_TYPE: Record = { [FieldMetadataType.ACTOR]: 'IconUsers', [FieldMetadataType.NUMERIC]: 'IconUsers', [FieldMetadataType.POSITION]: 'IconUsers', - [FieldMetadataType.RICH_TEXT_V2]: 'IconUsers', + [FieldMetadataType.RICH_TEXT]: 'IconUsers', [FieldMetadataType.TS_VECTOR]: 'IconUsers', }; diff --git a/packages/twenty-front/src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx b/packages/twenty-front/src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx index 7f9b47d45e2..33865fbf304 100644 --- a/packages/twenty-front/src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx +++ b/packages/twenty-front/src/pages/settings/data-model/new-field/SettingsObjectNewFieldSelect.tsx @@ -47,7 +47,7 @@ export const SettingsObjectNewFieldSelect = () => { const excludedFieldTypes: FieldType[] = ( [ FieldMetadataType.NUMERIC, - FieldMetadataType.RICH_TEXT_V2, + FieldMetadataType.RICH_TEXT, FieldMetadataType.ACTOR, FieldMetadataType.UUID, ] as const diff --git a/packages/twenty-front/src/testing/mock-data/generated/data/notes/mock-notes-data.ts b/packages/twenty-front/src/testing/mock-data/generated/data/notes/mock-notes-data.ts index a2aaa7e61dc..9eac4cf44eb 100644 --- a/packages/twenty-front/src/testing/mock-data/generated/data/notes/mock-notes-data.ts +++ b/packages/twenty-front/src/testing/mock-data/generated/data/notes/mock-notes-data.ts @@ -23,7 +23,7 @@ export const mockedNoteRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-1\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Great conversation today about potential collaboration opportunities. Next steps discussed include proposal review and timeline planning.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Great conversation today about potential collaboration opportunities. Next steps discussed include proposal review and timeline planning." }, @@ -106,7 +106,7 @@ export const mockedNoteRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-2\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Reviewed current project status and identified key deliverables for the upcoming quarter. Timeline adjustments may be needed.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Reviewed current project status and identified key deliverables for the upcoming quarter. Timeline adjustments may be needed." }, @@ -189,7 +189,7 @@ export const mockedNoteRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-3\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Impressive background in technology and leadership. Strong potential for senior roles in upcoming projects.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Impressive background in technology and leadership. Strong potential for senior roles in upcoming projects." }, @@ -272,7 +272,7 @@ export const mockedNoteRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-4\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Made connection at industry conference. Shared interests in digital transformation and innovation strategies.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Made connection at industry conference. Shared interests in digital transformation and innovation strategies." }, @@ -355,7 +355,7 @@ export const mockedNoteRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-5\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Strong candidate with relevant experience. Technical skills align well with team requirements. Positive cultural fit assessment.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Strong candidate with relevant experience. Technical skills align well with team requirements. Positive cultural fit assessment." }, @@ -438,7 +438,7 @@ export const mockedNoteRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-6\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Quarterly review completed. Exceeded targets in key areas. Discussed career development opportunities and growth plans.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Quarterly review completed. Exceeded targets in key areas. Discussed career development opportunities and growth plans." }, @@ -521,7 +521,7 @@ export const mockedNoteRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-7\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Completed certification program successfully. Ready to take on expanded responsibilities in the next phase.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Completed certification program successfully. Ready to take on expanded responsibilities in the next phase." }, @@ -604,7 +604,7 @@ export const mockedNoteRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-8\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Long-standing professional relationship. Reliable partner for complex initiatives. High satisfaction ratings.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Long-standing professional relationship. Reliable partner for complex initiatives. High satisfaction ratings." }, @@ -687,7 +687,7 @@ export const mockedNoteRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-9\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Great conversation today about potential collaboration opportunities. Next steps discussed include proposal review and timeline planning.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Great conversation today about potential collaboration opportunities. Next steps discussed include proposal review and timeline planning." }, @@ -770,7 +770,7 @@ export const mockedNoteRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-10\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Reviewed current project status and identified key deliverables for the upcoming quarter. Timeline adjustments may be needed.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Reviewed current project status and identified key deliverables for the upcoming quarter. Timeline adjustments may be needed." }, diff --git a/packages/twenty-front/src/testing/mock-data/generated/data/tasks/mock-tasks-data.ts b/packages/twenty-front/src/testing/mock-data/generated/data/tasks/mock-tasks-data.ts index 5ab3329ab8f..ea7fda378e1 100644 --- a/packages/twenty-front/src/testing/mock-data/generated/data/tasks/mock-tasks-data.ts +++ b/packages/twenty-front/src/testing/mock-data/generated/data/tasks/mock-tasks-data.ts @@ -33,7 +33,7 @@ export const mockedTaskRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-1\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Arrange a follow-up call to discuss project details and next steps.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Arrange a follow-up call to discuss project details and next steps." }, @@ -128,7 +128,7 @@ export const mockedTaskRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-2\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Prepare and send the project proposal document with timeline and deliverables.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Prepare and send the project proposal document with timeline and deliverables." }, @@ -223,7 +223,7 @@ export const mockedTaskRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-3\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Review the contract terms and conditions before final approval.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Review the contract terms and conditions before final approval." }, @@ -318,7 +318,7 @@ export const mockedTaskRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-4\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Create detailed agenda for upcoming strategy meeting.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Create detailed agenda for upcoming strategy meeting." }, @@ -413,7 +413,7 @@ export const mockedTaskRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-5\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Verify and update contact details in the system.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Verify and update contact details in the system." }, @@ -508,7 +508,7 @@ export const mockedTaskRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-6\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Complete reference verification for background check process.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Complete reference verification for background check process." }, @@ -603,7 +603,7 @@ export const mockedTaskRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-7\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Send portfolio examples and case studies for review.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Send portfolio examples and case studies for review." }, @@ -698,7 +698,7 @@ export const mockedTaskRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-8\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Prepare onboarding materials and schedule orientation session.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Prepare onboarding materials and schedule orientation session." }, @@ -793,7 +793,7 @@ export const mockedTaskRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-9\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Arrange a follow-up call to discuss project details and next steps.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Arrange a follow-up call to discuss project details and next steps." }, @@ -888,7 +888,7 @@ export const mockedTaskRecords: ObjectRecord[] = ] }, "bodyV2": { - "__typename": "RichTextV2", + "__typename": "RichText", "blocknote": "[{\"id\":\"block-10\",\"type\":\"paragraph\",\"props\":{\"textColor\":\"default\",\"backgroundColor\":\"default\",\"textAlignment\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Prepare and send the project proposal document with timeline and deliverables.\",\"styles\":{}}],\"children\":[]}]", "markdown": "Prepare and send the project proposal document with timeline and deliverables." }, diff --git a/packages/twenty-front/src/testing/mock-data/generated/metadata/objects/mock-objects-metadata.ts b/packages/twenty-front/src/testing/mock-data/generated/metadata/objects/mock-objects-metadata.ts index 50e494c5436..a548b3c763b 100644 --- a/packages/twenty-front/src/testing/mock-data/generated/metadata/objects/mock-objects-metadata.ts +++ b/packages/twenty-front/src/testing/mock-data/generated/metadata/objects/mock-objects-metadata.ts @@ -8638,7 +8638,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "__typename": "Field", "id": "15cffcf2-ed38-4ee1-956a-d8bc9d2bef16", "universalIdentifier": "20202020-4aa0-4ae8-898d-7df0afd47ab1", - "type": "RICH_TEXT_V2", + "type": "RICH_TEXT", "name": "bodyV2", "label": "Body", "description": "Task body", @@ -23733,7 +23733,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = "__typename": "Field", "id": "71961f86-5386-4cc9-b23a-39fc5c1c7c5e", "universalIdentifier": "20202020-a7bb-4d94-be51-8f25181502c8", - "type": "RICH_TEXT_V2", + "type": "RICH_TEXT", "name": "bodyV2", "label": "Body", "description": "Note body", diff --git a/packages/twenty-sdk/src/clients/generated/metadata/schema.graphql b/packages/twenty-sdk/src/clients/generated/metadata/schema.graphql index ff433001db3..43a683e3e8c 100644 --- a/packages/twenty-sdk/src/clients/generated/metadata/schema.graphql +++ b/packages/twenty-sdk/src/clients/generated/metadata/schema.graphql @@ -374,7 +374,7 @@ enum FieldMetadataType { RATING RAW_JSON RELATION - RICH_TEXT_V2 + RICH_TEXT SELECT TEXT TS_VECTOR @@ -873,7 +873,7 @@ type RatioAggregateConfig { optionValue: String! } -type RichTextV2Body { +type RichTextBody { blocknote: String markdown: String } @@ -990,7 +990,7 @@ enum WidgetConfigurationType { type StandaloneRichTextConfiguration { configurationType: WidgetConfigurationType! - body: RichTextV2Body! + body: RichTextBody! } type PieChartConfiguration { @@ -1606,6 +1606,7 @@ enum FeatureFlagKey { IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED IS_DRAFT_EMAIL_ENABLED + IS_RICH_TEXT_V1_MIGRATED } type SSOIdentityProvider { diff --git a/packages/twenty-sdk/src/clients/generated/metadata/schema.ts b/packages/twenty-sdk/src/clients/generated/metadata/schema.ts index db5025569c6..a58d63fc273 100644 --- a/packages/twenty-sdk/src/clients/generated/metadata/schema.ts +++ b/packages/twenty-sdk/src/clients/generated/metadata/schema.ts @@ -309,7 +309,7 @@ export interface Field { /** Type of the field */ -export type FieldMetadataType = 'ACTOR' | 'ADDRESS' | 'ARRAY' | 'BOOLEAN' | 'CURRENCY' | 'DATE' | 'DATE_TIME' | 'EMAILS' | 'FILES' | 'FULL_NAME' | 'LINKS' | 'MORPH_RELATION' | 'MULTI_SELECT' | 'NUMBER' | 'NUMERIC' | 'PHONES' | 'POSITION' | 'RATING' | 'RAW_JSON' | 'RELATION' | 'RICH_TEXT_V2' | 'SELECT' | 'TEXT' | 'TS_VECTOR' | 'UUID' +export type FieldMetadataType = 'ACTOR' | 'ADDRESS' | 'ARRAY' | 'BOOLEAN' | 'CURRENCY' | 'DATE' | 'DATE_TIME' | 'EMAILS' | 'FILES' | 'FULL_NAME' | 'LINKS' | 'MORPH_RELATION' | 'MULTI_SELECT' | 'NUMBER' | 'NUMERIC' | 'PHONES' | 'POSITION' | 'RATING' | 'RAW_JSON' | 'RELATION' | 'RICH_TEXT' | 'SELECT' | 'TEXT' | 'TS_VECTOR' | 'UUID' export interface IndexField { id: Scalars['UUID'] @@ -646,10 +646,10 @@ export interface RatioAggregateConfig { __typename: 'RatioAggregateConfig' } -export interface RichTextV2Body { +export interface RichTextBody { blocknote?: Scalars['String'] markdown?: Scalars['String'] - __typename: 'RichTextV2Body' + __typename: 'RichTextBody' } export interface GridPosition { @@ -726,7 +726,7 @@ export type WidgetConfigurationType = 'AGGREGATE_CHART' | 'GAUGE_CHART' | 'PIE_C export interface StandaloneRichTextConfiguration { configurationType: WidgetConfigurationType - body: RichTextV2Body + body: RichTextBody __typename: 'StandaloneRichTextConfiguration' } @@ -1310,7 +1310,7 @@ export interface FeatureFlag { __typename: 'FeatureFlag' } -export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_AI_ENABLED' | 'IS_APPLICATION_ENABLED' | 'IS_MARKETPLACE_ENABLED' | 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAILING_DOMAIN_ENABLED' | 'IS_DASHBOARD_V2_ENABLED' | 'IS_ATTACHMENT_MIGRATED' | 'IS_NOTE_TARGET_MIGRATED' | 'IS_TASK_TARGET_MIGRATED' | 'IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_COMMAND_MENU_ITEM_ENABLED' | 'IS_NAVIGATION_MENU_ITEM_ENABLED' | 'IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED' | 'IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED' | 'IS_DRAFT_EMAIL_ENABLED' +export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_AI_ENABLED' | 'IS_APPLICATION_ENABLED' | 'IS_MARKETPLACE_ENABLED' | 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAILING_DOMAIN_ENABLED' | 'IS_DASHBOARD_V2_ENABLED' | 'IS_ATTACHMENT_MIGRATED' | 'IS_NOTE_TARGET_MIGRATED' | 'IS_TASK_TARGET_MIGRATED' | 'IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_COMMAND_MENU_ITEM_ENABLED' | 'IS_NAVIGATION_MENU_ITEM_ENABLED' | 'IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED' | 'IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED' | 'IS_DRAFT_EMAIL_ENABLED' | 'IS_RICH_TEXT_V1_MIGRATED' export interface SSOIdentityProvider { id: Scalars['UUID'] @@ -3512,7 +3512,7 @@ export interface RatioAggregateConfigGenqlSelection{ __scalar?: boolean | number } -export interface RichTextV2BodyGenqlSelection{ +export interface RichTextBodyGenqlSelection{ blocknote?: boolean | number markdown?: boolean | number __typename?: boolean | number @@ -3621,7 +3621,7 @@ export interface AggregateChartConfigurationGenqlSelection{ export interface StandaloneRichTextConfigurationGenqlSelection{ configurationType?: boolean | number - body?: RichTextV2BodyGenqlSelection + body?: RichTextBodyGenqlSelection __typename?: boolean | number __scalar?: boolean | number } @@ -6495,10 +6495,10 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null - const RichTextV2Body_possibleTypes: string[] = ['RichTextV2Body'] - export const isRichTextV2Body = (obj?: { __typename?: any } | null): obj is RichTextV2Body => { - if (!obj?.__typename) throw new Error('__typename is missing in "isRichTextV2Body"') - return RichTextV2Body_possibleTypes.includes(obj.__typename) + const RichTextBody_possibleTypes: string[] = ['RichTextBody'] + export const isRichTextBody = (obj?: { __typename?: any } | null): obj is RichTextBody => { + if (!obj?.__typename) throw new Error('__typename is missing in "isRichTextBody"') + return RichTextBody_possibleTypes.includes(obj.__typename) } @@ -8290,7 +8290,7 @@ export const enumFieldMetadataType = { RATING: 'RATING' as const, RAW_JSON: 'RAW_JSON' as const, RELATION: 'RELATION' as const, - RICH_TEXT_V2: 'RICH_TEXT_V2' as const, + RICH_TEXT: 'RICH_TEXT' as const, SELECT: 'SELECT' as const, TEXT: 'TEXT' as const, TS_VECTOR: 'TS_VECTOR' as const, @@ -8570,7 +8570,8 @@ export const enumFeatureFlagKey = { IS_NAVIGATION_MENU_ITEM_ENABLED: 'IS_NAVIGATION_MENU_ITEM_ENABLED' as const, IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED: 'IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED' as const, IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED: 'IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED' as const, - IS_DRAFT_EMAIL_ENABLED: 'IS_DRAFT_EMAIL_ENABLED' as const + IS_DRAFT_EMAIL_ENABLED: 'IS_DRAFT_EMAIL_ENABLED' as const, + IS_RICH_TEXT_V1_MIGRATED: 'IS_RICH_TEXT_V1_MIGRATED' as const } export const enumRelationType = { diff --git a/packages/twenty-sdk/src/clients/generated/metadata/types.ts b/packages/twenty-sdk/src/clients/generated/metadata/types.ts index d83a2cc4d70..4310f944f22 100644 --- a/packages/twenty-sdk/src/clients/generated/metadata/types.ts +++ b/packages/twenty-sdk/src/clients/generated/metadata/types.ts @@ -1822,7 +1822,7 @@ export default { 1 ] }, - "RichTextV2Body": { + "RichTextBody": { "blocknote": [ 1 ], diff --git a/packages/twenty-sdk/src/sdk/fields/composite-fields.ts b/packages/twenty-sdk/src/sdk/fields/composite-fields.ts index 603efa53c58..e89c796fd37 100644 --- a/packages/twenty-sdk/src/sdk/fields/composite-fields.ts +++ b/packages/twenty-sdk/src/sdk/fields/composite-fields.ts @@ -6,5 +6,5 @@ export type { FullNameMetadata as FullNameField, LinksMetadata as LinksField, PhonesMetadata as PhonesField, - RichTextV2Metadata as RichTextField, + RichTextMetadata as RichTextField, } from 'twenty-shared/types'; diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-migrate-rich-text-to-text.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-migrate-rich-text-to-text.command.ts index 533b5368284..a2b8b4a412c 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-migrate-rich-text-to-text.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-migrate-rich-text-to-text.command.ts @@ -1,10 +1,12 @@ import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; import { Command } from 'nest-commander'; +import { FeatureFlagKey } from 'twenty-shared/types'; import { DataSource, Repository } from 'typeorm'; import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; +import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; @@ -18,7 +20,7 @@ import { type WorkspaceCacheKeyName } from 'src/engine/workspace-cache/types/wor @Command({ name: 'upgrade:1-20:migrate-rich-text-to-text', description: - 'Migrate deprecated RICH_TEXT field metadata type to TEXT. The underlying column type is already text, so only the metadata needs updating.', + 'Migrate deprecated RICH_TEXT (V1) to TEXT and rename RICH_TEXT_V2 to RICH_TEXT. The underlying column type is already text, so only the metadata needs updating.', }) export class MigrateRichTextToTextCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { constructor( @@ -28,6 +30,7 @@ export class MigrateRichTextToTextCommand extends ActiveOrSuspendedWorkspacesMig private readonly coreDataSource: DataSource, protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, protected readonly dataSourceService: DataSourceService, + private readonly featureFlagService: FeatureFlagService, private readonly workspaceCacheService: WorkspaceCacheService, private readonly workspaceCacheStorageService: WorkspaceCacheStorageService, private readonly workspaceMetadataVersionService: WorkspaceMetadataVersionService, @@ -39,26 +42,38 @@ export class MigrateRichTextToTextCommand extends ActiveOrSuspendedWorkspacesMig workspaceId, options, }: RunOnWorkspaceArgs): Promise { - const dryRun = options?.dryRun ?? false; - - this.logger.log( - `${dryRun ? '[DRY RUN] ' : ''}Migrating RICH_TEXT fields to TEXT in workspace ${workspaceId}`, + const isMigrated = await this.featureFlagService.isFeatureEnabled( + FeatureFlagKey.IS_RICH_TEXT_V1_MIGRATED, + workspaceId, ); - if (dryRun) { + if (isMigrated) { this.logger.log( - `[DRY RUN] Would update RICH_TEXT -> TEXT in core.fieldMetadata for workspace ${workspaceId}. Skipping.`, + `Rich text migration already completed for workspace ${workspaceId}. Skipping.`, ); return; } + const dryRun = options?.dryRun ?? false; + + if (dryRun) { + this.logger.log( + `[DRY RUN] Would update RICH_TEXT -> TEXT and RICH_TEXT_V2 -> RICH_TEXT in core.fieldMetadata for workspace ${workspaceId}. Skipping.`, + ); + + return; + } + + this.logger.log(`Migrating RICH_TEXT fields in workspace ${workspaceId}`); + const queryRunner = this.coreDataSource.createQueryRunner(); await queryRunner.connect(); + await queryRunner.startTransaction(); try { - const result = await queryRunner.query( + const v1Result = await queryRunner.query( `UPDATE core."fieldMetadata" SET "type" = 'TEXT' WHERE "workspaceId" = $1 @@ -67,18 +82,48 @@ export class MigrateRichTextToTextCommand extends ActiveOrSuspendedWorkspacesMig [workspaceId], ); - const updatedCount = result.length; + const v1Count = v1Result.length; - if (updatedCount > 0) { + const renameResult = await queryRunner.query( + `UPDATE core."fieldMetadata" + SET "type" = 'RICH_TEXT' + WHERE "workspaceId" = $1 + AND "type" = 'RICH_TEXT_V2' + RETURNING "id"`, + [workspaceId], + ); + + const renameCount = renameResult.length; + + await queryRunner.commitTransaction(); + + if (v1Count > 0) { this.logger.log( - `Migrated ${updatedCount} RICH_TEXT field(s) to TEXT in workspace ${workspaceId}`, + `Migrated ${v1Count} RICH_TEXT (V1) field(s) to TEXT in workspace ${workspaceId}`, ); + } + + if (renameCount > 0) { + this.logger.log( + `Renamed ${renameCount} RICH_TEXT_V2 field(s) to RICH_TEXT in workspace ${workspaceId}`, + ); + } + + await this.featureFlagService.enableFeatureFlags( + [FeatureFlagKey.IS_RICH_TEXT_V1_MIGRATED], + workspaceId, + ); + + if (v1Count > 0 || renameCount > 0) { await this.invalidateCaches(workspaceId); } else { this.logger.log( - `No RICH_TEXT fields found in workspace ${workspaceId}`, + `No RICH_TEXT or RICH_TEXT_V2 fields found in workspace ${workspaceId}`, ); } + } catch (error) { + await queryRunner.rollbackTransaction(); + throw error; } finally { await queryRunner.release(); } @@ -94,6 +139,7 @@ export class MigrateRichTextToTextCommand extends ActiveOrSuspendedWorkspacesMig .map(getMetadataFlatEntityMapsKey), ), 'ORMEntityMetadatas', + 'featureFlagsMap', ]; await this.workspaceCacheService.invalidateAndRecompute( diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/__snapshots__/data-arg-processor.service.spec.ts.snap b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/__snapshots__/data-arg-processor.service.spec.ts.snap index f3439ffcc79..75585e62c5b 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/__snapshots__/data-arg-processor.service.spec.ts.snap +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/__snapshots__/data-arg-processor.service.spec.ts.snap @@ -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""`; diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/failing-inputs-by-field-metadata-type.constant.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/failing-inputs-by-field-metadata-type.constant.ts index 851880c3cdc..6ddeba96444 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/failing-inputs-by-field-metadata-type.constant.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/failing-inputs-by-field-metadata-type.constant.ts @@ -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' } }, diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/field-metadata-config-by-field-name.constant.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/field-metadata-config-by-field-name.constant.ts index eaee5d51541..455a1a82f86 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/field-metadata-config-by-field-name.constant.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/field-metadata-config-by-field-name.constant.ts @@ -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: { diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/successful-inputs-by-field-metadata-type.constant.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/successful-inputs-by-field-metadata-type.constant.ts index 82ceadbb7df..a773c208bbc 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/successful-inputs-by-field-metadata-type.constant.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/constants/successful-inputs-by-field-metadata-type.constant.ts @@ -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]: [ diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/data-arg-processor.service.spec.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/data-arg-processor.service.spec.ts index 6d7147ac851..fa40a1c7fc7 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/data-arg-processor.service.spec.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/__tests__/data-arg-processor.service.spec.ts @@ -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), }), ); diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/constants/null-equivalent-values.constant.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/constants/null-equivalent-values.constant.ts index d28f17058da..216153b1f32 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/constants/null-equivalent-values.constant.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/constants/null-equivalent-values.constant.ts @@ -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, }; diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/data-arg-processor.service.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/data-arg-processor.service.ts index 14337125e5e..2eba50904c9 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/data-arg-processor.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/data-arg-processor.service.ts @@ -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); diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/utils/__tests__/find-postgres-default-null-equivalent-value.util.spec.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/utils/__tests__/find-postgres-default-null-equivalent-value.util.spec.ts index 8ab8c5e1965..da5dae9aea7 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/utils/__tests__/find-postgres-default-null-equivalent-value.util.spec.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/utils/__tests__/find-postgres-default-null-equivalent-value.util.spec.ts @@ -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); diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/utils/find-postgres-default-null-equivalent-value.util.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/utils/find-postgres-default-null-equivalent-value.util.ts index 19deed20536..32bcc3a47cf 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/utils/find-postgres-default-null-equivalent-value.util.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/utils/find-postgres-default-null-equivalent-value.util.ts @@ -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' diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/__tests__/validate-rich-text-v2-field-or-throw.util.spec.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/__tests__/validate-rich-text-field-or-throw.util.spec.ts similarity index 61% rename from packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/__tests__/validate-rich-text-v2-field-or-throw.util.spec.ts rename to packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/__tests__/validate-rich-text-field-or-throw.util.spec.ts index 008aed8c336..9c6da5098eb 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/__tests__/validate-rich-text-v2-field-or-throw.util.spec.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/__tests__/validate-rich-text-field-or-throw.util.spec.ts @@ -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/, ); }); diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-rich-text-v2-field-or-throw.util.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-rich-text-field-or-throw.util.ts similarity index 82% rename from packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-rich-text-v2-field-or-throw.util.ts rename to packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-rich-text-field-or-throw.util.ts index 9003fafced3..fcbb404ef91 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-rich-text-v2-field-or-throw.util.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/data-arg-processor/validator-utils/validate-rich-text-field-or-throw.util.ts @@ -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 { diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/__snapshots__/filter-arg-processor.service.spec.ts.snap b/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/__snapshots__/filter-arg-processor.service.spec.ts.snap index 9cfb69c4bf1..49cba9e02d0 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/__snapshots__/filter-arg-processor.service.spec.ts.snap +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/__snapshots__/filter-arg-processor.service.spec.ts.snap @@ -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"`; diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/constants/failing-filter-inputs-by-field-metadata-type.constant.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/constants/failing-filter-inputs-by-field-metadata-type.constant.ts index 17fc987a6db..324b75cefaa 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/constants/failing-filter-inputs-by-field-metadata-type.constant.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/constants/failing-filter-inputs-by-field-metadata-type.constant.ts @@ -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' } } } }, diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/constants/successful-filter-inputs-by-field-metadata-type.constant.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/constants/successful-filter-inputs-by-field-metadata-type.constant.ts index 2e5d73b2cab..6b11ee5715d 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/constants/successful-filter-inputs-by-field-metadata-type.constant.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/__tests__/constants/successful-filter-inputs-by-field-metadata-type.constant.ts @@ -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' } } } }, diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/constants/filter-operators.constant.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/constants/filter-operators.constant.ts index b2da12dee4a..1baada38802 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/constants/filter-operators.constant.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/constants/filter-operators.constant.ts @@ -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']; diff --git a/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/utils/get-operators-for-field-type.util.ts b/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/utils/get-operators-for-field-type.util.ts index 87c6de3b061..ccc52e66ddf 100644 --- a/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/utils/get-operators-for-field-type.util.ts +++ b/packages/twenty-server/src/engine/api/common/common-args-processors/filter-arg-processor/utils/get-operators-for-field-type.util.ts @@ -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: diff --git a/packages/twenty-server/src/engine/api/common/common-result-getters/common-result-getters.service.ts b/packages/twenty-server/src/engine/api/common/common-result-getters/common-result-getters.service.ts index d1785b4d5f2..b0eb84d0d90 100644 --- a/packages/twenty-server/src/engine/api/common/common-result-getters/common-result-getters.service.ts +++ b/packages/twenty-server/src/engine/api/common/common-result-getters/common-result-getters.service.ts @@ -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), ], ]); } diff --git a/packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/__tests__/rich-text-v2-field-query-result-getter.handler.spec.ts b/packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/__tests__/rich-text-field-query-result-getter.handler.spec.ts similarity index 86% rename from packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/__tests__/rich-text-v2-field-query-result-getter.handler.spec.ts rename to packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/__tests__/rich-text-field-query-result-getter.handler.spec.ts index f7b29e584bf..100f8aefe46 100644 --- a/packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/__tests__/rich-text-v2-field-query-result-getter.handler.spec.ts +++ b/packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/__tests__/rich-text-field-query-result-getter.handler.spec.ts @@ -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 = { diff --git a/packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/rich-text-v2-field-query-result-getter.handler.ts b/packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/rich-text-field-query-result-getter.handler.ts similarity index 91% rename from packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/rich-text-v2-field-query-result-getter.handler.ts rename to packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/rich-text-field-query-result-getter.handler.ts index 86b87bc1132..0e6a21a9731 100644 --- a/packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/rich-text-v2-field-query-result-getter.handler.ts +++ b/packages/twenty-server/src/engine/api/common/common-result-getters/handlers/field-handlers/rich-text-field-query-result-getter.handler.ts @@ -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 { - 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; diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/graphql-types/input/rich-text.input-type.ts b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/graphql-types/input/rich-text.input-type.ts index 847a2e31ff9..e5df287ffb2 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/graphql-types/input/rich-text.input-type.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/graphql-types/input/rich-text.input-type.ts @@ -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 }, }, }); diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/services/type-mapper.service.ts b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/services/type-mapper.service.ts index 92119aacffe..3afa5cc3946 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/services/type-mapper.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/services/type-mapper.service.ts @@ -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], diff --git a/packages/twenty-server/src/engine/core-modules/open-api/utils/generate-random-field-value.util.ts b/packages/twenty-server/src/engine/core-modules/open-api/utils/generate-random-field-value.util.ts index 77f814f0470..c8f7aee5601 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/utils/generate-random-field-value.util.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/utils/generate-random-field-value.util.ts @@ -124,7 +124,7 @@ export const generateRandomFieldValue = ({ return {}; } - case FieldMetadataType.RICH_TEXT_V2: { + case FieldMetadataType.RICH_TEXT: { return ''; } diff --git a/packages/twenty-server/src/engine/core-modules/record-crud/zod-schemas/field-filters.zod-schema.ts b/packages/twenty-server/src/engine/core-modules/record-crud/zod-schemas/field-filters.zod-schema.ts index 80cd15dd34c..d8dedebbbdb 100644 --- a/packages/twenty-server/src/engine/core-modules/record-crud/zod-schemas/field-filters.zod-schema.ts +++ b/packages/twenty-server/src/engine/core-modules/record-crud/zod-schemas/field-filters.zod-schema.ts @@ -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'), diff --git a/packages/twenty-server/src/engine/core-modules/record-crud/zod-schemas/record-properties.zod-schema.ts b/packages/twenty-server/src/engine/core-modules/record-crud/zod-schemas/record-properties.zod-schema.ts index 88aa687b140..75cfb4a91b0 100644 --- a/packages/twenty-server/src/engine/core-modules/record-crud/zod-schemas/record-properties.zod-schema.ts +++ b/packages/twenty-server/src/engine/core-modules/record-crud/zod-schemas/record-properties.zod-schema.ts @@ -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(), diff --git a/packages/twenty-server/src/engine/core-modules/record-transformer/services/record-input-transformer.service.ts b/packages/twenty-server/src/engine/core-modules/record-transformer/services/record-input-transformer.service.ts index d24cba68297..420fd543c1e 100644 --- a/packages/twenty-server/src/engine/core-modules/record-transformer/services/record-input-transformer.service.ts +++ b/packages/twenty-server/src/engine/core-modules/record-transformer/services/record-input-transformer.service.ts @@ -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: diff --git a/packages/twenty-server/src/engine/core-modules/record-transformer/utils/transform-rich-text-v2.util.ts b/packages/twenty-server/src/engine/core-modules/record-transformer/utils/transform-rich-text.util.ts similarity index 92% rename from packages/twenty-server/src/engine/core-modules/record-transformer/utils/transform-rich-text-v2.util.ts rename to packages/twenty-server/src/engine/core-modules/record-transformer/utils/transform-rich-text.util.ts index dc54d817f99..139a88e9b9f 100644 --- a/packages/twenty-server/src/engine/core-modules/record-transformer/utils/transform-rich-text-v2.util.ts +++ b/packages/twenty-server/src/engine/core-modules/record-transformer/utils/transform-rich-text.util.ts @@ -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 => { return editor; }; -export const transformRichTextV2Value = async ( +export const transformRichTextValue = async ( // oxlint-disable-next-line @typescripttypescript/no-explicit-any richTextValue: any, -): Promise => { +): Promise => { const parsedValue = isNonEmptyString(richTextValue) - ? richTextV2ValueSchema.parse(richTextValue) + ? richTextValueSchema.parse(richTextValue) : richTextValue; const serverBlockNoteEditor = await getServerBlockNoteEditor(); diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/types/composite-field-metadata-type.type.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/types/composite-field-metadata-type.type.ts index 64be06a8948..3a847e89274 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/types/composite-field-metadata-type.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/types/composite-field-metadata-type.type.ts @@ -7,7 +7,7 @@ const compositeFieldTypes = [ FieldMetadataType.LINKS, FieldMetadataType.EMAILS, FieldMetadataType.PHONES, - FieldMetadataType.RICH_TEXT_V2, + FieldMetadataType.RICH_TEXT, FieldMetadataType.ACTOR, ] as const; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/__tests__/compute-column-name.spec.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/__tests__/compute-column-name.spec.ts index a78182c9bc3..78b5e2e05da 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/__tests__/compute-column-name.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/__tests__/compute-column-name.spec.ts @@ -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 = { diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util.ts index 2f2d40d0cf9..7ff91be483e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util.ts @@ -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); }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/note-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/note-flat-fields.mock.ts index ddcf03f7f3e..12e689e145a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/note-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/note-flat-fields.mock.ts @@ -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, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/task-flat-fields.mock.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/task-flat-fields.mock.ts index 8ffb468ee4e..a2dd24114dd 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/task-flat-fields.mock.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/__mocks__/task-flat-fields.mock.ts @@ -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, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service.ts index 5aacc5cd238..8b5bf345123 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service.ts @@ -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, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/__tests__/flat-field-metadata.test-type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/__tests__/flat-field-metadata.test-type.ts index 43612683f29..21d9f53a8eb 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/__tests__/flat-field-metadata.test-type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/__tests__/flat-field-metadata.test-type.ts @@ -105,7 +105,7 @@ const _assertion: Record = { // JSON/Array types rawJson: {} as FlatFieldMetadata, array: {} as FlatFieldMetadata, - richTextV2: {} as FlatFieldMetadata, + richText: {} as FlatFieldMetadata, // Relation types relation: {} as FlatFieldMetadata, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts index 7510eb22c2d..39b8790d6d7 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts @@ -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[] = []; diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/dtos/rich-text-v2-body.dto.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/dtos/rich-text-body.dto.ts similarity index 66% rename from packages/twenty-server/src/engine/metadata-modules/page-layout-widget/dtos/rich-text-v2-body.dto.ts rename to packages/twenty-server/src/engine/metadata-modules/page-layout-widget/dtos/rich-text-body.dto.ts index 5696803e166..090cb629e0a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/dtos/rich-text-v2-body.dto.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/dtos/rich-text-body.dto.ts @@ -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() diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/dtos/standalone-rich-text-configuration.dto.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/dtos/standalone-rich-text-configuration.dto.ts index 9970bd639df..ac3667748ac 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/dtos/standalone-rich-text-configuration.dto.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/dtos/standalone-rich-text-configuration.dto.ts @@ -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; } diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts index 3b26d4881c0..6b09d53bad2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts @@ -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; diff --git a/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts b/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts index 2b53485f7e3..42921564e22 100644 --- a/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts +++ b/packages/twenty-server/src/engine/twenty-orm/entity-manager/workspace-entity-manager.spec.ts @@ -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: { diff --git a/packages/twenty-server/src/engine/twenty-orm/utils/get-subfields-for-aggregate-operation.util.ts b/packages/twenty-server/src/engine/twenty-orm/utils/get-subfields-for-aggregate-operation.util.ts index ff2c33376eb..b631584caa7 100644 --- a/packages/twenty-server/src/engine/twenty-orm/utils/get-subfields-for-aggregate-operation.util.ts +++ b/packages/twenty-server/src/engine/twenty-orm/utils/get-subfields-for-aggregate-operation.util.ts @@ -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}`); diff --git a/packages/twenty-server/src/engine/twenty-orm/utils/is-record-matching-rls-row-level-permission-predicate.util.ts b/packages/twenty-server/src/engine/twenty-orm/utils/is-record-matching-rls-row-level-permission-predicate.util.ts index d0b355805e2..4166e5e03e4 100644 --- a/packages/twenty-server/src/engine/twenty-orm/utils/is-record-matching-rls-row-level-permission-predicate.util.ts +++ b/packages/twenty-server/src/engine/twenty-orm/utils/is-record-matching-rls-row-level-permission-predicate.util.ts @@ -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, }); } diff --git a/packages/twenty-server/src/engine/utils/convert-object-metadata-to-schema-properties.util.ts b/packages/twenty-server/src/engine/utils/convert-object-metadata-to-schema-properties.util.ts index 7834d7e3e27..32a1d557e40 100644 --- a/packages/twenty-server/src/engine/utils/convert-object-metadata-to-schema-properties.util.ts +++ b/packages/twenty-server/src/engine/utils/convert-object-metadata-to-schema-properties.util.ts @@ -324,7 +324,7 @@ export const convertObjectMetadataToSchemaProperties = ({ type: 'object', }; break; - case FieldMetadataType.RICH_TEXT_V2: + case FieldMetadataType.RICH_TEXT: itemProperty = { type: 'object', properties: { diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-standard-flat-field-metadata.util.ts index e80242c5c99..478bdc21137 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-note-standard-flat-field-metadata.util.ts @@ -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', diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-standard-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-standard-flat-field-metadata.util.ts index 08a8bc17c75..26b367347ac 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-standard-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/compute-task-standard-flat-field-metadata.util.ts @@ -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', diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/skill-metadata/create-standard-flat-skill-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/skill-metadata/create-standard-flat-skill-metadata.util.ts index 5a664e4441a..1464cbd154d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/skill-metadata/create-standard-flat-skill-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/skill-metadata/create-standard-flat-skill-metadata.util.ts @@ -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 diff --git a/packages/twenty-server/src/engine/workspace-manager/utils/__tests__/get-ts-vectors-column-expression.utils.spec.ts b/packages/twenty-server/src/engine/workspace-manager/utils/__tests__/get-ts-vectors-column-expression.utils.spec.ts index 85ae0ccca60..545dc673489 100644 --- a/packages/twenty-server/src/engine/workspace-manager/utils/__tests__/get-ts-vectors-column-expression.utils.spec.ts +++ b/packages/twenty-server/src/engine/workspace-manager/utils/__tests__/get-ts-vectors-column-expression.utils.spec.ts @@ -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); diff --git a/packages/twenty-server/src/engine/workspace-manager/utils/is-searchable-field.util.ts b/packages/twenty-server/src/engine/workspace-manager/utils/is-searchable-field.util.ts index 4acda18c43c..f8b2690e2b7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/utils/is-searchable-field.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/utils/is-searchable-field.util.ts @@ -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; diff --git a/packages/twenty-server/src/engine/workspace-manager/utils/is-searchable-subfield.util.ts b/packages/twenty-server/src/engine/workspace-manager/utils/is-searchable-subfield.util.ts index 30c22bdc8c5..a816a08be9a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/utils/is-searchable-subfield.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/utils/is-searchable-subfield.util.ts @@ -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( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/is-text-column-type.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/is-text-column-type.util.ts index 81de03e9d00..0937789091a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/is-text-column-type.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/is-text-column-type.util.ts @@ -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' ); }; diff --git a/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts b/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts index b261b49977b..b3814663bde 100644 --- a/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts +++ b/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts @@ -1,7 +1,7 @@ import { type ActorMetadata, FieldMetadataType, - type RichTextV2Metadata, + type RichTextMetadata, } from 'twenty-shared/types'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; @@ -17,13 +17,13 @@ const BODY_V2_FIELD_NAME = 'bodyV2'; export const SEARCH_FIELDS_FOR_NOTES: FieldTypeAndNameMetadata[] = [ { name: TITLE_FIELD_NAME, type: FieldMetadataType.TEXT }, - { name: BODY_V2_FIELD_NAME, type: FieldMetadataType.RICH_TEXT_V2 }, + { name: BODY_V2_FIELD_NAME, type: FieldMetadataType.RICH_TEXT }, ]; export class NoteWorkspaceEntity extends BaseWorkspaceEntity { position: number; title: string; - bodyV2: RichTextV2Metadata | null; + bodyV2: RichTextMetadata | null; createdBy: ActorMetadata; updatedBy: ActorMetadata; noteTargets: EntityRelation; diff --git a/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts b/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts index cc79a9112bd..5c475c8031e 100644 --- a/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts +++ b/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts @@ -1,7 +1,7 @@ import { type ActorMetadata, FieldMetadataType, - type RichTextV2Metadata, + type RichTextMetadata, } from 'twenty-shared/types'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; @@ -18,13 +18,13 @@ const BODY_V2_FIELD_NAME = 'bodyV2'; export const SEARCH_FIELDS_FOR_TASKS: FieldTypeAndNameMetadata[] = [ { name: TITLE_FIELD_NAME, type: FieldMetadataType.TEXT }, - { name: BODY_V2_FIELD_NAME, type: FieldMetadataType.RICH_TEXT_V2 }, + { name: BODY_V2_FIELD_NAME, type: FieldMetadataType.RICH_TEXT }, ]; export class TaskWorkspaceEntity extends BaseWorkspaceEntity { position: number; title: string | null; - bodyV2: RichTextV2Metadata | null; + bodyV2: RichTextMetadata | null; dueAt: Date | null; status: string | null; createdBy: ActorMetadata; diff --git a/packages/twenty-server/src/modules/workflow/workflow-executor/utils/resolve-rich-text-fields-in-record.util.ts b/packages/twenty-server/src/modules/workflow/workflow-executor/utils/resolve-rich-text-fields-in-record.util.ts index 6444ed785bc..81aa46869c0 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-executor/utils/resolve-rich-text-fields-in-record.util.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-executor/utils/resolve-rich-text-fields-in-record.util.ts @@ -16,7 +16,7 @@ export const resolveRichTextFieldsInRecord = ( flatEntityIds: flatObjectMetadata.fieldIds, flatEntityMaps: flatFieldMetadataMaps, }) - .filter((field) => field?.type === FieldMetadataType.RICH_TEXT_V2) + .filter((field) => field?.type === FieldMetadataType.RICH_TEXT) .map((field) => field?.name) .filter(isDefined); diff --git a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/__tests__/find-default-null-equivalent-value.util.spec.ts b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/__tests__/find-default-null-equivalent-value.util.spec.ts index d1307a7a37d..21253b29d2c 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/__tests__/find-default-null-equivalent-value.util.spec.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/__tests__/find-default-null-equivalent-value.util.spec.ts @@ -175,12 +175,12 @@ describe('findDefaultNullEquivalentValue', () => { }); }); - describe('RICH_TEXT_V2', () => { + describe('RICH_TEXT', () => { it('should return undefined for blocknote', () => { expect( findDefaultNullEquivalentValue({ value: {}, - fieldMetadataType: FieldMetadataType.RICH_TEXT_V2, + fieldMetadataType: FieldMetadataType.RICH_TEXT, key: 'blocknote', }), ).toBe(undefined); @@ -190,7 +190,7 @@ describe('findDefaultNullEquivalentValue', () => { expect( findDefaultNullEquivalentValue({ value: '', - fieldMetadataType: FieldMetadataType.RICH_TEXT_V2, + fieldMetadataType: FieldMetadataType.RICH_TEXT, key: 'markdown', }), ).toBe(DEFAULT_TEXT_FIELD_NULL_EQUIVALENT_VALUE); diff --git a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/find-default-null-equivalent-value.util.ts b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/find-default-null-equivalent-value.util.ts index 6e51dc7fd86..23e18da5e48 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/find-default-null-equivalent-value.util.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/filter/utils/find-default-null-equivalent-value.util.ts @@ -121,7 +121,7 @@ export const findDefaultNullEquivalentValue = ({ return undefined; } } - case FieldMetadataType.RICH_TEXT_V2: { + case FieldMetadataType.RICH_TEXT: { switch (key) { case 'markdown': return isNullEquivalentTextFieldValue(value) diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/constants/test-object-gql-fields.constant.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/constants/test-object-gql-fields.constant.ts index cb8c8cd73ee..62e58be7ba3 100644 --- a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/constants/test-object-gql-fields.constant.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/constants/test-object-gql-fields.constant.ts @@ -53,7 +53,7 @@ export const TEST_OBJECT_GQL_FIELDS = ` } rawJsonField arrayField - richTextV2Field { + richTextField { blocknote markdown } diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..472974cc78d --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`Create input validation - RICH_TEXT Gql create input - failure RICH_TEXT - should fail with : {"richTextField":"not-a-rich-text"} 1`] = `"Expected type "RichTextCreateInput" to be an object."`; + +exports[`Create input validation - RICH_TEXT Rest create input - failure RICH_TEXT - should fail with : {"richTextField":"not-a-rich-text"} 1`] = `"["Invalid rich text v2 value 'not-a-rich-text' for field \\"richTextField\\" - Should be an object"]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-v2-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-v2-field-create-input-validation.integration-spec.ts.snap deleted file mode 100644 index 559015b6664..00000000000 --- a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-v2-field-create-input-validation.integration-spec.ts.snap +++ /dev/null @@ -1,5 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[`Create input validation - RICH_TEXT_V2 Gql create input - failure RICH_TEXT_V2 - should fail with : {"richTextV2Field":"not-a-rich-text"} 1`] = `"Expected type "RichTextV2CreateInput" to be an object."`; - -exports[`Create input validation - RICH_TEXT_V2 Rest create input - failure RICH_TEXT_V2 - should fail with : {"richTextV2Field":"not-a-rich-text"} 1`] = `"["Invalid rich text v2 value 'not-a-rich-text' for field \\"richTextV2Field\\" - Should be an object"]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant.ts index da11ea7d21f..9f63663a799 100644 --- a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant.ts @@ -224,10 +224,10 @@ export const failingCreateInputByFieldMetadataType: { }, }, ], - [FieldMetadataType.RICH_TEXT_V2]: [ + [FieldMetadataType.RICH_TEXT]: [ { input: { - richTextV2Field: 'not-a-rich-text', + richTextField: 'not-a-rich-text', }, }, ], diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant.ts index 62ff204d234..1c1235feb8e 100644 --- a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant.ts @@ -369,18 +369,18 @@ export const successfulCreateInputByFieldMetadataType: { }, }, ], - [FieldMetadataType.RICH_TEXT_V2]: [ + [FieldMetadataType.RICH_TEXT]: [ { input: { - richTextV2Field: { + richTextField: { blocknote: 'test', markdown: 'test', }, }, validateInput: (record: Record) => { return ( - record.richTextV2Field.blocknote === 'test' && - record.richTextV2Field.markdown === 'test' + record.richTextField.blocknote === 'test' && + record.richTextField.markdown === 'test' ); }, }, diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-v2-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-field-create-input-validation.integration-spec.ts similarity index 98% rename from packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-v2-field-create-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-field-create-input-validation.integration-spec.ts index 2317fc00623..8bbe7098338 100644 --- a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-v2-field-create-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-field-create-input-validation.integration-spec.ts @@ -8,7 +8,7 @@ import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inpu import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; -const FIELD_METADATA_TYPE = FieldMetadataType.RICH_TEXT_V2; +const FIELD_METADATA_TYPE = FieldMetadataType.RICH_TEXT; const successfulTestCases = successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test.ts index 498e8d3dcb4..67fd1b544c5 100644 --- a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test.ts @@ -5,7 +5,7 @@ type FieldMetadataTypesNotTestedForFilterInputValidation = | 'POSITION' | 'ACTOR' | 'NUMERIC' - | 'RICH_TEXT_V2'; + | 'RICH_TEXT'; type FieldMetadataTypesNotTestedForCreateInputValidation = | 'TS_VECTOR' diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/get-field-metadata-creation-inputs.util.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/get-field-metadata-creation-inputs.util.ts index ae00a7f5a8b..76d74c7b617 100644 --- a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/get-field-metadata-creation-inputs.util.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/get-field-metadata-creation-inputs.util.ts @@ -37,10 +37,10 @@ export const getFieldMetadataCreationInputs = ( 'ACTOR' | 'POSITION' >]: FieldMetadataCreationInput | FieldMetadataCreationInput[]; } = { - [FieldMetadataType.RICH_TEXT_V2]: { - name: 'richTextV2Field', - label: 'richTextV2Field', - type: FieldMetadataType.RICH_TEXT_V2, + [FieldMetadataType.RICH_TEXT]: { + name: 'richTextField', + label: 'richTextField', + type: FieldMetadataType.RICH_TEXT, objectMetadataId, }, [FieldMetadataType.TEXT]: { diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-create-rich-text-v2-field-metadata.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-create-rich-text-field-metadata.integration-spec.ts similarity index 96% rename from packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-create-rich-text-v2-field-metadata.integration-spec.ts rename to packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-create-rich-text-field-metadata.integration-spec.ts index 750a1aafa1e..825e21c540f 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-create-rich-text-v2-field-metadata.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-create-rich-text-field-metadata.integration-spec.ts @@ -76,8 +76,8 @@ describe('Rich text v2 field metadata creation tests suite', () => { const { data } = await createOneObjectMetadata({ expectToFail: false, input: { - nameSingular: 'testRichTextV2Object', - namePlural: 'testRichTextV2Objects', + nameSingular: 'testRichTextObject', + namePlural: 'testRichTextObjects', labelSingular: 'Test Rich Text V2 Object', labelPlural: 'Test Rich Text V2 Objects', icon: 'IconTestPipe', @@ -124,7 +124,7 @@ describe('Rich text v2 field metadata creation tests suite', () => { async ({ context: { input } }) => { const inputPayload = { objectMetadataId: createdObjectMetadataId, - type: FieldMetadataType.RICH_TEXT_V2, + type: FieldMetadataType.RICH_TEXT, isLabelSyncedWithName: false, ...input, }; diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-update-rich-text-v2-field-metadata.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-update-rich-text-field-metadata.integration-spec.ts similarity index 96% rename from packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-update-rich-text-v2-field-metadata.integration-spec.ts rename to packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-update-rich-text-field-metadata.integration-spec.ts index 9b4afb1b468..88d3d152765 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-update-rich-text-v2-field-metadata.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/composite/successful-update-rich-text-field-metadata.integration-spec.ts @@ -76,8 +76,8 @@ describe('Rich text v2 field metadata update tests suite', () => { const { data } = await createOneObjectMetadata({ expectToFail: false, input: { - nameSingular: 'testRichTextV2UpdateObject', - namePlural: 'testRichTextV2UpdateObjects', + nameSingular: 'testRichTextUpdateObject', + namePlural: 'testRichTextUpdateObjects', labelSingular: 'Test Rich Text V2 Update Object', labelPlural: 'Test Rich Text V2 Update Objects', icon: 'IconTestPipe', @@ -109,7 +109,7 @@ describe('Rich text v2 field metadata update tests suite', () => { expectToFail: false, input: { objectMetadataId: createdObjectMetadataId, - type: FieldMetadataType.RICH_TEXT_V2, + type: FieldMetadataType.RICH_TEXT, name: 'testRichText', label: 'Test Rich Text', description: 'Initial description', diff --git a/packages/twenty-shared/src/constants/CompositeFieldTypeSubFieldsNames.ts b/packages/twenty-shared/src/constants/CompositeFieldTypeSubFieldsNames.ts index 7ba8907b018..81e5d91dee2 100644 --- a/packages/twenty-shared/src/constants/CompositeFieldTypeSubFieldsNames.ts +++ b/packages/twenty-shared/src/constants/CompositeFieldTypeSubFieldsNames.ts @@ -40,7 +40,7 @@ export const COMPOSITE_FIELD_TYPE_SUB_FIELDS_NAMES = { workspaceMemberId: 'workspaceMemberId', context: 'context', }, - [FieldMetadataType.RICH_TEXT_V2]: { + [FieldMetadataType.RICH_TEXT]: { blocknote: 'blocknote', markdown: 'markdown', }, diff --git a/packages/twenty-shared/src/types/FeatureFlagKey.ts b/packages/twenty-shared/src/types/FeatureFlagKey.ts index 852b6ddec22..f064a7f138b 100644 --- a/packages/twenty-shared/src/types/FeatureFlagKey.ts +++ b/packages/twenty-shared/src/types/FeatureFlagKey.ts @@ -18,4 +18,5 @@ export enum FeatureFlagKey { IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED = 'IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED', IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED = 'IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED', IS_DRAFT_EMAIL_ENABLED = 'IS_DRAFT_EMAIL_ENABLED', + IS_RICH_TEXT_V1_MIGRATED = 'IS_RICH_TEXT_V1_MIGRATED', } diff --git a/packages/twenty-shared/src/types/FieldMetadataDefaultValue.ts b/packages/twenty-shared/src/types/FieldMetadataDefaultValue.ts index 65e015b3301..e72bea95365 100644 --- a/packages/twenty-shared/src/types/FieldMetadataDefaultValue.ts +++ b/packages/twenty-shared/src/types/FieldMetadataDefaultValue.ts @@ -15,7 +15,7 @@ export type FieldMetadataDefaultValueUuidFunction = export type FieldMetadataDefaultValueNowFunction = typeof fieldMetadataDefaultValueFunctionName.NOW; -export type FieldMetadataDefaultValueRichTextV2 = { +export type FieldMetadataDefaultValueRichText = { blocknote: string | null; markdown: string | null; }; @@ -90,7 +90,7 @@ export type FieldMetadataDefaultValueMapping = { [FieldMetadataType.SELECT]: string | null; [FieldMetadataType.MULTI_SELECT]: string[] | null; [FieldMetadataType.RAW_JSON]: object | null; - [FieldMetadataType.RICH_TEXT_V2]: FieldMetadataDefaultValueRichTextV2 | null; + [FieldMetadataType.RICH_TEXT]: FieldMetadataDefaultValueRichText | null; [FieldMetadataType.ACTOR]: FieldMetadataDefaultActor | null; [FieldMetadataType.ARRAY]: string[] | null; }; diff --git a/packages/twenty-shared/src/types/FieldMetadataType.ts b/packages/twenty-shared/src/types/FieldMetadataType.ts index 14ede6386bf..84e3824db03 100644 --- a/packages/twenty-shared/src/types/FieldMetadataType.ts +++ b/packages/twenty-shared/src/types/FieldMetadataType.ts @@ -19,7 +19,7 @@ export enum FieldMetadataType { RATING = 'RATING', RAW_JSON = 'RAW_JSON', RELATION = 'RELATION', - RICH_TEXT_V2 = 'RICH_TEXT_V2', + RICH_TEXT = 'RICH_TEXT', SELECT = 'SELECT', TEXT = 'TEXT', TS_VECTOR = 'TS_VECTOR', diff --git a/packages/twenty-shared/src/types/RecordGqlOperationFilter.ts b/packages/twenty-shared/src/types/RecordGqlOperationFilter.ts index 11d4b3a730d..5edb2460d8d 100644 --- a/packages/twenty-shared/src/types/RecordGqlOperationFilter.ts +++ b/packages/twenty-shared/src/types/RecordGqlOperationFilter.ts @@ -146,13 +146,13 @@ export type FilesFilter = { is?: IsFilter; }; -export type RichTextV2LeafFilter = { +export type RichTextLeafFilter = { ilike?: string; }; -export type RichTextV2Filter = { - blocknote?: RichTextV2LeafFilter; - markdown?: RichTextV2LeafFilter; +export type RichTextFilter = { + blocknote?: RichTextLeafFilter; + markdown?: RichTextLeafFilter; }; export type TSVectorFilter = { @@ -176,7 +176,7 @@ export type LeafFilter = | ArrayFilter | RawJsonFilter | FilesFilter - | RichTextV2Filter + | RichTextFilter | TSVectorFilter | undefined; diff --git a/packages/twenty-shared/src/types/composite-types/composite-type-definitions.ts b/packages/twenty-shared/src/types/composite-types/composite-type-definitions.ts index d57edaa6329..27d1ec2d843 100644 --- a/packages/twenty-shared/src/types/composite-types/composite-type-definitions.ts +++ b/packages/twenty-shared/src/types/composite-types/composite-type-definitions.ts @@ -7,7 +7,7 @@ import { emailsCompositeType } from './emails.composite-type'; import { fullNameCompositeType } from './full-name.composite-type'; import { linksCompositeType } from './links.composite-type'; import { phonesCompositeType } from './phones.composite-type'; -import { richTextV2CompositeType } from './rich-text-v2.composite-type'; +import { richTextCompositeType } from './rich-text.composite-type'; export const compositeTypeDefinitions = new Map< FieldMetadataType, @@ -20,5 +20,5 @@ export const compositeTypeDefinitions = new Map< [FieldMetadataType.ACTOR, actorCompositeType], [FieldMetadataType.EMAILS, emailsCompositeType], [FieldMetadataType.PHONES, phonesCompositeType], - [FieldMetadataType.RICH_TEXT_V2, richTextV2CompositeType], + [FieldMetadataType.RICH_TEXT, richTextCompositeType], ]); diff --git a/packages/twenty-shared/src/types/composite-types/rich-text-v2.composite-type.ts b/packages/twenty-shared/src/types/composite-types/rich-text.composite-type.ts similarity index 73% rename from packages/twenty-shared/src/types/composite-types/rich-text-v2.composite-type.ts rename to packages/twenty-shared/src/types/composite-types/rich-text.composite-type.ts index c7b02c4a7df..b69cd1bfb0b 100644 --- a/packages/twenty-shared/src/types/composite-types/rich-text-v2.composite-type.ts +++ b/packages/twenty-shared/src/types/composite-types/rich-text.composite-type.ts @@ -2,8 +2,8 @@ import { z } from 'zod'; import { FieldMetadataType } from '../FieldMetadataType'; import { type CompositeType } from '../composite-types/composite-type.interface'; -export const richTextV2CompositeType: CompositeType = { - type: FieldMetadataType.RICH_TEXT_V2, +export const richTextCompositeType: CompositeType = { + type: FieldMetadataType.RICH_TEXT, properties: [ { name: 'blocknote', @@ -21,9 +21,9 @@ export const richTextV2CompositeType: CompositeType = { }; // with import only markdown subfield is filled, then blocknote is undefined -export const richTextV2ValueSchema = z.object({ +export const richTextValueSchema = z.object({ blocknote: z.string().nullable().optional(), markdown: z.string().nullable(), }); -export type RichTextV2Metadata = z.infer; +export type RichTextMetadata = z.infer; diff --git a/packages/twenty-shared/src/types/index.ts b/packages/twenty-shared/src/types/index.ts index 523a092c9cc..217bfe1c265 100644 --- a/packages/twenty-shared/src/types/index.ts +++ b/packages/twenty-shared/src/types/index.ts @@ -46,11 +46,11 @@ export type { PhonesMetadata, } from './composite-types/phones.composite-type'; export { phonesCompositeType } from './composite-types/phones.composite-type'; -export type { RichTextV2Metadata } from './composite-types/rich-text-v2.composite-type'; +export type { RichTextMetadata } from './composite-types/rich-text.composite-type'; export { - richTextV2CompositeType, - richTextV2ValueSchema, -} from './composite-types/rich-text-v2.composite-type'; + richTextCompositeType, + richTextValueSchema, +} from './composite-types/rich-text.composite-type'; export type { CompositeFieldSubFieldName } from './CompositeFieldSubFieldNameType'; export type { ConfigVariableValue } from './ConfigVariableValue'; export { ConnectedAccountProvider } from './ConnectedAccountProvider'; @@ -71,7 +71,7 @@ export type { FieldMetadataDefaultValueFunctionNames, FieldMetadataDefaultValueUuidFunction, FieldMetadataDefaultValueNowFunction, - FieldMetadataDefaultValueRichTextV2, + FieldMetadataDefaultValueRichText, FieldMetadataDefaultValueCurrency, FieldMetadataDefaultValueFullName, FieldMetadataDefaultValueAddress, @@ -217,8 +217,8 @@ export type { ArrayFilter, RawJsonFilter, FilesFilter, - RichTextV2LeafFilter, - RichTextV2Filter, + RichTextLeafFilter, + RichTextFilter, TSVectorFilter, LeafFilter, AndObjectRecordFilter, diff --git a/packages/twenty-shared/src/utils/fieldMetadata/__tests__/isFieldMetadataTextKind.test.ts b/packages/twenty-shared/src/utils/fieldMetadata/__tests__/isFieldMetadataTextKind.test.ts index b948510098e..61ba0e945a1 100644 --- a/packages/twenty-shared/src/utils/fieldMetadata/__tests__/isFieldMetadataTextKind.test.ts +++ b/packages/twenty-shared/src/utils/fieldMetadata/__tests__/isFieldMetadataTextKind.test.ts @@ -2,7 +2,7 @@ import { FieldMetadataType } from '@/types'; import { isFieldMetadataTextKind } from '../isFieldMetadataTextKind'; describe('isFieldMetadataTextKind', () => { - it.each([FieldMetadataType.TEXT, FieldMetadataType.RICH_TEXT_V2])( + it.each([FieldMetadataType.TEXT, FieldMetadataType.RICH_TEXT])( 'should return true for %s', (type) => { expect(isFieldMetadataTextKind(type)).toBe(true); diff --git a/packages/twenty-shared/src/utils/fieldMetadata/isFieldMetadataTextKind.ts b/packages/twenty-shared/src/utils/fieldMetadata/isFieldMetadataTextKind.ts index 7440a079ee3..06ca61d652d 100644 --- a/packages/twenty-shared/src/utils/fieldMetadata/isFieldMetadataTextKind.ts +++ b/packages/twenty-shared/src/utils/fieldMetadata/isFieldMetadataTextKind.ts @@ -2,7 +2,7 @@ import { FieldMetadataType } from '@/types'; const TEXT_FIELD_TYPES: FieldMetadataType[] = [ FieldMetadataType.TEXT, - FieldMetadataType.RICH_TEXT_V2, + FieldMetadataType.RICH_TEXT, ]; export const isFieldMetadataTextKind = ( diff --git a/packages/twenty-shared/src/utils/filter/index.ts b/packages/twenty-shared/src/utils/filter/index.ts index b73e2859b0a..ab2874e6478 100644 --- a/packages/twenty-shared/src/utils/filter/index.ts +++ b/packages/twenty-shared/src/utils/filter/index.ts @@ -24,7 +24,7 @@ export * from './utils/isMatchingFloatFilter'; export * from './utils/isMatchingMultiSelectFilter'; export * from './utils/isMatchingRatingFilter'; export * from './utils/isMatchingRawJsonFilter'; -export * from './utils/isMatchingRichTextV2Filter'; +export * from './utils/isMatchingRichTextFilter'; export * from './utils/isMatchingSelectFilter'; export * from './utils/isMatchingStringFilter'; export * from './utils/isMatchingTSVectorFilter'; diff --git a/packages/twenty-shared/src/utils/filter/utils/__tests__/isMatchingRichTextV2Filter.test.ts b/packages/twenty-shared/src/utils/filter/utils/__tests__/isMatchingRichTextFilter.test.ts similarity index 52% rename from packages/twenty-shared/src/utils/filter/utils/__tests__/isMatchingRichTextV2Filter.test.ts rename to packages/twenty-shared/src/utils/filter/utils/__tests__/isMatchingRichTextFilter.test.ts index 768f3b1544b..806b3f7f2a1 100644 --- a/packages/twenty-shared/src/utils/filter/utils/__tests__/isMatchingRichTextV2Filter.test.ts +++ b/packages/twenty-shared/src/utils/filter/utils/__tests__/isMatchingRichTextFilter.test.ts @@ -1,11 +1,11 @@ -import { isMatchingRichTextV2Filter } from '@/utils/filter/utils/isMatchingRichTextV2Filter'; +import { isMatchingRichTextFilter } from '@/utils/filter/utils/isMatchingRichTextFilter'; -describe('isMatchingRichTextV2Filter', () => { +describe('isMatchingRichTextFilter', () => { describe('markdown ilike', () => { it('should match with wildcard pattern', () => { expect( - isMatchingRichTextV2Filter({ - richTextV2Filter: { markdown: { ilike: '%hello%' } }, + isMatchingRichTextFilter({ + richTextFilter: { markdown: { ilike: '%hello%' } }, value: 'say hello world', }), ).toBe(true); @@ -13,8 +13,8 @@ describe('isMatchingRichTextV2Filter', () => { it('should not match when pattern does not match', () => { expect( - isMatchingRichTextV2Filter({ - richTextV2Filter: { markdown: { ilike: '%goodbye%' } }, + isMatchingRichTextFilter({ + richTextFilter: { markdown: { ilike: '%goodbye%' } }, value: 'say hello world', }), ).toBe(false); @@ -22,8 +22,8 @@ describe('isMatchingRichTextV2Filter', () => { it('should be case insensitive', () => { expect( - isMatchingRichTextV2Filter({ - richTextV2Filter: { markdown: { ilike: '%HELLO%' } }, + isMatchingRichTextFilter({ + richTextFilter: { markdown: { ilike: '%HELLO%' } }, value: 'say hello world', }), ).toBe(true); @@ -33,11 +33,11 @@ describe('isMatchingRichTextV2Filter', () => { describe('default', () => { it('should throw for unexpected filter', () => { expect(() => - isMatchingRichTextV2Filter({ - richTextV2Filter: {} as any, + isMatchingRichTextFilter({ + richTextFilter: {} as any, value: 'test', }), - ).toThrow('Unexpected value for RICH_TEXT_V2 filter'); + ).toThrow('Unexpected value for RICH_TEXT filter'); }); }); }); diff --git a/packages/twenty-shared/src/utils/filter/utils/isMatchingRichTextFilter.ts b/packages/twenty-shared/src/utils/filter/utils/isMatchingRichTextFilter.ts new file mode 100644 index 00000000000..08367798c33 --- /dev/null +++ b/packages/twenty-shared/src/utils/filter/utils/isMatchingRichTextFilter.ts @@ -0,0 +1,25 @@ +import { type RichTextFilter } from '@/types'; +import escapeRegExp from 'lodash.escaperegexp'; + +export const isMatchingRichTextFilter = ({ + richTextFilter, + value, +}: { + richTextFilter: RichTextFilter; + value: string; +}) => { + switch (true) { + case richTextFilter.markdown !== undefined: { + const escapedPattern = escapeRegExp(richTextFilter.markdown.ilike); + const regexPattern = escapedPattern.replace(/%/g, '.*'); + const regexCaseInsensitive = new RegExp(`^${regexPattern}$`, 'i'); + + return regexCaseInsensitive.test(value); + } + default: { + throw new Error( + `Unexpected value for RICH_TEXT filter : ${JSON.stringify(richTextFilter)}`, + ); + } + } +}; diff --git a/packages/twenty-shared/src/utils/filter/utils/isMatchingRichTextV2Filter.ts b/packages/twenty-shared/src/utils/filter/utils/isMatchingRichTextV2Filter.ts deleted file mode 100644 index 0fe7b9a1a34..00000000000 --- a/packages/twenty-shared/src/utils/filter/utils/isMatchingRichTextV2Filter.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { type RichTextV2Filter } from '@/types'; -import escapeRegExp from 'lodash.escaperegexp'; - -export const isMatchingRichTextV2Filter = ({ - richTextV2Filter, - value, -}: { - richTextV2Filter: RichTextV2Filter; - value: string; -}) => { - switch (true) { - case richTextV2Filter.markdown !== undefined: { - const escapedPattern = escapeRegExp(richTextV2Filter.markdown.ilike); - const regexPattern = escapedPattern.replace(/%/g, '.*'); - const regexCaseInsensitive = new RegExp(`^${regexPattern}$`, 'i'); - - return regexCaseInsensitive.test(value); - } - default: { - throw new Error( - `Unexpected value for RICH_TEXT_V2 filter : ${JSON.stringify(richTextV2Filter)}`, - ); - } - } -}; diff --git a/packages/twenty-shared/src/utils/index.ts b/packages/twenty-shared/src/utils/index.ts index bc471216f9c..a18a7aaca11 100644 --- a/packages/twenty-shared/src/utils/index.ts +++ b/packages/twenty-shared/src/utils/index.ts @@ -117,7 +117,7 @@ export { isMatchingFloatFilter } from './filter/utils/isMatchingFloatFilter'; export { isMatchingMultiSelectFilter } from './filter/utils/isMatchingMultiSelectFilter'; export { isMatchingRatingFilter } from './filter/utils/isMatchingRatingFilter'; export { isMatchingRawJsonFilter } from './filter/utils/isMatchingRawJsonFilter'; -export { isMatchingRichTextV2Filter } from './filter/utils/isMatchingRichTextV2Filter'; +export { isMatchingRichTextFilter } from './filter/utils/isMatchingRichTextFilter'; export { isMatchingSelectFilter } from './filter/utils/isMatchingSelectFilter'; export { isMatchingStringFilter } from './filter/utils/isMatchingStringFilter'; export { isMatchingTSVectorFilter } from './filter/utils/isMatchingTSVectorFilter';