From 5de520dc244327c6232236bf8cc7d9f22b36696e Mon Sep 17 00:00:00 2001 From: Mutasem Date: Thu, 17 Feb 2022 12:16:55 +0200 Subject: [PATCH 1/6] update users invite --- packages/editor-ui/src/Interface.ts | 8 ++++ packages/editor-ui/src/api/users.ts | 4 +- .../src/components/InviteUsersModal.vue | 41 ++++++++++++++----- packages/editor-ui/src/modules/users.ts | 5 ++- 4 files changed, 43 insertions(+), 15 deletions(-) diff --git a/packages/editor-ui/src/Interface.ts b/packages/editor-ui/src/Interface.ts index 40759c39c98ba..524af91d7ff6b 100644 --- a/packages/editor-ui/src/Interface.ts +++ b/packages/editor-ui/src/Interface.ts @@ -795,6 +795,14 @@ export interface IUserResponse { personalizationAnswers?: IPersonalizationSurveyAnswers | null; } +export interface IInviteResponse { + user: { + id: string; + email: string; + } + error?: string; +}; + export interface IUser extends IUserResponse { isDefaultUser: boolean; isCurrentUser: boolean; diff --git a/packages/editor-ui/src/api/users.ts b/packages/editor-ui/src/api/users.ts index 817f4ca0a99c3..4bf78792164f6 100644 --- a/packages/editor-ui/src/api/users.ts +++ b/packages/editor-ui/src/api/users.ts @@ -1,4 +1,4 @@ -import { IPersonalizationSurveyAnswers, IRestApiContext, IUserResponse } from '@/Interface'; +import { IInviteResponse, IPersonalizationSurveyAnswers, IRestApiContext, IUserResponse } from '@/Interface'; import { IDataObject } from 'n8n-workflow'; import { makeRestApiRequest } from './helpers'; @@ -59,7 +59,7 @@ export function getUsers(context: IRestApiContext): Promise { return makeRestApiRequest(context, 'GET', '/users'); } -export function inviteUsers(context: IRestApiContext, params: Array<{email: string}>): Promise>> { +export function inviteUsers(context: IRestApiContext, params: Array<{email: string}>): Promise> { return makeRestApiRequest(context, 'POST', '/users', params as unknown as IDataObject); } diff --git a/packages/editor-ui/src/components/InviteUsersModal.vue b/packages/editor-ui/src/components/InviteUsersModal.vue index f5cab923594e0..228b3d3f500b2 100644 --- a/packages/editor-ui/src/components/InviteUsersModal.vue +++ b/packages/editor-ui/src/components/InviteUsersModal.vue @@ -29,7 +29,7 @@ import mixins from "vue-typed-mixins"; import { showMessage } from "@/components/mixins/showMessage"; import Modal from "./Modal.vue"; import Vue from "vue"; -import { IFormInputs, IUserResponse } from "@/Interface"; +import { IFormInputs, IInviteResponse, IUserResponse } from "@/Interface"; import { VALID_EMAIL_REGEX, INVITE_USER_MODAL_KEY } from "@/constants"; import { ROLE } from "@/modules/userHelpers"; @@ -140,20 +140,39 @@ export default mixins(showMessage).extend({ throw new Error('No users to invite'); } - const invited: Array> = await this.$store.dispatch('users/inviteUsers', emails); - const invitedEmails = invited.reduce((accu, user) => { - if (user.email) { - return accu ? `${accu}, ${user.email}` : user.email; + const invited: Array = await this.$store.dispatch('users/inviteUsers', emails); + const invitedEmails = invited.reduce((accu, {user, error}) => { + if (!user.email && !user.id) { + return accu; + } + if (error) { + accu.error = accu.error ? `${accu.error}, ${user.email}` : user.email; + } + else { + accu.success = accu.success ? `${accu.success}, ${user.email}` : user.email; } return accu; - }, ''); - - this.$showMessage({ - type: 'success', - title: `User${invited.length > 1 ? 's' : ''} invited successfully`, - message: `An invite email was sent to ${invitedEmails}`, + }, { + success: '', + error: '', }); + if (invitedEmails.success) { + this.$showMessage({ + type: 'success', + title: `User${invited.length > 1 ? 's' : ''} invited successfully`, + message: `An invite email was sent to ${invitedEmails.success}`, + }); + } + + if (invitedEmails.error) { + this.$showMessage({ + type: 'error', + title: `User${invited.length > 1 ? 's' : ''} could not be invited`, + message: `Could not invite ${invitedEmails.error}`, + }); + } + this.modalBus.$emit('close'); } catch (error) { diff --git a/packages/editor-ui/src/modules/users.ts b/packages/editor-ui/src/modules/users.ts index 08c328c53e9cb..43b82b8aedf46 100644 --- a/packages/editor-ui/src/modules/users.ts +++ b/packages/editor-ui/src/modules/users.ts @@ -3,6 +3,7 @@ import { PERSONALIZATION_MODAL_KEY } from '@/constants'; import Vue from 'vue'; import { ActionContext, Module } from 'vuex'; import { + IInviteResponse, IPermissions, IPersonalizationSurveyAnswers, IRootState, @@ -178,9 +179,9 @@ const module: Module = { const users = await getUsers(context.rootGetters.getRestApiContext); context.commit('addUsers', users); }, - async inviteUsers(context: ActionContext, params: Array<{email: string}>): Promise>> { + async inviteUsers(context: ActionContext, params: Array<{email: string}>): Promise> { const users = await inviteUsers(context.rootGetters.getRestApiContext, params); - context.commit('addUsers', users); + context.commit('addUsers', users.map(({user}) => user)); return users; }, async reinviteUser(context: ActionContext, params: {id: string}) { From 6f8aa2573132c83de146dedd723a46e5f8760f26 Mon Sep 17 00:00:00 2001 From: Mutasem Date: Thu, 17 Feb 2022 12:26:38 +0200 Subject: [PATCH 2/6] fix notificaitons stacking on top of each other --- .../editor-ui/src/components/InviteUsersModal.vue | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/editor-ui/src/components/InviteUsersModal.vue b/packages/editor-ui/src/components/InviteUsersModal.vue index 228b3d3f500b2..43d8cfd33a885 100644 --- a/packages/editor-ui/src/components/InviteUsersModal.vue +++ b/packages/editor-ui/src/components/InviteUsersModal.vue @@ -166,11 +166,13 @@ export default mixins(showMessage).extend({ } if (invitedEmails.error) { - this.$showMessage({ - type: 'error', - title: `User${invited.length > 1 ? 's' : ''} could not be invited`, - message: `Could not invite ${invitedEmails.error}`, - }); + setTimeout(() => { + this.$showMessage({ // notifications stack on top of each other otherwise + type: 'error', + title: `User${invited.length > 1 ? 's' : ''} could not be invited`, + message: `Could not invite ${invitedEmails.error}`, + }); + }, 0); } this.modalBus.$emit('close'); From 5162d0ab8dd392cf6c3b8f742ee3286ed03b0c7a Mon Sep 17 00:00:00 2001 From: Mutasem Date: Thu, 17 Feb 2022 12:30:51 +0200 Subject: [PATCH 3/6] remove unnessary check --- packages/editor-ui/src/components/InviteUsersModal.vue | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/editor-ui/src/components/InviteUsersModal.vue b/packages/editor-ui/src/components/InviteUsersModal.vue index 43d8cfd33a885..25208f9a7297a 100644 --- a/packages/editor-ui/src/components/InviteUsersModal.vue +++ b/packages/editor-ui/src/components/InviteUsersModal.vue @@ -142,9 +142,6 @@ export default mixins(showMessage).extend({ const invited: Array = await this.$store.dispatch('users/inviteUsers', emails); const invitedEmails = invited.reduce((accu, {user, error}) => { - if (!user.email && !user.id) { - return accu; - } if (error) { accu.error = accu.error ? `${accu.error}, ${user.email}` : user.email; } From 8db7978ba7f10623300b35965d8e023905ddc965 Mon Sep 17 00:00:00 2001 From: Mutasem Date: Thu, 17 Feb 2022 12:33:01 +0200 Subject: [PATCH 4/6] fix type issues --- packages/editor-ui/src/Interface.ts | 4 ++-- packages/editor-ui/src/api/users.ts | 2 +- packages/editor-ui/src/components/InviteUsersModal.vue | 2 +- packages/editor-ui/src/modules/users.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/editor-ui/src/Interface.ts b/packages/editor-ui/src/Interface.ts index 524af91d7ff6b..87af38b49b80d 100644 --- a/packages/editor-ui/src/Interface.ts +++ b/packages/editor-ui/src/Interface.ts @@ -799,9 +799,9 @@ export interface IInviteResponse { user: { id: string; email: string; - } + }; error?: string; -}; +} export interface IUser extends IUserResponse { isDefaultUser: boolean; diff --git a/packages/editor-ui/src/api/users.ts b/packages/editor-ui/src/api/users.ts index 4bf78792164f6..ce194fb85e6ad 100644 --- a/packages/editor-ui/src/api/users.ts +++ b/packages/editor-ui/src/api/users.ts @@ -59,7 +59,7 @@ export function getUsers(context: IRestApiContext): Promise { return makeRestApiRequest(context, 'GET', '/users'); } -export function inviteUsers(context: IRestApiContext, params: Array<{email: string}>): Promise> { +export function inviteUsers(context: IRestApiContext, params: Array<{email: string}>): Promise { return makeRestApiRequest(context, 'POST', '/users', params as unknown as IDataObject); } diff --git a/packages/editor-ui/src/components/InviteUsersModal.vue b/packages/editor-ui/src/components/InviteUsersModal.vue index 25208f9a7297a..4f61d15ea6d56 100644 --- a/packages/editor-ui/src/components/InviteUsersModal.vue +++ b/packages/editor-ui/src/components/InviteUsersModal.vue @@ -140,7 +140,7 @@ export default mixins(showMessage).extend({ throw new Error('No users to invite'); } - const invited: Array = await this.$store.dispatch('users/inviteUsers', emails); + const invited: IInviteResponse[] = await this.$store.dispatch('users/inviteUsers', emails); const invitedEmails = invited.reduce((accu, {user, error}) => { if (error) { accu.error = accu.error ? `${accu.error}, ${user.email}` : user.email; diff --git a/packages/editor-ui/src/modules/users.ts b/packages/editor-ui/src/modules/users.ts index 43b82b8aedf46..5a6ceae30fff5 100644 --- a/packages/editor-ui/src/modules/users.ts +++ b/packages/editor-ui/src/modules/users.ts @@ -179,7 +179,7 @@ const module: Module = { const users = await getUsers(context.rootGetters.getRestApiContext); context.commit('addUsers', users); }, - async inviteUsers(context: ActionContext, params: Array<{email: string}>): Promise> { + async inviteUsers(context: ActionContext, params: Array<{email: string}>): Promise { const users = await inviteUsers(context.rootGetters.getRestApiContext, params); context.commit('addUsers', users.map(({user}) => user)); return users; From daa926dbe29c3be1d9a7eeebb8db921c068c5cc5 Mon Sep 17 00:00:00 2001 From: Mutasem Date: Thu, 17 Feb 2022 14:19:00 +0200 Subject: [PATCH 5/6] update structure --- .../src/components/InviteUsersModal.vue | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/editor-ui/src/components/InviteUsersModal.vue b/packages/editor-ui/src/components/InviteUsersModal.vue index 4f61d15ea6d56..bb5ec66ddcad5 100644 --- a/packages/editor-ui/src/components/InviteUsersModal.vue +++ b/packages/editor-ui/src/components/InviteUsersModal.vue @@ -143,31 +143,31 @@ export default mixins(showMessage).extend({ const invited: IInviteResponse[] = await this.$store.dispatch('users/inviteUsers', emails); const invitedEmails = invited.reduce((accu, {user, error}) => { if (error) { - accu.error = accu.error ? `${accu.error}, ${user.email}` : user.email; + accu.error.push(user.email); } else { - accu.success = accu.success ? `${accu.success}, ${user.email}` : user.email; + accu.success.push(user.email); } return accu; }, { - success: '', - error: '', + success: [], + error: [], }); - if (invitedEmails.success) { + if (invitedEmails.success.length) { this.$showMessage({ type: 'success', - title: `User${invited.length > 1 ? 's' : ''} invited successfully`, - message: `An invite email was sent to ${invitedEmails.success}`, + title: `User${invitedEmails.success.length > 1 ? 's' : ''} invited successfully`, + message: `An invite email was sent to ${invitedEmails.success.join(',')}`, }); } - if (invitedEmails.error) { + if (invitedEmails.error.length) { setTimeout(() => { this.$showMessage({ // notifications stack on top of each other otherwise type: 'error', - title: `User${invited.length > 1 ? 's' : ''} could not be invited`, - message: `Could not invite ${invitedEmails.error}`, + title: `User${invitedEmails.error.length > 1 ? 's' : ''} could not be invited`, + message: `Could not invite ${invitedEmails.error.join(',')}`, }); }, 0); } From ca0d6986bc764554adbf6acf4efb58d8c082ddd2 Mon Sep 17 00:00:00 2001 From: Mutasem Date: Thu, 17 Feb 2022 14:26:21 +0200 Subject: [PATCH 6/6] fix types --- packages/editor-ui/src/components/InviteUsersModal.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/editor-ui/src/components/InviteUsersModal.vue b/packages/editor-ui/src/components/InviteUsersModal.vue index bb5ec66ddcad5..12b9a01be4f88 100644 --- a/packages/editor-ui/src/components/InviteUsersModal.vue +++ b/packages/editor-ui/src/components/InviteUsersModal.vue @@ -150,8 +150,8 @@ export default mixins(showMessage).extend({ } return accu; }, { - success: [], - error: [], + success: [] as string[], + error: [] as string[], }); if (invitedEmails.success.length) {