fix(nodes/edges): handle hidden attribute closes #3387

This commit is contained in:
moklick
2023-09-14 18:24:15 +02:00
parent bd6f774de6
commit 89610ccd29
6 changed files with 98 additions and 85 deletions
@@ -9,7 +9,9 @@
Panel, Panel,
SelectionMode, SelectionMode,
type NodeTypes, type NodeTypes,
type EdgeTypes type EdgeTypes,
type Node,
type Edge
} from '@xyflow/svelte'; } from '@xyflow/svelte';
import CustomNode from './CustomNode.svelte'; import CustomNode from './CustomNode.svelte';
@@ -25,7 +27,7 @@
custom: CustomEdge custom: CustomEdge
}; };
const nodes = writable([ const nodes = writable<Node[]>([
{ {
id: '1', id: '1',
type: 'input', type: 'input',
@@ -74,7 +76,7 @@
} }
]); ]);
const edges = writable([ const edges = writable<Edge[]>([
{ {
id: '1-2', id: '1-2',
type: 'default', type: 'default',
@@ -4,7 +4,7 @@
import { useStore } from '$lib/store'; import { useStore } from '$lib/store';
import BezierEdge from '$lib/components/edges/BezierEdge.svelte'; import BezierEdge from '$lib/components/edges/BezierEdge.svelte';
import type { EdgeLayouted, EdgeProps } from '$lib/types'; import type { EdgeLayouted } from '$lib/types';
type $$Props = EdgeLayouted; type $$Props = EdgeLayouted;
@@ -18,6 +18,7 @@
export let animated: $$Props['animated'] = false; export let animated: $$Props['animated'] = false;
export let selected: $$Props['selected'] = false; export let selected: $$Props['selected'] = false;
export let selectable: $$Props['selectable'] = true; export let selectable: $$Props['selectable'] = true;
export let hidden: $$Props['hidden'] = false;
export let label: $$Props['label'] = undefined; export let label: $$Props['label'] = undefined;
export let labelStyle: $$Props['labelStyle'] = undefined; export let labelStyle: $$Props['labelStyle'] = undefined;
export let markerStart: $$Props['markerStart'] = undefined; export let markerStart: $$Props['markerStart'] = undefined;
@@ -52,39 +53,41 @@
<!-- svelte-ignore a11y-click-events-have-key-events --> <!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-noninteractive-element-interactions --> <!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
<g {#if !hidden}
class="svelte-flow__edge" <g
class:animated class="svelte-flow__edge"
class:selected class:animated
data-id={id} class:selected
on:click={onClick} data-id={id}
aria-label={ariaLabel === null on:click={onClick}
? undefined aria-label={ariaLabel === null
: ariaLabel ? undefined
? ariaLabel : ariaLabel
: `Edge from ${source} to ${target}`} ? ariaLabel
role="img" : `Edge from ${source} to ${target}`}
> role="img"
<svelte:component >
this={edgeComponent} <svelte:component
{id} this={edgeComponent}
{source} {id}
{target} {source}
{sourceX} {target}
{sourceY} {sourceX}
{targetX} {sourceY}
{targetY} {targetX}
{sourcePosition} {targetY}
{targetPosition} {sourcePosition}
{animated} {targetPosition}
{selected} {animated}
{label} {selected}
{labelStyle} {label}
{data} {labelStyle}
{style} {data}
sourceHandleId={sourceHandle} {style}
targetHandleId={targetHandle} sourceHandleId={sourceHandle}
markerStart={markerStartUrl} targetHandleId={targetHandle}
markerEnd={markerEndUrl} markerStart={markerStartUrl}
/> markerEnd={markerEndUrl}
</g> />
</g>
{/if}
@@ -23,6 +23,7 @@
export let draggable: NodeWrapperProps['draggable'] = undefined; export let draggable: NodeWrapperProps['draggable'] = undefined;
export let selectable: NodeWrapperProps['selectable'] = undefined; export let selectable: NodeWrapperProps['selectable'] = undefined;
export let connectable: NodeWrapperProps['connectable'] = true; export let connectable: NodeWrapperProps['connectable'] = true;
export let hidden: NodeWrapperProps['hidden'] = false;
export let dragging: boolean = false; export let dragging: boolean = false;
export let resizeObserver: NodeWrapperProps['resizeObserver'] = null; export let resizeObserver: NodeWrapperProps['resizeObserver'] = null;
export let style: NodeWrapperProps['style'] = undefined; export let style: NodeWrapperProps['style'] = undefined;
@@ -79,6 +80,8 @@
addSelectedNodes([id]); addSelectedNodes([id]);
} }
// @todo: support multiselection
dispatchEvent('nodeclick'); dispatchEvent('nodeclick');
} }
// @todo: add selectable state // @todo: add selectable state
@@ -86,48 +89,50 @@
<!-- svelte-ignore a11y-click-events-have-key-events --> <!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-static-element-interactions --> <!-- svelte-ignore a11y-no-static-element-interactions -->
<div {#if !hidden}
use:drag={{ <div
nodeId: id, use:drag={{
isSelectable: selectable, nodeId: id,
disabled: false, isSelectable: selectable,
handleSelector: undefined, disabled: false,
noDragClassName: 'nodrag', handleSelector: undefined,
store noDragClassName: 'nodrag',
}} store
bind:this={nodeRef} }}
data-id={id} bind:this={nodeRef}
class={cc(['svelte-flow__node', `svelte-flow__node-${type || 'default'}`, className])} data-id={id}
class:dragging class={cc(['svelte-flow__node', `svelte-flow__node-${type || 'default'}`, className])}
class:selected class:dragging
class:draggable class:selected
class:connectable class:draggable
class:selectable class:connectable
class:parent={isParent} class:selectable
style:z-index={zIndex} class:parent={isParent}
style:transform="translate({positionOrigin?.x ?? 0}px, {positionOrigin?.y ?? 0}px)" style:z-index={zIndex}
{style} style:transform="translate({positionOrigin?.x ?? 0}px, {positionOrigin?.y ?? 0}px)"
on:click={onSelectNodeHandler} {style}
on:mouseenter={() => dispatchEvent('nodemouseenter')} on:click={onSelectNodeHandler}
on:mouseleave={() => dispatchEvent('nodemouseleave')} on:mouseenter={() => dispatchEvent('nodemouseenter')}
on:mousemove={() => dispatchEvent('nodemousemove')} on:mouseleave={() => dispatchEvent('nodemouseleave')}
> on:mousemove={() => dispatchEvent('nodemousemove')}
<svelte:component >
this={nodeComponent} <svelte:component
{data} this={nodeComponent}
{id} {data}
{selected} {id}
{sourcePosition} {selected}
{targetPosition} {sourcePosition}
{type} {targetPosition}
{zIndex} {type}
{dragging} {zIndex}
{dragHandle} {dragging}
isConnectable={connectable} {dragHandle}
xPos={positionAbsolute?.x ?? 0} isConnectable={connectable}
yPos={positionAbsolute?.y ?? 0} xPos={positionAbsolute?.x ?? 0}
on:connectstart yPos={positionAbsolute?.y ?? 0}
on:connect on:connectstart
on:connectend on:connect
/> on:connectend
</div> />
</div>
{/if}
@@ -19,6 +19,7 @@ export type NodeWrapperProps = Pick<
| 'sourcePosition' | 'sourcePosition'
| 'targetPosition' | 'targetPosition'
| 'dragHandle' | 'dragHandle'
| 'hidden'
> & { > & {
positionOrigin?: XYPosition; positionOrigin?: XYPosition;
'on:nodeclick'?: (event: MouseEvent) => void; 'on:nodeclick'?: (event: MouseEvent) => void;
@@ -43,6 +43,7 @@
id={node.id} id={node.id}
data={node.data} data={node.data}
selected={!!node.selected} selected={!!node.selected}
hidden={!!node.hidden}
draggable={!!(node.draggable || ($nodesDraggable && typeof node.draggable === 'undefined'))} draggable={!!(node.draggable || ($nodesDraggable && typeof node.draggable === 'undefined'))}
selectable={!!( selectable={!!(
node.selectable || node.selectable ||
+1
View File
@@ -68,6 +68,7 @@ export type EdgeLayouted = Pick<
| 'sourceHandle' | 'sourceHandle'
| 'targetHandle' | 'targetHandle'
| 'ariaLabel' | 'ariaLabel'
| 'hidden'
> & > &
EdgePosition & { EdgePosition & {
sourceHandleId?: string | null; sourceHandleId?: string | null;