From 36c7c99e34e170d78685f3d66095d016927783c9 Mon Sep 17 00:00:00 2001 From: Abdul Rahman <81605929+abdulrahmancodes@users.noreply.github.com> Date: Thu, 26 Mar 2026 18:43:49 +0530 Subject: [PATCH] fix: hide objects with no addable views in sidebar view picker (#18993) Co-authored-by: Charles Bochet --- .../display/components/NavigationMenuItemIcon.tsx | 11 ++++------- .../components/NavigationMenuItemFolderSubItem.tsx | 8 +------- .../NavigationDrawerItemForObjectMetadataItem.tsx | 12 ++++-------- ...idePanelNewSidebarItemViewObjectPickerSubPage.tsx | 12 ++++++------ .../SidePanelNewSidebarItemViewPickerSubView.tsx | 8 ++------ .../utils/isViewDisplayableInNavigationMenu.ts | 7 +++++++ 6 files changed, 24 insertions(+), 34 deletions(-) create mode 100644 packages/twenty-front/src/modules/navigation-menu-item/edit/side-panel/utils/isViewDisplayableInNavigationMenu.ts diff --git a/packages/twenty-front/src/modules/navigation-menu-item/display/components/NavigationMenuItemIcon.tsx b/packages/twenty-front/src/modules/navigation-menu-item/display/components/NavigationMenuItemIcon.tsx index caef55c0bb..95b257b555 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/display/components/NavigationMenuItemIcon.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/display/components/NavigationMenuItemIcon.tsx @@ -17,7 +17,6 @@ import { useGetStandardObjectIcon } from '@/object-metadata/hooks/useGetStandard import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector'; import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; import { viewsSelector } from '@/views/states/selectors/viewsSelector'; -import { ViewKey } from '@/views/types/ViewKey'; export const NavigationMenuItemIcon = ({ navigationMenuItem, @@ -43,11 +42,6 @@ export const NavigationMenuItemIcon = ({ const view = isDefined(navigationMenuItem.viewId) ? views.find((view) => view.id === navigationMenuItem.viewId) : undefined; - const isViewWithOverlay = - navigationMenuItem.type === NavigationMenuItemType.VIEW && - isDefined(view) && - view.key !== ViewKey.INDEX; - const objectMetadataItem = objectMetadataItems.find( (item) => item.nameSingular === objectNameSingular, ); @@ -57,7 +51,10 @@ export const NavigationMenuItemIcon = ({ : StandardIcon; const canShowViewOverlay = - isViewWithOverlay && isDefined(objectIconForView) && isDefined(view?.icon); + navigationMenuItem.type === NavigationMenuItemType.VIEW && + isDefined(view) && + isDefined(objectIconForView) && + isDefined(view?.icon); if (canShowViewOverlay) { return ( diff --git a/packages/twenty-front/src/modules/navigation-menu-item/display/folder/components/NavigationMenuItemFolderSubItem.tsx b/packages/twenty-front/src/modules/navigation-menu-item/display/folder/components/NavigationMenuItemFolderSubItem.tsx index 09f226be77..67f7c4cb8e 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/display/folder/components/NavigationMenuItemFolderSubItem.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/display/folder/components/NavigationMenuItemFolderSubItem.tsx @@ -17,7 +17,6 @@ import { NavigationDrawerSubItem } from '@/ui/navigation/navigation-drawer/compo import { getNavigationSubItemLeftAdornment } from '@/ui/navigation/navigation-drawer/utils/getNavigationSubItemLeftAdornment'; import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; import { viewsSelector } from '@/views/states/selectors/viewsSelector'; -import { ViewKey } from '@/views/types/ViewKey'; type NavigationMenuItemFolderSubItemProps = { navigationMenuItem: NavigationMenuItem; @@ -64,11 +63,6 @@ export const NavigationMenuItemFolderSubItem = ({ views, ); - const view = isDefined(navigationMenuItem.viewId) - ? views.find((viewItem) => viewItem.id === navigationMenuItem.viewId) - : undefined; - const isIndexView = view?.key === ViewKey.INDEX; - const objectMetadataItem = navigationMenuItem.type === NavigationMenuItemType.OBJECT || navigationMenuItem.type === NavigationMenuItemType.VIEW || @@ -98,7 +92,7 @@ export const NavigationMenuItemFolderSubItem = ({ return ( view.id === navigationMenuItem!.viewId) : undefined; - const viewKey = view?.key ?? null; - - const isViewWithCustomName = - isView && viewKey !== ViewKey.INDEX && isDefined(view); + const isViewWithResolvedView = isView && isDefined(view); const itemLabel = isDefined(navigationMenuItem) ? getNavigationMenuItemLabel(navigationMenuItem, objectMetadataItems, views) @@ -113,7 +109,7 @@ export const NavigationDrawerItemForObjectMetadataItem = ({ const label = isRecord ? itemLabel - : isViewWithCustomName + : isViewWithResolvedView ? itemLabel : objectMetadataItem.labelPlural; @@ -138,7 +134,7 @@ export const NavigationDrawerItemForObjectMetadataItem = ({ placeholder={itemLabel} /> ) - : isViewWithCustomName && isDefined(view?.icon) + : isViewWithResolvedView && isDefined(view?.icon) ? () => ( { @@ -24,14 +23,15 @@ export const SidePanelNewSidebarItemViewObjectPickerSubPage = () => { const { objectMetadataItems } = useObjectMetadataItems(); const { activeNonSystemObjectMetadataItems } = useFilteredObjectMetadataItems(); - const { views, objectMetadataIdsWithIndexView } = + const { views, objectMetadataIdsWithIndexView, viewIdsInWorkspace } = useNavigationMenuObjectMetadataFromDraft(currentDraft); const objectMetadataIdsWithDisplayableViews = new Set( views .filter( (view) => - view.key !== ViewKey.INDEX && view.type !== ViewType.FIELDS_WIDGET, + isViewDisplayableInNavigationMenu(view) && + !viewIdsInWorkspace.has(view.id), ) .map((view) => view.objectMetadataId), ); diff --git a/packages/twenty-front/src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemViewPickerSubView.tsx b/packages/twenty-front/src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemViewPickerSubView.tsx index 1c6011fbec..1024815ab1 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemViewPickerSubView.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemViewPickerSubView.tsx @@ -4,6 +4,7 @@ import { useAddViewToNavigationMenuDraft } from '@/navigation-menu-item/edit/vie import { useDraftNavigationMenuItems } from '@/navigation-menu-item/edit/hooks/useDraftNavigationMenuItems'; import { useNavigationMenuObjectMetadataFromDraft } from '@/navigation-menu-item/edit/hooks/useNavigationMenuObjectMetadataFromDraft'; import { useOpenNavigationMenuItemInSidePanel } from '@/navigation-menu-item/edit/hooks/useOpenNavigationMenuItemInSidePanel'; +import { isViewDisplayableInNavigationMenu } from '@/navigation-menu-item/edit/side-panel/utils/isViewDisplayableInNavigationMenu'; import { pendingInsertionNavigationMenuItemState } from '@/navigation-menu-item/common/states/pendingInsertionNavigationMenuItemState'; import { getObjectColorWithFallback } from '@/object-metadata/utils/getObjectColorWithFallback'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; @@ -16,13 +17,10 @@ import { useSidePanelFilteredPickerItems } from '@/side-panel/hooks/useSidePanel import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem'; import { useAtomState } from '@/ui/utilities/state/jotai/hooks/useAtomState'; import { type View } from '@/views/types/View'; -import { ViewKey } from '@/views/types/ViewKey'; -import { ViewType } from '@/views/types/ViewType'; import { useLingui } from '@lingui/react/macro'; import { useState } from 'react'; import { isDefined } from 'twenty-shared/utils'; import { useIcons } from 'twenty-ui/display'; -import { ViewVisibility } from '~/generated-metadata/graphql'; type SidePanelNewSidebarItemViewPickerSubViewProps = { selectedObjectMetadataIdForView: string; @@ -49,9 +47,7 @@ export const SidePanelNewSidebarItemViewPickerSubView = ({ .filter( (view) => view.objectMetadataId === selectedObjectMetadataIdForView && - view.key !== ViewKey.INDEX && - view.type !== ViewType.FIELDS_WIDGET && - view.visibility === ViewVisibility.WORKSPACE, + isViewDisplayableInNavigationMenu(view), ) .sort((a, b) => a.position - b.position); diff --git a/packages/twenty-front/src/modules/navigation-menu-item/edit/side-panel/utils/isViewDisplayableInNavigationMenu.ts b/packages/twenty-front/src/modules/navigation-menu-item/edit/side-panel/utils/isViewDisplayableInNavigationMenu.ts new file mode 100644 index 0000000000..92653e1a32 --- /dev/null +++ b/packages/twenty-front/src/modules/navigation-menu-item/edit/side-panel/utils/isViewDisplayableInNavigationMenu.ts @@ -0,0 +1,7 @@ +import { type View } from '@/views/types/View'; +import { ViewType } from '@/views/types/ViewType'; +import { ViewVisibility } from '~/generated-metadata/graphql'; + +export const isViewDisplayableInNavigationMenu = (view: View): boolean => + view.type !== ViewType.FIELDS_WIDGET && + view.visibility === ViewVisibility.WORKSPACE;