@@ -874,7 +963,7 @@ function SessionNodeItemComponent(props: Props): React.ReactNode {
@@ -963,7 +1052,7 @@ function SessionNodeItemComponent(props: Props): React.ReactNode {
-
+
+ {contextMenuContent}
+
{hasChildren && isExpanded
? node.children.map((child) => renderSessionNode(child, depth + 1, sessionDirectory ?? groupDirectory, projectId, archivedBucket, undefined, renderContext))
diff --git a/packages/ui/src/components/session/sidebar/sortableItems.tsx b/packages/ui/src/components/session/sidebar/sortableItems.tsx
index 7ea4b9be..797e15da 100644
--- a/packages/ui/src/components/session/sidebar/sortableItems.tsx
+++ b/packages/ui/src/components/session/sidebar/sortableItems.tsx
@@ -7,6 +7,7 @@ import {
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
+import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger } from '@/components/ui/context-menu';
import { Tooltip, TooltipTrigger, TooltipContent } from '@/components/ui/tooltip';
import { Icon } from "@/components/icon/Icon";
import { cn } from '@/lib/utils';
@@ -89,14 +90,35 @@ export const SortableProjectItem: React.FC
= ({
const suppressNextToggleRef = React.useRef(false);
const menuInstanceKey = `project:${id}`;
const isMenuOpen = openSidebarMenuKey === menuInstanceKey;
+ const [isContextMenuOpen, setIsContextMenuOpen] = React.useState(false);
const projectIconName = projectIcon ? PROJECT_ICON_MAP[projectIcon] : null;
const iconColor = projectColor ? (PROJECT_COLOR_MAP[projectColor] ?? null) : null;
const handleMenuOpenChange = React.useCallback((open: boolean) => {
+ if (open) setIsContextMenuOpen(false);
setOpenSidebarMenuKey(open ? menuInstanceKey : null);
}, [menuInstanceKey, setOpenSidebarMenuKey]);
+ const renderProjectMenuItems = (Item: React.ElementType) => (
+ <>
+ {showCreateButtons && !isRepo && !hideDirectoryControls && onNewSession && (
+ -
+
+ {t('sessions.sidebar.project.actions.newSession')}
+
+ )}
+ -
+
+ {t('sessions.sidebar.session.menu.rename')}
+
+ -
+
+ {t('sessions.sidebar.project.actions.closeProject')}
+
+ >
+ );
+
const handleMenuTriggerClick = React.useCallback((event: React.MouseEvent) => {
event.stopPropagation();
}, []);
@@ -140,12 +162,19 @@ export const SortableProjectItem: React.FC = ({
/>
)}
-
+
+ {
+ event.preventDefault();
+ setIsContextMenuOpen(true);
+ }}
+ />
+ }
+ >
@@ -261,23 +290,7 @@ export const SortableProjectItem: React.FC = ({
- {showCreateButtons && !isRepo && !hideDirectoryControls && onNewSession && (
-
-
- {t('sessions.sidebar.project.actions.newSession')}
-
- )}
-
-
- {t('sessions.sidebar.session.menu.rename')}
-
-
-
- {t('sessions.sidebar.project.actions.closeProject')}
-
+ {renderProjectMenuItems(DropdownMenuItem)}
@@ -312,7 +325,11 @@ export const SortableProjectItem: React.FC = ({
) : null}
-