mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 18:12:04 +00:00
feat(editor): Zoom in to node after creation (no-changelog) (#17617)
This commit is contained in:
@@ -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
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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,9 +791,13 @@ 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) {
|
||||||
|
if (experimentalNdvStore.isEnabled) {
|
||||||
|
experimentalNdvStore.setNodeNameToBeFocused(nodeData.name);
|
||||||
|
} else {
|
||||||
ndvStore.setActiveNodeName(nodeData.name);
|
ndvStore.setActiveNodeName(nodeData.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return nodeData;
|
return nodeData;
|
||||||
|
|||||||
Reference in New Issue
Block a user