fix(nodes/edges): handle hidden attribute closes #3387
This commit is contained in:
@@ -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 ||
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ export type EdgeLayouted = Pick<
|
|||||||
| 'sourceHandle'
|
| 'sourceHandle'
|
||||||
| 'targetHandle'
|
| 'targetHandle'
|
||||||
| 'ariaLabel'
|
| 'ariaLabel'
|
||||||
|
| 'hidden'
|
||||||
> &
|
> &
|
||||||
EdgePosition & {
|
EdgePosition & {
|
||||||
sourceHandleId?: string | null;
|
sourceHandleId?: string | null;
|
||||||
|
|||||||
Reference in New Issue
Block a user