82 lines
2.2 KiB
TypeScript
82 lines
2.2 KiB
TypeScript
// This program has been developed by students from the bachelor Computer Science at Utrecht
|
|
// University within the Software Project course.
|
|
// © Copyright Utrecht University (Department of Information and Computing Sciences)
|
|
import {
|
|
Handle,
|
|
type HandleProps,
|
|
type Connection,
|
|
useNodeId, useNodeConnections
|
|
} from '@xyflow/react';
|
|
import { type HandleRule, useHandleRules} from "../HandleRuleLogic.ts";
|
|
import "./RuleBasedHandle.module.css";
|
|
|
|
|
|
|
|
export function MultiConnectionHandle({
|
|
id,
|
|
type,
|
|
rules = [],
|
|
...otherProps
|
|
} : HandleProps & { rules?: HandleRule[]}) {
|
|
let nodeId = useNodeId();
|
|
// this check is used to make sure that the handle code doesn't break when used inside a test,
|
|
// since useNodeId would be undefined if the handle is not used inside a node
|
|
nodeId = nodeId ? nodeId : "mockId";
|
|
const validate = useHandleRules(nodeId, id!, type!, rules);
|
|
|
|
|
|
const connections = useNodeConnections({
|
|
id: nodeId,
|
|
handleType: type,
|
|
handleId: id!
|
|
})
|
|
|
|
return (
|
|
<Handle
|
|
{...otherProps}
|
|
id={id}
|
|
type={type}
|
|
className={"multiConnectionHandle" + (connections.length === 0 ? " unconnected" : " connected") + ` ${type}`}
|
|
isValidConnection={(connection) => {
|
|
const result = validate(connection as Connection);
|
|
return result.isSatisfied;
|
|
}}
|
|
/>
|
|
);
|
|
}
|
|
|
|
export function SingleConnectionHandle({
|
|
id,
|
|
type,
|
|
rules = [],
|
|
...otherProps
|
|
} : HandleProps & { rules?: HandleRule[]}) {
|
|
let nodeId = useNodeId();
|
|
// this check is used to make sure that the handle code doesn't break when used inside a test,
|
|
// since useNodeId would be undefined if the handle is not used inside a node
|
|
nodeId = nodeId ? nodeId : "mockId";
|
|
const validate = useHandleRules(nodeId, id!, type!, rules);
|
|
|
|
const connections = useNodeConnections({
|
|
id: nodeId,
|
|
handleType: type,
|
|
handleId: id!
|
|
})
|
|
|
|
|
|
return (
|
|
<Handle
|
|
{...otherProps}
|
|
id={id}
|
|
type={type}
|
|
className={"singleConnectionHandle" + (connections.length === 0 ? " unconnected" : " connected") + ` ${type}`}
|
|
isConnectable={connections.length === 0}
|
|
isValidConnection={(connection) => {
|
|
const result = validate(connection as Connection);
|
|
return result.isSatisfied;
|
|
}}
|
|
/>
|
|
);
|
|
}
|
|
|