loomio/loomio

View on GitHub
vue/src/components/modal/launcher.vue

Summary

Maintainability
Test Coverage
<script lang="js">
import EventBus from "@/shared/services/event_bus";

export default
{
  components: {
    GroupForm: () => import('@/components/group/form.vue'),
    DiscussionForm: () => import('@/components/discussion/form.vue'),
    EditCommentForm: () => import('@/components/thread/edit_comment_form.vue'),
    ConfirmModal: () => import('@/components/common/confirm_modal.vue'),
    InfoModal: () => import('@/components/common/info_modal.vue'),
    ArrangementForm: () => import('@/components/thread/arrangement_form.vue'),
    ChangeVolumeForm: () => import('@/components/common/change_volume_form'),
    PollCommonModal: () => import('@/components/poll/common/modal'),
    PollCommonEditVoteModal: () => import('@/components/poll/common/edit_vote_modal'),
    ContactRequestForm: () => import('@/components/contact/request_form'),
    AuthModal: () => import('@/components/auth/modal'),
    MembershipRequestForm: () => import('@/components/group/membership_request_form'),
    MembershipModal: () => import('@/components/group/membership_modal'),
    EmailToGroupSettings: () => import('@/components/group/email_to_group_settings'),
    MemberEmailAliasModal: () => import('@/components/group/member_email_alias_modal'),
    ChangePasswordForm: () => import('@/components/profile/change_password_form'),
    ChatbotList: () => import('@/components/chatbot/list'),
    ChatbotMatrixForm: () => import('@/components/chatbot/matrix_form'),
    ChatbotWebhookForm: () => import('@/components/chatbot/webhook_form'),
    PollCommonOutcomeModal: () => import('@/components/poll/common/outcome_modal'),
    PollCommonReopenModal: () => import('@/components/poll/common/reopen_modal'),
    PollOptionForm: () => import('@/components/poll/common/poll_option_form'),
    PollTemplateForm: () => import('@/components/poll_template/form'),
    MoveThreadForm: () => import('@/components/thread/move_thread_form'),
    PollCommonMoveForm: () => import('@/components/poll/common/move_form'),
    RevisionHistoryModal: () => import('@/components/revision_history/modal'),
    TagsSelect: () => import('@/components/tags/select'),
    TagsModal: () => import('@/components/tags/modal'),
    ChangePictureForm: () => import('@/components/profile/change_picture_form'),
    GroupNewForm: () => import('@/components/group/new_form'),
    PinEventForm: () => import('@/components/thread/pin_event_form'),
    MoveCommentsModal: () => import('@/components/discussion/move_comments_modal'),
    ExportDataModal: () => import('@/components/group/export_data_modal'),
    AddPollToThreadModal: () => import('@/components/poll/add_to_thread_modal'),
    StrandMembersList: () => import('@/components/strand/members_list'),
    SeenByModal: () => import('@/components/strand/seen_by_modal'),
    PollMembers: () => import('@/components/poll/members'),
    PollReminderForm: () => import('@/components/poll/reminder_form'),
    GroupInvitationForm: () => import('@/components/group/invitation_form'),
    AnnouncementHistory: () => import('@/components/common/announcement_history'),
    SearchModal: () => import('@/components/search/modal'),
    UserNameModal: () => import('@/components/group/user_name_modal'),
    RecordVideoModal: () => import('@/components/lmo_textarea/record_video_modal'),
    RecordAudioModal: () => import('@/components/lmo_textarea/record_audio_modal'),
  },

  data() {
    return {
      isOpen: false,
      componentName: "",
      componentProps: {},
      componentKey: 'defaultKey',
      maxWidth: null,
      persistent: true
    };
  },

  created() {
    EventBus.$on('openModal', this.openModal);
    EventBus.$on('closeModal', this.closeModal);
  },

  destroyed() {
    EventBus.$off('openModal', this.openModal);
    EventBus.$off('closeModal', this.closeModal);
  },

  methods: {
    openModal(opts) {
      if (opts.hasOwnProperty('persistent')) {
        this.persistent = opts.persistent; 
      }
      this.maxWidth = opts.maxWidth || 720;
      this.componentName = opts.component;
      this.componentProps = opts.props;
      this.componentKey = (new Date()).getTime();
      this.isOpen = true;

      return setTimeout(() => {
        if (this.$refs.modalLauncher && document.querySelector('.modal-launcher h1')) {
          document.querySelector('.modal-launcher h1').focus();
        }
      });
    },

    closeModal() {
      if (this.isOpen && (this.componentProps || {}).close) {
        this.componentProps.close();
      } else {
        this.isOpen = false;
      }
    }
  }
};

</script>

<template lang="pug">
v-dialog.modal-launcher(ref="modalLauncher" v-model="isOpen" :max-width="maxWidth" :persistent="persistent" :fullscreen="$vuetify.breakpoint.xs")
  v-card(v-if="isOpen")
    component(:is="componentName" :key="componentKey" v-bind="componentProps" :close="closeModal")
</template>