feat: enhance selection context menu with alignment options and grouping functionality

- Added alignment buttons for nodes with tooltips in the selection context menu.
- Implemented grouping functionality with a new "Make group" option, including keyboard shortcuts.
- Updated translations for the new grouping feature in multiple languages.
- Refactored node selection logic to improve performance and readability.
This commit is contained in:
zhsama
2025-12-17 19:52:02 +08:00
parent 4fce99379e
commit 752cb9e4f4
8 changed files with 182 additions and 83 deletions

View File

@ -157,6 +157,42 @@ export const getValidTreeNodes = (nodes: Node[], edges: Edge[]) => {
}
}
export const getCommonPredecessorNodeIds = (selectedNodeIds: string[], edges: Edge[]) => {
const uniqSelectedNodeIds = Array.from(new Set(selectedNodeIds))
if (uniqSelectedNodeIds.length <= 1)
return []
const selectedNodeIdSet = new Set(uniqSelectedNodeIds)
const predecessorNodeIdsMap = new Map<string, Set<string>>()
edges.forEach((edge) => {
if (!selectedNodeIdSet.has(edge.target))
return
const predecessors = predecessorNodeIdsMap.get(edge.target) ?? new Set<string>()
predecessors.add(edge.source)
predecessorNodeIdsMap.set(edge.target, predecessors)
})
let commonPredecessorNodeIds: Set<string> | null = null
uniqSelectedNodeIds.forEach((nodeId) => {
const predecessors = predecessorNodeIdsMap.get(nodeId) ?? new Set<string>()
if (!commonPredecessorNodeIds) {
commonPredecessorNodeIds = new Set(predecessors)
return
}
Array.from(commonPredecessorNodeIds).forEach((predecessorNodeId) => {
if (!predecessors.has(predecessorNodeId))
commonPredecessorNodeIds!.delete(predecessorNodeId)
})
})
return Array.from(commonPredecessorNodeIds ?? []).sort()
}
export const changeNodesAndEdgesId = (nodes: Node[], edges: Edge[]) => {
const idMap = nodes.reduce((acc, node) => {
acc[node.id] = uuid4()