From 99b2e43cfe169b2ddb59c471f3b32cb7e9605be4 Mon Sep 17 00:00:00 2001 From: Afiq Date: Thu, 3 Jul 2025 12:51:59 +0800 Subject: [PATCH] Refactor FormNodeConfiguration and ProcessFlowCanvas for Improved Usability and Code Clarity - Adjusted indentation and formatting in FormNodeConfiguration.vue for better readability. - Updated FormKit component usage to ensure consistent styling and functionality in user and role selection dropdowns. - Enhanced computed properties for filtered users and roles to maintain consistent formatting. - Changed connection mode in ProcessFlowCanvas.vue from 'loose' to 'strict' to enforce stricter connection rules. - Improved comments in ProcessFlowCanvas.vue to clarify edge handling logic and preserve existing handle positions during updates. --- .../process-flow/FormNodeConfiguration.vue | 32 +++++++++---------- components/process-flow/ProcessFlowCanvas.vue | 17 +++++----- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/components/process-flow/FormNodeConfiguration.vue b/components/process-flow/FormNodeConfiguration.vue index 6be074c..a13e854 100644 --- a/components/process-flow/FormNodeConfiguration.vue +++ b/components/process-flow/FormNodeConfiguration.vue @@ -473,14 +473,14 @@
- + />

Select users who will be able to complete this form task

@@ -510,14 +510,14 @@
- + />

Select roles that will be able to complete this form task

@@ -904,11 +904,11 @@ const filteredAvailableUsers = computed(() => { return users.value .filter(user => !selectedUserIds.includes(String(user.userID))) .map(user => ({ - label: user.userFullName ? `${user.userFullName} (${user.userUsername})` : user.userUsername, + label: user.userFullName ? `${user.userFullName} (${user.userUsername})` : user.userUsername, value: String(user.userID), // Ensure value is a string - username: user.userUsername, - email: user.userEmail - })); + username: user.userUsername, + email: user.userEmail + })); }); // Computed property for available roles with filtering out already selected roles @@ -919,10 +919,10 @@ const filteredAvailableRoles = computed(() => { return roles.value .filter(role => !selectedRoleIds.includes(String(role.roleID))) .map(role => ({ - label: role.roleName, + label: role.roleName, value: String(role.roleID), // Ensure value is a string - description: role.roleDescription - })); + description: role.roleDescription + })); }); // Fetch users and roles data @@ -1046,7 +1046,7 @@ function handleUserSelection(userId) { selectedUserId.value = ''; // Save changes - saveChanges(); + saveChanges(); } else { console.warn('Selected user not found in filtered available users', userIdStr); diff --git a/components/process-flow/ProcessFlowCanvas.vue b/components/process-flow/ProcessFlowCanvas.vue index 8e577e8..363bdee 100644 --- a/components/process-flow/ProcessFlowCanvas.vue +++ b/components/process-flow/ProcessFlowCanvas.vue @@ -54,9 +54,9 @@ const { deleteKeyCode: 'Delete', selectionKeyCode: 'Shift', multiSelectionKeyCode: 'Control', - connectionMode: 'loose', + connectionMode: 'strict', isValidConnection: (connection) => { - // console.log('Validating connection:', connection); + console.log('Validating connection:', connection); return true; } }); @@ -76,7 +76,7 @@ const flowOptions = ref({ snapToGrid: true, snapGrid: [15, 15], edgeUpdaterRadius: 10, - connectionMode: 'loose', + connectionMode: 'strict', connectionRadius: 25, elevateEdgesOnSelect: true, nodesDraggable: true, @@ -282,7 +282,7 @@ watch(() => [props.initialEdges, nodes.value.length], async ([newEdges, nodeCoun if (edgesToAdd.length > 0) { // Ensure all edges have proper handle specifications const edgesWithHandles = edgesToAdd.map(edge => { - // If edge already has sourceHandle and targetHandle, use them + // IMPORTANT: If edge already has sourceHandle and targetHandle, preserve them exactly as they are if (edge.sourceHandle && edge.targetHandle) { return edge; } @@ -325,23 +325,22 @@ watch(() => [props.initialEdges, nodes.value.length], async ([newEdges, nodeCoun // console.log('ProcessFlowCanvas: Successfully added edges with handles:', edgesWithHandles.length); } - // Update existing edges that have changed + // Update existing edges that have changed - IMPORTANT: preserve handle positions newEdges.forEach(newEdge => { const existingEdge = edges.value.find(e => e.id === newEdge.id); if (existingEdge) { // Check if the edge has actually changed before updating const hasChanges = ( existingEdge.label !== newEdge.label || - existingEdge.sourceHandle !== newEdge.sourceHandle || - existingEdge.targetHandle !== newEdge.targetHandle || JSON.stringify(existingEdge.style) !== JSON.stringify(newEdge.style) ); if (hasChanges) { Object.assign(existingEdge, { label: newEdge.label, - sourceHandle: newEdge.sourceHandle, - targetHandle: newEdge.targetHandle, + // Preserve existing handles if they exist + sourceHandle: existingEdge.sourceHandle || newEdge.sourceHandle, + targetHandle: existingEdge.targetHandle || newEdge.targetHandle, style: newEdge.style ? { ...newEdge.style } : undefined }); }