bcgov/common-forms-toolkit

View on GitHub
app/frontend/src/components/common/RequestReceipt.vue

Summary

Maintainability
Test Coverage
A
94%
<template>
  <div>
    <v-tooltip bottom>
      <template v-slot:activator="{ on }">
        <v-btn
          v-on="on"
          color="primary"
          data-test="btn-form-request-receipt"
          :disabled="success"
          fab
          large
          v-on:click="displayDialog()"
        >
          <v-icon v-if="success">check</v-icon>
          <v-icon v-else>email</v-icon>
        </v-btn>

        <BaseDialog
          :show="showDialog"
          type="CONTINUE"
          @close-dialog="showDialog = false"
          @continue-dialog="requestReceipt()"
        >
          <template v-slot:icon>
            <v-icon large color="primary">email</v-icon>
          </template>
          <template v-slot:text>
            <v-form ref="form" v-model="valid" @submit="requestReceipt()" @submit.prevent>
              <label>Send to E-mail Address</label>
              <v-text-field
                dense
                flat
                outlined
                solo
                :rules="emailRules"
                prepend-inner-icon="email"
                v-model="to"
                data-test="text-form-to"
              />
            </v-form>
          </template>
          <template v-slot:button-text-continue>
            <span>SEND</span>
          </template>
        </BaseDialog>

        <BaseDialog :show="resultDialog" @close-dialog="resultDialog = false">
          <template v-slot:icon>
            <v-icon v-if="success" large color="success">check_circle_outline</v-icon>
            <v-icon v-else large color="error">cancel</v-icon>
          </template>
          <template v-slot:text>{{ resultDialogMsg }}</template>
        </BaseDialog>
      </template>
      <span>Email Receipt</span>
    </v-tooltip>
  </div>
</template>

<script>
import validator from 'validator';

import commonFormService from '@/services/commonFormService';

export default {
  name: 'RequestReceipt',
  data: () => ({
    emailRules: [
      v => !!v || 'E-mail is required',
      v =>
        validator.isEmail(v, { allow_display_name: true }) ||
        'invalid e-mail format'
    ],
    resultDialog: false,
    resultDialogMsg: '',
    showDialog: false,
    success: false,
    to: '',
    valid: false
  }),
  methods: {
    displayDialog() {
      this.showDialog = true;
    },
    async requestReceipt() {
      if (this.valid) {
        try {
          await commonFormService.requestReceiptEmail(this.formName, {
            submissionId: this.submissionId,
            to: this.to
          });
          this.success = true;
          this.resultDialogMsg = `An email has been sent to ${this.to}.`;
        } catch (error) {
          this.success = false;
          this.resultDialogMsg =
            'An error occured while attempting to send your email.';
        } finally {
          this.showDialog = false;
          this.resultDialog = true;
        }
      }
    },
    resetDialog() {
      this.resultDialogMsg = '';
      this.success = false;
      this.to = this.email;
      this.valid = false;
    }
  },
  mounted() {
    this.resetDialog();
  },
  props: {
    email: {
      type: String,
      required: true
    },
    formName: {
      type: String,
      required: true
    },
    submissionId: {
      type: String,
      required: true
    }
  }
};
</script>