From 448f350c2ed5a134fcddbb13f4f105c799974359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Wed, 10 Jul 2019 21:45:37 +0200 Subject: [PATCH 01/11] Implement paginating user view for admins --- backend/src/seed/seed-db.js | 7 +++ webapp/locales/de.json | 9 +++- webapp/locales/en.json | 9 +++- webapp/pages/admin.vue | 7 ++- webapp/pages/admin/users.vue | 86 ++++++++++++++++++++++++++++++++++-- 5 files changed, 108 insertions(+), 10 deletions(-) diff --git a/backend/src/seed/seed-db.js b/backend/src/seed/seed-db.js index 18eefb76f..bd12549be 100644 --- a/backend/src/seed/seed-db.js +++ b/backend/src/seed/seed-db.js @@ -707,6 +707,13 @@ import Factory from './factories' to: 'o3', }), ]) + + await Promise.all( + [...Array(30).keys()].map(i => { + return f.create('User') + }), + ) + /* eslint-disable-next-line no-console */ console.log('Seeded Data...') process.exit(0) diff --git a/webapp/locales/de.json b/webapp/locales/de.json index f5231ddf6..2f38e2be3 100644 --- a/webapp/locales/de.json +++ b/webapp/locales/de.json @@ -188,7 +188,14 @@ "name": "Organisationen" }, "users": { - "name": "Benutzer" + "name": "Benutzer", + "table": { + "columns": { + "name": "Name", + "slug": "Username", + "role": "Rolle" + } + } }, "pages": { "name": "Seiten" diff --git a/webapp/locales/en.json b/webapp/locales/en.json index 7fb596c9e..14872b3d4 100644 --- a/webapp/locales/en.json +++ b/webapp/locales/en.json @@ -189,7 +189,14 @@ "name": "Organizations" }, "users": { - "name": "Users" + "name": "Users", + "table": { + "columns": { + "name": "Name", + "slug": "Username", + "role": "Role" + } + } }, "pages": { "name": "Pages" diff --git a/webapp/pages/admin.vue b/webapp/pages/admin.vue index c9e48ca65..4d498dc9b 100644 --- a/webapp/pages/admin.vue +++ b/webapp/pages/admin.vue @@ -24,11 +24,10 @@ export default { name: this.$t('admin.dashboard.name'), path: `/admin`, }, - // TODO implement - /* { + { name: this.$t('admin.users.name'), - path: `/admin/users` - }, */ + path: `/admin/users`, + }, // TODO implement /* { name: this.$t('admin.organizations.name'), diff --git a/webapp/pages/admin/users.vue b/webapp/pages/admin/users.vue index 90f6d598d..6632d39ca 100644 --- a/webapp/pages/admin/users.vue +++ b/webapp/pages/admin/users.vue @@ -1,15 +1,93 @@ From 095a5e7c679d0a493d6986e2c738c8e68ab3bee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Wed, 10 Jul 2019 21:49:15 +0200 Subject: [PATCH 02/11] Id is not so important, it's in the profile URL --- webapp/pages/admin/users.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/webapp/pages/admin/users.vue b/webapp/pages/admin/users.vue index 6632d39ca..3ecb5edf9 100644 --- a/webapp/pages/admin/users.vue +++ b/webapp/pages/admin/users.vue @@ -46,7 +46,6 @@ export default { }, fields() { return { - id: 'ID', name: this.$t('admin.users.table.columns.name'), slug: this.$t('admin.users.table.columns.slug'), role: this.$t('admin.users.table.columns.role'), From 8b1d92ee7e84d313cbcbc03e2147d79eb647f528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Fri, 12 Jul 2019 00:43:17 +0200 Subject: [PATCH 03/11] Implement pagination without a total count This is necessary, because once we filter the collection, the `countUsers` is not valid anymore. --- webapp/pages/admin/users.vue | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/webapp/pages/admin/users.vue b/webapp/pages/admin/users.vue index 3ecb5edf9..de910dd34 100644 --- a/webapp/pages/admin/users.vue +++ b/webapp/pages/admin/users.vue @@ -1,6 +1,9 @@ From f9969b964c8555bca18952b0ff2cb6abb824dc81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Sat, 13 Jul 2019 14:00:03 +0200 Subject: [PATCH 10/11] Implement conditional filtering --- backend/src/schema/types/type/User.gql | 3 +++ webapp/package.json | 3 ++- webapp/pages/admin/users.spec.js | 35 +++++++++++++++++++++++++- webapp/pages/admin/users.vue | 15 +++++++++-- webapp/yarn.lock | 17 +++++++++---- 5 files changed, 64 insertions(+), 9 deletions(-) diff --git a/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql index b984f2d79..a735e90e5 100644 --- a/backend/src/schema/types/type/User.gql +++ b/backend/src/schema/types/type/User.gql @@ -79,6 +79,9 @@ type User { input _UserFilter { AND: [_UserFilter!] OR: [_UserFilter!] + name_contains: String + about_contains: String + slug_contains: String id: ID id_not: ID id_in: [ID!] diff --git a/webapp/package.json b/webapp/package.json index edad9509d..8385f37ec 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -63,6 +63,7 @@ "date-fns": "2.0.0-beta.2", "express": "~4.17.1", "graphql": "~14.4.2", + "isemail": "^3.2.0", "jsonwebtoken": "~8.5.1", "linkify-it": "~2.1.0", "nuxt": "~2.8.1", @@ -111,4 +112,4 @@ "vue-jest": "~3.0.4", "vue-svg-loader": "~0.12.0" } -} \ No newline at end of file +} diff --git a/webapp/pages/admin/users.spec.js b/webapp/pages/admin/users.spec.js index 3e63c380e..e6b84cad9 100644 --- a/webapp/pages/admin/users.spec.js +++ b/webapp/pages/admin/users.spec.js @@ -16,7 +16,6 @@ describe('Users', () => { $t: jest.fn(), $apollo: { loading: false, - mutate: jest.fn().mockResolvedValue(), }, } }) @@ -33,5 +32,39 @@ describe('Users', () => { wrapper = Wrapper() expect(wrapper.is('div')).toBe(true) }) + + describe('search', () => { + let searchAction + beforeEach(() => { + searchAction = (wrapper, { query }) => { + wrapper.find('input').setValue(query) + wrapper.find('form').trigger('submit') + return wrapper + } + }) + + describe('query looks like an email address', () => { + it('searches users for exact email address', async () => { + const wrapper = await searchAction(Wrapper(), { query: 'email@example.org' }) + expect(wrapper.vm.email).toEqual('email@example.org') + expect(wrapper.vm.filter).toBe(null) + }) + }) + + describe('query is just text', () => { + it('tries to find matching users by `name`, `slug` or `about`', async () => { + const wrapper = await searchAction(await Wrapper(), { query: 'Find me' }) + const expected = { + OR: [ + { name_contains: 'Find me' }, + { slug_contains: 'Find me' }, + { about_contains: 'Find me' }, + ], + } + expect(wrapper.vm.email).toBe(null) + expect(wrapper.vm.filter).toEqual(expected) + }) + }) + }) }) }) diff --git a/webapp/pages/admin/users.vue b/webapp/pages/admin/users.vue index c94abd529..4f9a0849b 100644 --- a/webapp/pages/admin/users.vue +++ b/webapp/pages/admin/users.vue @@ -63,6 +63,7 @@