[Fix] Backfill missing command menu items conditional availability expression (#20852)

## Description

Following [report in
discord](https://discord.com/channels/1130383047699738754/1498690477044793386/1506602927412744242)

Some command menu items were showing to all users because they had no
conditional availability expression, whereas users did not actually have
access to the page or feature behind. For instance: "Go to Admin panel",
"Go to AI settings", "Send email" etc.

<img width="833" height="1245" alt="image"
src="https://github.com/user-attachments/assets/8d2a9404-9b81-4d58-9522-558e9924c457"
/>


## Fix

- Add conditional availability expressions
- Backfill expressions for existing workspaces as they are stored in db
(commandMenuItems table)

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Marie
2026-05-23 15:22:25 +02:00
committed by GitHub
parent 2f4ebf8160
commit 85d649e831
13 changed files with 216 additions and 20 deletions
@@ -644,7 +644,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 42,
shortLabel: 'Ask AI',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.AI',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.ASK_AI,
@@ -658,7 +658,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 43,
shortLabel: 'Previous AI Chats',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.AI',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.VIEW_PREVIOUS_AI_CHATS,
@@ -687,7 +687,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 45,
shortLabel: 'Compose',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.SEND_EMAIL_TOOL',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.COMPOSE_EMAIL,
@@ -731,7 +731,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 48,
shortLabel: 'Accounts',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.CONNECTED_ACCOUNTS',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -746,7 +746,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 49,
shortLabel: 'Emails',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.CONNECTED_ACCOUNTS',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -761,7 +761,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 50,
shortLabel: 'Calendars',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.CONNECTED_ACCOUNTS',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -776,7 +776,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 51,
shortLabel: 'General',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.WORKSPACE',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -791,7 +791,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 52,
shortLabel: 'Data Model',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.DATA_MODEL',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -806,7 +806,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 53,
shortLabel: 'Members',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.WORKSPACE_MEMBERS',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -821,7 +821,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 54,
shortLabel: 'Roles',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.WORKSPACE_MEMBERS',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -836,7 +836,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 55,
shortLabel: 'Domains',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.WORKSPACE',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -851,7 +851,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 56,
shortLabel: 'Billing',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.WORKSPACE',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -866,7 +866,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 57,
shortLabel: 'APIs & Webhooks',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.API_KEYS_AND_WEBHOOKS',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -881,7 +881,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 58,
shortLabel: 'Apps',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.APPLICATIONS',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -896,7 +896,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 59,
shortLabel: 'AI',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.WORKSPACE',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -911,7 +911,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 60,
shortLabel: 'Security',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression: 'permissionFlags.SECURITY',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -926,7 +926,8 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 61,
shortLabel: 'Admin Panel',
availabilityType: CommandMenuItemAvailabilityType.GLOBAL,
conditionalAvailabilityExpression: null,
conditionalAvailabilityExpression:
'canImpersonate or canAccessFullAdminPanel',
availabilityObjectMetadataUniversalIdentifier: null,
frontComponentUniversalIdentifier: null,
engineComponentKey: EngineComponentKey.NAVIGATION,
@@ -956,7 +957,8 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 63,
shortLabel: 'Send Email',
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression: 'numberOfSelectedRecords >= 1',
conditionalAvailabilityExpression:
'numberOfSelectedRecords >= 1 and permissionFlags.SEND_EMAIL_TOOL',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.person.universalIdentifier,
frontComponentUniversalIdentifier: null,
@@ -971,7 +973,8 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 64,
shortLabel: 'Send Email',
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression: 'numberOfSelectedRecords == 1',
conditionalAvailabilityExpression:
'numberOfSelectedRecords == 1 and permissionFlags.SEND_EMAIL_TOOL',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.company.universalIdentifier,
frontComponentUniversalIdentifier: null,
@@ -986,7 +989,8 @@ export const STANDARD_COMMAND_MENU_ITEMS = {
position: 65,
shortLabel: 'Send Email',
availabilityType: CommandMenuItemAvailabilityType.RECORD_SELECTION,
conditionalAvailabilityExpression: 'numberOfSelectedRecords == 1',
conditionalAvailabilityExpression:
'numberOfSelectedRecords == 1 and permissionFlags.SEND_EMAIL_TOOL',
availabilityObjectMetadataUniversalIdentifier:
STANDARD_OBJECTS.opportunity.universalIdentifier,
frontComponentUniversalIdentifier: null,