From f71bf5da30cb6f063fc8366edd3fbf4531bbd125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 8 Jun 2022 10:48:03 +0200 Subject: [PATCH 01/31] Add 'isAdmin' property to 'UserAdmin' and 'AdminResolver', 'searchUsers' --- backend/src/graphql/model/UserAdmin.ts | 4 ++++ backend/src/graphql/resolver/AdminResolver.ts | 10 +++++++++- backend/src/seeds/graphql/queries.ts | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/backend/src/graphql/model/UserAdmin.ts b/backend/src/graphql/model/UserAdmin.ts index 8a1459c0f..cf3663e70 100644 --- a/backend/src/graphql/model/UserAdmin.ts +++ b/backend/src/graphql/model/UserAdmin.ts @@ -14,6 +14,7 @@ export class UserAdmin { this.hasElopage = hasElopage this.deletedAt = user.deletedAt this.emailConfirmationSend = emailConfirmationSend + this.isAdmin = user.isAdmin } @Field(() => Number) @@ -42,6 +43,9 @@ export class UserAdmin { @Field(() => String, { nullable: true }) emailConfirmationSend?: string + + @Field(() => Date, { nullable: true }) + isAdmin: Date | null } @ObjectType() diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 4c94e48c8..78dcfb7e1 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -67,7 +67,15 @@ export class AdminResolver { } } - const userFields = ['id', 'firstName', 'lastName', 'email', 'emailChecked', 'deletedAt'] + const userFields = [ + 'id', + 'firstName', + 'lastName', + 'email', + 'emailChecked', + 'deletedAt', + 'isAdmin', + ] const [users, count] = await userRepository.findBySearchCriteriaPagedFiltered( userFields.map((fieldName) => { return 'user.' + fieldName diff --git a/backend/src/seeds/graphql/queries.ts b/backend/src/seeds/graphql/queries.ts index 03ee3b53e..50234a6d8 100644 --- a/backend/src/seeds/graphql/queries.ts +++ b/backend/src/seeds/graphql/queries.ts @@ -110,6 +110,7 @@ export const searchUsers = gql` hasElopage emailConfirmationSend deletedAt + isAdmin } } } From 96c168c854ccd59bc7fbcc885ac253953abece13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 8 Jun 2022 10:49:23 +0200 Subject: [PATCH 02/31] Add 'ChangeUserRoleFormular.vue' to 'SearchUserTable' --- .../src/components/ChangeUserRoleFormular.vue | 96 +++++++++++++++++++ admin/src/components/DeletedUserFormular.vue | 1 + .../src/components/Tables/SearchUserTable.vue | 5 + admin/src/graphql/searchUsers.js | 1 + admin/src/locales/de.json | 5 + admin/src/locales/en.json | 7 +- 6 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 admin/src/components/ChangeUserRoleFormular.vue diff --git a/admin/src/components/ChangeUserRoleFormular.vue b/admin/src/components/ChangeUserRoleFormular.vue new file mode 100644 index 000000000..308fde328 --- /dev/null +++ b/admin/src/components/ChangeUserRoleFormular.vue @@ -0,0 +1,96 @@ + + + diff --git a/admin/src/components/DeletedUserFormular.vue b/admin/src/components/DeletedUserFormular.vue index 03359d9f9..43a353ef4 100644 --- a/admin/src/components/DeletedUserFormular.vue +++ b/admin/src/components/DeletedUserFormular.vue @@ -28,6 +28,7 @@ export default { props: { item: { type: Object, + required: true, }, }, data() { diff --git a/admin/src/components/Tables/SearchUserTable.vue b/admin/src/components/Tables/SearchUserTable.vue index 0be24a099..973817dcf 100644 --- a/admin/src/components/Tables/SearchUserTable.vue +++ b/admin/src/components/Tables/SearchUserTable.vue @@ -79,6 +79,9 @@ + + + @@ -93,6 +96,7 @@ import CreationFormular from '../CreationFormular.vue' import ConfirmRegisterMailFormular from '../ConfirmRegisterMailFormular.vue' import CreationTransactionList from '../CreationTransactionList.vue' import TransactionLinkList from '../TransactionLinkList.vue' +import ChangeUserRoleFormular from '../ChangeUserRoleFormular.vue' import DeletedUserFormular from '../DeletedUserFormular.vue' export default { @@ -102,6 +106,7 @@ export default { ConfirmRegisterMailFormular, CreationTransactionList, TransactionLinkList, + ChangeUserRoleFormular, DeletedUserFormular, }, props: { diff --git a/admin/src/graphql/searchUsers.js b/admin/src/graphql/searchUsers.js index cc7f83b1c..3e33fe96b 100644 --- a/admin/src/graphql/searchUsers.js +++ b/admin/src/graphql/searchUsers.js @@ -19,6 +19,7 @@ export const searchUsers = gql` hasElopage emailConfirmationSend deletedAt + isAdmin } } } diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json index b667a1ada..db2c82625 100644 --- a/admin/src/locales/de.json +++ b/admin/src/locales/de.json @@ -103,5 +103,10 @@ }, "user_deleted": "Nutzer ist gelöscht.", "user_recovered": "Nutzer ist wiederhergestellt.", + "userRole": { + "tabTitle": "Nutzer-Rolle / -Rechte", + "notChangeYourSelf": "Als Admin / Moderator kannst du nicht selber deine Rolle ändern.", + "selectLabel": "Rolle:" + }, "user_search": "Nutzer-Suche" } diff --git a/admin/src/locales/en.json b/admin/src/locales/en.json index 982c42d92..76c858e78 100644 --- a/admin/src/locales/en.json +++ b/admin/src/locales/en.json @@ -71,7 +71,7 @@ }, "redeemed": "redeemed", "remove": "Remove", - "removeNotSelf": "As admin / moderator you cannot delete yourself.", + "removeNotSelf": "As admin / moderator you can not delete yourself.", "remove_all": "Remove all users", "save": "Speichern", "status": "Status", @@ -103,5 +103,10 @@ }, "user_deleted": "User is deleted.", "user_recovered": "User is recovered.", + "userRole": { + "tabTitle": "User Role / Rights", + "notChangeYourSelf": "As admin / moderator you can not change your own role.", + "selectLabel": "Role:" + }, "user_search": "User search" } From 6cc68967e10fa65f7e7ab02ec926cb73e677b7d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 8 Jun 2022 14:41:26 +0200 Subject: [PATCH 03/31] Change design and add a little further functionality --- .../src/components/ChangeUserRoleFormular.vue | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/admin/src/components/ChangeUserRoleFormular.vue b/admin/src/components/ChangeUserRoleFormular.vue index 308fde328..09ed1578c 100644 --- a/admin/src/components/ChangeUserRoleFormular.vue +++ b/admin/src/components/ChangeUserRoleFormular.vue @@ -1,24 +1,18 @@ @@ -26,6 +20,11 @@ import { deleteUser } from '../graphql/deleteUser' import { unDeleteUser } from '../graphql/unDeleteUser' +const rolesValues = { + admin: 'admin', + user: 'user', +} + export default { name: 'ChangeUserRoleFormular', props: { @@ -36,16 +35,26 @@ export default { }, data() { // Wolle - console.log('this.item: ', this.item) + // console.log('this.item: ', this.item) + // console.log('this.item.isAdmin: ', this.item.isAdmin) + // console.log('roleSelected: ', this.item.isAdmin ? 'admin' : 'user') return { // Wolle: checked: false, - selected: this.item.isAmin ? 'admin' : 'user', - options: [ - { value: 'user', text: 'einfacher Nutzer' }, - { value: 'admin', text: 'Administrator' }, + roleSelected: this.item.isAdmin ? rolesValues.admin : rolesValues.user, + roles: [ + { value: rolesValues.user, text: 'einfacher Nutzer' }, + { value: rolesValues.admin, text: 'Administrator' }, ], } }, + watch: { + roleSelected(newRole, oldRole) { + if (newRole !== oldRole) { + // Wolle + console.log('newRole: ', newRole) + } + }, + }, methods: { // Wolle: deleteUser() { // this.$apollo @@ -90,7 +99,7 @@ export default { } From 776f6283b2093d5a47415177f1a6206e3b1be357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 8 Jun 2022 15:13:46 +0200 Subject: [PATCH 04/31] Localize selectable roles --- admin/src/components/ChangeUserRoleFormular.vue | 4 ++-- admin/src/locales/de.json | 14 +++++++++----- admin/src/locales/en.json | 14 +++++++++----- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/admin/src/components/ChangeUserRoleFormular.vue b/admin/src/components/ChangeUserRoleFormular.vue index 09ed1578c..2d3513036 100644 --- a/admin/src/components/ChangeUserRoleFormular.vue +++ b/admin/src/components/ChangeUserRoleFormular.vue @@ -42,8 +42,8 @@ export default { // Wolle: checked: false, roleSelected: this.item.isAdmin ? rolesValues.admin : rolesValues.user, roles: [ - { value: rolesValues.user, text: 'einfacher Nutzer' }, - { value: rolesValues.admin, text: 'Administrator' }, + { value: rolesValues.user, text: this.$t('userRole.selectRoles.user') }, + { value: rolesValues.admin, text: this.$t('userRole.selectRoles.admin') }, ], } }, diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json index db2c82625..bc9c5392d 100644 --- a/admin/src/locales/de.json +++ b/admin/src/locales/de.json @@ -101,12 +101,16 @@ "text_false": " Die letzte Email wurde am {date} Uhr an das Mitglied ({email}) gesendet.", "text_true": " Die Email wurde bestätigt." }, + "userRole": { + "notChangeYourSelf": "Als Admin / Moderator kannst du nicht selber deine Rolle ändern.", + "selectLabel": "Rolle:", + "selectRoles": { + "admin": "Administrator", + "user": "einfacher Nutzer" + }, + "tabTitle": "Nutzer-Rolle / -Rechte" + }, "user_deleted": "Nutzer ist gelöscht.", "user_recovered": "Nutzer ist wiederhergestellt.", - "userRole": { - "tabTitle": "Nutzer-Rolle / -Rechte", - "notChangeYourSelf": "Als Admin / Moderator kannst du nicht selber deine Rolle ändern.", - "selectLabel": "Rolle:" - }, "user_search": "Nutzer-Suche" } diff --git a/admin/src/locales/en.json b/admin/src/locales/en.json index 76c858e78..fab17dde0 100644 --- a/admin/src/locales/en.json +++ b/admin/src/locales/en.json @@ -101,12 +101,16 @@ "text_false": "The last email was sent to the member ({email}) on {date}.", "text_true": "The email was confirmed." }, + "userRole": { + "notChangeYourSelf": "As admin / moderator you can not change your own role.", + "selectLabel": "Role:", + "selectRoles": { + "admin": "administrator", + "user": "usual user" + }, + "tabTitle": "User Role / Rights" + }, "user_deleted": "User is deleted.", "user_recovered": "User is recovered.", - "userRole": { - "tabTitle": "User Role / Rights", - "notChangeYourSelf": "As admin / moderator you can not change your own role.", - "selectLabel": "Role:" - }, "user_search": "User search" } From 4b7a64327546b6d940aa9a6f0eeedc1b3c11a61b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 9 Jun 2022 16:23:01 +0200 Subject: [PATCH 05/31] Implement 'setUserRole' resolver and write tests (still with errors) --- backend/src/auth/RIGHTS.ts | 5 +- .../graphql/resolver/AdminResolver.test.ts | 168 ++++++++++++++++++ backend/src/graphql/resolver/AdminResolver.ts | 42 +++++ backend/src/seeds/graphql/mutations.ts | 6 + 4 files changed, 219 insertions(+), 2 deletions(-) diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index 8188b3daa..abcbda0ff 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -27,14 +27,15 @@ export enum RIGHTS { GDT_BALANCE = 'GDT_BALANCE', // Admin SEARCH_USERS = 'SEARCH_USERS', + SET_USER_ROLE = 'SET_USER_ROLE', + DELETE_USER = 'DELETE_USER', + UNDELETE_USER = 'UNDELETE_USER', CREATE_PENDING_CREATION = 'CREATE_PENDING_CREATION', UPDATE_PENDING_CREATION = 'UPDATE_PENDING_CREATION', SEARCH_PENDING_CREATION = 'SEARCH_PENDING_CREATION', DELETE_PENDING_CREATION = 'DELETE_PENDING_CREATION', CONFIRM_PENDING_CREATION = 'CONFIRM_PENDING_CREATION', SEND_ACTIVATION_EMAIL = 'SEND_ACTIVATION_EMAIL', - DELETE_USER = 'DELETE_USER', - UNDELETE_USER = 'UNDELETE_USER', CREATION_TRANSACTION_LIST = 'CREATION_TRANSACTION_LIST', LIST_TRANSACTION_LINKS_ADMIN = 'LIST_TRANSACTION_LINKS_ADMIN', } diff --git a/backend/src/graphql/resolver/AdminResolver.test.ts b/backend/src/graphql/resolver/AdminResolver.test.ts index acf880efb..979acf952 100644 --- a/backend/src/graphql/resolver/AdminResolver.test.ts +++ b/backend/src/graphql/resolver/AdminResolver.test.ts @@ -13,6 +13,7 @@ import { peterLustig } from '@/seeds/users/peter-lustig' import { stephenHawking } from '@/seeds/users/stephen-hawking' import { garrickOllivander } from '@/seeds/users/garrick-ollivander' import { + setUserRole, deleteUser, unDeleteUser, createPendingCreation, @@ -64,6 +65,173 @@ let user: User let creation: AdminPendingCreation | void describe('AdminResolver', () => { + describe('set user role', () => { + describe('unauthenticated', () => { + it('returns an error', async () => { + await expect( + mutate({ mutation: setUserRole, variables: { userId: 1, isAdmin: true } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('401 Unauthorized')], + }), + ) + }) + }) + + describe('authenticated', () => { + describe('without admin rights', () => { + beforeAll(async () => { + user = await userFactory(testEnv, bibiBloxberg) + await query({ + query: login, + variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, + }) + }) + + afterAll(async () => { + await cleanDB() + resetToken() + }) + + it('returns an error', async () => { + await expect( + mutate({ mutation: setUserRole, variables: { userId: user.id + 1, isAdmin: true } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('401 Unauthorized')], + }), + ) + }) + }) + + describe('with admin rights', () => { + beforeAll(async () => { + admin = await userFactory(testEnv, peterLustig) + await query({ + query: login, + variables: { email: 'peter@lustig.de', password: 'Aa12345_' }, + }) + }) + + afterAll(async () => { + await cleanDB() + resetToken() + }) + + describe('user to get a new role does not exist', () => { + it('throws an error', async () => { + await expect( + mutate({ mutation: setUserRole, variables: { userId: admin.id + 1, isAdmin: true } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError(`Could not find user with userId: ${admin.id + 1}`)], + }), + ) + }) + }) + + describe('change role with success', () => { + beforeAll(async () => { + user = await userFactory(testEnv, bibiBloxberg) + }) + + it('returns date string', async () => { + const result = await mutate({ + mutation: setUserRole, + variables: { userId: user.id, isAdmin: true }, + }) + expect(result).toEqual( + expect.objectContaining({ + data: { + setUserRole: expect.any(String), + }, + }), + ) + expect(new Date(result.data.setUserRole)).toEqual(expect.any(Date)) + }) + + describe('user gets new role', () => { + describe('is usual user', () => { + it('returns string', async () => { + await expect( + mutate({ mutation: setUserRole, variables: { userId: user.id, isAdmin: false } }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + setUserRole: expect.any(String), + }, + }), + ) + }) + }) + + describe('is admin', () => { + it('returns string', async () => { + await expect( + mutate({ + mutation: setUserRole, + variables: { userId: user.id, isAdmin: true }, + }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + setUserRole: expect.any(String), + }, + }), + ) + }) + }) + }) + }) + + // Wolle + describe.skip('change role with error', () => { + describe('is own role', () => { + it('throws an error', async () => { + await expect( + mutate({ mutation: setUserRole, variables: { userId: admin.id, isAdmin: false } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('Administrator can not change his own role!')], + }), + ) + }) + }) + + describe('user has already role to be set', () => { + describe('is admin', () => { + it('throws an error', async () => { + await expect( + mutate({ mutation: setUserRole, variables: { userId: user.id, isAdmin: true } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('User is already admin!')], + }), + ) + }) + }) + + describe('is usual user', () => { + it('throws an error', async () => { + await mutate({ + mutation: setUserRole, + variables: { userId: user.id, isAdmin: false }, + }) + await expect( + mutate({ mutation: setUserRole, variables: { userId: user.id, isAdmin: false } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('User is already a usual user!')], + }), + ) + }) + }) + }) + }) + }) + }) + }) + describe('delete user', () => { describe('unauthenticated', () => { it('returns an error', async () => { diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 78dcfb7e1..426e77ffa 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -135,6 +135,48 @@ export class AdminResolver { } } + @Authorized([RIGHTS.SET_USER_ROLE]) + @Mutation(() => Date, { nullable: true }) + async setUserRole( + @Arg('userId', () => Int) + userId: number, + @Arg('isAdmin', () => Boolean) + isAdmin: boolean, + @Ctx() + context: Context, + ): Promise { + const user = await dbUser.findOne({ id: userId }) + // user exists ? + if (!user) { + throw new Error(`Could not find user with userId: ${userId}`) + } + // administrator user changes own role? + const moderatorUser = getUser(context) + if (moderatorUser.id === userId) { + throw new Error('Administrator can not change his own role!') + } + // change isAdmin + switch (user.isAdmin) { + case null: + if (isAdmin === true) { + user.isAdmin = new Date() + } else { + throw new Error('User is already a usual user!') + } + break + default: + if (isAdmin === false) { + user.isAdmin = null + } else { + throw new Error('User is already admin!') + } + break + } + await user.save() + const newUser = await dbUser.findOne({ id: userId }) + return newUser ? newUser.isAdmin : null + } + @Authorized([RIGHTS.DELETE_USER]) @Mutation(() => Date, { nullable: true }) async deleteUser( diff --git a/backend/src/seeds/graphql/mutations.ts b/backend/src/seeds/graphql/mutations.ts index e66827566..efab89559 100644 --- a/backend/src/seeds/graphql/mutations.ts +++ b/backend/src/seeds/graphql/mutations.ts @@ -93,6 +93,12 @@ export const confirmPendingCreation = gql` } ` +export const setUserRole = gql` + mutation ($userId: Int!, $isAdmin: Boolean!) { + setUserRole(userId: $userId, isAdmin: $isAdmin) + } +` + export const deleteUser = gql` mutation ($userId: Int!) { deleteUser(userId: $userId) From 8dc120230574a9658666c7aeee1cc0e04a841467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 9 Jun 2022 16:38:29 +0200 Subject: [PATCH 06/31] Fix 'setUserRole' resolver tests --- .../graphql/resolver/AdminResolver.test.ts | 58 ++++++++----------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.test.ts b/backend/src/graphql/resolver/AdminResolver.test.ts index 979acf952..94ce87e55 100644 --- a/backend/src/graphql/resolver/AdminResolver.test.ts +++ b/backend/src/graphql/resolver/AdminResolver.test.ts @@ -135,22 +135,24 @@ describe('AdminResolver', () => { user = await userFactory(testEnv, bibiBloxberg) }) - it('returns date string', async () => { - const result = await mutate({ - mutation: setUserRole, - variables: { userId: user.id, isAdmin: true }, - }) - expect(result).toEqual( - expect.objectContaining({ - data: { - setUserRole: expect.any(String), - }, - }), - ) - expect(new Date(result.data.setUserRole)).toEqual(expect.any(Date)) - }) - describe('user gets new role', () => { + describe('is admin', () => { + it('returns date string', async () => { + const result = await mutate({ + mutation: setUserRole, + variables: { userId: user.id, isAdmin: true }, + }) + expect(result).toEqual( + expect.objectContaining({ + data: { + setUserRole: expect.any(String), + }, + }), + ) + expect(new Date(result.data.setUserRole)).toEqual(expect.any(Date)) + }) + }) + describe('is usual user', () => { it('returns string', async () => { await expect( @@ -158,24 +160,7 @@ describe('AdminResolver', () => { ).resolves.toEqual( expect.objectContaining({ data: { - setUserRole: expect.any(String), - }, - }), - ) - }) - }) - - describe('is admin', () => { - it('returns string', async () => { - await expect( - mutate({ - mutation: setUserRole, - variables: { userId: user.id, isAdmin: true }, - }), - ).resolves.toEqual( - expect.objectContaining({ - data: { - setUserRole: expect.any(String), + setUserRole: null, }, }), ) @@ -184,8 +169,7 @@ describe('AdminResolver', () => { }) }) - // Wolle - describe.skip('change role with error', () => { + describe('change role with error', () => { describe('is own role', () => { it('throws an error', async () => { await expect( @@ -201,6 +185,10 @@ describe('AdminResolver', () => { describe('user has already role to be set', () => { describe('is admin', () => { it('throws an error', async () => { + await mutate({ + mutation: setUserRole, + variables: { userId: user.id, isAdmin: true }, + }) await expect( mutate({ mutation: setUserRole, variables: { userId: user.id, isAdmin: true } }), ).resolves.toEqual( From d456d9c64a24ad007e023703b0e232a518bc3cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 13 Jun 2022 09:18:41 +0200 Subject: [PATCH 07/31] Remove wording rights from localized text --- admin/src/locales/de.json | 2 +- admin/src/locales/en.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json index bc9c5392d..5cabc0c88 100644 --- a/admin/src/locales/de.json +++ b/admin/src/locales/de.json @@ -108,7 +108,7 @@ "admin": "Administrator", "user": "einfacher Nutzer" }, - "tabTitle": "Nutzer-Rolle / -Rechte" + "tabTitle": "Nutzer-Rolle" }, "user_deleted": "Nutzer ist gelöscht.", "user_recovered": "Nutzer ist wiederhergestellt.", diff --git a/admin/src/locales/en.json b/admin/src/locales/en.json index fab17dde0..43aaccc5e 100644 --- a/admin/src/locales/en.json +++ b/admin/src/locales/en.json @@ -108,7 +108,7 @@ "admin": "administrator", "user": "usual user" }, - "tabTitle": "User Role / Rights" + "tabTitle": "User Role" }, "user_deleted": "User is deleted.", "user_recovered": "User is recovered.", From 98f1f48d1dbc8670f8229c7aa3fb4267bb481791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 13 Jun 2022 10:10:23 +0200 Subject: [PATCH 08/31] Implement mutation 'setUserRole' in frontend --- .../src/components/ChangeUserRoleFormular.vue | 80 ++++++++----------- admin/src/graphql/setUserRole.js | 7 ++ admin/src/locales/de.json | 1 + admin/src/locales/en.json | 1 + admin/src/pages/UserSearch.vue | 4 + 5 files changed, 45 insertions(+), 48 deletions(-) create mode 100644 admin/src/graphql/setUserRole.js diff --git a/admin/src/components/ChangeUserRoleFormular.vue b/admin/src/components/ChangeUserRoleFormular.vue index 2d3513036..1217ce7f0 100644 --- a/admin/src/components/ChangeUserRoleFormular.vue +++ b/admin/src/components/ChangeUserRoleFormular.vue @@ -16,9 +16,9 @@ + +