From 1c6016ddccd713d1ab9de14c8beced67263b67ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 Jun 2019 09:05:43 +0200 Subject: [PATCH] Refactored the PostHelpers to an imported lib instead a mixin --- webapp/components/PostCard/index.vue | 21 +++++++- webapp/components/PostHelpers.js | 42 ++++++++++++++++ webapp/mixins/PostMutationHelpers.js | 61 ----------------------- webapp/pages/post/_id/_slug/index.spec.js | 2 +- webapp/pages/post/_id/_slug/index.vue | 26 +++++++--- webapp/pages/profile/_id/_slug.spec.js | 4 +- 6 files changed, 83 insertions(+), 73 deletions(-) create mode 100644 webapp/components/PostHelpers.js delete mode 100644 webapp/mixins/PostMutationHelpers.js diff --git a/webapp/components/PostCard/index.vue b/webapp/components/PostCard/index.vue index 46093c08a..96e1f5d72 100644 --- a/webapp/components/PostCard/index.vue +++ b/webapp/components/PostCard/index.vue @@ -70,7 +70,7 @@ import HcCategory from '~/components/Category' import HcRibbon from '~/components/Ribbon' // import { randomBytes } from 'crypto' import { mapGetters } from 'vuex' -import PostMutationHelpers from '~/mixins/PostMutationHelpers' +import PostHelpers from '~/components/PostHelpers' export default { name: 'HcPostCard', @@ -80,7 +80,6 @@ export default { HcRibbon, ContentMenu, }, - mixins: [PostMutationHelpers], props: { post: { type: Object, @@ -103,6 +102,24 @@ export default { if (!author) return false return this.user.id === this.post.author.id }, + menuModalsData() { + // "this.post" may not always be defined at the beginning … + return PostHelpers.postMenuModalsData( + this.post ? this.$filters.truncate(this.post.title, 30) : '', + this.deletePostCallback, + ) + }, + }, + methods: { + async deletePostCallback() { + try { + await this.$apollo.mutate(PostHelpers.deletePostMutationData(this.post.id)) + this.$toast.success(this.$t('delete.contribution.success')) + this.$emit('deletePost') + } catch (err) { + this.$toast.error(err.message) + } + }, }, } 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', () => {