feat(editor): Zoom in to node after creation (no-changelog) (#17617)

This commit is contained in:
Suguru Inoue
2025-07-25 12:36:09 +02:00
committed by GitHub
parent 4f01bd1ecf
commit 408ccd2a58
3 changed files with 38 additions and 1 deletions

View File

@@ -862,6 +862,26 @@ watch([nodesSelectionActive, userSelectionRect], ([isActive, rect]) =>
emit('update:has-range-selection', isActive || (rect?.width ?? 0) > 0 || (rect?.height ?? 0) > 0), emit('update:has-range-selection', isActive || (rect?.width ?? 0) > 0 || (rect?.height ?? 0) > 0),
); );
watch([vueFlow.nodes, () => experimentalNdvStore.nodeNameToBeFocused], ([nodes, toFocusName]) => {
const toFocusNode =
toFocusName &&
(nodes as Array<GraphNode<CanvasNodeData>>).find((n) => n.data.name === toFocusName);
if (!toFocusNode) {
return;
}
// setTimeout() so that this happens after layout recalculation with the node to be focused
setTimeout(() => {
experimentalNdvStore.focusNode(toFocusNode, {
collapseOthers: false,
canvasViewport: viewport.value,
canvasDimensions: dimensions.value,
setCenter,
});
});
});
/** /**
* Provide * Provide
*/ */

View File

@@ -27,6 +27,7 @@ export const useExperimentalNdvStore = defineStore('experimentalNdv', () => {
const previousViewport = ref<ViewportTransform>(); const previousViewport = ref<ViewportTransform>();
const collapsedNodes = shallowRef<Partial<Record<string, boolean>>>({}); const collapsedNodes = shallowRef<Partial<Record<string, boolean>>>({});
const nodeNameToBeFocused = ref<string | undefined>();
function setNodeExpanded(nodeId: string, isExpanded?: boolean) { function setNodeExpanded(nodeId: string, isExpanded?: boolean) {
collapsedNodes.value = { collapsedNodes.value = {
@@ -53,6 +54,10 @@ export const useExperimentalNdvStore = defineStore('experimentalNdv', () => {
return isEnabled.value && Math.abs(canvasZoom - maxCanvasZoom.value) < 0.000001; return isEnabled.value && Math.abs(canvasZoom - maxCanvasZoom.value) < 0.000001;
} }
function setNodeNameToBeFocused(nodeName: string) {
nodeNameToBeFocused.value = nodeName;
}
interface FocusNodeOptions { interface FocusNodeOptions {
collapseOthers?: boolean; collapseOthers?: boolean;
canvasViewport: ViewportTransform; canvasViewport: ViewportTransform;
@@ -74,6 +79,10 @@ export const useExperimentalNdvStore = defineStore('experimentalNdv', () => {
const topMargin = 80; // pixels const topMargin = 80; // pixels
const nodeWidth = node.dimensions.width * (isActive(canvasViewport.zoom) ? 1 : 1.5); const nodeWidth = node.dimensions.width * (isActive(canvasViewport.zoom) ? 1 : 1.5);
if (nodeNameToBeFocused.value === node.data.name) {
nodeNameToBeFocused.value = undefined;
}
// Move the node to top center of the canvas // Move the node to top center of the canvas
void setCenter( void setCenter(
node.position.x + nodeWidth / 2, node.position.x + nodeWidth / 2,
@@ -128,11 +137,13 @@ export const useExperimentalNdvStore = defineStore('experimentalNdv', () => {
maxCanvasZoom, maxCanvasZoom,
previousZoom: computed(() => previousViewport.value), previousZoom: computed(() => previousViewport.value),
collapsedNodes: computed(() => collapsedNodes.value), collapsedNodes: computed(() => collapsedNodes.value),
nodeNameToBeFocused: computed(() => nodeNameToBeFocused.value),
isActive, isActive,
setNodeExpanded, setNodeExpanded,
expandAllNodes, expandAllNodes,
collapseAllNodes, collapseAllNodes,
toggleZoomMode, toggleZoomMode,
focusNode, focusNode,
setNodeNameToBeFocused,
}; };
}); });

View File

@@ -112,6 +112,7 @@ import { useLogsStore } from '@/stores/logs.store';
import { isChatNode } from '@/utils/aiUtils'; import { isChatNode } from '@/utils/aiUtils';
import cloneDeep from 'lodash/cloneDeep'; import cloneDeep from 'lodash/cloneDeep';
import uniq from 'lodash/uniq'; import uniq from 'lodash/uniq';
import { useExperimentalNdvStore } from '@/components/canvas/experimental/experimentalNdv.store';
type AddNodeData = Partial<INodeUi> & { type AddNodeData = Partial<INodeUi> & {
type: string; type: string;
@@ -155,6 +156,7 @@ export function useCanvasOperations() {
const executionsStore = useExecutionsStore(); const executionsStore = useExecutionsStore();
const projectsStore = useProjectsStore(); const projectsStore = useProjectsStore();
const logsStore = useLogsStore(); const logsStore = useLogsStore();
const experimentalNdvStore = useExperimentalNdvStore();
const i18n = useI18n(); const i18n = useI18n();
const toast = useToast(); const toast = useToast();
@@ -789,7 +791,11 @@ export function useCanvasOperations() {
void externalHooks.run('nodeView.addNodeButton', { nodeTypeName: nodeData.type }); void externalHooks.run('nodeView.addNodeButton', { nodeTypeName: nodeData.type });
if (options.openNDV && !preventOpeningNDV) { if (options.openNDV && !preventOpeningNDV) {
ndvStore.setActiveNodeName(nodeData.name); if (experimentalNdvStore.isEnabled) {
experimentalNdvStore.setNodeNameToBeFocused(nodeData.name);
} else {
ndvStore.setActiveNodeName(nodeData.name);
}
} }
} }
}); });