+
{#if group?.users.length}
{#each group.users as user}
- removeUser(user._id)}
+ on:click={() => removeUser(user?._id)}
hoverable
size="L"
name="Close"
@@ -180,7 +150,7 @@
{/each}
{:else}
-
+
{/if}
@@ -190,24 +160,6 @@
margin-left: var(--spacing-l);
}
- .users-header {
- align-items: center;
- padding: var(--spacing-m) 0 var(--spacing-m) 0;
- display: flex;
- justify-content: space-between;
- }
-
- .user-selection {
- align-items: end;
- display: flex;
- justify-content: space-between;
- cursor: pointer;
- }
-
- .user-selection > :first-child {
- padding-top: var(--spacing-m);
- }
-
.header {
display: flex;
justify-content: space-between;
diff --git a/packages/builder/src/pages/builder/portal/manage/users/[userId].svelte b/packages/builder/src/pages/builder/portal/manage/users/[userId].svelte
index a8cb34046..f095cf8a9 100644
--- a/packages/builder/src/pages/builder/portal/manage/users/[userId].svelte
+++ b/packages/builder/src/pages/builder/portal/manage/users/[userId].svelte
@@ -2,43 +2,44 @@
import { goto } from "@roxi/routify"
import {
ActionButton,
+ ActionMenu,
+ Avatar,
Button,
Layout,
Heading,
Body,
- Divider,
Label,
+ List,
+ ListItem,
+ Icon,
Input,
+ MenuItem,
+ Popover,
Select,
- Toggle,
Modal,
- Table,
ModalContent,
notifications,
+ StatusLight,
} from "@budibase/bbui"
- import { fetchData } from "helpers"
- import { users, auth } from "stores/portal"
+ import { onMount } from "svelte"
- import TagsRenderer from "./_components/RolesTagsTableRenderer.svelte"
+ import { fetchData } from "helpers"
+ import { users, auth, groups } from "stores/portal"
+ import { Constants } from "@budibase/frontend-core"
- import UpdateRolesModal from "./_components/UpdateRolesModal.svelte"
import ForceResetPasswordModal from "./_components/ForceResetPasswordModal.svelte"
+ import { RoleUtils } from "@budibase/frontend-core"
+ import UserGroupPicker from "components/settings/UserGroupPicker.svelte"
export let userId
let deleteUserModal
- let editRolesModal
let resetPasswordModal
-
- const roleSchema = {
- name: { displayName: "App" },
- role: {},
- }
-
- const noRoleSchema = {
- name: { displayName: "App" },
- }
-
+ let popoverAnchor
+ let searchTerm = ""
+ let popover
+ let selectedGroups = []
$: defaultRoleId = $userFetch?.data?.builder?.global ? "ADMIN" : ""
+
// Merge the Apps list and the roles response to get something that makes sense for the table
$: allAppList = Object.keys($apps?.data).map(id => {
const roleId = $userFetch?.data?.roles?.[id] || defaultRoleId
@@ -50,19 +51,23 @@
}
})
+ // Used for searching through groups in the add group popover
+ $: filteredGroups = $groups.filter(
+ group =>
+ selectedGroups &&
+ group?.name?.toLowerCase().includes(searchTerm.toLowerCase())
+ )
+
$: appList = allAppList.filter(app => !!app.role[0])
- $: noRoleAppList = allAppList
- .filter(app => !app.role[0])
- .map(app => {
- delete app.role
- return app
- })
- let selectedApp
+ $: userGroups = $groups.filter(x => {
+ return x.users?.some(y => {
+ return y._id === userId
+ })
+ })
const userFetch = fetchData(`/api/global/users/${userId}`)
const apps = fetchData(`/api/global/roles`)
-
async function deleteUser() {
try {
await users.delete(userId)
@@ -73,8 +78,17 @@
}
}
- let toggleDisabled = false
-
+ function getHighestRole(roles) {
+ let highestRole
+ let highestRoleNumber = 0
+ roles.forEach(role => {
+ let roleNumber = RoleUtils.getRolePriority(role._id)
+ if (roleNumber > highestRoleNumber) {
+ highestRole = role
+ }
+ })
+ return highestRole
+ }
async function updateUserFirstName(evt) {
try {
await users.save({ ...$userFetch?.data, firstName: evt.target.value })
@@ -84,6 +98,13 @@
}
}
+ async function removeGroup(id) {
+ let updatedGroup = $groups.find(x => x._id === id)
+ let newUsers = updatedGroup.users.filter(user => user._id !== userId)
+ updatedGroup.users = newUsers
+ groups.actions.save(updatedGroup)
+ }
+
async function updateUserLastName(evt) {
try {
await users.save({ ...$userFetch?.data, lastName: evt.target.value })
@@ -93,6 +114,30 @@
}
}
+ async function updateUserRole() {
+ return
+ }
+
+ async function addGroup(groupId) {
+ let selectedGroup = selectedGroups.includes(groupId)
+ let newUser = $users.find(user => user._id === userId)
+ let group = $groups.find(group => group._id === groupId)
+
+ if (selectedGroup) {
+ selectedGroups = selectedGroups.filter(id => id === selectedGroup)
+ let newUsers = group.users.filter(user => user._id !== newUser._id)
+ group.users = newUsers
+ } else {
+ selectedGroups = [...selectedGroups, groupId]
+ group.users.push(newUser)
+ }
+
+ await groups.actions.save(group)
+ }
+
+ function addAll() {}
+
+ /*
async function toggleFlag(flagName, detail) {
toggleDisabled = true
try {
@@ -104,6 +149,7 @@
toggleDisabled = false
}
+
async function toggleBuilderAccess({ detail }) {
return toggleFlag("builder", detail)
}
@@ -116,38 +162,56 @@
selectedApp = detail
editRolesModal.show()
}
+*/
+ onMount(async () => {
+ try {
+ await groups.actions.init()
+ } catch (error) {
+ notifications.error("Error getting User groups")
+ }
+ })
-
+
- $goto("./")}
- quiet
- size="S"
- icon="BackAndroid"
- >
- Back to users
+ $goto("./")} size="S" icon="ArrowLeft">
+ Back
- User: {$userFetch?.data?.email}
-
- Change user settings and update their app roles. Also contains the ability
- to delete the user as well as force reset their password.
-
-
-
- General
-
-
-
- Configure roles
- Specify a role to grant access to an app.
-
+
+
+
+
+
+ User groups
+ Manage apps that this User group has been assigned to
+
+
+
+
+
+
+
+
+
+
+ {#if userGroups.length}
+ {#each userGroups as group}
+
+ {/each}
+ {:else}
+
+ {/if}
+
+
+
- No Access
- Apps do not appear in the users portal. Public pages may still be viewed
- if visited directly.
-
-
-
-
- Delete user
- Deleting a user completely removes them from your account.
+
+ Apps
+
+ Manage apps that this User group has been assigned to
+