diff --git a/packages/builder/src/components/common/RoleSelect.svelte b/packages/builder/src/components/common/RoleSelect.svelte index 3d84ef2e22..82752554d5 100644 --- a/packages/builder/src/components/common/RoleSelect.svelte +++ b/packages/builder/src/components/common/RoleSelect.svelte @@ -23,7 +23,6 @@ const dispatch = createEventDispatcher() const RemoveID = "remove" - const CreatorID = "CREATOR" $: options = getOptions( $roles, @@ -47,7 +46,7 @@ if (allowCreator) { newRoles = [ { - _id: CreatorID, + _id: Constants.Roles.CREATOR, name: "Creator", tag: !$licensing.perAppBuildersEnabled && @@ -88,8 +87,6 @@ const onChange = e => { if (allowRemove && e.detail === RemoveID) { dispatch("remove") - } else if (e.detail === CreatorID) { - dispatch("addcreator") } else { dispatch("change", e.detail) } @@ -112,7 +109,8 @@ getOptionColour={getColor} getOptionIcon={getIcon} isOptionEnabled={option => - option._id !== CreatorID || $licensing.perAppBuildersEnabled} + option._id !== Constants.Roles.CREATOR || + $licensing.perAppBuildersEnabled} {placeholder} {error} /> @@ -131,7 +129,8 @@ getOptionColour={getColor} getOptionIcon={getIcon} isOptionEnabled={option => - option._id !== CreatorID || $licensing.perAppBuildersEnabled} + option._id !== Constants.Roles.CREATOR || + $licensing.perAppBuildersEnabled} {placeholder} {error} /> diff --git a/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte b/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte index b304140a8d..3e6741e920 100644 --- a/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte @@ -81,17 +81,15 @@ filteredInvites.sort(sortInviteRoles) return } - filteredInvites = appInvites - .filter(invite => { - const inviteInfo = invite.info?.apps - if (!query && inviteInfo && prodAppId) { - return Object.keys(inviteInfo).includes(prodAppId) - } - return invite.email.includes(query) - }) - .sort(sortInviteRoles) + filteredInvites = appInvites.filter(invite => { + const inviteInfo = invite.info?.apps + if (!query && inviteInfo && prodAppId) { + return Object.keys(inviteInfo).includes(prodAppId) + } + return invite.email.includes(query) + }) + filteredInvites.sort(sortInviteRoles) } - $: filterByAppAccess, prodAppId, filterInvites(query) $: if (searchFocus === true) { filterByAppAccess = false @@ -122,21 +120,22 @@ await usersFetch.refresh() filteredUsers = $usersFetch.rows + .filter(user => !user?.admin?.global) // filter out global admins .map(user => { const isAdminOrGlobalBuilder = sdk.users.isAdminOrGlobalBuilder( user, prodAppId ) const isAppBuilder = sdk.users.hasAppBuilderPermissions(user, prodAppId) - let role = undefined + let role if (isAdminOrGlobalBuilder) { role = Constants.Roles.ADMIN } else if (isAppBuilder) { role = Constants.Roles.CREATOR } else { - const appRole = Object.keys(user.roles).find(x => x === prodAppId) + const appRole = user.roles[prodAppId] if (appRole) { - role = user.roles[appRole] + role = appRole } } @@ -617,9 +616,6 @@ allowPublic={false} allowCreator={true} quiet={true} - on:addcreator={() => { - onUpdateUserInvite(invite, Constants.Roles.CREATOR) - }} on:change={e => { onUpdateUserInvite(invite, e.detail) }} @@ -673,10 +669,11 @@ quiet={true} allowCreator={true} on:change={e => { - onUpdateGroup(group, e.detail) - }} - on:addcreator={() => { - addGroupAppBuilder(group._id) + if (e.detail === Constants.Roles.CREATOR) { + addGroupAppBuilder(group._id) + } else { + onUpdateGroup(group, e.detail) + } }} on:remove={() => { onUpdateGroup(group) @@ -712,11 +709,13 @@ allowPublic={false} allowCreator={true} quiet={true} - on:addcreator={() => { - addAppBuilder(user._id) - }} + on:addcreator={() => {}} on:change={e => { - onUpdateUser(user, e.detail) + if (e.detail === Constants.Roles.CREATOR) { + addAppBuilder(user._id) + } else { + onUpdateUser(user, e.detail) + } }} on:remove={() => { onUpdateUser(user) diff --git a/packages/builder/src/pages/builder/portal/users/groups/[groupId].svelte b/packages/builder/src/pages/builder/portal/users/groups/[groupId].svelte index 6a4364c414..793ba5c09f 100644 --- a/packages/builder/src/pages/builder/portal/users/groups/[groupId].svelte +++ b/packages/builder/src/pages/builder/portal/users/groups/[groupId].svelte @@ -21,6 +21,7 @@ import GroupIcon from "./_components/GroupIcon.svelte" import GroupUsers from "./_components/GroupUsers.svelte" import { sdk } from "@budibase/shared-core" + import { Constants } from "@budibase/frontend-core" export let groupId @@ -45,7 +46,7 @@ let loaded = false let editModal, deleteModal - + $: console.log(group) $: scimEnabled = $features.isScimEnabled $: readonly = !sdk.users.isAdmin($auth.user) || scimEnabled $: group = $groups.find(x => x._id === groupId) @@ -57,8 +58,11 @@ ) .map(app => ({ ...app, - role: group?.roles?.[apps.getProdAppID(app.devId)], + role: group?.builder?.apps.includes(apps.getProdAppID(app.devId)) + ? Constants.Roles.CREATOR + : group?.roles?.[apps.getProdAppID(app.devId)], })) + $: console.log(groupApps) $: { if (loaded && !group?._id) { $goto("./") diff --git a/packages/builder/src/pages/builder/portal/users/groups/_components/GroupAppsTableRenderer.svelte b/packages/builder/src/pages/builder/portal/users/groups/_components/GroupAppsTableRenderer.svelte index 51f4d7f77c..48b1bfbce6 100644 --- a/packages/builder/src/pages/builder/portal/users/groups/_components/GroupAppsTableRenderer.svelte +++ b/packages/builder/src/pages/builder/portal/users/groups/_components/GroupAppsTableRenderer.svelte @@ -1,9 +1,19 @@
diff --git a/packages/builder/src/pages/builder/portal/users/users/[userId].svelte b/packages/builder/src/pages/builder/portal/users/users/[userId].svelte index 5ae6d7cb9d..e1f1c0e3a9 100644 --- a/packages/builder/src/pages/builder/portal/users/users/[userId].svelte +++ b/packages/builder/src/pages/builder/portal/users/users/[userId].svelte @@ -120,11 +120,7 @@ name: app.name, devId: app.devId, icon: app.icon, - role: privileged - ? Constants.Roles.ADMIN - : user?.builder?.apps.includes(prodAppId) - ? Constants.Roles.CREATOR - : roles[prodAppId], + role: getRole(prodAppId, roles), } }) } @@ -137,6 +133,18 @@ return groups.filter(group => group.name?.toLowerCase().includes(search)) } + const getRole = (prodAppId, roles) => { + if (privileged) { + return Constants.Roles.ADMIN + } + + if (user?.builder?.apps.includes(prodAppId)) { + return Constants.Roles.CREATOR + } + + return roles[prodAppId] + } + const getNameLabel = user => { const { firstName, lastName, email } = user || {} if (!firstName && !lastName) { diff --git a/packages/builder/src/pages/builder/portal/users/users/_components/AppsTableRenderer.svelte b/packages/builder/src/pages/builder/portal/users/users/_components/AppsTableRenderer.svelte index b454d2668c..b7bb810aba 100644 --- a/packages/builder/src/pages/builder/portal/users/users/_components/AppsTableRenderer.svelte +++ b/packages/builder/src/pages/builder/portal/users/users/_components/AppsTableRenderer.svelte @@ -5,13 +5,22 @@ export let value export let row - + $: console.log(row) $: priviliged = sdk.users.isAdminOrBuilder(row) - $: count = priviliged - ? $apps.length - : sdk.users.hasAppBuilderPermissions(row) - ? row?.builder?.apps?.length - : value?.length || 0 + $: count = getCount(row) + + const getCount = () => { + if (priviliged) { + return $apps.length + } else { + return sdk.users.hasAppBuilderPermissions(row) + ? row.builder.apps.length + + Object.keys(row.roles || {}).filter(appId => + row.builder.apps.includes(appId) + ).length + : value?.length || 0 + } + }
diff --git a/packages/builder/src/stores/portal/groups.js b/packages/builder/src/stores/portal/groups.js index a37a216a7f..a505029627 100644 --- a/packages/builder/src/stores/portal/groups.js +++ b/packages/builder/src/stores/portal/groups.js @@ -78,7 +78,11 @@ export function createGroupsStore() { }, getGroupAppIds: group => { - return Object.keys(group?.roles || {}) + let groupAppIds = Object.keys(group?.roles || {}) + if (group?.builder?.apps) { + groupAppIds = groupAppIds.concat(group.builder.apps) + } + return groupAppIds }, addGroupAppBuilder: async (groupId, appId) => { diff --git a/packages/frontend-core/src/api/user.js b/packages/frontend-core/src/api/user.js index 27b17ca60b..329e9cc499 100644 --- a/packages/frontend-core/src/api/user.js +++ b/packages/frontend-core/src/api/user.js @@ -163,7 +163,7 @@ export const buildUserEndpoints = API => ({ admin: admin ? { global: true } : undefined, builder: builder ? { global: true } : undefined, apps: apps ? apps : undefined, - appBuilders: appBuilders ? appBuilders : undefined, + appBuilders, }, } }), @@ -181,7 +181,7 @@ export const buildUserEndpoints = API => ({ url: `/api/global/users/invite/update/${invite.code}`, body: { apps: invite.apps, - appBuilders: invite.appBuilders ? invite.appBuilders : undefined, + appBuilders: invite.appBuilders, }, }) }, diff --git a/packages/worker/src/api/controllers/global/users.ts b/packages/worker/src/api/controllers/global/users.ts index 5cf6bf857f..0ccf9a356f 100644 --- a/packages/worker/src/api/controllers/global/users.ts +++ b/packages/worker/src/api/controllers/global/users.ts @@ -417,6 +417,7 @@ export const inviteAccept = async ( if (info.appBuilders) { builder.apps = info.appBuilders request.builder = builder + delete info.appBuilders } delete info.apps request = {