|  | @@ -76,12 +76,42 @@
 | 
	
		
			
				|  |  |              span.white--text.title {{cm.initials}}
 | 
	
		
			
				|  |  |          v-card.elevation-1
 | 
	
		
			
				|  |  |            v-card-text
 | 
	
		
			
				|  |  | -            .comments-post-actions(v-if='permissions.manage && !isBusy')
 | 
	
		
			
				|  |  | +            .comments-post-actions(v-if='permissions.manage && !isBusy && commentEditId === 0')
 | 
	
		
			
				|  |  |                v-icon.mr-3(small, @click='editComment(cm)') mdi-pencil
 | 
	
		
			
				|  |  |                v-icon(small, @click='deleteCommentConfirm(cm)') mdi-delete
 | 
	
		
			
				|  |  |              .comments-post-name.caption: strong {{cm.authorName}}
 | 
	
		
			
				|  |  |              .comments-post-date.overline.grey--text {{cm.createdAt | moment('from') }} #[em(v-if='cm.createdAt !== cm.updatedAt') - modified {{cm.updatedAt | moment('from') }}]
 | 
	
		
			
				|  |  | -            .comments-post-content.mt-3(v-html='cm.render')
 | 
	
		
			
				|  |  | +            .comments-post-content.mt-3(v-if='commentEditId !== cm.id', v-html='cm.render')
 | 
	
		
			
				|  |  | +            .comments-post-editcontent.mt-3(v-else)
 | 
	
		
			
				|  |  | +              v-textarea(
 | 
	
		
			
				|  |  | +                outlined
 | 
	
		
			
				|  |  | +                flat
 | 
	
		
			
				|  |  | +                auto-grow
 | 
	
		
			
				|  |  | +                dense
 | 
	
		
			
				|  |  | +                rows='3'
 | 
	
		
			
				|  |  | +                hide-details
 | 
	
		
			
				|  |  | +                v-model='commentEditContent'
 | 
	
		
			
				|  |  | +                color='blue-grey darken-2'
 | 
	
		
			
				|  |  | +                :background-color='$vuetify.theme.dark ? `grey darken-5` : `white`'
 | 
	
		
			
				|  |  | +              )
 | 
	
		
			
				|  |  | +              .d-flex.align-center.pt-3
 | 
	
		
			
				|  |  | +                v-spacer
 | 
	
		
			
				|  |  | +                v-btn.mr-3(
 | 
	
		
			
				|  |  | +                  dark
 | 
	
		
			
				|  |  | +                  color='blue-grey darken-2'
 | 
	
		
			
				|  |  | +                  @click='editCommentCancel'
 | 
	
		
			
				|  |  | +                  outlined
 | 
	
		
			
				|  |  | +                  )
 | 
	
		
			
				|  |  | +                  v-icon(left) mdi-close
 | 
	
		
			
				|  |  | +                  span.text-none Cancel
 | 
	
		
			
				|  |  | +                v-btn(
 | 
	
		
			
				|  |  | +                  dark
 | 
	
		
			
				|  |  | +                  color='blue-grey darken-2'
 | 
	
		
			
				|  |  | +                  @click='updateComment'
 | 
	
		
			
				|  |  | +                  depressed
 | 
	
		
			
				|  |  | +                  )
 | 
	
		
			
				|  |  | +                  v-icon(left) mdi-comment
 | 
	
		
			
				|  |  | +                  span.text-none Update Comment
 | 
	
		
			
				|  |  |      .pt-5.text-center.body-2.blue-grey--text(v-else-if='permissions.write') Be the first to comment.
 | 
	
		
			
				|  |  |      .text-center.body-2.blue-grey--text(v-else) No comments yet.
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -113,6 +143,8 @@ export default {
 | 
	
		
			
				|  |  |        guestName: '',
 | 
	
		
			
				|  |  |        guestEmail: '',
 | 
	
		
			
				|  |  |        commentToDelete: {},
 | 
	
		
			
				|  |  | +      commentEditId: 0,
 | 
	
		
			
				|  |  | +      commentEditContent: null,
 | 
	
		
			
				|  |  |        deleteCommentDialogShown: false,
 | 
	
		
			
				|  |  |        isBusy: false,
 | 
	
		
			
				|  |  |        scrollOpts: {
 | 
	
	
		
			
				|  | @@ -286,9 +318,118 @@ export default {
 | 
	
		
			
				|  |  |          })
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * Show Comment Editing Form
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  |      async editComment (cm) {
 | 
	
		
			
				|  |  | +      this.$store.commit(`loadingStart`, 'comments-edit')
 | 
	
		
			
				|  |  | +      this.isBusy = true
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        const results = await this.$apollo.query({
 | 
	
		
			
				|  |  | +          query: gql`
 | 
	
		
			
				|  |  | +            query ($id: Int!) {
 | 
	
		
			
				|  |  | +              comments {
 | 
	
		
			
				|  |  | +                single(id: $id) {
 | 
	
		
			
				|  |  | +                  content
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          `,
 | 
	
		
			
				|  |  | +          variables: {
 | 
	
		
			
				|  |  | +            id: cm.id
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          fetchPolicy: 'network-only'
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +        this.commentEditContent = _.get(results, 'data.comments.single.content', null)
 | 
	
		
			
				|  |  | +        if (this.commentEditContent === null) {
 | 
	
		
			
				|  |  | +          throw new Error('Failed to load comment content.')
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      } catch (err) {
 | 
	
		
			
				|  |  | +        console.warn(err)
 | 
	
		
			
				|  |  | +        this.$store.commit('showNotification', {
 | 
	
		
			
				|  |  | +          style: 'red',
 | 
	
		
			
				|  |  | +          message: err.message,
 | 
	
		
			
				|  |  | +          icon: 'alert'
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.commentEditId = cm.id
 | 
	
		
			
				|  |  | +      this.isBusy = false
 | 
	
		
			
				|  |  | +      this.$store.commit(`loadingStop`, 'comments-edit')
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * Cancel Comment Edit
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    editCommentCancel () {
 | 
	
		
			
				|  |  | +      this.commentEditId = 0
 | 
	
		
			
				|  |  | +      this.commentEditContent = null
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * Update Comment with new content
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    async updateComment () {
 | 
	
		
			
				|  |  | +      this.$store.commit(`loadingStart`, 'comments-edit')
 | 
	
		
			
				|  |  | +      this.isBusy = true
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        if (this.commentEditContent.length < 2) {
 | 
	
		
			
				|  |  | +          throw new Error('Comment is empty or too short!')
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        const resp = await this.$apollo.mutate({
 | 
	
		
			
				|  |  | +          mutation: gql`
 | 
	
		
			
				|  |  | +            mutation (
 | 
	
		
			
				|  |  | +              $id: Int!
 | 
	
		
			
				|  |  | +              $content: String!
 | 
	
		
			
				|  |  | +            ) {
 | 
	
		
			
				|  |  | +              comments {
 | 
	
		
			
				|  |  | +                update (
 | 
	
		
			
				|  |  | +                  id: $id,
 | 
	
		
			
				|  |  | +                  content: $content
 | 
	
		
			
				|  |  | +                ) {
 | 
	
		
			
				|  |  | +                  responseResult {
 | 
	
		
			
				|  |  | +                    succeeded
 | 
	
		
			
				|  |  | +                    errorCode
 | 
	
		
			
				|  |  | +                    slug
 | 
	
		
			
				|  |  | +                    message
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                  render
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          `,
 | 
	
		
			
				|  |  | +          variables: {
 | 
	
		
			
				|  |  | +            id: this.commentEditId,
 | 
	
		
			
				|  |  | +            content: this.commentEditContent
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (_.get(resp, 'data.comments.update.responseResult.succeeded', false)) {
 | 
	
		
			
				|  |  | +          this.$store.commit('showNotification', {
 | 
	
		
			
				|  |  | +            style: 'success',
 | 
	
		
			
				|  |  | +            message: 'Comment was updated successfully.',
 | 
	
		
			
				|  |  | +            icon: 'check'
 | 
	
		
			
				|  |  | +          })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          const cm = _.find(this.comments, ['id', this.commentEditId])
 | 
	
		
			
				|  |  | +          cm.render = _.get(resp, 'data.comments.update.render', '-- Failed to load updated comment --')
 | 
	
		
			
				|  |  | +          cm.updatedAt = (new Date()).toISOString()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +          this.editCommentCancel()
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          throw new Error(_.get(resp, 'data.comments.delete.responseResult.message', 'An unexpected error occured.'))
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      } catch (err) {
 | 
	
		
			
				|  |  | +        console.warn(err)
 | 
	
		
			
				|  |  | +        this.$store.commit('showNotification', {
 | 
	
		
			
				|  |  | +          style: 'red',
 | 
	
		
			
				|  |  | +          message: err.message,
 | 
	
		
			
				|  |  | +          icon: 'alert'
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.isBusy = false
 | 
	
		
			
				|  |  | +      this.$store.commit(`loadingStop`, 'comments-edit')
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * Show Delete Comment Confirmation Dialog
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  |      deleteCommentConfirm (cm) {
 | 
	
		
			
				|  |  |        this.commentToDelete = cm
 | 
	
		
			
				|  |  |        this.deleteCommentDialogShown = true
 |