feat: improve goView import and context menu selection
This commit is contained in:
parent
3dfb548c11
commit
b667b02b79
@ -16,6 +16,7 @@ export function ContextMenu(props: {
|
|||||||
selectionAllHidden: boolean;
|
selectionAllHidden: boolean;
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
onAddTextAt: (x: number, y: number) => void;
|
onAddTextAt: (x: number, y: number) => void;
|
||||||
|
onSelectSingle?: (id?: string) => void;
|
||||||
onDuplicateSelected?: () => void;
|
onDuplicateSelected?: () => void;
|
||||||
onToggleLockSelected?: () => void;
|
onToggleLockSelected?: () => void;
|
||||||
onToggleHideSelected?: () => void;
|
onToggleHideSelected?: () => void;
|
||||||
@ -83,6 +84,9 @@ export function ContextMenu(props: {
|
|||||||
if (!ctx || !position) return null;
|
if (!ctx || !position) return null;
|
||||||
|
|
||||||
const hasSelection = props.selectionIds.length > 0;
|
const hasSelection = props.selectionIds.length > 0;
|
||||||
|
const hasTarget = !!ctx.targetId;
|
||||||
|
const targetInSelection = !!ctx.targetId && props.selectionIds.includes(ctx.targetId);
|
||||||
|
const canSelectSingle = !!props.onSelectSingle;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@ -112,6 +116,26 @@ export function ContextMenu(props: {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{canSelectSingle && hasTarget && targetInSelection && props.selectionIds.length > 1 ? (
|
||||||
|
<MenuItem
|
||||||
|
label="Select Only"
|
||||||
|
onClick={() => {
|
||||||
|
props.onSelectSingle?.(ctx.targetId);
|
||||||
|
onClose();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : null}
|
||||||
|
|
||||||
|
{canSelectSingle && !hasTarget && hasSelection ? (
|
||||||
|
<MenuItem
|
||||||
|
label="Clear Selection"
|
||||||
|
onClick={() => {
|
||||||
|
props.onSelectSingle?.(undefined);
|
||||||
|
onClose();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : null}
|
||||||
|
|
||||||
<div style={{ height: 1, margin: '6px 0', background: 'rgba(255,255,255,0.08)' }} />
|
<div style={{ height: 1, margin: '6px 0', background: 'rgba(255,255,255,0.08)' }} />
|
||||||
|
|
||||||
<MenuItem
|
<MenuItem
|
||||||
|
|||||||
@ -504,6 +504,7 @@ export function EditorApp() {
|
|||||||
selectionAllHidden={selectionAllHidden}
|
selectionAllHidden={selectionAllHidden}
|
||||||
onClose={closeContextMenu}
|
onClose={closeContextMenu}
|
||||||
onAddTextAt={(x, y) => dispatch({ type: 'addTextAt', x, y })}
|
onAddTextAt={(x, y) => dispatch({ type: 'addTextAt', x, y })}
|
||||||
|
onSelectSingle={(id) => dispatch({ type: 'selectSingle', id })}
|
||||||
onDuplicateSelected={() => dispatch({ type: 'duplicateSelected' })}
|
onDuplicateSelected={() => dispatch({ type: 'duplicateSelected' })}
|
||||||
onToggleLockSelected={() => dispatch({ type: 'toggleLockSelected' })}
|
onToggleLockSelected={() => dispatch({ type: 'toggleLockSelected' })}
|
||||||
onToggleHideSelected={() => dispatch({ type: 'toggleHideSelected' })}
|
onToggleHideSelected={() => dispatch({ type: 'toggleHideSelected' })}
|
||||||
|
|||||||
@ -115,12 +115,18 @@ function isIframe(c: GoViewComponentLike): boolean {
|
|||||||
if (k === 'iframe' || k.includes('iframe')) return true;
|
if (k === 'iframe' || k.includes('iframe')) return true;
|
||||||
|
|
||||||
// Other names seen in low-code editors for embedded web content.
|
// Other names seen in low-code editors for embedded web content.
|
||||||
|
// Keep this fairly conservative; video/image are handled separately.
|
||||||
return (
|
return (
|
||||||
k.includes('embed') ||
|
k.includes('embed') ||
|
||||||
k.includes('webview') ||
|
k.includes('webview') ||
|
||||||
k.includes('html') ||
|
k.includes('html') ||
|
||||||
k.includes('browser') ||
|
k.includes('browser') ||
|
||||||
k.includes('webpage') ||
|
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.
|
// keep the plain 'web' check last; it's broad and may overlap other widgets.
|
||||||
k === 'web' ||
|
k === 'web' ||
|
||||||
k.endsWith('_web') ||
|
k.endsWith('_web') ||
|
||||||
@ -149,6 +155,11 @@ function isVideo(c: GoViewComponentLike): boolean {
|
|||||||
k.includes('mp4') ||
|
k.includes('mp4') ||
|
||||||
k.includes('media') ||
|
k.includes('media') ||
|
||||||
k.includes('player') ||
|
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('stream') ||
|
||||||
k.includes('rtsp') ||
|
k.includes('rtsp') ||
|
||||||
k.includes('rtmp') ||
|
k.includes('rtmp') ||
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user