Skip to content
Merged
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
984bf6e
feat: integrate EditActionsButton into RecordIndex and RecordShow com…
ehconitin Mar 18, 2026
a7bb9b0
Merge remote-tracking branch 'upstream/main' into command-menu-item-e…
ehconitin Mar 18, 2026
9a9cc0c
feat: enhance command menus with feature flag support and new components
ehconitin Mar 18, 2026
047e2ae
feat: integrate feature flag for command menu items in metadata loading
ehconitin Mar 18, 2026
e08c292
refactor: update side panel navigation to use CommandMenuDisplay and …
ehconitin Mar 18, 2026
e722f5c
chore: code path seperatiopn
ehconitin Mar 18, 2026
539f182
refactor: new pin icon
ehconitin Mar 18, 2026
320c84c
refactor: consolidate all flag-ON command menu code under server-items/
ehconitin Mar 18, 2026
74ca958
refactor: remove standard command menu item defaults constants
ehconitin Mar 18, 2026
2e5bdab
Merge remote-tracking branch 'upstream/main' into command-menu-item-e…
ehconitin Mar 19, 2026
b3a532e
refactor: remove unused state in SidePanelCommandMenuItemEditPage
ehconitin Mar 19, 2026
f692427
feat: enhance EditActionsButton with copy context functionality and u…
ehconitin Mar 19, 2026
c0e5923
chore: rename
ehconitin Mar 19, 2026
f372306
chore: lint
ehconitin Mar 19, 2026
3588f7c
refactor: remove isAllowedDuringGlobalLayoutCustomization from comman…
ehconitin Mar 19, 2026
239cb7f
review
ehconitin Mar 19, 2026
bd8c9dc
refactor: remove id prop from CommandMenuItemDraggable and update ref…
ehconitin Mar 19, 2026
2d30f24
refactor: /display folder
ehconitin Mar 19, 2026
6c46478
feat: enhance CommandMenuEditRecordSelectionDropdown with single and …
ehconitin Mar 19, 2026
eb937a9
feat: update CommandMenuContextProviderServerItems and related compon…
ehconitin Mar 19, 2026
f95f1a9
feat: refactor command menu components
ehconitin Mar 19, 2026
3b77d8e
refactor: lint + shuffle
ehconitin Mar 19, 2026
3c205de
cleanup
ehconitin Mar 19, 2026
393bf2b
feat: add data attribute for click outside functionality in SidePanel…
ehconitin Mar 20, 2026
7c90b2c
refactor: unify command menu context handling and improve item select…
ehconitin Mar 20, 2026
442c28d
refactor: streamline command menu context API and enhance record sele…
ehconitin Mar 20, 2026
b1ea211
refactor: update CommandMenuItemOptionsDropdown to use CommandMenuIte…
ehconitin Mar 20, 2026
550b51e
refactor: improve position calculation for reordering command menu it…
ehconitin Mar 20, 2026
bf5b034
refactor: normalize short label handling in CommandMenuItemOptionsDro…
ehconitin Mar 20, 2026
42cb345
chore: lint
ehconitin Mar 20, 2026
9d88056
Merge remote-tracking branch 'upstream/main' into command-menu-item-e…
ehconitin Mar 20, 2026
f09ef69
refactor: streamline command menu context API and display overflow
ehconitin Mar 20, 2026
6e36176
chore: lint
ehconitin Mar 20, 2026
c54e981
refactor: optimize search functionality in SidePanelCommandMenuItemEd…
ehconitin Mar 20, 2026
2c121b9
Merge remote-tracking branch 'upstream/main' into command-menu-item-e…
ehconitin Mar 20, 2026
7a9ab4f
revert: revert seed
ehconitin Mar 20, 2026
705b637
Merge remote-tracking branch 'origin/main' into command-menu-item-edi…
charlesBochet Mar 22, 2026
45d5c43
Merge remote-tracking branch 'origin/main' into command-menu-item-edi…
charlesBochet Mar 26, 2026
5b91ec9
fix: update useCommandMenuItemsFromBackend to use renamed components
charlesBochet Mar 26, 2026
b0ec972
refactor: rework command menu item edition per PR review
charlesBochet Mar 26, 2026
fa915a7
refactor: move AnimatedIconCrossfade to twenty-ui, decouple edition c…
charlesBochet Mar 26, 2026
6ef11ff
chore: remove descriptive comments from command menu item hooks
charlesBochet Mar 26, 2026
abb3c0b
chore: fix import ordering and remove unused lint suppression
charlesBochet Mar 26, 2026
063c83a
fix: rename serverCommandMenuItems to satisfy matching-state-variable…
charlesBochet Mar 26, 2026
546cd0c
refactor: simplify edition context API by removing preview mode indir…
charlesBochet Mar 26, 2026
815a451
refactor: remove objectMetadataItemId edition state, convert edition …
charlesBochet Mar 26, 2026
a81acfe
refactor: replace edition atoms with single selection mode state, rem…
charlesBochet Mar 26, 2026
252f3be
refactor: remove context API from edit page, wire selection mode to f…
charlesBochet Mar 26, 2026
8741f43
refactor: simplify useCommandMenuItemsDraftState for edit-only usage
charlesBochet Mar 26, 2026
6dac377
refactor: remove CommandMenuItemDraggable wrapper, extract shared filter
charlesBochet Mar 26, 2026
a1cd5a7
fix: inline pinned buttons now reflect draft during edit mode
charlesBochet Mar 26, 2026
b963176
fix: pinned buttons respect edit mode selection state
charlesBochet Mar 26, 2026
d380438
refactor: separate display and edit mode pinned button code paths
charlesBochet Mar 26, 2026
adc19c8
fix: interpolate shortLabel in edit mode pinned buttons and fix dropd…
charlesBochet Mar 26, 2026
010b198
refactor: rename matchesObjectMetadataId to doesCommandMenuItemMatchO…
charlesBochet Mar 26, 2026
fb555d0
chore: lower frontend coverage threshold for statements to 48.4%
charlesBochet Mar 26, 2026
612a797
fix: remove deleted command-menu barrel from twenty-shared individual…
charlesBochet Mar 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { styled } from '@linaria/react';
import { motion } from 'framer-motion';
import { useContext } from 'react';
import { type IconComponent } from 'twenty-ui/display';
import { ThemeContext } from 'twenty-ui/theme-constants';

