From 3d49c21b516b8f18b5c424a5be9cb74d06e0f31b Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Fri, 20 Mar 2026 17:08:26 +0100 Subject: [PATCH] fix: decouple viewPicker favorite detection from sorted navigation menu items (#18803) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Reverts the `useSortedNavigationMenuItems` coupling in `ViewPickerOptionDropdown` introduced by #18791 - The viewPicker now uses `useNavigationMenuItemsData` directly for the `isFavorite` check, keeping view ordering and navigation menu item ordering independent ## Why PR #18791 replaced `useNavigationMenuItemsData` with `useSortedNavigationMenuItems` in the viewPicker for favorite detection. While the intent was to filter out stale/orphaned navigation items, this created an unnecessary coupling: `useSortedNavigationMenuItems` subscribes to `viewsSelector` and `objectMetadataItemsSelector`, making the viewPicker transitively dependent on the navigation menu item ordering system. View ordering in the picker (driven by `view.position`) and navigation menu item ordering (driven by `navigationMenuItem.position`) should remain decorrelated. ## Test plan - [ ] Open the viewPicker dropdown and verify views are listed in correct order - [ ] Drag-and-drop to reorder views in the viewPicker — confirm it works - [ ] Verify the "Add to Favorite" / "Manage favorite" label still correctly reflects favorite state - [ ] Reorder navigation menu items in the sidebar — confirm viewPicker order is unaffected Made with [Cursor](https://cursor.com) --- .../view-picker/components/ViewPickerOptionDropdown.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerOptionDropdown.tsx b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerOptionDropdown.tsx index 9de0300bbb..961d12a4d6 100644 --- a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerOptionDropdown.tsx +++ b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerOptionDropdown.tsx @@ -1,6 +1,5 @@ import { useCreateNavigationMenuItem } from '@/navigation-menu-item/common/hooks/useCreateNavigationMenuItem'; import { useNavigationMenuItemsData } from '@/navigation-menu-item/display/hooks/useNavigationMenuItemsData'; -import { useSortedNavigationMenuItems } from '@/navigation-menu-item/display/hooks/useSortedNavigationMenuItems'; import { type ObjectRecord } from '@/object-record/types/ObjectRecord'; import { useHasPermissionFlag } from '@/settings/roles/hooks/useHasPermissionFlag'; import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent'; @@ -55,15 +54,15 @@ export const ViewPickerOptionDropdown = ({ const hasViewsPermission = useHasPermissionFlag(PermissionFlagType.VIEWS); const { createNavigationMenuItem } = useCreateNavigationMenuItem(); - const { currentWorkspaceMemberId } = useNavigationMenuItemsData(); - const { navigationMenuItemsSorted } = useSortedNavigationMenuItems(); + const { navigationMenuItems, currentWorkspaceMemberId } = + useNavigationMenuItemsData(); // Users with VIEWS permission can edit all views // Users without VIEWS permission can only edit unlisted views (which are always their own, filtered by backend) const canEditView = hasViewsPermission || view.visibility === ViewVisibility.UNLISTED; - const isFavorite = navigationMenuItemsSorted.some( + const isFavorite = navigationMenuItems.some( (item) => item.viewId === view.id && item.userWorkspaceId === currentWorkspaceMemberId,