diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index ebcdc46db..80f6e8908 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -33,6 +33,7 @@ import { Designer, } from '../designer'; import { parseMetadata } from './utils/parse-metadata'; +import { getClosestClickableNode } from './utils/clickable'; import { ComponentMetadata, ComponentSchema } from '@ali/lowcode-types'; import { BuiltinSimulatorRenderer } from './renderer'; import clipboard from '../designer/clipboard'; @@ -362,7 +363,12 @@ export class BuiltinSimulatorHost implements ISimulatorHost { const onMoveHook = node.componentMeta?.getMetadata()?.experimental?.callbacks?.onMoveHook; - const canMove = onMoveHook && typeof onMoveHook === 'function' ? onMoveHook() : true; + const canMove = onMoveHook && typeof onMoveHook === 'function' ? onMoveHook(node) : true; return canMove; }); diff --git a/packages/designer/src/builtin-simulator/utils/clickable.ts b/packages/designer/src/builtin-simulator/utils/clickable.ts new file mode 100644 index 000000000..4169aa03c --- /dev/null +++ b/packages/designer/src/builtin-simulator/utils/clickable.ts @@ -0,0 +1,25 @@ +import { Node } from '../../document'; + +/** + * 获取离当前节点最近的可点击节点 + * @param currentNode + * @param event + */ +export const getClosestClickableNode = ( + currentNode: Node | undefined | null, + event: MouseEvent, +) => { + let node = currentNode; + // 执行 onClickHook 来判断当前节点是否可点击 + while (node) { + const onClickHook = node.componentMeta?.getMetadata()?.experimental?.callbacks?.onClickHook; + const canClick = + onClickHook && typeof onClickHook === 'function' ? onClickHook(event, node) : true; + if (canClick) { + break; + } + // 对于不可点击的节点, 继续向上找 + node = node.parent; + } + return node; +}; diff --git a/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts b/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts index 084037dfc..2f98b4c22 100644 --- a/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts +++ b/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts @@ -145,6 +145,7 @@ export interface OldPrototypeConfig { canDraging?: boolean; // => onDrag canDragging?: boolean; // => ? + canSelecting?: boolean; // => onClickHook canOperating?: boolean; // => disabledActions canUseCondition?: boolean; canLoop?: boolean; @@ -612,6 +613,7 @@ export function upgradeMetadata(oldConfig: OldPrototypeConfig) { // hooks canDraging, canDragging, // handleDragging + canSelecting, // onClickHook // events didDropOut, // onNodeRemove didDropIn, // onNodeAdd @@ -757,6 +759,13 @@ export function upgradeMetadata(oldConfig: OldPrototypeConfig) { } callbacks.onMoveHook = () => v; } + if (canSelecting != null) { + let v = true; + if (canSelecting === false) { + v = false; + } + callbacks.onClickHook = () => v; + } if (didDropIn) { callbacks.onNodeAdd = didDropIn; } diff --git a/packages/plugin-outline-pane/src/main.ts b/packages/plugin-outline-pane/src/main.ts index ae0f7bd32..6f2c74cef 100644 --- a/packages/plugin-outline-pane/src/main.ts +++ b/packages/plugin-outline-pane/src/main.ts @@ -146,7 +146,7 @@ export class OutlineMain implements ISensor, ITreeBoard, IScrollable { const operationalNodes = nodes?.filter((node: any) => { const onMoveHook = node.componentMeta?.getMetadata()?.experimental?.callbacks?.onMoveHook; - const canMove = onMoveHook && typeof onMoveHook === 'function' ? onMoveHook() : true; + const canMove = onMoveHook && typeof onMoveHook === 'function' ? onMoveHook(node) : true; return canMove; }); diff --git a/packages/vision-polyfill/src/bundle/upgrade-metadata.ts b/packages/vision-polyfill/src/bundle/upgrade-metadata.ts index 027d655be..bbf9b3b35 100644 --- a/packages/vision-polyfill/src/bundle/upgrade-metadata.ts +++ b/packages/vision-polyfill/src/bundle/upgrade-metadata.ts @@ -146,6 +146,7 @@ export interface OldPrototypeConfig { canDraging?: boolean; // => onDrag canDragging?: boolean; // => ? + canSelecting?: boolean; // => onClickHook canOperating?: boolean; // => disabledActions canUseCondition?: boolean; canLoop?: boolean; @@ -613,6 +614,7 @@ export function upgradeMetadata(oldConfig: OldPrototypeConfig) { // hooks canDraging, canDragging, // handleDragging + canSelecting, // onClickHook // events didDropOut, // onNodeRemove didDropIn, // onNodeAdd @@ -758,6 +760,13 @@ export function upgradeMetadata(oldConfig: OldPrototypeConfig) { } callbacks.onMoveHook = () => v; } + if (canSelecting != null) { + let v = true; + if (canSelecting === false) { + v = false; + } + callbacks.onClickHook = () => v; + } if (didDropIn) { callbacks.onNodeAdd = didDropIn; }