From bb626ce9249f2b9ca3fab27e52bc74ffea064498 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 2 Aug 2022 16:01:38 +0100 Subject: [PATCH 01/20] Fix crashing when determining roles when no apps exist --- packages/backend-core/src/security/roles.js | 23 ++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/backend-core/src/security/roles.js b/packages/backend-core/src/security/roles.js index 44dc4f2d3e..30869da68e 100644 --- a/packages/backend-core/src/security/roles.js +++ b/packages/backend-core/src/security/roles.js @@ -203,15 +203,24 @@ exports.getAllRoles = async appId => { if (appId) { return doWithDB(appId, internal) } else { - return internal(getAppDB()) + let appDB + try { + appDB = getAppDB() + } catch (error) { + // We don't have any apps, so we'll just use the built-in roles + } + return internal(appDB) } async function internal(db) { - const body = await db.allDocs( - getRoleParams(null, { - include_docs: true, - }) - ) - let roles = body.rows.map(row => row.doc) + let roles = [] + if (db) { + const body = await db.allDocs( + getRoleParams(null, { + include_docs: true, + }) + ) + roles = body.rows.map(row => row.doc) + } const builtinRoles = exports.getBuiltinRoles() // need to combine builtin with any DB record of them (for sake of permissions) From 5c688f355ceef1188c47a16eaf84852bc002ae0f Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 2 Aug 2022 16:06:20 +0100 Subject: [PATCH 02/20] Fix app list in user details page styles --- packages/bbui/src/List/ListItem.svelte | 10 ++++-- .../portal/manage/users/[userId].svelte | 34 ++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/bbui/src/List/ListItem.svelte b/packages/bbui/src/List/ListItem.svelte index 76a83e7b08..c9e4e397e2 100644 --- a/packages/bbui/src/List/ListItem.svelte +++ b/packages/bbui/src/List/ListItem.svelte @@ -9,11 +9,12 @@ export let avatar = false export let title = null export let subtitle = null + export let hoverable = false $: initials = avatar ? title?.[0] : null -
+
{#if icon}
@@ -39,11 +40,12 @@ .list-item { padding: 0 16px; height: 56px; - background: var(--spectrum-alias-background-color-tertiary); + background: var(--spectrum-global-color-gray-50); display: flex; flex-direction: row; justify-content: space-between; border: 1px solid var(--spectrum-global-color-gray-300); + transition: background 130ms ease-out; } .list-item:not(:first-child) { border-top: none; @@ -56,6 +58,10 @@ border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } + .hoverable:hover { + cursor: pointer; + background: var(--spectrum-global-color-gray-75); + } .left, .right { display: flex; 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 0f697a5007..aeea35f1fe 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/[userId].svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/[userId].svelte @@ -345,25 +345,22 @@ {#if allAppList.length} {#each allAppList as app} -
- -
- - {getRoleLabel(getHighestRole(app.roles))} - -
-
-
+
+ + {getRoleLabel(getHighestRole(app.roles))} + +
+ {/each} {:else} @@ -384,9 +381,6 @@ From e8fa134c7cc5d7ecb20e2cf051af502603d974ec Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 2 Aug 2022 16:41:15 +0100 Subject: [PATCH 05/20] Update styles in user details page and user list page --- .../portal/manage/users/[userId].svelte | 22 ++-- .../_components/RoleTableRenderer.svelte | 18 +-- .../builder/portal/manage/users/index.svelte | 117 +++++++----------- 3 files changed, 62 insertions(+), 95 deletions(-) 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 df228f8fbc..74a1629357 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/[userId].svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/[userId].svelte @@ -216,15 +216,13 @@ {#if loaded} - - -
- $goto("./")} icon="ArrowLeft"> - Back - -
-
- + +
+ $goto("./")} icon="ArrowLeft"> + Back + +
+
@@ -253,8 +251,6 @@
{/if}
- -
@@ -291,7 +287,7 @@
- User groups + User groups Add or remove this user from user groups
@@ -337,7 +333,7 @@
- Apps + Apps Manage apps that this user has been assigned to
diff --git a/packages/builder/src/pages/builder/portal/manage/users/_components/RoleTableRenderer.svelte b/packages/builder/src/pages/builder/portal/manage/users/_components/RoleTableRenderer.svelte index 4f481d374c..0a2daf7580 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/_components/RoleTableRenderer.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/_components/RoleTableRenderer.svelte @@ -3,14 +3,18 @@ import { Constants } from "@budibase/frontend-core" export let row - $: value = - Constants.BbRoles.find(x => x.value === users.getUserRole(row))?.label || - "Not Available" + + const TooltipMap = { + appUser: "Only has access to published apps", + developer: "Access to the app builder", + admin: "Full access", + } + + $: role = Constants.BbRoles.find(x => x.value === users.getUserRole(row)) + $: value = role?.label || "Not available" + $: tooltip = TooltipMap[role?.value] || "" -
+
{value}
- - diff --git a/packages/builder/src/pages/builder/portal/manage/users/index.svelte b/packages/builder/src/pages/builder/portal/manage/users/index.svelte index b6cac9ece3..b5b4881d14 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/index.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/index.svelte @@ -8,11 +8,9 @@ Layout, Modal, ModalContent, - Icon, + Search, notifications, Pagination, - Search, - Label, } from "@budibase/bbui" import AddUserModal from "./_components/AddUserModal.svelte" import { users, groups, auth } from "stores/portal" @@ -30,21 +28,6 @@ import { Constants } from "@budibase/frontend-core" import { get } from "svelte/store" - const accessTypes = [ - { - icon: "User", - description: "App user - Only has access to published apps", - }, - { - icon: "Hammer", - description: "Developer - Access to the app builder", - }, - { - icon: "Draw", - description: "Admin - Full access", - }, - ] - //let email let enrichedUsers = [] let createUserModal, @@ -236,19 +219,8 @@ Users Add users and control who gets access to your published apps - -
- {#each accessTypes as type} -
- -
- {type.description} -
-
- {/each} -
- +
- - -
- - -
+ Import users + +
+
+ {#if selectedRows.length > 0} {/if} - - $goto(`./${detail._id}`)} - {schema} - bind:selectedRows - data={enrichedUsers} - allowEditColumns={false} - allowEditRows={false} - allowSelectRows={true} - showHeaderBorder={false} - {customRenderers} - /> - - + + +
$goto(`./${detail._id}`)} + {schema} + bind:selectedRows + data={enrichedUsers} + allowEditColumns={false} + allowEditRows={false} + allowSelectRows={true} + showHeaderBorder={false} + {customRenderers} + /> + @@ -325,28 +301,19 @@ display: flex; flex-direction: row; justify-content: flex-end; - margin-top: var(--spacing-xl); } - .field { + .controls { display: flex; - align-items: center; flex-direction: row; - grid-gap: var(--spacing-m); - margin-left: auto; + justify-content: space-between; + align-items: center; } - - .field > :global(*) + :global(*) { - margin-left: var(--spacing-m); - } - - .access-description { + .controls-right { display: flex; - margin-top: var(--spacing-xl); - opacity: 0.8; - } - - .access-text { - margin-left: var(--spacing-m); + flex-direction: row; + justify-content: flex-end; + align-items: center; + gap: var(--spacing-xl); } From 9a442cb0cee2780e36dad99d2d681511b8ad2aaf Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 2 Aug 2022 16:44:37 +0100 Subject: [PATCH 06/20] Update delete rows button to be configurable --- .../backend/DataTable/buttons/DeleteRowsButton.svelte | 7 +++++-- .../src/pages/builder/portal/manage/users/index.svelte | 7 ++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/builder/src/components/backend/DataTable/buttons/DeleteRowsButton.svelte b/packages/builder/src/components/backend/DataTable/buttons/DeleteRowsButton.svelte index 3d662ed556..e70a0aa042 100644 --- a/packages/builder/src/components/backend/DataTable/buttons/DeleteRowsButton.svelte +++ b/packages/builder/src/components/backend/DataTable/buttons/DeleteRowsButton.svelte @@ -5,6 +5,7 @@ export let selectedRows export let deleteRows + export let item = "row" const dispatch = createEventDispatcher() let modal @@ -14,12 +15,14 @@ modal?.hide() dispatch("updaterows") } + + $: text = `${item}${selectedRows?.length === 1 ? "" : "s"}` Are you sure you want to delete {selectedRows.length} - row{selectedRows.length > 1 ? "s" : ""}? + {text}? diff --git a/packages/builder/src/pages/builder/portal/manage/users/index.svelte b/packages/builder/src/pages/builder/portal/manage/users/index.svelte index b5b4881d14..e48ace9160 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/index.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/index.svelte @@ -240,7 +240,12 @@
{#if selectedRows.length > 0} - + {/if}
From 05c57b1e6980e324bab07ab323f5aebdd37d5c79 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 2 Aug 2022 16:46:00 +0100 Subject: [PATCH 07/20] Fix type in import users modal --- .../portal/manage/users/_components/ImportUsersModal.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/builder/src/pages/builder/portal/manage/users/_components/ImportUsersModal.svelte b/packages/builder/src/pages/builder/portal/manage/users/_components/ImportUsersModal.svelte index bc8a0d1f1f..522d4cb826 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/_components/ImportUsersModal.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/_components/ImportUsersModal.svelte @@ -81,7 +81,7 @@ onConfirm={() => createUsersFromCsv({ userEmails, usersRole, userGroups })} disabled={!userEmails.length || !validEmails(userEmails) || !usersRole} > - Import your users email addrresses from a CSV + Import your users email addresses from a CSV
From 9d5fd239f0f68008740df917f460ac09a10aaf18 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 2 Aug 2022 18:47:00 +0100 Subject: [PATCH 08/20] Update users page to be narrow and remove name column --- packages/bbui/src/Table/Table.svelte | 13 ------------- .../pages/builder/portal/manage/_layout.svelte | 1 - .../_components/GroupsTableRenderer.svelte | 17 +++++------------ .../builder/portal/manage/users/index.svelte | 9 ++++----- 4 files changed, 9 insertions(+), 31 deletions(-) diff --git a/packages/bbui/src/Table/Table.svelte b/packages/bbui/src/Table/Table.svelte index c929e02d86..01a2ca4835 100644 --- a/packages/bbui/src/Table/Table.svelte +++ b/packages/bbui/src/Table/Table.svelte @@ -503,12 +503,6 @@ .spectrum-Table-headCell--alignRight { justify-content: flex-end; } - .spectrum-Table-headCell--divider { - padding-right: var(--cell-padding); - } - .spectrum-Table-headCell--divider + .spectrum-Table-headCell { - padding-left: var(--cell-padding); - } .spectrum-Table-headCell--edit { position: sticky; left: 0; @@ -580,13 +574,6 @@ background-color: var(--table-bg); z-index: auto; } - .spectrum-Table-cell--divider { - padding-right: var(--cell-padding); - } - .spectrum-Table-cell--divider + .spectrum-Table-cell { - padding-left: var(--cell-padding); - } - .spectrum-Table-cell--edit { position: sticky; left: 0; diff --git a/packages/builder/src/pages/builder/portal/manage/_layout.svelte b/packages/builder/src/pages/builder/portal/manage/_layout.svelte index a63195a214..47d9aaf59e 100644 --- a/packages/builder/src/pages/builder/portal/manage/_layout.svelte +++ b/packages/builder/src/pages/builder/portal/manage/_layout.svelte @@ -12,7 +12,6 @@ $: wide = $page.path.includes("email/:template") || - ($page.path.includes("users") && !$page.path.includes(":userId")) || ($page.path.includes("groups") && !$page.path.includes(":groupId")) diff --git a/packages/builder/src/pages/builder/portal/manage/users/_components/GroupsTableRenderer.svelte b/packages/builder/src/pages/builder/portal/manage/users/_components/GroupsTableRenderer.svelte index 772b5fe7b9..b334575669 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/_components/GroupsTableRenderer.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/_components/GroupsTableRenderer.svelte @@ -1,5 +1,6 @@ @@ -7,17 +8,9 @@
- {#if value?.length === 0} -
0
- {:else if value?.length === 1} -
- {value[0]?.name} -
- {:else} -
- {parseInt(value?.length) || 0} groups -
- {/if} +
+ {value?.length || 0} +
From 2ec20301385cb04bc40b90dc3475e0004807f056 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 2 Aug 2022 19:43:01 +0100 Subject: [PATCH 12/20] Fix typo --- .../portal/manage/users/_components/PasswordModal.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/builder/src/pages/builder/portal/manage/users/_components/PasswordModal.svelte b/packages/builder/src/pages/builder/portal/manage/users/_components/PasswordModal.svelte index 01dac8c222..02501f2de0 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/_components/PasswordModal.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/_components/PasswordModal.svelte @@ -49,10 +49,10 @@ cancelText="Cancel" showCloseIcon={false} > - All your new users can be accessed through the autogenerated passwords. - Make not of these passwords or download the csv + + All your new users can be accessed through the autogenerated passwords. Take + note of these passwords or download the CSV file. +
From 15176d68f6571cf272f99b84baf9913f4a582f90 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 2 Aug 2022 19:49:15 +0100 Subject: [PATCH 13/20] More improvements to user pages --- .../users/_components/AddUserModal.svelte | 4 ++-- .../users/_components/ImportUsersModal.svelte | 17 ++++++++++------- .../builder/portal/manage/users/index.svelte | 3 +++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte b/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte index 44ec8085a6..184ff13eaf 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte @@ -72,8 +72,8 @@ createUsersFromCsv({ userEmails, usersRole, userGroups })} disabled={!userEmails.length || !validEmails(userEmails) || !usersRole} > - Import your users email addresses from a CSV + Import your users email addresses from a CSV file
@@ -98,8 +98,8 @@ {#if hasGroupsLicense} option.name} getOptionValue={option => option._id} @@ -122,14 +122,12 @@ label { font-family: var(--font-sans); - cursor: pointer; font-weight: 600; box-sizing: border-box; overflow: hidden; border-radius: var(--border-radius-s); color: var(--ink); padding: var(--spacing-m) var(--spacing-l); - transition: all 0.2s ease 0s; display: inline-flex; text-rendering: optimizeLegibility; min-width: auto; @@ -141,10 +139,15 @@ align-items: center; justify-content: center; width: 100%; - background-color: var(--grey-2); - font-size: var(--font-size-xs); + background: var(--spectrum-global-color-gray-200); + font-size: 12px; line-height: normal; border: var(--border-transparent); + transition: background-color 130ms ease-out; + } + label:hover { + background: var(--spectrum-global-color-gray-300); + cursor: pointer; } input[type="file"] { diff --git a/packages/builder/src/pages/builder/portal/manage/users/index.svelte b/packages/builder/src/pages/builder/portal/manage/users/index.svelte index ebe020aade..745006aef5 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/index.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/index.svelte @@ -319,4 +319,7 @@ align-items: center; gap: var(--spacing-xl); } + .controls-right :global(.spectrum-Search) { + width: 200px; + } From 546c45570dfe3ad56d3b745046279c0aa2dbb840 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 2 Aug 2022 20:03:39 +0100 Subject: [PATCH 14/20] Prevent showing any mention of groups when groups are not enabled both the platform and license level --- .../pages/builder/portal/apps/index.svelte | 7 +----- .../builder/portal/manage/groups/index.svelte | 21 +++++++---------- .../portal/manage/users/[userId].svelte | 10 ++------ .../users/_components/AddUserModal.svelte | 5 +--- .../users/_components/ImportUsersModal.svelte | 7 ++---- .../builder/portal/manage/users/index.svelte | 15 +++--------- .../overview/_components/AccessTab.svelte | 11 +++------ .../_components/AssignmentModal.svelte | 23 +++++++++++-------- packages/builder/src/stores/portal/auth.js | 8 +++++++ 9 files changed, 41 insertions(+), 66 deletions(-) diff --git a/packages/builder/src/pages/builder/portal/apps/index.svelte b/packages/builder/src/pages/builder/portal/apps/index.svelte index 0d05e170e0..a089664d2e 100644 --- a/packages/builder/src/pages/builder/portal/apps/index.svelte +++ b/packages/builder/src/pages/builder/portal/apps/index.svelte @@ -27,7 +27,6 @@ import { AppStatus } from "constants" import Logo from "assets/bb-space-man.svg" import AccessFilter from "./_components/AcessFilter.svelte" - import { Constants } from "@budibase/frontend-core" let sortBy = "name" let template @@ -69,10 +68,6 @@ $: unlocked = lockedApps?.length === 0 $: automationErrors = getAutomationErrors(enrichedApps) - $: hasGroupsLicense = $auth.user?.license.features.includes( - Constants.Features.USER_GROUPS - ) - const enrichApps = (apps, user, sortBy) => { const enrichedApps = apps.map(app => ({ ...app, @@ -360,7 +355,7 @@ {/if}
- {#if hasGroupsLicense && $groups.length} + {#if $auth.groupsEnabled && $groups.length} {/if}
diff --git a/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte b/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte index e86943c106..165d94e0b5 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte @@ -47,7 +47,11 @@ function validateInput(email, index) { if (email) { const res = emailValidator(email) - userData[index].error = res === true ? null : res + if (res === true) { + delete userData[index].error + } else { + userData[index].error = res + } } else { userData[index].error = "Please enter an email address" } @@ -89,7 +93,7 @@ inputType="email" bind:inputValue={input.email} bind:dropdownValue={input.role} - options={Constants.BbRoles} + options={Constants.BudibaseRoleOptions} error={input.error} on:blur={() => validateInput(input.email, index)} /> diff --git a/packages/builder/src/pages/builder/portal/manage/users/_components/RoleTableRenderer.svelte b/packages/builder/src/pages/builder/portal/manage/users/_components/RoleTableRenderer.svelte index 0a2daf7580..fe7acee6c4 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/_components/RoleTableRenderer.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/_components/RoleTableRenderer.svelte @@ -10,7 +10,9 @@ admin: "Full access", } - $: role = Constants.BbRoles.find(x => x.value === users.getUserRole(row)) + $: role = Constants.BudibaseRoleOptions.find( + x => x.value === users.getUserRole(row) + ) $: value = role?.label || "Not available" $: tooltip = TooltipMap[role?.value] || "" diff --git a/packages/builder/src/pages/builder/portal/manage/users/index.svelte b/packages/builder/src/pages/builder/portal/manage/users/index.svelte index a33ef55c61..73cf5e26fa 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/index.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/index.svelte @@ -26,6 +26,7 @@ import ImportUsersModal from "./_components/ImportUsersModal.svelte" import { createPaginationStore } from "helpers/pagination" import { get } from "svelte/store" + import { Constants } from "@budibase/frontend-core" let enrichedUsers = [] let createUserModal, @@ -85,13 +86,13 @@ } async function createUserFlow() { - let emails = userData?.users?.map(x => x.email) || [] + const payload = userData?.users?.map(user => ({ + email: user.email, + builder: user.role === Constants.BudibaseRoles.Developer, + admin: user.role === Constants.BudibaseRoles.Admin, + })) try { - const res = await users.invite({ - emails: emails, - builder: false, - admin: false, - }) + const res = await users.invite(payload) notifications.success(res.message) inviteConfirmationModal.show() } catch (error) { diff --git a/packages/builder/src/stores/portal/users.js b/packages/builder/src/stores/portal/users.js index 490d1bc9f6..7fc3704e98 100644 --- a/packages/builder/src/stores/portal/users.js +++ b/packages/builder/src/stores/portal/users.js @@ -26,12 +26,8 @@ export function createUsersStore() { return await API.getUsers() } - async function invite({ emails, builder, admin }) { - return API.inviteUsers({ - emails, - builder, - admin, - }) + async function invite(payload) { + return API.inviteUsers(payload) } async function acceptInvite(inviteCode, password) { return API.acceptInvite({ diff --git a/packages/frontend-core/src/api/user.js b/packages/frontend-core/src/api/user.js index 17223a80e6..56f0537b97 100644 --- a/packages/frontend-core/src/api/user.js +++ b/packages/frontend-core/src/api/user.js @@ -141,20 +141,18 @@ export const buildUserEndpoints = API => ({ /** * Invites multiple users to the current tenant. - * @param email An array of email addresses - * @param builder whether the user should be a global builder - * @param admin whether the user should be a global admin + * @param users An array of users to invite */ - inviteUsers: async ({ emails, builder, admin }) => { + inviteUsers: async users => { return await API.post({ url: "/api/global/users/inviteMultiple", - body: { - emails, + body: users.map(user => ({ + email: user.email, userInfo: { - admin: admin ? { global: true } : undefined, - builder: builder ? { global: true } : undefined, + admin: user.admin ? { global: true } : undefined, + builder: user.admin || user.builder ? { global: true } : undefined, }, - }, + })), }) }, diff --git a/packages/frontend-core/src/constants.js b/packages/frontend-core/src/constants.js index 77765f8d6e..4ad4f0fef8 100644 --- a/packages/frontend-core/src/constants.js +++ b/packages/frontend-core/src/constants.js @@ -60,25 +60,31 @@ export const TableNames = { USERS: "ta_users", } -export const BbRoles = [ - { label: "App User", value: "appUser" }, - { label: "Developer", value: "developer" }, - { label: "Admin", value: "admin" }, +export const BudibaseRoles = { + AppUser: "appUser", + Developer: "developer", + Admin: "admin", +} + +export const BudibaseRoleOptions = [ + { label: "App User", value: BudibaseRoles.AppUser }, + { label: "Developer", value: BudibaseRoles.Developer }, + { label: "Admin", value: BudibaseRoles.Admin }, ] export const BuilderRoleDescriptions = [ { - value: "appUser", + value: BudibaseRoles.AppUser, icon: "User", label: "App user - Only has access to published apps", }, { - value: "developer", + value: BudibaseRoles.Developer, icon: "Hammer", label: "Developer - Access to the app builder", }, { - value: "admin", + value: BudibaseRoles.Admin, icon: "Draw", label: "Admin - Full access", }, diff --git a/packages/worker/src/api/controllers/global/users.ts b/packages/worker/src/api/controllers/global/users.ts index 30bf78efc6..f5e551130e 100644 --- a/packages/worker/src/api/controllers/global/users.ts +++ b/packages/worker/src/api/controllers/global/users.ts @@ -214,13 +214,13 @@ export const invite = async (ctx: any) => { } export const inviteMultiple = async (ctx: any) => { - let { emails, userInfo } = ctx.request.body + let users = ctx.request.body let existing = false let existingEmail - for (let email of emails) { - if (await usersCore.getGlobalUserByEmail(email)) { + for (let user of users) { + if (await usersCore.getGlobalUserByEmail(user.email)) { existing = true - existingEmail = email + existingEmail = user.email break } } @@ -228,17 +228,19 @@ export const inviteMultiple = async (ctx: any) => { if (existing) { ctx.throw(400, `${existingEmail} already exists`) } - if (!userInfo) { - userInfo = {} - } - userInfo.tenantId = tenancy.getTenantId() - const opts: any = { - subject: "{{ company }} platform invitation", - info: userInfo, - } - for (let i = 0; i < emails.length; i++) { - await sendEmail(emails[i], EmailTemplatePurpose.INVITATION, opts) + for (let i = 0; i < users.length; i++) { + let userInfo = users[i].userInfo + if (!userInfo) { + userInfo = {} + } + userInfo.tenantId = tenancy.getTenantId() + const opts: any = { + subject: "{{ company }} platform invitation", + info: userInfo, + } + console.log(userInfo) + await sendEmail(users[i].email, EmailTemplatePurpose.INVITATION, opts) } ctx.body = { diff --git a/packages/worker/src/api/routes/global/users.js b/packages/worker/src/api/routes/global/users.js index e62e996443..7e8aee1b9e 100644 --- a/packages/worker/src/api/routes/global/users.js +++ b/packages/worker/src/api/routes/global/users.js @@ -32,10 +32,12 @@ function buildInviteValidation() { function buildInviteMultipleValidation() { // prettier-ignore - return joiValidator.body(Joi.object({ - emails: Joi.array().required(), - userInfo: Joi.object().optional(), - }).required()) + return joiValidator.body(Joi.array().required().items( + Joi.object({ + email: Joi.string(), + userInfo: Joi.object().optional(), + }) + )) } function buildInviteAcceptValidation() { From b60a1ad7b0e7c197871f01499f0d06140be92785 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 3 Aug 2022 19:20:18 +0100 Subject: [PATCH 19/20] Remove log --- packages/worker/src/api/controllers/global/users.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/worker/src/api/controllers/global/users.ts b/packages/worker/src/api/controllers/global/users.ts index f5e551130e..1f9af3514b 100644 --- a/packages/worker/src/api/controllers/global/users.ts +++ b/packages/worker/src/api/controllers/global/users.ts @@ -239,7 +239,6 @@ export const inviteMultiple = async (ctx: any) => { subject: "{{ company }} platform invitation", info: userInfo, } - console.log(userInfo) await sendEmail(users[i].email, EmailTemplatePurpose.INVITATION, opts) } From 115ef53f82b489636f0fcbffc8c24ee1e9bee0a3 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 3 Aug 2022 19:20:33 +0100 Subject: [PATCH 20/20] Update multi-user invite endpoint --- packages/frontend-core/src/api/user.js | 2 +- packages/worker/src/api/routes/global/users.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/frontend-core/src/api/user.js b/packages/frontend-core/src/api/user.js index 56f0537b97..653376aa55 100644 --- a/packages/frontend-core/src/api/user.js +++ b/packages/frontend-core/src/api/user.js @@ -145,7 +145,7 @@ export const buildUserEndpoints = API => ({ */ inviteUsers: async users => { return await API.post({ - url: "/api/global/users/inviteMultiple", + url: "/api/global/users/multi/invite", body: users.map(user => ({ email: user.email, userInfo: { diff --git a/packages/worker/src/api/routes/global/users.js b/packages/worker/src/api/routes/global/users.js index 7e8aee1b9e..cf1674c031 100644 --- a/packages/worker/src/api/routes/global/users.js +++ b/packages/worker/src/api/routes/global/users.js @@ -81,7 +81,7 @@ router controller.invite ) .post( - "/api/global/users/inviteMultiple", + "/api/global/users/multi/invite", adminOnly, buildInviteMultipleValidation(), controller.inviteMultiple