Sha256: 61180176022ef500080d6b3cef8a7ab756b22b3b5926a6974c3279ac36a69200

Contents?: true

Size: 1.65 KB

Versions: 17

Compression:

Stored size: 1.65 KB

Contents

<template>
  <modal
    :isOpen="!!currentModal"
    :title="title"
    :containerClass="containerClass"
    @on-close="handleOutsideClick"
  >
    <component
      v-for="(modal, index) in stack"
      :key="`modal-${index}`"
      :is="modal.component"
      @on-close="handleClose"
      v-bind="modal.props"
      v-on="modal.listeners"
      v-show="index === stack.length - 1"
    />
  </modal>
</template>

<script>
import { ModalBus } from '@/plugins/event-bus'

export default {
  name: 'ModalRoot',
  data() {
    return {
      stack: [], // NOTE: we stack modals!
    }
  },
  created() {
    ModalBus.$on(
      'open',
      ({
        component,
        title = '',
        props = null,
        listeners = {},
        closeOnClick = true,
      }) => {
        this.stack.push({
          component,
          title,
          props,
          listeners,
          closeOnClick,
        })
      },
    )

    ModalBus.$on('close', () => this.handleClose())
    document.addEventListener('keyup', this.handleKeyup)
  },
  beforeDestroy() {
    document.removeEventListener('keyup', this.handleKeyup)
  },
  computed: {
    currentModal() {
      return this.stack.length === 0 ? null : this.stack[this.stack.length - 1]
    },
    title() {
      return this.currentModal?.title
    },
    containerClass() {
      return this.currentModal?.props?.modalClass
    },
  },
  methods: {
    handleOutsideClick(force) {
      if (!this.closeOnClick && !force) return
      this.handleClose()
    },
    handleKeyup(e) {
      if (e.keyCode === 27) this.handleClose()
    },
    handleClose() {
      if (!this.currentModal) return
      this.stack.pop()
    },
  },
}
</script>

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
maglevcms-1.4.0 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.3.0 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.2.2 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.2.1 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.2.0 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.1.7 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.1.6 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.1.5 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.1.4 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.1.3 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.1.2 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.1.1 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.1.0 app/frontend/editor/components/kit/modal-root.vue
maglevcms-1.0.0 app/javascript/editor/components/kit/modal-root.vue
maglevcms-1.0.0.rc3 app/javascript/editor/components/kit/modal-root.vue
maglevcms-1.0.0.rc2 app/javascript/editor/components/kit/modal-root.vue
maglevcms-1.0.0.rc1 app/javascript/editor/components/kit/modal-root.vue