feat(svelte): ssr fitView

This commit is contained in:
moklick
2023-10-23 18:05:45 +02:00
parent 9351a492ac
commit 2435a0da8f
6 changed files with 39 additions and 12 deletions
+2 -2
View File
@@ -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);
+8 -4
View File
@@ -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
+24 -4
View File
@@ -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),