make edgeId optional, fix usage of edgeLabel

This commit is contained in:
peterkogo
2025-10-20 16:27:42 +02:00
parent 8e7c539531
commit 8068a3ab71
3 changed files with 21 additions and 11 deletions
@@ -20,10 +20,13 @@
const store = useStore(); const store = useStore();
const id = getContext<string>('svelteflow__edge_id'); const edgeId = getContext<string>('svelteflow__edge_id');
if (!edgeId) {
throw new Error('EdgeLabel must be used within an edge');
}
let z = $derived.by(() => { let z = $derived.by(() => {
return store.visible.edges.get(id)?.zIndex; return store.visible.edges.get(edgeId)?.zIndex;
}); });
</script> </script>
@@ -39,7 +42,7 @@
style:z-index={z} style:z-index={z}
tabindex="-1" tabindex="-1"
onclick={() => { onclick={() => {
if (selectEdgeOnClick && id) store.handleEdgeSelection(id); if (selectEdgeOnClick) store.handleEdgeSelection(edgeId);
}} }}
{...rest} {...rest}
> >
@@ -4,35 +4,41 @@
import { useStore } from '$lib/store'; import { useStore } from '$lib/store';
import { EdgeLabel } from '$lib/components/EdgeLabel'; import { EdgeLabel } from '$lib/components/EdgeLabel';
import type { EdgeToolbarProps } from './types'; import type { EdgeToolbarProps } from './types';
import { getContext } from 'svelte';
let { let {
edgeId,
x, x,
y, y,
alignX = 'center', alignX = 'center',
alignY = 'center', alignY = 'center',
isVisible, isVisible,
selectEdgeOnClick,
class: className,
children, children,
...rest ...rest
}: EdgeToolbarProps = $props(); }: EdgeToolbarProps = $props();
const store = useStore(); const store = useStore();
const edgeId = getContext<string>('svelteflow__edge_id');
if (!edgeId) {
throw new Error('EdgeToolbar must be used within an edge');
}
const edge = $derived(store.edgeLookup.get(edgeId)); const edge = $derived(store.edgeLookup.get(edgeId));
const isActive = $derived(typeof isVisible === 'boolean' ? isVisible : edge?.selected); const isActive = $derived(typeof isVisible === 'boolean' ? isVisible : edge?.selected);
const transform = $derived(getEdgeToolbarTransform(x, y, store.viewport.zoom, alignX, alignY)); const transform = $derived(getEdgeToolbarTransform(x, y, store.viewport.zoom, alignX, alignY));
const zIndex = $derived((edge?.zIndex ?? 0) + 1);
</script> </script>
{#if store.domNode && isActive} {#if isActive}
<EdgeLabel> <EdgeLabel {selectEdgeOnClick} transparent>
<div <div
style:position="absolute" style:position="absolute"
style:transform style:transform
style:z-index={zIndex}
style:transform-origin="0 0" style:transform-origin="0 0"
class={['svelte-flow__edge-toolbar', className]}
data-id={edgeId}
{...rest} {...rest}
class="svelte-flow__edge-toolbar"
data-id={edgeId ?? ''}
> >
{@render children?.()} {@render children?.()}
</div> </div>
@@ -2,6 +2,7 @@ import type { EdgeToolbarBaseProps } from '@xyflow/system';
import type { Snippet } from 'svelte'; import type { Snippet } from 'svelte';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
export type EdgeToolbarProps = EdgeToolbarBaseProps & { export type EdgeToolbarProps = Omit<EdgeToolbarBaseProps, 'edgeId'> & {
selectEdgeOnClick?: boolean;
children?: Snippet; children?: Snippet;
} & HTMLAttributes<HTMLDivElement>; } & HTMLAttributes<HTMLDivElement>;