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 41633300f2..dfb6241e20 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 @@ -8,12 +8,10 @@ Layout, } from "@budibase/bbui" import { groups } from "stores/portal" - import { createEventDispatcher } from "svelte" import { Constants } from "@budibase/frontend-core" export let showOnboardingTypeModal const password = Math.random().toString(36).substring(2, 22) - const dispatch = createEventDispatcher() let disabled let userGroups = [] @@ -39,10 +37,8 @@ { - showOnboardingTypeModal() - dispatch("change", { users: userData, groups: userGroups }) - }} + onConfirm={async () => + showOnboardingTypeModal({ users: userData, groups: userGroups })} size="M" title="Add new user" confirmText="Add user" 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 e6c90ed46d..61fdc18811 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/index.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/index.svelte @@ -97,12 +97,15 @@ } }) } - function showOnboardingTypeModal() { + const showOnboardingTypeModal = async addUsersData => { + userData = await removingDuplicities(addUsersData) + if (!userData?.users?.length) return + onboardingTypeModal.show() } async function createUserFlow() { - let emails = userData.map(x => x.email) + let emails = userData?.users?.map(x => x.email) || [] try { const res = await users.invite({ emails: emails, @@ -117,8 +120,29 @@ } } + const removingDuplicities = async userData => { + const currentUserEmails = (await users.fetch())?.map(x => x.email) || [] + const newUsers = [] + + for (const user of userData?.users) { + const { email } = user + + if ( + newUsers.find(x => x.email === email) || + currentUserEmails.includes(email) + ) + continue + + newUsers.push(user) + } + + if (!newUsers.length) + notifications.info("Duplicated! There is no new users to add.") + return { ...userData, users: newUsers } + } + const createUsersFromCsv = async userCsvData => { - const { userEmails, usersRole, userGroups } = userCsvData + const { userEmails, usersRole, userGroups: groups } = userCsvData const users = [] for (const email of userEmails) { @@ -132,13 +156,15 @@ users.push(newUser) } - userData = { groups: userGroups, users: users } + userData = await removingDuplicities({ groups, users }) + if (!userData.users.length) return + return createUser() } async function createUser() { try { - await users.create(userData) + await users.create(await removingDuplicities(userData)) notifications.success("Successfully created user") await groups.actions.init() passwordModal.show() @@ -245,14 +271,7 @@ - (userData = e.detail)} - on:created={async () => { - pageInfo.reset() - await fetchUsers() - }} - {showOnboardingTypeModal} - /> + diff --git a/packages/builder/src/stores/portal/users.js b/packages/builder/src/stores/portal/users.js index 60738f94c8..4b7fe3ecb8 100644 --- a/packages/builder/src/stores/portal/users.js +++ b/packages/builder/src/stores/portal/users.js @@ -23,6 +23,10 @@ export function createUsersStore() { } } + const fetch = async () => { + return await API.getUsers() + } + async function invite({ emails, builder, admin }) { return API.inviteUsers({ emails, @@ -83,6 +87,7 @@ export function createUsersStore() { subscribe, search, get, + fetch, invite, acceptInvite, create,