diff --git a/ux/src/components/GroupEditOverlay.vue b/ux/src/components/GroupEditOverlay.vue index f34ef47d..92985692 100644 --- a/ux/src/components/GroupEditOverlay.vue +++ b/ux/src/components/GroupEditOverlay.vue @@ -1107,12 +1107,58 @@ async function refreshUsers () { state.isLoadingUsers = false } -function assignUser () { - +async function assignUser () { + $q.dialog({ + title: 'Assign User', + message: 'Enter user email:', + prompt: { model: '', type: 'email' }, + cancel: true, + persistent: false + }).onOk(async (email) => { + try { + // Find user by email + const resp = await APOLLO_CLIENT.query({ + query: gql`query($q:String!){users(query:$q){id name email}}`, + variables: { q: email }, + fetchPolicy: 'network-only' + }) + const user = resp?.data?.users?.[0] + if (!user) { + $q.notify({ type: 'negative', message: 'User not found' }) + return + } + // Assign to group + const result = await APOLLO_CLIENT.mutate({ + mutation: gql`mutation($g:UUID!,$u:UUID!){assignUserToGroup(groupId:$g,userId:$u){operation{succeeded message}}}`, + variables: { g: state.group.id, u: user.id } + }) + if (result?.data?.assignUserToGroup?.operation?.succeeded) { + $q.notify({ type: 'positive', message: `${user.name || user.email} added to group` }) + refreshUsers() + } else { + throw new Error(result?.data?.assignUserToGroup?.operation?.message || 'Failed') + } + } catch (err) { + $q.notify({ type: 'negative', message: err.message }) + } + }) } -function unassignUser () { - +async function unassignUser (row) { + try { + const result = await APOLLO_CLIENT.mutate({ + mutation: gql`mutation($g:UUID!,$u:UUID!){unassignUserFromGroup(groupId:$g,userId:$u){operation{succeeded message}}}`, + variables: { g: state.group.id, u: row.id } + }) + if (result?.data?.unassignUserFromGroup?.operation?.succeeded) { + $q.notify({ type: 'positive', message: `${row.name || row.email} removed from group` }) + refreshUsers() + } else { + throw new Error(result?.data?.unassignUserFromGroup?.operation?.message || 'Failed') + } + } catch (err) { + $q.notify({ type: 'negative', message: err.message }) + } } // MOUNTED