From 2aa72de210c59fcb584545341b4714d055f22d17 Mon Sep 17 00:00:00 2001 From: Etienne <45695613+etiennejouan@users.noreply.github.com> Date: Fri, 28 Feb 2025 14:34:06 +0100 Subject: [PATCH] remove isRichTextV2Enabled feature flag (#10562) --- .../hooks/useExportNoteAction.ts | 12 ++------- .../components/ActivityRichTextEditor.tsx | 26 +++++++----------- ...findActivitiesOperationSignatureFactory.ts | 16 +++++------ .../modules/activities/hooks/useActivities.ts | 7 ----- .../usePrepareFindManyActivitiesQuery.ts | 7 ----- .../activities/notes/components/NoteCard.tsx | 10 ++----- .../activities/tasks/components/TaskRow.tsx | 10 +------ .../components/TemplateColumn.tsx | 11 +------- .../0-42-migrate-rich-text-field.command.ts | 21 --------------- ...ector-on-note-and-task-entities.command.ts | 9 ------- .../typeorm-seeds/core/feature-flags.ts | 5 ---- .../activity-query-result-getter.handler.ts | 27 +++++-------------- .../factories/query-runner-args.factory.ts | 4 +++ .../enums/feature-flag-key.enum.ts | 1 - 14 files changed, 31 insertions(+), 135 deletions(-) diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useExportNoteAction.ts b/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useExportNoteAction.ts index 3ad93026c..abeb3d5b3 100644 --- a/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useExportNoteAction.ts +++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useExportNoteAction.ts @@ -2,11 +2,9 @@ import { useSelectedRecordIdOrThrow } from '@/action-menu/actions/record-actions import { ActionHookWithObjectMetadataItem } from '@/action-menu/actions/types/ActionHook'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; -import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { BlockNoteEditor } from '@blocknote/core'; import { useRecoilValue } from 'recoil'; import { isDefined } from 'twenty-shared'; -import { FeatureFlagKey } from '~/generated/graphql'; export const useExportNoteAction: ActionHookWithObjectMetadataItem = ({ objectMetadataItem, @@ -24,18 +22,12 @@ export const useExportNoteAction: ActionHookWithObjectMetadataItem = ({ const shouldBeRegistered = isDefined(objectMetadataItem) && isDefined(selectedRecord) && isNoteOrTask; - const isRichTextV2Enabled = useIsFeatureEnabled( - FeatureFlagKey.IsRichTextV2Enabled, - ); - const onClick = async () => { if (!shouldBeRegistered || !selectedRecord?.body) { return; } - const initialBody = isRichTextV2Enabled - ? selectedRecord.bodyV2?.blocknote - : selectedRecord.body; + const initialBody = selectedRecord.bodyV2?.blocknote; let parsedBody = []; @@ -45,7 +37,7 @@ export const useExportNoteAction: ActionHookWithObjectMetadataItem = ({ } catch (error) { // eslint-disable-next-line no-console console.warn( - `Failed to parse body for record ${recordId}, for rich text version ${isRichTextV2Enabled ? 'v2' : 'v1'}`, + `Failed to parse body for record ${recordId}, for rich text version 'v2'`, ); // eslint-disable-next-line no-console console.warn(initialBody); diff --git a/packages/twenty-front/src/modules/activities/components/ActivityRichTextEditor.tsx b/packages/twenty-front/src/modules/activities/components/ActivityRichTextEditor.tsx index 9ebf3b4d0..036f2510e 100644 --- a/packages/twenty-front/src/modules/activities/components/ActivityRichTextEditor.tsx +++ b/packages/twenty-front/src/modules/activities/components/ActivityRichTextEditor.tsx @@ -50,10 +50,6 @@ export const ActivityRichTextEditor = ({ const cache = useApolloClient().cache; const activity = activityInStore as Task | Note | null; - const isRichTextV2Enabled = useIsFeatureEnabled( - FeatureFlagKey.IsRichTextV2Enabled, - ); - const isCommandMenuV2Enabled = useIsFeatureEnabled( FeatureFlagKey.IsCommandMenuV2Enabled, ); @@ -73,14 +69,12 @@ export const ActivityRichTextEditor = ({ }); const persistBodyDebounced = useDebouncedCallback((blocknote: string) => { - const input = isRichTextV2Enabled - ? { - bodyV2: { - blocknote, - markdown: null, - }, - } - : { body: blocknote }; + const input = { + bodyV2: { + blocknote, + markdown: null, + }, + }; if (isDefined(activity)) { upsertActivity({ @@ -175,9 +169,7 @@ export const ActivityRichTextEditor = ({ }; const initialBody = useMemo(() => { - const blocknote = isRichTextV2Enabled - ? activity?.bodyV2?.blocknote - : activity?.body; + const blocknote = activity?.bodyV2?.blocknote; if ( isDefined(activity) && @@ -192,7 +184,7 @@ export const ActivityRichTextEditor = ({ } catch (error) { // eslint-disable-next-line no-console console.warn( - `Failed to parse body for activity ${activityId}, for rich text version ${isRichTextV2Enabled ? 'v2' : 'v1'}`, + `Failed to parse body for activity ${activityId}, for rich text version 'v2'`, ); // eslint-disable-next-line no-console console.warn(blocknote); @@ -206,7 +198,7 @@ export const ActivityRichTextEditor = ({ } return undefined; - }, [activity, isRichTextV2Enabled, activityId]); + }, [activity, activityId]); const handleEditorBuiltInUploadFile = async (file: File) => { const { attachmentAbsoluteURL } = await handleUploadAttachment(file); diff --git a/packages/twenty-front/src/modules/activities/graphql/operation-signatures/factories/findActivitiesOperationSignatureFactory.ts b/packages/twenty-front/src/modules/activities/graphql/operation-signatures/factories/findActivitiesOperationSignatureFactory.ts index ec5f05f6c..0b653c2a7 100644 --- a/packages/twenty-front/src/modules/activities/graphql/operation-signatures/factories/findActivitiesOperationSignatureFactory.ts +++ b/packages/twenty-front/src/modules/activities/graphql/operation-signatures/factories/findActivitiesOperationSignatureFactory.ts @@ -7,20 +7,16 @@ export const findActivitiesOperationSignatureFactory: RecordGqlOperationSignatur ({ objectMetadataItems, objectNameSingular, - isRichTextV2Enabled, }: { objectMetadataItems: ObjectMetadataItem[]; objectNameSingular: CoreObjectNameSingular; - isRichTextV2Enabled: boolean; }) => { - const body = isRichTextV2Enabled - ? { - bodyV2: { - markdown: true, - blocknote: true, - }, - } - : { body: true }; + const body = { + bodyV2: { + markdown: true, + blocknote: true, + }, + }; return { objectNameSingular: objectNameSingular, diff --git a/packages/twenty-front/src/modules/activities/hooks/useActivities.ts b/packages/twenty-front/src/modules/activities/hooks/useActivities.ts index d2d39056b..b5311a800 100644 --- a/packages/twenty-front/src/modules/activities/hooks/useActivities.ts +++ b/packages/twenty-front/src/modules/activities/hooks/useActivities.ts @@ -12,8 +12,6 @@ import { RecordGqlOperationFilter } from '@/object-record/graphql/types/RecordGq import { RecordGqlOperationOrderBy } from '@/object-record/graphql/types/RecordGqlOperationOrderBy'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; -import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; -import { FeatureFlagKey } from '~/generated/graphql'; import { sortByAscString } from '~/utils/array/sortByAscString'; export const useActivities = ({ @@ -29,10 +27,6 @@ export const useActivities = ({ activitiesOrderByVariables: RecordGqlOperationOrderBy; skip?: boolean; }) => { - const isRichTextV2Enabled = useIsFeatureEnabled( - FeatureFlagKey.IsRichTextV2Enabled, - ); - const { objectMetadataItems } = useObjectMetadataItems(); const { activityTargets, loadingActivityTargets } = @@ -70,7 +64,6 @@ export const useActivities = ({ findActivitiesOperationSignatureFactory({ objectMetadataItems, objectNameSingular, - isRichTextV2Enabled, }); const { records: activities, loading: loadingActivities } = diff --git a/packages/twenty-front/src/modules/activities/hooks/usePrepareFindManyActivitiesQuery.ts b/packages/twenty-front/src/modules/activities/hooks/usePrepareFindManyActivitiesQuery.ts index 16175e2a0..e203711bb 100644 --- a/packages/twenty-front/src/modules/activities/hooks/usePrepareFindManyActivitiesQuery.ts +++ b/packages/twenty-front/src/modules/activities/hooks/usePrepareFindManyActivitiesQuery.ts @@ -13,9 +13,7 @@ import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordF import { useUpsertFindManyRecordsQueryInCache } from '@/object-record/cache/hooks/useUpsertFindManyRecordsQueryInCache'; import { getRecordFromCache } from '@/object-record/cache/utils/getRecordFromCache'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { isDefined } from 'twenty-shared'; -import { FeatureFlagKey } from '~/generated-metadata/graphql'; import { sortByAscString } from '~/utils/array/sortByAscString'; export const usePrepareFindManyActivitiesQuery = ({ @@ -23,10 +21,6 @@ export const usePrepareFindManyActivitiesQuery = ({ }: { activityObjectNameSingular: CoreObjectNameSingular; }) => { - const isRichTextV2Enabled = useIsFeatureEnabled( - FeatureFlagKey.IsRichTextV2Enabled, - ); - const { objectMetadataItem: objectMetadataItemActivity } = useObjectMetadataItem({ objectNameSingular: activityObjectNameSingular, @@ -120,7 +114,6 @@ export const usePrepareFindManyActivitiesQuery = ({ findActivitiesOperationSignatureFactory({ objectNameSingular: activityObjectNameSingular, objectMetadataItems, - isRichTextV2Enabled, }); upsertFindManyActivitiesInCache({ diff --git a/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx b/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx index 0def04587..4b4a1f3d7 100644 --- a/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx +++ b/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx @@ -6,8 +6,6 @@ import { Note } from '@/activities/types/Note'; import { getActivityPreview } from '@/activities/utils/getActivityPreview'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { useFieldContext } from '@/object-record/hooks/useFieldContext'; -import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; -import { FeatureFlagKey } from '~/generated-metadata/graphql'; const StyledCard = styled.div<{ isSingleNote: boolean }>` align-items: flex-start; @@ -73,12 +71,8 @@ export const NoteCard = ({ const openActivityRightDrawer = useOpenActivityRightDrawer({ objectNameSingular: CoreObjectNameSingular.Note, }); - const isRichTextV2Enabled = useIsFeatureEnabled( - FeatureFlagKey.IsRichTextV2Enabled, - ); - const body = getActivityPreview( - isRichTextV2Enabled ? (note?.bodyV2?.blocknote ?? null) : note?.body, - ); + + const body = getActivityPreview(note?.bodyV2?.blocknote ?? null); const { FieldContextProvider: NoteTargetsContextProvider } = useFieldContext({ objectNameSingular: CoreObjectNameSingular.Note, diff --git a/packages/twenty-front/src/modules/activities/tasks/components/TaskRow.tsx b/packages/twenty-front/src/modules/activities/tasks/components/TaskRow.tsx index 06420c794..ee4822006 100644 --- a/packages/twenty-front/src/modules/activities/tasks/components/TaskRow.tsx +++ b/packages/twenty-front/src/modules/activities/tasks/components/TaskRow.tsx @@ -16,8 +16,6 @@ import { ActivityRow } from '@/activities/components/ActivityRow'; import { Task } from '@/activities/types/Task'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { useFieldContext } from '@/object-record/hooks/useFieldContext'; -import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; -import { FeatureFlagKey } from '~/generated-metadata/graphql'; import { useCompleteTask } from '../hooks/useCompleteTask'; const StyledTaskBody = styled.div` @@ -84,13 +82,7 @@ export const TaskRow = ({ task }: { task: Task }) => { objectNameSingular: CoreObjectNameSingular.Task, }); - const isRichTextV2Enabled = useIsFeatureEnabled( - FeatureFlagKey.IsRichTextV2Enabled, - ); - - const body = getActivitySummary( - isRichTextV2Enabled ? (task?.bodyV2?.blocknote ?? null) : task?.body, - ); + const body = getActivitySummary(task?.bodyV2?.blocknote ?? null); const { completeTask } = useCompleteTask(task); diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/TemplateColumn.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/TemplateColumn.tsx index d4eb85cb6..003a2d87f 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/TemplateColumn.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/TemplateColumn.tsx @@ -4,9 +4,7 @@ import { IconForbid } from 'twenty-ui'; import { MatchColumnSelect } from '@/spreadsheet-import/components/MatchColumnSelect'; import { useSpreadsheetImportInternal } from '@/spreadsheet-import/hooks/useSpreadsheetImportInternal'; -import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { FieldMetadataType } from 'twenty-shared'; -import { FeatureFlagKey } from '~/generated-metadata/graphql'; import { Columns, ColumnType } from '../MatchColumnsStep'; const StyledContainer = styled.div` @@ -27,19 +25,12 @@ export const TemplateColumn = ({ columnIndex, onChange, }: TemplateColumnProps) => { - const isRichTextV2Enabled = useIsFeatureEnabled( - FeatureFlagKey.IsRichTextV2Enabled, - ); const { fields } = useSpreadsheetImportInternal(); const column = columns[columnIndex]; const isIgnored = column.type === ColumnType.ignored; const fieldOptions = fields - .filter((field) => - isRichTextV2Enabled - ? field.fieldMetadataType !== FieldMetadataType.RICH_TEXT - : true, - ) + .filter((field) => field.fieldMetadataType !== FieldMetadataType.RICH_TEXT) .map(({ icon, label, key }) => { const isSelected = columns.findIndex((column) => { diff --git a/packages/twenty-server/src/database/commands/upgrade-version/0-42/0-42-migrate-rich-text-field.command.ts b/packages/twenty-server/src/database/commands/upgrade-version/0-42/0-42-migrate-rich-text-field.command.ts index df548f305..616bf2c99 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version/0-42/0-42-migrate-rich-text-field.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version/0-42/0-42-migrate-rich-text-field.command.ts @@ -12,7 +12,6 @@ import { MaintainedWorkspacesMigrationCommandOptions, MaintainedWorkspacesMigrationCommandRunner, } from 'src/database/commands/migration-command/maintained-workspaces-migration-command.runner'; -import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; @@ -174,8 +173,6 @@ export class MigrateRichTextFieldCommand extends MaintainedWorkspacesMigrationCo workspaceId, }); - await this.enableRichTextV2FeatureFlag(workspaceId); - if (!this.options.dryRun) { await this.workspaceMetadataVersionService.incrementMetadataVersion( workspaceId, @@ -190,24 +187,6 @@ export class MigrateRichTextFieldCommand extends MaintainedWorkspacesMigrationCo } } - private async enableRichTextV2FeatureFlag( - workspaceId: string, - ): Promise { - if (!this.options.dryRun) { - await this.featureFlagRepository.upsert( - { - workspaceId, - key: FeatureFlagKey.IsRichTextV2Enabled, - value: true, - }, - { - conflictPaths: ['workspaceId', 'key'], - skipUpdateIfNoValuesChanged: true, - }, - ); - } - } - private buildRichTextFieldStandardId(richTextField: FieldMetadataEntity) { switch (true) { case richTextField.standardId === TASK_STANDARD_FIELD_IDS.body: { diff --git a/packages/twenty-server/src/database/commands/upgrade-version/0-43/0-43-migrate-search-vector-on-note-and-task-entities.command.ts b/packages/twenty-server/src/database/commands/upgrade-version/0-43/0-43-migrate-search-vector-on-note-and-task-entities.command.ts index 3994d6a4c..98dca41e8 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version/0-43/0-43-migrate-search-vector-on-note-and-task-entities.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version/0-43/0-43-migrate-search-vector-on-note-and-task-entities.command.ts @@ -8,7 +8,6 @@ import { MaintainedWorkspacesMigrationCommandOptions, MaintainedWorkspacesMigrationCommandRunner, } from 'src/database/commands/migration-command/maintained-workspaces-migration-command.runner'; -import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; @@ -66,14 +65,6 @@ export class MigrateSearchVectorOnNoteAndTaskEntitiesCommand extends MaintainedW `Running command for workspace ${workspaceId} ${index + 1}/${total}`, ); - await this.featureFlagRepository.findOneOrFail({ - where: { - workspaceId, - key: FeatureFlagKey.IsRichTextV2Enabled, - value: true, - }, - }); - const noteObjectMetadata = await this.objectMetadataRepository.findOneOrFail({ select: ['id'], diff --git a/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts b/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts index c3e24dbd7..ada5fac4e 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts @@ -75,11 +75,6 @@ export const seedFeatureFlags = async ( workspaceId: workspaceId, value: true, }, - { - key: FeatureFlagKey.IsRichTextV2Enabled, - workspaceId: workspaceId, - value: true, - }, { key: FeatureFlagKey.IsNewRelationEnabled, workspaceId: workspaceId, diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/handlers/activity-query-result-getter.handler.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/handlers/activity-query-result-getter.handler.ts index 5202445c1..d4c81a2fa 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/handlers/activity-query-result-getter.handler.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/handlers/activity-query-result-getter.handler.ts @@ -1,6 +1,5 @@ import { QueryResultGetterHandlerInterface } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-getter-handler.interface'; -import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { FileService } from 'src/engine/core-modules/file/services/file.service'; import { NoteWorkspaceEntity } from 'src/modules/note/standard-objects/note.workspace-entity'; @@ -22,14 +21,7 @@ export class ActivityQueryResultGetterHandler activity: TaskWorkspaceEntity | NoteWorkspaceEntity, workspaceId: string, ): Promise { - const isRichTextV2Enabled = await this.featureFlagService.isFeatureEnabled( - FeatureFlagKey.IsRichTextV2Enabled, - workspaceId, - ); - - const blocknoteJson = isRichTextV2Enabled - ? activity.bodyV2?.blocknote - : activity.body; + const blocknoteJson = activity.bodyV2?.blocknote; if (!activity.id || !blocknoteJson) { return activity; @@ -44,7 +36,7 @@ export class ActivityQueryResultGetterHandler // TODO: Remove this once we have removed the old rich text // eslint-disable-next-line no-console console.warn( - `Failed to parse body for activity ${activity.id} in workspace ${workspaceId}, for rich text version ${isRichTextV2Enabled ? 'v2' : 'v1'}`, + `Failed to parse body for activity ${activity.id} in workspace ${workspaceId}, for rich text version 'v2'`, ); // eslint-disable-next-line no-console console.warn(blocknoteJson); @@ -76,19 +68,12 @@ export class ActivityQueryResultGetterHandler }), ); - if (isRichTextV2Enabled) { - return { - ...activity, - bodyV2: { - blocknote: JSON.stringify(blocknoteWithSignedPayload), - markdown: activity.bodyV2?.markdown ?? null, - }, - }; - } - return { ...activity, - body: JSON.stringify(blocknoteWithSignedPayload), + bodyV2: { + blocknote: JSON.stringify(blocknoteWithSignedPayload), + markdown: activity.bodyV2?.markdown ?? null, + }, }; } } diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-runner-args.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-runner-args.factory.ts index b157a4f85..bf8da83fd 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-runner-args.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/factories/query-runner-args.factory.ts @@ -205,6 +205,10 @@ export class QueryRunnerArgsFactory { } case FieldMetadataType.NUMBER: return [key, value === null ? null : Number(value)]; + case FieldMetadataType.RICH_TEXT: + throw new Error( + 'Rich text is not supported, please use RICH_TEXT_V2 instead', + ); case FieldMetadataType.RICH_TEXT_V2: { const richTextV2Value = richTextV2ValueSchema.parse(value); diff --git a/packages/twenty-server/src/engine/core-modules/feature-flag/enums/feature-flag-key.enum.ts b/packages/twenty-server/src/engine/core-modules/feature-flag/enums/feature-flag-key.enum.ts index 82e2a7e3e..40943e009 100644 --- a/packages/twenty-server/src/engine/core-modules/feature-flag/enums/feature-flag-key.enum.ts +++ b/packages/twenty-server/src/engine/core-modules/feature-flag/enums/feature-flag-key.enum.ts @@ -13,7 +13,6 @@ export enum FeatureFlagKey { IsCustomDomainEnabled = 'IS_CUSTOM_DOMAIN_ENABLED', IsApprovedAccessDomainsEnabled = 'IS_APPROVED_ACCESS_DOMAINS_ENABLED', IsBillingPlansEnabled = 'IS_BILLING_PLANS_ENABLED', - IsRichTextV2Enabled = 'IS_RICH_TEXT_V2_ENABLED', IsNewRelationEnabled = 'IS_NEW_RELATION_ENABLED', IsPermissionsEnabled = 'IS_PERMISSIONS_ENABLED', }