modal.vue 3.08 KB
<template>
  <div :class="{'modal-screen-full':isFull,'modal-screen-exit':!isFull}" class="modal-container" v-if="show" style="z-index:1000">
    <a-spin :spinning="loading" style="width: 100%;height: 100%;">
      <div class="modal-title" :style="{background: (title ? '#f8f8f8': '#fff')}">
        <div :style="{height: (title ? '38px' : 0)}"><span>{{title || ''}}</span></div>
        <div>
          <a href="javascript:;" @click="openFull">
            <a-icon style="font-size: 21px;margin-left: 8px" type="fullscreen" v-if="!isFull" />
          </a>
          <a href="javascript:;" @click="openFull">
            <a-icon style="font-size: 21px;margin-left: 8px" type="fullscreen-exit" v-if="isFull" />
          </a>
          <a href="javascript:;" @click="close">
            <a-icon style="font-size: 21px;margin-left: 8px" type="close" />
          </a>
        </div>
      </div>
      <div class="modal-content" ref="main">
        <slot name="content" ref="content"></slot>
      </div>
      <div class="modal-footer" :style="{background: (title ? '#f8f8f8': '#fff')}">
        <slot name="footer"></slot>
      </div>
    </a-spin>
  </div>
</template>

<script>
export default {
  name: "sModal",
  data () {
    return {
      isFull: false,
      footerSlots: false,
    }
  },
  props: {
    show: {
      type: Boolean,
      default: () => {
        return false
      }
    },
    title: {
      type: String,
      default: () => {
        return ''
      }
    },
    loading: {
      type: Boolean,
      default: () => {
        return false
      }
    },
  },
  model: {
    prop: 'show',
    event: 'close',
  },
  created () {
    if (this.$slots.footer)
      this.footerSlots = true
  },
  methods: {
    close () {
      this.$emit('close', false);
    },
    openFull () {
      this.isFull = !this.isFull
    },
    changeScroll () {
      this.$refs.main.scrollTop = document.getElementsByClassName('s_modal_content')[0].offsetHeight
    }
  },
}
</script>

<style scoped lang="less">
.modal-container {
  .view-table {
    border-bottom: 0px !important;
  }
}
.modal-screen-full {
  padding: 1px 2px 1px 2px;
  position: fixed;
  left: 3px;
  top: 55px;
  background: #ffffff;
  overflow: auto;
  z-index: 1000;
  width: calc(100% - 5px);
  height: calc(100vh - 56px);
}
.modal-screen-exit {
  position: absolute;
  left: 8px;
  right: 8px;
  top: 3px;
  background: #ffffff;
  overflow: auto;
  z-index: 3;
  height: calc(100% - 6px);
  // height: calc(100vh - 124px);
}
.modal-title {
  display: flex;
  justify-content: space-between;
  align-items: center;
  height: 38px;
  line-height: 36px;
  padding-left: 6px;
  color: #333;
  font-weight: 700;
  font-size: 16px;
  border-width: 1px 1px 1px 1px;
  border-color: #f0f0f0;
  border-style: solid;
  a {
    color: black;
  }
}
.modal-content {
  overflow: auto;
  height: calc(100% - 76px);
}
.modal-content-flow {
  overflow: hidden !important;
}
.modal-footer {
  text-align: center;
  background-color: rgb(248, 248, 248);
  border-width: 1px 1px 1px 1px;
  border-color: #f0f0f0;
  border-style: solid;
  height: 38px;
  line-height: 34px;
}
</style>