loomio/loomio

View on GitHub
vue/src/components/group/emails_panel.vue

Summary

Maintainability
Test Coverage
<script lang="js">
import Records  from '@/shared/services/records';
import EventBus from "@/shared/services/event_bus";
import Flash from "@/shared/services/flash";

export default
{
  data() {
    return {
      requests: [],
      group: null,
      emails: [],
      aliases: []
    };
  },

  mounted() {
    Records.groups.findOrFetch(this.$route.params.key).then(group => {
      this.group = group;

      this.fetchEmails();
      this.fetchAliases();

      this.watchRecords({
        key: "receivedEmails#{group.id}",
        collections: ['receivedEmails'],
        query: store => {
          this.emails = store.receivedEmails.find({groupId: this.group.id, released: false})
        }
      });
    });
  },

  methods: {
    fetchAliases() {
      Records.fetch({path: 'received_emails/aliases', params: {group_id: this.group.id}}).then(data => {
        this.aliases = data.aliases
      })
    },

    fetchEmails() {
      Records.fetch({path: 'received_emails', params: {group_id: this.group.id }})
    },

    userById(id) {
      return Records.users.find(id)
    },

    allow(email) {
      EventBus.$emit('openModal', {
        component: 'MemberEmailAliasModal',
        props: {
          receivedEmail: email,
          group: this.group,
          callbackFn: () => {
            this.fetchAliases();
          }
        }
      });
    },

    block(email) {
      EventBus.$emit('openModal', {
        component: 'ConfirmModal',
        props: {
          confirm: {
            submit: () => {
              return Records.receivedEmails.remote.postMember(email.id, 'block').then(() => {
                EventBus.$emit('closeModal');
                Flash.success('email_to_group.email_blocked')
                this.fetchAliases();
              });
            },
            text: {
              title:    'email_to_group.confirm_block',
              helptext: 'email_to_group.confirm_block_body',
              submit:   'email_to_group.block_email'
            },
            textArgs: {
              sender: email.senderEmail
            }

          }
        }
      });
    },

    destroyAlias(alias) {
      Records.remote.destroy('received_emails/destroy_alias', {id: alias.id}).then(() => {
        this.fetchAliases();
        this.fetchEmails();
      })
    },
  }

};
</script>
<template lang="pug">
.group-emails-panel
  h2.ma-4.headline(v-t="'email_to_group.unreleased_emails'")
  loading(v-if="!group")
  v-card.mt-4(outlined v-if="group")
    v-alert.text-center.text--secondary(v-if="emails.length == 0" v-t="'email_to_group.no_emails_to_release'")
    v-list(v-else two-line)
      v-list-item(v-for="email in emails" :key="email.id")
        v-list-item-content
          v-list-item-title
            span {{email.senderName}} <{{email.senderEmail}}>
          v-list-item-subtitle {{email.subject}}

        v-list-item-action
          v-btn.group-emails-panel__approve(text icon @click='allow(email)' :title="$t('membership_requests_page.approve')")
            common-icon(name="mdi-check")
        v-list-item-action
          v-btn.group-emails-panel__delete(text icon @click='block(email)' :title="$t('membership_requests_page.ignore')")
            common-icon(name="mdi-cancel")

  template(v-if="group && aliases.length")
    h2.ma-4.headline(v-t="'email_to_group.email_aliases'")
    v-card.mt-4(outlined)
      v-list(two-line)
        v-list-item(v-for="alias in aliases" :key="alias.id")
          v-list-item-content
            v-list-item-title
              span {{alias.email}}
            v-list-item-subtitle
              span(v-if="alias.user_id" v-t="{path: 'email_to_group.belongs_to_name', args: {name: userById(alias.user_id).name}}")
              span(v-if="!alias.user_id" v-t="'membership_requests_page.ignore'")
              mid-dot
              time-ago(:date='alias.created_at')

          v-list-item-action
            v-btn.group-emails-panel__delete(text icon @click='destroyAlias(alias)' title="destroy")
              common-icon(name="mdi-delete")
</template>