refactor(libs) add width, height and positionAbsolute props to NodeProps

This commit is contained in:
moklick
2023-11-23 13:50:28 +01:00
parent 38b5051179
commit 1dfff1bf5b
16 changed files with 63 additions and 49 deletions
@@ -7,7 +7,7 @@ const sourceHandleStyleB: CSSProperties = {
left: 'auto', left: 'auto',
}; };
const CustomNode: FC<NodeProps> = ({ data, xPos, yPos }) => { const CustomNode: FC<NodeProps> = ({ data, positionAbsolute }) => {
return ( return (
<> <>
<Handle type="target" position={Position.Top} /> <Handle type="target" position={Position.Top} />
@@ -18,7 +18,7 @@ const CustomNode: FC<NodeProps> = ({ data, xPos, yPos }) => {
<div> <div>
Position:{' '} Position:{' '}
<strong> <strong>
{xPos.toFixed(2)},{yPos.toFixed(2)} {positionAbsolute.x.toFixed(2)},{positionAbsolute.y.toFixed(2)}
</strong> </strong>
</div> </div>
</div> </div>
@@ -11,13 +11,13 @@ const idStyle: CSSProperties = {
left: 2, left: 2,
}; };
const DebugNode: FC<NodeProps> = ({ zIndex, xPos, yPos, id }) => { const DebugNode: FC<NodeProps> = ({ zIndex, positionAbsolute, id }) => {
return ( return (
<> <>
<Handle type="target" position={Position.Top} /> <Handle type="target" position={Position.Top} />
<div style={idStyle}>{id}</div> <div style={idStyle}>{id}</div>
<div style={infoStyle}> <div style={infoStyle}>
x:{Math.round(xPos || 0)} y:{Math.round(yPos || 0)} z:{zIndex} x:{Math.round(positionAbsolute.x)} y:{Math.round(positionAbsolute.y)} z:{zIndex}
</div> </div>
<Handle type="source" position={Position.Bottom} /> <Handle type="source" position={Position.Bottom} />
</> </>
@@ -1,16 +1,15 @@
<script lang="ts"> <script lang="ts">
import { Handle, Position, type NodeProps } from '@xyflow/svelte'; import { Handle, Position, type NodeProps, type XYPosition } from '@xyflow/svelte';
type $$Props = NodeProps; type $$Props = NodeProps;
export let data: { label: string } = { label: 'Node' }; export let data: { label: string } = { label: 'Node' };
export let xPos: number = 0; export let positionAbsolute: XYPosition = { x: 0, y: 0 };
export let yPos: number = 0;
</script> </script>
<div class="custom"> <div class="custom">
<div>{data.label}</div> <div>{data.label}</div>
<div>{~~xPos}, {~~yPos}</div> <div>{~~positionAbsolute.x}, {~~positionAbsolute.y}</div>
<Handle type="target" position={Position.Top} /> <Handle type="target" position={Position.Top} />
@@ -1,24 +1,16 @@
<script lang="ts"> <script lang="ts">
import { Handle, Position, type NodeProps } from '@xyflow/svelte'; import { Handle, Position, type NodeProps, type XYPosition } from '@xyflow/svelte';
type $$Props = NodeProps; type $$Props = NodeProps;
export let id: string; export let id: string;
export let xPos: number = 0; export let positionAbsolute: XYPosition = { x: 0, y: 0 };
export let yPos: number = 0;
export let zIndex: number = 0; export let zIndex: number = 0;
</script> </script>
<Handle type="target" position={Position.Top} /> <Handle type="target" position={Position.Top} />
<div>{id}</div> <div>{id}</div>
<div> <div>
x:{Math.round(xPos || 0)} y:{Math.round(yPos || 0)} z:{zIndex} x:{Math.round(positionAbsolute.x)} y:{Math.round(positionAbsolute.y)} z:{zIndex}
</div> </div>
<Handle type="source" position={Position.Bottom} /> <Handle type="source" position={Position.Bottom} />
<style>
.custom {
background: #ffcc00;
padding: 10px;
}
</style>
@@ -52,6 +52,7 @@ export default (NodeComponent: ComponentType<NodeProps>) => {
disableKeyboardA11y, disableKeyboardA11y,
ariaLabel, ariaLabel,
rfId, rfId,
positionAbsolute,
width, width,
height, height,
}: WrapNodeProps) => { }: WrapNodeProps) => {
@@ -209,8 +210,9 @@ export default (NodeComponent: ComponentType<NodeProps>) => {
id={id} id={id}
data={data} data={data}
type={type} type={type}
xPos={xPos} width={width}
yPos={yPos} height={height}
positionAbsolute={positionAbsolute}
selected={selected} selected={selected}
isConnectable={isConnectable} isConnectable={isConnectable}
sourcePosition={sourcePosition} sourcePosition={sourcePosition}
@@ -122,6 +122,7 @@ const NodeRenderer = (props: NodeRendererProps) => {
yPos={posY} yPos={posY}
xPosOrigin={posOrigin.x} xPosOrigin={posOrigin.x}
yPosOrigin={posOrigin.y} yPosOrigin={posOrigin.y}
positionAbsolute={clampedPosition || { x: 0, y: 0 }}
onClick={props.onNodeClick} onClick={props.onNodeClick}
onMouseEnter={props.onNodeMouseEnter} onMouseEnter={props.onNodeMouseEnter}
onMouseMove={props.onNodeMouseMove} onMouseMove={props.onNodeMouseMove}
+2 -1
View File
@@ -1,5 +1,5 @@
import type { CSSProperties, MouseEvent as ReactMouseEvent } from 'react'; import type { CSSProperties, MouseEvent as ReactMouseEvent } from 'react';
import type { NodeBase } from '@xyflow/system'; import type { NodeBase, XYPosition } from '@xyflow/system';
export type Node<NodeData = any, NodeType extends string | undefined = string | undefined> = NodeBase< export type Node<NodeData = any, NodeType extends string | undefined = string | undefined> = NodeBase<
NodeData, NodeData,
@@ -24,6 +24,7 @@ export type WrapNodeProps<NodeData = any> = Pick<
yPos: number; yPos: number;
xPosOrigin: number; xPosOrigin: number;
yPosOrigin: number; yPosOrigin: number;
positionAbsolute: XYPosition;
initialized: boolean; initialized: boolean;
isSelectable: boolean; isSelectable: boolean;
isDraggable: boolean; isDraggable: boolean;
@@ -191,8 +191,9 @@
{dragging} {dragging}
{dragHandle} {dragHandle}
isConnectable={connectable} isConnectable={connectable}
xPos={positionX} positionAbsolute={{ x: positionX, y: positionY }}
yPos={positionY} {width}
{height}
on:connectstart on:connectstart
on:connect on:connect
on:connectend on:connectend
@@ -11,14 +11,14 @@ export type NodeWrapperProps = Pick<
| 'selected' | 'selected'
| 'selectable' | 'selectable'
| 'style' | 'style'
| 'width'
| 'height'
| 'type' | 'type'
| 'sourcePosition' | 'sourcePosition'
| 'targetPosition' | 'targetPosition'
| 'dragHandle' | 'dragHandle'
| 'hidden' | 'hidden'
> & { > & {
width?: number;
height?: number;
type: string; type: string;
positionX: number; positionX: number;
positionY: number; positionY: number;
@@ -11,24 +11,29 @@
// unused props - we need to list them here in order to prevent warnings // unused props - we need to list them here in order to prevent warnings
export let id: $$Props['id'] = ''; export let id: $$Props['id'] = '';
export let width: $$Props['width'] = undefined;
export let height: $$Props['height'] = undefined;
export let selected: $$Props['selected'] = undefined; export let selected: $$Props['selected'] = undefined;
export let type: $$Props['type'] = undefined; export let type: $$Props['type'] = undefined;
export let zIndex: $$Props['zIndex'] = undefined; export let zIndex: $$Props['zIndex'] = undefined;
export let dragging: $$Props['dragging'] = false; export let dragging: $$Props['dragging'] = false;
export let dragHandle: $$Props['dragHandle'] = undefined; export let dragHandle: $$Props['dragHandle'] = undefined;
export let xPos: $$Props['xPos'] = 0; export let positionAbsolute: $$Props['positionAbsolute'] = {
export let yPos: $$Props['yPos'] = 0; x: 0,
y: 0
};
export let isConnectable: $$Props['isConnectable'] = undefined; export let isConnectable: $$Props['isConnectable'] = undefined;
// @todo: there must be a better way to do this // @todo: there must be a better way to do this
id; id;
width;
height;
selected; selected;
type; type;
zIndex; zIndex;
dragging; dragging;
dragHandle; dragHandle;
xPos; positionAbsolute;
yPos;
isConnectable; isConnectable;
</script> </script>
@@ -5,6 +5,8 @@
// unused props - we need to list them here in order to prevent warnings // unused props - we need to list them here in order to prevent warnings
export let id: $$Props['id'] = ''; export let id: $$Props['id'] = '';
export let width: $$Props['width'] = undefined;
export let height: $$Props['height'] = undefined;
export let data: $$Props['data'] = {}; export let data: $$Props['data'] = {};
export let selected: $$Props['selected'] = undefined; export let selected: $$Props['selected'] = undefined;
export let sourcePosition: $$Props['sourcePosition'] = undefined; export let sourcePosition: $$Props['sourcePosition'] = undefined;
@@ -13,12 +15,16 @@
export let zIndex: $$Props['zIndex'] = undefined; export let zIndex: $$Props['zIndex'] = undefined;
export let dragging: $$Props['dragging'] = false; export let dragging: $$Props['dragging'] = false;
export let dragHandle: $$Props['dragHandle'] = undefined; export let dragHandle: $$Props['dragHandle'] = undefined;
export let xPos: $$Props['xPos'] = 0; export let positionAbsolute: $$Props['positionAbsolute'] = {
export let yPos: $$Props['yPos'] = 0; x: 0,
y: 0
};
export let isConnectable: $$Props['isConnectable'] = undefined; export let isConnectable: $$Props['isConnectable'] = undefined;
// @todo: there must be a better way to do this // @todo: there must be a better way to do this
id; id;
width;
height;
data; data;
selected; selected;
sourcePosition; sourcePosition;
@@ -27,7 +33,6 @@
zIndex; zIndex;
dragging; dragging;
dragHandle; dragHandle;
xPos; positionAbsolute;
yPos;
isConnectable; isConnectable;
</script> </script>
@@ -10,26 +10,31 @@
// unused props - we need to list them here in order to prevent warnings // unused props - we need to list them here in order to prevent warnings
export let id: $$Props['id'] = ''; export let id: $$Props['id'] = '';
export let width: $$Props['width'] = undefined;
export let height: $$Props['height'] = undefined;
export let selected: $$Props['selected'] = undefined; export let selected: $$Props['selected'] = undefined;
export let targetPosition: $$Props['targetPosition'] = undefined; export let targetPosition: $$Props['targetPosition'] = undefined;
export let type: $$Props['type'] = undefined; export let type: $$Props['type'] = undefined;
export let zIndex: $$Props['zIndex'] = undefined; export let zIndex: $$Props['zIndex'] = undefined;
export let dragging: $$Props['dragging'] = false; export let dragging: $$Props['dragging'] = false;
export let dragHandle: $$Props['dragHandle'] = undefined; export let dragHandle: $$Props['dragHandle'] = undefined;
export let xPos: $$Props['xPos'] = 0; export let positionAbsolute: $$Props['positionAbsolute'] = {
export let yPos: $$Props['yPos'] = 0; x: 0,
y: 0
};
export let isConnectable: $$Props['isConnectable'] = undefined; export let isConnectable: $$Props['isConnectable'] = undefined;
// @todo: there must be a better way to do this // @todo: there must be a better way to do this
id; id;
width;
height;
selected; selected;
targetPosition; targetPosition;
type; type;
zIndex; zIndex;
dragging; dragging;
dragHandle; dragHandle;
xPos; positionAbsolute;
yPos;
isConnectable; isConnectable;
</script> </script>
@@ -10,26 +10,28 @@
// unused props - we need to list them here in order to prevent warnings // unused props - we need to list them here in order to prevent warnings
export let id: $$Props['id'] = ''; export let id: $$Props['id'] = '';
export let width: $$Props['width'] = undefined;
export let height: $$Props['height'] = undefined;
export let selected: $$Props['selected'] = undefined; export let selected: $$Props['selected'] = undefined;
export let sourcePosition: $$Props['sourcePosition'] = undefined; export let sourcePosition: $$Props['sourcePosition'] = undefined;
export let type: $$Props['type'] = undefined; export let type: $$Props['type'] = undefined;
export let zIndex: $$Props['zIndex'] = undefined; export let zIndex: $$Props['zIndex'] = undefined;
export let dragging: $$Props['dragging'] = false; export let dragging: $$Props['dragging'] = false;
export let dragHandle: $$Props['dragHandle'] = undefined; export let dragHandle: $$Props['dragHandle'] = undefined;
export let xPos: $$Props['xPos'] = 0; export let positionAbsolute: $$Props['positionAbsolute'] = { x: 0, y: 0 };
export let yPos: $$Props['yPos'] = 0;
export let isConnectable: $$Props['isConnectable'] = undefined; export let isConnectable: $$Props['isConnectable'] = undefined;
// @todo: there must be a better way to do this // @todo: there must be a better way to do this
id; id;
width;
height;
selected; selected;
sourcePosition; sourcePosition;
type; type;
zIndex; zIndex;
dragging; dragging;
dragHandle; dragHandle;
xPos; positionAbsolute;
yPos;
isConnectable; isConnectable;
</script> </script>
@@ -68,14 +68,14 @@
isParent={!!node[internalsSymbol]?.isParent} isParent={!!node[internalsSymbol]?.isParent}
style={node.style} style={node.style}
class={node.class} class={node.class}
type={node.type || 'default'} type={node.type ?? 'default'}
sourcePosition={node.sourcePosition} sourcePosition={node.sourcePosition}
targetPosition={node.targetPosition} targetPosition={node.targetPosition}
dragging={node.dragging} dragging={node.dragging}
zIndex={node[internalsSymbol]?.z ?? 0} zIndex={node[internalsSymbol]?.z ?? 0}
dragHandle={node.dragHandle} dragHandle={node.dragHandle}
width={node.width} width={node.width ?? undefined}
height={node.height} height={node.height ?? undefined}
initialized={(!!node.computed?.width && !!node.computed?.height) || initialized={(!!node.computed?.width && !!node.computed?.height) ||
(!!node.width && !!node.height)} (!!node.width && !!node.height)}
{resizeObserver} {resizeObserver}
+3 -2
View File
@@ -52,8 +52,9 @@ export type NodeProps<T = any> = {
selected: NodeBase['selected']; selected: NodeBase['selected'];
isConnectable: NodeBase['connectable']; isConnectable: NodeBase['connectable'];
zIndex: NodeBase['zIndex']; zIndex: NodeBase['zIndex'];
xPos: number; positionAbsolute: XYPosition;
yPos: number; width?: number;
height?: number;
dragging: boolean; dragging: boolean;
targetPosition?: Position; targetPosition?: Position;
sourcePosition?: Position; sourcePosition?: Position;
+2 -2
View File
@@ -254,8 +254,8 @@ export function calcNextPosition<NodeType extends NodeBase>(
? [ ? [
[parentPos.x + nodeWidth * currNodeOrigin[0], parentPos.y + nodeHeight * currNodeOrigin[1]], [parentPos.x + nodeWidth * currNodeOrigin[0], parentPos.y + nodeHeight * currNodeOrigin[1]],
[ [
parentPos.x + parentNode.computed.width - nodeWidth + nodeWidth * currNodeOrigin[0], parentPos.x + (parentNode.computed?.width ?? 0) - nodeWidth + nodeWidth * currNodeOrigin[0],
parentPos.y + parentNode.computed.height - nodeHeight + nodeHeight * currNodeOrigin[1], parentPos.y + (parentNode.computed?.height ?? 0) - nodeHeight + nodeHeight * currNodeOrigin[1],
], ],
] ]
: currentExtent; : currentExtent;