const StyledContainer = styled.div<{ size: number }>`
height: ${({ size }) => size}px;
overflow: hidden;
position: relative;
width: ${({ size }) => size}px;
`;

const StyledLayer = styled(motion.div)`
align-items: center;
display: flex;
inset: 0;
justify-content: center;
position: absolute;
`;

type AnimatedIconCrossfadeProps = {
isActive: boolean;
ActiveIcon: IconComponent;
InactiveIcon: IconComponent;
size?: number;
};

export const AnimatedIconCrossfade = ({
isActive,
ActiveIcon,
InactiveIcon,
size,
}: AnimatedIconCrossfadeProps) => {
const { theme } = useContext(ThemeContext);

const iconSize = size ?? theme.icon.size.sm;

return (
<StyledContainer size={iconSize}>
<StyledLayer
initial={false}
animate={{
opacity: isActive ? 0 : 1,
scale: isActive ? 0.85 : 1,
}}
transition={{
duration: theme.animation.duration.fast,
ease: 'easeInOut',
}}
>
<InactiveIcon size={iconSize} />
</StyledLayer>
<StyledLayer
initial={false}
animate={{
opacity: isActive ? 1 : 0,
scale: isActive ? 1 : 0.85,
}}
transition={{
duration: theme.animation.duration.fast,
ease: 'easeInOut',
}}
>
<ActiveIcon size={iconSize} />
</StyledLayer>
</StyledContainer>
);
};
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { PageHeaderCommandMenuButtons } from '@/command-menu-item/components/PageHeaderCommandMenuButtons';
import { PinnedCommandMenuItemButtons } from '@/command-menu-item/server-items/display/components/PinnedCommandMenuItemButtons';
import { RecordIndexCommandMenuDropdown } from '@/command-menu-item/components/RecordIndexCommandMenuDropdown';
import { CommandMenuContextProvider } from '@/command-menu-item/contexts/CommandMenuContextProvider';
import { CommandMenuItemEditButton } from '@/command-menu-item/server-items/edit/components/CommandMenuItemEditButton';
import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId';
import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { FeatureFlagKey } from '~/generated-metadata/graphql';
import { useIsMobile } from 'twenty-ui/utilities';

export const RecordIndexCommandMenu = () => {
Expand All @@ -13,6 +17,9 @@ export const RecordIndexCommandMenu = () => {
);

const isMobile = useIsMobile();
const isCommandMenuItemEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_COMMAND_MENU_ITEM_ENABLED,
);

