From 69d228d8a15799306865abdeba13a5e8611dce82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Mon, 13 Apr 2026 23:13:15 +0200 Subject: [PATCH] Deprecate IS_RECORD_TABLE_WIDGET_ENABLED feature flag (#19662) ## Summary - Removes the `IS_RECORD_TABLE_WIDGET_ENABLED` feature flag, making the record table widget unconditionally available in dashboard widget type selection - The flag was already seeded as `true` for all new workspaces and only gated UI visibility in one component (`SidePanelPageLayoutDashboardWidgetTypeSelect`) - Cleans up the flag from `FeatureFlagKey` enum, dev seeder, and test mocks ## Analysis The flag only controlled whether the "View" (Record Table) widget option appeared in the dashboard widget type selector. The entire record table widget infrastructure (rendering, creation hooks, GraphQL types, `RECORD_TABLE` enum in `WidgetType`) is independent of the flag and fully implemented. No backend logic depends on this flag. --------- Co-authored-by: Claude Opus 4.6 Co-authored-by: Charles Bochet --- .github/workflows/ci-zapier.yaml | 7 ++-- .../src/metadata/generated/schema.graphql | 1 - .../src/metadata/generated/schema.ts | 3 +- .../src/generated-metadata/graphql.ts | 1 - ...nelPageLayoutDashboardWidgetTypeSelect.tsx | 37 +++++++------------ .../workspace-entity-manager.spec.ts | 1 - .../core/utils/seed-feature-flags.util.ts | 5 --- .../twenty-shared/src/types/FeatureFlagKey.ts | 1 - 8 files changed, 18 insertions(+), 38 deletions(-) diff --git a/.github/workflows/ci-zapier.yaml b/.github/workflows/ci-zapier.yaml index 38a785adcb8..937a3d401cc 100644 --- a/.github/workflows/ci-zapier.yaml +++ b/.github/workflows/ci-zapier.yaml @@ -69,13 +69,14 @@ jobs: - name: Server / Start run: | - npx nx start twenty-server & + npx nx run twenty-server:start:ci & echo "Waiting for server to be ready..." - timeout 60 bash -c 'until curl -s http://localhost:3000/health; do sleep 2; done' + timeout 60 bash -c 'until curl -sf http://localhost:3000/healthz; do sleep 2; done' - name: Start worker + working-directory: packages/twenty-server run: | - npx nx run twenty-server:worker & + NODE_ENV=development node dist/queue-worker/queue-worker.js & echo "Worker started" - name: Zapier / Build diff --git a/packages/twenty-client-sdk/src/metadata/generated/schema.graphql b/packages/twenty-client-sdk/src/metadata/generated/schema.graphql index 0dd22ae576c..82b1f6fbab9 100644 --- a/packages/twenty-client-sdk/src/metadata/generated/schema.graphql +++ b/packages/twenty-client-sdk/src/metadata/generated/schema.graphql @@ -1592,7 +1592,6 @@ enum FeatureFlagKey { IS_CONNECTED_ACCOUNT_MIGRATED IS_RICH_TEXT_V1_MIGRATED IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED - IS_RECORD_TABLE_WIDGET_ENABLED IS_DATASOURCE_MIGRATED } diff --git a/packages/twenty-client-sdk/src/metadata/generated/schema.ts b/packages/twenty-client-sdk/src/metadata/generated/schema.ts index 407f11718cd..0d3f7d1a140 100644 --- a/packages/twenty-client-sdk/src/metadata/generated/schema.ts +++ b/packages/twenty-client-sdk/src/metadata/generated/schema.ts @@ -1289,7 +1289,7 @@ export interface FeatureFlag { __typename: 'FeatureFlag' } -export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_AI_ENABLED' | 'IS_COMMAND_MENU_ITEM_ENABLED' | 'IS_MARKETPLACE_SETTING_TAB_VISIBLE' | 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAILING_DOMAIN_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_DRAFT_EMAIL_ENABLED' | 'IS_CONNECTED_ACCOUNT_MIGRATED' | 'IS_RICH_TEXT_V1_MIGRATED' | 'IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED' | 'IS_RECORD_TABLE_WIDGET_ENABLED' | 'IS_DATASOURCE_MIGRATED' +export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_AI_ENABLED' | 'IS_COMMAND_MENU_ITEM_ENABLED' | 'IS_MARKETPLACE_SETTING_TAB_VISIBLE' | 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAILING_DOMAIN_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_DRAFT_EMAIL_ENABLED' | 'IS_CONNECTED_ACCOUNT_MIGRATED' | 'IS_RICH_TEXT_V1_MIGRATED' | 'IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED' | 'IS_DATASOURCE_MIGRATED' export interface WorkspaceUrls { customUrl?: Scalars['String'] @@ -9470,7 +9470,6 @@ export const enumFeatureFlagKey = { IS_CONNECTED_ACCOUNT_MIGRATED: 'IS_CONNECTED_ACCOUNT_MIGRATED' as const, IS_RICH_TEXT_V1_MIGRATED: 'IS_RICH_TEXT_V1_MIGRATED' as const, IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED: 'IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED' as const, - IS_RECORD_TABLE_WIDGET_ENABLED: 'IS_RECORD_TABLE_WIDGET_ENABLED' as const, IS_DATASOURCE_MIGRATED: 'IS_DATASOURCE_MIGRATED' as const } diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 79036d7b2b9..b25f59d7d08 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -1823,7 +1823,6 @@ export enum FeatureFlagKey { IS_PUBLIC_DOMAIN_ENABLED = 'IS_PUBLIC_DOMAIN_ENABLED', IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED = 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED', IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED = 'IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED', - IS_RECORD_TABLE_WIDGET_ENABLED = 'IS_RECORD_TABLE_WIDGET_ENABLED', IS_RICH_TEXT_V1_MIGRATED = 'IS_RICH_TEXT_V1_MIGRATED', IS_UNIQUE_INDEXES_ENABLED = 'IS_UNIQUE_INDEXES_ENABLED' } diff --git a/packages/twenty-front/src/modules/side-panel/pages/page-layout/components/SidePanelPageLayoutDashboardWidgetTypeSelect.tsx b/packages/twenty-front/src/modules/side-panel/pages/page-layout/components/SidePanelPageLayoutDashboardWidgetTypeSelect.tsx index 34acb3e3312..de63a224910 100644 --- a/packages/twenty-front/src/modules/side-panel/pages/page-layout/components/SidePanelPageLayoutDashboardWidgetTypeSelect.tsx +++ b/packages/twenty-front/src/modules/side-panel/pages/page-layout/components/SidePanelPageLayoutDashboardWidgetTypeSelect.tsx @@ -22,7 +22,6 @@ import { isExistingWidgetMissingOrDifferentType } from '@/side-panel/pages/page- import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem'; import { useAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useAtomComponentState'; import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue'; -import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { useQuery } from '@apollo/client/react'; import { t } from '@lingui/core/macro'; import { CoreObjectNameSingular, SidePanelPages } from 'twenty-shared/types'; @@ -34,11 +33,7 @@ import { IconFrame, IconTable, } from 'twenty-ui/display'; -import { - FeatureFlagKey, - type FrontComponent, - WidgetType, -} from '~/generated-metadata/graphql'; +import { type FrontComponent, WidgetType } from '~/generated-metadata/graphql'; export const SidePanelPageLayoutDashboardWidgetTypeSelect = () => { const { pageLayoutId, recordId } = usePageLayoutIdFromContextStore(); @@ -101,10 +96,6 @@ export const SidePanelPageLayoutDashboardWidgetTypeSelect = () => { first.labelPlural.localeCompare(second.labelPlural), )[0]; - const isRecordTableWidgetEnabled = useIsFeatureEnabled( - FeatureFlagKey.IS_RECORD_TABLE_WIDGET_ENABLED, - ); - const { data: frontComponentsData } = useQuery<{ frontComponents: FrontComponent[]; }>(FIND_MANY_FRONT_COMPONENTS); @@ -246,7 +237,7 @@ export const SidePanelPageLayoutDashboardWidgetTypeSelect = () => { const selectableItemIds = [ 'chart', - ...(isRecordTableWidgetEnabled ? ['record-table'] : []), + 'record-table', 'iframe', 'rich-text', ...frontComponentsWithSelectItemId.map(({ selectItemId }) => selectItemId), @@ -266,19 +257,17 @@ export const SidePanelPageLayoutDashboardWidgetTypeSelect = () => { onClick={handleNavigateToGraphTypeSelect} /> - {isRecordTableWidgetEnabled && ( - - - - )} + + + { IS_CONNECTED_ACCOUNT_MIGRATED: false, IS_RICH_TEXT_V1_MIGRATED: false, IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED: false, - IS_RECORD_TABLE_WIDGET_ENABLED: false, IS_DATASOURCE_MIGRATED: false, IS_COMMAND_MENU_ITEM_ENABLED: false, }, diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/utils/seed-feature-flags.util.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/utils/seed-feature-flags.util.ts index b842a2f2386..77e672b8be6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/utils/seed-feature-flags.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/utils/seed-feature-flags.util.ts @@ -60,11 +60,6 @@ export const seedFeatureFlags = async ({ workspaceId: workspaceId, value: true, }, - { - key: FeatureFlagKey.IS_RECORD_TABLE_WIDGET_ENABLED, - workspaceId: workspaceId, - value: true, - }, ]) .execute(); }; diff --git a/packages/twenty-shared/src/types/FeatureFlagKey.ts b/packages/twenty-shared/src/types/FeatureFlagKey.ts index 19959e0d8fc..3d82a5c6fdd 100644 --- a/packages/twenty-shared/src/types/FeatureFlagKey.ts +++ b/packages/twenty-shared/src/types/FeatureFlagKey.ts @@ -12,7 +12,6 @@ export enum FeatureFlagKey { IS_CONNECTED_ACCOUNT_MIGRATED = 'IS_CONNECTED_ACCOUNT_MIGRATED', IS_RICH_TEXT_V1_MIGRATED = 'IS_RICH_TEXT_V1_MIGRATED', IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED = 'IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED', - IS_RECORD_TABLE_WIDGET_ENABLED = 'IS_RECORD_TABLE_WIDGET_ENABLED', // @deprecated - Migration is complete. Kept for backward compatibility // until all workspaces have the flag and the flag can be removed entirely. IS_DATASOURCE_MIGRATED = 'IS_DATASOURCE_MIGRATED',