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 <noreply@anthropic.com>
Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Félix Malfait
2026-04-13 23:13:15 +02:00
committed by GitHub
parent 455022f652
commit 69d228d8a1
8 changed files with 18 additions and 38 deletions
@@ -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}
/>
</SelectableListItem>
{isRecordTableWidgetEnabled && (
<SelectableListItem
itemId="record-table"
onEnter={handleNavigateToRecordTableSettings}
>
<CommandMenuItem
Icon={IconTable}
label={t`View`}
id="record-table"
onClick={handleNavigateToRecordTableSettings}
/>
</SelectableListItem>
)}
<SelectableListItem
itemId="record-table"
onEnter={handleNavigateToRecordTableSettings}
>
<CommandMenuItem
Icon={IconTable}
label={t`View`}
id="record-table"
onClick={handleNavigateToRecordTableSettings}
/>
</SelectableListItem>
<SelectableListItem
itemId="iframe"
onEnter={handleNavigateToIframeSettings}