return (
<>
Expand All @@ -23,7 +30,12 @@ export const RecordIndexCommandMenu = () => {
displayType="button"
containerType="index-page-header"
>
{!isMobile && <PageHeaderCommandMenuButtons />}
{!isMobile &&
(isCommandMenuItemEnabled ? (
<PinnedCommandMenuItemButtons />
) : (
<PageHeaderCommandMenuButtons />
))}
</CommandMenuContextProvider>
<CommandMenuContextProvider
isInSidePanel={false}
Expand All @@ -32,6 +44,7 @@ export const RecordIndexCommandMenu = () => {
>
<RecordIndexCommandMenuDropdown />
</CommandMenuContextProvider>
<CommandMenuItemEditButton />
</>
)}
</>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { PageHeaderCommandMenuButtons } from '@/command-menu-item/components/PageHeaderCommandMenuButtons';
import { PinnedCommandMenuItemButtons } from '@/command-menu-item/server-items/display/components/PinnedCommandMenuItemButtons';
import { CommandMenuContextProvider } from '@/command-menu-item/contexts/CommandMenuContextProvider';
import { CommandMenuItemEditButton } from '@/command-menu-item/server-items/edit/components/CommandMenuItemEditButton';
import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId';
import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState';
import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { FeatureFlagKey } from '~/generated-metadata/graphql';
import { useIsMobile } from 'twenty-ui/utilities';

export const RecordShowCommandMenu = () => {
Expand All @@ -22,17 +26,28 @@ export const RecordShowCommandMenu = () => {
contextStoreTargetedRecordsRule.selectedRecordIds.length === 1;

const isMobile = useIsMobile();
const isCommandMenuItemEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_COMMAND_MENU_ITEM_ENABLED,
);

return (
<>
{hasSelectedRecord && contextStoreCurrentObjectMetadataItemId && (
<CommandMenuContextProvider
isInSidePanel={false}
displayType="button"
containerType="show-page-header"
>
{!isMobile && <PageHeaderCommandMenuButtons />}
</CommandMenuContextProvider>
<>
<CommandMenuContextProvider
isInSidePanel={false}
displayType="button"
containerType="show-page-header"
>
{!isMobile &&
(isCommandMenuItemEnabled ? (
<PinnedCommandMenuItemButtons />
) : (
<PageHeaderCommandMenuButtons />
))}
</CommandMenuContextProvider>
<CommandMenuItemEditButton />
</>
)}
</>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { type CommandMenuContextType } from '@/command-menu-item/contexts/CommandMenuContext';
import { CommandMenuContextProviderLegacy } from '@/command-menu-item/contexts/CommandMenuContextProviderLegacy';
import { CommandMenuContextProviderServerItems } from '@/command-menu-item/server-items/contexts/CommandMenuContextProviderServerItems';
import { CommandMenuContextProviderServerItems } from '@/command-menu-item/server-items/common/contexts/CommandMenuContextProviderServerItems';
import { type EnrichedObjectMetadataItem } from '@/object-metadata/types/EnrichedObjectMetadataItem';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { FeatureFlagKey } from '~/generated-metadata/graphql';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { CoreObjectNameSingular } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';

import { useCommandMenuContextApi } from '@/command-menu-item/server-items/hooks/useCommandMenuContextApi';
import { type CommandMenuContextType } from '@/command-menu-item/contexts/CommandMenuContext';
import { useCommandMenuContextApi } from '@/command-menu-item/server-items/common/hooks/useCommandMenuContextApi';

import { CommandMenuContextProviderServerItemsContent } from './CommandMenuContextProviderServerItemsContent';
import { CommandMenuContextProviderServerItemsWithWorkflowEnrichment } from './CommandMenuContextProviderServerItemsWithWorkflowEnrichment';
Expand All @@ -20,7 +20,9 @@ export const CommandMenuContextProviderServerItems = ({
containerType,
children,
}: CommandMenuContextProviderServerItemsProps) => {
const commandMenuContextApi = useCommandMenuContextApi();
const commandMenuContextApi = useCommandMenuContextApi({
isInSidePanel,
});

const currentObjectNameSingular =
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The code unconditionally accesses .nameSingular on objectMetadataItem, which can be undefined, causing a crash if no matching object metadata item is found.
Severity: CRITICAL

Suggested Fix

Add a null check before accessing commandMenuContextApi.objectMetadataItem.nameSingular. You can use optional chaining (?.) to safely access the property, preventing the crash when objectMetadataItem is undefined.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent.
Verify if this is a real issue. If it is, propose a fix; if not, explain why it's not
valid.

Location:
packages/twenty-front/src/modules/command-menu-item/server-items/common/contexts/CommandMenuContextProviderServerItems.tsx#L27

Potential issue: In `CommandMenuContextProviderServerItems`, the code unconditionally
accesses the `nameSingular` property on `commandMenuContextApi.objectMetadataItem`.
However, `objectMetadataItem` is the result of an `Array.prototype.find()` call in
`useCommandMenuContextApi`, which can return `undefined` if no matching item is found.
This occurs if `effectiveContextStoreCurrentObjectMetadataItemId` does not correspond to
any item in `objectMetadataItems`, for instance, if the main context store is not yet
populated. This will lead to a "Cannot read property 'nameSingular' of undefined"
TypeError, causing a crash.

commandMenuContextApi.objectMetadataItem.nameSingular;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import {
CommandMenuContext,
type CommandMenuContextType,
} from '@/command-menu-item/contexts/CommandMenuContext';
import { useCommandMenuItemsFromBackend } from '@/command-menu-item/server-items/hooks/useCommandMenuItemsFromBackend';
import { useCommandMenuItemsFromBackend } from '@/command-menu-item/server-items/common/hooks/useCommandMenuItemsFromBackend';
import { type CommandMenuContextApi } from 'twenty-shared/types';

type CommandMenuContextProviderServerItemsContentProps = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { type CommandMenuContextApi } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';

import { type CommandMenuContextType } from '@/command-menu-item/contexts/CommandMenuContext';
import { useWorkflowsWithCurrentVersions } from '@/command-menu-item/server-items/hooks/useWorkflowsWithCurrentVersions';
import { useWorkflowsWithCurrentVersions } from '@/command-menu-item/server-items/common/hooks/useWorkflowsWithCurrentVersions';

import { CommandMenuContextProviderServerItemsContent } from './CommandMenuContextProviderServerItemsContent';

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { COMMAND_MENU_ITEM_FRAGMENT } from '@/command-menu-item/graphql/fragments/commandMenuItemFragment';
import { gql } from '@apollo/client';

export const UPDATE_COMMAND_MENU_ITEM = gql`
${COMMAND_MENU_ITEM_FRAGMENT}
mutation UpdateCommandMenuItem($input: UpdateCommandMenuItemInput!) {
updateCommandMenuItem(input: $input) {
...CommandMenuItemFields
}
}
`;
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { objectPermissionsFamilySelector } from '@/auth/states/objectPermissionsFamilySelector';
import { CommandMenuContext } from '@/command-menu-item/contexts/CommandMenuContext';
import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId';
import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState';
import { contextStoreCurrentViewTypeComponentState } from '@/context-store/states/contextStoreCurrentViewTypeComponentState';
import { contextStoreIsPageInEditModeComponentState } from '@/context-store/states/contextStoreIsPageInEditModeComponentState';
Expand All @@ -13,24 +13,28 @@ import { useObjectPermissionsForObject } from '@/object-record/hooks/useObjectPe
import { hasAnySoftDeleteFilterOnViewComponentSelector } from '@/object-record/record-filter/states/hasAnySoftDeleteFilterOnView';
import { useRecordIndexIdFromCurrentContextStore } from '@/object-record/record-index/hooks/useRecordIndexIdFromCurrentContextStore';
import { recordStoreRecordsSelector } from '@/object-record/record-store/states/selectors/recordStoreRecordsSelector';
import { sidePanelPageState } from '@/side-panel/states/sidePanelPageState';
import { useAtomComponentSelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentSelectorValue';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { isNonEmptyArray } from '@sniptt/guards';
import { useStore } from 'jotai';
import { useContext } from 'react';
import { useAtomValue, useStore } from 'jotai';
import {
CommandMenuContextApiPageType,
SidePanelPages,
type CommandMenuContextApi,
} from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';

export const useCommandMenuContextApi = (): CommandMenuContextApi => {
// Display-only hook. For the edit page, use useCommandMenuContextApiForEdition.
export const useCommandMenuContextApi = ({
isInSidePanel,
}: {
isInSidePanel: boolean;
}): CommandMenuContextApi => {
const store = useStore();

const { isInSidePanel } = useContext(CommandMenuContext);

const contextStoreCurrentObjectMetadataItemId = useAtomComponentStateValue(
contextStoreCurrentObjectMetadataItemIdComponentState,
);
Expand All @@ -39,32 +43,70 @@ export const useCommandMenuContextApi = (): CommandMenuContextApi => {
contextStoreTargetedRecordsRuleComponentState,
);

const contextStoreNumberOfSelectedRecords = useAtomComponentStateValue(
contextStoreNumberOfSelectedRecordsComponentState,
);

const mainContextStoreTargetedRecordsRule = useAtomValue(
contextStoreTargetedRecordsRuleComponentState.atomFamily({
instanceId: MAIN_CONTEXT_STORE_INSTANCE_ID,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure about this, why are we reading from main context store? If this is for edition purposes, I think I would prefer a separate code patch (hooks here). Let's avoid mixing things together too much. Here we likely need, useCommandMenuContextApiForEdition

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actually I'm confused if we need this, I see that we are copying the main context store into an instance id below in the code. We should do one or the other, not both

}),
);

const mainContextStoreNumberOfSelectedRecords = useAtomValue(
contextStoreNumberOfSelectedRecordsComponentState.atomFamily({
instanceId: MAIN_CONTEXT_STORE_INSTANCE_ID,
}),
);

const mainContextStoreCurrentObjectMetadataItemId = useAtomValue(
contextStoreCurrentObjectMetadataItemIdComponentState.atomFamily({
instanceId: MAIN_CONTEXT_STORE_INSTANCE_ID,
}),
);

const { objectMetadataItems } = useObjectMetadataItems();

const sidePanelPage = useAtomStateValue(sidePanelPageState);

const shouldUseMainContext =
isInSidePanel &&
(sidePanelPage === SidePanelPages.CommandMenuDisplay ||
sidePanelPage === SidePanelPages.CommandMenuEdit);

const effectiveObjectMetadataItemId = shouldUseMainContext
? mainContextStoreCurrentObjectMetadataItemId
: contextStoreCurrentObjectMetadataItemId;

const effectiveTargetedRecordsRule = shouldUseMainContext
? mainContextStoreTargetedRecordsRule
: contextStoreTargetedRecordsRule;

const effectiveNumberOfSelectedRecords = shouldUseMainContext
? mainContextStoreNumberOfSelectedRecords
: contextStoreNumberOfSelectedRecords;

const objectMetadataItem = objectMetadataItems.find(
(item) => item.id === contextStoreCurrentObjectMetadataItemId,
(item) => item.id === effectiveObjectMetadataItemId,
);

const { navigationMenuItems } = useNavigationMenuItemsData();

const recordIds =
contextStoreTargetedRecordsRule.mode === 'selection'
? contextStoreTargetedRecordsRule.selectedRecordIds
effectiveTargetedRecordsRule.mode === 'selection'
? effectiveTargetedRecordsRule.selectedRecordIds
: undefined;

const favoriteRecordIds = (() => {
if (!isNonEmptyArray(recordIds) || !isDefined(objectMetadataItem)) {
return [];
}

return recordIds.filter((recordId) =>
navigationMenuItems?.some(
(item) =>
item.targetRecordId === recordId &&
item.targetObjectMetadataId === objectMetadataItem.id,
),
);
})();
const favoriteRecordIds =
!isNonEmptyArray(recordIds) || !isDefined(objectMetadataItem)
? []
: recordIds.filter((recordId) =>
navigationMenuItems?.some(
(item) =>
item.targetRecordId === recordId &&
item.targetObjectMetadataId === objectMetadataItem.id,
),
);

const selectedRecords = useAtomFamilySelectorValue(
recordStoreRecordsSelector,
Expand Down Expand Up @@ -107,11 +149,7 @@ export const useCommandMenuContextApi = (): CommandMenuContextApi => {
? CommandMenuContextApiPageType.RECORD_PAGE
: CommandMenuContextApiPageType.INDEX_PAGE;

const contextStoreNumberOfSelectedRecords = useAtomComponentStateValue(
contextStoreNumberOfSelectedRecordsComponentState,
);

const isSelectAll = contextStoreTargetedRecordsRule.mode === 'exclusion';
const isSelectAll = effectiveTargetedRecordsRule.mode === 'exclusion';

const currentWorkspace = useAtomStateValue(currentWorkspaceState);

Expand Down Expand Up @@ -143,7 +181,7 @@ export const useCommandMenuContextApi = (): CommandMenuContextApi => {
favoriteRecordIds,
isSelectAll,
hasAnySoftDeleteFilterOnView,
numberOfSelectedRecords: contextStoreNumberOfSelectedRecords,
numberOfSelectedRecords: effectiveNumberOfSelectedRecords,
objectPermissions,
selectedRecords,
featureFlags,
Expand Down
Loading
Loading