Skip to content

Commit f753565

Browse files
committed
fix: Allow users to right-click elements in the layers panel and open code
Fixes #2575 Signed-off-by: Aritra Dey <[email protected]>
1 parent b90dacd commit f753565

File tree

2 files changed

+58
-15
lines changed

2 files changed

+58
-15
lines changed

CONTRIBUTING.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ https://docs.onlook.com/contributing/developers
77

88
To get set up and run Onlook locally, see here:
99
https://docs.onlook.com/contributing/developers/running-locally
10+

apps/web/client/src/app/project/[id]/_components/left-panel/layers-tab/tree/tree-node.tsx

Lines changed: 57 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
import { useEditorEngine } from '@/components/store/editor';
2-
import { MouseAction } from '@onlook/models/editor';
2+
import { MouseAction, EditorTabValue } from '@onlook/models/editor';
33
import type { DomElement, LayerNode } from '@onlook/models/element';
4+
import {
5+
ContextMenu,
6+
ContextMenuContent,
7+
ContextMenuItem,
8+
ContextMenuTrigger,
9+
} from '@onlook/ui/context-menu';
410
import { Icons } from '@onlook/ui/icons';
511
import { Tooltip, TooltipContent, TooltipPortal, TooltipTrigger } from '@onlook/ui/tooltip';
612
import { cn } from '@onlook/ui/utils';
@@ -252,17 +258,36 @@ export const TreeNode = memo(
252258
);
253259
}
254260

261+
function viewSource(oid: string | null) {
262+
if (!oid) {
263+
console.error('No oid found');
264+
return;
265+
}
266+
editorEngine.code.viewCodeBlock(oid);
267+
}
268+
269+
const menuItems = [
270+
{
271+
label: 'View Code',
272+
action: () => viewSource(node.data.oid),
273+
icon: <Icons.ExternalLink className="mr-2 h-4 w-4" />,
274+
disabled: !node.data.oid || isWindow,
275+
},
276+
];
277+
255278
return (
256-
<Tooltip>
257-
<TooltipTrigger asChild>
258-
<div ref={nodeRef}>
259-
<div
260-
ref={dragHandle}
261-
style={style}
262-
onMouseDown={(e) => handleSelectNode(e)}
263-
onMouseOver={(e) => handleHoverNode(e)}
264-
className={nodeClassName}
265-
>
279+
<ContextMenu>
280+
<ContextMenuTrigger asChild>
281+
<Tooltip>
282+
<TooltipTrigger asChild>
283+
<div ref={nodeRef}>
284+
<div
285+
ref={dragHandle}
286+
style={style}
287+
onMouseDown={(e) => handleSelectNode(e)}
288+
onMouseOver={(e) => handleHoverNode(e)}
289+
className={nodeClassName}
290+
>
266291
<span className="w-4 h-4 flex-none relative">
267292
{!node.isLeaf && (
268293
<div
@@ -358,9 +383,9 @@ export const TreeNode = memo(
358383
onClick={toggleVisibility}
359384
/>
360385
)}
361-
</div>
362-
</div>
363-
</TooltipTrigger>
386+
</div>
387+
</div>
388+
</TooltipTrigger>
364389
{node.data.textContent !== '' && (
365390
<TooltipPortal container={document.getElementById('style-panel')}>
366391
<TooltipContent
@@ -374,7 +399,24 @@ export const TreeNode = memo(
374399
</TooltipPortal>
375400
)}
376401
</Tooltip>
377-
);
402+
</ContextMenuTrigger>
403+
<ContextMenuContent>
404+
{menuItems.map((item) => (
405+
<ContextMenuItem
406+
key={item.label}
407+
onClick={item.action}
408+
className="cursor-pointer"
409+
disabled={item.disabled}
410+
>
411+
<span className={cn('flex w-full items-center gap-1')}>
412+
{item.icon}
413+
{item.label}
414+
</span>
415+
</ContextMenuItem>
416+
))}
417+
</ContextMenuContent>
418+
</ContextMenu>
419+
);
378420
},
379421
),
380422
);

0 commit comments

Comments
 (0)