Batch create, update, and delete navigation menu items (#18882)

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Abdul Rahman
2026-03-25 01:54:47 +05:30
committed by GitHub
parent 0af7760441
commit 37640521d5
48 changed files with 2175 additions and 565 deletions
@@ -1,7 +1,11 @@
import { NavigationMenuItemType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { v4 as uuidv4 } from 'uuid';
import { HeadlessEngineCommandWrapperEffect } from '@/command-menu-item/engine-command/components/HeadlessEngineCommandWrapperEffect';
import { useHeadlessCommandContextApi } from '@/command-menu-item/engine-command/hooks/useHeadlessCommandContextApi';
import { useCreateNavigationMenuItem } from '@/navigation-menu-item/common/hooks/useCreateNavigationMenuItem';
import { isDefined } from 'twenty-shared/utils';
import { useCreateManyNavigationMenuItems } from '@/navigation-menu-item/common/hooks/useCreateManyNavigationMenuItems';
import { useNavigationMenuItemsData } from '@/navigation-menu-item/display/hooks/useNavigationMenuItemsData';
export const AddToFavoritesSingleRecordCommand = () => {
const { objectMetadataItem, selectedRecords } =
@@ -13,14 +17,34 @@ export const AddToFavoritesSingleRecordCommand = () => {
throw new Error('Object metadata item is required to add to favorites');
}
const { createNavigationMenuItem } = useCreateNavigationMenuItem();
const { createManyNavigationMenuItems } = useCreateManyNavigationMenuItems();
const { navigationMenuItems, currentWorkspaceMemberId } =
useNavigationMenuItemsData();
const handleExecute = () => {
if (!isDefined(selectedRecord)) {
return;
}
createNavigationMenuItem(selectedRecord, objectMetadataItem.nameSingular);
const relevantItems = navigationMenuItems.filter(
(item) => !isDefined(item.folderId) && isDefined(item.userWorkspaceId),
);
const maxPosition = Math.max(
...relevantItems.map((item) => item.position),
0,
);
createManyNavigationMenuItems([
{
id: uuidv4(),
type: NavigationMenuItemType.RECORD,
targetRecordId: selectedRecord.id,
targetObjectMetadataId: objectMetadataItem.id,
userWorkspaceId: currentWorkspaceMemberId,
position: maxPosition + 1,
},
]);
};
return <HeadlessEngineCommandWrapperEffect execute={handleExecute} />;
@@ -1,8 +1,9 @@
import { isDefined } from 'twenty-shared/utils';
import { HeadlessEngineCommandWrapperEffect } from '@/command-menu-item/engine-command/components/HeadlessEngineCommandWrapperEffect';
import { useHeadlessCommandContextApi } from '@/command-menu-item/engine-command/hooks/useHeadlessCommandContextApi';
import { useDeleteNavigationMenuItem } from '@/navigation-menu-item/common/hooks/useDeleteNavigationMenuItem';
import { useDeleteManyNavigationMenuItems } from '@/navigation-menu-item/common/hooks/useDeleteManyNavigationMenuItems';
import { useNavigationMenuItemsData } from '@/navigation-menu-item/display/hooks/useNavigationMenuItemsData';
import { isDefined } from 'twenty-shared/utils';
export const RemoveFromFavoritesSingleRecordCommand = () => {
const { selectedRecords, objectMetadataItem } =
@@ -19,7 +20,7 @@ export const RemoveFromFavoritesSingleRecordCommand = () => {
const { navigationMenuItems, workspaceNavigationMenuItems } =
useNavigationMenuItemsData();
const { deleteNavigationMenuItem } = useDeleteNavigationMenuItem();
const { deleteManyNavigationMenuItems } = useDeleteManyNavigationMenuItems();
const foundNavigationMenuItem = [
...navigationMenuItems,
@@ -35,7 +36,7 @@ export const RemoveFromFavoritesSingleRecordCommand = () => {
return;
}
deleteNavigationMenuItem(foundNavigationMenuItem.id);
deleteManyNavigationMenuItems([foundNavigationMenuItem.id]);
};
return <HeadlessEngineCommandWrapperEffect execute={handleExecute} />;