feat(svelte): ssr fitView
This commit is contained in:
@@ -211,7 +211,7 @@ export default function useReactFlow<NodeData = any, EdgeData = any>(): ReactFlo
|
|||||||
const overlappingArea = getOverlappingArea(currNodeRect, nodeRect);
|
const overlappingArea = getOverlappingArea(currNodeRect, nodeRect);
|
||||||
const partiallyVisible = partially && overlappingArea > 0;
|
const partiallyVisible = partially && overlappingArea > 0;
|
||||||
|
|
||||||
return partiallyVisible || overlappingArea >= nodeOrRect.width! * nodeOrRect.height!;
|
return partiallyVisible || overlappingArea >= nodeRect.width * nodeRect.height;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[]
|
[]
|
||||||
@@ -228,7 +228,7 @@ export default function useReactFlow<NodeData = any, EdgeData = any>(): ReactFlo
|
|||||||
const overlappingArea = getOverlappingArea(nodeRect, area);
|
const overlappingArea = getOverlappingArea(nodeRect, area);
|
||||||
const partiallyVisible = partially && overlappingArea > 0;
|
const partiallyVisible = partially && overlappingArea > 0;
|
||||||
|
|
||||||
return partiallyVisible || overlappingArea >= nodeOrRect.width! * nodeOrRect.height!;
|
return partiallyVisible || overlappingArea >= nodeRect.width * nodeRect.height;
|
||||||
},
|
},
|
||||||
[]
|
[]
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -10,12 +10,14 @@
|
|||||||
export let initialEdges: $$Props['initialEdges'] = undefined;
|
export let initialEdges: $$Props['initialEdges'] = undefined;
|
||||||
export let initialWidth: $$Props['initialWidth'] = undefined;
|
export let initialWidth: $$Props['initialWidth'] = undefined;
|
||||||
export let initialHeight: $$Props['initialHeight'] = undefined;
|
export let initialHeight: $$Props['initialHeight'] = undefined;
|
||||||
|
export let fitView: $$Props['fitView'] = undefined;
|
||||||
|
|
||||||
const store = createStore({
|
const store = createStore({
|
||||||
nodes: initialNodes,
|
nodes: initialNodes,
|
||||||
edges: initialEdges,
|
edges: initialEdges,
|
||||||
width: initialWidth,
|
width: initialWidth,
|
||||||
height: initialHeight
|
height: initialHeight,
|
||||||
|
fitView
|
||||||
});
|
});
|
||||||
|
|
||||||
setContext(key, {
|
setContext(key, {
|
||||||
|
|||||||
@@ -5,4 +5,5 @@ export type SvelteFlowProviderProps = {
|
|||||||
initialEdges?: Edge[];
|
initialEdges?: Edge[];
|
||||||
initialWidth?: number;
|
initialWidth?: number;
|
||||||
initialHeight?: number;
|
initialHeight?: number;
|
||||||
|
fitView?: boolean;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -79,7 +79,7 @@
|
|||||||
|
|
||||||
const store = hasContext(key)
|
const store = hasContext(key)
|
||||||
? useStore()
|
? useStore()
|
||||||
: createStoreContext({ nodes: get(nodes), edges: get(edges), width, height });
|
: createStoreContext({ nodes: get(nodes), edges: get(edges), width, height, fitView });
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
store.width.set(clientWidth);
|
store.width.set(clientWidth);
|
||||||
|
|||||||
@@ -33,14 +33,16 @@ export function createStore({
|
|||||||
nodes,
|
nodes,
|
||||||
edges,
|
edges,
|
||||||
width,
|
width,
|
||||||
height
|
height,
|
||||||
|
fitView: fitViewOnCreate
|
||||||
}: {
|
}: {
|
||||||
nodes?: Node[];
|
nodes?: Node[];
|
||||||
edges?: Edge[];
|
edges?: Edge[];
|
||||||
width?: number;
|
width?: number;
|
||||||
height?: number;
|
height?: number;
|
||||||
|
fitView?: boolean;
|
||||||
}): SvelteFlowStore {
|
}): SvelteFlowStore {
|
||||||
const store = getInitialStore({ nodes, edges, width, height });
|
const store = getInitialStore({ nodes, edges, width, height, fitView: fitViewOnCreate });
|
||||||
|
|
||||||
function setNodeTypes(nodeTypes: NodeTypes) {
|
function setNodeTypes(nodeTypes: NodeTypes) {
|
||||||
store.nodeTypes.set({
|
store.nodeTypes.set({
|
||||||
@@ -347,14 +349,16 @@ export function createStoreContext({
|
|||||||
nodes,
|
nodes,
|
||||||
edges,
|
edges,
|
||||||
width,
|
width,
|
||||||
height
|
height,
|
||||||
|
fitView
|
||||||
}: {
|
}: {
|
||||||
nodes?: Node[];
|
nodes?: Node[];
|
||||||
edges?: Edge[];
|
edges?: Edge[];
|
||||||
width?: number;
|
width?: number;
|
||||||
height?: number;
|
height?: number;
|
||||||
|
fitView?: boolean;
|
||||||
}) {
|
}) {
|
||||||
const store = createStore({ nodes, edges, width, height });
|
const store = createStore({ nodes, edges, width, height, fitView });
|
||||||
|
|
||||||
setContext(key, {
|
setContext(key, {
|
||||||
getStore: () => store
|
getStore: () => store
|
||||||
|
|||||||
@@ -14,7 +14,10 @@ import {
|
|||||||
type NodeOrigin,
|
type NodeOrigin,
|
||||||
type OnError,
|
type OnError,
|
||||||
devWarn,
|
devWarn,
|
||||||
type Viewport
|
type Viewport,
|
||||||
|
updateNodes,
|
||||||
|
getRectOfNodes,
|
||||||
|
getTransformForBounds
|
||||||
} from '@xyflow/system';
|
} from '@xyflow/system';
|
||||||
|
|
||||||
import DefaultNode from '$lib/components/nodes/DefaultNode.svelte';
|
import DefaultNode from '$lib/components/nodes/DefaultNode.svelte';
|
||||||
@@ -47,16 +50,33 @@ export const getInitialStore = ({
|
|||||||
nodes = [],
|
nodes = [],
|
||||||
edges = [],
|
edges = [],
|
||||||
width,
|
width,
|
||||||
height
|
height,
|
||||||
|
fitView
|
||||||
}: {
|
}: {
|
||||||
nodes?: Node[];
|
nodes?: Node[];
|
||||||
edges?: Edge[];
|
edges?: Edge[];
|
||||||
width?: number;
|
width?: number;
|
||||||
height?: number;
|
height?: number;
|
||||||
|
fitView?: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
|
const nextNodes = updateNodes(nodes, [], { nodeOrigin: [0, 0], elevateNodesOnSelect: false });
|
||||||
|
|
||||||
|
let viewport: Viewport = { x: 0, y: 0, zoom: 1 };
|
||||||
|
|
||||||
|
if (fitView && width && height) {
|
||||||
|
const nodesWithDimensions = nextNodes.map((node) => ({
|
||||||
|
...node,
|
||||||
|
width: node.size?.width,
|
||||||
|
height: node.size?.height
|
||||||
|
}));
|
||||||
|
const bounds = getRectOfNodes(nodesWithDimensions, [0, 0]);
|
||||||
|
const transform = getTransformForBounds(bounds, width, height, 0.5, 2, 0.1);
|
||||||
|
viewport = { x: transform[0], y: transform[1], zoom: transform[2] };
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
flowId: writable<string | null>(null),
|
flowId: writable<string | null>(null),
|
||||||
nodes: createNodesStore(nodes),
|
nodes: createNodesStore(nextNodes),
|
||||||
visibleNodes: readable<Node[]>([]),
|
visibleNodes: readable<Node[]>([]),
|
||||||
edges: createEdgesStore(edges),
|
edges: createEdgesStore(edges),
|
||||||
edgeTree: readable<GroupedEdges<EdgeLayouted>[]>([]),
|
edgeTree: readable<GroupedEdges<EdgeLayouted>[]>([]),
|
||||||
@@ -85,7 +105,7 @@ export const getInitialStore = ({
|
|||||||
selectionMode: writable<SelectionMode>(SelectionMode.Partial),
|
selectionMode: writable<SelectionMode>(SelectionMode.Partial),
|
||||||
nodeTypes: writable<NodeTypes>(initialNodeTypes),
|
nodeTypes: writable<NodeTypes>(initialNodeTypes),
|
||||||
edgeTypes: writable<EdgeTypes>(initialEdgeTypes),
|
edgeTypes: writable<EdgeTypes>(initialEdgeTypes),
|
||||||
viewport: writable<Viewport>({ x: 0, y: 0, zoom: 1 }),
|
viewport: writable<Viewport>(viewport),
|
||||||
connectionMode: writable<ConnectionMode>(ConnectionMode.Strict),
|
connectionMode: writable<ConnectionMode>(ConnectionMode.Strict),
|
||||||
domNode: writable<HTMLDivElement | null>(null),
|
domNode: writable<HTMLDivElement | null>(null),
|
||||||
connection: readable<ConnectionProps>(initConnectionProps),
|
connection: readable<ConnectionProps>(initConnectionProps),
|
||||||
|
|||||||
Reference in New Issue
Block a user