48 lines
2.1 KiB
TypeScript
48 lines
2.1 KiB
TypeScript
import type { TreeNode } from "@/types/database";
|
|
|
|
type ConnectionTreeNode = TreeNode & { connectionId: string };
|
|
|
|
export function isConnectionNode(node: TreeNode): node is ConnectionTreeNode {
|
|
return node.type === "connection" && !!node.connectionId;
|
|
}
|
|
|
|
function selectedConnectionActionTargets(currentNode: TreeNode, selectedNodes: TreeNode[]): ConnectionTreeNode[] {
|
|
if (!isConnectionNode(currentNode)) return [];
|
|
const selectedContainsCurrent = selectedNodes.some((node) => node.id === currentNode.id);
|
|
if (selectedNodes.length > 1 && selectedContainsCurrent && selectedNodes.every(isConnectionNode)) {
|
|
return selectedNodes;
|
|
}
|
|
return [currentNode];
|
|
}
|
|
|
|
export function selectedConnectionDeleteTargets(currentNode: TreeNode, selectedNodes: TreeNode[]): ConnectionTreeNode[] {
|
|
return selectedConnectionActionTargets(currentNode, selectedNodes);
|
|
}
|
|
|
|
export function selectedConnectionDuplicateTargets(currentNode: TreeNode, selectedNodes: TreeNode[]): ConnectionTreeNode[] {
|
|
return selectedConnectionActionTargets(currentNode, selectedNodes);
|
|
}
|
|
|
|
export function selectedConnectionClipboardTargets(currentNode: TreeNode, selectedNodes: TreeNode[]): ConnectionTreeNode[] {
|
|
return selectedConnectionActionTargets(currentNode, selectedNodes);
|
|
}
|
|
|
|
export function selectedConnectionEditTarget(currentNode: TreeNode, selectedNodes: TreeNode[]): ConnectionTreeNode | null {
|
|
if (!isConnectionNode(currentNode)) return null;
|
|
const selectedContainsCurrent = selectedNodes.some((node) => node.id === currentNode.id);
|
|
if (selectedNodes.length > 1 && selectedContainsCurrent) return null;
|
|
return currentNode;
|
|
}
|
|
|
|
export function selectedConnectionClipboardNodes(selectedNodes: TreeNode[]): ConnectionTreeNode[] {
|
|
if (selectedNodes.length === 0 || !selectedNodes.every(isConnectionNode)) return [];
|
|
return selectedNodes;
|
|
}
|
|
|
|
export function connectionPasteTargetGroupId(node: TreeNode | null | undefined, groupIdForConnection: (connectionId: string) => string | null): string | null {
|
|
if (!node) return null;
|
|
if (node.type === "connection-group") return node.id;
|
|
if (isConnectionNode(node)) return groupIdForConnection(node.connectionId);
|
|
return null;
|
|
}
|