Release dashboards V1 (#17386)

Remove `IS_PAGE_LAYOUT_ENABLED` feature flag entirely
This commit is contained in:
Raphaël Bosi
2026-01-23 11:30:05 +01:00
committed by GitHub
parent b8da15d9d5
commit 78dd43dbb0
10 changed files with 17 additions and 63 deletions
@@ -1458,7 +1458,6 @@ export enum FeatureFlagKey {
IS_FILES_FIELD_ENABLED = 'IS_FILES_FIELD_ENABLED',
IS_JSON_FILTER_ENABLED = 'IS_JSON_FILTER_ENABLED',
IS_JUNCTION_RELATIONS_ENABLED = 'IS_JUNCTION_RELATIONS_ENABLED',
IS_PAGE_LAYOUT_ENABLED = 'IS_PAGE_LAYOUT_ENABLED',
IS_PUBLIC_DOMAIN_ENABLED = 'IS_PUBLIC_DOMAIN_ENABLED',
IS_RECORD_PAGE_LAYOUT_ENABLED = 'IS_RECORD_PAGE_LAYOUT_ENABLED',
IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED = 'IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED',
@@ -1425,7 +1425,6 @@ export enum FeatureFlagKey {
IS_FILES_FIELD_ENABLED = 'IS_FILES_FIELD_ENABLED',
IS_JSON_FILTER_ENABLED = 'IS_JSON_FILTER_ENABLED',
IS_JUNCTION_RELATIONS_ENABLED = 'IS_JUNCTION_RELATIONS_ENABLED',
IS_PAGE_LAYOUT_ENABLED = 'IS_PAGE_LAYOUT_ENABLED',
IS_PUBLIC_DOMAIN_ENABLED = 'IS_PUBLIC_DOMAIN_ENABLED',
IS_RECORD_PAGE_LAYOUT_ENABLED = 'IS_RECORD_PAGE_LAYOUT_ENABLED',
IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED = 'IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED',
@@ -6,17 +6,12 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { coreViewsState } from '@/views/states/coreViewState';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { useFeatureFlagsMap } from '@/workspace/hooks/useFeatureFlagsMap';
import { useMemo } from 'react';
import { useRecoilValue } from 'recoil';
import {
FeatureFlagKey,
FieldMetadataType,
} from '~/generated-metadata/graphql';
import { FieldMetadataType } from '~/generated-metadata/graphql';
import { usePrefetchedFavoritesData } from './usePrefetchedFavoritesData';
export const useWorkspaceFavorites = () => {
const featureFlags = useFeatureFlagsMap();
const { workspaceFavorites } = usePrefetchedFavoritesData();
const coreViews = useRecoilValue(coreViewsState);
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
@@ -38,17 +33,7 @@ export const useWorkspaceFavorites = () => {
[favoriteObjectMetadataItem.fields],
);
const [dashboardObjectMetadataId] = objectMetadataItems
.filter((item) => item.nameSingular === CoreObjectNameSingular.Dashboard)
.map((item) => item.id);
const views = coreViews
.map(convertCoreViewToView)
.filter(
(view) =>
featureFlags[FeatureFlagKey.IS_PAGE_LAYOUT_ENABLED] === true ||
view.objectMetadataId !== dashboardObjectMetadataId,
);
const views = coreViews.map(convertCoreViewToView);
const sortedWorkspaceFavorites = useMemo(
() =>
@@ -110,7 +110,7 @@ describe('evaluateTabVisibility', () => {
evaluateTabVisibility(
{
...baseConfig,
ifFeaturesDisabled: [FeatureFlagKey.IS_PAGE_LAYOUT_ENABLED],
ifFeaturesDisabled: [FeatureFlagKey.IS_RECORD_PAGE_LAYOUT_ENABLED],
},
baseContext,
),
@@ -123,7 +123,7 @@ describe('evaluateTabVisibility', () => {
currentWorkspace: {
featureFlags: [
{ key: FeatureFlagKey.IS_AI_ENABLED, value: true },
{ key: FeatureFlagKey.IS_PAGE_LAYOUT_ENABLED, value: true },
{ key: FeatureFlagKey.IS_RECORD_PAGE_LAYOUT_ENABLED, value: true },
],
},
};
@@ -131,7 +131,7 @@ describe('evaluateTabVisibility', () => {
evaluateTabVisibility(
{
...baseConfig,
ifFeaturesDisabled: [FeatureFlagKey.IS_PAGE_LAYOUT_ENABLED],
ifFeaturesDisabled: [FeatureFlagKey.IS_RECORD_PAGE_LAYOUT_ENABLED],
},
ctx,
),
@@ -12,14 +12,6 @@ export type PublicFeatureFlag = {
};
export const PUBLIC_FEATURE_FLAGS: PublicFeatureFlag[] = [
{
key: FeatureFlagKey.IS_PAGE_LAYOUT_ENABLED,
metadata: {
label: 'Dashboards',
description: 'Enable dashboards',
imagePath: 'https://twenty.com/images/lab/is-dashboards-enabled.png',
},
},
{
key: FeatureFlagKey.IS_JUNCTION_RELATIONS_ENABLED,
metadata: {
@@ -4,7 +4,6 @@ export enum FeatureFlagKey {
IS_AI_ENABLED = 'IS_AI_ENABLED',
IS_APPLICATION_ENABLED = 'IS_APPLICATION_ENABLED',
IS_APPLICATION_INSTALLATION_FROM_TARBALL_ENABLED = 'IS_APPLICATION_INSTALLATION_FROM_TARBALL_ENABLED',
IS_PAGE_LAYOUT_ENABLED = 'IS_PAGE_LAYOUT_ENABLED',
IS_RECORD_PAGE_LAYOUT_ENABLED = 'IS_RECORD_PAGE_LAYOUT_ENABLED',
IS_PUBLIC_DOMAIN_ENABLED = 'IS_PUBLIC_DOMAIN_ENABLED',
IS_EMAILING_DOMAIN_ENABLED = 'IS_EMAILING_DOMAIN_ENABLED',
@@ -10,8 +10,6 @@ import {
import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action';
import { AccessTokenService } from 'src/engine/core-modules/auth/token/services/access-token.service';
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 { baseSchema } from 'src/engine/core-modules/open-api/utils/base-schema.utils';
import {
computeMetadataSchemaComponents,
@@ -57,7 +55,6 @@ export class OpenApiService {
private readonly accessTokenService: AccessTokenService,
private readonly twentyConfigService: TwentyConfigService,
private readonly flatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService,
private readonly featureFlagService: FeatureFlagService,
) {}
private async getWorkspaceFromRequest(request: Request) {
@@ -279,12 +276,6 @@ export class OpenApiService {
return schema;
}
const workspaceFeatureFlagsMap =
await this.featureFlagService.getWorkspaceFeatureFlagsMap(workspace.id);
const isPageLayoutEnabled =
workspaceFeatureFlagsMap[FeatureFlagKey.IS_PAGE_LAYOUT_ENABLED];
const metadata = [
{
nameSingular: 'object',
@@ -326,22 +317,18 @@ export class OpenApiService {
nameSingular: 'viewFilterGroup',
namePlural: 'viewFilterGroups',
},
...(isPageLayoutEnabled
? [
{
nameSingular: 'pageLayout',
namePlural: 'pageLayouts',
},
{
nameSingular: 'pageLayoutTab',
namePlural: 'pageLayoutTabs',
},
{
nameSingular: 'pageLayoutWidget',
namePlural: 'pageLayoutWidgets',
},
]
: []),
{
nameSingular: 'pageLayout',
namePlural: 'pageLayouts',
},
{
nameSingular: 'pageLayoutTab',
namePlural: 'pageLayoutTabs',
},
{
nameSingular: 'pageLayoutWidget',
namePlural: 'pageLayoutWidgets',
},
];
schema.paths = metadata.reduce((path, item) => {
@@ -212,7 +212,6 @@ describe('WorkspaceEntityManager', () => {
IS_AI_ENABLED: false,
IS_APPLICATION_ENABLED: false,
IS_IMAP_SMTP_CALDAV_ENABLED: false,
IS_PAGE_LAYOUT_ENABLED: false,
IS_RECORD_PAGE_LAYOUT_ENABLED: false,
IS_PUBLIC_DOMAIN_ENABLED: false,
IS_EMAILING_DOMAIN_ENABLED: false,
@@ -240,7 +239,6 @@ describe('WorkspaceEntityManager', () => {
IS_JSON_FILTER_ENABLED: false,
IS_AI_ENABLED: false,
IS_APPLICATION_ENABLED: false,
IS_PAGE_LAYOUT_ENABLED: false,
IS_RECORD_PAGE_LAYOUT_ENABLED: false,
IS_PUBLIC_DOMAIN_ENABLED: false,
IS_EMAILING_DOMAIN_ENABLED: false,
@@ -36,11 +36,6 @@ export const seedFeatureFlags = async ({
workspaceId: workspaceId,
value: true,
},
{
key: FeatureFlagKey.IS_PAGE_LAYOUT_ENABLED,
workspaceId: workspaceId,
value: true,
},
{
key: FeatureFlagKey.IS_RECORD_PAGE_LAYOUT_ENABLED,
workspaceId: workspaceId,
Binary file not shown.

Before

Width:  |  Height:  |  Size: 335 KiB