diff --git a/components/process-flow/FormNodeConfiguration.vue b/components/process-flow/FormNodeConfiguration.vue index a8b4dc1..6be074c 100644 --- a/components/process-flow/FormNodeConfiguration.vue +++ b/components/process-flow/FormNodeConfiguration.vue @@ -458,7 +458,6 @@ { label: 'Dynamic (from Variable)', value: 'variable' } ]" placeholder="Select assignment type" - @input="handleAssignmentTypeChange" :classes="{ outer: 'mb-0' }" />

How should this task be assigned

@@ -472,15 +471,32 @@
- -

Selected users will be able to complete this form task

+ +
+ +

Select users who will be able to complete this form task

+
+ + +
+ +
+
+ {{ user.label }} + +
+
+
@@ -492,15 +508,32 @@
- -

Any user with the selected roles will be able to complete this form task

+ +
+ +

Select roles that will be able to complete this form task

+
+ + +
+ +
+
+ {{ role.label }} + +
+
+
@@ -623,6 +656,10 @@ const localNodeData = ref({ assignmentVariableType: 'user_id' }); +// New reactive state for selected user and role +const selectedUserId = ref(''); +const selectedRoleId = ref(''); + // Watch for changes from parent props watch(() => props.nodeData, async (newNodeData) => { if (newNodeData) { @@ -859,23 +896,33 @@ const processVariableOptions = computed(() => { const users = ref([]); const roles = ref([]); -// Computed property for available users (for FormKit select) -const availableUsers = computed(() => { - return users.value.map(user => ({ - label: user.userFullName ? `${user.userFullName} (${user.userUsername})` : user.userUsername, - value: user.userID, - username: user.userUsername, - email: user.userEmail - })); +// Computed property for available users with filtering out already selected users +const filteredAvailableUsers = computed(() => { + // Convert all IDs to strings for consistent comparison + const selectedUserIds = (localNodeData.value.assignedUsers || []).map(user => String(user.value)); + + return users.value + .filter(user => !selectedUserIds.includes(String(user.userID))) + .map(user => ({ + label: user.userFullName ? `${user.userFullName} (${user.userUsername})` : user.userUsername, + value: String(user.userID), // Ensure value is a string + username: user.userUsername, + email: user.userEmail + })); }); -// Computed property for available roles (for FormKit select) -const availableRoles = computed(() => { - return roles.value.map(role => ({ - label: role.roleName, - value: role.roleID, - description: role.roleDescription - })); +// Computed property for available roles with filtering out already selected roles +const filteredAvailableRoles = computed(() => { + // Convert all IDs to strings for consistent comparison + const selectedRoleIds = (localNodeData.value.assignedRoles || []).map(role => String(role.value)); + + return roles.value + .filter(role => !selectedRoleIds.includes(String(role.roleID))) + .map(role => ({ + label: role.roleName, + value: String(role.roleID), // Ensure value is a string + description: role.roleDescription + })); }); // Fetch users and roles data @@ -974,11 +1021,161 @@ function getStringValue(value) { } } -// Handle assignment type change -function handleAssignmentTypeChange() { - // Implementation of handleAssignmentTypeChange function - saveChanges(); +// Handle user selection from dropdown +function handleUserSelection(userId) { + if (userId) { + console.log('User selected:', userId, typeof userId); + + // Convert userId to string to ensure consistent comparison + const userIdStr = String(userId); + + // Find the selected user from available users + const selectedUser = filteredAvailableUsers.value.find(user => String(user.value) === userIdStr); + + if (selectedUser) { + console.log('Found user:', selectedUser); + // Initialize the array if needed + if (!localNodeData.value.assignedUsers) { + localNodeData.value.assignedUsers = []; + } + + // Add the user to the assigned users + localNodeData.value.assignedUsers.push({...selectedUser}); + + // Reset the selection + selectedUserId.value = ''; + + // Save changes + saveChanges(); + } else { + console.warn('Selected user not found in filtered available users', userIdStr); + + // Fallback: If we can't find the user in filtered list, try to find it in the original users list + const userFromOriginal = users.value.find(user => String(user.userID) === userIdStr); + + if (userFromOriginal) { + console.log('Found user in original users list:', userFromOriginal); + + // Add the user to the assigned users + const userToAdd = { + label: userFromOriginal.userFullName ? `${userFromOriginal.userFullName} (${userFromOriginal.userUsername})` : userFromOriginal.userUsername, + value: String(userFromOriginal.userID), + username: userFromOriginal.userUsername, + email: userFromOriginal.userEmail + }; + + if (!localNodeData.value.assignedUsers) { + localNodeData.value.assignedUsers = []; + } + + localNodeData.value.assignedUsers.push(userToAdd); + selectedUserId.value = ''; + saveChanges(); + } else { + console.error('User not found in any list. Available users:', users.value); + } + } + } } + +// Handle role selection from dropdown +function handleRoleSelection(roleId) { + if (roleId) { + console.log('Role selected:', roleId, typeof roleId); + + // Convert roleId to string to ensure consistent comparison + const roleIdStr = String(roleId); + + // Find the selected role from available roles + const selectedRole = filteredAvailableRoles.value.find(role => String(role.value) === roleIdStr); + + if (selectedRole) { + console.log('Found role:', selectedRole); + // Initialize the array if needed + if (!localNodeData.value.assignedRoles) { + localNodeData.value.assignedRoles = []; + } + + // Add the role to the assigned roles + localNodeData.value.assignedRoles.push({...selectedRole}); + + // Reset the selection + selectedRoleId.value = ''; + + // Save changes + saveChanges(); + } else { + console.warn('Selected role not found in filtered available roles', roleIdStr); + + // Fallback: If we can't find the role in filtered list, try to find it in the original roles list + const roleFromOriginal = roles.value.find(role => String(role.roleID) === roleIdStr); + + if (roleFromOriginal) { + console.log('Found role in original roles list:', roleFromOriginal); + + // Add the role to the assigned roles + const roleToAdd = { + label: roleFromOriginal.roleName, + value: String(roleFromOriginal.roleID), + description: roleFromOriginal.roleDescription + }; + + if (!localNodeData.value.assignedRoles) { + localNodeData.value.assignedRoles = []; + } + + localNodeData.value.assignedRoles.push(roleToAdd); + selectedRoleId.value = ''; + saveChanges(); + } else { + console.error('Role not found in any list. Available roles:', roles.value); + } + } + } +} + +// Function to remove an assigned user +function removeAssignedUser(index) { + if (localNodeData.value.assignedUsers) { + localNodeData.value.assignedUsers.splice(index, 1); + saveChanges(); + } +} + +// Function to remove an assigned role +function removeAssignedRole(index) { + if (localNodeData.value.assignedRoles) { + localNodeData.value.assignedRoles.splice(index, 1); + saveChanges(); + } +} + +// Watch for changes to assignment type +watch(() => localNodeData.value.assignmentType, (newType, oldType) => { + if (newType !== oldType) { + // Reset selections when assignment type changes + selectedUserId.value = ''; + selectedRoleId.value = ''; + + // If changing from users to another type, clear assigned users + if (oldType === 'users' && newType !== 'users') { + localNodeData.value.assignedUsers = []; + } + + // If changing from roles to another type, clear assigned roles + if (oldType === 'roles' && newType !== 'roles') { + localNodeData.value.assignedRoles = []; + } + + // If changing from variable to another type, clear assignment variable + if (oldType === 'variable' && newType !== 'variable') { + localNodeData.value.assignmentVariable = ''; + localNodeData.value.assignmentVariableType = 'user_id'; + } + + saveChanges(); + } +});