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();
+ }
+});