From b667b02b79826b4112f631743169a5378b3d8905 Mon Sep 17 00:00:00 2001 From: clawdbot Date: Wed, 28 Jan 2026 05:15:37 +0800 Subject: [PATCH] feat: improve goView import and context menu selection --- packages/editor/src/editor/ContextMenu.tsx | 24 ++++++++++++++++++++++ packages/editor/src/editor/EditorApp.tsx | 1 + packages/sdk/src/core/goview/convert.ts | 11 ++++++++++ 3 files changed, 36 insertions(+) diff --git a/packages/editor/src/editor/ContextMenu.tsx b/packages/editor/src/editor/ContextMenu.tsx index 8bee67b..7a41f47 100644 --- a/packages/editor/src/editor/ContextMenu.tsx +++ b/packages/editor/src/editor/ContextMenu.tsx @@ -16,6 +16,7 @@ export function ContextMenu(props: { selectionAllHidden: boolean; onClose: () => void; onAddTextAt: (x: number, y: number) => void; + onSelectSingle?: (id?: string) => void; onDuplicateSelected?: () => void; onToggleLockSelected?: () => void; onToggleHideSelected?: () => void; @@ -83,6 +84,9 @@ export function ContextMenu(props: { if (!ctx || !position) return null; const hasSelection = props.selectionIds.length > 0; + const hasTarget = !!ctx.targetId; + const targetInSelection = !!ctx.targetId && props.selectionIds.includes(ctx.targetId); + const canSelectSingle = !!props.onSelectSingle; return (
+ {canSelectSingle && hasTarget && targetInSelection && props.selectionIds.length > 1 ? ( + { + props.onSelectSingle?.(ctx.targetId); + onClose(); + }} + /> + ) : null} + + {canSelectSingle && !hasTarget && hasSelection ? ( + { + props.onSelectSingle?.(undefined); + onClose(); + }} + /> + ) : null} +
dispatch({ type: 'addTextAt', x, y })} + onSelectSingle={(id) => dispatch({ type: 'selectSingle', id })} onDuplicateSelected={() => dispatch({ type: 'duplicateSelected' })} onToggleLockSelected={() => dispatch({ type: 'toggleLockSelected' })} onToggleHideSelected={() => dispatch({ type: 'toggleHideSelected' })} diff --git a/packages/sdk/src/core/goview/convert.ts b/packages/sdk/src/core/goview/convert.ts index 8b6a2a7..022d56d 100644 --- a/packages/sdk/src/core/goview/convert.ts +++ b/packages/sdk/src/core/goview/convert.ts @@ -115,12 +115,18 @@ function isIframe(c: GoViewComponentLike): boolean { if (k === 'iframe' || k.includes('iframe')) return true; // Other names seen in low-code editors for embedded web content. + // Keep this fairly conservative; video/image are handled separately. return ( k.includes('embed') || k.includes('webview') || k.includes('html') || k.includes('browser') || k.includes('webpage') || + k.includes('website') || + // Chinese low-code widgets sometimes call this H5. + k === 'h5' || + k.includes('h5_') || + k.includes('_h5') || // keep the plain 'web' check last; it's broad and may overlap other widgets. k === 'web' || k.endsWith('_web') || @@ -149,6 +155,11 @@ function isVideo(c: GoViewComponentLike): boolean { k.includes('mp4') || k.includes('media') || k.includes('player') || + // player implementation names frequently used in low-code widgets + k.includes('flvjs') || + k.includes('hlsjs') || + k.includes('dplayer') || + k.includes('vlc') || k.includes('stream') || k.includes('rtsp') || k.includes('rtmp') ||