From 8cd62078f2cf90313a82ab0c245ff271bad65958 Mon Sep 17 00:00:00 2001 From: Matt Rider Date: Tue, 4 Jun 2019 21:24:02 -0300 Subject: [PATCH 01/99] Start DeleteAccount functionality --- .../DeleteAccount/DeleteAccount.vue | 71 +++++++++++++++++++ webapp/locales/en.json | 2 +- webapp/pages/settings.vue | 12 ++-- webapp/pages/settings/delete-account.vue | 8 +-- 4 files changed, 80 insertions(+), 13 deletions(-) create mode 100644 webapp/components/DeleteAccount/DeleteAccount.vue diff --git a/webapp/components/DeleteAccount/DeleteAccount.vue b/webapp/components/DeleteAccount/DeleteAccount.vue new file mode 100644 index 000000000..b73142a52 --- /dev/null +++ b/webapp/components/DeleteAccount/DeleteAccount.vue @@ -0,0 +1,71 @@ + + + diff --git a/webapp/locales/en.json b/webapp/locales/en.json index 8330f97b2..3520f0d56 100644 --- a/webapp/locales/en.json +++ b/webapp/locales/en.json @@ -71,7 +71,7 @@ "name": "Download Data" }, "delete": { - "name": "Delete Account" + "name": "Delete my User Account" }, "organizations": { "name": "My Organizations" diff --git a/webapp/pages/settings.vue b/webapp/pages/settings.vue index f6745cdf3..a273b8b63 100644 --- a/webapp/pages/settings.vue +++ b/webapp/pages/settings.vue @@ -1,8 +1,6 @@ diff --git a/webapp/pages/profile/_id/_slug.vue b/webapp/pages/profile/_id/_slug.vue index c92cdae52..49d76f252 100644 --- a/webapp/pages/profile/_id/_slug.vue +++ b/webapp/pages/profile/_id/_slug.vue @@ -12,13 +12,12 @@ > - + @@ -241,7 +240,6 @@ import HcEmpty from '~/components/Empty.vue' import ContentMenu from '~/components/ContentMenu' import HcUpload from '~/components/Upload' import HcAvatar from '~/components/Avatar/Avatar.vue' -import PostMutationHelpers from '~/mixins/PostMutationHelpers' export default { components: { @@ -256,7 +254,6 @@ export default { ContentMenu, HcUpload, }, - mixins: [PostMutationHelpers], transition: { name: 'slide-up', mode: 'out-in', @@ -267,35 +264,6 @@ export default { voted: false, page: 1, pageSize: 6, - modalsData: { - delete: { - titel: () => { - this.$t('delete.contribution.title') - }, - message: () => { - const name = this.$filters.truncate(this.name, 30) - return this.$t(`delete.contribution.message`, { name }) - }, - buttons: { - confirm: { - icon: 'trash', - text: () => { - this.$t('delete.submit') - }, - callback: this.deletePostCallback, - }, - cancel: { - icon: 'close', - text: () => { - this.$t('delete.cancel') - }, - callback: () => {}, - }, - }, - }, - disableCallbacks: { confirmCallback: () => {}, cancelCallback: () => {} }, - reportCallbacks: { confirmCallback: () => {}, cancelCallback: () => {} }, - }, } }, computed: { From 70aa77bd2eb8b5d9a390ee4cfb7a4bce3e533f15 Mon Sep 17 00:00:00 2001 From: Matt Rider Date: Fri, 7 Jun 2019 13:37:59 -0300 Subject: [PATCH 31/99] Get user deletion working from UI --- .../DeleteAccount/DeleteAccount.vue | 41 +++++++++++++++---- webapp/locales/en.json | 3 +- webapp/pages/post/_id/_slug/index.vue | 6 +-- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/webapp/components/DeleteAccount/DeleteAccount.vue b/webapp/components/DeleteAccount/DeleteAccount.vue index dd03da648..d7e102d28 100644 --- a/webapp/components/DeleteAccount/DeleteAccount.vue +++ b/webapp/components/DeleteAccount/DeleteAccount.vue @@ -59,7 +59,12 @@ - + {{ $t('settings.delete.name') }} @@ -71,6 +76,7 @@ diff --git a/webapp/components/PostHelpers.js b/webapp/components/PostHelpers.js new file mode 100644 index 000000000..df2064bfc --- /dev/null +++ b/webapp/components/PostHelpers.js @@ -0,0 +1,42 @@ +import gql from 'graphql-tag' + +export default { + postMenuModalsData: (postNameShort, confirmCallback) => { + return { + delete: { + titleIdent: 'delete.contribution.title', + messageIdent: 'delete.contribution.message', + messageParams: { + name: postNameShort, + }, + buttons: { + confirm: { + icon: 'trash', + textIdent: 'delete.submit', + callback: confirmCallback, + }, + cancel: { + icon: 'close', + textIdent: 'delete.cancel', + callback: () => {}, + }, + }, + }, + } + }, + deletePostMutationData(postId) { + var gqlMutation = gql` + mutation($id: ID!) { + DeletePost(id: $id) { + id + } + } + ` + return { + mutation: gqlMutation, + variables: { + id: postId, + }, + } + }, +} diff --git a/webapp/mixins/PostMutationHelpers.js b/webapp/mixins/PostMutationHelpers.js deleted file mode 100644 index 68e4c73b8..000000000 --- a/webapp/mixins/PostMutationHelpers.js +++ /dev/null @@ -1,61 +0,0 @@ -import gql from 'graphql-tag' - -export default { - data() { - return { - menuModalsData: { - delete: { - titleIdent: 'delete.contribution.title', - messageIdent: 'delete.contribution.message', - messageParams: { - // "this.post" is not defined at the beginning … - name: this.post ? this.$filters.truncate(this.post.title, 30) : '', - }, - buttons: { - confirm: { - icon: 'trash', - textIdent: 'delete.submit', - callback: this.deletePostCallback, - }, - cancel: { - icon: 'close', - textIdent: 'delete.cancel', - callback: () => {}, - }, - }, - }, - }, - } - }, - methods: { - async deletePostCallback(postDisplayType = 'list') { - try { - var gqlMutation = gql` - mutation($id: ID!) { - DeletePost(id: $id) { - id - } - } - ` - await this.$apollo.mutate({ - mutation: gqlMutation, - variables: { - id: this.post.id, - }, - }) - this.$toast.success(this.$t('delete.contribution.success')) - switch (postDisplayType) { - case 'list': - this.$emit('deletePost') - break - default: - // case 'page': - this.$router.history.push('/') // Single page type: Redirect to index (main) page - break - } - } catch (err) { - this.$toast.error(err.message) - } - }, - }, -} diff --git a/webapp/pages/post/_id/_slug/index.spec.js b/webapp/pages/post/_id/_slug/index.spec.js index 5bf4ea168..8a073ac6e 100644 --- a/webapp/pages/post/_id/_slug/index.spec.js +++ b/webapp/pages/post/_id/_slug/index.spec.js @@ -56,7 +56,7 @@ describe('PostSlug', () => { beforeEach(jest.useFakeTimers) - describe('test mixin "PostMutationHelpers"', () => { + describe('test "PostHelpers"', () => { beforeEach(() => { wrapper = Wrapper() wrapper.setData({ diff --git a/webapp/pages/post/_id/_slug/index.vue b/webapp/pages/post/_id/_slug/index.vue index 4d703ff7e..63b0713c5 100644 --- a/webapp/pages/post/_id/_slug/index.vue +++ b/webapp/pages/post/_id/_slug/index.vue @@ -13,7 +13,7 @@ placement="bottom-end" resource-type="contribution" :resource="post" - :modalsData="menuModalsDataPage()" + :modalsData="menuModalsData" :is-owner="isAuthor(post.author.id)" /> @@ -71,7 +71,7 @@ import HcUser from '~/components/User' import HcShoutButton from '~/components/ShoutButton.vue' import HcCommentForm from '~/components/comments/CommentForm' import HcCommentList from '~/components/comments/CommentList' -import PostMutationHelpers from '~/mixins/PostMutationHelpers' +import PostHelpers from '~/components/PostHelpers' export default { name: 'PostSlug', @@ -88,7 +88,6 @@ export default { HcCommentForm, HcCommentList, }, - mixins: [PostMutationHelpers], head() { return { title: this.title, @@ -210,14 +209,27 @@ export default { this.ready = true }, 50) }, + computed: { + // "this.post" may not always be defined at the beginning … + menuModalsData() { + return PostHelpers.postMenuModalsData( + this.post ? this.$filters.truncate(this.post.title, 30) : '', + this.deletePostCallback, + ) + }, + }, methods: { isAuthor(id) { return this.$store.getters['auth/user'].id === id }, - menuModalsDataPage() { - const locMenuModalsData = this.menuModalsData - locMenuModalsData.delete.buttons.confirm.callback = () => this.deletePostCallback('page') - return locMenuModalsData + async deletePostCallback() { + try { + await this.$apollo.mutate(PostHelpers.deletePostMutationData(this.post.id)) + this.$toast.success(this.$t('delete.contribution.success')) + this.$router.history.push('/') // Redirect to index (main) page + } catch (err) { + this.$toast.error(err.message) + } }, }, } diff --git a/webapp/pages/profile/_id/_slug.spec.js b/webapp/pages/profile/_id/_slug.spec.js index d79f9b885..ddebe50f6 100644 --- a/webapp/pages/profile/_id/_slug.spec.js +++ b/webapp/pages/profile/_id/_slug.spec.js @@ -46,7 +46,7 @@ describe('ProfileSlug', () => { beforeEach(jest.useFakeTimers) - describe('test mixin "PostMutationHelpers"', () => { + describe('test "PostHelpers"', () => { beforeEach(() => { wrapper = Wrapper() }) @@ -60,7 +60,7 @@ describe('ProfileSlug', () => { beforeEach(jest.runAllTimers) it('emits "deletePost"', () => { - expect(wrapper.emitted().deletePost.length).toBe(1) + expect(wrapper.emitted().deletePost).toHaveLength(1) }) it('does not go to index (main) page', () => { From 8eb089d21806aa04b745b57d94cb520e994f69c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 Jun 2019 15:58:23 +0200 Subject: [PATCH 60/99] Rename event deletePost to removePostFromList Co-Authored-By: mattwr18 --- webapp/components/Modal/DeleteModal.spec.js | 2 +- webapp/components/PostCard/index.vue | 4 +- webapp/components/PostHelpers.js | 2 +- webapp/pages/index.vue | 2 +- webapp/pages/post/_id/_slug/index.vue | 2 +- webapp/pages/post/_id/_slug/more-info.vue | 23 +++---- webapp/pages/profile/_id/_slug.vue | 71 +++++++++++---------- 7 files changed, 52 insertions(+), 54 deletions(-) diff --git a/webapp/components/Modal/DeleteModal.spec.js b/webapp/components/Modal/DeleteModal.spec.js index c5e9df001..3401d5ba3 100644 --- a/webapp/components/Modal/DeleteModal.spec.js +++ b/webapp/components/Modal/DeleteModal.spec.js @@ -164,7 +164,7 @@ describe('DeleteModal.vue', () => { expect(propsData.callbacks.confirm).toHaveBeenCalledTimes(1) }) it('emits close', () => { - expect(wrapper.emitted().close).toBeTruthy() + expect(wrapper.emitted().close).toHaveLength(1) }) it('resets success', () => { diff --git a/webapp/components/PostCard/index.vue b/webapp/components/PostCard/index.vue index 96e1f5d72..383f879bd 100644 --- a/webapp/components/PostCard/index.vue +++ b/webapp/components/PostCard/index.vue @@ -103,8 +103,8 @@ export default { return this.user.id === this.post.author.id }, menuModalsData() { - // "this.post" may not always be defined at the beginning … return PostHelpers.postMenuModalsData( + // "this.post" may not always be defined at the beginning … this.post ? this.$filters.truncate(this.post.title, 30) : '', this.deletePostCallback, ) @@ -115,7 +115,7 @@ export default { try { await this.$apollo.mutate(PostHelpers.deletePostMutationData(this.post.id)) this.$toast.success(this.$t('delete.contribution.success')) - this.$emit('deletePost') + this.$emit('removePostFromList') } catch (err) { this.$toast.error(err.message) } diff --git a/webapp/components/PostHelpers.js b/webapp/components/PostHelpers.js index df2064bfc..4a30e6a22 100644 --- a/webapp/components/PostHelpers.js +++ b/webapp/components/PostHelpers.js @@ -1,7 +1,7 @@ import gql from 'graphql-tag' export default { - postMenuModalsData: (postNameShort, confirmCallback) => { + postMenuModalsData(postNameShort, confirmCallback) { return { delete: { titleIdent: 'delete.contribution.title', diff --git a/webapp/pages/index.vue b/webapp/pages/index.vue index d8becf206..10a64ee0f 100644 --- a/webapp/pages/index.vue +++ b/webapp/pages/index.vue @@ -9,7 +9,7 @@ :key="post.id" :post="post" :width="{ base: '100%', xs: '100%', md: '50%', xl: '33%' }" - @deletePost="deletePost(index, post.id)" + @removePostFromList="deletePost(index, post.id)" /> diff --git a/webapp/pages/post/_id/_slug/index.vue b/webapp/pages/post/_id/_slug/index.vue index 63b0713c5..899950514 100644 --- a/webapp/pages/post/_id/_slug/index.vue +++ b/webapp/pages/post/_id/_slug/index.vue @@ -210,9 +210,9 @@ export default { }, 50) }, computed: { - // "this.post" may not always be defined at the beginning … menuModalsData() { return PostHelpers.postMenuModalsData( + // "this.post" may not always be defined at the beginning … this.post ? this.$filters.truncate(this.post.title, 30) : '', this.deletePostCallback, ) diff --git a/webapp/pages/post/_id/_slug/more-info.vue b/webapp/pages/post/_id/_slug/more-info.vue index 1cb93ae6c..00de48730 100644 --- a/webapp/pages/post/_id/_slug/more-info.vue +++ b/webapp/pages/post/_id/_slug/more-info.vue @@ -1,13 +1,10 @@ - + Wer folgt {{ userName | truncate(15) }}? @@ -101,13 +102,14 @@ - + - - und {{ user.followedByCount - user.followedBy.length }} weitere - + und {{ user.followedByCount - user.followedBy.length }} weitere